Com referência a recursos em linguagens como ruby (e javascript), que permitem que um programador estenda / substitua classes a qualquer momento após defini-la (incluindo classes como String), é teoricamente viável projetar uma linguagem que permita que os programas estendam posteriormente sua semântica.
ex: Ruby não permite herança múltipla, mas posso estender / substituir o comportamento padrão do idioma para permitir uma implementação de herança múltipla.
Existem outros idiomas que permitem isso? Isso é realmente um assunto de preocupação para designers de linguagem? Analisando a opção de usar o ruby para construir a estrutura de trilhos para o desenvolvimento de aplicativos da Web, essas linguagens podem ser muito poderosas para permitir o design de estruturas (ou DSLs) para uma ampla variedade de aplicações.
fonte
@Nullable
e@NonNull
que são usadas por verificadores externos como findbugs.Respostas:
O Converge possui algumas instalações de meta-programação bastante impressionantes.
que é um passo em frente às macros higiênicas do Scheme que permitem definições de macro referencialmente transparentes.
Mecanismos como os quase-liberais permitiram a construção e a desestruturação de árvores de análise em outros idiomas, mas esses são mais frequentemente usados para interagir com linguagens específicas de domínio (DSLs) em vez de se auto-modificar.
A reflexão do Newspeak permite que exceções sejam implementadas como código de biblioteca.
Perligata: Romana demonstra como uma sintaxe totalmente nova pode ser aplicada em um idioma.
Indiscutivelmente sem semanticamente significativo, o PyPy é um gerador de intérpretes para linguagens cuja semântica é especificada em um subconjunto altamente analisável estaticamente do Python, e eles o usam para experimentar novas construções de linguagem no Python, como adicionar thunks à linguagem.
Também pode ser interessante Ometa .
A dissertação de Alex Warth demonstra o uso de um Ometa para definir significativamente semântica nova (semântica transacional via mundos) em JavaScript + Ometa.
fonte
"É teoricamente viável? *
O novo idioma ainda poderá ser executado lentamente se seu modelo de tempo de execução for significativamente diferente do idioma de implementação. Nesse caso, os bits do intérprete aparecerão no código traduzido e continuará lento. No entanto, se o novo idioma for basicamente o mesmo que o idioma original, com apenas alguns ajustes, será possível eliminar a maioria dos bits do interpretador no código de destino, ajustando cuidadosamente a avaliação parcial. Em seguida, o desempenho atingirá apenas os novos recursos.
Com efeito, esta é a tecnologia de "virtualização" para linguagens de programação.
fonte
Historicamente, o Lisp foi a primeira linguagem de programação importante a introduzir instalações de metaprogramação. O sistema de macro do Lisp permite que o programador defina novas estruturas de controle, novos modelos de dados etc. Por exemplo, o Common Lisp Object System pode ser definido inteiramente com macros acima de uma linguagem principal que não sabe nada sobre objetos ou classes. O sistema de macro também permite a definição de idiomas específicos do domínio .
Ruby se inspirou bastante no Lisp, incluindo sua capacidade de refletividade e metaprogramação. Muitas linguagens de tipo dinâmico se inspiraram no Lisp a esse respeito. (A digitação estática complica as coisas, porque muitas extensões não se encaixam no sistema de tipos original.)
fonte
Ainda não mencionado nas respostas / comentários:
a pesquisa:
Abstrato: Linguagens extensíveis são linguagens de programação que permitem ao usuário modificar ou adicionar sintaxe e associar as novas formas sintáticas à semântica. Para que servem esses idiomas? Que tipos de recursos são fáceis de adicionar e quais não são? Eles são poderosos o suficiente para serem levados a sério? Nesta pesquisa, tentaremos responder a perguntas que consideremos linguagens extensíveis procedimentais, orientadas a objetos, funcionais e de uso geral. Estamos interessados principalmente em poder expressivo (regular, sem contexto), advertências associadas (sem higiene, ambiguidade) e facilidade de uso dos vários mecanismos.
e
Resumo: A capacidade de estender uma linguagem com novas formas sintáticas é uma ferramenta poderosa. Um sistema macro suficientemente flexível permite que os programadores construam a partir de uma base comum em direção a uma linguagem projetada especificamente para o domínio do problema. No entanto, os recursos de macro integrados, capazes e ao mesmo tempo simples o suficiente para serem amplamente utilizados foram limitados à família de idiomas Lisp até o momento. Neste artigo, apresentamos um recurso de macro, chamado Java Syntactic Extender (JSE), com o poder superior e a facilidade de uso dos sistemas de macro Lisp, mas para Java, uma linguagem com uma sintaxe algébrica mais convencional. ...
fonte