Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
ВнизИнтерпритатор языка или что-то в этом роде. Найти похожие ветки
← →
Defunct © (2004-10-14 21:24) [80]> Я согласен и чтоб быть полезным и интересным
> приведу пример работы интерпритатора Pascalя
> сделанного на днях для запутывания кода
> Вот исходный бессмысленный код для запутывания:
К чему это относилось совсем не понятно.
Ваш код (до запутывания) - полный абсурд:procedure test;
var
rrr:integer; <-- лишнее, потому что не несет смысловой нагрузки
i:integer; <-- лишнее, т.к. можно обойтись без цикла
s:string; <-- лишнее, т.к. нигде не используется
begin
{Коментарий}
for i:=1 to 2 do begin <--- лишнее потому что в цикле ничего не делается
inc(rrr); <--- лишнее потому что rrr устанавливается в 2 после цикла
end;
form1.timer1.enabled:=false;
rrr:=2; <--- лишнее потому что потом идет проверка на > 0
if rrr>0 then begin <--- лишнее потому что rrr всегда больше нуля
assignFile(tf,"test.pas"); <-- лишнее потому что из файла ничего не читается
end;
reset(tf); <-- ошибка, потому что файловая переменная может быть не назначена
closeFile(tf) <-- ошибка, потому что файл может быть не открыт
end;
Если убрать все лишнее получится:procedure test;
begin
Form1.Timer1.Enabled:=false;
end;
Ну и что же этот код делает, причем тут интерпретатор паскаля?
Если вы действительно хотите кого-то запутать, тогда надо применять перекресные ссылки (crosslinked code). Вот пример (уже приводил его однажды):Db 0B8H
SubEnable:
Db 2dH
Db 3eH
Db 0EBH
Db 0FCH
Здесь AH=52h и ни один анализатор кода (без интерпретации) не сможет установить вызов вирусоопасной функции получения списка списков.
← →
Defunct © (2004-10-14 21:39) [81]> приведу пример работы интерпритатора Pascalя
> А вот что после запутывания:
Вдогонку, то что вы пытались преподать всем как интерпретатор Паскаля, теории известно и называется "Генератор полиморфного кода". Широко применяется в вирусологии и в теории защиты информации.
Определение:
Генератор полиморфного кода - программа способная создавать штаммы, выполняющие одно и то же действие, которые не совпадают ни по размеру коду и ни в одином байте кода.
← →
programania © (2004-10-16 03:24) [82]>Defunct
Ваш код (до запутывания) - полный абсурд:
Сожалею что вы стали анализировать бессмысленный код
о чем было ясно написано:
Вот исходный бессмысленный код для запутывания:
>причем тут интерпретатор паскаля
Чтобы сделать такой выходной код нужно выделить из текста паскаля
операторы, коментарии, константы, элементы оператора FOR,
begin, end, а разбор входного текста на составные части
это и есть начальная стадия интерпретатора.
"Генератор полиморфного кода" здесь не причем.
код изменяется каждый раз одинаково,
цель не вирус а создание исходного кода,
который нормально работает, но который невозможно
понять или восстановить, например,
для защиты от взлома или незаконного использования.
Было интересно узнать удалось ли это сделать или
надо путать сильнее.
>Опишите хотя бы чего ждать от программы?
О своих программах я могу писать без конца, но боюсь всем надоем
поэтому извините что не на все отвечаю.
После download и распаковки programania.com/ENLIS.ZIP
Нужно ждать появления файлов:
Enlis.exe от 11.10.04, z.men от 15.10.03, oan.ini от 15.10.03
и нескольких других не обязательных.
После запуска Enlis.exe любым способом
следует ждать появления меню из 3 пунктов: "Возможности","Настройка","Выход"
c подменю без всяких сообщений.
От меню нужно ждать вызова описания возможностей в htm, настройки вида
и запуск редактора табличных файлов.
От редактора следует ждать стандартного меню и панели с кнопками
При выборе создать и вводе любого имени следует ждать
появления типовой формы документа, который можно заполнять
и испытывать все возможности.
Или распаковать KADR.EXE с заменой, чтоб сразу их увидеть
после запуска той же самой Enlis.exe
Для чего программа написано в enlis.htm, а если коротко
то для создания АРМов бухгалтерских и т.п.
>Rar есть у всех а вот sfx никому не нужен.
За всех лучше не говорить: я не раз скачивал
rar и не мог распаковать потому что у меня старый rar
или вы думаете кто-то ради вашей программы будет
искать rar? Поэтому self надежней.
>Если программа заслуживает внимания, тогда пользователям не важно сколько занимает инсталляшка 800kb или 10Mb.
Чтобы узнать программу лучше всего ее скачать.
Или вы думаете что все уже знают ваши программы.
>Зато сервис выше, программу можно будет хоть нормально анинсталлить.
Это средство разработки, не для дилетантов и не требует установки,
специалисту смешно предлагать весь этот "сервис",
а чтобы хоть нормально анинсталлить достаточно все удалить.
Для дилетантов есть ENJOL.ZIP с установкой как принято.
>VMcL
>Ещё больше крепчал (это я как экс-1С-программист пишу).
А я писал о разработчиках 1C т.е. того языка
на котором вы программировали 1C.
← →
VMcL © (2004-10-16 14:08) [83]>>programania © (16.10.04 03:24) [82]
>А я писал о разработчиках 1C т.е. того языка
на котором вы программировали 1C.
Откуда дровишки? ОГГ?
← →
Юрий Зотов © (2004-10-16 17:47) [84]> programania [60]
Итак, расширяем мою программу так, чтобы она содержала:
объекты - <круг> <квадрат> <текстовое поле>
команды - <создать> <переместить> <скрыть> <показать> <удалить> <изменить радиус> <изменить ширину> <изменить текст>
Сразу скажу, что на этом примере я намерен продемонстрировать, что программа именно расширяемая - то есть, что новые объекты и команды вводятся в нее без изменения алгоритма и УЖЕ существующего кода, а ТОЛЬКО добавлением нового.
Поскольку объект <текстовое поле> в программе уже есть (это РЕДАКТОР), добавляем объекты ПРЯМОУГОЛЬНИК (это КВАДРАТ в общем виде) и ЭЛЛИПС (это КРУГ в общем виде). Сначала вводим в проект еще один модуль, в котором определяем сами эти объекты (чтобы было что добавлять):
unit Unit2;
interface
uses
Windows, Messages, Classes, Controls, ExtCtrls;
type
TRectangle = class(TShape)
private
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
protected
procedure Paint; override;
end;
TEllipse = class(TRectangle)
public
constructor Create(AOwner: TComponent); override;
published
property Shape default stEllipse;
end;
implementation
{ TRectangle }
procedure TRectangle.CMTextChanged(var Message: TMessage);
begin
inherited;
Invalidate
end;
procedure TRectangle.Paint;
const
Flags = DT_CENTER or DT_VCENTER or DT_SINGLELINE or DT_EXPANDTABS or DT_END_ELLIPSIS;
var
R: TRect;
begin
inherited;
with Canvas do
begin
R := ClientRect;
DrawText(Handle, PChar(Caption), Length(Caption), R, Flags)
end
end;
{ TEllipse }
constructor TEllipse.Create(AOwner: TComponent);
begin
inherited;
Shape := stEllipse
end;
end.
Теперь вводим эти новые объекты в саму программу. Для этого их нужно только внести в таблицы классов:
ClassCount = 6;
ClassTable: packed array[0..(ClassCount - 1)] of string =
("КНОПКА", "МЕТКА", "ПАНЕЛЬ", "ПРЯМОУГОЛЬНИК", "РЕДАКТОР", "ЭЛЛИПС"); // upper case, sorted
DelphiClassTable: packed array[0..(ClassCount - 1)] of TControlClass =
(TButton, TLabel, TPanel, TRectangle, TEdit, TEllipse);
Это все. Можно запустить программу и убедиться, что ее старые команды "создать", "переместить" и "удалить" УЖЕ работают с новыми объектами. Как видите, в СТАРОМ коде программы абсолютно ничего не изменилось - был ДОБАВЛЕН код новых объектов, а сами новые объекты были ТОЛЬКО внесены в таблицы.
Теперь вводим новые команды СКРЫТЬ, ПОКАЗАТЬ, РАЗМЕР (это <изменить радиус> и <изменить ширину> в общем виде) и ТЕКСТ (остальные команды в программе уже есть). Это делается в 2 шага.
Шаг 1. Вносим новые команды в тип TToken и в таблицы команд:
type
TToken = (tkNone, tkClassName, tkObjectName,
tkMove, tkShow, tkSize, tkHide, tkCreate, tkText, tkDelete, tkParam, tkEoF);
CommandCount = 7;
CommandTable: packed array[0..(CommandCount - 1)] of string =
("ПЕРЕМЕСТИТЬ", "ПОКАЗАТЬ", "РАЗМЕР", "СКРЫТЬ", "СОЗДАТЬ", "ТЕКСТ", "УДАЛИТЬ"); // upper case, sorted
CommandTokenTable: packed array[0..(CommandCount - 1)] of TToken =
(tkMove, tkShow, tkSize, tkHide, tkCreate, tkText, tkDelete);
ValidCommandTable: packed array[tkClassName..tkObjectName, tkMove..tkDelete] of boolean =
((False, False, False, False, True, False, False), (True, True, True, True, False, True, True));
Шаг 2. Для каждой новой команды пишем обрабатывающую ее процедуру и вносим ее в таблицу процедур:
procedure ShowObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
if Length(IntParams) <> 1 then
InvalidParamCount(0);
ObjectTable.GetObject(StrParam, IntParams[0]).Visible := True
end;
procedure SizeObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
if Length(IntParams) <> 3 then
InvalidParamCount(2);
if (IntParams[1] < 0) or (IntParams[2] < 0) then
raise EStatementSyntaxError.Create("Размер объекта не может быть отрицательным");
with ObjectTable.GetObject(StrParam, IntParams[0]) do
SetBounds(Left, Top, IntParams[1], IntParams[2])
end;
procedure HideObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
if Length(IntParams) <> 1 then
InvalidParamCount(0);
ObjectTable.GetObject(StrParam, IntParams[0]).Visible := False
end;
procedure TextObjectProc(const StrParam: string; const IntParams: TIntegerArray);
var
i: integer;
begin
if Length(IntParams) <> 2 then
InvalidParamCount(1);
try
i := ObjectTable.FindObject(StrParam, IntParams[1])
except
on E: EStatementSyntaxError do
i := -1
else
raise
end;
if i >= 0 then
raise EStatementSyntaxError.CreateFmt("Объект "%s%d" уже существует", [StrParam, IntParams[1]]);
with ObjectTable, Items[FindObject(StrParam, IntParams[0])]^ do
begin
ObjectID := IntParams[1];
TFriendControl(ObjectRef).Text := GetObjectName(StrParam, ObjectID)
end
end;
var
CommandProcTable: array[tkMove..tkDelete] of pointer =
(@MoveObjectProc, @ShowObjectProc, @SizeObjectProc, @HideObjectProc,
@CreateObjectProc, @TextObjectProc, @DeleteObjectProc);
Это все. Можно запустить программу и убедиться, что теперь ВСЕ ее команды (и старые, и новые) УЖЕ работают со ВСЕМИ ее объектами (и старыми, и новыми). Как видите, в СТАРОМ коде снова абсолютно ничего не изменилось - были ДОБАВЛЕНЫ процедуры для новых команд, а сами новые команды были ТОЛЬКО внесены в таблицы.
Вот так пишутся РАСШИРЯЕМЫЕ (а не ПЕРЕДЕЛЫВАЕМЫЕ) программы. Которые легко сопровождать и поддерживать. Что стало возможным как раз благодаря тому, что сам код интерпретатора (а это процедура ExecuteStatement со всеми ее внутренними процедурами) ИЗНАЧАЛЬНО был написан по ТЕОРИИ. И заметьте, что в ЭТОМ коде ВООБЩЕ ничего не менялось. К нему даже ничего и не ДОБАВЛЯЛОСЬ - поскольку благодаря теории этот код стал ОБЩИМ. Универсальным. Ему абсолютно без разницы, сколько и каких объектов и команд надо обрабатывать. Сколько угодно и каких угодно. Он работает по набору БНФ, в котором определены понятия ЛЮБОЙ объект и ЛЮБАЯ команда - а какой КОНКРЕТНЫЙ объект или команда встретились в тексте - безразлично, лишь бы этот объект или команда присутствовали в таблицах. Вот почему при добавлении новых объектов и команд модифицируются таблицы, а не интерпретирующий код.
Теперь допустим, что таблицы объектов и команд сидят не в программе, а в БД. Тогда вообще начинаются чудеса - код будет способен обрабатывать ЛЮБЫЕ объекты и команды ДАЖЕ БЕЗ ПЕРЕКОМПИЛЯЦИИ. Поскольку таблица DelphiClassTable может быть текстовой и тоже сидеть в БД (класс Delphi находится через GetClass), как и таблица обрабатывающих процедур CommandProcTable (сами процедуры могут сидеть в библиотеке UDF и определяться через GetProcAddress). ТАКУЮ программу надо только отладить, а все модификации могут вносится в БД и UDF самими юзерами - и получаем "язык, определяемый пользователем".
Неплохо, да? И, между прочим, благодаря теории.
===========================
P.S.
О том, что же сделали Вы (РАСШИРИЛИ свою программу или ПЕРЕДЕЛАЛИ ее) - позже.
← →
wnew © (2004-10-16 18:01) [85]Юрий Зотов, если бы Вы писали книги по программированию, то думаю, многим бы они были очень интересны и полезны. Я бы с удовольствием изучал бы их содержимое, даже просто так, для себя.
Почему бы Вам не заняться писательством? Наверное, от этого занятия тоже есть какая-то материальная выгода.
← →
GanibalLector © (2004-10-17 01:38) [86]2 Юрий Зотов [84]
Да,чудеса!!!
Полностью согласен с wnew [85].Может начнем инвестировать в Вас?
← →
Defunct © (2004-10-17 02:36) [87]programania © (16.10.04 03:24) [82]
>> Ваш код (до запутывания) - полный абсурд:
> Сожалею что вы стали анализировать бессмысленный код
> о чем было ясно написано:
Я стал его анализировать, после того как прочитал это:
> приведу пример работы интерпритатора Pascalя
> сделанного на днях для запутывания кода
Мне просто стало интересно, где же там интерпретатор.
Мельников Г.П. «Системология и языковыe аспекты кибернетики», М. 1978 г.
http://www.philol.msu.ru/~lex/melnikov/meln_r/glava_2_2-4.htm :
Поскольку дальше речь пойдет о различных аспектах проблемы отражения, которая подразумевает обязательное наличие отражающего объекта и отражаемых объектов, то условимся называть отражающий объект более кратко, одним словом: интерпретатор.
Следовательно, интерпретатор – это объект, отражающий поведение каких-то объектов отражения.
>> причем тут интерпретатор паскаля
> Чтобы сделать такой выходной код нужно выделить из текста паскаля
> операторы, коментарии, константы, элементы оператора FOR,
> begin, end, а разбор входного текста на составные части
> это и есть начальная стадия интерпретатора.
Смотрим определение интерпретатора. Где же тут отражение чего-либо?
Интерпретатор паскаля в вашем случае должен был бы выполнить (интерпретировать) приведенный код, или попытаться выполнить, и на основе результата выполнения, прийти к такому же выводу, к какому пришел я в [80] – код бессмысленный.
> "Генератор полиморфного кода" здесь не причем.
> код изменяется каждый раз одинаково,
Тем не менее, ваша программа, это хоть и неумелый, но все же именно «генератор полиморфного кода». Поясню:
В результате выполнения вашей программы:
1. мы получаем штамм, выполняющий те же действия, что и исходный код;
2. новый штамм не совпадает по размеру с изначальным кодом;
3. новый штамм не совпадает ни в одном байте с исходным кодом.
(хотя второе у вас получилось исключительно из-за смещения, так что нормальный анализатор кода, к примеру, эвристический анализатор из DrWeb все же найдет совпадения)
Таким образом, ваша программа попадает под определение генератора полиморфного кода [81].
> цель не вирус а создание исходного кода,
> который нормально работает, но который невозможно
> понять или восстановить, например,
> для защиты от взлома или незаконного использования.
А кто говорит, что генератор полиморфного кода (ГПК) применяется только в вирусах? Я же в [81] указал область применения ГПК: широко применяется в вирусологии и в теории защиты информации. Вирусология, кстати, занята проблемами обнаружения и удаления вирусов.
> Было интересно узнать удалось ли это сделать или
> надо путать сильнее.
Как для запутывания человека – не удалось, человек может интерпретировать (выполнить) ваш код, понять что он делает и выбросить все лишнее.
Как для запутывания автоматических анализаторов кода – тоже не удалось, см. выше. (к примеру, эвристический анализатор из DrWeb все же найдет совпадения)
> О своих программах я могу писать без конца
Программу я посмотрю чуть позже, надеюсь, вы ее привели к нормальному виду.
← →
Sphinx (2004-10-17 17:12) [88]> Юрий Зотов © (16.10.04 17:47) [84]
А есть возможность экспортировать нововведения из DLL?
Вроде бы описания объектов TRectangle TEllipse должно быть определено в основной программе? То есть расширить интерпретатор таким образом не получится? Или я ошибаюсь?
← →
Palladin © (2004-10-17 17:26) [89]
> [88] Sphinx (17.10.04 17:12)
для DLL в этот штук придется вводить интерфейсы, что в принципе очень не долго... или же использовать BPL...
имхо, лучше интерфейсы :)
← →
Sphinx (2004-10-17 22:17) [90]> Palladin © (17.10.04 17:26) [89]
С интерфейсами на сталкивался...в плане их самостоятельного описания. Может ссылочка есть где можно почитать? Или литература? Хотя Инет предпочтительней...чуть-чуть :)
← →
programania © (2004-10-18 02:13) [91]>Юрий Зотов
>Как видите, в СТАРОМ коде снова абсолютно ничего не изменилось - были ДОБАВЛЕНЫ процедуры для новых команд, а сами новые команды были ТОЛЬКО внесены в таблицы.
А куда девалась передвижная панель?
Я обработку команд добавляю в оператор IF там где они получаются
вы в процедуры и в массив указателей на них. И чем это лучше?
По моему это самообман. Ничего не дает, а только усложняет.
А при любой потребности не учтенной в теории все придется делать заново.
Вы сами говорили что все должно быть учтено заранее.
А я уверен что могу добавлять все что угодно не заботясь ни о каких
теориях и так и сделал все свои программы.
Все они когда то выглядели как мой пример в форуме.
>а все модификации могут вносится в БД и UDF самими юзерами - и получаем "язык, определяемый пользователем".
и получаем еще один бейсик: тоже самими юзерами могут писаться любые процедуры или программы.
>Defunct
>«Системология и языковыe аспекты кибернетики», М. 1978 г.
>интерпретатор – это объект, отражающий поведение каких-то объектов отражения.
>Смотрим определение интерпретатора. Где же тут отражение чего-либо?
Это в 1978 можно было процитировать Ленина и спросить почему не отражено в программе.
>должен был бы выполнить (интерпретировать) приведенный код
под выполнением здесь понимается создание другого кода что и было сделано.
>Тем не менее, ваша программа, это хоть и неумелый, но все же именно «генератор полиморфного кода».
Называйте как хотите но лучше давать названия чтоб было сразу
понятно назначение программы например: запутыватель или mixer.
>Как для запутывания человека – не удалось, человек может интерпретировать
>(выполнить) ваш код, понять что он делает и выбросить все лишнее.
После интерпритации человек получит цепочку из миллионов
операторов присвоения, проверки, а чаще GOTO разбросанных по всей программе.
И что дальше?
Программу с GOTO невозможно понять даже не запутывая ее специально,
и это давно все поняли.
Сложность кода и многократность его выполнения единственное средство
для защиты программы от анализа.
А этой программой можно достичь любой сложности просто повторяя ее.
← →
KSergey © (2004-10-18 06:53) [92]> [91] programania © (18.10.04 02:13)
С вами не интересно разговаривать. Вы не видите того, что вам пишут, смотрите на это лишь через узкую дырку своего понимания. Даже к словам придираться не буду - не интересно.
Елинственное, за что можно выразить вам благодарность - так это за посты Юрия Зотова в этой ветке. Только не приписывайте эту заслугу себе. Лучше просто почитайте, что он говорит, 5 раз, подумайте.
← →
Юрий Зотов © (2004-10-18 22:47) [93]> programania
Вот теперь о том, что же сделали Вы - РАСШИРИЛИ свою программу, или ПЕРЕДЕЛАЛИ ее.
Я загрузил оба варианта в сравнивалку текстов и та расцвела всеми цветами радуги (а цветами она помечает отличия) - причем практически по всему тексту (а вовсе не в одном месте, как Вы утверждали). Итак, в новом варианте Вы сделали следующее.
1. Добавили глобальные переменные i, pNA, d, txt, stop, error, est, hide и wo. Если алгоритм не менялся, то зачем понадобились новые переменные?
2. Добавили функции C, SSP и E. Если алгоритм не менялся, то зачем понадобились новые функции? Ведь это совсем не те новые функции, которые я ввожу у себя для новых команд - мои новые функции в анализе текста никак не участвуют, а Ваши - участвуют. Вводя такие функции, Вы меняете алгоритм работы интерпретатора.
3. Изменили код процедуры SS. Если алгоритм не менялся, то зачем это потребовалось?
4. Изменили код обработки команды "переместить" - привязались к ключевому слову "на". Во-первых, код все же изменился. Во-вторых - что Вы будете делать, если потребуется ввести еще какую-то команду и в ней тоже будет присутствовать слово "на"? Ответ очевиден - Вы будете снова менять алгоритм. То есть, снова переделывать программу.
5. Добавили код обработки новых команд и объектов. Вот только это Вы и должны были бы сделать, если Ваша программа была действительно расширяемой.
Вывод напрашивается сам собой - чтобы ввести в Вашу программу новые команды и объекты, Вам потребовалось ее переписать. С изменением и старого кода и самого алгоритма. Фактически - написать новую, потому что другой алгоритм - это уже другая программа. И, как всякая новая программа, она снова требует полной отладки и т.д. Все заново, с нуля. Что не просто усложняет поддержку, а делает программу практически неподдерживаемой - потому что трудозатраты на поддержку такой программы слишком велики. И вот поэтому-то Ваш подход годится только для написания простых и маленьких программулек, но совершенно неприемлем для больших и сложных продуктов. И не надо обманывать - Ваш код более чем красноречиво говорит, что нет у Вас никакого опыта разработки и поддержки таких продуктов. Потому что и по идеологии, и по качеству это код студента, а не опытного программиста.
> programania © (14.10.04 19:24) [77]
> у меня чтоб добавить новую команду нужно добавить строку IF по
> ключевому слову и делать тамчто угодно совершенно независимо
> от обработки других команд.
Но продемонстрировали Вы почему-то прямо противоположное. Новые переменные, новые функции, измение старого кода и алгоритма. Говорить можно что угодно, но фактами Ваши слова почему-то не подтверждаются. А совсем наоборот - опровергаются.
> у вас все команды и их обработка сделаны по одному типу Cmds
> Dirs поэтому при изменении одной или добавлении новых
> конструкций придется затрагивать и старые и значит заново все
> отлаживать.
Но почему-то я тоже продемонстрировал прямо противоположное. Никаких изменений, только добавление нового. Соответственно, только это новое и требует отладки. И это тоже факты, а не слова.
> Еще, сами ключевые слова, действия и их обработка разбросаны
> по программе, а это не так наглядно.
И снова - продемонстрировал я прямо противоположное. Новые команды и объекты вносятся в таблицы - и все. И это снова не слова, а факты.
> Главное при изменении программы не навредить.
Вот это верно. Но с Вашей программой не имеет ничего общего. Поскольку Вы ее переписали - то есть, возможности навредить имели предостаточно.
> Представьте что вашу программу собрался изменить незнакомый
> человек. В моей он сразу найдет ключевое слово по ctrl+F
> и изменит в одном месте только что относится к этой команде,
Насчет "в одном месте" - это мы уже видели. Если бы... Факты, сударь, факты. Они не на Вашей стороне.
> а вашу программу я вообще побоялся бы трогать.
Тем не менее, модифицируется она очень просто. Как именно - я уже показывал. И это тоже факты, а не слова.
> Делите программу на независимые куски: не пожалеете.
Спасибо, но Ваш совет запоздал лет эдак на 30. Программистский букварь я читал именно тогда.
> Никто не может предвидеть будущее.
> А значит при необходимости непредвиденных измененй
> вашу программу придется выкинуть.
Логика железная - раз никто не может предвидеть будущее, значит мою программу придется выкинуть. Ох, что-то тут не так с причинно-следственными связями...
Ну так вот - предвидеть будущее не просто можно, а очень даже легко. Надо просто сразу считать, что расширения понадобятся и сразу их предусмотреть. Это первое. И второе: чью программу пришлось выкинуть - это мы уже видели. Снова факты.
>> малого опыта работы с отладчиком в действительно сложном коде.
> Когда я работаю с отладчиком то могу исковырять код до
> неузнаваемости. Как вы отлаживаетесь не меняя кода?
Елы-палы! Вы даже не поняли, о чем я говорил. Почему опытные программеры оператор после then пишут на следующей строке, как Вы думаете?
> Совет:
> Не бойтесь переделывать и содержание и форму.
Благодарю. Я, в общем-то и не боюсь. Но это и не требуется - обычно я просто сразу пишу так, чтобы потом уже не переделывать. Ни содержание, ни форму. Расширять, наращивать возможности - это да. Но не переделывать. Пример был дан выше.
> Нет ничего застывшего. Все в вашей власти.
Красивые слова, и ничего больше. Я же просил Вас - не надо демагогии. Лучше факты, плз, это гораздо убедительнее.
>>зачем для форума "сжимать" код?
> Не у всех же бесплатная выделенка.
А как Вы считаете, сколько весит Ваш код в "сжатом" и в нормальном виде? Разница-то ведь копеечная, вряд ли и сотня байт наберется. Может, уважение к читателям дороже этой сотни байт?
> О программе лучше самому судить
> а Defunct похоже ее и не видел в нормальном виде
Не "похоже", а так и есть. Он сам об этом сказал - что увидеть программу ему так и не удалось, несмотря на все его старания. И мне тоже вряд ли удастся, так что "самому судить" - не получится.
> programania © (18.10.04 02:13) [91]
> А куда девалась передвижная панель?
Никуда не девалась.
> Я обработку команд добавляю в оператор IF там где они
> получаются вы в процедуры и в массив указателей на них. И чем
> это лучше? По моему это самообман. Ничего не дает, а только
> усложняет.
Гм... помнится, кто-то совсем недавно советовал делить программу на независмые куски... А теперь говорит, что это "ничего не дает, а только усложняет".
> А при любой потребности не учтенной в теории
Не будет такой потребности. Потому что теория позволяет программе работать с ЛЮБЫМ объектом и с ЛЮБОЙ командой. А шире, чем "любой" ничего не бывает. Некуда уже шире.
> все придется делать заново.
Но факты почему-то говорят об обратном.
> Вы сами говорили что все должно быть учтено заранее.
Что и продемонстрировал. На деле.
← →
Palladin © (2004-10-18 22:51) [94]
> [90] Sphinx (17.10.04 22:17)
Ссылочка на деле очень простая :)
www.podgoretsky.com
а там DDP, использование Com или что то на подобие...
точно название не помню... ну оно и к лучшему... пока ищешь... найдешь много интересного для себя...
← →
Rouse_ © (2004-10-18 22:59) [95]> programania © (18.10.04 02:13) [91]
- Эх, кабы не старость постылая, - заговорил старик после недолгого молчания, - плюнул бы на все и увел тебя на Вятшую реку.
ЗЫ: Сдавайся Леопольд ;)
← →
programania © (2004-10-19 19:51) [96]>Юрий Зотов
Спасибо за анализ моей простой программы я даже не ожидал.
А изменения делал как и говорил в 1-ом сообщении:
если вижу что что-то повторяется выношу в процедуры или функции
при этом совершенно не заботит что меняю программу а не расширяю
однако конечно этого можно и не делать.
>Елы-палы! Вы даже не поняли, о чем я говорил.
вы говорили об отладке, в основном это поиск ошибок.
Тут следует как можно больше переложить на программу
чтоб она сама все показала и как работает и где ошибается
для этого все средства хороши: проверки,сообщения,имитаторы нажатия,
выкидывание лишнего кода для прояснения, написание дополнительного и т.п.
После такой войны с ошибкой вся программа в руинах,
а вы говорите then на отдельной строке: смешно.
о структуре программы:
можно вообще все операторы вынести в процедуры
оставить только цикл их вызова из массива указателей
и радоваться что этот цикл не нужно изменять.
По моему пока программа не подавляет своей сложностью
структура должна быть как можно проще
и если почуствуете что теряете контроль, тогда
всегда можно упорядочить до полного понимания:
перемещение готового кода не требует больших усилий.
>Потому что теория позволяет программе работать с ЛЮБЫМ объектом
>и с ЛЮБОЙ командой. А шире, чем "любой" ничего не бывает. Некуда уже шире.
о настройке:
Во всех больших программах заметны попытки вынести переменные
части для доступа пользователя это ini файлы, pluginы, macro и т.п.
вы тоже предлагаете что-то подобное в своем формате,
чтоб пользователи сами изобретали себе язык по вашим правилам.
Может лучше попытаться обработать любую команду
привычную пользователю без всяких БНФ,
например, путем последовательного
выбора пользователем из предлагаемых ему альтернатив
интерпретировать его команду
в команды доступные программе и запомнить.
Наверно тут еще потребуется пошаговый отладчик,
чтоб пользователь мог видеть что собирается делать
программа и поправлять ее.
Предусматривает ли это ваша теория?
← →
Юрий Зотов © (2004-10-19 21:37) [97]> programania © (19.10.04 19:51) [96]
И снова слова... слова... слова... одни лишь слова. А как только доходит до конкретики - почему оператор после then пишут на новой строке) - так снова слова... слова... слова... одни лишь слова. Я Вас дважды спрашивал, спрошу и в третий раз - ПОЧЕМУ? Не надо многословия, ответьте конкретно. Иначе получается, что ответа Вы просто не знаете - а значит, никогда не ходили отладчиком по действительно непростому коду. Вообще ни разу. А в таком случае спорить с Вами просто не о чем, понимаете?
Сначала Вы говорите об опыте разработки и сопровождения, потом приводите код, который ни к тому, ни к другому опыту даже близко не лежит. Получается жонглирование словами, типа - "слышал звон, да не знает, где он".
Сначала Вы говорите, что при модификации главное - не навредить, потом заявляете, что Вас совершенно не волнует, переделывете Вы программу или расширяете ее. А одно с другим не вяжется. И снова получается жонглирование словами, снова "слышал звон".
Сначала Вы говорите о структурировании программы, о ее разбиении на независимые куски - но почему-то игнорируете вопрос о восходящем и нисходящем проектировании (видимо, потому что Вы просто не знаете, что это такое?). А потом вообще заявляете что все это - ненужные усложнения. А потом произносите много-много слов по этому поводу, которые в итоге сводятся к "перемещение готового кода не требует больших усилий". Батенька, да такой подход как раз и показывает, что и о проектировании программ Вы не имеете ни малейшего понятия. Снова - всего лишь "слышал звон".
В [84] я Вам говорю: "получаем язык, определяемый пользователем, причем именно благодаря теории". И конкретно показываю, как именно мы его получаем. Вплоть до указания имен функций, с помощью которых разрешаются текстовые ссылки на классы и процедуры. После чего реализовать все это становится легче легкого.
А в [96] Вы предлагаете то же самое (только в каком-то кастрированном, извините, виде) и спрашиваете - предусматривает ли это ваша теория?
Повторяю еще раз (третий уже - чтобы Вы больше уже никогда не задавали таких вопросов ни мне, ни кому-либо другому) - теория предусматривает все. Работу с любыми командами и любыми объектами. На то она и теория и есть. Общая она, понимаете?
И, несмотря на все эти "слышал звон", Вы еще и беретесь спорить, притом с каким-то совершенно непонятным упорством. Приводя в качестве "аргументов" красивые и умные слова, но не приводя подтверждений этим словам (зато приводя их собственноручные опровержения).
По-видимому, Вы сказали правду - разговаривать о программировании Вы готовы бесконечно. Но пока что всего лишь разговаривать (очень надеюсь, что именно "пока").
Что же касается меня, то извините, но я к бесконечным разговорам не готов и временем для них не располагаю. Все, что я хотел Вам сказать, уже сказано - так что читайте и думайте, как сказал KSergey. А еще - читайте все же книжки (если конечно, в будущем хотите не только слышать звон, но еще и знать, где он). И никогда не спорьте о том, в чем как следует не разбираетесь (если, конечно, не хотите рано или поздно услышать-таки в свой адрес знаменитую аббревиатуру из 3-х английских букв).
До свидания. Искренне желаю Вам успехов. Серьезно.
← →
Aldor © (2004-10-21 09:32) [98]Юрий, спасибо большое за Ваши посты в этой ветке. Действительно очень интересно и полезно.
P.S. И ламера бывают косвенно полезны :)))
← →
Sphinx (2004-10-21 15:16) [99]> Palladin © (18.10.04 22:51) [94]
Может я не совсем вник в интерфейсы, но я все равно не понял как передать к примеру тип TEllipse из dll в программу.
Нашел вот еще что:
"DLL не в состоянии поставлять в программу переменные, константы и типы. В результате DLL не могут экспортировать в программу столь необходимые программисту классы - для этого используются пакеты." Фаронов Delphi 6 Учебный курс
Что это за пакеты ?
← →
Владислав © (2004-10-21 15:32) [100]Да... цитата просто супер...
Интересно, а у него дальше написано, что такое пакеты?..
А ведь главное, что понятным языком! ;о)
← →
Sphinx (2004-10-21 15:34) [101]> Интересно, а у него дальше написано, что такое пакеты?..
А дальше про пакеты ни слова...
← →
Palladin © (2004-10-22 00:28) [102]Пакеты это и есть то что я сказал - BPL
← →
Webgirl (2004-10-22 21:55) [103]NAROD mne nujen BNF opisanie paskalya...POMOGITEeee
Страницы: 1 2 3 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
Память: 0.74 MB
Время: 0.05 c