Как мне написать спецификацию языка программирования?

16

Мне очень нравится дизайн языка программирования. Иногда я думаю, что мои языковые проекты и их потенциальные пользователи выиграют от всеобъемлющего документа по стандартам. Я смотрел на многие языковые стандарты, начиная от очень формального (C ++) до довольно неформального (ECMAScript), но я не могу понять, как мне разобраться и организовать такой документ, хотя я Я думаю, что я довольно хорошо разбираюсь в технических вопросах.

Должен ли я написать это как длинный учебник, или больше как формальный математический документ? Как мне поддерживать его в актуальном состоянии, если я разрабатываю его вместе с эталонной реализацией? Должен ли я просто отказаться и рассматривать реализацию и документацию как стандарт де-факто? Кроме того, действительно ли есть существенная выгода от наличия стандарта? Означает ли требование стандарта, что язык излишне сложен?

Джон Перди
источник
1
Вы уже читали доменные языки Мартина Фаулера? amazon.com/…
Гари Роу
@ Гари Роу: у меня нет. Это выглядит как достойное чтение, хотя, возможно, не совсем то, что я ищу.
Джон Перди
Преимущество стандарта перед эталонной реализацией состоит в том, что вы можете определить, где другие реализации могут отличаться от того, что делает ваша реализация.
Барт ван Инген Шенау

Ответы:

3

Я нашел спецификацию языка Java формальной и читабельной, и я думаю, что она имеет разумную структуру. Некоторые спецификации W3C также могут быть хорошими примерами.

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

Заголовок мозгового дампа: кодирование источника, лексирование, фундаментальные типы, литералы, операторы, выражения, простые операторы, условные выражения, циклы, функции (определения и вызовы), объявления типов, модули, модули компиляции, область видимости переменных, различные виды разрешения имен (например, импорт, методы), модель памяти, побочные эффекты, типизация, параллелизм…

Tobu
источник
Ваш список предложений очень полезен. Я думаю, что я собираюсь сделать мозговой штурм аналогичного списка, отсортировать его в виде учебника и написать краткую неформальную спецификацию с несколькими формальными дополнениями, такими как грамматика EBNF. Я также определенно посмотрю на спецификации, которые вы упомянули для идей.
Джон Перди
7

Читайте лоты и будьте проще

Создать новый язык сложно. Действительно трудно. Но в конечном итоге очень приятно, если он становится популярным и действительно решает проблему, с которой люди элегантно сталкиваются.

Как я уже упоминал в комментариях, я бы посоветовал вам прочитать доменные языки Мартина Фаулера по следующим причинам:

  1. Он углубляется в практическую глубину о том, почему вы должны разработать язык
  2. Есть подробности о том, как это сделать (парсеры, лексические анализаторы, языковые рабочие места и т. Д.)
  3. Существуют подробные инструкции по реализации того, как выбранный вами синтаксис может быть использован для обработки таких понятий, как замыкания, аннотации, литеральные списки, динамический прием и т. Д.

Что касается того, как написать свою спецификацию, подумайте о своей аудитории. Очевидно, что перед тем, как приложить палец к клавиатуре, чтобы разработать свой язык, вы должны тщательно продумать, для чего он предназначен.

Если это новый интерпретируемый язык, который заменит JavaScript, то вам понадобится очень лаконичный подход, чтобы привлечь веб-разработчиков с ограниченным объемом внимания и стремлением к немедленным результатам - или быстрее, если это возможно.

Если он будет использоваться в следующей миссии на Титане, то минимальные начальные уровни будут иметь чрезвычайно подробные спецификации, показывающие точные формальные доказательства поведения каждого компонента.

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

Короче говоря, будьте проще, и больше людей будут его использовать.

Гэри Роу
источник
Спасибо за это. У меня большой опыт в разработке языков и даже довольно тщательном их документировании, но это идея стандарта, которая постоянно меня привлекает. Возможно, мне просто нужно выбрать рекомендуемое чтение и немного поэкспериментировать.
Джон Перди
@Jon Purdy У вас есть примеры языков в Интернете, которые вы могли бы включить в вопрос?
Гари Роу
У меня пока нет примеров моего текущего проекта. Единственный действительно полный публичный пример языка, который я сделал (который я действительно использую!), Находится по адресу vision-language.sourceforge.net/cgi-bin/Home
Jon Purdy
@Jon Purdy Vision выглядит интересно - своего рода стремительная скорость. Кроме того, вы можете рассмотреть скриншот YouTube, показывающий, как его установить, и написать пример небольшого веб-сайта (скажем, для местного водопроводчика). Это значительно облегчит процесс обучения, поскольку люди смогут увидеть его в действии и сразу же воспользоваться преимуществами. Вы можете обсудить преимущества по сравнению с JSP, Velocity, ASP.Net, Freemarker и т. Д.
Гари Роу
Это хорошая идея; В последнее время я много снимаю видео на YouTube (около трех в неделю), поэтому думаю, что определенно смогу подойти к нему.
Джон Пурди,
3

Вирт спроектировал и реализовал множество языков программирования: из них спецификации для языков Oberon и Oberon2 отличаются полнотой, краткостью и удобочитаемостью.

grrussel
источник
2

Common Lisp и Haskell имеют языковые стандарты. Ruby и Python имеют реализации и документацию. Поэтому я бы сказал, что языковой стандарт не нужен, но он может быть полезен, если вы ожидаете, что будет несколько реализаций языка, который вы разрабатываете. С другой стороны, стандарт преждевременен, если вы ожидаете значительных изменений в определении языка.

Ларри Коулман
источник
На самом деле, в Ruby есть две вещи, которые можно считать «спецификациями». Существует спецификация ISO Ruby, которая в настоящее время находится в состоянии Final Draft и которую пишут некоторые люди, имеющие опыт работы со спецификациями языка (работавшие над ANSI Common Lisp и ISO C ++). И есть проект RubySpec, который представляет собой набор исполняемых примеров в стиле RSpec, формирующих как удобочитаемую спецификацию, так и машиноисполняемый пакет тестирования соответствия для этой спецификации.
Йорг Миттаг
1

любая спецификация должна быть краткой и способной выдержать испытание временем

Вот почему вы видите абстракцию, подобную BNF, используемую для многих языковых стандартов ... она лаконична и будет понятна еще долго после того, как многие из наших нынешних инструментов останутся позади.

Конечно, это больше, чем просто грамматика. посмотрите, что сделали другие ... perl6, схема, C ... они решают проблемы, о которых также заботится разработчик.

Брэд Клоузи
источник