Uma jornada de escrita do compilador
Neste repositório Github, estou documentando minha jornada para escrever um compilador autocompilação para um subconjunto da linguagem C. Também estou escrevendo os detalhes para que, se você quiser acompanhar, haja uma explicação do que fiz, por que e com algumas referências à teoria dos compiladores.
Mas sem muita teoria, quero que esta seja uma jornada prática.
Aqui estão as etapas que executei até agora:
- Parte 0: Introdução à Jornada
- Parte 1: Introdução à Varredura Lexical
- Parte 2: Introdução à análise
- Parte 3: Precedência do Operador
- Parte 4: Um compilador real
- Parte 5: Declarações
- Parte 6: Variáveis
- Parte 7: Operadores de Comparação
- Parte 8: Declarações If
- Parte 9: Loops While
- Parte 10: Loops For
- Parte 11: Funções, parte 1
- Parte 12: Tipos, parte 1
- Parte 13: Funções, parte 2
- Parte 14: Gerando Código Assembly ARM
- Parte 15: Ponteiros, parte 1
- Parte 16: Declarando Variáveis Globais Adequadamente
- Parte 17: Melhor verificação de tipo e deslocamentos de ponteiro
- Parte 18: Lvalues e Rvalues revisitados
- Parte 19: Matrizes, parte 1
- Parte 20: Literais de caracteres e strings
- Parte 21: Mais Operadores
- Parte 22: Idéias de Design para Variáveis Locais e Chamadas de Função
- Parte 23: Variáveis Locais
- Parte 24: Parâmetros de Função
- Parte 25: Chamadas de Função e Argumentos
- Parte 26: Protótipos de Funções
- Parte 27: Teste de Regressão e uma Bela Surpresa
- Parte 28: Adicionando Mais Sinalizadores de Tempo de Execução
- Parte 29: Um pouco de refatoração
- Parte 30: Projetando Estruturas, Uniões e Enums
- Parte 31: Implementando Estruturas, Parte 1
- Parte 32: Acessando Membros em uma Estrutura
- Parte 33: Implementando Sindicatos e Acesso dos Membros
- Parte 34: Enums e Typedefs
- Parte 35: O Pré-Processador C
- Parte 36:
break
e continue
- Parte 37: Declarações de Troca
- Parte 38: Pendurando mais e mais
- Parte 39: Inicialização de Variável, parte 1
- Parte 40: Inicialização de Variável Global
- Parte 41: Inicialização de Variável Local
- Parte 42: conversão de tipo e NULL
- Parte 43: Correções de Bugs e Mais Operadores
- Parte 44: Dobragem Constante
- Parte 45: Declarações de Variáveis Globais, revisitadas
- Parte 46: Parâmetros de Função Void e Mudanças de Varredura
- Parte 47: Um subconjunto de
sizeof
- Parte 48: Um subconjunto de
static
- Parte 49: O Operador Ternário
- Parte 50: Limpeza, parte 1
- Parte 51: Matrizes, parte 2
- Parte 52: Ponteiros, parte 2
- Parte 53: Limpeza, parte 2
- Parte 54: Registros de Derramamento
- Parte 55: Avaliação Preguiçosa
- Parte 56: Matrizes Locais
- Parte 57: Limpeza, parte 3
- Parte 58: Corrigindo incrementos/decrementos do ponteiro
- Parte 59: Por que não funciona, parte 1
- Parte 60: Passando no Teste Triplo
- Parte 61: O que vem a seguir?
- Parte 62: Limpeza de Código
- Parte 63: Um novo backend usando QBE
- Parte 64: Um back-end para a CPU 6809
Não há um cronograma ou cronograma para as partes futuras, então continue voltando aqui para ver se escrevi mais alguma coisa.
Direitos autorais
Peguei emprestado parte do código e muitas ideias do compilador SubC escrito por Nils M Holm. Seu código é de domínio público. Acho que meu código é substancialmente diferente o suficiente para que eu possa aplicar uma licença diferente ao meu código.
Salvo indicação em contrário,
- todos os códigos-fonte e scripts são (c) Warren Toomey sob a licença GPL3.
- todos os documentos que não sejam de código-fonte (por exemplo, documentos em inglês, arquivos de imagem) são (c) Warren Toomey sob a licença Creative Commons BY-NC-SA 4.0.