Mudanças entre as edições de "Turing Clube/Oficina de Linguagens de Programação"
Linha 7: | Linha 7: | ||
As principais estratégias de Kamin são: |
As principais estratégias de Kamin são: |
||
− | * Foco na simplicidade: os interpretadores foram escritos para serem fáceis de ler e modificar, sempre usam a sintaxe de s-expressions |
+ | * Foco na simplicidade: os interpretadores foram escritos para serem fáceis de ler e modificar, sempre usam a sintaxe de s-expressions. O gerenciamento de memória fica para o final do livro. |
− | * Foco na semântica: reduzindo todas as linguagens implementadas à sintaxe de s-expressions, as características essenciais das linguagens ficam mais evidentes. Por exemplo o capítulo 7 apresenta um interpretador de um sub-conjunto de Smalltalk com sintaxe de LISP. O que importa é que este interpretador permite criar programas organizados na forma de classes e métodos. |
+ | * Foco na semântica: reduzindo todas as linguagens implementadas à sintaxe de s-expressions, as características essenciais das linguagens ficam mais evidentes. Por exemplo o capítulo 7 apresenta um interpretador de um sub-conjunto de Smalltalk com sintaxe de LISP. O que importa é que este interpretador permite criar programas organizados na forma de classes e métodos, ilustrando encapsulamento, polimorfismo, e herança. |
+ | |||
+ | === Estrutura do PLIBA === |
||
+ | |||
+ | Os capítulos de 1 a 8 implementam interpretadores para linguagens inspiradas nas seguintes linguagens: |
||
+ | |||
+ | You get |
||
+ | {| |
||
+ | ! # |
||
+ | ! Linguagem |
||
+ | ! Características |
||
+ | |- |
||
+ | |1 |
||
+ | |Pascal ou C |
||
+ | |Declarações de funções separadas do corpo principal do programa. Closures são desnecessárias. |
||
+ | |- |
||
+ | |2 |
||
+ | |Lisp |
||
+ | |Declarações de funções no corpo do programa. Não há closures porque o escopo é dinâmico. |
||
+ | |- |
||
+ | |3 |
||
+ | |APL |
||
+ | |Manipulação de estruturas de dados agregadas. |
||
+ | |- |
||
+ | |4 |
||
+ | |Scheme |
||
+ | |Funções anônimas e escopo léxico obrigam a implementação de closures. |
||
+ | |} |
||
+ | |||
+ | |||
+ | O capítulo 9, ''Compilation'' apresenta a teoria de geração de código de máquina a partir da linguagens do capítulo 1 e 4 (Scheme), tendo como alvo uma linguagem de máquina hipotética. |
||
+ | |||
+ | O capítulo 10, ''Memory Management'', aborda algumas estratégias para a coleta de lixo -- descarte de estruturas de dados que não serão mais usadas. Os interpretadores básicos não têm esse recurso, o que significa que ao longo da execução do programa o uso de memória só cresce, nunca diminui. Isso não afeta a semântica de cada linguagem, pois o reuso de memória pode ser considerado uma otimização. O interpretador original de LISP escrito por John McCarthy também não gerenciava a memória. O capítulo 10 apresenta as mudanças no interpretador LISP do capítulo 2 para fazer coleta de lixo. |
||
== Referências == |
== Referências == |
Edição das 09h09min de 16 de novembro de 2018
Vamos estudar o funcionamento de linguagens de programação e praticar a construção de interpretadores e compiladores, desde o início. O único pré-requisito para participar é saber programar.
Estratégia
Nesta oficina vamos seguir a pedagogia introduzida por Samuel Kamin em seu livro PLIBA. Em vez de partir direto para a construção de um compilador, Kamin começa por interpretadores, que são mais fáceis de implementar. Em 8 capítulos, Kamin apresenta 8 interpretadores que implementam características fundamentais de linguagens procedurais, funcionais, orientadas a objeto, e lógicas.
As principais estratégias de Kamin são:
- Foco na simplicidade: os interpretadores foram escritos para serem fáceis de ler e modificar, sempre usam a sintaxe de s-expressions. O gerenciamento de memória fica para o final do livro.
- Foco na semântica: reduzindo todas as linguagens implementadas à sintaxe de s-expressions, as características essenciais das linguagens ficam mais evidentes. Por exemplo o capítulo 7 apresenta um interpretador de um sub-conjunto de Smalltalk com sintaxe de LISP. O que importa é que este interpretador permite criar programas organizados na forma de classes e métodos, ilustrando encapsulamento, polimorfismo, e herança.
Estrutura do PLIBA
Os capítulos de 1 a 8 implementam interpretadores para linguagens inspiradas nas seguintes linguagens:
You get
# | Linguagem | Características |
---|---|---|
1 | Pascal ou C | Declarações de funções separadas do corpo principal do programa. Closures são desnecessárias. |
2 | Lisp | Declarações de funções no corpo do programa. Não há closures porque o escopo é dinâmico. |
3 | APL | Manipulação de estruturas de dados agregadas. |
4 | Scheme | Funções anônimas e escopo léxico obrigam a implementação de closures. |
O capítulo 9, Compilation apresenta a teoria de geração de código de máquina a partir da linguagens do capítulo 1 e 4 (Scheme), tendo como alvo uma linguagem de máquina hipotética.
O capítulo 10, Memory Management, aborda algumas estratégias para a coleta de lixo -- descarte de estruturas de dados que não serão mais usadas. Os interpretadores básicos não têm esse recurso, o que significa que ao longo da execução do programa o uso de memória só cresce, nunca diminui. Isso não afeta a semântica de cada linguagem, pois o reuso de memória pode ser considerado uma otimização. O interpretador original de LISP escrito por John McCarthy também não gerenciava a memória. O capítulo 10 apresenta as mudanças no interpretador LISP do capítulo 2 para fazer coleta de lixo.
Referências
- PLIBA
- S. Kamin, Programming Languages: An Interpreter-Based Approach, (Reading, Mass.: Addison-Wesley, 1990).