3 pontos por GN⁺ 2023-12-11 | 1 comentários | Compartilhar no WhatsApp
  • Write Your Own Retro Compiler é um livro de 339 páginas que aborda um compilador self-hosting que roda em CP/M baseado em Z80 e gera código para o mesmo ambiente, com todo o código-fonte incluído
  • T3X/0, o alvo da implementação, é uma linguagem simples com raízes em Pascal e BCPL, e o livro inclui um manual completo de 20 páginas
  • É necessário conhecimento de linguagens procedurais como C ou Pascal e de linguagem assembly; ter noções de assembly Z80 e do básico de CP/M facilita o acompanhamento
  • Explica análise léxica, análise sintática, geração de código, otimização simples, a interface BDOS e a biblioteca de tempo de execução com diagramas, tabelas e exemplos
  • Todo o código é disponibilizado em domínio público, e também são oferecidos links para compra do livro impresso e do PDF, sumário, páginas de amostra e download do código-fonte

Escopo e público do livro

  • Write Your Own Retro Compiler é um livro de 339 páginas, com 91 figuras, formato 6" x 9", publicado pela Lulu Press em 2023
  • O tema central é um compilador self-hosting que roda em CP/M no processador Z80 e gera código para o mesmo ambiente
  • Foi estruturado para que até quem não tenha experiência em construção de compiladores possa acompanhar
  • A linguagem de implementação, T3X/0, é uma linguagem simples com raízes em Pascal e BCPL
  • O livro inclui um manual completo de 20 páginas sobre T3X/0

Conhecimentos necessários

  • É preciso conhecer pelo menos uma linguagem de programação procedural
    • Os exemplos citados são C e Pascal
  • Também é preciso conhecer ao menos uma linguagem assembly e, idealmente, ter conhecimento de assembly para CPU Z80
  • Também é exigido conhecimento básico do sistema operacional CP/M
  • Para leitores autodidatas, há uma breve introdução à linguagem assembly do Z80

Componentes do compilador

  • O funcionamento interno do compilador é explicado com muitos diagramas, tabelas e exemplos
  • Os tópicos abordados são os seguintes
    • Análise léxica
    • Análise sintática
    • Geração de código
    • Otimização simples
    • Interface BDOS

      • Biblioteca de tempo de execução

Links e código disponibilizados

1 comentários

 
GN⁺ 2023-12-11
Comentários do Hacker News
  • Publiquei um livro novo sobre compiladores. Ele é mais ou menos uma versão expandida de “Write Your Own Compiler”, mas desta vez trata de geração de código CP/M para Z80 em vez de ELF para sistemas modernos, então várias partes ficam bem mais simples
    Dá para ver quanta complexidade é necessária para fazer um compilador que compile a si mesmo em menos de 10 minutos num sistema Z80 de 4MHz. O código é gratuito, mas o livro é pago

    • Sempre fico curioso para ver o que o Nils está fazendo. Espero que ele também esteja conseguindo tornar esse tipo de trabalho financeiramente viável como negócio, e algum dia quero comprar tudo e acompanhar
      Além disso, adoraria ver um livro direto ao ponto sobre Forth e a interpretação do Nils sobre isso
  • Recentemente fiz um compilador C de múltiplas passagens e um assembler para CPUs x86 antigas em TypeScript
    https://github.com/Mati365/ts-c-compiler

    • O compilador do livro é para um Z80 ainda mais antigo, que nem sequer tem instruções de multiplicação ou divisão. Mesmo assim, esse compilador também consegue gerar código para 8086 e 386
  • Tenho um exemplar físico da 2ª edição de Practical Compiler Construction e gosto bastante dele. Recomendo os livros do Nils para quem tiver interesse

  • Esse livro parece divertido. Ainda assim, continuo esperando um sucessor de verdade para The Dragon Book
    Seria ótimo um livro que tratasse de CPUs modernas e, se possível, até otimização para GPU, além de como projetar e escrever uma máquina virtual moderna com coleta de lixo concorrente rápida. Em certo sentido, isso pode ser ainda mais difícil do que escrever compiladores

    • Building an Optimizing Compiler, de Bob Morgan, é um livro totalmente focado em otimização de compiladores modernos e foi publicado em 1997
      Ele cobre construção de grafos de fluxo de controle, várias otimizações possíveis sobre eles, análise de alias, forma de atribuição única estática, otimizações baseadas em dominadores de CFG, escalonamento de instruções, alocação de registradores e geração de código objeto. Como a maioria dos livros de compiladores, não trata de análise léxica, parsing nem NFA/DFA
      Para quem quer fazer um compilador otimizador que exige análises avançadas, Static Program Analysis também pode ajudar: https://cs.au.dk/~amoeller/spa/
      Para coleta de lixo, existe o Garbage Collection handbook: https://gchandbook.org/
    • Lembro de não ter gostado muito de The Dragon Book quando era estudante. Já não lembro bem o motivo, mas acho que senti que a estrutura não era boa e que alguns tópicos eram detalhados demais, enquanto outros tinham explicação de menos
      Se você já tiver algum conhecimento básico, talvez goste deste curso: https://www.cs.cmu.edu/~janh/courses/411/18/schedule.html
      Gostei especialmente da forma como ele apresenta a forma SSA
      Há tópicos mais avançados aqui: https://www.cs.cmu.edu/~15745/handouts.html
    • Eu também venho esperando por um livro assim. Hoje em dia ficou tudo complexo demais por causa de elementos como microcódigo/firmware modernos, e muita coisa parece mágica
      Quando algo parece “mágica”, eu encaro como sinal de que alguém contornou de forma inteligente algo que se imaginava ser um limite. Recentemente estou lendo sobre grave falso, em que pequenos alto-falantes parecem produzir graves mais profundos do que realmente conseguem; é interessante como usam harmônicos para enganar o cérebro e fazê-lo ouvir um som mais grave do que o real
  • Parece interessante, mas há a desvantagem de o leitor precisar primeiro conhecer ou aprender a nova linguagem de programação T3X
    Também fico curioso se seria possível escrever e desenvolver um compilador do zero num sistema retro CP/M, conectado ao mundo externo só por teclado e tela

    • Pensei bastante nisso antes de escrever o livro. No fim escolhi T3X porque esse compilador é muito menor do que o menor compilador de subconjunto de C, e pessoalmente acho T3X mais fácil de aprender e entender
      O SubC tem 3815 linhas e o T3X/0 tem 2330 linhas
      Claro que também seria possível começar no CP/M sem ferramentas externas, mas aí seria preciso escrever o compilador de bootstrap em assembly. Isso levaria bastante tempo, mas é totalmente viável. Só não sei se seria interessante como leitura
    • Não vejo isso como desvantagem. Para alguém que quer escrever compiladores, uma nova linguagem de programação provavelmente não será um grande obstáculo, e uma linguagem de brinquedo simples e limpa pode até ser melhor para fins didáticos
      É um pouco surpreendente usar sintaxe ao estilo ALGOL em vez de sintaxe ao estilo C, mas isso pode ser só viés meu. Fazer mentalmente a correspondência entre DO e END com { e } não é um grande esforço
  • Um tutorial de compilador que vai além das etapas de análise léxica e parsing? Quase inédito, eu diria
    Estou brincando, mas muita coisa realmente para aí. Acho que vou comprar isso

  • Também seria divertido ter um livro sobre escrever seu próprio sistema operacional parecido com CP/M

    • Isso seria Operating Systems Design and Implementation, do Andrew Tanenbaum
      Claro, ele mostra como fazer um sistema operacional de microkernel no estilo Unix, mas é só pular tudo exceto o capítulo de sistema de arquivos. E não siga os conselhos sobre estruturas de árvore: use apenas tabelas planas e não se preocupe em implementar tamanho exato de arquivo. Aí vira CP/M
      Pessoalmente prefiro a 2ª edição. Acho que a 3ª ficou desnecessariamente complexa para fazer o código de demonstração do Minix rodar em PCs do fim dos anos 1990, em vez de PCs dos anos 1980
  • Não escrevo isso de forma negativa; é uma observação que talvez ajude
    Li o capítulo gratuito e me pareceu que algumas partes podem ser difíceis para quem não tem muito conhecimento do tema. Sob cada título ele começa explicando conceitos do zero, como “a gramática da linguagem é...”, mas poucas frases depois já aparecem tópicos avançados como instruções de assembly sem explicação
    Se o leitor está num nível em que ainda precisa aprender o significado de gramática, talvez tenha dificuldade para entender as frases logo em seguida. Então, se houvesse um pouco mais de consistência, o livro talvez ficasse melhor acabado

    • Como também escrevi na apresentação do livro, não é necessário conhecimento prévio sobre construção de compiladores, mas considerei que o leitor deve ao menos estar familiarizado com uma linguagem procedural e uma linguagem assembly
      Por isso achei aceitável presumir que o leitor já conheça coisas como instruções de assembly
      O apêndice do livro também traz uma breve introdução ao assembly de Z80, mas mesmo ela parte do pressuposto de que a pessoa já conhece o básico de assembly
      Todo livro precisa começar em algum ponto. É difícil escrever um livro sobre construção de compiladores partindo da suposição de que a pessoa não tem absolutamente nenhum conhecimento de programação. Ainda assim, isso não quer dizer que eu esteja imune à maldição do conhecimento, então com certeza vou manter esse ponto em mente
  • Independentemente do conteúdo do livro em si, também gostei do design da web retrô e minimalista, perfeito para o tema
    Bate forte a nostalgia. Lembra os bons tempos de deixar sobre a mesa um livro de 15 cm de espessura com título tipo “HTML 3.2 UNLEASHED!!!!” e fazer o site manualmente

    • Eram bons tempos
      Só que a diversão acaba quando você tenta aplicar uma mudança global em umas 1500 páginas estáticas. Ainda não sofro o bastante para querer criar um CMS eu mesmo, mas, mesmo que criasse, manteria o design como está
  • https://web.archive.org/web/20231210141834/http://t3x.org/t3...