[ANTLR] Помогите, пожалуйста, оценить время разработки своего DSL

nikola1956

Никогда раньше не сталкивался с разработкой "языковых" приложений. Но на работе возникла необходимость разработки собственного внешнего предметно-ориентированнного языка. В принципе с "дизайном" языка, средой разработки на этом языке и задачами, под которые этот язык должен быть "заточен", более-менее определились. Осталался вопрос о сроках разработки.
Но здесь меня интересуют не сроки разработки вообще, а только примерная оценка времени реализации с использованием языка ANTLR (это предметно-ориентированный язык для разработки парсеров-лексеров и вообще языковых приложений) простейшей рабочей версии транслятора, который траслирует код, написанный на простейшей версии моего DSL (функции, инструкции присваивания, несколько фиксированных типов, if, while — пока всё).
Может быть кто-нибудь из форумчан занимался разработкой собственного DSL с использованием ANTLR и может подсказать примерное время создания "прототипа" подобного языкового приложения ? Одна, две недели или больше ? И на сколько быстро происходить освоение ANTLR ?

elenangel

ANTLR не пробовал, пробовали на работе re2c + lemon. как раз дописываем интерпретатор своего языка (осталось допилить операторы for, foreach и деструкторы - их оставили на конец). довольно сложно было понять логику lemon. с re2c все довольно просто.
в итоге на собственный язык с блекджеком и шлюхами объектами и наследованием потрачено ориентировочно 3+ месяца на 2 человек.

nikola1956

в итоге на собственный язык с блекджеком и шлюхами объектами и наследованием потрачено ориентировочно 3+ месяца на 2 человек
Спасибо, что поделились своим опытом! :)
Надеюсь, время разработки прототипа моего DSL (без пользовательских классов и объектов, без наследования, со статической типизацией и парой управляющих конструкций) окажется хотя бы 10 раз быстрее ...

Dasar

который траслирует код,
транслирует во что?

nikola1956

транслирует во что?
Пока достаточно трансляции в Java-код :)

okis

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

Dasar

вообще, полноценный прототип парсера с интерпретацией (или трансляцией) в режиме 1 к 1: одной конструкции языка соответствует один вариант интерпретации или трансляции - можно поднять за человекодень (если инструменты знакомы).
дальше время будет уходить:
1) человеческие сообщения об ошибках разбора - времени будет нужно раз в 5 больше (человеко-неделя)
2) всякие улучшения и оптимизации, которые вместо просто режима 1 к 1 требуют более сложные преобразования - здесь времени требуется раз в 20 больше (но, вообще, можно улучшать до бесконечности) (от нескольких человеко-месяцев)
3) зачистка хвостов, поддержка всяких вырожденных случаев и т.д. - времени раз в 30 больше (человеко-месяцы)
4) подсказки на лету при редактировании, отладчик - ближе к человеко-году (в первую очередь, из-за того, что необходимо мгновенное время исполнения)

nikola1956

вообще, полноценный прототип парсера с интерпретацией (или трансляцией) ... можно поднять за человекодень (если инструменты знакомы).
Большое спасибо за подробную оценку трудозатрат и оптимистический прогноз времени создания прототипа! :) Теперь лучше сознаю долю затрат времени на изучение инструмента (ANTLR) в первое время работы над DSL.

Dasar

в твоем случае, время скорее всего будет утекать на ошибки проектирования.
задача сама по себе сложная, и сильно зависит от правильности проектирования.
соответственно, если уже написал парсер один раз успешно, то следующий такого же уровня - пишется уже очень быстро.
но вот первый раз можно долго потрахаться с подбором правильной архитектуры, и обходом подводных камней.
уровни сложности парсеров - что-то типа:
1. просто код (типа калькулятора)
2. переменные
3. типы (структурные)
4. ооп
5. фя
6. выведение типов

Dasar

Пока достаточно трансляции в Java-код :)
это кстати плюс, можно большую часть всякой херотени переложить на саму Java-у

nikola1956

задача сама по себе сложная, и сильно зависит от правильности проектирования

можно большую часть всякой херотени переложить на саму Java-у
Спасибо за Ваши комментарии! Буду учитывать при разработке :)

Lord456

если на ANTLRе будете делать, постарайтесь сразу свою грамматику спроектировать так, чтобы не было конфликтов, которые сложно разрешать LL(k) парсером

elenangel

кстати плюсуюсь, распознавание конфликтов автогенераторами - вообще зло адское.

agaaaa

6. выведение типов
На выходных игрался, за час-два пишется.

Dasar

На выходных игрался, за час-два пишется.
какого плана?

Maurog

Может быть кто-нибудь из форумчан занимался разработкой собственного DSL
предположу, что , где занимается языком ZUSUL (Ze Ugly Stupid Useless Language :) )

karkar

Мы тогда были студентами Чернова и писали свои конпеляторы собственных языков в ассемблер его виртуальной машины за 2-4 недели где-то. То было лет 9 назад, с тех пор ANTLR сильно изменился.
Сейчас я не вижу смысла его использовать и подобные вещи пишу на окамле, используя мемоизирующие парсер-комбинаторы.

doublemother

Не пробовал, кстати, antlr и не умею писать конпеляторы, но "можно назвать DSL" написал на окамле с ocamlyacc/ocamllexx за день.

doublemother

Кстати, раз уж зашла тема, посоветуйте полному нубу в данном вопросе, где можно на пальцах прочитать про различи всех эти LL/LR, восходящих и нисходящих разборов и т.п.
«Построение компиляторов» Вирта читал, но полного понимания, чем эти анализаторы отличаются, так и нет. Хочется, чтобы было объяснено с примерами, где что не будет работать, в чём разница — короче, для идиотов.

Maurog

Сейчас я не вижу смысла его использовать
то-то я удивился, зачем использовать такую страшилку :grin:

Lord456

книжка с драконом - считается библией компиляторостроения
Оставить комментарий
Имя или ник:
Комментарий: