Может ли язык программы быть достаточно гибким, чтобы позволить программам расширять семантику языка

15

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

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

Есть ли другие языки, которые позволяют это? Является ли это предметом беспокойства для языковых дизайнеров? Если посмотреть на выбор использования ruby ​​для создания инфраструктуры rails для разработки веб-приложений, такие языки могут оказаться очень мощными, чтобы позволить проектировать платформы (или DSL) для самых разных приложений.

sandeepkunkunuru
источник
2
Считаете ли вы семантическими расширениями гигиенические макросы Схемы или отражение новостного пика, которые позволяют реализовывать исключения в виде библиотечного кода? А как насчет синтаксических расширений, таких как Perligata: Romana ?
Похоже, это вопрос, требующий списка языков, а не понятий. В ожидании изменений, меняющих направление вопроса, я практически голосую за закрытие оффтопа.
Рафаэль
Если я правильно помню, даже Java получит функции, позволяющие программам расширять систему типов.
Рафаэль
1
@ Рафаэль, ты думаешь о JSR 305 ? Java-аннотации были разработаны (частично) Гиладом Брачей, который разработал Newspeak, на который я ссылался в своем ответе ниже, а также отстаивал системы сменных типов . JSR 305 предоставляет системные аннотации типа, такие как @Nullableи @NonNullкоторые используются внешними контролерами, такими как findbugs.
Майк Самуэль,
Непонятно, что подразумевается под «расширением своей семантики». Если я посмотрю на Boost.Spirit , то он уже пересекает мой личный порог «расширения семантики»: вместо этого для описания синтаксиса языка используются математические операторы C ++, которые затем компилятор превращает в синтаксический анализатор для указанного языка. Я знаю, что это не означает "расширение семантики языка" лабораторными крысами, но я думаю, что это довольно впечатляет.
DevSolar

Ответы:

12

У Converge есть довольно внушительные средства метапрограммирования.

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

это шаг вперед по сравнению с гигиеническими макросами Scheme, которые позволяют ссылочно прозрачные определения макросов.

Такие механизмы, как квазилитералы , позволили создавать и деструктурировать деревья синтаксического анализа в других языках, но они чаще используются для взаимодействия с предметно-ориентированными языками (DSL), а не для самоизменения.


Размышления Newspeak позволяют реализовывать исключения в виде библиотечного кода.

7.6 Обработка исключений

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


Perligata: Романа демонстрирует, как совершенно новый синтаксис можно привязать к языку.

В этой статье описывается модуль Perl - Lingua :: Romana :: Perligata - который позволяет писать программы на Perl на латыни.


Возможно не являющийся семантически значимым, PyPy является генератором интерпретатора для языков, семантика которых указана в высоко статически анализируемом подмножестве Python, и они используют его для экспериментов с новыми языковыми конструкциями в Python, такими как добавление thunks в язык.


Также интерес может быть омета .

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

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

Диссертация Алекса Варта демонстрирует использование Ometa для определения существенно новой семантики (транзакционной семантики через миры) в JavaScript + Ometa.

Майк Самуэль
источник
8

«Это теоретически возможно? *

LS

L

SL

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

По сути, это технология «виртуализации» для языков программирования.

Удай Редди
источник
6

Исторически Lisp был первым основным языком программирования, который представил средства метапрограммирования. Макросистема Lisp позволяет программисту определять новые управляющие структуры, новые шаблоны данных и т. Д. Например, Common Lisp Object System может быть полностью определена с помощью макросов выше основного языка, который ничего не знает об объектах или классах. Макросистема также позволяет определять языки, специфичные для предметной области .

Ruby получил много вдохновения от Lisp, в том числе от его способности к отражению и метапрограммированию. Многие языки с динамической типизацией черпали вдохновение в этом отношении от Lisp. (Статическая типизация усложняет ситуацию, потому что многие расширения не вписываются в исходную систему типов.)

Жиль "ТАК - перестань быть злым"
источник
4

Еще не упоминается в ответах / комментариях:

опрос:

Аннотация: Расширяемые языки - это языки программирования, которые позволяют пользователю изменять или добавлять синтаксис и связывать новые синтаксические формы с семантикой. Для чего эти языки хороши? Какие функции легко добавить, а какие нет? Они достаточно сильны, чтобы воспринимать их всерьез? В этом обзоре мы попытаемся ответить на такие вопросы, как мы рассматриваем процедурные, объектно-ориентированные, функциональные и расширяемые языки общего назначения. Нас в первую очередь интересуют выразительная сила (регулярная, без контекста), связанные с этим предостережения (негигиеничность, неоднозначность) и простота использования различных механизмов.

и

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

Вор
источник
1
Пожалуйста, напишите одно или два обобщающих предложения для каждой ссылки; Чистые коллекции ссылок почти никогда не являются «хорошими» ответами.
Рафаэль