Pergunta

Idiomas preferidos:C/C++, Java e Ruby.

Eu estou procurando alguns livros muito úteis/tutoriais sobre como escrever o seu próprio compilador simplesmente para fins educacionais.Eu estou mais familiarizado com C/C++, Java e Ruby, então eu prefiro recursos que envolvem um desses três, mas qualquer bom recurso é aceitável.

Foi útil?

Solução

Grande Lista de Recursos:

Legenda:

  • ¶ Link para um arquivo PDF
  • $ Link para um livro impresso

Outras dicas

Este é um muito vago pergunta, eu acho;apenas por causa da profundidade do tema envolvido.Um compilador pode ser decomposto em duas partes distintas, no entanto;superior a metade e inferior-um.A parte superior-metade, geralmente leva o idioma de origem e a converte em uma representação intermediária, e a metade inferior cuida da plataforma específica de geração de código.

No entanto, uma ideia para uma fácil maneira de abordar esse tema (o mesmo que usamos no meu compiladores de classe, pelo menos) é construir o compilador em duas peças descritas acima.Especificamente, você vai ter uma boa idéia de todo o processo de compilação apenas a parte superior-metade.

Fazer apenas a metade superior permite que você obtenha a experiência de escrever o analisador léxico e do analisador e vá para a geração de alguns "código" (que representação intermediária que eu mencionei).Assim terá seu programa fonte e convertê-lo para uma outra representação, e a fazer alguns otimização (se você quiser), que é o coração de um compilador.A metade inferior, em seguida, irá demorar para que a representação intermediária e gerar os bytes necessários para executar o programa em uma arquitetura específica.Por exemplo, a metade inferior terá sua representação intermediária e gerar um PE executável.

Alguns livros sobre este tema que eu particularmente achei útil foi Compiladores Princípios e Técnicas (ou o Dragão Livro, devido ao bonito dragão na capa).Ele tem algumas grandes teoria e, definitivamente, cobre Gramáticas independentes de Contexto em um realmente acessível.Também, para a construção do analisador léxico e do analisador, você provavelmente vai usar o *nix ferramentas lex e yacc.E uninterestingly o suficiente, o livro chamado "lex e yacc"pegou onde o Dragão Simplesmente parou para esta parte.

Eu acho Moderno Implementação de Compilador no ML é o melhor introdutório compilador a escrita de texto.Há um A versão Java e um C versão também, qualquer um dos quais poderia ser mais acessível, dado o seu línguas de fundo.O livro reúne um monte de útil material básico (digitalização e análise, análise semântica, a ativação de registros, de instrução de selecção, RISC e x86 nativo de geração de código) e várias "avançado" tópicos (compilação de OO e funcionais linguagens, polimorfismo, coleta de lixo, otimização e estático único formulário de atribuição) em relativamente pouco espaço (~500 páginas).

Eu prefiro Moderno Implementação de Compilador para o Dragão simplesmente porque Moderna Compilador implementação de inquéritos menos do campo--em vez disso, ele tem realmente sólido cobertura de todos os tópicos que você precisaria escrever um sério, decente compilador.Depois de trabalhar através deste livro você vai estar pronto para fazer os trabalhos de investigação mais aprofundada, se você precisar dele.

Devo confessar que eu tenho um sério fraquinho por Niklaus Wirth do Compilador De Construção. É disponível on-line como um PDF.Eu acho Wirth programação da estética simplesmente bela, no entanto algumas pessoas a encontrar o seu estilo demasiado mínimo (por exemplo Wirth, favorece a descida recursiva analisadores, mas a maioria CS cursos de foco gerador de analisador ferramentas;Wirth do idioma desenhos são bastante conservadoras. Compilador de Construção é muito sucinto destilação de Wirth básico de ideias, então se você gosta de seu estilo ou não, ou não, eu altamente recomendo a leitura deste livro.

Eu concordo com o Dragão Livro de referência;IMO, é o guia definitivo para o compilador de construção.Prepare-se para alguns hardcore teoria, embora.

Se você quer um livro que é mais leve em teoria, Jogo De Scripts Domínio pode ser uma melhor livro para você.Se você é um total novato na compilador teoria, ele fornece uma suave introdução.Não cubra mais prático de análise de métodos (optando por não-recursivo preditivo descida sem discutir LL ou LR análise), e se bem me lembro, ele ainda não discutir qualquer tipo de teoria de otimização.Além disso, em vez de compilação para código de máquina, que compila para um bytecode que é suposto para ser executado em uma VM que você escrever.

É ainda uma boa leitura, principalmente se você pode pegá-lo para baixo na Amazon.Se você quiser apenas uma introdução fácil em compiladores, Jogo de Scripts de Domínio não é uma má forma de o fazer.Se você quiser ir hardcore frente, em seguida, você deve se contentar com nada menos do que o Dragão Livro.

"Vamos Construir um Compilador" é incrível, mas é um pouco desatualizado.(Eu não estou dizendo que o torna ainda um pouco menos válido.)

Ou check-out GÍRIA.Isto é semelhante ao de "Vamos Construir um Compilador", mas é muito melhor recurso, especialmente para iniciantes.Este vem com um tutorial em pdf que leva um 7 passo a abordagem de ensinar a você um compilador.Adicionar o quora link como ele tem os links para os vários portos da GÍRIA, em C++, Java, e a JS, também intérpretes em python e java, originalmente escrito em C# e o .NET plataforma.

Se você está procurando a usar o poderoso, o nível superior de ferramentas ao invés de construir tudo a si mesmo, passando por projetos e leituras este curso é uma boa opção.É um curso de idiomas por parte do autor do Java analisador motor ANTLR.Você pode levar o livro para o curso como um PDF a partir de a Pragmática Programadores.

O curso vai até o padrão do compilador compilador coisas que você gostaria de ver em outro lugar:análise de tipos, e o tipo de verificação, polimorfismo, tabelas de símbolos e de geração de código.Praticamente a única coisa que não é coberto é otimizações.O projeto final é um programa que compila um subconjunto de C.Porque você usa ferramentas como o ANTLR e o LLVM, é possível escrever todo o compilador em um único dia (eu tenho uma existência que é a prova de que, apesar de eu digo ~24 horas).É pesado na prática de engenharia, utilizando ferramentas modernas, um pouco mais leve na teoria.

O LLVM, a propósito, é simplesmente fantástico.Muitas situações onde você normalmente poderia compilar para baixo para a montagem, você estaria muito melhor compilação para O LLVM da Representação Intermediária em vez disso.É mais alto nível, de plataforma cruzada, e o LLVM é muito bom para a geração otimizada de montagem a partir dele.

Se você tem pouco tempo, eu recomendo Niklaus Wirth do Compilador "Construção" (Addison-Wesley.1996), um pequeno livro que você pode ler em um dia, mas explica o básico (incluindo como implementar lexers, descida recursiva analisadores, e sua pilha, baseada em máquinas virtuais).Após isso, se você quer um mergulho profundo, não há maneira de contornar o Dragão livro como outros comentadores sugerem.

Você pode querer olhar para Lex/Yacc (ou Flex/Bison, o que quer que você queira chamá-los).Flex é um analisador léxico, que irá analisar e identificar os componentes semânticos ("tokens") de seu idioma, e Bison será usada para definir o que acontece quando cada token é analisado.Este poderia ser, mas definitivamente não limitado a, impressão de código em C, para um compilador que seria compilação de C, ou dinamicamente a executar as instruções.

Este FAQ deve ajudá-lo, e este tutorial parece bastante útil.

Geralmente falando, não há cinco minutos tutorial para compiladores, porque é complicado tópico e escrever um compilador pode levar meses.Você vai ter que fazer sua própria pesquisa.

Python e Ruby são geralmente interpretados.Talvez você queira começar com um intérprete também.É geralmente mais fácil.

O primeiro passo é escrever uma linguagem formal de descrição, a gramática da linguagem de programação.Em seguida, você tem que transformar o código-fonte que você deseja compilar ou interpretar de acordo com a gramática em uma árvore de sintaxe abstrata, de um formulário interno de código-fonte que o computador entende e pode operar.Este passo normalmente é chamado de análise e o software que analisa o código-fonte é chamado de um analisador.Muitas vezes, o analisador é gerado por um gerador de analisador que transformar uma gramática formal para source ou de código de máquina.Para uma boa, não-matemática explicação de análise recomendo Técnicas de Análise - Um Guia Prático.A wikipédia tem uma comparação de analisador de geradores a partir do qual você pode escolher um que seja adequado para você.Dependendo do gerador de analisador que você escolheu, você vai encontrar tutoriais na Internet e realmente popular analisador de energia (como o GNU bison), há também livros.

Escrever um parser para o seu idioma pode ser realmente difícil, mas isso depende de sua gramática.Então eu sugiro que para manter a sua gramática simples (ao contrário de C++);um bom exemplo para isso é o LISP.

Na segunda etapa, a abstract syntax tree é transformada a partir de uma estrutura de árvore linear representação intermediária.Como um bom exemplo para esta Lua do bytecode é frequentemente citado.Mas a representação intermediária realmente depende do seu idioma.

Se você estiver criando um intérprete, você simplesmente tem que interpretar a representação intermediária.Você também pode just-in-time-compilá-lo.Eu recomendo o LLVM e libjit para just-in-time-de compilação.Para fazer o idioma utilizável, você também terá de incluir algumas funções de entrada e saída e, talvez, uma pequena biblioteca padrão.

Se você estiver indo para compilar o idioma, ele vai ser mais complicado.Você terá que criar infra-estruturas para diferentes arquiteturas de computador e gerar o código de máquina a partir da representação intermediária nessas infra-estruturas.Eu recomendo o LLVM para esta tarefa.

Existem alguns livros sobre este tópico, mas eu posso recomendar nenhum deles para uso geral.A maioria deles são muito acadêmicos ou muito prático.Não há "Ensinar a si mesmo compilador escrito em 21 dias" e, assim, você vai ter que comprar vários livros de obter um bom entendimento de todo este tópico.Se você pesquisar na Internet, você vai se deparar com alguns livros e anotações de aula.Talvez haja uma biblioteca universitária nas proximidades, onde você pode pegar livros emprestados em compiladores.

Eu também recomendo uma boa base de conhecimento em teoria da ciência da computação e teoria dos grafos, se você estiver indo para fazer o seu projeto sério.Graduação em ciência da computação também será útil.

Um livro ainda não sugeriu, mas muito importante, é "Ligadores e Carregadores" por João Levine.Se você não estiver usando um montador externo, você vai precisar de uma forma para a saída de um arquivo de objeto que pode ser ligado no final do programa.Mesmo se você estiver usando um montador externo, você provavelmente vai precisar para entender as deslocalizações e a forma como todo o processo de carregamento do programa de obras para fazer uma ferramenta de trabalho.Este livro recolhe um monte de aleatório lore todo este processo para vários sistemas, incluindo Win32 e Linux.

O Dragão Livro é, definitivamente, a "construção de compiladores" livro, mas se a sua língua não é tão complicado como o atual geração de idiomas, você pode querer olhar para o Interpretador padrão de Padrões De Projeto.

O exemplo no livro de desenhos de uma expressão regular-como a língua e é bem pensado, mas como dizem no livro, é bom para pensar no processo, mas é realmente eficaz apenas em pequenas línguas.No entanto, é muito mais rápido para escrever um Interpretador para uma pequena idioma com esse padrão do que ter que aprender tudo sobre os diferentes tipos de analisadores, yacc e lex, et cetera...

Se você estiver disposto a usar o LLVM, confira: http://llvm.org/docs/tutorial/.Ele ensina a você como escrever um compilador a partir do zero usando o LLVM do quadro, e não suponha que você tenha qualquer conhecimento sobre o assunto.

O tutorial sugerimos que você escreva o seu próprio analisador e lexer etc, mas eu aconselho você a olhar para o bison e flex, uma vez que você começa a idéia.Eles tornam a vida muito mais fácil.

Eu achei o Dragão livro muito difícil de ler, com muito foco na linguagem de teoria de que não é realmente necessário para escrever um compilador na prática.

Eu gostaria de acrescentar o Oberon livro que contém o código-fonte completo de um incrivelmente rápido e simples compilador Oberon Projeto Oberon.

Alt text

Lembro-me fazer esta pergunta a cerca de sete anos atrás, quando eu era muito nova para programação.

Eu era muito cuidadoso quando eu perguntei e, surpreendentemente, eu não tive tanto críticas como você está chegando aqui.Entretanto, me aponte na direção da "Dragão Livro"que é, na minha opinião, realmente um grande livro que explica tudo o que você precisa saber para escrever um compilador (é claro que você vai ter que dominar um idioma ou dois.Quanto mais idiomas você souber, melhor.).

E sim, muitas pessoas dizem ler esse livro é uma loucura e você não vai aprender nada com isso, mas eu discordo completamente com isso.

Muitas pessoas também dizem que a escrita de compiladores é estúpido e inútil.Bem, há um número de razões porque o compilador de desenvolvimento são úteis:

  • Porque é divertido.
  • É a educação, ao aprender como escrever compiladores você vai aprender muito sobre computação e outras técnicas que são úteis ao escrever outras aplicações.
  • Se ninguém escreveu compiladores os idiomas existentes não iria ficar melhor.

Eu não escrever o meu próprio compilador de imediato, mas depois de perguntar eu sabia por onde começar.E agora, depois de aprender muitas línguas diferentes e a leitura do Dragão Livro, a escrita não é muito de um problema.(Eu também estou estudando engenharia de computação atm, mas a maioria do que sei sobre a programação, é autodidata.)

Em conclusão, O Dragão Livro é um grande "tutorial".Mas gastar algum tempo para dominar um idioma ou dois antes de tentar escrever um compilador.Não espere para ser um compilador guru dentro de uma década ou assim, embora.

O livro também é bom se você quer aprender a escrever analisadores/intérpretes.

"...Vamos Construir um Compilador ..."

Eu segunda http://compilers.iecc.com/crenshaw/ por @sasb.Se esqueça de comprar mais livros para o momento.

Por quê?Ferramentas e linguagem.

O idioma obrigatório é o Pascal e se eu me lembro corretamente é baseado em Turbo Pascal.Isso só acontece se você vai para http://www.freepascal.org/ e baixar o compilador Pascal todos os exemplos de trabalho em linha reta a partir da página ~ http://www.freepascal.org/download.var A beaut coisa sobre o Free Pascal é que você pode usar praticamente qualquer processador ou sistema operacional que você pode cuidar.

Depois de dominar as lições, em seguida, tentar o mais avançado "Dragão Livro" ~ http://en.wikipedia.org/wiki/Dragon_book

Eu estou olhando para o mesmo conceito, e encontrei este promissor artigo por Joel Pobar,

Criar um Compilador de Linguagem para o .NET Framework - não tenho certeza onde este passou

Criar um Compilador de Linguagem para o .NET Framework - cópia em pdf do documento original

ele descreve um alto nível de conceito de um compilador e começa a inventar a sua própria linguagem para o .Net framework.Embora o seu objetivo no .Net Framework, muitos dos conceitos deve ser capaz de ser reproduzido.O Artigo abrange:

  1. Linguagem de definição de
  2. Scanner
  3. Analisador (o bit im principalmente interessado)
  4. Segmentação .Net Framework A
  5. Gerador De Código

existem outros tópicos, mas você obter o justo.

Sua voltado para pessoas a partir de fora, escrito em C# (não completamente Java)

HTH

ossos

Uma maneira fácil de criar um compilador é usar bison e flex (ou similar), construir uma árvore (AST) e gerar o código em C.Com a geração de código C, sendo o mais importante passo.Gerando código em C, o seu idioma irá automaticamente funcionar em todas as plataformas que têm um compilador de C.

A geração de código C é tão fácil como a geração de HTML (basta usar o de impressão, ou equivalente), que por sua vez é muito mais fácil do que escrever um C analisador ou analisador de HTML.

Do comp.compiladores FAQ:

"A programação de um Computador Pessoal" por Brinch Hansen Prentice-Hall, 1982 ISBN 0-13-730283-5

Esta, infelizmente, intitulado livro explica o design e a criação de um usuário único ambiente de programação para micros, usando uma Pascal como linguagem chamada Edison.O autor apresenta todo o código fonte e explicações para o passo a passo da implementação de um Edison compilador e simples sistema operacional de suporte, tudo escrito em Edison si (exceto por uma pequena área de apoio kernel escrito em um simbólica assembler para o PDP 11/23;o código-fonte completo pode também ser encomendado para o IBM PC).

As coisas mais interessantes sobre este livro são:1) a sua capacidade para demonstrar como criar um completo, auto-suficiente, auto-manutenção, útil do compilador e do sistema operacional, e 2) a interessante discussão de linguagem de design e especificação de problemas e trade-offs no Capítulo 2.

"Brinch Hansen em Compiladores Pascal" por Brinch Hansen Prentice-Hall, 1985 ISBN 0-13-083098-4

Uma outra luz-no-teoria pesado-na-pragmática veja-como-a-código de catálogo.O autor apresenta a o design, a implementação, e o código-fonte completo para um compilador e código de p interpretador para a linguagem Pascal- (Pascal "menos"), uma Pascal subconjunto com um valor booleano e tipos inteiros (mas não de personagens, reais, subranged ou tipos enumerados), constante e definições de variáveis e arrays e tipos de registo (mas não embalados, variant, definir, ponteiro, sem nome, mudar o nome ou tipos de arquivo), expressões, instruções de atribuição, aninhada definições de procedimento com valor e variável os parâmetros, no caso de instruções, enquanto instruções e início fim blocos (mas não definições de função, parâmetros processuais, instruções goto e etiquetas, instruções de caso, repita as instruções, para instruções, e com as declarações).

O compilador e interpretador de são escritos em Pascal* (Pascal "estrela"), uma Pascal subconjunto estendido com alguns Edison características de estilo para a criação de desenvolvimento de software de sistemas.Um Pascal* compilador para o IBM PC é vendido por o autor, mas é fácil para a porta que o livro de Pascal compilador para qualquer conveniente Pascal plataforma.

Este livro faz com que a concepção e implementação de um compilador parecer fácil.Eu particularmente gosto da maneira como o autor está preocupado com a qualidade, confiabilidade e testes.O compilador e interpretador pode ser facilmente usado como base para um maior envolvimento idioma ou compilador do projeto, especialmente se você está pressionado para obter rapidamente alguma coisa e execução.

Você deve verificar para fora Dario Bacon "ichbins", o que é um compilador para um pequeno dialeto do Lisp, segmentação C, em pouco mais de 6 páginas de código.A vantagem que ele tem sobre a maioria dos brinquedos compiladores é a de que a língua é completa o suficiente para que o compilador está escrito.(O pacote também inclui um interpretador para iniciar a coisa.)

Há mais coisas sobre o que eu achei útil em aprender a escrever um compilador no meu Ur-Regime De página web.

Python vem com uma píton de compilador escrito em Python.Você pode ver o código fonte, e abrange todas as fases, desde a análise, abstract syntax tree, emitindo-se o código, etc.Cortá-lo.

O LCC compilador (taxas) (página do projeto) de Fraser e Hanson é descrito em seu livro "Um Redefiníveis Compilador de C:Projeto e Implementação".É bastante legível e explica todo o compilador, para baixo, para a geração de código.

Desculpe, está em espanhol, mas esta é a bibliografia de um curso chamado "Compiladores e Intérpretes" (Compiladores e Interpretadores), na Argentina.

O curso foi de linguagem formal da teoria para o compilador de construção, e estes são os tópicos que você precisa para construir, pelo menos, um simples compilador:

  • Compiladores de Design em C.
    Allen I.Holub

    Prentice-Hall.1990.

  • Compiladores.Teoría y Construcción.
    Sanchís Llorca, F. J., Galán Pascual, C.Editorial Paraninfo.1988.

  • Compilador De Construção.
    Niklaus Wirth

    Addison-Wesley.1996.

  • Lenguajes, Gramáticas y Autómatas.Un enfoque práctico.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán.Addison-Wesley Iberoamericana (España).1997.

  • A arte de compilador de design.A teoria e a prática.
    Thomas Pittman, James Peters.

    Prentice-Hall.1992.

  • Orientada A Objetos De Construção De Compilador.
    Jim Holmes.
    Prentice Hall, Englewood Cliffs, N. J.1995

  • Compiladores.Conceptos Fundamentales.
    B.Teufel, S.Schmidt, T.Teufel.

    Addison-Wesley Iberoamericana.1995.

  • Introdução à Teoria de Autômatos, Linguagens e Computação.

    John E.Hopcroft.Jeffref D.Ullman.
    Addison-Wesley.1979.

  • Introdução às linguagens formais.
    György E.Révész.

    Mc Graw Hill.1983.

  • Técnicas De Análise.Um Guia Prático.
    Dick Grune, Ceriel Jacobs.
    Impreso por los autores.1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc:Ainda Outro Compiler-Compilador.
    Stephen C.Johnson
    Ciência Da Computação Relatório Técnico Nº 32, De 1975.Bell Laboratórios.Murray Hill, New
    Jersey.

  • Lex:Um Gerador De Analisador Léxico.
    M.E.Lesk, E.Schmidt.Ciência Da Computação Técnico Relatório Nº 39, De 1975.Laboratórios Bell.Murray Hill, New Jersey.

  • lex & yacc.
    João R.Levine, Tony Mason, Doug Brown.
    O'Reilly & Associates.1995.

  • Elementos da teoria da computação.
    Harry R.Lewis, Christos H.Papadimitriou.Segunda Edición.Prentice Hall.1998.

  • Onu Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Controle.
    Salvador, V.Cavadini.
    Trabalho Final de Grado para obtener el Título de Ingeniero pt Computación.
    Faculdade de Matemática Aplicada.U. C. S. E.2001.

  1. Este é um grande assunto.Não subestime esse ponto.E não subestime o meu ponto de vista para não subestimá-lo.
  2. Eu ouço a Dragão Livro é um (a?) lugar para começar, junto com a pesquisa.:) Obter a melhor pesquisa, eventualmente, vai ser a sua vida.
  3. A construção de sua própria linguagem de programação é absolutamente um bom exercício!Mas sei que ele nunca vai ser usado para qualquer propósito prático no final.As exceções são poucas e muito de longe a longe.

Não um livro, mas um artigo técnico e muito divertida experiência de aprendizagem se você quiser saber mais sobre compiladores (e metacompilers)...Este site orienta a criação de um completamente auto-contido sistema de compilação que pode compilar si mesmo e a outros idiomas:

Tutorial:Metacompilers Parte 1

Tudo isso é baseado em um pouco surpreendente 10-página técnico papel:

Val Schorre META II:Uma Sintaxe Orientada Compilador De Idioma De Escrita

a partir honesto-a-deus de 1964.Aprendi a construir compiladores de volta em 1970.Há uma alucinante momento em que você finalmente grok como o compilador pode regenerar....

Eu sei que o site do autor a partir de meus dias de faculdade, mas eu não tenho nada a ver com o site.

Há um monte de boas respostas aqui, então eu pensei que eu apenas acrescentar mais um à lista:

Eu tenho um livro chamado Projeto Oberon mais de uma década atrás, que tem alguns muito bem escrito o texto sobre o compilador.O livro realmente se destaca no sentido de que a origem e explicações é muito prática e legível.O texto completo (edição de 2005), foi disponibilizado em pdf, então você pode baixar agora mesmo.O compilador é discutido no capítulo 12:

http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth, Jürg Gutknecht

(O tratamento não é tão extensa como seu livro em compiladores)

Eu li vários livros sobre compiladores, e eu posso segundo o dragão livro, o tempo gasto neste livro, vale muito a pena.

Se você estiver interessado em escrever um compilador para uma linguagem funcional (em vez de um procedimento de um) Simon Peyton-Jones e David Lester "A implementação de uma linguagem funcional:um tutorial"é um excelente guia.

O conceitual básico de como avaliação funcional obras é guiado pelos exemplos simples, mas poderosa linguagem funcional chamado de "Core".Além disso, cada parte do Núcleo do compilador de linguagem é explicado com exemplos de código em Miranda (puro, funcional de linguagem muito semelhante ao Haskell).

Vários tipos diferentes de compiladores são descritos, mas mesmo se você apenas seguir o chamado modelo de compilador para o Núcleo, você terá uma excelente compreensão do que torna a programação funcional de escala.

Eu gostei do Crenshaw tutorial também, porque torna-se absolutamente claro que um compilador é apenas mais um programa que lê uma entrada e escreve algumas de colocar para fora.

Lê-lo.

O trabalho que se pretende, mas, em seguida, olhar para o outro de referência sobre como o maior e mais completo compiladores estão realmente escritas.

E leia De Confiança Confiança, para obter uma pista sobre o unobvious coisas que pode ser feito neste domínio.

Você pode usar BCEL pela Apache Software Foundation.Com esta ferramenta você pode gerar assembler-como o código, mas é Java com o BCEL API.Você pode aprender como você pode gerar código de idioma intermédio (no caso de código de byte).

Exemplo simples

  1. Criar uma classe Java com esta função:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Agora execute BCELifier com esta classe

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

Você pode ver o resultado no console para toda a classe (como a compilação de código de byte MyClass.java).O código para a função é essa:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

Não incluído na lista até agora é este livro:

Noções básicas do Compilador Design (Torben Mogensen) (a partir do dept.de Ciência da computação, Universidade de Copenhaga)

Eu também estou interessado em aprender sobre compiladores e pretende entrar de que a indústria no próximo par de anos.Este livro é o ideal livro de teoria para começar a aprender compiladores tanto quanto eu posso ver.Ele é LIVRE para copiar e reproduzir, de forma limpa e cuidadosamente escrito e dá-lo para você em inglês simples, sem qualquer código, mas ainda apresenta a mecânica por meio de instruções e diagramas etc.Vale a pena uma olhada imo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top