Что касается функций в таких языках, как ruby (и javascript), которые позволяют программисту расширять / переопределять классы в любое время после его определения (включая классы, такие как String), теоретически выполнимо разработать язык, который позволит программам впоследствии расширяться его семантика.
Пример: Ruby не допускает множественное наследование, но я могу расширить / переопределить поведение языка по умолчанию, чтобы разрешить реализацию множественного наследования.
Есть ли другие языки, которые позволяют это? Является ли это предметом беспокойства для языковых дизайнеров? Если посмотреть на выбор использования ruby для создания инфраструктуры rails для разработки веб-приложений, такие языки могут оказаться очень мощными, чтобы позволить проектировать платформы (или DSL) для самых разных приложений.
источник
@Nullable
и@NonNull
которые используются внешними контролерами, такими как findbugs.Ответы:
У Converge есть довольно внушительные средства метапрограммирования.
это шаг вперед по сравнению с гигиеническими макросами Scheme, которые позволяют ссылочно прозрачные определения макросов.
Такие механизмы, как квазилитералы , позволили создавать и деструктурировать деревья синтаксического анализа в других языках, но они чаще используются для взаимодействия с предметно-ориентированными языками (DSL), а не для самоизменения.
Размышления Newspeak позволяют реализовывать исключения в виде библиотечного кода.
Perligata: Романа демонстрирует, как совершенно новый синтаксис можно привязать к языку.
Возможно не являющийся семантически значимым, PyPy является генератором интерпретатора для языков, семантика которых указана в высоко статически анализируемом подмножестве Python, и они используют его для экспериментов с новыми языковыми конструкциями в Python, такими как добавление thunks в язык.
Также интерес может быть омета .
Диссертация Алекса Варта демонстрирует использование Ometa для определения существенно новой семантики (транзакционной семантики через миры) в JavaScript + Ometa.
источник
«Это теоретически возможно? *
Новый язык может все еще работать медленно, если его модель времени выполнения значительно отличается от языка реализации. В этом случае биты интерпретатора будут отображаться в переведенном коде, и он будет продолжать работать медленно. Однако, если новый язык в основном такой же, как и исходный язык, только с несколькими изменениями, то должна быть возможность исключить большинство битов интерпретатора в целевом коде путем тщательной настройки частичной оценки. Тогда удар по производительности будет только для новых функций.
По сути, это технология «виртуализации» для языков программирования.
источник
Исторически Lisp был первым основным языком программирования, который представил средства метапрограммирования. Макросистема Lisp позволяет программисту определять новые управляющие структуры, новые шаблоны данных и т. Д. Например, Common Lisp Object System может быть полностью определена с помощью макросов выше основного языка, который ничего не знает об объектах или классах. Макросистема также позволяет определять языки, специфичные для предметной области .
Ruby получил много вдохновения от Lisp, в том числе от его способности к отражению и метапрограммированию. Многие языки с динамической типизацией черпали вдохновение в этом отношении от Lisp. (Статическая типизация усложняет ситуацию, потому что многие расширения не вписываются в исходную систему типов.)
источник
Еще не упоминается в ответах / комментариях:
опрос:
Аннотация: Расширяемые языки - это языки программирования, которые позволяют пользователю изменять или добавлять синтаксис и связывать новые синтаксические формы с семантикой. Для чего эти языки хороши? Какие функции легко добавить, а какие нет? Они достаточно сильны, чтобы воспринимать их всерьез? В этом обзоре мы попытаемся ответить на такие вопросы, как мы рассматриваем процедурные, объектно-ориентированные, функциональные и расширяемые языки общего назначения. Нас в первую очередь интересуют выразительная сила (регулярная, без контекста), связанные с этим предостережения (негигиеничность, неоднозначность) и простота использования различных механизмов.
и
Аннотация: способность расширять язык новыми синтаксическими формами является мощным инструментом. Достаточно гибкая система макросов позволяет программистам строить из общей базы язык, разработанный специально для их проблемной области. Однако макроэкономические средства, которые являются интегрированными, способными и в то же время достаточно простыми для широкого использования, на сегодняшний день ограничены семейством языков Lisp. В этой статье мы представляем макрос, называемый Java Syntactic Extender (JSE), с превосходной мощностью и простотой использования макросистем Lisp, но для Java - языка с более традиционным алгебраическим синтаксисом. ...
источник