Existe uma linguagem de programação personalizável que você pode usar para converter para outras pessoas?

13

Existe uma linguagem de programação na qual você pode definir suas próprias configurações de sintaxe e converter o código em um idioma que você escolher?

Por exemplo, você escolheria configurações específicas como "blocos indexados do Python", [a,b,c]inicializa matrizes ^para exponenciação e outras. Um script o converteria para o equivalente do idioma de sua escolha.

Dokkat
fonte
1
Eu espero que não. O TIMTOWTDI é indiscutivelmente ruim, mas "invente quantas maneiras incompatíveis você desejar" teria as mesmas desvantagens vezes cem e seria ainda menos útil. DSLs são, por vezes, vale a pena, mas redefinindo metade da sintaxe (ou pior - trocando dois operadores, dando compability aparente, mas semântica diferente) apenas para os pedaços dele ...
Eu pergunto isso porque, especificamente, estou programando em javascript e realmente gostaria de poder configurar alguns açúcares de sintaxe no meu código, mas a linguagem simplesmente não permite. Nem mesmo a sobrecarga do operador é possível.
Dokkat
2
Até certo ponto, o que você está descrevendo soa como macros de pré-processador . Agora, se pudéssemos ter um recurso semelhante para perl ...
yannis
5
@Dokkat: atualize a pergunta para indicar especificamente que se trata de JavaScript. A pergunta - conforme solicitado - é um pesadelo de manutenção e suporte. Adicionar nova sintaxe a um idioma existente (ou usar um pré-processador para mudar seu idioma privado para um idioma público) é realmente horrível. Contudo. Se você listar problemas específicos de açúcar da sintaxe do JavaScript, poderá obter ajuda específica .
precisa saber é o seguinte
3
Essas "linguagens de programação personalizadas" são normalmente chamadas de "linguagens específicas de domínio" ou DSLs.
Michael Dillon

Respostas:

14

Sim, mas provavelmente não da maneira que você está pensando.

O Lisp e seus parentes têm poderosos sistemas de macros que permitem realizar transformações arbitrárias em sua fonte; portanto, em princípio, você pode usar macros (e macros de leitor, no nível do caractere) para criar praticamente qualquer extensão que desejar. Idiomas concatenativos (e idiomas de autores em áreas relacionadas) têm potencial para um poder metaprogramador semelhante . Um bom exemplo disso é Forth , no qual muitas construções sintáticas (como comentários) podem ser definidas pelo usuário. Para um exemplo contemporâneo e não esotérico, há um esforço para oferecer ao Perl 6 suporte aprimorado sobre o Perl 5 para sintaxe definida pelo usuário .

Jon Purdy
fonte
8
De alguma forma, eu sabia que Perl seria (parte da) resposta. Eu acho que as macros do pré-processador C também se encaixam na descrição, em pequena extensão.
precisa saber é
Também a sobrecarga do operador em C ++ pode ser boa. O exemplo do olá mundo vem à mente. cout << "Oi";
Lord Tydus
@LordTydus: De fato, e até mesmo a sobrecarga do operador permite fazer um pouco de mágica por trás de uma interface sã. Seria bom se o C ++ tivesse recursos de sobrecarga mais gerais, digamos, sobrecarregando operator[]vários argumentos ou introduzindo novos operadores como em Haskell; mas duvido que o comitê veja além das questões de análise.
precisa saber é o seguinte
3

Parece programação de conceitos .

Eu não estou familiarizado com isso, mas XL é uma linguagem projetada especificamente para ele.

O XL possui sintaxe e semântica reconfiguráveis ​​por programador. Os plug-ins do compilador podem ser usados ​​para adicionar novos recursos ao idioma.

Lisp e Forth também suportam programação de conceito, embora menor que XL. Sugiro Lisp, pois é muito prático e eficaz. O mais importante é uma sintaxe clara e flexível, e não uma notação, que o Lisp fornece.


Por exemplo, você escolheria configurações específicas como "blocos indexados do Python", "[a, b, c]" inicializa matrizes, "^" para exponenciação e outras.

Você pode estar interessado em um idioma como Haskell, que possui uma sintaxe muito flexível e uniforme.

Pubby
fonte
Era isso que eu estava procurando.
Dokkat
2

Não que eu saiba.

Também não acho que seria uma idéia particularmente boa - um dos principais benefícios de uma sintaxe de linguagem padrão é que muitas pessoas podem lê-la e, se todos inventarem sua própria sintaxe, ninguém seria capaz de entender o código de outra pessoa. ... então essa linguagem pode ser divertida para um hobby, mas não muito útil para qualquer coisa prática.

O mais próximo que existe provavelmente seria o Lisp, onde o sistema de macros permite que você escreva suas próprias construções de linguagem de uma maneira muito flexível. Normalmente você continuaria com a sintaxe do Lisp, mas poderá redefinir efetivamente tudo se realmente quiser.

Como resultado, os Lisps tendem a ser particularmente populares na implementação de DSLs. Um bom exemplo é esse DSL de acesso a dados em Clojure (Korma), que cuida de todo o código padrão necessário para o acesso ao banco de dados.

Mikera
fonte
2

O Scala é frequentemente usado dessa maneira para criar DSLs, idiomas específicos do domínio.

Principalmente porque o Scala não possui operadores, e o método de chamada Scala, sintaxe, pode ser abreviado. Por exemplo:

5 é um objeto inteiro. Para calcular 5 mais 7, você poderia escrever

val ans = 5.add (7), exceto que o método de adição é realmente chamado "+", então você escreveria:

val ans = 5. + (7) mas em Scala, você não precisa incluir o "." em chamadas de método ou entre parênteses "()" em torno de argumentos, para chamar o método + no objeto 5, você escreveria

val ans = 5 + 7, que funciona perfeitamente porque o Scala não tem operadores para interferir no seu esquema inteligente de nomenclatura de métodos. Agora estenda essa idéia para suas próprias classes e objetos, incluindo o fato de que você pode "substituir" métodos como +, bem como criar seus próprios métodos chamados >>> ou ::! ou @ * @ ou apenas nomes de texto sem formatação, como fancify.

Michael Dillon
fonte
Isso é incrível. Vou dar uma olhada na Scala.
Dokkat
1

Não estou dizendo que você deve usá-lo, pois ainda é principalmente experimental, mas um paradigma de programação recente interessante é a Linguistic Oriented Programming (LOP).

O conceito de Programação Orientada a Linguagem adota a abordagem para capturar requisitos nos termos do usuário e, em seguida, tenta criar uma linguagem de implementação o mais isomórfica possível para as descrições do usuário, para que o mapeamento entre requisitos e implementação seja o mais direto possível.

Sergey Dmitriev explica mais detalhadamente .

Essa é a ideologia disso, mas praticamente tudo se resume ao fato de apoiar o comportamento que você está pedindo. Você pode:

  • Estenda um idioma existente.
  • Componha idiomas diferentes.
  • Use uma 'linguagem de transformação' existente para converter suas palavras-chave recém-definidas em um idioma base.

O ambiente de programação mais ativo que conheço de seguir esse paradigma é o Meta Programming System (MPS) gratuito da JetBrains.

Na verdade, ele também está começando a ser usado em software comercial, então talvez esteja começando a sair da fase 'experimental':

  • O Realaxy é um editor de ActionScript construído inteiramente sobre o MPS. Usando o poder do LOP, eles foram capazes de implementar, por exemplo, fechamentos para o AS3.
  • mbeddr C é uma linguagem C extensível baseada em MPS.
Steven Jeuris
fonte
1

Os idiomas específicos do domínio são comumente usados ​​na comunidade Tcl. Por exemplo, não é incomum ver um programa Tcl que contém DSLs C e SQL como DSLs incorporados (por meio dos pacotes Critcl e Sqlite). A única restrição sobre uma DSL incorporada é que é muito melhor se a linguagem incorporada equilibrar suas chaves, e isso acaba sendo um requisito realmente não oneroso na prática!

Outro idioma que facilita as DSLs é o ML padrão, que permite acessar tokens brutos a partir do tokenizer genérico do sistema (antes do ponto em que os identificadores são convertidos em palavras-chave). Isso facilita a criação de uma ampla classe de DSLs - desde que obedeçam a algumas das regras básicas de sintaxe do SML, especialmente em relação a comentários, cadeias de caracteres e limites de token - e é de fato usado intensamente em vários dos principais aplicativos direcionadores do idioma (provadores de teoremas, etc.)

Nem todos os idiomas tornam isso tão fácil. Em particular, os idiomas que analisam automaticamente o conteúdo dos termos entre colchetes (muitos deles!) Não podem fazer isso, por isso exigem que o DSL seja construído pelos operadores que substituem, colocando o sub-idioma dentro de uma string ou pelo uso de um pré-processador que reescreve o DSL em algo que pode ser tratado dentro do idioma do host.

Donal Fellows
fonte
0

AFAIU, você está procurando idiomas que podem ajudá-lo a escrever seu próprio DSL (Domain Specific Language). Existem muitos bons candidatos. Pessoalmente, eu recomendaria Ruby ou Io, porque eles oferecem 1) sobrecarga fácil do operador, 2) metaprogramação e 3) mecanismos de fallback como method_missingesse que você pode usar para criar sua própria API. Por exemplo, dê uma olhada no sqldsl , um DSL escrito em Ruby que gera SQL lendo o código Ruby.

sakisk
fonte
0

Na verdade, eu não o usei em si, mas se bem me lembro, o TXL foi projetado especificamente para traduzir o código-fonte. Como tal, você poderá usá-lo para especificar como traduzir do seu idioma e / ou extensões de idiomas para qualquer idioma real de destino.

Parece ter uma gramática disponível para Javascript. Mas, como não o usei antes, não sei exatamente como isso o ajudaria.

mootinator
fonte
0

Existe um bom pré-processador por aí chamado PPWizard, bastante poderoso. Depois de aprender sua sintaxe, você poderá criar padrões de macro para segmentar idiomas diferentes - não que isso seja infalível ou divertido, mas é uma ferramenta útil.

Marca
fonte
aqui estão alguns links: CONTEÚDO PPWIZARD (documentos oficiais), PPWizard - EDM2 (uma referência externa). A ferramenta é poderosa, mas sua documentação não é fácil de ler (talvez devido ao seu poder).
Wolf
0

Pode ser o que você está procurando como compilador. Um compilador compilador pega uma definição de linguagem escrita em uma linguagem formal e cria um compilador para essa linguagem.

Dê uma olhada em http://en.wikipedia.org/wiki/Compiler-compiler

Olivier Jacot-Descombes
fonte
0

Uma maneira comum de personalizar parcialmente uma linguagem de programação é usar um pré-processador de macro. Por exemplo, você pode executar "dokkat-lang" no pré-processador C antes de colocar o resultado em que algum ambiente javascript o baixe.

Quanto você pode fazer depende da sofisticação do seu pré-processador. Observe que as versões anteriores do C ++, do Objective C e de várias linguagens experimentais foram feitas pré-processando o código-fonte antes de alimentar uma cadeia de ferramentas do compilador C padrão.

hotpaw2
fonte