Есть много мест, где вы можете найти аргументы о том, что DSL (языки, специфичные для домена) или «ориентированное на языковое программирование» хороши. Но я мало что нашел в том, что делает их плохими.
Мой опыт с DSL, как правило, негативно. Есть случаи, когда я точно знаю, что я хочу, чтобы компьютер сделал. Я мог бы написать это за несколько минут на любом «реальном» языке программирования, но изо всех сил пытался выразить или приблизительно его в DSL.
Вот несколько примеров «плохих» DSLS:
- Делать
- CSS
- Действия GitHub
И вот достаточные условия, чтобы DSL был плохим:
- Отсутствуют правильные функции. Под которым я имею в виду функции математики в старшей школе: вещи, которые вычисляют, превращая переменные в возвращаемые значения.
- Отсутствуют правильные переменные. Под которым я имею в виду общий способ названия значений.
- Обязательное. Реферы в пределах нормального языка программирования большую часть времени в хорошем времени, потому что мы не вынуждены использовать их: когда все становится слишком сложно, чтобы выразить, мы можем переключиться на написание нормальной функции с полной мощностью языка программирования.
Почетное упоминание о функции, отсутствующей в Bad DSLS: структурированные данные.
На Сделать :
Makefile DSL является обязательным для Make. Вы не можете узнать, что вам нужна переменная и функция, а затем просто сделайте это. Вы должны обманывать с помощью переменных среды или сшивать сценарии оболочки, хранить состояние в файловой системе, все более и более сложные смешные символы и т. Д. И т. Д. Вот пример, в котором мне были нужны переменные и функции в последнее время: наше правило «теста» зависело от нашего правила «сборки», но у нас было более одного способа строительства. Мы хотели провести одни и те же тесты для каждого из этих различных способов построения. Мне удалось взломать это: с переосмыслением Makefile сам С переменной среды, затем используя эту переменную среды в качестве макроса вместе с тройным условным синтаксисом Makefile. Это просто глупо!
На CSS :
В таблице стилей CSS является обязательным: вы не можете оттолкнуть код и написать код на реальном языке, если только вы не считаете Гудини Анкет CSS не имеет переменных и функций. Вот почему в типичных рукописных CSS кто-то много повторяется, с «магическими струнами» для ширины, шрифтов и т. Д. Единственными методами композиции являются повторять себя или полагаться на каскад, который имеет весь вкус общего изменяемого состояния, такой как действие на расстоянии/нет способа рассуждать на местном уровне.
Чтобы увидеть, как будет выглядеть CSS, если бы у него были правильные переменные и функции, см. Как реагировать нативно это : Стили — это просто данные, и могут быть назначены переменным, передаваемые функциям, возвращаются из функций, импортируются, распределены через менеджеры пакетов и т. Д.
Там может быть хорошее Причины производительности Не всегда выполнять полноценную формулировку программирования во время выполнения для стиля веб-страниц. Но тогда, возможно, вместо ограниченного языка, не должно быть любой Язык вообще для стилей: просто данные, которые генерируются компиляторами на предварительное время.
- Если в CSS есть аргумент PERF, если мы не имеем функций и переменных, мы, конечно, можем применить те же рассуждения к разрешению правил CSS. Резолюция правил тяжелая работа , может быть, для нас это плохая идея, чтобы браузеры делали это во время выполнения.
- Большинство PLS без переменных обречено на то, чтобы в конечном итоге расти, имитируемые переменные. В случае с CSS он имеет как минимум два: Пользовательские свойства и счетчики . Последняя ссылка идет на целую статью о том, как чистить абзацы с помощью CSS. Это действительно целая статья, показывающая, как сделать эквивалент этого JavaScript:
Faragraphs.foreach ((абзац, i) => ....)
. (Примечание: статья великолепна, CSS является целью моего крикизма). - Даже при всей мощности сбой браузера с
var
иCalc
, Случайная скандальность Тьюринга , Ad-Hockery (Синтаксис медиа-запросов, счетчики, еще в преддверии ) Оказывается, люди все еще хотят стилизовать браузер, используя языки, которые имеют переменные и функции (см. SASS и CSS-In-JS).
На Действия GitHub :
В GitHub Workflows Один очень часто имеет повторяющиеся имена для вещей (например, артефакт, который один хочет генерировать и загружать). Нужно скопировать и вставить, а затем надеяться, что все будет синхронизировано. Или предположим, что кто -то хочет сделать похожие, но немного отличающиеся, вещи, направленные на то, чтобы выдвигать ветвь и сделать выпуск. Скопируйте/вставьте еще раз, на этот раз вдавая несколько небольших изменений в разных шагах.
Почему плохой DSL случаются с хорошими людьми?
Если это так ужасно работать с этими DSL, то как и почему мы попали в эту ситуацию? Ответ немного отличается в каждом из этих случаев:
Почему Сделать язык существуют
Я подозреваю, что Make имеет DSL, потому что тогдашние языки сценариев высокого уровня не были такими. И если бы это было, было бы неочевидным, как смешивать действительно декларативные аспекты создания с «делай это, а затем сделать это» природу идиоматического питона. Рейбл Кажется, здесь хороший баланс, хотя я не использовал его много. Это мандатичность, это проблема с созданием, а не фундаментальной моделью.
Почему CSS существуют:
CSS: Люди настолько привыкли к CSS, что трудно представить альтернативы, препроцессоры в стороне. «Языки, которые почти стали CSS» дает некоторое представление о ограничениях и альтернативах. Это было в основном по причинам производительности, когда мы не получили «настоящий» язык программирования. Это нормально, но это говорит мне, что CSS имеет больше смысла в качестве формата данных или байт -кода, чем что -то для людей. Смотрите «Что насчет SQL» ниже, чтобы узнать больше о том, что я имею в виду здесь.
Почему Действия GitHub Язык существует:
Действия GitHub нарушены без технической причины, которую я могу различить. Они не убили язык по соображениям исполнения: вы можете написать бесконечный цикл в рабочем процессе с шагом «беги» с некоторым ударом в то время как правда; Сделай Эхо привет; Готово
Анкет Вы можете тратить память и процессор, все, что вы хотите: GH зарядит вас за то, что вы используете, после того, как вы превышаете границы свободного уровня. Это не по соображениям безопасности: в любом случае все в песочнице, и уже является побочными эффектами.
А как насчет SQL?
SQL довольно хорош на практике, но встречает мое определение «плохого» DSL. Причина, по которой SQL не кажется полностью сломанной, заключается в том, что это обычно сгенерировано , не написанный вручную. SQL сшит вместе с помощью кода на реальных языках программирования. Например, программисты языков общего назначения записывают функции, которые генерируют и выполняют подготовленные операторы. Параметры функций в языке общего назначения для привязки параметров с подготовленным оператором. Или люди используют строители запросов или ORM.
Конечно, SQL может быть лучше, и я говорю не просто обо всех синтаксических несоответствиях. Как цель компиляции, в идеале это было бы лучше подходить для получения. Rethnkdb и mongodb (несмотря на другие его недостатки) оба получают это право, рассматривая запросы в большей степени как данные, чем как код на некоторых биочненных языках без надлежащих переменных и функций, делая запросы более композиционными и безопасно Анкет
В тех редких случаях, когда приложения являются Написано в SQL, это не на самом деле SQL, это SQL+, где есть переменные и функции: см. Языки сохраненной процедуры для Postgres и SQL Server, которые особенно похожи на реальные языки.
Как мы можем сделать лучше?
Вот некоторые альтернативы плохим DSL:
- Что такого плохого в реальном языке программирования с правильными переменными и функциями? Если вы причиняете, что вы хотите, чтобы что -то легкое училось и безопасно для встраивания, подумайте о чем -то вроде Lua Анкет Луа, кажется, хорошо работает для Реджис хранится процедуры , индустрия видеоигр (см. Пример Roblox), Nginx config , и т.д. Увязывать это аналогичный вариант для аудитории в скобках-состатике.
- Будут ли простые данные соответствовать вашим потребностям?
- Подумайте о том, чтобы сделать разработчикам приложения, чтобы написать «реальный» код, который генерирует данные, а не предоставляя им сломанный язык, который находится где -то между данными и кодом.
- Eslint и WebPack Оба позволяют пользователям записывать свою конфигурацию в коде JSON или JS, который генерирует JSON-подобные объекты. Это имеет некоторые преимущества DSL, одновременно позволяя абстракции, когда это необходимо.
- Если кто -то хочет статических гарантий о данных, сгенерированных кодом, можно идти намного дальше в Уточнение кода-то, что подход к поколению дает (Раскрытие: в настоящее время я работаю в компании, стоящей за этой статьей, мнения — мои собственные).
- Если есть веские причины для контроля побочных эффектов и обеспечения ограниченных режимов косвенности, рассмотрим Дхалл , если ваша аудитория ML-Syntax-Sympetitic
- Подумайте о том, чтобы сделать разработчикам приложения, чтобы написать «реальный» код, который генерирует данные, а не предоставляя им сломанный язык, который находится где -то между данными и кодом.
- Как только вы обнаружите, что переосмысляете переменные, петли и функции с вашими «простыми данными» Стоп Стоп и рассмотрим одну из альтернатив выше. Это больше не простые данные, это плохой язык программирования.
Пусть наши инструменты будут Велосипеды для ума Анкет
Обновление: я переписал раздел на CSS в ответ на отзывы.
Оригинал: «https://dev.to/maxheiber/what-makes-a-dsl-bad-make-css-and-how-we-can-do-better-10ji»