
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.4] |
![]() |
|
Страницы: (31) « Первая ... 10 11 [12] 13 14 ... 30 31 ( Перейти к последнему сообщению ) |
Сообщ.
#166
,
|
|
|
Цитата mo3r @ Ну, Форт одновременно низкоуровневый и высокоуровневый, однако образует целостную, непротиворечивую и, что немаловажно, простую концепцию. С++ она то же очень проста, просто надо её понять, я повторяю, что многие навороты синтаксиса С++ существуют, лишь для совместимости Добавлено Цитата mo3r @ Замечу, что в C++ нету такоих понятий, как однобайтное целое, двухбайтное целое (так как это вредит переносимости); вместо этого есть типы, зависящие от архитектуры (char, short, int, long), и (вроде бы, это есть в C99, а может в C++ — точно не помню) типы, для которых гарантирована некоторая емкрость (uint8_t, uint16_t). я примерно это имел ввиду |
Сообщ.
#167
,
|
|
|
Цитата impik777 @ я повторяю, что многие навороты синтаксиса С++ существуют, лишь для совместимости Не согласен. Эти навороты синтаксиса и формируют те возможности, ради которых язык создавался (например, макросы — штука не всегда хорошая, но совсем без них никак нельзя). |
Сообщ.
#168
,
|
|
|
impik777, поскольку стороны пошли на мировую, то добавлю только следующее:
Цитата impik777 @ по ходу выполнения программы неужели пользователь не программист когда-нибудь хотел сделать это!!!! Я в свое время еще как хотел, именно по этому и начал кодить. А ты посмотри на программы которыми пользуешься. Неужели тебя в них ВСЕ устраивает? Меня далеко не все, приходится выбирать наиболее подходящие. Это только поверхстное ощущение. Когда копнешь поглубже, то увидишь огромную разницу. Цитата impik777 @ на самом деле с помощью указателей на функции, я могу творить с методами все что угодно Покажи если не трудно. Цитата wormball @ То, что есть, скажем, в макроассемблере, насколько я понимаю, обладает весьма скромными возможностями. Посмотри FASM. Там мощнейший макроязык. И он постоянно совершенствуется ![]() Цитата impik777 @ в Форте вообще есть различия между одно-байтным целым, двух-байтным и т.д. ??? т.к во многих языках это имеет важное значение В Форте только слова. Т.е. на арифметическом стеке выкладывается целое (8,16,или 32 бит в зависимости от реализации Форта) и программа обрабатывает его уже как хочет - как указатель или как 8 бит или как 32 бита или как хрен знат что. Все ограничено только воображением программиста. Впрочем вру. Есть еще удвоеные слова, когда на стэк выкладывается сразу два слова. Цитата wormball @ когда я на радостях поинлайнил кучу широко используемых функций, а потом сравнил скорость с неинлайненным вариантом, оказалось, что так во многих случаях значительно медленнее(!). Это вообще прикол. Спасибо разработчикам процессоров ![]() ![]() Цитата wormball @ Цитата (AndNot @ 27.09.06, 22:09) Конструкция CREATE ... DOES> Не очень понял, при чём здесь инкапсуляция и наследование. Посмотрел в Броуди, честно говоря, так и не понял, для чего она мне может понадобиться. У меня есть реализация работы с массивами, я её сделал без этой конструкции. Я хочу свои массивы переписать плюс сделать объекты, даже придумал как, но так и не придумал, как мне может помочь эта конструкция. К примеру создание массива с его очисткой: ![]() ![]() : MAS CREATE HERE OVER ERASE ALLOT ; Согласись, что после этого объявления массивов: ![]() ![]() 30 MAS NAME1 21 MAS NAME2 etc. будет и компактнее и экономичнее чем: ![]() ![]() : NAME1 30 HERE OVER ERASE ALLOT ; : NAME2 21 HERE OVER ERASE ALLOT ; etc. К тому же все действия в слове MAS будут применены ко ВСЕМ созданным через него массивам. Очень удобно. Да и вероятность ошибок снижается. Ну а после DOES> можешь вставить что угодно, у того же Броуди есть пример, где при обращении к массиву по индексу проверяется его диапозон, или например работа с частями массивов при нехватке памяти. А можешь и без DOES> обойтись. Где то я уже видел готовую либрару. |
Сообщ.
#169
,
|
|
|
Цитата AndNot @ Цитата (impik777 @ Вчера, 16:18) на самом деле с помощью указателей на функции, я могу творить с методами все что угодно Покажи если не трудно. влом набирать что-то более красивое и изящное, но идея такова ![]() ![]() struct T { void (*print)() /* ..... */ }; void PrintA(){cout << "asa";} void PrintB(){cout << "dds";} T t; t.print = PrintA; t.print(); // выведет asa /* ...... */ t.print = PrintB; t.print(); // выведет dds Добавлено Цитата AndNot @ Т.е. на арифметическом стеке выкладывается целое (8,16,или 32 бит в зависимости от реализации Форта) а в С++ , ты сам выбираешь размер переменной, ее диапазон значений и т.д. помогает при оптимизации, особенно, если учесть, что числа с плавающей занятой считаются в несколько раз медленней, чем целые (именно это учли производители первого Doom, не используя дробные числа) Добавлено Цитата wormball @ Цитата (impik777 @ Вчера, 21:49) в данном случае диапазон проверять не надо, т.к typedef unsigned char MODE_TYPE; Это так теперь байт зовётся? Тем более нет необходимости в обрамляющих функциях. это не байт, а переменная типа unsigned char размер 1 байт, диапазон 0-255, есть также signed char (или просто char) размер 1 байт, диапазон 127-(-128) , а есть вообще bool , размер 1 байт, диапазон true(1)-false(0) и каждая служит для своих целей к тому же тип char интерпретируется системами ввода вывода, как символ, по таблице ASCII Добавлено Цитата wormball @ Цитата (impik777 @ Вчера, 21:49) обещанный пример Буду признателен, если ты мне его объяснишь. список(в идеале) - это цепь из однородных элементов(узлов) ![]() ![]() template<class D> struct Item { D data; Item<D>* next; // указатель на следующий элемент Item<D>* back; // указатель на предыдущий элемент }; узел - это как полый шарик с двумя крюками, крюки служат для связи с соседними элементами, а полость для данных, весь смысл в том, что в массиве все элементы хранятся подряд,одним большим куском, а узлы списка могут валятся в памяти где угодно, для этого им нужны связи,это также позволяет нам добавлять и убирать из списка произвольное число элементов, взамен мы теряем возможность обращения по индексу Добавлено конструкция ![]() ![]() template<class T> class BasicList означает, что если мы напишем ![]() ![]() BasicList<int> int_list; и весь класс будет являтся списком целых чисел, но ничто не запретит нам написать ![]() ![]() BasicList<AnyType> any_list; |
![]() |
Сообщ.
#170
,
|
|
Цитата impik777 @ а есть вообще bool , размер 1 байт Давай обойдемся без голословных утверждений, OK? Вообще-то, Цитата Стандарт - Clause 5.3.3 ... [Note: in particular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.69) ] 69) sizeof(bool) is not required to be 1. |
Сообщ.
#171
,
|
|
|
Цитата AndNot @ А ты посмотри на программы которыми пользуешься. Неужели тебя в них ВСЕ устраивает? Меня далеко не все, приходится выбирать наиболее подходящие. я выбираю нужную прогу или либу по документации, но никогда не изменяю ее сам, на крайний случаю я пишу свою библиотеку -Added Цитата volvo877 @ Цитата impik777 @ а есть вообще bool , размер 1 байт Давай обойдемся без голословных утверждений, OK? Вообще-то, Цитата Стандарт - Clause 5.3.3 ... [Note: in particular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.69) ] 69) sizeof(bool) is not required to be 1. знаю, что в стандарте этого нет но подавляющее большинство компиляторов, под распостраненные процессоры делают это так, тем более под одну переменную меньше байта не выделишь, (не считая битовых полей, то там другая структура работы) т.к. байт минимальная переменная, которая может иметь адрес, а выделять больше бессмысленно. Добавлено volvo877, стандарт стандартом, а против практики не попрешь, например в BC++ Builder, столько специфических расширений языка, что озвереть можно,и со стандартом чистого С++ они не согласуются одно __published: чего стоит. |
Сообщ.
#172
,
|
|
|
Интересно,интересно. Вот это уже дельный разговор пошел
![]() Цитата impik777 @ влом набирать что-то более красивое и изящное, но идея такова struct T{ void (*print)() /* ..... */};void PrintA(){cout << "asa";}void PrintB(){cout << "dds";}T t;t.print = PrintA;t.print(); // выведет asa/* ...... */t.print = PrintB;t.print(); // выведет dds Это всего лишь указатели. А вот удалить из программы метод PrintB сможешь? Или в готовую программу добавить метод PrintC? Или к примеру(извини на Паскале, но так понятнее): ![]() ![]() type TPredok = object ... end; TPerson = object (TPredok) ... end; TStudent = object (TPerson) ... end; TDvoechnik = object (TStudent) ... end; Можно ли объекту TDvoechnik указать, что отныне его родитель TPerson? ну или TPredok? А потом восстановить "справедливость". Цитата impik777 @ а в С++ , ты сам выбираешь размер переменной, ее диапазон значений и т.д. помогает при оптимизации, Может я не правильно выразился, но в Форте одну и ту же переменную ты по ходу программы можешь поиметь и как 8-ми битную и как 16-ти битную и как бох знат что. Она даже может что-то сама посчитать и выдавать тебе уже готовый результат ![]() Цитата impik777 @ это не байт, а переменная типа unsigned char размер 1 байт Я уже давно не связывался с С, но неужели теперь unsigned char может иметь рамер отличный от байта? Цитата impik777 @ это не байт, а переменная типа unsigned char размер 1 байт, диапазон 0-255, есть также signed char (или просто char) размер 1 байт, диапазон 127-(-128) , а есть вообще bool , размер 1 байт, диапазон true(1)-false(0) и каждая служит для своих целей к тому же тип char интерпретируется системами ввода вывода, как символ, по таблице ASCII Вот ИМХО и главный недостаток всех ЯВУ, избыточность данных. В том же Форте или Асме ты любую переменную можешь считать как знаковой так и нет, все зависит только от задачи. И частенько в асме я одну и ту-же переменную использую и так и эдак. Цитата impik777 @ но ничто не запретит нам написать BasicList<AnyType> any_list; ,где AnyType, любой другой класс или тип Вопрос. А если мой список должен содержать разнотипные данные? К примеру от 1 до 8 байт? Как это можно выразить в прототипе? Цитата impik777 @ я выбираю нужную прогу или либу по документации, но никогда не изменяю ее сам, на крайний случаю я пишу свою библиотеку А вот меня далеко не все устраивает в моем любимом браузере Mozille. И попробуй-ка напиши свою библеотеку ![]() Для кучи, мой любимый драйвер мыши глючит в паре с DosNavigator. Подозреваю, что все дело в поддержке им Wheel. Но естественно ни как не могу этого изменить. Сорсы то недоступны ![]() ![]() Цитата impik777 @ тем более под одну переменную меньше байта не выделишь, (не считая битовых полей, то там другая структура работы) Вообще-то даже под битовые поля выделяются байты. И на С++ там действительно другая структура работы. Но если посмотришь любой низкоуровневый язык, то не найдешь там ничего для байтовых полей, кроме команд процессора, и это естественно, ЛЮБУЮ переменную можно рассматривать как bitfield. Цитата impik777 @ т.к. байт минимальная переменная, которая может иметь адрес, а выделять больше бессмысленно. Увы, это противоречит оптимизации. Цитата impik777 @ volvo877, стандарт стандартом, а против практики не попрешь, например в BC++ Builder, столько специфических расширений языка, что озвереть можно,и со стандартом чистого С++ они не согласуются одно __published: чего стоит. К сожалению подобная картина не только в С++ ![]() |
Сообщ.
#173
,
|
|
|
Цитата AndNot @ Можно ли объекту TDvoechnik указать, что отныне его родитель TPerson? ну или TPredok? А потом восстановить "справедливость". укажи пример такой необходимости Добавлено Цитата AndNot @ А вот удалить из программы метод PrintB сможешь? Или в готовую программу добавить метод PrintC? то же укажи причину, для чего это надо, а то не врубаюсь что, надо вписывать это в уже скомпилированную прогу Добавлено Цитата AndNot @ Подозреваю, что все дело в поддержке им Wheel. Но естественно ни как не могу этого изменить. Сорсы то недоступны И не надо говорить про новую версию, этот глюк уже несколько версий пережил а если бы это было написано на Форте, но сорци, все равно неизвестны - это тебе бы помогло ![]() а ты знаешь принцип работы драйвера, и можешь его переписать ![]() Цитата AndNot @ Вопрос. А если мой список должен содержать разнотипные данные? К примеру от 1 до 8 байт? Как это можно выразить в прототипе? наследованием от базового класса переменной, реализуешь различный размер, только на этом примере не получится, потому, что он очень примитивный, там в функции создания нужно указывать нужный конструктор это делается например на Java, кстати ее виртуальная машина с поддержкой компиляциив машинный код, весит всего 200 Кбайт Добавлено Цитата AndNot @ Может я не правильно выразился, но в Форте одну и ту же переменную ты по ходу программы можешь поиметь и как 8-ми битную и как 16-ти битную и как бох знат что. Она даже может что-то сама посчитать и выдавать тебе уже готовый результат Или я дурак или одно из двух, но при чем здесь оптимизация? Поясни плизззз! сколько на нее выделяется памяти вообще в начале, 2-х байтную переменную то же можно юзать как один байт, но занимает она ДВА БАЙТА, в базике и С++ то же есть переменные Variant которых можно юзать как разные типы, но занимает то она будь здоров Добавлено Цитата AndNot @ Вот ИМХО и главный недостаток всех ЯВУ, избыточность данных. это не недостаток, а просто другой подход, и потом это контроль за программистом как ты будешь искать ошибку если var a; var b; /* 102452 строки */ a=125523; /* еще столько же */ b = "fsadfs"; /* совершенно другой файл */ var c = a + b; и каков будет результат? Добавлено к слову сколько строк занимала твоя самая большая прога на Форте, если всего 1000 - 3000 строк (не считая пустые) то найти ошибку легко, а если больше ??? для этого и нужен контроль типов, инкапсуляция и т.д. и т.п. |
Сообщ.
#174
,
|
|
|
Цитата AndNot @ Вопрос. А если мой список должен содержать разнотипные данные? К примеру от 1 до 8 байт? Как это можно выразить в прототипе? Что значит содержать разнотипные данные? Совсем-совсем разнотипных данных не бывает (либо все сводится к одному универсальному — как cons cell в лиспе). Цитата AndNot @ А вот меня далеко не все устраивает в моем любимом браузере Mozille Если не нравится нынешнее положение дел, то как один из вариантов есть такой — можно взять сырочки с mozilla.org и начать их пилить на предмет исправления мешающих недостатков. |
Сообщ.
#175
,
|
|
|
Цитата impik777 @ то же укажи причину, для чего это надо, а то не врубаюсь Это уже второстепенный вопрос. Я ведь просто спросил - можно или нет? К примеру TDvoechnik отменили (ну не понравилась комуто такая умственная дискриминация), и их нужно перенести в TPerson. Так вот, в Форте, достаточно словарю TDvoechnik указать предка - словарь TPerson. Если нужно, можно еще и методы подчистить. После чего модифицированная версия программы переписывается (в Форте для этого есть слово). Т.е. ты получаешь совершенно другую программу, без лишнего кода. А можно пройтись по всем экземплярам объектов TDvoechnik и указать им предка TPerson, после чего объект TDvoechnik можно удалить. Результат будет тот же. Пример глупый до невозможности, но ты сам напросился ![]() ![]() Цитата impik777 @ а если бы это было написано на Форте, но сорци, все равно неизвестны - это тебе бы помогло Ты немного невнимателен ![]() Цитата impik777 @ а ты знаешь принцип работы драйвера, и можешь его переписать Да знаю. Писал. Цитата impik777 @ наследованием от базового класса переменной, реализуешь различный размер, только на этом примере не получится, потому, что он очень примитивный, там в функции создания нужно указывать нужный конструктор это делается например на Java, Уж лучше на асме. Гораздо проще ![]() Цитата impik777 @ это не недостаток, а просто другой подход, и потом это контроль за программистом Вот и хрен то, что контроль. То есть получается, что кто-то из мягкотелых решил, что компилятор должен быть умнее программиста. Цитата impik777 @ и каков будет результат? Пример немножко некорректен. В бейсике то все это работает ![]() Цитата impik777 @ к слову сколько строк занимала твоя самая большая прога на Форте, если всего 1000 - 3000 строк (не считая пустые) то найти ошибку легко, а если больше ??? для этого и нужен контроль типов, инкапсуляция и т.д. и т.п. Сколько бы она не занимала, Форт предоставляет удобные средства проверки. Ты можешь проверить на вшивость только что определенное слово. И без напрягов. Просто сразу проверяешь то что написал, по ходу составления программы. Потому в нем хоть и отсутствует какой либо контроль за программистом (а кому как не ему знать что он творит?), ошибок в программах на порядок меньше, чем уменя к примеру было в Паскале и С и Асме (Бейсик 8-ми разрядных машин не считаю). Просто сам убедился в этом. И не пойми не правильно, я не заядлый фортер, приходится в основном кодить на асме. Цитата mo3r @ Что значит содержать разнотипные данные? Ну к примеру каждый элемент может содержать либо byte, либо word, либо dword. Цитата mo3r @ Если не нравится нынешнее положение дел, то как один из вариантов есть такой — можно взять сырочки с mozilla.org и начать их пилить на предмет исправления мешающих недостатков. Ну, далеко не все программы с открытым кодом. |
![]() |
Сообщ.
#176
,
|
|
Цитата AndNot @ Это еще ничего не доказывает... Я могу в Паскаль-программе на 9000 строк сделать одну ошибку, и в Форт-программе из 10 строк - две. И что? Это что - то покажет? Заметь, размеры программ различаются на несколько порядков... Потому в нем хоть и отсутствует какой либо контроль за программистом (а кому как не ему знать что он творит?), ошибок в программах на порядок меньше, чем уменя к примеру было в Паскале и С и Асме |
Сообщ.
#177
,
|
|
|
Но дело в том что в Форте я проверяю программу по мере написания. Просто сам язык предоставляет для этого все средства. В других таких удобных средств нет (я говорю не про синтаксис, а про логические ошибки). И потом, Форт приучает к разбивке программы на очень маленькие слова, соответственно они и проверяются легко.
Если я определил слово ![]() ![]() : ADDW + ; то тутже могу проверить его работу ![]() ![]() 2 3 ADDW . 5 Ok. И кстати, предвижу возражение, такое разбиение обходится довольно-таки дешево, в плане скорости программы, т.к. выход из очередного слова - это просто JMP в следующее(конечно зависит от реализации Форта). И в скомпилированном виде форт-программа как правило по скорости не уступает асму, ну может чуть-чуть, опять же зависит от решаемой задачи. |
Сообщ.
#178
,
|
|
|
Цитата AndNot @ Ну, далеко не все программы с открытым кодом. Из тех, что стоят у меня — практически все (те, что с закрытым — это драйвера нвидии и программы, которые нам навязывают в университете). Цитата AndNot @ Но дело в том что в Форте я проверяю программу по мере написания. Просто сам язык предоставляет для этого все средства. В других таких удобных средств нет (я говорю не про синтаксис, а про логические ошибки). И потом, Форт приучает к разбивке программы на очень маленькие слова, соответственно они и проверяются легко. Кстати, а как в форте с обработкой ошибок? Есть какая-нибудь удобная система типа C++'ных исключений или лисповских событий/сигналов? Цитата AndNot @ Ну к примеру каждый элемент может содержать либо byte, либо word, либо dword. Можно сделать такой список, которой разнородные данные подобного вида может содержать. Цитата AndNot @ Сколько бы она не занимала, Форт предоставляет удобные средства проверки. Ты можешь проверить на вшивость только что определенное слово. И без напрягов. Просто сразу проверяешь то что написал, по ходу составления программы. Потому в нем хоть и отсутствует какой либо контроль за программистом (а кому как не ему знать что он творит?), ошибок в программах на порядок меньше, чем уменя к примеру было в Паскале и С и Асме (Бейсик 8-ми разрядных машин не считаю). Просто сам убедился в этом. И не пойми не правильно, я не заядлый фортер, приходится в основном кодить на асме. Скажем так, лисп в этом плане тоже достаточно удобен — практически во всех реализациях лиспа есть REPL (цикл Read-Eval-Print-Loop), который позволяет, в том числе, проверять всякого рода конструкции. А ещё лисп позволяет изменять код программы (именно исходные тексты, а не так, чтобы программма модифицировала себя), не перезапуская ее. Удобно для отладки — всяческие переменные сохраняют свои значения. |
Сообщ.
#179
,
|
|
|
Цитата volvo877 @ Заметь, размеры программ различаются на несколько порядков... ![]() 30000 - 50000 строк это довольно средненький проект, без графики и анимации, интернет связи и т.д. Добавлено Цитата AndNot @ В других таких удобных средств нет (я говорю не про синтаксис, а про логические ошибки). концепция модулей тестирования на С++ ![]() Добавлено Цитата AndNot @ Это уже второстепенный вопрос. Я ведь просто спросил - можно или нет? как раз первостепенный, сдается мне что проектировочка у тебя не верна, я правда не понял до конца семантики классов, но почему Персона у тебя наследуется от Предка, ведь персона более общее понятие, потом почему Двоешник - обязательно Студент, он может быть и школьником, поэтому наследование тут излишне, тут нужна подмешка или композиция на худой конец, может на Форте это выглядит верно, но на С++ или Паскаль такие вещи вызывают удивление (это не наезд и не подкол, просто концепция проектирования другая) вообще предок дает интерфеис, а наследник его реализует, см мой пост про микроволновку, и для смены функциональности, если очень приспичит, проще использовать указатель на функцию |
Сообщ.
#180
,
|
|
|
Цитата mo3r @ Из тех, что стоят у меня — практически все (те, что с закрытым — это драйвера нвидии У меня так не получается. Никак не могу найти сорсы на свой любимый тасм (есть что подправить). Ну да бог с ними ![]() Цитата mo3r @ Кстати, а как в форте с обработкой ошибок? Все строишь сам. Сам Форт проверяет только присутствие в словаре слова из входного потока. Цитата mo3r @ А ещё лисп позволяет изменять код программы (именно исходные тексты, а не так, чтобы программма модифицировала себя), не перезапуская ее. Удобно для отладки — всяческие переменные сохраняют свои значения. Так я пытался это втолковать, только про Форт. Сорри что мысль выразил плохо. Дело в том, что готовая Форт-программа содержит в себе сам Форт и словари (это и есть собственно исходники). Поэтому конечный пользователь и может ее легко переделать. Естественно ее можно скомпилировать в чисто исполняемый файл, но как правило необходимости в этом нет. Цитата impik777 @ 30000 - 50000 строк это довольно средненький проект, без графики и анимации, интернет связи и т.д. Для Форта это уже солидный проект, в который можно встроить и графику и анимацию и управление летающей тарелкой ![]() Цитата impik777 @ концепция модулей тестирования на С++ Полезная штука, но не такая удобная. Цитата impik777 @ как раз первостепенный, сдается мне что проектировочка у тебя не верна Я и не проектировал, это все от балды. Цитата impik777 @ может на Форте это выглядит верно Тот пример везде будет выглядеть нелепо. Но я ведь предупредил, что Цитата AndNot @ Пример глупый до невозможности Меня больше интересовало, не появились ли в С подобные возможности манипуляций с объектами. Давненько за ним не следил ![]() Цитата mo3r @ Можно сделать такой список, которой разнородные данные подобного вида может содержать. Меня интересовали шаблоны, очень удобная штука. Можно или нет? На Форте видел подобное. А на паскале сам делал (естественно не шаблон и без ООП). |