http://roman.yankovsky.me/?p=796
Сам - много об этом думал и многое сделал в этом направлении. Те же "скриптовые тесты" - примерно так и устроены.
Рад, что не я один :-)
Я бы правда использовал бы не Lexx/Yacc, а Forth/Lisp-машину.
Но "на вкус и цвет - все фломастеры разные"...
Сам - много об этом думал и многое сделал в этом направлении. Те же "скриптовые тесты" - примерно так и устроены.
Рад, что не я один :-)
Я бы правда использовал бы не Lexx/Yacc, а Forth/Lisp-машину.
Но "на вкус и цвет - все фломастеры разные"...
Я, честно говоря, не понимаю, почему ты противопоставляешь Lex/Yacc и Forth/Lisp. Ведь задачи у них совершенно разные: Lex/Yacc парсят, Forth/Lisp выполняют.
ОтветитьУдалитьРоман, идеология "FORTH-машины" мне нравится тем, что она позволяет "прикладной программе" влиять на сам процесс компиляции и разбора. Что позволяет настраивать и "дотачивать" грамматику прямо на лету и "по месту". Только и всего. А использование Lex/Yacc - сильно статичнее.
УдалитьNameRec:
ОтветитьУдалитьЧто-то в блоге автора статьи у меня не очень получилось полноценно опубликовать комментарий :-(
Попробую здесь...
Как-то интересно получается...
Начали с конфигурационных файлов, указали на их "недостатки" в контексте задачи, которую обычно не описывают посредством конфигурационных файлов, а затем предложили "решение" - собственный DSL.
Нет, ну можно, конечно и так... Но:
1. Вот такой XML:
〈trafficlight〉
. 〈loop〉
. . 〈switch color="red" delay="10"/〉
. . 〈switch color="yellow" delay="1"/〉
. . 〈wait delay="1"/〉
. . 〈switch color="green" delay="7"/〉
. 〈/loop〉
〈/trafficlight〉
выглядит несколько естественнее того, что Вы привели.
На мой вкус, впрочем.
Разумеется, я не стал бы рекомендовать использоваить конфигурационный файл для управлением светофором, но... В Вашей постановке это ещё возможно ;-)
2. Что же до программы на DSL, то на Python это будет, IMHO лаконичнее:
import trafficlight, red, green, yellow
t = trafficlight.Trafficlight()
while True:
. . t.switch(red, wait=10)
. . t.switch(yellow, wait=1)
. . t.wait(1)
. . t.switch(yellow, wait=1)
. . t.switch(green, wait=7)
кроме того, не нужен никакой парсинг LEX/YACC, а язык - очень распространённый, на который имеются "тонны" документации.
3. Вообще же, тема DSL IMHO утратила актуальность с появлением XML, YAML/JSON с одной стороны, и встраиваемых скрипт-языков (Python, LUA) - с другой.
Общим недостатком всех DSL я вижу обратную сторону их достоинств, а именно - специализации на конкретике отдельной задачи.
До какого-то момента (пока язык простой) они помогают, но затем, по мере усложнения требований, усложняется и DSL, ввиду чего сдерживающим развитие проекта фактором становится уже он.
Поэтому я - за решения, использующие стандартные инструменты.
Ответил в блоге :)
ОтветитьУдалить