Чи може мова програми бути досить плавним, щоб програма могла розширити семантику мови


15

З посиланням на особливості таких мов, як рубін (і javascript), які дозволяють програмісту розширювати / переосмислювати класи в будь-який час після його визначення (включаючи класи типу String), чи теоретично доцільно розробити мову, яка дозволить програмам згодом розширювати його семантика.

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

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


2
Чи вважаєте ви гігієнічні макроси схеми семантичного розширення або відображення нової мови, які дозволяють застосовувати винятки як код бібліотеки? Що з синтаксичними розширеннями типу Perligata: Romana ?

Це, здається, питання, яке вимагає списку мов, а не понять. До редагувань, що змінюють напрямок питання, я практично голосую за закриття як офтопік.
Рафаель

Якщо я добре пам'ятаю, навіть Java збирається отримати функції, які дозволяють програмам розширювати систему типів.
Рафаель

1
@Raphael, ти думаєш про JSR 305 ? Анотації на Java розробляв (частково) Гілад Брача, який розробив Newspeak, який я зв'язав у своїй відповіді нижче, а також підтримував системи підключення типу плагінів . JSR типу 305 поставляє системні анотацій подобаються @Nullableі @NonNullякі використовуються зовнішніми шашками , як FindBugs.
Майк Самуель

Незрозуміло, що розуміється під "розширенням своєї семантики". Якщо я дивлюся на Boost.Spirit , це вже переступає мій особистий поріг "розширення семантики": Математичні оператори C ++ використовуються для опису мовного синтаксису, який потім компілятор перетворюється на аналізатор зазначеної мови. Я знаю, що це не те, що мається на увазі під «розширенням семантики мови» лабораторними щурами, але я думаю, що це досить вражає.
DevSolar

Відповіді:


12

Конвергент має кілька вражаючих засобів метапрограмування.

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

що є кроком до гігієнічних макросів схеми, які дозволяють референтно прозорі макроозначення.

Такі механізми, як квазілітераль , дозволяють побудувати та знищити дерева розбору іншими мовами, але вони частіше використовуються для взаємодії з доменними мовами (DSL) замість самомодифікації.


Рефлексія Newspeak дозволяє винятки реалізувати як код бібліотеки.

7.6 Поводження з винятками

Оскільки Newspeak забезпечує рефлексивний доступ (7.2) до записів активації (3.6), обробка виключень - це суто бібліотечна проблема. Платформа забезпечить стандартну бібліотеку, яка підтримує викидання, виловлювання та відновлення винятків, як у Smalltalk.


Perligata: Romana демонструє, як цілком новий синтаксис може бути перетворений на мову.

У цьому документі описаний модуль Perl - Lingua :: Romana :: Perligata - що дозволяє писати програми Perl латиною.


Імовірно, не є семантично значущим, PyPy є генератором інтерпретаторів для мов, семантика яких визначена у високостатично аналізованому підмножині Python, і вони використовують його для експерименту з новими мовними конструкціями в Python, як додавання мов до мови.


Також цікавим може бути Омета .

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

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

Дисертація Алекса Уорта демонструє використання Ometa для визначення значно нової семантики (трансакційної семантики через світи) в JavaScript + Ometa.


8

"Чи теоретично це можливо? *

LS

L

SL

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

По суті, це технологія "віртуалізації" для мов програмування.


6

Історично склалося, що Лісп був першою великою мовою програмування, яка запровадила засоби метапрограмування. Макросистема Lisp дозволяє програмісту визначати нові структури управління, нові шаблони даних тощо. Наприклад, загальну систему об'єктів Lisp можна визначити повністю за допомогою макросів над основною мовою, яка нічого не знає про об'єкти чи класи. Макросистема також дозволяє визначити мови, що залежать від домену .

Рубі отримала багато натхнення від Lisp, включаючи його здатність до відбиття та метапрограмування. Багато мов, що динамічно вводяться, взяли натхнення у Ліспа в цьому відношенні. (Статичний набір тексту ускладнює речі, оскільки багато розширень не вписуються в систему оригінального типу.)


4

Ще не згадується у відповідях / коментарях:

опитування:

Анотація: розширювані мови - це мови програмування, які дозволяють користувачеві змінювати або додавати синтаксис, а також пов'язувати нові синтаксичні форми з семантикою. Для чого ці мови корисні? Які функції можна легко додати, а які - ні? Вони достатньо потужні, щоб їх сприймати серйозно? У цьому опитуванні ми спробуємо відповісти на такі питання, як ми вважаємо процедурні, об’єктно-орієнтовані, функціональні та загальнозміцнюючі мови, що розширюються. Нас насамперед цікавить експресивна сила (регулярна, без контексту), пов'язані з ними застереження (негігієнічність, неоднозначність) та простота використання різних механізмів.

і

Анотація: Можливість розширити мову новими синтаксичними формами є потужним інструментом. Досить гнучка макросистема дозволяє програмістам будувати від загальної бази до мови, розробленої спеціально для їх проблемної області. Однак макро-засоби, які є інтегрованими, здатними, і в той же час досить простими для широкого використання, на сьогодні були обмежені сімейством мов Lisp. У цьому документі ми представляємо макросхему, що називається Java Syntactic Extender (JSE), з найкращою потужністю та простотою використання макросистем Lisp, але для Java - мовою з більш звичайним алгебраїчним синтаксисом. ...


1
Будь ласка, напишіть одне або два узагальнюючі пропозиції для кожної літератури; чисті колекції посилань майже ніколи не є "хорошими" відповідями.
Рафаель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.