Aprender a escrever um compilador

votos
699

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

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

Publicado 04/08/2008 em 23:46
fonte usuário
Em outras línguas...                            


40 respostas

votos
1k

Big Lista de Recursos:

Lenda:

  • ¶ Link para um arquivo PDF
  • $ Link para um livro impresso
Respondeu 04/08/2008 em 23:52
fonte usuário

votos
69

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; a metade superior e um fundo e um. A metade superior geralmente leva o idioma de origem e converte-lo em uma representação intermediária, ea metade inferior cuida da geração de código específico da plataforma.

No entanto, uma idéia para uma maneira fácil de abordar este tema (o que usamos na minha classe compiladores, pelo menos) é construir o compilador nas duas peças descritas acima. Especificamente, você vai ter uma boa idéia de todo o processo por apenas construir a metade superior.

Basta fazer a metade superior permite que você obtenha a experiência de escrever o analisador léxico e analisador e ir para gerar algum "código" (que a representação intermediária mencionei). Por isso vai levar o seu programa de código e convertê-lo em uma outra representação e fazer alguma otimização (se você quiser), que é o coração de um compilador. A metade inferior, então, tomar essa 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 executável PE.

Alguns livros sobre este tema que eu achei particularmente útil foi Princípios e Técnicas de Compiladores (ou o Livro do dragão, devido ao dragão bonito na capa). Tem alguma grande teoria e definitivamente cobre Context-Free Gramáticas de uma forma muito acessível. Além disso, para a construção do analisador léxico e analisador, você provavelmente vai usar o lex * nix ferramentas e yacc. E uninterestingly suficiente, o livro chamado " lex e yacc " pegou onde o Livro Dragão parou para esta parte.

Respondeu 21/07/2009 em 00:01
fonte usuário

votos
54

Acho implementação do compilador moderno em ML é o melhor texto introdutório compilador escrito. Há uma versão Java e uma versão C também, qualquer um que pode ser mais acessível dada a sua línguas fundo. O livro reúne uma grande quantidade de material útil básico (digitalização e análise, análise semântica, registros de ativação, a seleção instrução, RISC e x86 geração de código nativo) e vários tópicos "avançados" (compilação de OO e linguagens funcionais, polimorfismo, coleta de lixo, otimização e formulário de atribuição estática única) em um espaço relativamente pequeno (~ 500 páginas).

Eu prefiro Implementação Compiler Modern ao livro do dragão porque Modern compilador implementação levantamentos menos do campo - em vez disso, tem uma cobertura realmente sólido de todos os tópicos que você precisa para escrever uma séria compilador, decente. Depois de trabalhar com este livro você estará pronto para enfrentar trabalhos de investigação directamente para mais profundidade se você precisar dele.

Devo confessar que tenho um fraquinho sério para de Niklaus Wirth Compiler Construção. É disponível on-line como um PDF. Acho estética programação da Wirth simplesmente lindo, no entanto, algumas pessoas acham o seu estilo muito mínima (por exemplo Wirth favorece analisador sintático descendente recursivo, mas a maioria dos cursos de CS concentrar em ferramentas de gerador de analisador;. Projetos de linguagem de Wirth são bastante conservadora) Compiler Construção é uma destilação muito sucinta de idéias básicas de Wirth, então se você gosta de seu estilo ou não ou não, eu recomendo a leitura deste livro.

Respondeu 10/08/2008 em 08:54
fonte usuário

votos
45

Concordo com a referência do dragão Livro; IMO, é o guia definitivo para compilador construção. Prepare-se para alguma teoria incondicional, embora.

Se você quiser um livro que é mais leve em teoria, jogo Scripting Mastery pode ser uma melhor livro para você. Se você é um novato total na teoria de compiladores, ele fornece uma introdução suave. Não abrange métodos de análise mais práticos (que optam pela descida recursiva não preditivo sem discutir LL ou análise LR), e se bem me lembro, ele nem sequer discutir qualquer tipo de teoria de otimização. Além disso, em vez de compilar para código de máquina, ele compila a um bytecode que é suposto para ser executado em uma máquina virtual que você também escrever.

É ainda uma leitura decente, especialmente se você pode pegá-lo para barato na Amazon. Se você quiser apenas uma introdução fácil para compiladores, Jogo Scripting Mastery não é um mau caminho a percorrer. Se você quer ir incondicional na frente, então você deve se contentar com nada menos do que o Livro do dragão.

Respondeu 05/08/2008 em 00:08
fonte usuário

votos
28

"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 confira CALÃO . Isto é semelhante ao "Vamos construir um compilador", mas é um recurso muito melhor, especialmente para iniciantes. Isto vem com um tutorial pdf que tem uma abordagem 7 passo de ensinar-lhe um compilador. Adicionando o link Quora, uma vez que tem os links para todos os vários portos de Gíria, em C ++, Java e JS, também intérpretes em python e java, originalmente escritos usando C # e da plataforma .NET.

Respondeu 04/08/2008 em 23:56
fonte usuário

votos
24

Se você estiver olhando para usar ferramentas poderosas e de nível superior em vez de construir tudo sozinho, atravessando os projetos e leituras para este curso é uma boa opção. É um curso de línguas pelo autor do ANTLR motor analisador Java. Você pode obter o livro para o curso como um PDF a partir dos Pragmatic Programmers .

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

LLVM, por sinal, é simplesmente fantástico. Muitas situações em que você pode normalmente compilar para baixo a montagem, você estaria muito melhor compilação de Representação Intermediária do LLVM vez. É nível superior, plataforma de cruz, e LLVM é bastante boa para a geração de montagem optimizada a partir dele.

Respondeu 05/08/2008 em 00:13
fonte usuário

votos
20

Se você tem pouco tempo, eu recomendo "Compiler Construção" de Niklaus Wirth (Addison-Wesley. 1996) , um pequeno folheto que você pode ler em um dia, mas explica o básico (incluindo como implementar lexers, analisador sintático descendente recursivo, e suas próprias máquinas virtuais baseadas em pilha). Depois disso, se você quiser um mergulho profundo, não há nenhuma maneira em torno do livro Dragão como outros comentadores sugerem.

Respondeu 29/08/2010 em 00:14
fonte usuário

votos
17

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

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

Respondeu 20/07/2009 em 23:47
fonte usuário

votos
16

De um modo geral, não há cinco minutos tutorial para compiladores, porque é um tema complicado e escrevendo um compilador pode levar meses. Você terá que fazer sua própria pesquisa.

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

O primeiro passo é escrever uma linguagem de descrição formal, a gramática da sua linguagem de programação. Então você tem que transformar o código fonte que você quer compilar ou interpretar de acordo com a gramática em uma árvore de sintaxe abstrata, uma forma interna do código fonte que o computador entende e pode operar. Esta etapa é geralmente chamado de análise eo software que analisa o código-fonte é chamada de um analisador. Muitas vezes, o analisador é gerado por um gerador de analisador que transformar uma gramática formal em código de máquina fonte oder. Para uma boa explicação, não-matemático de análise Eu recomendo análise técnicas - Um Guia Prático. Wikipedia tem uma comparação de geradores de analisador a partir do qual você pode escolher aquele que é adequado para você. Dependendo do gerador de analisador que você escolheu,

Escrever um analisador para o idioma pode ser muito difícil, mas isso depende de sua gramática. Por isso, sugiro para manter sua gramática simples (ao contrário do C ++); um bom exemplo para isso é LISP.

No segundo passo, a árvore de sintaxe resumo é transformado a partir de uma estrutura de árvore para uma representação intermédia linear. Como um bom exemplo para bytecode desta Lua é frequentemente citado. Mas a representação intermediária realmente depende do seu idioma.

Se você está construindo um intérprete, você simplesmente vai ter que interpretar a representação intermediária. Você poderia também just-in-time compilar-lo. Eu recomendo LLVM e libjit para just-in-time-compilação. Para tornar a linguagem 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, será mais complicado. Você terá que escrever backends para diferentes arquiteturas de computadores e gerar código de máquina a partir da representação intermediária nessas backends. Eu recomendo LLVM para esta tarefa.

Existem alguns livros sobre este tema, mas posso recomendar nenhum deles para uso geral. A maioria deles são demasiado académico ou muito prático. Não há nenhuma "Ensine-se compilador escrito em 21 dias" e, portanto, você terá que comprar vários livros para obter uma boa compreensão de todo este tema. Se você pesquisar na Internet, você vai se deparar com alguns alguns livros online e notas de aula. Talvez haja uma biblioteca de universidade próxima onde você pode emprestar livros sobre compiladores.

Eu também recomendo um bom conhecimento de fundo na teoria de ciência da computação e gráfico teórico, se você estiver indo para fazer seu projeto sério. A licenciatura em ciência da computação também será útil.

Respondeu 21/07/2009 em 11:37
fonte usuário

Respondeu 18/05/2010 em 00:38
fonte usuário

votos
11

Um livro ainda não sugerido, mas muito importante é "ligadores e carregados" por John Levine. Se você não estiver usando um montador externo, você vai precisar de uma maneira de saída de um arquivo de objeto que pode ser ligado em seu programa final. Mesmo se você estiver usando um montador externo, você provavelmente vai precisar de compreender as deslocalizações e como todo o processo de carregar o programa trabalha para tornar uma ferramenta de trabalho. Este livro reúne uma grande quantidade do lore aleatória em torno este processo para vários sistemas, incluindo Win32 e Linux.

Respondeu 18/08/2008 em 21:18
fonte usuário

votos
10

Achei o livro Dragão demasiado difícil de ler com muita ênfase em teoria da linguagem que não é realmente necessário para escrever um compilador na prática.

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

texto alternativo

Respondeu 09/08/2010 em 19:33
fonte usuário

votos
10

Se você está disposto a usar LLVM, vejam isto: http://llvm.org/docs/tutorial/ . Ela ensina-lhe como escrever um compilador a partir do zero usando a estrutura do LLVM, e não assume que você tem algum conhecimento sobre o assunto.

O tutorial sugiro que você escrever seu próprio analisador e lexer etc, mas eu aconselho você a olhar para bisões e flexionar uma vez que você começa a idéia. Eles tornam a vida muito mais fácil.

Respondeu 20/08/2008 em 11:01
fonte usuário

votos
10

O Livro do dragão é definitivamente o "compiladores de construção" livro, mas se o seu idioma não é tão complicada como a atual geração de idiomas, você pode querer olhar para o padrão Interpreter de Design Patterns .

O exemplo no livro projeta uma linguagem de expressão semelhante regular e é bem pensado, mas como dizem no livro, é bom para pensar durante o processo, mas é eficaz realmente apenas em pequenas línguas. No entanto, é muito mais rápido para escrever um interpretador para uma linguagem pequena, com este padrão do que ter de aprender sobre todos os diferentes tipos de analisadores, yacc e lex, et cetera ...

Respondeu 05/08/2008 em 17:16
fonte usuário

votos
9

Lembro-me de fazer esta pergunta cerca de sete anos atrás, quando eu era bastante novo em programação. Eu era muito cuidadoso quando eu perguntei e surpreendentemente eu não tive tanto crítica como você está recebendo aqui. Eles fizeram no entanto me apontar na direção do " Livro do dragão ", que é, na minha opinião, realmente um grande livro que explica tudo o que você precisa saber para escrever um compilador (você vai, naturalmente, tem que dominar uma língua ou dois. Quanto mais idiomas você sabe, melhor.).

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

Muitas pessoas também dizem que escrever compiladores é estúpido e inútil. Bem, há uma série de razões pelas quais o desenvolvimento do compilador são úteis: - Porque é divertido. - É educacional, quando aprender a escrever compiladores que você vai aprender muito sobre ciência da computação e outras técnicas que são úteis ao escrever outras aplicações. - Se ninguém escreveu compiladores as línguas existentes não iria ficar melhor.

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

Em conclusão: - O Livro do dragão é um grande "tutorial". Mas passar algum tempo dominar um idioma ou dois antes de tentar escrever um compilador. Não espere para ser um guru compilador dentro da próxima década ou assim embora.

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

Respondeu 06/08/2009 em 23:37
fonte usuário

votos
9

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

Criar um compilador de linguagem para o .NET Framework

ele discute um conceito alto nível de um compilador e começa a inventar seu próprio langauge para o framework .Net. Embora seu voltada para o .Net Framework, muitos dos conceitos deve ser capaz de ser reproduzida. O artigo abrange:

  1. definição langauge
  2. Scanner
  3. Analisador (o bit im interessado principalmente no)
  4. Segmentação do .Net Framework A
  5. Gerador de código

há outros temas, mas você começa a apenas.

Sua destinado a pessoas começando, escrito em C # (não é Java)

HTH

ossos

Respondeu 31/12/2008 em 00:01
fonte usuário

votos
9

"... Vamos construir um compilador ..."

Eu tinha segundo http://compilers.iecc.com/crenshaw/ por @sasb . Esquecer de comprar mais livros para o momento.

Por quê? Ferramentas e linguagem.

O idioma exigido é Pascal e se bem me lembro é baseado em Turbo-Pascal. Isso só acontece se você ir para http://www.freepascal.org/ e descarregue o compilador Pascal todos os exemplos trabalhar diretamente da página ~ http://www.freepascal.org/download.var A coisa beaut sobre Free Pascal é que você pode usá-lo quase tudo o processador ou sistema operacional que você pode cuidar.

Depois de ter dominado as lições e depois tentar o mais avançado " Livro do dragão " ~ http://en.wikipedia.org/wiki/Dragon_book

Respondeu 20/08/2008 em 12:28
fonte usuário

votos
8

Do comp.compilers FAQ :

"Programar um computador pessoal" por Per Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

Este livro, infelizmente,-intitulado explica a concepção e criação de um ambiente de programação de usuário único para micros, usando uma linguagem Pascal, chamado Edison. O autor apresenta todo o código fonte e explicações para a implementação passo-a-passo de um compilador Edison e sistema operacional compatível simples, tudo escrito em si (com exceção de um pequeno núcleo de suporte escrito em uma montadora simbólica para PDP 11/23 Edison; o fonte completo também podem ser encomendados para o PC IBM).

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

"Brinch Hansen on Pascal Compilers" por Per Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

Outro livro luz na teoria heavy-on-pragmática aqui está-how-to-code-lo. O autor apresenta o desenho, implementação e código-fonte completo para um compilador e intérprete p-código para Pascal- (Pascal "menos"), um subconjunto Pascal com booleanos e inteiros tipos (mas sem personagens, reais, subranged ou tipos enumerados) , constante e definições e tipos de matriz e gravar variável (mas não lotado, variante, conjunto, ponteiro,, renomeado ou tipos de arquivos sem nome), expressões, declarações de atribuição, as definições de procedimento aninhadas com parâmetros de valor e variáveis, if, while, blocos e começam-end (mas sem definições de função, parâmetros processuais, declarações Goto e rótulos, caso declarações, declarações repetição, para declarações, e com declarações).

O compilador e intérprete está escrito em Pascal * (Pascal "estrela"), um subconjunto Pascal estendida com algumas características Edison-estilo para a criação de sistemas de desenvolvimento de software. Um compilador Pascal * para o IBM PC é vendido pelo autor, mas é fácil para a porta compilador Pascal- do livro para qualquer plataforma Pascal conveniente.

Este livro faz o projeto 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 intérprete pode ser facilmente usado como base para um projeto de linguagem ou compilador mais envolvidos, especialmente se você está pressionado para obter rapidamente algo pronto e funcionando.

Respondeu 26/06/2010 em 21:17
fonte usuário

votos
8

Você deve verificar se "de Darius Bacon ichbins ", que é um compilador para uma pequena dialeto Lisp, visando C, em pouco mais de 6 páginas de código. A vantagem que tem sobre a maioria dos compiladores de brinquedo é que a linguagem é completo o suficiente para que o compilador está escrito nele. (O tarball também inclui um intérprete para inicializar a coisa.)

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

Respondeu 05/10/2008 em 17:00
fonte usuário

votos
8

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

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

Respondeu 20/08/2008 em 10:56
fonte usuário

votos
7

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

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

  • Compiladores Design, em C.
    Allen I. Holub

    Prentice-Hall. 1990.

  • Compiladores. Teoria y Construcción.
    Sanchís Llorca, FJ, Galán Pascual, C. Paraninfo Editorial. 1988.

  • Compiler Construção.
    Niklaus Wirth

    Addison-Wesley. 1996.

  • Lenguajes, Gramáticas y autômatos. Un enfoque práctico.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán. Addison-Wesley Iberoamericana (Espanha). 1997.

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

    Prentice-Hall. 1992.

  • Compiler Construção Orientada a Objetos.
    Jim Holmes.
    Prentice Hall, Englewood Cliffs, NJ 1995

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

    Addison-Wesley Iberoamericana. 1995.

  • Introdução à Teoria dos 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.

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

  • Yacc: Yet Another Compiler-Compiler.
    Stephen C. Johnson
    Ciência da Computação Relatório Técnico Nº 32, 1975. Bell Laboratories. Murray Hill, Nova
    Jersey.

  • Lex: um analisador de Generator Lexical.
    ME Lesk, E. Schmidt. Computing Relatório Técnico Ciência Nº 39, 1975. Bell Laboratories. Murray Hill, Nova Jersey.

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

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

  • Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de controle.
    Salvador V. Cavadini.
    Trabajo Final de Grado para obtener el Título de Ingeniero en Computación.
    Facultad de Matemática Aplicada. UCSE 2001.

Respondeu 25/04/2009 em 18:23
fonte usuário

votos
7

O compilador LCC ( wikipedia ) ( homepage do projeto ) de Fraser e Hanson é descrito em seu livro "A Retargetable C Compiler: Desenho e Implementação". É bastante legível e explica todo o compilador, até a geração de código.

Respondeu 16/09/2008 em 17:21
fonte usuário

votos
7

Python vem com um compilador python escrito em Python. Você pode ver o código fonte, e inclui todas as fases, desde a análise, árvore de sintaxe abstrata, código emissor, etc. Cortá-lo.

Respondeu 12/08/2008 em 12:25
fonte usuário

votos
6

Não é um livro, mas um documento técnico e uma experiência de aprendizagem extremamente divertido se você quiser saber mais sobre compiladores (e metacompilers) ... Este website percorre a construção de um sistema de compilador completamente auto-suficiente que pode compilar a si mesmo e outros idiomas:

Tutorial: Metacompilers Parte 1

Isso tudo é baseado em uma de 10 páginas documento técnico pouco surpreendente:

Val Schorre META II: A Syntax-Oriented Compiler Escrita Idioma

de honesto-a-deus 1964. Aprendi a construir compiladores a partir deste em 1970. Há um momento alucinante quando você finalmente Grok como o compilador pode regenerar-se ....

Eu sei que o website autor dos meus tempos de faculdade, mas não tenho nada a ver com o site.

Respondeu 28/08/2009 em 01:01
fonte usuário

votos
5
  1. Este é um assunto vasto. Não subestime este ponto. E não subestime o meu ponto não subestimar isso.
  2. Eu ouço o Livro do dragão é um (a?) Lugar para começar, juntamente com a procura. :) ficar melhor na pesquisa, eventualmente, ele vai ser a sua vida.
  3. Construindo sua própria linguagem de programação é absolutamente um bom exercício! Mas sei que isso nunca vai ser usado para qualquer finalidade prática no final. As excepções a este são poucos e muito distantes entre si.
Respondeu 20/07/2009 em 23:44
fonte usuário

votos
5

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

Os fundamentos conceituais de como funciona a avaliação funcional é guiado por exemplos em uma linguagem simples, mas poderosa funcional chamado "núcleo". Além disso, cada parte do compilador de linguagem núcleo é explicado com exemplos de código em Miranda (uma linguagem puramente funcional muito semelhante ao Haskell).

Vários tipos diferentes de compiladores são descritos, mas mesmo se você só siga o chamado compilador modelo para Núcleo você terá uma excelente compreensão do que faz carrapato programação funcional.

Respondeu 01/10/2008 em 10:30
fonte usuário

votos
5

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

Eu tenho um livro chamado Projeto Oberon mais de uma década atrás, que tem um texto muito bem escrito sobre o compilador. O livro realmente se destaca no sentido de que a fonte e explicações é muito mãos e legível. O texto completo (edição de 2005) foi disponibilizado em pdf, para que você pode baixar agora. O compilador é discutida 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 sobre compiladores)

Já li vários livros sobre compiladores, e eu posso segundo o livro dragão, tempo gasto em este livro é muito interessante.

Respondeu 19/09/2008 em 00:31
fonte usuário

votos
4

Você pode usar BCEL pela Apache Software Foundation. Com esta ferramenta você pode gerar o código assembler-like, mas é Java com a API BCEL. Você pode aprender como você pode gerar código de linguagem intermediária (neste código byte caso).

exemplo simples

  1. Crie 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 na consola para toda a classe (como compilar o código byte MyClass.java). O código para a função é a seguinte:

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();
}
Respondeu 14/07/2011 em 16:42
fonte usuário

votos
4

Eu gostei do tutorial Crenshaw também, porque torna absolutamente claro que um compilador é apenas mais um programa que lê alguma entrada e escreve algum posto para fora.

Leia-o.

Trabalhá-lo se você quiser, mas, em seguida, olhar para outra referência sobre como compiladores maiores e mais completos são realmente escrito.

E ler a confiar Confiança , para obter uma pista sobre as coisas unobvious que pode ser feito neste domínio.

Respondeu 22/08/2008 em 16:57
fonte usuário

votos
3

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

Noções básicas de Compiler projeto (Torben Mogensen) (do dept. De Ciência da Computação da Universidade de Copenhaga)

Eu também estou interessado em aprender sobre compiladores e pretende entrar que a indústria no próximo par de anos. Este livro é o livro de teoria ideal para começar compiladores de aprendizagem, tanto quanto eu posso ver. É livre para copiar e reproduzir, de forma limpa e cuidadosamente escrito e dá-la a você na planície Inglês sem qualquer código, mas ainda apresenta a mecânica por meio de instruções e diagramas etc. Worth um olhar imo.

Respondeu 12/03/2014 em 17:05
fonte usuário

votos
3

Ausente da lista: Coleta de Lixo: Algoritmos para gerenciamento de memória dinâmico automático, por Jones e Lins.

(Supondo que você está escrevendo o compilador e sistema de execução, e que você está implementando uma linguagem de lixo coletado.

Respondeu 27/06/2010 em 00:43
fonte usuário

votos
3

Eu escrevi um tutorial online sobre projeto de compiladores, intitulado "Vamos construir um script Motor-Compiler, bem como um compilador de código nativo chamado Bxbasm do doc on-line está em:. Http://geocities.com/blunt_axe_basic/tutor/Bxb- Tutor.doc

Os documentos, arquivos de suporte e compilador, em forma zip, está em: http://geocities.com/blunt_axe_basic

Também: http://tech.groups.yahoo.com/group/QDepartment

Steve A.

Respondeu 13/01/2009 em 23:31
fonte usuário

votos
3

O Livro do dragão é muito complicado. Então ignorá-lo como ponto de partida. É bom e faz você pensar muito uma vez que você já tem um ponto de partida, mas para começar, talvez você deve simplesmente tentar escrever um avaliador de matemática expressão / lógica usando técnicas RD, LL ou de análise LR com tudo (léxico / análise) escrito à mão em talvez C / Java. Isso é interessante em si mesmo e lhe dá uma idéia dos problemas envolvidos em um compilador. Então você pode saltar para o seu próprio DSL usando alguma linguagem de script (desde processamento de texto é geralmente mais fácil nesses) e como alguém disse, gerar o código em qualquer linguagem de script em si ou C. Você provavelmente deve usar flex / bison / antlr etc para fazer o léxico / análise, se você estiver indo para fazê-lo em c / java.

Respondeu 01/10/2008 em 21:24
fonte usuário

votos
2

Estou surpreso que não tenha sido mencionado, mas de Donald Knuth The Art of Computer Programming foi originalmente escrito como uma espécie de tutorial na escrita compilador.

Claro, a propensão de Dr. Knuth para ir em profundidade sobre temas levou ao compilador de escrita tutorial sendo ampliado para cerca de 9 volumes, apenas três dos quais foram efectivamente publicado. É uma exposição bastante completa sobre temas de programação, e abrange tudo o que você poderia precisar de saber sobre a escrita de um compilador, nos mínimos detalhes.

Respondeu 21/07/2009 em 01:20
fonte usuário

votos
2

Como ponto de partida, que vai ser bom para criar um analisador descendente recursivo (RDP) (digamos que você deseja criar seu próprio sabor do BASIC e construir um interpretador BASIC) para entender como escrever um compilador. Eu encontrei a melhor informação em Herbert Schild Usuários C Poder, capítulo 7. Este capítulo refere-se a um outro livro de H. Schildt "C a referência completa", onde ele explica como criar uma calculadora (um analisador expressão simples). Eu encontrei dois livros no eBay muito barato. Você pode verificar o código para o livro, se você vai para www.osborne.com ou check-in www.HerbSchildt.com eu encontrei o mesmo código, mas para C # no seu último livro

Respondeu 20/08/2008 em 12:16
fonte usuário

votos
1

Se você não está apenas à procura de livros, mas também interessado em web sites que têm artigos sobre o tema, eu tenho um blog sobre vários aspectos da criação de uma linguagem de programação. A maioria das mensagens pode ser encontrada no do meu blog categoria "Design Língua" .

Em particular, eu tampa gerar o código de máquina Intel manualmente, gerando automaticamente máquina- ou código de bytes, a criação de um interpretador de código de bytes, escrevendo um tempo de execução orientada a objectos, criando um carregador simples, e escrever um colector de lixo simples marca / varredura. Tudo isso de uma forma muito prática e pragmática em vez de aborrecê-lo com muita teoria.

Gostaria de receber feedback sobre estes.

Respondeu 02/04/2014 em 13:39
fonte usuário

votos
1

A abordagem mais rápida é através de dois livros:

Versão 1990, uma introdução às técnicas Compilando, um primeiro curso usando ANSI C, Lex e Yacc por JP Bennett - um equilíbrio perfeito de exemplo de código, análise de teoria e design-lo contém um compilador completo escrito em C, lex e yacc para uma gramática simples

Dragão Livro (versão anterior) - principalmente uma referência detalhada para os recursos não abordados no livro anterior

Respondeu 01/04/2011 em 20:39
fonte usuário

votos
1

Sempre que eu quero experimentar uma nova ideia linguagem, eu só escrever um analisador simples, e tê-lo gerar alguma linguagem que é fácil de obter bons compiladores para, como C.

Como você acha que C ++ foi feito?

Respondeu 21/07/2009 em 01:42
fonte usuário

votos
1

Se você é como eu, que não tem educação formal ciência da computação, e está interessado em edifício / querem saber como um compilador funciona:

Estou recomendar "Processadores Linguagem de Programação em Java: Compiladores e Intérpretes", um livro surpreendente para um programador de computador auto-didata.

Do meu ponto de vista, a compreensão daqueles teoria da linguagem básica, automatizar máquina, e teoria dos conjuntos não é um grande problema. O problema é como transformar essas coisas em código. O livro acima diz-lhe como escrever um parser, o contexto de análise, e gerar código. Se você não consegue entender este livro, então eu tenho que dizer, dar-se a construção de um compilador. O livro é o melhor livro de programação que já li.

Há um outro livro, também é bom, Design Compiler em C . Há um monte de código, e isso diz tudo sobre como construir um compilador e lexer ferramentas.

Construção de um compilador é uma prática de programação divertida e pode ensinar-lhe montes de habilidades de programação.

Não compre o livro do dragão . Foi um desperdício de dinheiro e tempo e não é para um praticante.

Respondeu 05/02/2009 em 03:55
fonte usuário

votos
0
  • Comece por ter certeza que você pode responder a maioria das perguntas marcado C ++ aqui no estouro de pilha.
  • Depois disso, você deve se certificar de que você compreender como outros compiladores trabalhar e entender [partes] seu código fonte.
  • Você vai perceber que você precisa assembler e vai começar a aprender assembler até que você possa responder a muitas perguntas com essa tag.
  • Se você chegou até aqui, você vai descobrir que vários anos se passaram e perceber o quão grande um projeto como este é e possivelmente sorrir para sua própria pergunta daquela época (se esta página ainda existir na época) ...
Respondeu 21/07/2009 em 00:01
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more