Вопрос о создании языка сценариев


12

Скажем, например, я хотел заплатить кому-нибудь за создание языка программирования или языка сценариев для меня. Какой тип документа им понадобится, чтобы полностью понять, что именно я хочу.

Я имею в виду, есть ли стандартные документы, которые описывают новый язык программирования / скриптов?


поскольку речь идет о программировании, а не о программистах, это, вероятно, лучше подходит для StackOverflow.
Muad'Dib

14
Я не согласен с Муад Диб. Я думаю, что это хорошее место для этого вопроса.
Крис

5
Я думаю, что вместо того, чтобы изобретать свой собственный язык сценариев, ценой огромного труда для вас и вашего пользователя, чтобы выучить новый язык, вам лучше встроить существующий язык сценариев. Некоторые языки, например Python, Javascript / ECMAScript, спроектированы так, чтобы их можно было встроить в более крупную среду. Короче говоря, вам нужно только разработать API и найти способ встроить интерпретатор сценариев в вашу собственную программу.
Ли Райан

1
В этом есть преимущество, если языком будет DSL. для общего языка не так много. Конечно , некоторые общие языки очень хорошие основания для DSLS например , Lisp или TCL
Jk.

Ответы:


16

То, что вам нужно написать, называется спецификацией языка .

Он должен содержать описание грамматики языка (желательно в расширенной форме Бэкуса-Наура ) и его семантики.

Для последней части вы можете написать описание своими словами (но будьте осторожны) или использовать формальную семантику .


1
BNF полезен только для грамматик без содержания, языки сценариев не всегда являются контекстно-свободными, например, TCL (хотя я думаю, что вы все еще можете утверждать, что в большинстве случаев предпочтительнее иметь язык без контекста)
jk.

@jk. Я бы не сказал, что BNF совершенно бесполезен для неконтекстных языков. В зависимости от того, насколько синтаксис свободен от контекста, все же имеет смысл указать его в EBNF, а затем разрешить неоднозначности в словах. Это то, что стандарт C ++ делает, например. В большинстве случаев я представляю, что это все же яснее, чем объяснять все словами или определять это с помощью контекстно-зависимой или неограниченной грамматики.
sepp2k

правда, я хотел сказать, что есть языки типа lisp, tcl или вперед (которые на самом деле очень хороши для определения DSL), которые имеют вырожденные синтаксисы, и поэтому BNF очень мало говорит вам
jk.

@jk. Конечно, но в этом случае любые другие способы описания синтаксиса скажут вам так же мало, просто потому, что так мало что можно сказать. Это просто означает, что синтаксическая часть спецификации будет очень короткой.
sepp2k

13

Вам понадобится следующее:

  • Причина создания нового языка
  • Философия
  • Семантическое определение
  • Лексическое описание ваших токенов
  • Определение синтаксического анализа

Как ваш язык будет отличаться? Какова его миссия? Это функционально? Это объектно-ориентированный? Это мета-язык? Каковы его уникальные особенности? Что это даст миру, который не существует (или существует безобразно)? Как вы хотите изменить вещи? Это скомпилировано или интерпретировано? DSL или язык общего назначения? Это ваша философия и много диктует дизайн вашего языка.

Затем, работа над вычеркиванием грубого синтаксиса и семантики на бумаге. Это будет ваше семантическое определение ... написание фальшивого кода - отличный способ развить ваши мысли. Прочитайте «Язык программирования C», чтобы увидеть отличный пример того, как это делается. Играть с этим.

Затем вам нужно будет каким-то образом определить ваши токены и синтаксис. Затем программы превращают их в автоматы, способные считывать строки и обрабатывать синтаксис. Yacc и Bison используют регулярные выражения и синтаксис в стиле BNF для лексического и синтаксического анализа соответственно. Есть также инструменты, похожие на Yacc и Bison для других языков.

Вам также потребуется знание теории / компиляторов языка, чтобы знать, что НЕ нужно делать. Примерами могут служить неоднозначные грамматики, проблемы генерации и манипуляции AST и, как правило, упрощение жизни. Знание теории очень важно. Я хотел бы рассмотреть следующие вопросы:

Компиляторы: принципы, методы и инструменты (Dragon Book)
Современная реализация компилятора в C или Современная реализация компилятора в Java


1
+1 для философии, для DSL вы явно хотите определить домен здесь
jk.

8

В 99,9% случаев создание нового языка совершенно не нужно. Возврат инвестиций, скорее всего, будет крошечным, и вы просто потратите свое время.

Скорее всего, вы можете использовать Javascript в качестве восприимчивого языка сценариев, и для большинства языков уже есть парсеры. Вы также можете использовать другие языки сценариев, которые вам нравятся, если вы можете найти подходящий парсер для них. Внедрение их в вашу программу потребует гораздо меньше работы и будет иметь большую отдачу. Людям не нужно изучать другой язык, они просто должны изучать ваш API. Это гораздо лучшее решение.

Создание нового языка почти всегда плохо.


9
За исключением множества случаев, когда это не плохо. Создание ваших собственных простых DSL может быть очень полезным. Теперь создание вашего собственного языка общего назначения будет более соответствовать тому, что говорит ваш ответ.
ChaosPandion

@ChaosPandion, но многие языки уже преуспели в создании DSL, использующего код из этого языка (т. Е. В этом хорош ruby)
альтернатива

2
Я согласен с вашим ответом, но я считаю, что это не правильный ответ на этот вопрос. Я считаю, что спрашивающий смотрит на общие принципы создания скриптового языка, а не на плюсы / минусы его создания.
Тим Мерфи

Создание нового языка - почти всегда лучшее решение. en.wikipedia.org/wiki/Language-oriented_programming
SK-logic

3

Вы можете описать грамматику вашего языка в BNF .

Например, это грамматика Python .


6
Однако самой грамматики недостаточно, чтобы реализовать язык. Он также должен будет указать семантику так или иначе.
sepp2k

0

если вы используете .NET, вот кое-что, с чем я столкнулся некоторое время назад. Я только взглянул на него с любопытством, но, может быть, он тебе пригодится: ирония .

Irony - это набор разработчика для реализации языков на платформе .NET.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.