Técnicas de criação de interpretadores
(craftinginterpreters.com)- Crafting Interpreters é um livro estruturado para que leitores que queiram criar sua própria linguagem possam acompanhar do começo ao fim a implementação completa de uma linguagem de script
- Ele aborda em um fluxo contínuo desde conceitos de projeto de linguagens, como parsing e semântica, até a implementação da execução, como representação em bytecode e coleta de lixo
- O leitor começa em
main()e implementa diretamente uma linguagem com tipagem dinâmica, escopo léxico, funções de primeira classe, closures, classes e herança - Ao fazer com que todo o código, com alguns milhares de linhas, seja escrito diretamente pelo leitor, o foco fica mais na compreensão do funcionamento interno do que apenas no resultado final
- Está disponível em formatos impresso, eBook, PDF e web, e na web é possível ler gratuitamente todos os capítulos, textos complementares e ilustrações
Escopo de implementação do livro
- Crafting Interpreters é voltado para leitores que querem criar sua própria linguagem de programação ou entender como linguagens são projetadas e implementadas
- O livro cobre em conjunto os principais tópicos necessários para implementar uma linguagem de script completa
- parsing
- semântica
- representação em bytecode
- coleta de lixo
- A implementação começa em
main()e, no fim, evolui para uma linguagem com os seguintes recursos- sintaxe rica
- tipagem dinâmica
- escopo léxico
- funções de primeira classe
- closures
- classes
- herança
Forma de leitura e resultado
- Em vez de apenas olhar o código de exemplo, o leitor acompanha a estrutura interna de um interpretador escrevendo cada linha por conta própria
- O código final tem alguns milhares de linhas e é estruturado com o objetivo de alcançar uma implementação limpa e rápida
- Em vez de separar conceitos de alto nível e implementação de baixo nível, o livro foi pensado para que ambos sejam entendidos juntos no processo de concluir uma única linguagem
Formatos disponíveis
-
Edição impressa
- É uma edição impressa de 640 páginas, com ilustrações desenhadas à mão em alta resolução e tipografia diagramada pelo próprio autor
- Amazon.com
- Barnes and Noble
- Download Sample PDF
-
eBook
- Oferece CSS adaptado a leitores digitais e diferentes tamanhos de tela, realce de sintaxe em cores e hyperlinks ativos
- Kindle Amazon.com
- Apple Books
- Play Books Google
- Nook B&N
- EPUB Smashwords
-
PDF
- É oferecido de forma portátil, preservando a diagramação manual e as ilustrações nítidas da edição impressa
- Buy from Payhip
- Download Free Sample
-
Web
- É oferecido com design responsivo, do desktop ao celular, e permite ler gratuitamente todos os capítulos, textos complementares e ilustrações
- Read Now
1 comentários
Opiniões no Hacker News
Sou o autor. Ver a reação positiva ao meu livro aquece muito o coração. Dediquei muito tempo e carinho a ele, e é muito gratificante ver que teve o efeito que eu esperava
Esse material me deu muita confiança, e até hoje lembro desse projeto como um dos trabalhos de que mais gostei
Também fico curioso se você pensa em escrever um livro de continuação, como um compilador ou JIT para Lox. E o lexical analygator é sensacional: ele apareceu várias vezes, com a devida fonte, em apresentações internas da empresa, e por um tempo até houve fan art dele no quadro branco
Alguns autores parecem achar que precisam fingir que essa área é toda magia negra; mas talvez eu é que não tenha sido capaz de entender os padrões de projeto do GoF
Li Crafting Interpreters quando criei o Crumb (https://github.com/liam-ilan/crumb), e especialmente as partes sobre escopos e variáveis locais foram essenciais.
O equilíbrio entre implementação técnica e insight conceitual é muito bom, então o livro ajuda bastante mesmo quando você tenta sair do caminho estabelecido por ele. Esse tipo de escrita técnica é um material de tão alto nível que serve como referência a aspirar
A documentação é boa e o projeto é legal
A parte de que mais gostei no livro é que ele conduz você a escrever dois interpretadores diferentes para a mesma linguagem.
Isso permite entender bem as partes mais complexas e sutis do processo de criar uma linguagem de programação. Na primeira metade do livro, você encontra e se familiariza com as grandes ideias; quando as reencontra no segundo interpretador, consegue absorver de verdade as partes interessantes. É um livro realmente incrível
Já que também estamos falando de outros materiais sobre compiladores, ainda não terminei de assistir, mas gostei dos vídeos em que Immo Landwerth cria um compilador em C#, gerando IL, símbolos de depuração etc.
O material é de cerca de 5 anos atrás, então não usa a sintaxe mais recente de C# e parece ser da época do .NET Core 3 ou algo assim, mas isso não deve causar grandes problemas na maior parte do trabalho. Só que podem aparecer muitos avisos relacionados à nulidade de tipos.
https://www.youtube.com/playlist?list=PLRAdsfhKI4OWNOSfS7EUu...
Sinto que a maioria dos programadores deveria, algum dia, seguir este livro até o fim. Quando fiz isso, passei a entender muito melhor o que realmente acontece por dentro de compiladores e ferramentas de linguagem.
Está entre os guias técnicos mais bem escritos que já acompanhei, e me ajudou muito a internalizar os conceitos. Esses conceitos são úteis em muitos lugares além de compiladores
Uma vantagem secundária deste livro, mas talvez igualmente importante, é que ele ensina clareza.
O texto, o código, a estrutura e o ritmo são todos claros e essenciais. A palavra “Crafting” se encaixa perfeitamente: parece um livro escrito por um artesão para artesãos
Acho que este livro deveria ser a segunda ou terceira etapa na jornada de compiladores de linguagens de programação.
A primeira etapa é, sem saber nada sobre interpretadores ou design de linguagens, tentar escrever sozinho um interpretador para uma linguagem simples criada por você. A segunda etapa é reescrevê-lo, cometendo menos erros.
Sem fazer isso, é difícil realmente apreciar as sutilezas do tema, e você acaba passando batido por conceitos que não parecem importantes
Não há problema em não reinventar todas as técnicas por conta própria desde o início. Ficar sobre os ombros de gigantes é algo natural
Se eu não tivesse lido algo como CI primeiro, nem teria tentado escrever um interpretador por conta própria, e não teria chegado à terceira etapa
Não havia recursão; eu colocava e tirava coisas manualmente de uma pilha. O problema é que eu não entendia parsing direito, então implementei a maior parte da linguagem com string.split e string.replace e, como esperado, surgiram conceitos que não podiam ser aninhados. Tenho pena de não ter guardado o código-fonte
Poucos dias depois, ao encontrar bugs demais, passei a adotar uma postura mais acadêmica e comecei a ler livros. Ainda assim, foi uma ótima primeira etapa: sem essa tentativa, talvez eu nem soubesse que esse era um assunto para um livro inteiro
Respeito muito pessoas com esse nível de dedicação e todos que mantêm a infraestrutura de desenvolvimento, mas fico feliz que minha fase de “quero criar uma linguagem” tenha acabado sendo só um interesse passageiro
O volume de trabalho é realmente enorme
Fico curioso se alguém conhece bons materiais sobre como criar uma linguagem com tipagem estática que tenha coisas como polimorfismo paramétrico e inferência básica de tipos
Em Crafting Interpreters, senti que era possível criar uma linguagem pequena e autocontida que contivesse quase todos os conceitos que eu queria ensinar: escopo de variáveis, funções, closures, classes e despacho dinâmico, fluxo de controle etc.
Já em sistemas de tipos, há bifurcações demais no espaço de design e não existe um caminho “melhor” claro. Todas estas escolhas são bifurcações: há subtipagem? Genéricos são apagados ou reificados? Código genérico é especializado em tempo de compilação? A inferência de tipos é local ou Hindley-Milner?
Qualquer que seja a escolha, você deixa de fora conteúdos importantes dos ramos não escolhidos e pode decepcionar leitores que esperavam outro caminho. Talvez um livro panorâmico mais amplo, como Types and Programming Languages, seja o mais adequado; mas aí se perde a diversão de ir construindo uma coisa única e coerente
Também há edições em C e Java do mesmo livro, mas considero inferiores. Eu preferiria usar junto com a edição em ML
Eu vi que a implementação em https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master... tinha um estilo muito antigo, então a modernizei e organizei até chegar a https://gist.github.com/kccqzy/fa8a8ae12a198b41c6339e8a5c459.... Depois, “quebrei” de propósito várias partes para ver como o algoritmo falhava
Recomendo fortemente tentar, de uma forma acessível, uma daquelas tarefas de ciência da computação que a gente acha que só magos conseguem fazer. Depois que você conclui uma ou duas, percebe que, embora seja difícil, em geral é uma questão de ir avançando aos trancos e barrancos, e isso dá muita confiança. Quem quiser seguir esse caminho pode entrar em contato em zellyn@(most things)
Acabei de terminar a parte 2 e é um livro realmente excelente. Fazer por conta própria um ou dois dos exercícios sugeridos em cada capítulo ajuda muito a entender o conteúdo