Re[5]: Написание своего DSL
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 13.09.20 02:06
Оценка:
Здравствуйте, Михaил, Вы писали:

М>Случайно зашёл в дискуссию и, будучи не в теме, стало любопытно. Можно в двух словах, в каких случаях оптимально создание нового дсл? Почему-то казалось, что в большинстве случаев проще взять готовый язык (который большинству людей априори знаком), вроде python, lua, typescript/js, и на его основе городить скриптовый движок, чем изобретать новое «наречие».


Если коротенько — ненужный мусор из конструкций языка. Так-то и на плюсиках в рамках плюсиков можно любой DSL написать, но плюсиковые конструкции будут заслонять DSL. Для других языков ровно то же самое вполне актуально.

Расскажу свою историю успехаза себя.

Давным давно, в одном НИИодной далёкой галактике, в рамках реализации проекта для вояк кто-то из разработчиков потыкал палочкой OPENcan. Присовывать какую-либо открытую реализацию OPENcan для микроконтроллеров в проект для вояк никто не решился, и по мотивам был создан свой стек протоколов для CAN, RS-232/UART и RS-485.

В протоколе (протокол не командный — типа — послать команду — получить ответ, а статусный — установить командный регистр/получить статусный региср) были предусмотрены ReadOnly регистры и ReadWrite регистры (на самом деле RW регистры — write-only, но в целях отладки их можно читать) — статусные регистры, когда устройство сообщает о своём состоянии, и управляющие RW-регистры, когда мастер начинает командовать.

Оформлялось для C/C++ это так:
#define RO_SOME_REGISTER00 0x00
#define RO_SOME_REGISTER01 0x01
#define RW_SOME_REGISTER00 0x00
#define RW_SOME_REGISTER01 0x01


Потом появились шарписты, которые пинали с компутера наши устройства. Стали писать:.
// $RO_BEGIN
#define RO_SOME_REGISTER00 0x00
#define RO_SOME_REGISTER01 0x01
// $RO_END

// $RW_BEGIN
#define RW_SOME_REGISTER00 0x00
#define RW_SOME_REGISTER01 0x01
// $RW_BEGIN

и написали парсер этого в сишарп.

Потом понадобилось передавать значения, ширшие, чем 1 байт. Их стали мапить на пачку однобайтных регистров. Константы для дефайнов и смещения вычислялись руками (и никто ни разу не облажался, ага).
Эта шляпа начала уже напрягать всех, и начальнеги отделов начали собираться пару раз в неделю перетереть на тему как нам реорганизовать рабкриннашу шляпу.

И тут появляюсь я. Я уже несколько месяцев работал в конторе, и так получилось, что тёрки происходили у меня под ухом (не опен спейс, но большое помещение с кучей народа. И свой уголок есть, и не скучно. Потом нас рассадили по отдельным кабинетам — стало реально скучно и уныло).

Погрел я уши, и запилил за пару вечеров инишку с генератором в C++. Народу понравилось, а потом понеслось
Автор: Marty
Дата: 10.09.20
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.