понедельник, 26 августа 2013 г.

Чужая статья. Delphi и предметно-ориентированные языки. Знакомо до "БОЛИ"

http://roman.yankovsky.me/?p=796

Сам - много об этом думал и многое сделал в этом направлении. Те же "скриптовые тесты" - примерно так и устроены.

Рад, что не я один :-)

Я бы правда использовал бы не Lexx/Yacc, а Forth/Lisp-машину.

Но "на вкус и цвет - все фломастеры разные"...

4 комментария:

  1. Я, честно говоря, не понимаю, почему ты противопоставляешь Lex/Yacc и Forth/Lisp. Ведь задачи у них совершенно разные: Lex/Yacc парсят, Forth/Lisp выполняют.

    ОтветитьУдалить
    Ответы
    1. Роман, идеология "FORTH-машины" мне нравится тем, что она позволяет "прикладной программе" влиять на сам процесс компиляции и разбора. Что позволяет настраивать и "дотачивать" грамматику прямо на лету и "по месту". Только и всего. А использование Lex/Yacc - сильно статичнее.

      Удалить
  2. 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, ввиду чего сдерживающим развитие проекта фактором становится уже он.
    Поэтому я - за решения, использующие стандартные инструменты.

    ОтветитьУдалить