Uma linguagem de programa pode ser maleável o suficiente para permitir que os programas estendam a semântica da linguagem


15

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.


2
Você conta como extensões semânticas as macros higiênicas do Scheme ou o reflexo do jornal que permitem que as exceções sejam implementadas como código da biblioteca? E quanto a extensões sintáticas como Perligata: Romana ?

Parece ser uma pergunta pedindo uma lista de idiomas, e não de conceitos. Enquanto as edições pendentes mudam a direção da pergunta, voto praticamente para fechar como offtopic.
Raphael

Se bem me lembro, até o Java obterá recursos que permitem que os programas estendam o sistema de tipos.
Raphael

11
@Raphael, você está pensando em JSR 305 ? As anotações em Java foram projetadas (em parte) por Gilad Bracha, que projetou o Newspeak, que eu vinculei na minha resposta abaixo e também defendeu sistemas do tipo plugável . O JSR 305 fornece anotações de sistema do tipo como @Nullablee @NonNullque são usadas por verificadores externos como findbugs.
31512 Mike

Não está claro o que se entende por "estendendo sua semântica". Se eu olhar para o Boost.Spirit , isso já está ultrapassando meu limite pessoal de "estender a semântica": Os operadores matemáticos do C ++ são usados ​​para descrever uma sintaxe de linguagem, que o compilador se transforma em um analisador para a referida linguagem. Eu sei que não é isso que significa "estender a semântica da linguagem" pelos ratos de laboratório, mas acho que é bastante impressionante.
DevSolar

Respostas:


12

O Converge possui algumas instalações de meta-programação bastante impressionantes.

Em um nível simples, isso pode ser visto como um recurso semelhante a macro, embora seja mais poderoso do que a maioria dos recursos existentes, pois o código arbitrário pode ser executado em tempo de compilação. Usando isso, é possível interagir com o compilador e gerar código com segurança e facilidade como ITrees (também conhecidas como árvores de sintaxe abstrata).

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.

7.6 Tratamento de exceções

Como o Newspeak fornece acesso reflexivo (7.2) aos registros de ativação (3.6), o tratamento de exceções é puramente um problema de biblioteca. A plataforma fornecerá uma biblioteca padrão que suporta o lançamento, captura e retomada de exceções, como no Smalltalk.


Perligata: Romana demonstra como uma sintaxe totalmente nova pode ser aplicada em um idioma.

Este artigo descreve um módulo Perl - Lingua :: Romana :: Perligata - que possibilita escrever programas Perl em latim.


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 .

Esta dissertação concentra-se na experimentação em ciência da computação. Em particular, mostrarei que novas linguagens e construções de programação projetadas especificamente para apoiar a experimentação podem simplificar substancialmente os trabalhos de pesquisadores e programadores.

Apresento um trabalho que aborda dois tipos muito diferentes de experimentação. O primeiro objetivo é ajudar os pesquisadores de linguagens de programação a experimentar suas idéias, facilitando a criação de protótipos de novas linguagens de programação e extensões a linguagens existentes. O outro investiga a experimentação como um paradigma de programação, permitindo que os próprios programas experimentem diferentes ações e possibilidades - em outras palavras, é uma tentativa de fornecer suporte de linguagem para o que aconteceria ...? ou raciocínio de mundos possíveis.

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.


8

"É teoricamente viável? *

euS ) e escrever programas no novo idioma. As pessoas geralmente não fazem isso porque pode envolver muito trabalho para escrever um intérprete e haverá um impacto no desempenho (um fator de 10 a 100) para a camada adicional de interpretação.

eu pode ser projetada com recursos poderosos de metaprogramação, para facilitar a implementação de intérpretes. Idiomas como Scheme têm isso.

Seu ). Então você não obtém o desempenho atingido porque a camada de interpretação adicional é eliminada.

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.


6

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.)


4

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. ...


11
Por favor, escreva uma ou duas frases resumidas para cada referência; coleções de links puros quase nunca são "boas" respostas.
Raphael
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.