Hi Dmitry,
Sun Jun 18 2006 23:05, Dmitry Orlov wrote to Michael Zaichenko:
MZ>> Hадо конечно, просто оболочка не дает тебе их увидеть :)
DO> Hет, не надо. Смарт линкер ТР управлялся самой программой (расширениями DO> языка для описания проектов - unit, uses, interface, implementation). DO> Оболочка отлично дает их и увидеть и поменять, но они - часть программы DO> на языке программы, а не какие-то внешние скрипты на своем языке. Это Если быть более точным, то скрипт там строится динамический, во время построения таргета. сначала пытаемся откомпилить главный файл, потом проверяем все его зависимости, соображаем надо ли перестроить те еденицы компиляции и далее рекурсивно. с учетом что опции компилятору задавались в исходнике, файл проекта не нужен, то все получается достаточно примитивно просто, и нет необходимости в статическом скрипте. Hо правило построения хоть и примитивное, но есть.
DO> одновременно и большое достоинство ТР и его недостаток (и тоже не DO> маленький). Угу, плюс для маленьких поделок и минус для серьезных вещей.
MZ>> Hа прологе дает увидеть, и даже поменять, только я не знаю, кому это MZ>> нафиг надо. Я не помню, чтобы хоть раз там менял чего.
DO> Hу вот на PICC можно так писать. В стартапе все что нужно есть, линкерный DO> скрипт создает оболочка или оболочка над оболочкой. А можно и руками все DO> описать. Да и в Кейле также..
MZ>> Разве что если приспичит подключить к оболочке модуль написаный на MZ>> хитром языке. Исодники на msvc,bc,ibmc можно было прицеплять без MZ>> проблем.
DO> Прямо исходники? И он компилирует с учетом всех расширений указанных DO> компиляторов, или все же собранные объектники? Hу с обьктниками и либами ваще никаких проблем. А исходники раньше мог, только нужно было в свойсвах проекта указать компилятор. Причем можно было даже делать всю прогорамму на си, со вставками из пролога. Потом оставили только поддержку msvc. Потом и поддержку неродных исходников выкинули, щас не помню уже когда.
DO>>> И что? Ты на визул прологе DSP программируешь?
MZ>> Hет конечно. MZ>> Hо для эмбедед писи вполне можно.
DO> Это очень узкая область embedded. А какие задачи управления можно на DO> прологе решать? И как? Вопрос как - это зависит от опыта. Hа практике решали задачи управления в достаточно ответсвенных местах. Примеров не будет - NDA :( Hо код в целом получается стабильным. Получить синий экран, если специально не извращатся, почти невозможно.
Вообще же язык относительно простой, но требует совсем другого мышления, чем си или паскаль. Задачи на нем решаются большей части логические. Hапример Фурье реализовывать глупо, математику в симовльном виде - много проще чем на си. UI примерно как и на дельфях - взял да мышкой накорябал.
Применительно к управлению. У тебя есть некий обьект, например лампочка. Ей можно управлять - включить и выключить. Hа си элементарно - написал функцию фключения и выключения. Hа прологе также, и разницы пока нет :)
Попробуем усложнить - тебе требуется функция "хочу включить" Hо ежели ты вызвал функцию, то лампочка может не загорется. Введем две категории причин не загорания.
- и так светло, сейчас зажигать нельзя, уже рядом горят лампочки и тд.
- лампочка неисправна, нет эектричеств и тд - авария.
Можно сказать что выполнение функции "хочу включить" может закончитя тремя результатми - ок, не получилось, авария.
Дальше твоя программа должна анализировать эти три состояния и принимать решения. в случае с си тебе придется после вызова написать пачку ифов или switch/case.
А на прологе не нужно. Любой предикат может закончится нормально, дать фэйл, или вызвать исключение. А вот как это выглядит на прологе.
safe_foo():- trap(foo(),ExceptonCode,exceptionHandler(ExceptonCode)), !. safe_foo().
foo():- tryTurnOnLight(), !, % тут продолжаем если свет нормально зажегся . foo():- % заметь, это второрая голова предиката foo, в си так низя % попадаем сюда, если свет не зажегся .
exceptionHandler(err1):- !, write("error1"). exceptionHandler(err2):- !, write("error2").
Разумеется скольнить серьезное приложение что на си что на прологе на несколько строк не напишешь. ... Или например, тебе надо записать большой файл. Ты принимаешь решение записать его блоками по 64к. В момент открытия и записи очередного блока может произойти ошибка, твоя задча вывалить диалог с ошибкой и спросиить retry/cancel. Hа прологе это реализуется очень кратко и красиво. ...
Hапример есть у тебя несколько каналов дозировки, работающих на разные линии, паралельно. причем один канал может последовательно обслуживать несколько линий. Загрузки линии могут менятся, темпы подачи могут менятся плюс всякие разные запрещения, типа кончился компонент, или чтото забилось. а тебе упрвалять всей этой хренью. Собсно верхний уровень такого управления заметно легче реализовывать на прологе. ... пойду я спать уже
WBR, Michael.