Чи є персоналізована мова програмування, яку ви можете використовувати для перетворення на інші?


13

Чи існує мова програмування, в якій ви можете встановити власні конфігурації синтаксису, і вона перетворить код на обрану вами мову?

Наприклад, ви вибрали б конкретні конфігурації, такі як "індексовані блоки Python", [a,b,c]ініціалізує масиви ^для експоненції та інші. Сценарій перетворив би його в еквівалент вашої мови вибору.


1
Я впевнений, що ні. TIMTOWTDI - це, мабуть, погано, але "вигадуйте стільки несумісних способів, скільки хочете", безумовно, мали б однакові стократні сторони, і були б ще менш корисними. DSL іноді того варті, але переосмислення половини синтаксису (або ще гірше - заміна двох операторів, що дає очевидну сумісність, але різну семантику) тільки для

Я запитую це, тому що специфічно я програмую на JavaScript, і мені дуже хотілося б встановити кілька синтаксичних цукрів на моєму коді, але мова просто не дозволить цього. Неможливо навіть перевантаження оператора.
Dokkat

2
Певною мірою те, що ви описуєте, звучить як макроси препроцесора . Тепер якби ми могли мати подібну функцію для perl ...
yannis

5
@Dokkat: Будь ласка, оновіть питання, щоб конкретно вказати, що мова йде про JavaScript. Питання - як задається - це кошмар у підтримці та підтримці. Додавання нового синтаксису до існуючої мови (або використання попереднього процесора для зміни вашої приватної мови на публічну) - це справді жахливо. Однак. Якщо ви перерахуєте конкретні проблеми із синтаксисом цукру JavaScript, ви можете отримати конкретну допомогу.
С.Лотт

3
Ці "персоналізовані мови програмування" зазвичай називають "доменними мовами" або DSL.
Майкл Діллон

Відповіді:


14

Так, але, мабуть, не так, як ти думаєш.

У Lisp та його родичів є потужні макросистеми, які дозволяють виконувати довільну трансформацію у своєму джерелі, тому в принципі ви можете використовувати макроси (і макроси читачів на рівні символів) для створення будь-яких розширень, які вам подобаються. Мови конкатенації (і мови авторів у суміжних областях) мають потенціал для подібної сили метапрограмування . Хорошим прикладом цього є Forth , в якому безліч синтаксичних конструкцій (таких як коментарі) можна визначити користувачем. Для сучасного, неезотеричного прикладу, ми намагаємось надати Perl 6 покращену підтримку Perl 5 для визначеного користувачем синтаксису .


8
Я якось знав, що Perl буде (частиною) відповіддю. Я думаю, що макроси C попереднього процесу також підходять до опису.
янніс

Також може бути непоганим перевантаження оператора в C ++. Привіт привіт світу приходить на думку. cout << "Привіт";
Лорд Тидус

@LordTydus: Дійсно, і навіть просто перевантаження оператора дозволяє зробити трохи чарів за розумним інтерфейсом. Було б добре, якби C ++ мав більш загальні можливості перевантаження, скажімо, перевантаження operator[]для декількох аргументів або введення нових операторів, як у Haskell; але я сумніваюся, що комітет побачив проблеми розбору.
Джон Перді

3

Звучить як концептуальне програмування .

Я з ним не знайомий, але XL - це спеціально розроблена мова для нього.

XL має синтаксис і семантику, налаштовану програмістом. Для додавання нових функцій до мови можна використовувати додатки компілятора.

Lisp і Forth також підтримують концептуальне програмування, хоча менше, ніж XL. Я пропоную Лісп як дуже практичний та ефективний. Найголовніше - це чіткий і гнучкий синтаксис, а не позначення, яке надає Лісп.


Наприклад, ви вибрали б конкретні конфігурації, такі як "індексовані блоки Python", "[a, b, c]" ініціалізує масиви, "^" для експоненції та інші.

Вас може зацікавити така мова, як Haskell, яка має дуже гнучкий, але однорідний синтаксис.


Це те, що я шукав.
Dokkat

2

Не наскільки мені відомо.

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

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

Як результат, Lisps, як правило, особливо популярний для впровадження DSL. Хороший приклад - це DSL доступу до даних у Clojure (Корма), який піклується про всі кодові шаблони, необхідні для доступу до бази даних.


2

Scala часто використовується таким чином для створення DSL-файлів, мов, визначених для домену.

В основному це відбувається через те, що у Scala немає операторів, а синтаксис виклику методу Scala можна скоротити. Наприклад:

5 - об'єкт Integer. Для обчислення 5 плюс 7 ви могли написати

val ans = 5.add (7), за винятком того, що метод додавання насправді називається "+", тому ви б написали:

val ans = 5. + (7), але в Scala вам не потрібно включати "." у викликах методу або в дужках "()" навколо аргументів, щоб викликати метод + на об'єкті 5, ви б написали

val ans = 5 + 7, що ідеально працює, оскільки Scala не має операторів, які б втручалися у вашу розумну схему іменування методів. Тепер поширюйте цю ідею на власні класи та об’єкти, включаючи те, що ви можете "переосмислити" методи типу +, а також створити свої власні методи з іменем >>> або ::! або @ * @ або просто прості текстові імена, на кшталт фантазії.


Це круто. Я погляну на шкалу.
Dokkat

1

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

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

Сергій Дмитрієв пояснює це детальніше .

Це ідеологія цього, але практично зводиться до того, що він підтримує поведінку, про яку ви просите. Ти можеш:

  • Розширити існуючу мову.
  • Складайте різні мови.
  • Використовуйте існуючу "мову перетворення", щоб перетворити нові ключові слова в основну мову.

Найактивніше середовище програмування, яке я знаю після дотримання цієї парадигми, - це безкоштовна система програмування мета (MPS) від JetBrains.

Він фактично починає використовуватися і в комерційному програмному забезпеченні, тому, можливо, він починає виходити з «експериментальної» фази:

  • Realaxy - це редактор сценаріїв дій, повністю побудований поверх MPS. Використовуючи потужність LOP, вони змогли реалізувати, наприклад, закриття для AS3.
  • mbeddr C - розширювана мова C, заснована на MPS.

1

Мови, що стосуються домену, досить часто використовуються у спільноті Tcl. Наприклад, зовсім не рідко бачити програму Tcl, яка містить як C, так і SQL як вбудовані DSL (через пакети Critcl і Sqlite). Щодо єдиного обмеження на вбудований DSL - це те, що набагато краще, якщо вбудована мова врівноважує свої фігурні фігурні дужки, і це виявляється справді не обтяжливою вимогою на практиці!

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

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


0

AFAIU Ви шукаєте мови, які допоможуть Вам написати свій DSL (Language Specific Language). Є багато хороших кандидатів. Особисто я б рекомендував Ruby або Io, оскільки вони пропонують 1) просту перевантаження оператора, 2) метапрограмування та 3) резервні механізми, подібні до method_missingтих, які можна використовувати для створення власного API. Наприклад, подивіться у sqldsl , DSL, написаний на Ruby, який генерує SQL, читаючи Ruby-код.


0

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

Схоже, граматика доступна для Javascript. Але, не використовуючи його раніше, я не впевнений, як саме це допоможе вам.


0

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


тут декілька посилань: ЗМІСТ ППВІЗАРД (офіційні документи), PPWizard - EDM2 (зовнішня довідка ). Інструмент потужний, але його документацію читати непросто (можливо, завдяки його потужності).
Вовк


0

Одним із поширених способів часткової персоналізації мови програмування є використання попереднього процесора макросу. Наприклад, ви можете запустити "dokkat-lang", хоча препроцесор C перед тим, як ставити результат, де якесь середовище javascript буде завантажувати його.

Скільки ви можете зробити, залежить від витонченості вашого препроцесора. Зауважте, що ранні версії C ++, Цілі C та різних експериментальних мов були виконані шляхом попередньої обробки вихідного коду перед подачею до інструментальної ланцюжка компілятора запасів C.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.