Средство для программирования контроллера: Си или МЭК 61131? |
Ответить | Страница <1 2021222324 53> |
Автор | ||||
Новичок Присоединился: 26 Сентябрь 2003 Категория: Russian Federation Online Status: Offline Публикации: 22 |
Опубликовано: 06 Октябрь 2003 12:25 |
|||
Я, пожалуй соглашусь, что формальное требование "основываться на лямбда исчислении" может иногда не выполняться. В конце концов, всегда можно придумать какой-нибудь другой по форме способ "сделать то же самое". Но важно то, что во всех этих случаях оправданием "функциональности" языка является то, что по своим ВЫРАЗИТЕЛЬНЫМ ВОЗМОЖНОСТЯМ он не сильно уступает языкам, на нем основанным. Основанные на лямбда-исчисленнии языки задали некую планку, ее, конечно, можно достичь каким-либо другим способом, но ее надо достичь. И способности комбинировать функции в композиции здесь недостаточно (что подтверждает и Joy в том числе со своей рефлексией). РАз уж хочется применить слово "функциональный" к FBD (а мне совершенно понятно интуитивное желание это сделать, как понятна и невозможность реализовать это желание в приличном обществе :), можно поступить так же, как с термином "объектно-ориентированный". В свое время языкам типа Visual Basic (старый), JavaScript т.п. очень хотелось стать объектно-ориентированными - ведь объекты то есть! Обидно! Но оказалось, что для вступление в "благородное сообщество" ОО-языков, нужно иметь еще что-то, кроме объектов, а именно - полиморфизм и наследование. Ситуация совершенно аналогичная. И тогда для таких языков придумали термин Object-based (в отличие от Object-oriented). Давайте назовем FBD функционально-ориентированным (кажется, термин function-oriented не занят :) А что касается сделать его "по-настоящему функциональным" не знаю, мне не приходило в голову пока какие-либо практические полезные последствия этого.. Пожалуй актуальнее болеее близкая задача: избавить его от некоторых детских болезней. Например 1) НАйти приемлемый ("структурный" )способ описания альтернативных вариантов выполнения программы, то есть что взамен if -then -else процедурных языков? (EN-ENO и тем более jump не предлагать) 2) Научиться описывать массовые и повторяющиеся вычисления. 3) ПРо ОО и агрегацию связей я уже говорил. 4) Заменить основанное на двумерной картинке правило определения порядка вычислений более приемлемым, основанном ТОЛЬКО НА ТОПОЛОГИИ диаграммы, без этих "левее-правее-выше-ниже" (к этому я еще вернусь) Почему я не согласен пользоваться в этом случае процедурнами языками типа ST? ПОтому что они практически не масштабируются на многопоточный и, тем более, распределенный случай. Модели вычислений, управляемые потоками данных в этом отношении перспективнее. |
||||
С уважением,
Дмитрий Теркель |
||||
Новичок Присоединился: 26 Сентябрь 2003 Категория: Russian Federation Online Status: Offline Публикации: 22 |
||||
ООП помогает там, где возникает много объектов, в чем-разных, а в чем-то похожих. Эта слишком общая ситуация, чтобы быть связанной с какой-то конкретной предметной областью. Скорее, это характеристика определенного "типа сложности" системы. Такие системы встречатся _в_любой_предметной_области_ . Спросите Майка :))).
И я про то же. Нет других возможностей при использовании агрегатов. А те, что есть, заставляют руками писать программы преобразования, как Вы справедливо заметили. Которые ничего не делают, но писать их надо. Собственно, этого и хочется избежать.
Увы, порядок будет определяться точно также, как в ФБД, поскольку обобщенная связь распадается на обычные. И проблемы будут те же - не больше и не меньше, чем в обычном ФБД. Потому что в ФБД это сделано _очень_плохо_. Представьте себе диаграмму из двух блоков, у каждого один вход и один выход. Оба блока расположены на диаграмме строго один под другим. Выход одного замкнут на вход другого и наоборот (этакая восьмерка). Стандарт ВООБЩЕ НЕ ОПРЕДЕЛЯЕТ, в каком порядке блоки будут выполняться, а значит, не определяет, какая из двух связей прямая, а какая обратная. Теперь сдвигаем нижний блок на миллиметр влево. Он будет выполнен первым. А на миллиметр вправо - наоборот. Здорово! Семантика языка зависит от точности движения рисовальщика! (только по "grid" не стоит говорить, мы же стандарт обсуждаем :) Если подойти к вопросу непредвзято, то станет очевидно: прямые и обратные связи должны задаваться пользователем ЯВНО (цветом или еще как), и тогда порядок вычислений (точнее ограничения на этот порядок) не будут зависеть от расположения блоков на листе бумаги и от миллиметровых сдвигов в том числе. Разработчик мыслит в терминах прямых и обратных связей - так надо и предоставить ему возможность выразить это ЯВНО. Далее, можно ввести третий вид связей - "неважно каких", то есть когда неважно, прямая она или обратная. ПО таким связям диаграмма может быть разрезана на части и распределена по разным задачам и даже узлам. Таким образом, небольшое добавление выразительных возможностей приведет к способности представлять и распределенные алгоритмы. А с принципом "слева направо" действительно далеко не уедешь... |
||||
С уважением,
Дмитрий Теркель |
||||
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 29 Сентябрь 2003 Категория: Isle Of Man Online Status: Offline Публикации: 119 |
||||
Дмитрий Теркель Давайте назовем FBD функционально-ориентированным (кажется, термин function-oriented не занят :) Мне кажется, Вы нашли удачный термин. По крайней мере, меня он вполне устраивает. А что касается сделать его "по-настоящему функциональным" не знаю, мне не приходило в голову пока какие-либо практические полезные последствия этого.. Весьма заманчиво было бы иметь ленивые вычисления и рекурсию. Для начала - хотя бы ленивые вычисления Пожалуй актуальнее болеее близкая задача: избавить его от некоторых детских болезней. Сейчас это делает SFC. Я понимаю, что кому-то так будет удобнее работать. Тем не менее, (пока?) я был бы более склонен оставить "как есть", т.к. мне трудно оценить, насколько велик будет выигрыш. 2) Научиться описывать массовые и повторяющиеся вычисления. |
||||
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 14 Май 2003 Online Status: Offline Публикации: 770 |
||||
У Вас есть какие-то предложения по этому поводу?
Ну, начнем с того, что большинство пакетов программирования просто не дадут так разместить блоки. Далее, читаем текст стандарта: It shall be possible for the user to define the order of execution of the elements in an explicit loop, for instance by selection of feedback variables to form an implicit loop as shown in figure 23b). То есть, как раз в стандарте-то написано, что этот порядок должен определяться пользователем. Хотя бы с помощью создания вспомогательной переменной. То же, о чем Вы говорите - это недостаток реализации этого механизма в рамках конкретной реализации, и не более того.
Принцип "слева направо" - это тоже не более чем фантазия. В стандарте говорится следующее: No element of a network shall be evaluated until the states of all of its inputs have been evaluated. А вот выходы-то находятся справа, а входы слева. Но все-таки, поясните, пожалуйста, мысль о "неважно-каких" связях. Быть может, это действительно интересное решение, до которого пока еще никто не додумался? Мне, действительно, очень интересно... |
||||
Инженер-системотехник
+7 (916) 477 3925 |
||||
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 09 Сентябрь 2003 Категория: Russian Federation Online Status: Offline Публикации: 247 |
||||
Какой еще work-in-progress? :-) В области трансляторов
ничего принципиально нового нет и не было с момента их создания... лексический, синтаксический, семантический анализ и кодогенерация. :-)
|
||||
Владимир Е. Зюбин
Язык Рефлекс -- Си-подобный язык программирования ПЛК http://reflex-language.narod.ru/ |
||||
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 09 Сентябрь 2003 Категория: Russian Federation Online Status: Offline Публикации: 247 |
||||
В рамках лик.беза про интерпретаторы, еще одна статейка нашлась из Кирилла-Мефодия...
Интерпретаторы Интерпретаторы — это трансляторы языков программирования, которые работают на отличающемся от компиляторов принципе. Интерпретаторы не производят исполняемого машинного кода. Они берут исходный текст программы на каком-либо языке программирования и выполняют его сами строка за строкой. При этом процесс выглядит так: интерпретатор извлекает из файла с исходным текстом одну команду, распознает ее и вызывает те или иные функции операционной системы. Интерпретатор, как переводчик с иностранного языка, определяет команду и переводит (интерпретирует) ее так, чтобы операционная система поняла, что от нее хотят. Само собой, скорость выполнения программ в режиме интерпретации намного ниже, чем у компилированного кода, за счет того, что работа программы идет не напрямую с центральным процессором на языке машинных команд, а через программу-посредника, которая и тратит большое количество времени на распознавание исходного текста. В отличие от интерпретаторов, компиляторы «знакомятся» с исходными текстами программы всего один раз, когда делают из текста на языке программирования машинный код. Как хороший пример классического интерпретатора можно рассматривать QBasic, входящий в состав DOS. ">http://mega.km.ru/pc/encyclop.asp?TopicNumber=385&search=%F2%F0%E0%ED%F1%EB%FF%F2%EE%F0#srch0 Удачи! |
||||
Владимир Е. Зюбин
Язык Рефлекс -- Си-подобный язык программирования ПЛК http://reflex-language.narod.ru/ |
||||
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 29 Сентябрь 2003 Категория: Isle Of Man Online Status: Offline Публикации: 119 |
||||
Владимир Е. Зюбин Какой еще work-in-progress? Вероятно, мосье не знает что такое wiki? Чем задавать такие вопросы, ответьте лучше вот на какой. Почему Вы решили создать свой самодельный язык СПАРМ, вместо того, чтобы написать соответствующую либу на С/С++? Почему это нельзя было сделать как в рамках С/С++? Какие свойства C/C++ явились для Вас ограничивающим фактором? |
||||
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 29 Сентябрь 2003 Категория: Isle Of Man Online Status: Offline Публикации: 119 |
||||
Владимир Е. Зюбин еще одна статейка нашлась из Кирилла-Мефодия... Чем тащить сюда всякий хлам, вот Вам конкретный пример. Интерпретатор Форта по имени SPF4, со всеми исходниками лежит на http://sourceforge.net/projects/spf/ Лезем в эти исходники и смотрим - как выполняется интерпретация подпрограммного шитого кода (или, если угодно - байт-кода). Обнаруживаем, что этот шитый код состоит из последовательности вызовов подпрограмм. Оные подпрограммы заранее скомпилированы и лежат в памяти. В сумме все эти подпрограммы и есть SPF4, они организованы определенным образом, и пр, но это к делу не относится, ликбез по Форту Вы можете получить в другом месте, например, здесь http://www.forth.org.ru/ Лезем в эти подпрограммы (исходники) и пытаемся найти в них хоть какой-то намек на "трансляцию перед исполнением". Что мы видим? Опреатор DUP (или, в терминах Форта - "слово" DUP) CODE DUP ( x -- x x ) \ 94 Тело этого слова состоит из 3-х ассемблерных команд. При интерпретации оператора DUP всего будет исполнено 4 команды: call DUP \ это "байт-код", т.е. вызов нужного слова Вы будете продолжать утверждать, что эти 4 команды сначала что-то транслируют, а потом исполняют? Если так, Вы будете нести откровенный бред. Они только исполняют, но ничего не транслируют. Предположим, Вы скажете "я не знаю Форта, я не знаю что это за слово DUP". Посмотрим что из себя представляют тела других, более понятных слов интерпретатора Примеры операторов сравнения CODE < ( n1 n2 -- flag ) \ 94\ flag "истина" тогда и только тогда, когда n1 меньше n2. CMP EAX, [EBP] SETLE AL AND EAX, # 1 DEC EAX LEA EBP, 4 [EBP] RET END-CODE CODE > ( n1 n2 -- flag ) \ 94 Оператор умножения CODE * ( n1|u1 n2|u2 -- n3|u3 ) \ 94\ Перемножить n1|u1 и n2|u2 и получить произведение n3|u3. IMUL DWORD [EBP] LEA EBP, 4 [EBP] RET END-CODE Логические операторы CODE AND ( x1 x2 -- x3 ) \ 94 CODE OR ( x1 x2 -- x3 ) \ 94 Достаточно примеров? До Вас еще не дошло, что этот интерпретатор ничего не транслирует, а только исполняет? Если не дошло - Вы безнадежны. Если дошло - то не загрязняйте тред всяким мусором, выкопанным на помойке. Кроме того, если у Вас в голове есть хоть капля здравого смысла, и Вы хоть раз заглядывали в асм код, сгенерированный Вашим любимым транслятором С (на выбор), Вы должны догадаться, что интерпретатор SPF будет работать не намного медленнее или даже быстрее, чем то, что нагенерил этот Ваш С-транслятор. Поскольку у SPF него нет накладных расходов на манипуляции с фреймами. Есть и другие примеры быстрых интерпретаторов. Мне нет нужды приводить их все, потому что для опровержения всего бреда, который Вы нагородили в своей статье и продолжаете нести здесь - мне достаточно привести один-единственный пример. Пример БЫСТРОГО интерпретатора, который НИЧЕГО НЕ ТРАНСЛИРУЕТ, а только и исключительно ИСПОЛНЯЕТ. Что я и сделал. |
||||
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 09 Сентябрь 2003 Категория: Russian Federation Online Status: Offline Публикации: 247 |
||||
Если кратко - то транслятор пришлось писать из-за семантики и прагматики.
Некоторые, действительно, макросы пишут, например, в "Авроре" Шалыто и Ко... или Любченко, вот, тоже секретные dll-ки создает... но это такая рутина, такая ненадега... хотя подход в общем верный... а насчет Wiki, я там даже определения транслятора не нашел... хотя любые терминологические словари читать полезно... даже не очень качественные...
|
||||
Владимир Е. Зюбин
Язык Рефлекс -- Си-подобный язык программирования ПЛК http://reflex-language.narod.ru/ |
||||
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 09 Сентябрь 2003 Категория: Russian Federation Online Status: Offline Публикации: 247 |
||||
Зачем Вы неплохую статью из толкового словаря хламом
называете? Кратко и достаточно точно. Это гораздо лучше, чем в исходниках Форта ковыряться. Было б еще зачем. Вы, может, не понимаете, что LEA EBP, -4 [EBP] MOV [EBP], EAX это операции со стеком? А как Вы думаете, кто в стек кладет числа? А кто считывает байты из исходного файла? а кто разбирается, что со считаным байтом дельше делать? А кто вызывает приведенные процедуры? А кто определяет, корректен ли считаный байт вообще? :-) Во-во... это и называется трансляция... :-) Ищите трансляцию не в подпрограммах с машинным кодом операций, а там, где работа с исходным файлом идет. Удачи.
|
||||
Владимир Е. Зюбин
Язык Рефлекс -- Си-подобный язык программирования ПЛК http://reflex-language.narod.ru/ |
||||
Ответить | Страница <1 2021222324 53> |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |