Есть ли персонализированный язык программирования, который вы можете использовать для преобразования в другие?

13

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

Например, вы должны выбрать конкретные конфигурации, такие как «индексированные блоки Python», [a,b,c]инициализировать массивы, ^для возведения в степень и другие. Скрипт конвертирует его в эквивалент выбранного вами языка.

Dokkat
источник
1
Я надеюсь, что нет. TIMTOWTDI, возможно, плохо, но «придумать столько несовместимых способов, сколько вы хотите» определенно будет иметь те же недостатки, что и сотни, и быть даже менее полезным. DSL-ы иногда стоят того, но переосмысливают половину синтаксиса (или, что еще хуже, меняют два оператора, давая очевидную совместимость, но разную семантику) просто ради этого ...
Я спрашиваю об этом, потому что конкретно я программирую на javascript и очень, очень хотел бы иметь возможность установить несколько синтаксических сахаров в моем коде, но язык просто не позволяет этого. Даже перегрузка оператора невозможна.
Dokkat
2
В некоторой степени то, что вы описываете, звучит как макросы препроцессора . Теперь, если бы у нас была похожая функция для Perl ...
Яннис
5
@Dokkat: Пожалуйста, обновите вопрос, чтобы указать, что речь идет о JavaScript. Вопрос - как и задавали - это кошмар обслуживания и поддержки. Добавление нового синтаксиса к существующему языку (или использование препроцессора для изменения вашего частного языка на публичный) действительно ужасно. Тем не мение. Если вы перечислите конкретные проблемы с сахаром синтаксиса JavaScript, вы можете получить конкретную помощь.
S.Lott
3
Эти «персонализированные языки программирования» обычно называют «доменными языками» или DSL.
Майкл Диллон

Ответы:

14

Да, но, вероятно, не так, как вы думаете.

Lisp и его родственники имеют мощные макросистемы, которые позволяют вам выполнять произвольные преобразования в вашем источнике, поэтому в принципе вы можете использовать макросы (и макросы читателей на уровне символов) для создания практически любых расширений, которые вам нравятся. Конкатенационные языки (и языки авторов в смежных областях) имеют потенциал для аналогичной способности метапрограммирования . Хорошим примером этого является Forth , в котором множество синтаксических конструкций (таких как комментарии) могут быть определены пользователем. В современном неэзотерическом примере предпринята попытка улучшить Perl 6 по сравнению с Perl 5 для пользовательского синтаксиса .

Джон Перди
источник
8
Я почему-то знал, что Perl будет (частью) ответом. Я предполагаю, что макросы препроцессора C также в некоторой степени соответствуют описанию.
Яннис
Также может быть полезна перегрузка операторов в C ++. Привет мир пример приходит на ум. cout << "Привет";
Лорд Тидус
@LordTydus: Действительно, и даже просто перегрузка операторов позволяет вам сделать немного магии за разумный интерфейс. Было бы хорошо, если бы C ++ имел более общие возможности перегрузки, скажем, перегрузки operator[]для нескольких аргументов или введения новых операторов, как в Haskell; но я сомневаюсь, что комитет увидит прошлые проблемы разбора.
Джон Пурди
3

Походит на концептуальное программирование .

Я не знаком с этим, но XL - язык, разработанный специально для него.

XL имеет программируемый реконфигурируемый синтаксис и семантику. Подключаемые модули компилятора могут использоваться для добавления новых функций в язык.

Lisp и Forth также поддерживают концептуальное программирование, хотя и меньше, чем XL. Я предлагаю Лисп, так как это очень практично и эффективно. Самым важным является ясный и гибкий синтаксис, а не нотация, которую предоставляет Lisp.


Например, вы бы выбрали определенные конфигурации, такие как «индексированные блоки Python», «[a, b, c]» инициализируют массивы, «^» для возведения в степень и другие.

Вас может заинтересовать такой язык, как Haskell, который имеет очень гибкий, но унифицированный синтаксис.

Pubby
источник
Это то, что я искал.
Dokkat
2

Не в моих знаниях.

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

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

В результате Lisps, как правило, особенно популярны для реализации DSL. Хорошим примером является DSL для доступа к данным в Clojure (Korma), который заботится обо всем шаблонном коде, необходимом для доступа к базе данных.

mikera
источник
2

Scala часто используется таким образом для создания DSL, специфичных для домена языков.

Главным образом это происходит потому, что в Scala нет операторов, а синтаксис вызова метода Scala может быть сокращен. Например:

5 является целочисленным объектом. Для расчета 5 плюс 7 вы можете написать

val ans = 5.add (7) за исключением того, что метод сложения на самом деле называется «+», поэтому вы должны написать:

val ans = 5. + (7), но в Scala вам не нужно включать «.» в вызовах методов или в скобках "()" вокруг аргументов, чтобы вызвать метод + объекта 5, вы должны написать

val ans = 5 + 7, что прекрасно работает, потому что в Scala нет операторов, которые могли бы помешать вашей умной схеме именования методов. Теперь распространите эту идею на ваши собственные классы и объекты, включая тот факт, что вы можете «переопределить» такие методы, как +, а также создать свои собственные методы с именами >>> или ::! или @ * @, или просто текстовые имена, такие как fancify.

Майкл Диллон
источник
Это круто. Я посмотрю на скале.
Dokkat
1

Не говоря уже о том, что вы должны использовать его, так как он все еще в основном экспериментальный, но одной интересной недавней парадигмой программирования является языковое программирование (LOP).

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

Сергей Дмитриев объясняет это более подробно .

Это идеология этого, но практически сводится к тому, что он поддерживает поведение, которое вы просите. Вы можете:

  • Расширить существующий язык.
  • Составьте разные языки.
  • Используйте существующий «язык преобразования», чтобы преобразовать вновь определенные ключевые слова в базовый язык.

Самая активная среда программирования, о которой я знаю, следуя этой парадигме, - это бесплатная система метапрограммирования (MPS) от JetBrains.

На самом деле он начинает использоваться и в коммерческом программном обеспечении, так что, возможно, он начинает выходить из своей «экспериментальной» фазы:

  • Realaxy - редактор ActionScript, полностью построенный на основе MPS. Используя возможности LOP, они смогли реализовать, например, замыкания для AS3.
  • mbeddr C - это расширяемый язык C, основанный на MPS.
Стивен Джеурис
источник
1

Специфичные для домена языки широко используются в сообществе Tcl. Например, нет ничего необычного в том, чтобы видеть программу Tcl, которая содержит и C, и SQL как встроенные DSL (через пакеты Critcl и Sqlite). Единственное ограничение для встроенного DSL состоит в том, что гораздо лучше, если встроенный язык уравновешивает свои фигурные скобки, и на практике это оказывается действительно необременительным требованием!

Еще одним языком, облегчающим работу с DSL, является Standard ML, который позволяет вам иметь доступ к необработанным токенам из универсального системного токенайзера (до момента, когда идентификаторы преобразуются в ключевые слова). Это облегчает создание широкого класса DSL - при условии, что они подчиняются некоторым основным синтаксическим правилам SML, особенно в отношении комментариев, строк и границ токенов - и фактически активно используется в ряде ключевых движущих приложений для языка (доказательство теорем и т. д.)

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

Donal Fellows
источник
0

AFAIU вы ищете языки, которые могут помочь вам написать свой собственный DSL (предметно-ориентированный язык). Есть много хороших кандидатов. Лично я бы порекомендовал Ruby или Io, потому что они предлагают 1) простую перегрузку операторов, 2) метапрограммирование и 3) механизмы отката, method_missingкоторые вы можете использовать для создания своего собственного API. Например, взгляните на sqldsl , DSL, написанный на Ruby, который генерирует SQL, читая код Ruby.

sakisk
источник
0

Я на самом деле не использовал его как таковой, но, если я правильно помню, TXL специально разработан для перевода исходного кода. Таким образом, вы должны иметь возможность использовать его, чтобы указать, как переводить с вашего языка и / или языковых расширений на любой целевой реальный язык.

Кажется, у него есть грамматика для Javascript. Но, не используя его раньше, я не уверен, как именно это поможет вам.

mootinator
источник
0

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

отметка
источник
Вот некоторые ссылки: СОДЕРЖАНИЕ PPWIZARD (официальные документы), PPWizard - EDM2 (внешний реф). Инструмент мощный, но его документацию нелегко прочитать (возможно, из-за его мощности).
Вольф
0

Может быть, вы ищете компилятор компилятора. Компилятор компилятора берет определение языка, написанное на формальном языке, и создает компилятор для этого языка.

Взгляните на http://en.wikipedia.org/wiki/Compiler-compiler

Оливье Жако-Дескомб
источник
0

Одним из распространенных способов частичной персонализации языка программирования является использование макропроцессора. Например, вы можете запустить «dokkat-lang» через препроцессор C, прежде чем помещать результат в какую-либо среду javascript для его загрузки.

Сколько вы можете сделать, зависит от сложности вашего препроцессора. Обратите внимание, что ранние версии C ++, Objective C и различных экспериментальных языков были сделаны путем предварительной обработки исходного кода перед передачей в стандартный набор инструментов компилятора C.

hotpaw2
источник