Существует категория языков, которые используются для обучения программированию новичков, часто детей. Исторически первичным примером является LOGO, язык для рисования на холсте всем известной тутле-графики. В наши дни много шумихи вокруг Scratch и подобных языков, разработанных на базе Blockly, таких как CoBlox, язык в блочном стиле для программирования промышленных роботов.

Являются ли языки обучения (LL) предметно-ориентированными языками (DSL)?

Очевидно, что нет Scratch: это действительно язык общего назначения с синтаксисом и интегрированной средой разработки, которую легче освоить, чем текстовые редакторы. Но они могут быть DSL. Например, CoBlox нацелен на область промышленных роботов. LOGO можно рассматривать как DSL для рисования определенного стиля графики. И все они потенциально могут быть разработаны с помощью инструментов разработки DSL, таких как языковые рабочие места, такие как MPS, Xtext, Spoofax или Rascal.

Сравнение DSL и LL

Я хочу доказать, что существуют важные различия в компромиссах, которые определяют дизайн этих языков. Взгляните на следующую диаграмму. Он иллюстрирует 8 метрик, которые различают два типа языков; чем дальше каждая из точек находится на оси метрики, тем больше очков конкретного вида по этой метрике. Синяя линия — языки изучения, красная — DSL. Давайте посмотрим на показатели по очереди.

Покрытие домена

Какую часть домена охватывает язык? DSL, например, для расчета заработной платы, должен быть в состоянии покрыть всю область — наш клиент хочет иметь возможность выражать полную систему расчета заработной платы. Для LL совершенно нормально выбирать из домена, как правило, таким образом, чтобы сделать язык более простым и легким для изучения.

Существенная сложность

DSL не может быть проще, чем то, что необходимо для выражения всего домена. Например, недавний DSL для расчета заработной платы поддерживает временные данные и управление версиями правил. Эти концепции не всегда легко понять, но они необходимы для предметной области. LL может делать относительно произвольный выбор, выбирая часть домена, что снижает эту сложность.

Случайная сложность

Как в DSL, так и в LL вам не нужна случайная сложность — в конце концов, она по существу не нужна, и поэтому ее следует избегать (оба пункта очень близки к нулю). И в LL вы действительно стремитесь к нулевой случайной сложности любой ценой, потому что это мешает обучению. В DSL, поскольку вам нужно охватить всю область, вам, возможно, придется пойти на пару компромиссов в отношении элегантности, ортогональности или синтаксиса, что немного увеличивает случайную сложность.

Производительность

Повышение производительности по сравнению с языками общего назначения за счет соответствующих абстракций, обозначений, анализа и инструментов является в первую очередь основной причиной разработки DSL. Для ЛЛ это не так важно; по-видимому, вам все равно придется много думать (потому что вы учитесь), пока вы пишете программы. И вы не будете писать много кода, что подводит нас к следующему пункту:

Масштабируемость

Написание больших программ, потенциально с избирательным повторным использованием между ними, является важным аспектом многих DSL; для ЛЛ это не важно. Например, в LL вы можете предпочесть графическую нотацию, потому что она изначально «менее чужда» для новичков, но когда вы будете изучать язык каждый день, как многие DSL, вы, вероятно, предпочтете что-то более лаконичное, например текст или столы.

обучаемость

Это, конечно, raison d'être для LL, поэтому они получают здесь полный балл. Для DSL, конечно, полезно, если их легко освоить, потому что это снижает начальное «сопротивление» будущих пользователей. Но помните, пользователи изучают язык один раз, а потом должны быть продуктивными!

Ремонтопригодность

… более или менее не имеет значения для LL: как только вы освоите задачу/упражнение, вы больше никогда не будете изменять программу. Или даже посмотреть на это. Для DSL, в зависимости от их использования, это может быть иначе. Конечно, существуют одноразовые DSL, например, когда вы записываете музыкальное произведение или конвейер обработки изображений. Но в большинстве случаев, с которыми мы имеем дело, программы, созданные с помощью DSL, живут годами и должны активно поддерживаться.

Опытные пользователи

Для DSL вы ожидаете, что пользователь будет экспертом в данной области. Вот почему они ценят существенную сложность DSL: они должны иметь возможность выражать всю область. Для LL пользователь еще не программист; в частности, для предметно-ориентированных LL, таких как CoBlox, ваши пользователи, безусловно, не являются экспертами в области роботов — в конце концов, цель языка — научить их (программированию) этой области. Они не поймут, почему у языка есть особая особенность, необходимая для выражения важных, но редких краеугольных случаев в предметной области.

Резюме

Таким образом, хотя и LL, и DSL не совпадают с (серьезно используемыми) языками общего назначения, и хотя оба они могут быть ограничены определенной областью, формы таких языков (буквально, см. Диаграмму выше) сильно различаются. LL должны выполнять другие, но также меньше требований. Мы не можем обязательно экстраполировать опыт одного на другой.

В идеале нам нужна комбинация в том смысле, что DSL имеет подмножество, которое фактически является LL для обучения DSL в начале. Возможно, я напишу в будущем посте о том, как мы могли бы достичь этого с ограниченными усилиями.