Ocaml как средство создания транслятора переднего плана
От: chukichuki  
Дата: 25.08.05 17:18
Оценка:
Стоит задача разработки лексического, синтаксического и семантического анализаторов ( aka frontend, aka транслятор переднего плана) определенного языка c достаточно сложными языковыми конструкциями. По сложности реализации рассматриваемый язык сопоставимы с языком Си++.

Возник вопрос о выборе языка программирования на котором будет реализовано программное средство. С одной стороны критичным для данного транслятора является скорость разбора исходный текстов и требования к объему оперативной памяти (программы на этом языке достигают размеров до 15 Мб), с другой — хотелось бы отойти от традиционно применяемых в этой области Cи/Си++ в пользу чего-то более высокоуровневого и удобного, того что позволило бы упростить процесс реализации транслятора. В качестве одной из альтернатив Си/Си++ рассматривается Ocaml. Хотелось бы узнать насколько применение OCaml-а более оправдано в данной ситуации ? Насколько существеннен проигрыш в скорости программ реализованных на OCaml-е по сравнению с Си/Си++ ? Насколько повышаются требования к оперативной памяти ?

Также интересуют другие языки с декларативной составляющей, которые подойдут для данной задачи
Re: Ocaml как средство создания транслятора переднего плана
От: Quintanar Россия  
Дата: 25.08.05 18:17
Оценка:
Здравствуйте, chukichuki, Вы писали:

C>Стоит задача разработки лексического, синтаксического и семантического анализаторов ( aka frontend, aka транслятор переднего плана) определенного языка c достаточно сложными языковыми конструкциями. По сложности реализации рассматриваемый язык сопоставимы с языком Си++.


C>Возник вопрос о выборе языка программирования на котором будет реализовано программное средство. С одной стороны критичным для данного транслятора является скорость разбора исходный текстов и требования к объему оперативной памяти (программы на этом языке достигают размеров до 15 Мб), с другой — хотелось бы отойти от традиционно применяемых в этой области Cи/Си++ в пользу чего-то более высокоуровневого и удобного, того что позволило бы упростить процесс реализации транслятора. В качестве одной из альтернатив Си/Си++ рассматривается Ocaml. Хотелось бы узнать насколько применение OCaml-а более оправдано в данной ситуации ? Насколько существеннен проигрыш в скорости программ реализованных на OCaml-е по сравнению с Си/Си++ ? Насколько повышаются требования к оперативной памяти ?


C>Также интересуют другие языки с декларативной составляющей, которые подойдут для данной задачи


Я писал на SML что-то похожее для тоже достаточно сложного языка. Могу сказать, что писать, безусловно, гораздо приятнее и быстрее за счет поддержки сложных типов данных и строгой проверки типов, но про скорость работы ничего сказать не могу, поскольку SML — интерпретатор.
Здесь есть какие-то фронт-энды для С http://www.npc.de/ocaml/linkdb/frames.html Можно посмотреть и сравнить.
Re: Ocaml как средство создания транслятора переднего плана
От: Gaperton http://gaperton.livejournal.com
Дата: 25.08.05 18:20
Оценка: +1
Здравствуйте, chukichuki, Вы писали:

C>Хотелось бы узнать насколько применение OCaml-а более оправдано в данной ситуации ?

OCaml является диалектом языка ML, который изначально предназначался для данного класса задач. Применение более чем оправдано — OCaml со своим препроцессором идеально подходит для вашей задачи.

C>Насколько существеннен проигрыш в скорости программ реализованных на OCaml-е по сравнению с Си/Си++ ?

Одна из основных целей разработки компилятора OCaml являлось не уступить в скорости современным компиляторам С++ и Fortran. Компилятор хорош, и генерирует очень эффективный код.

C>Насколько повышаются требования к оперативной памяти?

Насколько мне известно — результирующая программа сравнима с аналогичной на С++ как по требуемой памяти так и по скорости выполнения. Впрочем, скоро ответят спецы по OCaml.

C>Также интересуют другие языки с декларативной составляющей, которые подойдут для данной задачи

Пожалуй, OCaml подойдет лучше всего остального по совокупности параметров.
Re: Ocaml как средство создания транслятора переднего плана
От: Трурль  
Дата: 26.08.05 12:28
Оценка: 10 (2)
Why ML/OCaml are good for writing compilers
Re: Ocaml как средство создания транслятора переднего плана
От: Quintanar Россия  
Дата: 26.08.05 16:15
Оценка: 2 (1)
Здравствуйте, chukichuki, Вы писали:

C>Также интересуют другие языки с декларативной составляющей, которые подойдут для данной задачи


К другим языкам можно отнести разве что Лисп и его диалекты. На них тоже очень удобно писать компиляторы, иногда даже удобнее, чем на ML-подобных языках. Но они динамически типизируемые и, следовательно, менее эффективны и больше подвержены ошибкам.

Кстати, если надумаете использовать OCaml старайтесь использовать разрушительные присваивания как можно меньше, особенно в узлах деревьев. Если вы будете использовать структуры (не рекомендую), они быстро попадут во второе поколение GC и присваивания будут порождать лишний код и ссылки на первое поколение, что сильно понизит эффективность GC.
Re[2]: Ocaml как средство создания транслятора переднего пла
От: chukichuki  
Дата: 27.08.05 18:31
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Кстати, если надумаете использовать OCaml старайтесь использовать разрушительные присваивания как можно меньше, особенно в узлах деревьев. Если вы будете использовать структуры (не рекомендую), они быстро попадут во второе поколение GC и присваивания будут порождать лишний код и ссылки на первое поколение, что сильно понизит эффективность GC.


Интересно. Не могли бы вы поделится источником(ами) информации по этому вопросу ?
Re[3]: Ocaml как средство создания транслятора переднего пла
От: Quintanar Россия  
Дата: 29.08.05 09:42
Оценка:
Здравствуйте, chukichuki, Вы писали:

C>Здравствуйте, Quintanar, Вы писали:


Q>>Кстати, если надумаете использовать OCaml старайтесь использовать разрушительные присваивания как можно меньше, особенно в узлах деревьев. Если вы будете использовать структуры (не рекомендую), они быстро попадут во второе поколение GC и присваивания будут порождать лишний код и ссылки на первое поколение, что сильно понизит эффективность GC.


C>Интересно. Не могли бы вы поделится источником(ами) информации по этому вопросу ?


Да, собственно, это логические выводы исходя из устройства OCaml GC + пара статей по GC. GC с поколениями вынуждены вести списки ссылок из старших поколений в младшие, а присваивание в ФЯ — это единственный способ такую ссылку создать. Ну и на практике заметно, что присваивания тормозят. Что касается узлов деревьев, то при С-шном подходе время жизни у них будет большим и они попадут во второе поколение, а их элементы при присваиваниях все время будут новыми объектами => таблица ссылок на первое поколение будет переполняться значительно быстрее, чем будет исчерпана память в первом поколении => GC будет вызываться неоправданно часто и 2-е поколение будет сильно загрязняться короткоживущими объектами.
Re[4]: Ocaml как средство создания транслятора переднего пла
От: mihoshi Россия  
Дата: 29.08.05 12:48
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Да, собственно, это логические выводы исходя из устройства OCaml GC + пара статей по GC. GC с поколениями вынуждены вести списки ссылок из старших поколений в младшие, а присваивание в ФЯ — это единственный способ такую ссылку создать.


Кстати, какой GC посоветуешь для строго функционального языка?
Re[5]: Ocaml как средство создания транслятора переднего пла
От: Quintanar Россия  
Дата: 29.08.05 15:52
Оценка: 3 (1)
Здравствуйте, mihoshi, Вы писали:

M>Кстати, какой GC посоветуешь для строго функционального языка?


Собственно, у OCaml очень неплохой GC. Состоит из двух частей — minor & major. minor для каждого треда свой и работает по алгоритму копирования (т.е. копирует все, что не мусор, в major). major — работает по алгоритму mark&sweep. В строго функциональном языке могут быть сделаны упрощения за счет того, что ссылки между объектами всегда однонаправленны, так сказать. В этом случае можно, видимо, обойтись одним поколением с копированием, но за счет известной структуры связей, копирование можно производить без привлечения дополнительного куска памяти, чем страдают такого рода алгоритмы.
Re[6]: Ocaml как средство создания транслятора переднего пла
От: Gaperton http://gaperton.livejournal.com
Дата: 29.08.05 16:12
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Здравствуйте, mihoshi, Вы писали:


M>>Кстати, какой GC посоветуешь для строго функционального языка?


Q> minor для каждого треда свой и работает по алгоритму копирования (т.е. копирует все, что не мусор, в major).

Насколько я помню, такая схема называется stop-and-copy. Подобный коллектор применяется в Erlang на уровне процесса (stop&copy, 2 поколения). Таким образом получается, что в ocaml на первом поколении работает stop-and-copy а на втором — mark&sweep. Комбиниронанная схема.

Q>major — работает по алгоритму mark&sweep. В строго функциональном языке могут быть сделаны упрощения за счет того, что ссылки между объектами всегда однонаправленны, так сказать.

Это не совсем так. В "ленивых" чисто функциональных языках возможны кольцевые ссылки на данных — это штатная ситуация.

Q>В этом случае можно, видимо, обойтись одним поколением с копированием, но за счет известной структуры связей, копирование можно производить без привлечения дополнительного куска памяти, чем страдают такого рода алгоритмы.

Может быть.
Re: Ocaml как средство создания транслятора переднего плана
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.08.05 20:46
Оценка:
Здравствуйте, chukichuki, Вы писали:

C>Также интересуют другие языки с декларативной составляющей, которые подойдут для данной задачи


Чесно говоря, я сильно сомневаюсь что любой ФЯ может что-то противопоставить хорошему коммерческому построителю парсеров, особенно использующих алгоритмы вроде GLR.

Что до сложности языка, то С++ архи-сложен для разбора в слудствии кучи неоднозначностей и зависимости от конекста. Ручной их обход задача не для слабонервных. Но почему-то мне кажется, что ты приувеличивашь сложность своего языка. Ты бы хоть привел примен выражения на этом языке и объяснил бы чем же он так сложен.
... << RSDN@Home 1.2.0 alpha rev. 606>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Ocaml как средство создания транслятора переднего пла
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.08.05 20:46
Оценка: -1
Здравствуйте, Gaperton, Вы писали:

G>Это не совсем так. В "ленивых" чисто функциональных языках возможны кольцевые ссылки на данных — это штатная ситуация.


Кольцевые ссылки для ЖЦ не проблема. Или умрут все объекты из кольца, или будут жить если на кольцо есть ссылки.
... << RSDN@Home 1.2.0 alpha rev. 606>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Ocaml как средство создания транслятора переднего пла
От: Quintanar Россия  
Дата: 30.08.05 09:25
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, chukichuki, Вы писали:


C>>Также интересуют другие языки с декларативной составляющей, которые подойдут для данной задачи


VD>Чесно говоря, я сильно сомневаюсь что любой ФЯ может что-то противопоставить хорошему коммерческому построителю парсеров, особенно использующих алгоритмы вроде GLR.


Причем тут построитель парсеров? Парсер — это вообще незначительная часть на фоне остальных в компиляторе.
Re[3]: Ocaml как средство создания транслятора переднего пла
От: mihoshi Россия  
Дата: 30.08.05 09:33
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Причем тут построитель парсеров? Парсер — это вообще незначительная часть на фоне остальных в компиляторе.


Случаи-то разные бывают... Просто парсер — единственная нетривиальная И обязательная часть компилятора.
Re[4]: Ocaml как средство создания транслятора переднего пла
От: Quintanar Россия  
Дата: 30.08.05 09:41
Оценка: +1
Здравствуйте, mihoshi, Вы писали:

M>Здравствуйте, Quintanar, Вы писали:


Q>>Причем тут построитель парсеров? Парсер — это вообще незначительная часть на фоне остальных в компиляторе.


M>Случаи-то разные бывают... Просто парсер — единственная нетривиальная И обязательная часть компилятора.


Никак не могу согласится. Парсер как раз достаточно тривиальная часть, даже с учетом исправления шероховатостей граматики. Про него все известно заранее — что делать, как делать.
Re[5]: Ocaml как средство создания транслятора переднего пла
От: mihoshi Россия  
Дата: 30.08.05 10:18
Оценка: +1
Здравствуйте, Quintanar, Вы писали:

M>>Случаи-то разные бывают... Просто парсер — единственная нетривиальная И обязательная часть компилятора.


Q>Никак не могу согласится. Парсер как раз достаточно тривиальная часть, даже с учетом исправления шероховатостей граматики. Про него все известно заранее — что делать, как делать.


Sigh.. ОК. Скажем так. Парсер — единственная обязательная часть компилятора.
Re[3]: Ocaml как средство создания транслятора переднего пла
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.08.05 11:13
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Причем тут построитель парсеров?


Да, как бы при том. Это первая встающая задача. В С++ парсер как раз самая сложная часть. И если язык действительно имеет сложность плюсов, то это просто первоочередная задача.

Q> Парсер — это вообще незначительная часть на фоне остальных в компиляторе.


Как бы то нибыло. Окамл вряд ли будет золотой пулей вне области парсинга. А в области парсинга я опять бы предпочел мощьный построитель пасреров.
... << RSDN@Home 1.2.0 alpha rev. 606>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Ocaml как средство создания транслятора переднего пла
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.08.05 11:13
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Никак не могу согласится. Парсер как раз достаточно тривиальная часть, даже с учетом исправления шероховатостей граматики. Про него все известно заранее — что делать, как делать.


Скромный вопрос. А что же на горизонте нет ни кодного С++-ного парсера удовлетворяющего стандарту?
... << RSDN@Home 1.2.0 alpha rev. 606>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Ocaml как средство создания транслятора переднего пла
От: mihoshi Россия  
Дата: 30.08.05 11:16
Оценка:
Здравствуйте, VladD2, Вы писали:

Q>> Парсер — это вообще незначительная часть на фоне остальных в компиляторе.


VD>Как бы то нибыло. Окамл вряд ли будет золотой пулей вне области парсинга. А в области парсинга я опять бы предпочел мощьный построитель пасреров.


Пример мощного построителя парсера?
Re[2]: Ocaml как средство создания транслятора переднего пла
От: chukichuki  
Дата: 30.08.05 11:41
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, chukichuki, Вы писали:

C>>Также интересуют другие языки с декларативной составляющей, которые подойдут для данной задачи


VD>Чесно говоря, я сильно сомневаюсь что любой ФЯ может что-то противопоставить хорошему коммерческому построителю парсеров, особенно использующих алгоритмы вроде GLR.


Тут надо разобраться. Любой frontend компилятора современного языка программирования есть лексический анализатор + синтаксический анализатор + семантический анализатор. Что понимается под генератором парсера ? Генератор лексического/синтаксического разборщика ? Если да, то возражение немного
не по адресу. Основную сложность при реализации транслятора языка будет составлять именно семантический анализатор, генерацию которого автоматизировать мягко говоря проблематично. Основная нагрузка здесь ляжет именно на программиста и необходимо подобрать ему более или менее нормальное средство разработки.

VD>Что до сложности языка, то С++ архи-сложен для разбора в слудствии кучи неоднозначностей и зависимости от конекста. Ручной их обход задача не для слабонервных.


Контексто-зависимость грамматики не самая большая проблема. Есть хуже. Например, шаблоны.

VD> Но почему-то мне кажется, что ты приувеличивашь сложность своего языка. Ты бы хоть привел примен выражения на этом языке и объяснил бы чем же он так сложен.


Эх. Не хотел я говорить. Сейчас заклюют. Реализую я некоторый, отличный от стандартного диалект C++ ( практически со всеми наворотами, включая шаблоны ). В приницпе "первый блин" уже сделан (на Си++), теперь пытаемся осмыслить то что получилось, выбрать более правильные технологические подходы для реализации второй версии.
Re[6]: Ocaml как средство создания транслятора переднего пла
От: Gaperton http://gaperton.livejournal.com
Дата: 30.08.05 11:42
Оценка:
Здравствуйте, mihoshi, Вы писали:

M>Здравствуйте, Quintanar, Вы писали:


M>>>Случаи-то разные бывают... Просто парсер — единственная нетривиальная И обязательная часть компилятора.


Q>>Никак не могу согласится. Парсер как раз достаточно тривиальная часть, даже с учетом исправления шероховатостей граматики. Про него все известно заранее — что делать, как делать.


M>Sigh.. ОК. Скажем так. Парсер — единственная обязательная часть компилятора.

Никак не могу согласиться. Парсер мало того что самая тривиальная часть современного компилятора, так еще и ни разу необязательная. Компиляторы Лисп и Forth преспокойно существуют, и не содержат парсеров. Кстати, ранние компиляторы фортрана были устроены по принципу ассемблеров, которые тоже обходятся без парсера.

Что еще осталось от вашего тезиса?
Re[4]: Ocaml как средство создания транслятора переднего пла
От: Quintanar Россия  
Дата: 30.08.05 11:44
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Quintanar, Вы писали:


Q>>Причем тут построитель парсеров?

VD>Да, как бы при том. Это первая встающая задача. В С++ парсер как раз самая сложная часть. И если язык действительно имеет сложность плюсов, то это просто первоочередная задача.

Это, что называется, тупая сложность. Т.е. просто долго надо махать лопатой и ничего другого не сделаешь.

Q>> Парсер — это вообще незначительная часть на фоне остальных в компиляторе.

VD>Как бы то нибыло. Окамл вряд ли будет золотой пулей вне области парсинга. А в области парсинга я опять бы предпочел мощьный построитель пасреров.

OCaml к парсингу отношения не имеет. Его специализация — синтаксический анализ полученного дерева, оптимизация, символьные вычисления.
Re[7]: Ocaml как средство создания транслятора переднего пла
От: Трурль  
Дата: 30.08.05 11:52
Оценка:
Здравствуйте, Gaperton, Вы писали:

M>>Sigh.. ОК. Скажем так. Парсер — единственная обязательная часть компилятора.

G>Никак не могу согласиться. Парсер мало того что самая тривиальная часть современного компилятора, так еще и ни разу необязательная. Компиляторы Лисп и Forth преспокойно существуют, и не содержат парсеров. Кстати, ранние компиляторы фортрана были устроены по принципу ассемблеров, которые тоже обходятся без парсера.

Совсем без парсера нельзя. ННадо же хотя бы лексемы разбирать.
Re[6]: Ocaml как средство создания транслятора переднего пла
От: Gleb Alexeev  
Дата: 30.08.05 11:54
Оценка: -1
Здравствуйте, VladD2, Вы писали:

VD>Скромный вопрос. А что же на горизонте нет ни кодного С++-ного парсера удовлетворяющего стандарту?

Нет ни одного С++-компилятора, удовлетворяющего стандарту. Стандарта на парсеры С++ просто не существует.

Рискну предположить, что С++ как раз из-за своих неоднозначностей как раз и не укладывается в рамки модели синтаксический анализ=>семантический анализ=>...

Построить парсер по корректной грамматике, удовлетворяющей определенным ограничениям (LL(k), LALR,...), — задача давно решенная, только с С++ проблема в том, что неоднозначности синтаксиса разрешаются на семантическом уровне.

Кстати, статью "Редкая профессия", на форуме ссылки пробегали, не читали?
Re[7]: Ocaml как средство создания транслятора переднего пла
От: mihoshi Россия  
Дата: 30.08.05 11:56
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

M>>Sigh.. ОК. Скажем так. Парсер — единственная обязательная часть компилятора.

G>Никак не могу согласиться. Парсер мало того что самая тривиальная часть современного компилятора, так еще и ни разу необязательная. Компиляторы Лисп и Forth преспокойно существуют, и не содержат парсеров. Кстати, ранние компиляторы фортрана были устроены по принципу ассемблеров, которые тоже обходятся без парсера.

G>Что еще осталось от вашего тезиса?


Что было, то и осталось То, что в Lisp парсер элементарный, не значит, что его там нет.

Хотя, строго говоря, определяющим свойством компилятора является не парсинг, а синтез кода. Например, компилятор может компилировать из уже рапарсенного AST.

Но тем не менее, парсинг остается "общим" местом для компиляторов. Остальные части более специфичны для конкретных языков, платформ и целей и решаются персонально.
Re[8]: Ocaml как средство создания транслятора переднего пла
От: Gaperton http://gaperton.livejournal.com
Дата: 30.08.05 12:02
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Здравствуйте, Gaperton, Вы писали:


M>>>Sigh.. ОК. Скажем так. Парсер — единственная обязательная часть компилятора.

G>>Никак не могу согласиться. Парсер мало того что самая тривиальная часть современного компилятора, так еще и ни разу необязательная. Компиляторы Лисп и Forth преспокойно существуют, и не содержат парсеров. Кстати, ранние компиляторы фортрана были устроены по принципу ассемблеров, которые тоже обходятся без парсера.

Т>Совсем без парсера нельзя. ННадо же хотя бы лексемы разбирать.

Трурль, ну что ж я, совсем без понятия штоли . Когда говорят о компиляторах, парсером обыкновенно называют синтаксический анализатор (нет грамматики — нет парсера). А лексический — он так, как бы не считается. Кстати, а форт-машине нет и лексического анализатора как выделенной части (гы!).
Re[5]: Ocaml как средство создания транслятора переднего пла
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.08.05 12:11
Оценка:
Здравствуйте, mihoshi, Вы писали:

M>Пример мощного построителя парсера?


В философии пробегали. Ищи по "GLR".
... << RSDN@Home 1.2.0 alpha rev. 606>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Ocaml как средство создания транслятора переднего пла
От: mihoshi Россия  
Дата: 30.08.05 12:25
Оценка:
Здравствуйте, VladD2, Вы писали:

M>>Пример мощного построителя парсера?


VD>В философии пробегали. Ищи по "GLR".


Интересный подход
Elkhound is written in C++, and can generate parsers written in either C++ or Ocaml.
Re[9]: Ocaml как средство создания транслятора переднего пла
От: Трурль  
Дата: 30.08.05 12:39
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Кстати, а форт-машине нет и лексического анализатора как выделенной части (гы!).


Ну как же нет. А WORD и NUMBER?
Re[10]: Ocaml как средство создания транслятора переднего пл
От: Gaperton http://gaperton.livejournal.com
Дата: 30.08.05 12:51
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Здравствуйте, Gaperton, Вы писали:


G>>Кстати, а форт-машине нет и лексического анализатора как выделенной части (гы!).


Т>Ну как же нет. А WORD и NUMBER?

Нету риально. В интерпретаторе (слово такое) сначала отделяются последовательности символов от пробела до пробела. Потом считается что это слово. А вот если оно в словаре не нашлось, интерпретатор пытается привести его к числу, и выполняет это как LIT NUMBER — делается это в последнюю очередь.

В результате ты вполне можешь определить слово с именем в виде числа. Более того, так часто и делается для 1 и 2 и других частоупотребимых констант — для скорости. Этот эксперимент наглядно демонстрирует отсутствие лексического анализатора в виде, обычном для языков с грамматикой.

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

Вот так.
Re[11]: Ocaml как средство создания транслятора переднего пл
От: Трурль  
Дата: 30.08.05 13:33
Оценка:
Здравствуйте, Gaperton, Вы писали:

Ну, тогда и в си нет "отдельной специализированной части", патамушта
 # define if printf("Hello World!\n");
Re[5]: Ocaml как средство создания транслятора переднего пла
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.08.05 13:46
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Это, что называется, тупая сложность. Т.е. просто долго надо махать лопатой и ничего другого не сделаешь.


Не совсем так. Построить корректное дерево разбора для сложного языка задача не тривиальная и может занять не иодин год. Хотя "тупая сложность" тоже сложность. И ее тоже нужно уменьшать.

Q>OCaml к парсингу отношения не имеет. Его специализация — синтаксический анализ полученного дерева, оптимизация, символьные вычисления.


Тогда возможно разумным было бы использовать мощьный парсер и Окамл в качестве средств анализа и трансформации.
... << RSDN@Home 1.2.0 alpha rev. 606>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Ocaml как средство создания транслятора переднего пл
От: Gaperton http://gaperton.livejournal.com
Дата: 30.08.05 13:50
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Ну, тогда и в си нет "отдельной специализированной части", патамушта
 # define if printf("Hello World!\n");


Хе. А слабо в С определить макрос с именем 824? А вот с таким "+"? То-то же.

А вообще, батенька, это патамушта в Си есть дополнительная "специализированная часть" — препроцессор, которая работает до всех стадий анализа, в то время как в форте кроме примитовного лексического анализа нет ничего, да и тот не локализован, так что выделенного "анализатора" там нет.
Re[7]: Ocaml как средство создания транслятора переднего пла
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.08.05 15:11
Оценка:
Здравствуйте, mihoshi, Вы писали:

M>Интересный подход




M>Elkhound is written in C++, and can generate parsers written in either C++ or Ocaml.


Ды что там будет на генерировано это уже второй вопрос. Главное, чтобы оно было сгенерировано.
... << RSDN@Home 1.2.0 alpha rev. 606>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Ocaml как средство создания транслятора переднего пла
От: chukichuki  
Дата: 31.08.05 06:33
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Тогда возможно разумным было бы использовать мощьный парсер и Окамл в качестве средств анализа и трансформации.


Так изначально и планировалось
Re[7]: Ocaml как средство создания транслятора переднего пла
От: Gaperton http://gaperton.livejournal.com
Дата: 31.08.05 09:00
Оценка:
Здравствуйте, chukichuki, Вы писали:

C>Здравствуйте, VladD2, Вы писали:


VD>>Тогда возможно разумным было бы использовать мощьный парсер и Окамл в качестве средств анализа и трансформации.


C>Так изначально и планировалось


Тем не менее, разберитесь сначала со стандартным окамловым препроцессором camlp4. Его использование — это рекомендуемый для OCaml способ писать парсеры.
Re[8]: Ocaml как средство создания транслятора переднего пла
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.08.05 14:13
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Тем не менее, разберитесь сначала со стандартным окамловым препроцессором camlp4. Его использование — это рекомендуемый для OCaml способ писать парсеры.


Насколько я понял он обеспечивает построение LL(k)-, а то и LL(1)-парсеров. Что для С++ явно недостаточно.
... << RSDN@Home 1.2.0 alpha rev. 606>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Ocaml как средство создания транслятора переднего пла
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.08.05 22:50
Оценка:
Здравствуйте, Gaperton, Вы писали:

M>>Sigh.. ОК. Скажем так. Парсер — единственная обязательная часть компилятора.

G>Никак не могу согласиться. Парсер мало того что самая тривиальная часть современного компилятора, так еще и ни разу необязательная. Компиляторы Лисп и Forth преспокойно существуют, и не содержат парсеров. Кстати, ранние компиляторы фортрана были устроены по принципу ассемблеров, которые тоже обходятся без парсера.

G>Что еще осталось от вашего тезиса?


Все осталось. Языки без синтаксиса парсера действительно не требуею. Ну, почти. Но С++ к таким точно не отностися. Задача парсинга этого языка очень сложная. Так что эти аргументы не прокатывают.
... << RSDN@Home 1.2.0 alpha rev. 606>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Ocaml как средство создания транслятора переднего пла
От: Аноним  
Дата: 02.09.05 10:04
Оценка:
Здравствуйте, chukichuki, Вы писали:


C>Эх. Не хотел я говорить. Сейчас заклюют. Реализую я некоторый, отличный от стандартного диалект C++ ( практически со всеми наворотами, включая шаблоны ). В приницпе "первый блин" уже сделан (на Си++), теперь пытаемся осмыслить то что получилось, выбрать более правильные технологические подходы для реализации второй версии.


А стоит ли это все труда — если в том же OCAML есть возможность динамического разбора и подключения кода на нем же.
Может стоит подумать о такой возможности?
Не зная всеех целей я не хочу ничего говорить, но на C++ свет клином не сошелся ведь.
Re: Ocaml как средство создания транслятора переднего плана
От: Аноним  
Дата: 02.09.05 11:27
Оценка:
Здравствуйте, chukichuki, Вы писали:

C>Стоит задача разработки лексического, синтаксического и семантического анализаторов ( aka frontend, aka транслятор переднего плана) определенного языка c достаточно сложными языковыми конструкциями. По сложности реализации рассматриваемый язык сопоставимы с языком Си++.


Сложными "языковыми" или "смысловыми"? Немножко разное.

C> В качестве одной из альтернатив Си/Си++ рассматривается Ocaml.


Хоршая альтернатива. Мы при решении подобной задачи ее рассматривали...

C> Насколько существеннен проигрыш в скорости программ реализованных на OCaml-е по сравнению с Си/Си++ ?


Думаю, что будет выигрыш — на плюсах сделать оптимальный алгоритм очень не просто...

C>Также интересуют другие языки с декларативной составляющей, которые подойдут для данной задачи


Lisp, Erlang
Мы остановились на последнем. Там кстати лексер и парсер в комплекте вполне нормальные.
Re[2]: Ocaml как средство создания транслятора переднего пла
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.05 11:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Lisp, Erlang

А>Мы остановились на последнем. Там кстати лексер и парсер в комплекте вполне нормальные.
Остановились на Erlang для создания компилятора?! При альтернативах Lisp и OCaml?! Жжоте.

Я не ставлю под сомнение то, что вы сделали осознанный выбор. Просто он мне кажется невероятно странным, особенно на фоне названных альтернатив. Не могли бы вы объяснить, как вы пришли именно к такому варианту для данной задачи — Erlang? Почему так?
Re[3]: Ocaml как средство создания транслятора переднего пла
От: EXO Россия http://www.az.inural.ru
Дата: 02.09.05 13:01
Оценка: 1 (1)
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Аноним, Вы писали:


А>>Lisp, Erlang

А>>Мы остановились на последнем. Там кстати лексер и парсер в комплекте вполне нормальные.
G>Остановились на Erlang для создания компилятора?! При альтернативах Lisp и OCaml?! Жжоте.

G>Я не ставлю под сомнение то, что вы сделали осознанный выбор. Просто он мне кажется невероятно странным, особенно на фоне названных альтернатив. Не могли бы вы объяснить, как вы пришли именно к такому варианту для данной задачи — Erlang? Почему так?


Нам так было удобнее, поскольку мы сочли ErlangOPT-среду пригоной, в качестве движка ниженего уровня (прикладного сервера). То есть прикладной язык компилируется erlang-ом и _В_ erlang. "Единообразнее" получается.
Re[4]: Ocaml как средство создания транслятора переднего пла
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.05 13:05
Оценка:
Здравствуйте, EXO, Вы писали:

EXO>Здравствуйте, Gaperton, Вы писали:


G>>Здравствуйте, Аноним, Вы писали:


А>>>Lisp, Erlang

А>>>Мы остановились на последнем. Там кстати лексер и парсер в комплекте вполне нормальные.
G>>Остановились на Erlang для создания компилятора?! При альтернативах Lisp и OCaml?! Жжоте.

G>>Я не ставлю под сомнение то, что вы сделали осознанный выбор. Просто он мне кажется невероятно странным, особенно на фоне названных альтернатив. Не могли бы вы объяснить, как вы пришли именно к такому варианту для данной задачи — Erlang? Почему так?


EXO>Нам так было удобнее, поскольку мы сочли ErlangOPT-среду пригоной, в качестве движка ниженего уровня (прикладного сервера). То есть прикладной язык компилируется erlang-ом и _В_ erlang. "Единообразнее" получается.


Ах вот оно что. Понятно, спасибо.
Re[4]: О проекте
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.05 13:07
Оценка:
Здравствуйте, EXO, Вы писали:

EXO>Нам так было удобнее, поскольку мы сочли ErlangOPT-среду пригоной, в качестве движка ниженего уровня (прикладного сервера). То есть прикладной язык компилируется erlang-ом и _В_ erlang. "Единообразнее" получается.


Не могли бы вы рассказать в общих чертах о проекте, вашей компании, и впечатлениях от платформы?
Re[5]: О проекте
От: EXO Россия http://www.az.inural.ru
Дата: 05.09.05 04:04
Оценка: 30 (5)
Здравствуйте, Gaperton, Вы писали:

G>Не могли бы вы рассказать в общих чертах о проекте, вашей компании, и впечатлениях от платформы?


Могу. Но чтобы не сочли рекламой, буду краток.

Область проектов — "Насислеия за ЖКХ" (и иже с ним в комлексе "монетизация льгот", "субсидии" и прочее).
Собственно это уже не перый проект "Контура" в этой области — внутренне условеное название "5-я версия". Предидущий ( версия 4.3 ) был на MS-технологиях... по итогам — не понравилось. "5-версия" во многом эксперимент.
Технологии перечислены здесь,
а здесь лежит пара презенташек.

По Erlang-OTP, пока еще сказать могу не очень много, но предварительно нравится. Глюков пока не обнаружено ни одного, так что с надежностью все нормально. Быстродействие и ресурсоемкость тоже порадовали, хотя здесь трудно придумать какой-либо объективный тест, поскольку это нужно рассматривать среду в целом (и язык, и сетевые протоколы, и БД, и веб-сервер). Пока могу сказать, что переведенный с MS-SQL + Delphy + VBA на Mnesia + Erlang небольшой кусочек нашей задачи ускорился раз в 8. Но это пока все предварительное.
Из сложностей — на тут пугали, что Erlang далеко не все программисты способны освоить и что все очень сложно... Для "старых" программистов это оказалось действительно так. А вот если посадить за Erlang студентов и сказать им, что дескать "простой язычек, ничего особенного", то каких либо сложностей у них и правда не возникает.
Так что похоже сие лишь стереотипы и страхи.
Re: Ocaml как средство создания транслятора переднего плана
От: Аноним  
Дата: 08.09.05 05:37
Оценка: 27 (1)
Здравствуйте, chukichuki, Вы писали:

C>Стоит задача разработки лексического, синтаксического и семантического анализаторов ( aka frontend, aka транслятор переднего плана) определенного языка c достаточно сложными языковыми конструкциями. По сложности реализации рассматриваемый язык сопоставимы с языком Си++.


http://www.venge.net/graydon/talks/mkc/html/index.html
Re[2]: Ocaml как средство создания транслятора переднего пла
От: chukichuki  
Дата: 10.09.05 12:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, chukichuki, Вы писали:


C>>Стоит задача разработки лексического, синтаксического и семантического анализаторов ( aka frontend, aka транслятор переднего плана) определенного языка c достаточно сложными языковыми конструкциями. По сложности реализации рассматриваемый язык сопоставимы с языком Си++.


А>http://www.venge.net/graydon/talks/mkc/html/index.html


Хорошо разжевано, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.