Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Архив
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Средство для программирования контроллера: Си или МЭК 61131?

 Ответить Ответить Страница  <1 2021222324 53>
Автор
Сообщение
Дмитрий Теркель Смотреть выпадающим
Новичок
Новичок


Присоединился: 26 Сентябрь 2003
Категория: Russian Federation
Online Status: Offline
Публикации: 22
Свойства публикации Свойства публикации   Ответить, цитируя автора - Дмитрий Теркель Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Средство для программирования контроллера: Си или МЭК 61131?
    Опубликовано: 06 Октябрь 2003 12:25
Первоначально опубликовано Доктор Q

<SPAN class=bold>Дмитрий Теркель </span>То есть тот факт, что некоторый язык позволяет просто задавать функции с помощью комбинирования других функций в композиции, еще недостаточен для того, чтобы назвать язык "функциональным". Необходима по крайней мере возможность манипуляции одних функций над другими. Иначе пришлось бы зачислить в "функциональные" почти все языки


Я готов согласиться. Однако признайтесь, что сам факт существования языка Joy заставляет подправить расхожие представления о том, что является, а что не является функциональным языком. Хотя бы потому что Joy не использует лямбда-калькулус.


Если Вы обратили внимание, несмотря на упомянутую Вами "маргинальность", Joy имеет весьма солидного "союзника" в лице Бэкуса с его FP-системами.


Переводя разговор в более практическое русло, что, на Ваш взгляд, необходимо было бы добавить в FBD, чтобы сделать его действительно функциональным языком?



     Я, пожалуй соглашусь, что формальное требование "основываться на лямбда исчислении" может иногда не выполняться. В конце концов, всегда можно придумать какой-нибудь другой по форме способ "сделать то же самое". Но важно то, что во всех этих случаях оправданием "функциональности" языка является то, что по своим ВЫРАЗИТЕЛЬНЫМ ВОЗМОЖНОСТЯМ он не сильно уступает языкам, на нем основанным. Основанные на лямбда-исчисленнии языки задали некую планку, ее, конечно, можно достичь каким-либо другим способом, но ее надо достичь. И способности комбинировать функции в композиции здесь недостаточно (что подтверждает и 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
Свойства публикации Свойства публикации   Ответить, цитируя автора - Дмитрий Теркель Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Октябрь 2003 13:09
Первоначально опубликовано Максим Ананских

Моя личная точка зрения заключается в том, что полиморфизм, по крайней мере, в его сишной реализации, это возможность создать два метода с одинаковыми названиями для реализации действий над разными типами данных. В небольших программах в этом нет необходимости (и так все ясно), а в больших, вкупе с неявными преобразованиями типов и наследованием, приводит лишь к дополнительной путанице.


Возможность же наследования, позиционируемая как способ повторного использования кода, на самом деле позволяет похоронить детали реализации тех или иных классов вместе с воспоминаниями о том, для чего они были нужны :)


Вообще, я не сторонник ООП в сишном его понимании, и всегда предпочитаю писать <FONT face="Courier New, Courier, mono" size=2>my_method (&my_object) вместо <FONT face="Courier New, Courier, mono" size=2>my_object.my_method() :-) Даже несмотря на то, что в данном случае "чистый" C не позволяет контролировать правильность передаваемого указателя (в этом смысле Паскаль - более "безопасный" язык). Прошу понять меня правильно, я не считаю, что ООП бесполезно как таковое. Просто оно, на мой взгляд, не является нужным при решении задач управления технологическими процессами. Его область применения тоже достаточно специфична: базы данных, графические интерфейсы...


ООП помогает там, где возникает много объектов, в чем-разных, а в чем-то похожих. Эта слишком общая ситуация, чтобы быть связанной с какой-то конкретной предметной областью. Скорее, это характеристика определенного "типа сложности" системы. Такие системы встречатся _в_любой_предметной_области_ . Спросите Майка :))).
Первоначально опубликовано Максим Ананских


Если исходить из того, что графически выраженный "агрегат" представляет собой вектор X=(x1,x2,...xn), то для того, чтобы получить из него другой вектор Y, представляющий собой некоторую комбинацию элементов исходного вектора, то мы должны выполнить преобразование, например, y1=x2, y2 = x1 и т.п. Таким образом, чтобы получить из одного "агрегата" другой, мы должны создать некоторую подпрограмму (функцию или функциональный блок), реализующую это преобразование. Либо делать это преобразование в том блоке, которому этот "агрегат" предназначается. Разве есть другие возможности?



И я про то же. Нет других возможностей при использовании агрегатов. А те, что есть, заставляют руками писать программы преобразования, как Вы справедливо заметили. Которые ничего не делают, но писать их надо. Собственно, этого и хочется избежать.

Первоначально опубликовано Максим Ананских



Первоначально опубликовано Дмитрий Теркель


Кроме того, хотелось бы, чтобы "обобщенная связь" представляла собой не обязательно однонаправленный поток, а описывала взаимодействие между программами в обе стороны.


Если я правильно понял, это что-то наподобие механизма "дружественных классов" в C++. Да, такой механизм мог бы добавить описательности языку, но способен также сильно запутать программу, приводя к трудноуловимым ошибкам. Представьте себе, если три функциональных блока связаны между собой такими двунаправленными связями, как будет определяться порядок вычислений?




Увы, порядок будет определяться точно также, как в ФБД, поскольку обобщенная связь распадается на обычные. И проблемы будут те же - не больше и не меньше, чем в обычном ФБД. Потому что в ФБД это сделано _очень_плохо_.
Представьте себе диаграмму из двух блоков, у каждого один вход и один выход. Оба блока расположены на диаграмме строго один под другим. Выход одного замкнут на вход другого и наоборот (этакая восьмерка).
Стандарт ВООБЩЕ НЕ ОПРЕДЕЛЯЕТ, в каком порядке блоки будут выполняться, а значит, не определяет, какая из двух связей прямая, а какая обратная. Теперь сдвигаем нижний блок на миллиметр влево. Он будет выполнен первым. А на миллиметр вправо - наоборот. Здорово! Семантика языка зависит от точности движения рисовальщика! (только по "grid" не стоит говорить, мы же стандарт обсуждаем :)
Если подойти к вопросу непредвзято, то станет очевидно:
прямые и обратные связи должны задаваться пользователем ЯВНО (цветом или еще как), и тогда порядок вычислений (точнее ограничения на этот порядок) не будут зависеть от расположения блоков на листе бумаги и от миллиметровых сдвигов в том числе. Разработчик мыслит в терминах прямых и обратных связей - так надо и предоставить ему возможность выразить это ЯВНО. Далее, можно ввести третий вид связей - "неважно каких", то есть когда неважно, прямая она или обратная. ПО таким связям диаграмма может быть разрезана на части и распределена по разным задачам и даже узлам. Таким образом, небольшое добавление выразительных возможностей приведет к способности представлять и распределенные алгоритмы. А с принципом "слева направо" действительно далеко не уедешь...
С уважением,
Дмитрий Теркель
Наверх
Доктор Q Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Сентябрь 2003
Категория: Isle Of Man
Online Status: Offline
Публикации: 119
Свойства публикации Свойства публикации   Ответить, цитируя автора - Доктор Q Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Октябрь 2003 13:20

Дмитрий Теркель Давайте назовем FBD функционально-ориентированным (кажется, термин function-oriented не занят :)

Мне кажется, Вы нашли удачный термин. По крайней мере, меня он вполне устраивает.

А что касается сделать его "по-настоящему функциональным" не знаю, мне не приходило в голову пока какие-либо практические полезные последствия этого..

Весьма заманчиво было бы иметь ленивые вычисления и рекурсию. Для начала - хотя бы ленивые вычисления

Пожалуй актуальнее болеее близкая задача: избавить его от некоторых детских болезней.
Например
1) НАйти приемлемый ("структурный" )способ описания альтернативных вариантов выполнения программы, то есть что взамен if -then -else процедурных языков? (EN-ENO и тем более jump не предлагать)

Сейчас это делает SFC.   Я понимаю, что кому-то так будет удобнее работать. Тем не менее, (пока?) я был бы более склонен оставить "как есть", т.к. мне трудно оценить, насколько велик будет выигрыш.

2) Научиться описывать массовые и повторяющиеся вычисления.
3) ПРо ОО и агрегацию связей я уже говорил.
4) Заменить основанное на двумерной картинке правило определения порядка вычислений более приемлемым, основанном ТОЛЬКО НА ТОПОЛОГИИ диаграммы, без этих "левее-правее-выше-ниже" (к этому я еще вернусь)

Полностью согласен. Если последнее будет реализовано - наверняка поможет снизить количество ошибок при написании программ на FBD и LD, а также упростить и ускорить редактирование. 

Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Октябрь 2003 14:06

Первоначально опубликовано Дмитрий Теркель


И я про то же. Нет других возможностей при использовании агрегатов. А те, что есть, заставляют руками писать программы преобразования, как Вы справедливо заметили. Которые ничего не делают, но писать их надо. Собственно, этого и хочется избежать.

У Вас есть какие-то предложения по этому поводу?

Первоначально опубликовано Дмитрий Теркель


Представьте себе диаграмму из двух блоков, у каждого один вход и один выход. Оба блока расположены на диаграмме строго один под другим. Выход одного замкнут на вход другого и наоборот (этакая восьмерка).
Стандарт ВООБЩЕ НЕ ОПРЕДЕЛЯЕТ, в каком порядке блоки будут выполняться, а значит, не определяет, какая из двух связей прямая, а какая обратная. Теперь сдвигаем нижний блок на миллиметр влево. Он будет выполнен первым. А на миллиметр вправо - наоборот. Здорово! Семантика языка зависит от точности движения рисовальщика! (только по "grid" не стоит говорить, мы же стандарт обсуждаем :)

Ну, начнем с того, что большинство пакетов программирования просто не дадут так разместить блоки. Далее, читаем текст стандарта:

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
Свойства публикации Свойства публикации   Ответить, цитируя автора - Владимир Е. Зюбин Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Октябрь 2003 16:18
Какой еще work-in-progress? :-) В области трансляторов
ничего принципиально нового нет и не было с момента их создания... лексический, синтаксический, семантический анализ и кодогенерация. :-)

Первоначально опубликовано Доктор Q

Место, где отражено современное состояние науки и техники. Определения не всегда идеальны, т.к. это work-in-progress. Однако совсем устаревшие определения там не держатся, научно-техническое сообщество их вычищает.


<A class=internal title=Wikipedia href="http://www.wikipedia.org/wiki/Wikipedia">Wikipedia</A> is a <A class=internal title="Wikipedia:Multilingual coordination" href="http://www.wikipedia.org/wiki/Wikipedia:Multilingual_coordination">multilingual</A> project to create a complete and accurate <A class=internal title=Wikipedia:Copyrights href="http://www.wikipedia.org/wiki/Wikipedia:Copyrights">free content</A> encyclopedia


A compiler is a <A class=internal title="Computer program" href="http://www.wikipedia.org/wiki/Computer_program">computer program</A> that translates a computer program written in one <A class=internal title="Computer language" href="http://www.wikipedia.org/wiki/Computer_language">computer language</A> (called the source language) into a program written in another computer language (called the output or the target language).


An interpreter is a <A class=internal title="Computer program" href="http://www.wikipedia.org/wiki/Computer_program">computer program</A> that <A class=internal title=Execution href="http://www.wikipedia.org/wiki/Execution">executes</A> other programs. [...] There is thus a spectrum of possibilities between interpreting and compiling, depending on the amount of analysis performed before the program is executed.

Владимир Е. Зюбин
Язык Рефлекс -- Си-подобный язык программирования ПЛК
http://reflex-language.narod.ru/
Наверх
Владимир Е. Зюбин Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 09 Сентябрь 2003
Категория: Russian Federation
Online Status: Offline
Публикации: 247
Свойства публикации Свойства публикации   Ответить, цитируя автора - Владимир Е. Зюбин Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Октябрь 2003 16:33
В рамках лик.беза про интерпретаторы, еще одна статейка нашлась из Кирилла-Мефодия...


                                    Интерпретаторы



                                    Интерпретаторы — это трансляторы языков программирования,
                                    которые работают на отличающемся от компиляторов принципе.
                                    Интерпретаторы не производят исполняемого машинного кода.
                                    Они берут исходный текст программы на каком-либо языке
                                    программирования и выполняют его сами строка за строкой. При
                                    этом процесс выглядит так: интерпретатор извлекает из файла с
                                    исходным текстом одну команду, распознает ее и вызывает те или
                                    иные функции операционной системы. Интерпретатор, как
                                    переводчик с иностранного языка, определяет команду и
                                    переводит (интерпретирует) ее так, чтобы операционная система
                                    поняла, что от нее хотят. Само собой, скорость выполнения
                                    программ в режиме интерпретации намного ниже, чем у
                                    компилированного кода, за счет того, что работа программы идет
                                    не напрямую с центральным процессором на языке машинных
                                    команд, а через программу-посредника, которая и тратит большое
                                    количество времени на распознавание исходного текста. В
                                    отличие от интерпретаторов, компиляторы «знакомятся» с
                                    исходными текстами программы всего один раз, когда делают из
                                    текста на языке программирования машинный код. Как хороший
                                    пример классического интерпретатора можно рассматривать
                                    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/
Наверх
Доктор Q Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Сентябрь 2003
Категория: Isle Of Man
Online Status: Offline
Публикации: 119
Свойства публикации Свойства публикации   Ответить, цитируя автора - Доктор Q Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Октябрь 2003 16:42

Владимир Е. Зюбин Какой еще work-in-progress?

Вероятно, мосье не знает что такое wiki?

Чем задавать такие вопросы, ответьте лучше вот на какой. Почему Вы решили создать свой самодельный язык СПАРМ, вместо того, чтобы написать соответствующую либу на С/С++?  Почему это нельзя было сделать как в рамках С/С++? Какие свойства C/C++ явились для Вас ограничивающим фактором?

Наверх
Доктор Q Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Сентябрь 2003
Категория: Isle Of Man
Online Status: Offline
Публикации: 119
Свойства публикации Свойства публикации   Ответить, цитируя автора - Доктор Q Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Октябрь 2003 17:31

 Владимир Е. Зюбин еще одна статейка нашлась из Кирилла-Мефодия...

Чем тащить сюда всякий хлам, вот Вам конкретный пример. Интерпретатор Форта по имени SPF4, со всеми исходниками лежит на http://sourceforge.net/projects/spf/

Лезем в эти исходники и смотрим - как  выполняется интерпретация подпрограммного шитого кода (или, если угодно - байт-кода). Обнаруживаем, что этот шитый код состоит из последовательности вызовов подпрограмм. Оные подпрограммы заранее скомпилированы и лежат в памяти. В сумме все эти подпрограммы и есть SPF4, они организованы определенным образом, и пр, но это к делу не относится, ликбез по Форту Вы можете получить в другом месте, например, здесь http://www.forth.org.ru/

Лезем в эти подпрограммы (исходники) и пытаемся найти в них хоть какой-то намек на "трансляцию перед исполнением". Что мы видим?

Опреатор DUP (или, в терминах Форта - "слово" DUP)

CODE DUP ( x -- x x ) \ 94
\ Продублировать x.
     LEA EBP, -4 [EBP]
     MOV [EBP], EAX
     RET
END-CODE

Тело этого слова состоит из 3-х ассемблерных команд. При интерпретации оператора DUP всего будет исполнено 4 команды:

     call DUP   \ это "байт-код", т.е. вызов нужного слова
     LEA EBP, -4 [EBP] \ а это - работает интерпретатор
     MOV [EBP], EAX
     RET                     
\  интерпретатор закончил работу с этим словом,     
                                 \переходим к следующему "байт-коду"

Вы будете продолжать утверждать, что эти 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
\ flag "истина" тогда и только тогда, когда n1 больше n2.
       CMP  EAX, [EBP]
       SETGE AL
       AND  EAX,  # 1
       DEC  EAX
       LEA  EBP, 4 [EBP]
       RET
END-CODE

Оператор умножения

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
\ x3 - побитовое "И" x1 и x2.
     AND EAX, [EBP]
     LEA EBP, 4 [EBP]
     RET
END-CODE

CODE OR ( x1 x2 -- x3 ) \ 94
\ x3 - побитовое "ИЛИ" x1 и x2.
     OR EAX, [EBP]
     LEA EBP, 4 [EBP]
     RET
END-CODE

Достаточно примеров? До Вас еще не дошло, что этот интерпретатор ничего не транслирует, а только исполняет? Если не дошло - Вы безнадежны. Если дошло - то не загрязняйте тред всяким мусором, выкопанным на помойке.

Кроме того, если  у Вас в голове есть хоть капля здравого смысла, и Вы хоть раз заглядывали в асм код,  сгенерированный Вашим любимым транслятором С (на выбор), Вы должны догадаться, что интерпретатор SPF будет работать не намного медленнее или даже быстрее, чем то, что нагенерил этот Ваш С-транслятор. Поскольку у SPF него нет накладных расходов на манипуляции с фреймами.

Есть и другие примеры быстрых интерпретаторов. Мне нет нужды приводить их все, потому что для опровержения всего бреда, который Вы нагородили в своей статье и продолжаете нести здесь - мне достаточно привести один-единственный пример. Пример БЫСТРОГО интерпретатора, который НИЧЕГО НЕ ТРАНСЛИРУЕТ, а только и исключительно ИСПОЛНЯЕТ. Что я и сделал.

Наверх
Владимир Е. Зюбин Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 09 Сентябрь 2003
Категория: Russian Federation
Online Status: Offline
Публикации: 247
Свойства публикации Свойства публикации   Ответить, цитируя автора - Владимир Е. Зюбин Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Октябрь 2003 18:00
Если кратко - то транслятор пришлось писать из-за семантики и прагматики.

Некоторые, действительно, макросы пишут, например,
в "Авроре" Шалыто и Ко... или Любченко, вот, тоже
секретные dll-ки создает... но это такая рутина, такая
ненадега... хотя подход в общем верный...

а насчет Wiki, я там даже определения транслятора не
нашел... хотя любые терминологические словари читать
полезно... даже не очень качественные...

Первоначально опубликовано Доктор Q

<SPAN class=bold>Владимир Е. Зюбин </SPAN>Какой еще work-in-progress?


Вероятно, мосье не знает что такое wiki?



Чем задавать такие вопросы, ответьте лучше вот на какой. Почему Вы решили создать свой самодельный язык СПАРМ, вместо того, чтобы написать соответствующую либу на С/С++?  Почему это нельзя было сделать как в рамках С/С++? Какие свойства C/C++ явились для Вас ограничивающим фактором?

Владимир Е. Зюбин
Язык Рефлекс -- Си-подобный язык программирования ПЛК
http://reflex-language.narod.ru/
Наверх
Владимир Е. Зюбин Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 09 Сентябрь 2003
Категория: Russian Federation
Online Status: Offline
Публикации: 247
Свойства публикации Свойства публикации   Ответить, цитируя автора - Владимир Е. Зюбин Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Октябрь 2003 18:25
Зачем Вы неплохую статью из толкового словаря хламом
называете? Кратко и достаточно точно. Это гораздо лучше,
чем в исходниках Форта ковыряться. Было б еще зачем.

Вы, может, не понимаете, что

LEA EBP, -4 [EBP]
MOV [EBP], EAX

это операции со стеком? А как Вы думаете,
кто в стек кладет числа? А кто считывает байты из
исходного файла? а кто разбирается, что со считаным
байтом дельше делать? А кто вызывает приведенные
процедуры? А кто определяет, корректен ли
считаный байт вообще? :-) Во-во... это и называется
трансляция... :-) Ищите трансляцию не в подпрограммах
с машинным кодом операций, а там, где работа с исходным
файлом идет.

Удачи.

Первоначально опубликовано Доктор Q

 <SPAN class=bold>Владимир Е. Зюбин </SPAN>еще одна статейка нашлась из Кирилла-Мефодия...


Чем тащить сюда всякий хлам, вот Вам конкретный пример. Интерпретатор Форта по имени SPF4, со всеми исходниками лежит на http://sourceforge.net/projects/spf/


Лезем в эти исходники и смотрим - как  выполняется интерпретация подпрограммного шитого кода (или, если угодно - байт-кода). Обнаруживаем, что этот шитый код состоит из последовательности вызовов подпрограмм. Оные подпрограммы заранее скомпилированы и лежат в памяти. В сумме все эти подпрограммы и есть SPF4, они организованы определенным образом, и пр, но это к делу не относится, ликбез по Форту Вы можете получить в другом месте, например, здесь http://www.forth.org.ru/


Лезем в эти подпрограммы (исходники) и пытаемся найти в них хоть какой-то намек на "трансляцию перед исполнением". Что мы видим?


Опреатор DUP (или, в терминах Форта - "слово" DUP)


CODE DUP ( x -- x x ) \ 94
\ Продублировать x.
     LEA EBP, -4 [EBP]
     MOV [EBP], EAX
     RET
END-CODE


Тело этого слова состоит из 3-х ассемблерных команд. При интерпретации оператора DUP всего будет исполнено 4 команды:


     call DUP   \ это "байт-код", т.е. вызов нужного слова
     LEA EBP, -4 [EBP] \ а это - работает интерпретатор
     MOV [EBP], EAX
     RET                     
\  интерпретатор закончил работу с этим словом,      
                                 \переходим к следующему "байт-коду"


Вы будете продолжать утверждать, что эти 4 команды сначала что-то транслируют, а потом исполняют? Если так, Вы будете нести откровенный бред. Они только исполняют, но ничего не транслируют.


Предположим, Вы скажете "я не знаю Форта, я не знаю что это за слово DUP". Посмотрим что из себя представляют тела других, более понятных слов интерпретатора


<FONT color=#000000>Примеры операторов сравнения


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
\ flag "истина" тогда и только тогда, когда n1 больше n2.
       CMP  EAX, [EBP]
       SETGE AL
       AND  EAX,  # 1
       DEC  EAX
       LEA  EBP, 4 [EBP]
       RET
END-CODE


<FONT color=#000000>Оператор умножения


CODE * ( n1|u1 n2|u2 -- n3|u3 ) \ 94
\ Перемножить n1|u1 и n2|u2 и получить произведение n3|u3.
     IMUL DWORD [EBP]
     LEA EBP, 4 [EBP]
     RET
END-CODE


<FONT color=#000000>Логические операторы


CODE AND ( x1 x2 -- x3 ) \ 94
\ x3 - побитовое "И" x1 и x2.
     AND EAX, [EBP]
     LEA EBP, 4 [EBP]
     RET
END-CODE


CODE OR ( x1 x2 -- x3 ) \ 94
\ x3 - побитовое "ИЛИ" x1 и x2.
     OR EAX, [EBP]
     LEA EBP, 4 [EBP]
     RET
END-CODE


Достаточно примеров? До Вас еще не дошло, что этот интерпретатор ничего не транслирует, а только исполняет? Если не дошло - Вы безнадежны. Если дошло - то не загрязняйте тред всяким мусором, выкопанным на помойке.


<FONT color=#000000>Кроме того, если  у Вас в голове есть хоть капля здравого смысла, и Вы хоть раз заглядывали в асм код,  сгенерированный Вашим любимым транслятором С (на выбор), Вы должны догадаться, что интерпретатор SPF будет работать не намного медленнее или даже быстрее, чем то, что нагенерил этот Ваш С-транслятор. Поскольку у SPF него нет накладных расходов на манипуляции с фреймами.


<FONT color=#000000>Есть и другие примеры быстрых интерпретаторов. Мне нет нужды приводить их все, потому что для опровержения всего бреда, который Вы нагородили в своей статье и продолжаете нести здесь - мне достаточно привести один-единственный пример. Пример БЫСТРОГО интерпретатора, который НИЧЕГО НЕ ТРАНСЛИРУЕТ, а только и исключительно ИСПОЛНЯЕТ. Что я и сделал.

Владимир Е. Зюбин
Язык Рефлекс -- Си-подобный язык программирования ПЛК
http://reflex-language.narod.ru/
Наверх
 Ответить Ответить Страница  <1 2021222324 53>

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz