Compilador-compilador - Compiler-compiler

Na ciência da computação , um compilador-compilador ou gerador de compilador é uma ferramenta de programação que cria um analisador , interpretador ou compilador a partir de alguma forma de descrição formal de uma linguagem de programação e máquina.

O tipo mais comum de compilador-compilador é mais precisamente chamado de gerador de analisador e só lida com análise sintática: sua entrada é uma gramática , normalmente escrita na forma Backus-Naur (BNF) ou forma Backus-Naur estendido (EBNF) que define o sintaxe de uma linguagem de programação; e sua saída é o código-fonte de um analisador para a linguagem de programação. Os geradores de analisador não lidam com a semântica da linguagem de programação ou com a geração de código de máquina para a máquina de destino.

Um metacompilador é uma ferramenta de desenvolvimento de software usada principalmente na construção de compiladores , tradutores e interpretadores para outras linguagens de programação. A entrada para um metacompilador é um programa de computador escrito em uma metalinguagem de programação especializada , projetada principalmente para o propósito de construir compiladores. A linguagem do compilador produzido é chamada de linguagem de objeto . A entrada mínima que produz um compilador é um metaprograma que especifica a gramática da linguagem de objeto e as transformações semânticas em um programa de objeto .

Variantes

Um gerador de analisador típico associa o código executável a cada uma das regras da gramática que deve ser executada quando essas regras são aplicadas pelo analisador. Essas partes de código às vezes são chamadas de rotinas de ação semântica, uma vez que definem a semântica da estrutura sintática que é analisada pelo analisador. Dependendo do tipo de analisador que deve ser gerado, essas rotinas podem construir uma árvore de análise (ou árvore de sintaxe abstrata ) ou gerar código executável diretamente.

Uma das primeiras (1964) e surpreendentemente poderosas versões de compiladores-compiladores é o META II , que aceitava uma gramática analítica com facilidades de saída que produziam código de máquina de pilha e é capaz de compilar seu próprio código-fonte e outras linguagens.

Entre os primeiros programas das versões originais do Unix sendo construídas na Bell Labs estava o sistema lex e yacc de duas partes , que normalmente era usado para produzir código de linguagem de programação C , mas tinha um sistema de saída flexível que podia ser usado para tudo, desde linguagens de programação para conversão de arquivo de texto. Suas versões GNU modernas são flex e bison .

Alguns compiladores-compiladores experimentais tomam como entrada uma descrição formal da semântica da linguagem de programação, normalmente usando semântica denotacional . Essa abordagem é frequentemente chamada de 'compilação baseada em semântica' e foi lançada pelo Sistema de Implementação Semântica (SIS) de Peter Mosses em 1978. No entanto, tanto o compilador gerado quanto o código que ele produzia eram ineficientes no tempo e no espaço. Nenhum compilador de produção é construído dessa maneira, mas a pesquisa continua.

O projeto Production Quality Compiler-Compiler ( PQCC ) na Carnegie Mellon University não formaliza a semântica, mas tem uma estrutura semiformal para a descrição da máquina.

Compiladores-compiladores existem em muitos sabores, incluindo geradores de máquina de reescrita de baixo para cima (consulte JBurg ) usados ​​para agrupar árvores de sintaxe de acordo com uma gramática de reescrita para geração de código e geradores de analisador de gramática de atributos (por exemplo, ANTLR pode ser usado para verificação de tipo simultânea, constante propagação e mais durante o estágio de análise).

Metacompiladores

Os metacompiladores reduzem a tarefa de escrever compiladores, automatizando os aspectos que são os mesmos, independentemente da linguagem do objeto . Isso torna possível o projeto de linguagens específicas de domínio que são apropriadas para a especificação de um problema particular. Um metacompilador reduz o custo de produção de tradutores para tais linguagens de objeto de domínio específico a um ponto onde se torna economicamente viável incluir na solução de um problema um projeto de linguagem de domínio específico .

Como a metalinguagem de um metacompiler normalmente será uma poderosa linguagem de processamento de strings e símbolos, eles geralmente têm fortes aplicações para aplicações de uso geral, incluindo a geração de uma ampla variedade de outras ferramentas de análise e engenharia de software.

Além de ser útil para o desenvolvimento de linguagem de domínio específico , um metacompilador é um excelente exemplo de uma linguagem de domínio específico, projetada para o domínio de escrita do compilador.

Um metacompilador é um metaprograma geralmente escrito em sua própria metalinguagem ou em uma linguagem de programação de computador existente. O processo de um metacompiler, escrito em sua própria metalinguagem, compilar a si mesmo é equivalente a um compilador self-hosting . A maioria dos compiladores comuns escritos hoje em dia são compiladores de hospedagem própria. A auto-hospedagem é uma ferramenta poderosa, de muitos metacompiladores, permitindo a fácil extensão de sua própria metalinguagem de metaprogramação. O recurso que separa um metacompilador de outros compiladores do compilador é que ele recebe como entrada uma linguagem de metaprogramação especializada que descreve todos os aspectos da operação do compilador. Um metaprograma produzido por um metacompilador é um programa tão completo quanto um programa escrito em C ++ , BASIC ou qualquer outra linguagem de programação geral . A metalinguagem de metaprogramação é um atributo poderoso que permite um desenvolvimento mais fácil de linguagens de programação de computador e outras ferramentas de computador. Processadores de linha de comando, transformação e análise de strings de texto são facilmente codificados usando metalinguagens de metaprogramação de metacompiladores.

Um pacote de desenvolvimento completo inclui um vinculador e uma biblioteca de suporte de tempo de execução . Normalmente, uma linguagem de programação de sistema orientada à máquina , como C ou C ++, é necessária para escrever a biblioteca de suporte. Uma biblioteca que consiste em funções de suporte necessárias para o processo de compilação geralmente completa o pacote metacompilador completo.

O significado de metacompilador

Na ciência da computação, o prefixo meta é comumente usado para significar sobre (sua própria categoria) . Por exemplo, metadados são dados que descrevem outros dados. Uma linguagem usada para descrever outras linguagens é uma metalinguagem . Meta também pode significar em um nível superior de abstração . Uma metalinguagem opera em um nível superior de abstração para descrever as propriedades de uma linguagem. A forma Backus – Naur (BNF) é uma metalinguagem formal originalmente usada para definir o ALGOL 60 . BNF é uma metalinguagem fraca , pois descreve apenas a sintaxe e nada diz sobre a semântica ou o significado. Metaprogramação é a escrita de programas de computador com a capacidade de tratar programas como seus dados. Um metacompilador recebe como entrada um metaprograma escrito em uma metalinguagem especializada (uma abstração de nível superior) projetada especificamente para o propósito de metaprogramação . A saída é um programa de objeto executável.

Uma analogia pode ser feita: Que, como C ++ compilador toma como entrada um C ++ programa em linguagem de programação, uma meta compilador toma como entrada uma meta programação metalinguagem programa.

Quarto metacompilador

Muitos defensores da linguagem Forth chamam o processo de criação de uma nova implementação de Forth de meta-compilação e que constitui um metacompilador. A quarta definição de metacompilador é:

"Um metacompilador é um compilador que processa seu próprio código-fonte, resultando em uma versão executável de si mesmo."

Este quarto uso do termo metacompilador é contestado na ciência da computação convencional. Veja Forth (linguagem de programação) e História da construção do compilador . O processo real do Forth de compilar em si é uma combinação de um Forth sendo uma linguagem de programação extensível de hospedagem própria e, às vezes , compilação cruzada , terminologia estabelecida há muito tempo na ciência da computação. Metacompiladores são um sistema geral de escrita de compiladores. Além do conceito de metacompilador Forth ser indistinguível de self-hosting e linguagem extensível. O processo real atua em um nível inferior, definindo um subconjunto mínimo de quatro palavras , que pode ser usado para definir quatro palavras adicionais. Uma implementação completa do Forth pode então ser definida a partir do conjunto base. Isso soa como um processo de bootstrap. O problema é que quase todo compilador de linguagem de propósito geral também se encaixa na descrição do metacompilador Forth.

Quando (compilador de auto-hospedagem) X processa seu próprio código-fonte, resultando em uma versão executável de si mesmo, X é um metacompilador.

Basta substituir o X por qualquer linguagem comum, C, C ++, Pascal , COBOL , Fortran , Ada , Modula-2 , etc. E X seria um metacompilador de acordo com o uso do Forth de metacompilador. Um metacompilador opera em um nível de abstração acima do compilador que ele compila. Ele só opera no mesmo nível (compilador de auto-hospedagem) ao compilar a si mesmo. É preciso ver o problema com essa definição de metacompilador. Pode ser aplicado a quase todos os idiomas.

Porém, ao examinar o conceito de programação em Forth, adicionar novas palavras ao dicionário, estender a linguagem dessa forma é metaprogramação. É essa metaprogramação do Forth que o torna um metacompilador.

Programar no Forth é adicionar novas palavras à linguagem. Alterar o idioma dessa forma é metaprogramação . Forth é um metacompilador porque Forth é uma linguagem projetada especificamente para metaprogramação. Programar em Forth é estender Forth adicionar palavras ao vocabulário Forth cria um novo dialeto Forth . Forth é um metacompilador especializado para dialetos da linguagem Forth.

História

O primeiro compilador-compilador a usar esse nome foi escrito por Tony Brooker em 1960 e foi usado para criar compiladores para o computador Atlas na Universidade de Manchester , incluindo o compilador Atlas Autocode .

A história inicial dos metacompiladores está intimamente ligada à história do grupo de trabalho 1 SIG / PLAN em compiladores orientados a sintaxe. O grupo começou principalmente com o esforço de Howard Metcalfe na área de Los Angeles. No outono de 1962, Howard Metcalfe projetou dois intérpretes de escrita de compilador. Um usou uma técnica de análise de baixo para cima com base em um método descrito por Ledley e Wilson. O outro usou uma abordagem de cima para baixo baseada em um trabalho de Glennie para gerar frases aleatórias em inglês a partir de uma gramática livre de contexto.

Ao mesmo tempo, Val Schorre descreveu duas "metamáquinas". Um gerador e um analítico. A máquina generativa foi implementada e produziu expressões algébricas aleatórias. Meta I, o primeiro metacompilador, foi implementado por Schorre em um IBM 1401 na UCLA em janeiro de 1963. Seus intérpretes e meta-máquinas originais foram escritos diretamente em uma linguagem de pseudo-máquina. META II , no entanto, foi escrito em uma metalinguagem de alto nível capaz de descrever sua própria compilação na linguagem de pseudo-máquina.

Lee Schmidt em Bolt, Beranek e Newman escreveu um metacompilador em março de 1963 que utilizou um display CRT no time-sharing PDP-l. Este compilador produziu código de máquina real em vez de código interpretativo e foi parcialmente inicializado a partir do Meta I.

Schorre inicializou o Meta II do Meta I durante a primavera de 1963. O artigo sobre o sistema metacompilador refinado apresentado na conferência ACM da Filadélfia de 1964 é o primeiro artigo sobre um metacompilador disponível como referência geral. A sintaxe e a técnica de implementação do sistema de Schorre estabeleceram a base para a maioria dos sistemas que se seguiram. O sistema foi implementado em um pequeno 1401 e foi usado para implementar uma pequena linguagem semelhante ao ALGOL .

Muitos sistemas semelhantes se seguiram imediatamente.

Roger Rutman, da AC Delco, desenvolveu e implementou LOGIK, uma linguagem para simulação de design lógico, no IBM 7090 em janeiro de 1964. Este compilador usava um algoritmo que produzia código eficiente para expressões booleanas.

Outro artigo nos procedimentos do ACM de 1964 descreve o Meta III , desenvolvido por Schneider e Johnson na UCLA para o IBM 7090. O Meta III representa uma tentativa de produzir código de máquina eficiente para uma grande classe de linguagens. Meta III foi implementado completamente em linguagem assembly. Dois compiladores foram escritos em Meta III, CODOL, um compilador de demonstração de escrita do compilador, e PUREGOL, um dialeto de ALGOL 60. (Foi pura ousadia chamá-lo de ALGOL).

No final de 1964, Lee Schmidt inicializou o metacompiler EQGEN, do PDP-l para o Beckman 420. EQGEN era uma linguagem de geração de equações lógicas.

Em 1964, a System Development Corporation iniciou um grande esforço no desenvolvimento de metacompiladores. Esse esforço inclui metacompiladores poderosos, Bookl e Book2 escritos em Lisp, que possuem ampla pesquisa em árvore e capacidade de backup. Uma conseqüência de um dos sistemas Q-32 na SDC é o Meta 5. O sistema Meta 5 incorpora backup do fluxo de entrada e outros recursos suficientes para analisar qualquer linguagem sensível ao contexto. Este sistema foi lançado com sucesso para um grande número de usuários e tinha muitos aplicativos de manipulação de strings além da compilação. Ele tem muitas pilhas push-down elaboradas, recursos de configuração e teste de atributos e mecanismos de saída. O fato de o Meta 5 traduzir programas JOVIAL em programas PL / I demonstra seu poder e flexibilidade.

Robert McClure, da Texas Instruments, inventou um compilador-compilador chamado TMG (apresentado em 1965). TMG foi usado para criar os primeiros compiladores para linguagens de programação como B , PL / I e ALTRAN . Juntamente com metacompiler de Val Schorre, foi uma inspiração inicial para o último capítulo de Donald Knuth é The Art of Computer Programming .

O sistema LOT foi desenvolvido durante 1966 no Stanford Research Institute e foi modelado muito próximo ao Meta II. Ele tinha novas construções de propósito especial, permitindo gerar um compilador que poderia, por sua vez, compilar um subconjunto de PL / I. Esse sistema tinha amplas facilidades de coleta de estatísticas e era usado para estudar as características da análise de cima para baixo.

SIMPLE é um sistema tradutor especializado projetado para auxiliar na escrita de pré-processadores para PL / I, SIMPLE, escrito em PL / I, é composto por três componentes: Um executivo, um analisador de sintaxe e um construtor semântico.

O compilador TREE-META foi desenvolvido no Stanford Research Institute em Menlo Park, Califórnia. Abril de 1968. A história dos primeiros metacompiladores está bem documentada no manual TREE META. O TREE META acompanhou alguns dos desenvolvimentos do SDC. Ao contrário dos metacompiladores anteriores, ele separava o processamento semântico do processamento de sintaxe. As regras de sintaxe continham operações de construção de árvore que combinavam elementos de linguagem reconhecidos com nós de árvore. A representação da estrutura em árvore da entrada foi então processada por uma forma simples de regras não analisadas. As regras não analisadas usavam reconhecimento de nó e teste de atributo que, quando correspondido, resultava na execução da ação associada. Além disso, um elemento de árvore semelhante também pode ser testado em uma regra não comparada. Regras não-analisadas também eram uma linguagem recursiva, sendo capaz de chamar regras não-analisadas passando elementos da árvore antes que a ação da regra não-analisada fosse executada.

O conceito de metamáquina originalmente proposto por Glennie é tão simples que três versões de hardware foram projetadas e uma realmente implementada. O último na Washington University em St. Louis. Esta máquina foi construída a partir de componentes macromodulares e possui para instruções os códigos descritos por Schorre.

CWIC (Compilador para escrever e implementar compiladores) é o último metacompilador Schorre conhecido. Foi desenvolvido na Systems Development Corporation por Erwin Book, Dewey Val Schorre e Steven J. Sherman. Com todo o poder do (lisp 2), algoritmos de otimização de linguagem de processamento de lista podiam operar em listas e árvores geradas por sintaxe antes da geração do código. O CWIC também tinha uma tabela de símbolos incorporada à linguagem.

Com o ressurgimento de linguagens específicas de domínio e a necessidade de geradores de analisador que sejam fáceis de usar, entender e manter, os metacompiladores estão se tornando uma ferramenta valiosa para projetos avançados de engenharia de software.

Outros exemplos de geradores de analisador na veia yacc são ANTLR , Coco / R , CUP, GNU Bison , Eli, FSL, SableCC , SID (Syntax Improving Device) e JavaCC . Embora úteis, os geradores de analisador puro tratam apenas da parte da análise do problema de construção de um compilador. Ferramentas com escopo mais amplo, como PQCC , Coco / R e DMS Software Reengineering Toolkit, fornecem suporte considerável para atividades de pós-análise mais difíceis, como análise semântica, otimização e geração de código.

Metalinguagens Schorre

Os primeiros metacompiladores Schorre, META I e META II, foram desenvolvidos por D. Val Schorre na UCLA. Seguiram-se outros metacompiladores baseados em Schorre. Cada um adicionando melhorias à análise de linguagem e / ou geração de código.

Na programação, é comum usar o nome da linguagem de programação para se referir ao compilador e à linguagem de programação, o contexto distinguindo o significado. Um programa C ++ é compilado usando um compilador C ++. Isso também se aplica ao seguinte. Por exemplo, META II é tanto o compilador quanto a linguagem.

As metalinguagens na linha Schorre de metacompiladores são linguagens de programação funcionais que usam equações de sintaxe de análise de gramática de cima para baixo com construções de transformação de saída incorporadas.

Uma equação de sintaxe:

<name> = <body>;

é uma função de teste compilada que retorna sucesso ou falha . <name> é o nome da função. <body> é uma forma de expressão lógica que consiste em testes que podem ser agrupados, ter alternativas e produções de saída. Um teste é como um bool em outras línguas, o sucesso sendo verdadeiro e o fracasso sendo falso .

Definir uma linguagem de programação analiticamente de cima para baixo é natural. Por exemplo, um programa pode ser definido como:

 program = $declaration;

Definindo um programa como uma sequência de zero ou mais declarações.

Nas línguas do Schorre META X existe uma regra de condução. A regra do programa acima é um exemplo de regra de direção. A regra do programa é uma função de teste que chama a declaração, uma regra de teste , que retorna sucesso ou falha . O operador $ loop chama repetidamente a declaração até que a falha seja retornada. O operador $ sempre é bem-sucedido, mesmo quando há declaração zero. O programa acima sempre retornaria sucesso. (No CWIC, uma falha longa pode ignorar a declaração. Uma falha longa é parte do sistema de retrocesso do CWIC)

Os conjuntos de caracteres desses primeiros compiladores eram limitados. O caractere / foi usado para o operador alternante (ou). "A ou B" é escrito como A / B. Os parênteses () são usados ​​para agrupamento.

A (B / C)

Descreve uma construção de A seguida por B ou C. Como uma expressão booleana, seria

A and (B or C)

Uma sequência XY tem um significado implícito de X e Y. () são agrupamento e / o operador ou . A ordem de avaliação é sempre da esquerda para a direita, pois uma sequência de caracteres de entrada está sendo especificada pela ordem dos testes.

Palavras de operadores especiais cujo primeiro caractere é um "." são usados ​​para maior clareza. .EMPTY é usado como o último alternativo quando nenhum alternante anterior precisa estar presente.

X (A / B / .EMPTY)

Indica que X é opcionalmente seguido por A ou B. Esta é uma característica específica dessas metalinguagens sendo linguagens de programação. O retrocesso é evitado pelo acima. Outros sistemas construtores de compiladores podem ter declarado as três sequências possíveis e deixado para o analisador descobrir.

As características das metalinguagens de metaprogramação acima são comuns a todos os metacompiladores de Schorre e aqueles derivados deles.

META I

META I foi um metacompilador compilado à mão usado para compilar o META II. Pouco mais se sabe sobre o META I, exceto que a compilação inicial do META II produziu um código quase idêntico ao do compilador META I codificado manualmente.

META II

Cada regra consiste opcionalmente em testes, operadores e produções de saída. Uma regra tenta corresponder a alguma parte do fluxo de caracteres de origem do programa de entrada, retornando com sucesso ou falha. Em caso de sucesso, a entrada é avançada sobre os caracteres correspondentes. Em caso de falha, a entrada não é avançada.

As produções de saída produziram uma forma de código de montagem diretamente de uma regra de sintaxe.

TREE-META

O TREE-META introduziu os operadores de construção de árvore : < node_name > e [ < number > ] movendo as transformações de produção de saída para regras não analisadas. Os operadores de construção de árvore foram usados ​​nas regras gramaticais, transformando diretamente a entrada em uma árvore de sintaxe abstrata . Regras não analisadas também são funções de teste que correspondem a padrões de árvore. Regras unparse são chamadas de uma regra gramatical quando uma árvore de sintaxe abstrata deve ser transformada em código de saída. A construção de uma árvore de sintaxe abstrata e regras não analisadas permitiu que otimizações locais fossem realizadas por meio da análise da árvore de análise.

A mudança das produções de saída para as regras não comparadas fez uma separação clara entre a análise gramatical e a produção de código. Isso tornou a programação mais fácil de ler e entender.

CWIC

Em 1968-1970, Erwin Book, Dewey Val Schorre e Steven J. Sherman desenvolveram o CWIC. (Compilador para escrever e implementar compiladores) no Centro de História da Tecnologia da Informação da System Development Corporation Charles Babbage Institute (Quadro 12, pasta 21) ,

CWIC é um sistema de desenvolvimento de compilador composto de três linguagens de propósito especial e específicas de domínio, cada uma com a intenção de permitir a descrição de certos aspectos da tradução de uma maneira direta. A linguagem de sintaxe é usada para descrever o reconhecimento do texto de origem e a construção dele em uma estrutura de árvore intermediária . A linguagem geradora é usada para descrever a transformação da árvore em linguagem de objeto apropriada.

A linguagem da sintaxe segue a linha anterior de metacompiladores de Dewey Val Schorre. É mais parecido com o TREE-META com operadores de construção de árvore na linguagem de sintaxe. As regras incomparáveis ​​do TREE-META são estendidas para funcionar com a linguagem geradora baseada em objetos baseada no LISP 2 .

CWIC inclui três idiomas:

  • Sintaxe : transforma a entrada do programa de origem em estruturas de lista usando a fórmula de transformação gramatical. Uma estrutura de expressão analisada é passada para um gerador pela colocação de uma chamada de gerador em uma regra. Uma árvore é representada por uma lista cujo primeiro elemento é um objeto de nó. A linguagem tem operadores, < e > , especificamente para fazer listas. O operador dois pontos : é usado para criar objetos de nó. : ADD cria um nó ADD. A exclamação ! operador combina várias entradas analisadas com um nó para fazer uma árvore . Árvores criadas por regras de sintaxe são passadas para funções geradoras, retornando sucesso ou falha. A linguagem de sintaxe é muito próxima do TREE-META. Ambos usam dois pontos para criar um nó. A exclamação de construção de árvore do CWIC ! <Número> funciona da mesma forma que o [<número>] do TREE-META.
  • Gerador : uma série nomeada de regras de transformação, cada uma consistindo em uma regra não-analisada de correspondência de padrões. e uma produção de saída escrita em uma linguagem semelhante ao LISP 2. a tradução foi para o código de máquina binário IBM 360. Outras facilidades da saída generalizada da linguagem do gerador.
  • MOL-360 : uma linguagem de implementação de nível médio independentepara a família de computadores IBM System / 360 desenvolvida em 1968 e usada para escrever a biblioteca de suporte subjacente.

Linguagem geradores

Linguagem de Geradores teve semântica semelhante ao Lisp . A árvore de análise foi considerada uma lista recursiva. A forma geral de uma função de linguagem geradora é:

  function-name(first-unparse_rule) => first-production_code_generator
           (second-unparse_rule) => second-production_code_generator
           (third-unparse_rule) => third-production_code_generator
               ...

O código para processar uma determinada árvore incluía os recursos de uma linguagem de programação de propósito geral, mais um formulário: <stuff>, que emitiria (stuff) no arquivo de saída. Uma chamada de gerador pode ser usada em unparse_rule. O gerador recebe o elemento do padrão unparse_rule no qual é colocado e seus valores de retorno são listados em (). Por exemplo:

  expr_gen(ADD[expr_gen(x),expr_gen(y)]) =>
                                <AR + (x*16)+y;>
                                releasereg(y);
                                return x;
               (SUB[expr_gen(x),expr_gen(y)])=>
                                <SR + (x*16)+y;>
                                releasereg(y);
                                return x;
               (MUL[expr_gen(x),expr_gen(y)])=>
                              .
                              .
                              .
               (x)=>     r1 = getreg();
                            load(r1, x);
                            return r1;
...

Ou seja, se a árvore de análise for semelhante a (ADD [<algo1>, <algo2>]), expr_gen (x) seria chamado com <algo1> e retornaria x. Uma variável na regra não analisada é uma variável local que pode ser usada no production_code_generator. expr_gen (y) é chamado com <something2> e retorna y. Aqui está uma chamada de gerador em uma regra não analisada que é passada ao elemento na posição que ocupa. Esperançosamente em xey acima serão registrados no retorno. A última transformação tem como objetivo carregar um atômico em um registrador e retornar o registrador. A primeira produção seria usada para gerar a instrução 360 "AR" (Adicionar Registrador) com os valores apropriados em registros gerais. O exemplo acima é apenas uma parte de um gerador. Cada expressão geradora é avaliada para um valor que pode ser processado posteriormente. A última transformação poderia muito bem ter sido escrita como:

               (x)=>     return load(getreg(), x);

Neste caso, load retorna seu primeiro parâmetro, o registro retornado por getreg (). as funções load e getreg são outros geradores CWIC.

CWIC abordou idiomas específicos de domínio antes que o termo idioma específico de domínio existisse

Dos autores do CWIC:

"Um metacompilador auxilia na tarefa de construção do compilador automatizando seus aspectos não criativos, aqueles aspectos que são os mesmos independentemente da linguagem que o compilador produzido deve traduzir. Isso torna possível o design de linguagens adequadas à especificação de um problema particular. Reduz o custo de produção de processadores para tais linguagens a um ponto em que se torna economicamente viável começar a solução de um problema com o design da linguagem. "

Exemplos

Veja também

Referências e notas

Leitura adicional

links externos