Linguagens Formais e Compila¸c˜
ao
(cod. 5387)
Departamento de Inform´
atica
Universidade da Beira Interior
Ano lectivo 2012/2013
Figura 1: Don’t make your compiler complain
1
Novidades
• Defesa (e entrega) dos trabalhos: a partir das 9h00 na sala 6.14. • Segunda Frequˆencia. Local: 6.2 e 6.26.
• Entrega da primeira parte do trabalho adiada para a quinta-feira 9 de Maio as 9h00.
• Cada grupo ´e convidado a mostrar o estado actual do trabalho ao do-cente, marca¸c˜ao da data e hora por email.
• Por forma a repor a aula te´orica de segunda-feira 1 de Abril, haver´a aula te´orica quinta feira 4 de abril, das 14h00 `as 16h00 na sala 6.03. • Altera¸c˜oes no hor´ario das aulas. Consulte 10.
• As constitui¸c˜oes de grupo devem ser comunicadas por email ao regente da UC.
• Enunciado do trabalho dispon´ıvel.
• Relembra-se a sec¸c˜ao Fraude (ver 7.1.1) a todos os alunos... • Inscri¸c˜ao em turmas pr´aticas: via site dos servi¸cos acad´emicos. • Como colocar uma d´uvida ao regente da Unidade Curricular?
1. Comparecer nas aulas e coloc´a-la directamente ao regente
2. Comparecer no hor´ario de atendimento do regente e coloc´a-la di-rectamente
3. enviar um email ao regente (desousaUUU@UUUdi.ubi.pt, (retire os UUU) ) com o assunto ”LFC: XXXX”em que XXX ´e o t´ıtulo da d´uvida em quest˜ao. Qualquer outro formato no assunto arrisca condenar o email ao esquecimento.
Conte´
udo
2 Equipa Docente 3
3 Objectivos 3
4 Competˆencias por Adquirir 5
5 Programa 6
6 Metodologia de Ensino 6
7 Crit´erios de Avalia¸c˜ao 7
7.1 Avalia¸c˜ao da Componente Pr´atica . . . 7
7.1.1 Fraudes . . . 7
7.2 Avalia¸c˜ao da Componente Te´orica . . . 7
7.2.1 Exame . . . 7
7.2.2 Datas importantes . . . 8
7.3 Notas M´ınimas . . . 8
7.4 Nota Final . . . 9
8 Material Pedag´ogico 9 8.1 Te´oricas . . . 9
8.2 Pr´aticas . . . 10
8.2.1 Algumas solu¸c˜oes . . . 10
8.3 Material Suplementar . . . 10 9 Referˆencias Bibliogr´aficas 10
10 Hor´ario 11
11 Atendimento 11
2
Equipa Docente
Sim˜ao Melo de Sousa (regente) - Gabinete 3.17 - Laborat´orio 6.10 - Bloco VI.
3
Objectivos
Esta disciplina apresenta as principais fases da constru¸c˜ao dum compilador, isto ´e, um programa que transforma uma sequˆencia de caracteres, represen-tando um programa, numa sequˆencia de instru¸c˜oes m´aquina que poder˜ao ser executadas com a finalidade de produzir o resultado do programa original.
A constru¸c˜ao dum compilador envolve a utiliza¸c˜ao de v´arios m´etodos e ferramentas de an´alise l´exica e sint´actica. A aprendizagem do funcionamento de tais an´alises constitui uma parte importante desta disciplina. As lingua-gens de programa¸c˜ao modernas de alto n´ıvel prop˜oem uma detec¸c˜ao precoce dos erros gra¸cas a uma an´alise semˆantica, cada vez mais complexa e poderosa, muitas vezes sob a forma dum controlo de tipos. A ´ultima fase da compila¸c˜ao ´
e a gera¸c˜ao de c´odigo que ´e realizada em v´arias etapas que correspondem a tradu¸c˜ao para v´arias linguagens interm´edias antes de se concluir pela produ-¸c˜ao de c´odigo execut´avel. Estudaremos mais particularmente a organiza¸c˜ao da mem´oria para a gest˜ao das chamadas de procedimentos. Esta apresen-ta¸c˜ao assenta sobre resultados da teoria das linguagens formais(aut´omatos finitos, express˜oes regulares, gram´aticas, em particular gram´aticas livres de contexto, aut´omatos de pilha, etc . . .), `a qual daremos uma curta introdu¸c˜ao. Assim os objectivos gen´ericos desta disciplina s˜ao a apresenta¸c˜ao e estudo de metodologias, t´ecnicas e ferramentas para o desenvolvimento processado-res de linguagens e de compiladoprocessado-res. Em particular pretende-se:
• Introduzir a no¸c˜ao de linguagem e caracterizar o conceito de proces-samento de linguagens formais, estabelecendo os objectivos, as tarefas dum processador, as exigˆencias que lhe s˜ao impostas e as t´ecnicas de desenvolvimento (face `as restri¸c˜oes e `a complexidade do problema). • Introduzir os conceitos de gram´atica e de aut´omato, a sua teoria e a
sua aplica¸c˜ao ao desenvolvimento de Processadores de Linguagens. • Introduzir formalismos para especifica¸c˜ao da sintaxe e da semˆantica das
linguagens e estudar a implementa¸c˜ao dos analisadores que se podem derivar desses formalismos.
• Desenvolver capacidades de tradu¸c˜ao de textos escritos em linguagens distintas, utilizando m´etodos de an´alise e de s´ıntese mais usados pelos compiladores.
• Introduzir os processos, ferramentas, algoritmos e estruturas de dados mais utilizados na tradu¸c˜ao, na an´alise e na compila¸c˜ao.
Para quˆe estudar os Processos de Compila¸c˜ao? • Em primeiro porque ´e interessante e formador!
• Porque as t´ecnicas de processamento de linguagens e de constru¸c˜ao de compiladores tˆem aplica¸c˜oes fortes em muitas ´areas da inform´atica, e n˜ao s´o em constru¸c˜ao de compiladores.
• Atrav´es do estudo da compila¸c˜ao, tentaremos mostrar o qu˜ao ´uteis para a inform´atica em geral s˜ao as t´ecnicas e as ferramentas oriundas deste estudo assim como procuraremos perceber as caracter´ısticas das linguagens de programa¸c˜ao. De facto um compilador ´e um programa de tamanho importante que ´e necess´ario bem estruturar. Este deve ser tamb´em eficiente e ´e importante que esteja isento de erro. Ser capaz de escrever um compilador ´e assim uma competˆencia desafio para qualquer programador que se quer ex´ımio.
Agradecimentos
O regente da disciplina gostaria de agradecer `a Professora Doutora Christine Paulin-Mohring (LRI - Paris Sud, Fran¸ca) por lhe ter facultado a sebenta intitulada “Cours de Compilation” de que ´e autora e por lhe permitido um uso livre e intensivo desta ´ultima.
O regente gostaria de agradecer igualmente o Professor Doutor Jean-Christophe Filliˆatre (LRI - Paris Sud / CNRS, Fran¸ca) pelo apoio prestado na componente pr´atica desta UC.
4
Competˆ
encias por Adquirir
Os estudantes dever˜ao adquirir as seguintes competˆencias:
• Conceber, planear, desenhar e implementar em software processado-res de linguagens artificiais e de informa¸c˜ao especificada textualmente segundo determinadas regras lexicais e sint´acticas;
• Conceber e implementar em software as v´arias etapas relacionadas com compiladores, nomeadamente:
– express˜oes regulares e aut´omatos finitos; – analisadores sint´acticos e semˆanticos; – analisadores semˆanticos;
– optimiza¸c˜oes de c´odigo;
– geradores de c´odigo para processadores ou para m´aquinas virtuais;
5
Programa
1. Introdu¸c˜ao: o problema, o contexto, o processamento de linguagens na inform´atica, a arquitectura dum compilador.
2. Processamento de Linguagens
• an´alise l´exica, aut´omatos finitos, gram´aticas e express˜oes regula-res. Processamento de linguagens regularegula-res.
• an´alise sint´actica: Aut´omatos de pilha, gram´aticas alg´ebricas, an´alise descendente e an´alise ascendente.
• analise semˆantica: gram´aticas de atributo, tabelas dos s´ımbolos, inferˆencia e verifica¸c˜ao de tipos.
3. Gera¸c˜ao de C´odigo
• gera¸c˜ao de c´odigo interm´edio • analise e optimiza¸c˜ao de c´odigo • gera¸c˜ao de c´odigo m´aquina
6
Metodologia de Ensino
As aulas presenciais s˜ao divididas em duas categorias
• Aulas Te´oricas onde s˜ao expostos os conceitos te´oricos, os algoritmos mas tamb´em as tecnologias capacitativas, pr´oprios `a constru¸c˜ao de um compilador.
• Aulas Pr´aticas com aplica¸c˜ao das t´ecnicas de compila¸c˜ao na constru-¸c˜ao de compiladores para linguagens de programa¸c˜ao simples e para arquitecturas simples.
7
Crit´
erios de Avalia¸
c˜
ao
A avalia¸c˜ao tenta qualificar e quantificar a aprendizagem e a aquisi¸c˜ao de competˆencia e de conhecimentos do aluno inscrito. Nesta unidade curricular esta avalia¸c˜ao ´e dividida em duas partes: a avalia¸c˜ao pr´atica e a avalia¸c˜ao te´orica.
Listamos a seguir as diferentes componentes da avalia¸c˜ao.
7.1
Avalia¸
c˜
ao da Componente Pr´
atica
Esta avalia¸c˜ao mede em termos pr´aticos a aquisi¸c˜ao dos conceitos expostos. Como tal ´e baseada na realiza¸c˜ao, durante o semestre lectivo, de um tra-balho realizado em grupo e entregue `a equipa docente. Este trabalho ser´a dividido em duas partes, dando ambas origem a uma defesa. Ambas as partes carecem da entrega dum relat´orio em LATEX e dum arquivos
compri-mido com os ficheiros fontes que constitu´ı a implementa¸c˜ao realizada assim como de um makefile permitindo a compila¸c˜ao completa.
Esta avalia¸c˜ao resultar´a na atribui¸c˜ao da Nota da Componente Pr´ a-tica (NCP).
Esta nota ´e calculada como a m´edia das notas atribu´ıdas `as duas partes do trabalho.
7.1.1 Fraudes
A equipa docente gostaria de real¸car que qualquer tipo de fraude em qualquer dos itens desta disciplina implica a reprova¸c˜ao autom´atica do aluno faltoso, podendo ainda vir a ser alvo de processo disciplinar.
7.2
Avalia¸
c˜
ao da Componente Te´
orica
A avalia¸c˜ao da aquisi¸c˜ao de conceitos te´oricos ´e baseado em provas escritas, nomeadamente aqui duas frequˆencias. Esta avalia¸c˜ao resultar´a na atribui¸c˜ao da Nota da Componente Te´orica (NCT) e ser´a calculada como a m´edia das notas atribu´ıdas `as duas frequˆencias.
7.2.1 Exame
• O aluno admitido a exame mas reprovado na avalia¸c˜ao cont´ınua poder´a tentar uma nova atribui¸c˜ao da NCT.
• O aluno aprovado na avalia¸c˜ao cont´ınua poder´a melhorar a sua NCT. 7.2.2 Datas importantes
• Primeira frequˆencia: 18 de Abril • Segunda frequˆencia: 6 de Junho
• Entrega da primeira parte do trabalho: 26 Abril • Defesa da primeira parte do trabalho: Por definir • Entrega da segunda parte do trabalho: 7 de Junho • Defesa da segunda parte do trabalho: Por definir • exame primeira chamada: (conferir nos acad´emicos) • exame segunda chamada: (conferir nos acad´emicos) • exame ´epoca especial: (conferir nos acad´emicos)
7.3
Notas M´ınimas
Ser´a igualmente instaurado um regime de notas m´ınimas como crit´erio de valida¸c˜ao da nota final. Esses m´ınimos s˜ao:
• 6 valores (em 20) para a NCP • 6 valores (em 20) para a NCT
Uma nota abaixo desses valores implica reprova¸c˜ao `a disciplina (N˜ao Ad-mitido a Exame).
7.4
Nota Final
Os m´ınimos s˜ao os m´ınimos afixados por regulamento e s˜ao v´alidas individu-almente para cada parte (NCT e NCP).
Assim a nota final da disciplina ´e determinada de acordo coma seguinte f´ormula: N F = se (N CT ≥ 6) e (N CP ≥ 6) ent˜ao N CP +N CT 2 sen˜ao Reprovado onde
NF = Nota Final (20 valores)
NCT = Nota da Componente Te´orica (20 valores) NCP = Nota da Componente Pr´atica (20 valores)
8
Material Pedag´
ogico
Acetatos e sebenta distribu´ıdos nas aulas.
8.1
Te´
oricas
Cap´ıtulo: Introdu¸c˜ao
Cap´ıtulo: Analises sint´acticas descendentes Cap´ıtulo: Analises sint´acticas ascendentes Cap´ıtulo: ´Arvores de sintaxe abstracta Cap´ıtulo: Analise semˆantica
Cap´ıtulo: Analise semˆantica - Complementar Cap´ıtulo: Sistemas de tipos - Complementar Cap´ıtulo: Gera¸c˜ao de c´odigo
Cap´ıtulo: Tutorial MIPS
Cap´ıtulo: Gera¸c˜ao de c´odigo (vers˜ao antiga - compila¸c˜ao para uma stack based virtual machine) - Complementar
Cap´ıtulo: Gera¸c˜ao de c´odigo - um exemple de uma stack based virtual machine - Complementar
8.2
Pr´
aticas
Para quem necessitar uma actualiza¸c˜ao em programa¸c˜ao OCaml, encontrar´a aqui uma introdu¸c˜ao `a programa¸c˜ao funcional em OCaml.
Ficha : Introdu¸c˜ao `a analise sint´actica com yacc/menhir
Ficha te´orico-pr´atica - Aplica¸c˜ao das linguagens formais `a constru¸c˜ao de analisadores, an´alises descendentes, ascendentes, an´alises semˆanticas, siste-mas de tipo.
Ficha pr´atica - Introdu¸c˜ao `a analise l´exica , constru¸c˜ao de lexer, parser com lex/yacc/menhir, analisadores de tipos, analisadores semˆanticos.
Ficha: Introdu¸c˜ao `a constru¸c˜ao de compiladores - a linguagem artih 8.2.1 Algumas solu¸c˜oes
solu¸c˜ao de alguns exerc´ıcios de analise l´exica em ocaml (parte 1) solu¸c˜ao de alguns exerc´ıcios de analise l´exica em ocaml (parte 2)
Exemplo de uma pequena calculadora feita de ra´ız com base em proces-samento de listas.
um “htmlizer” para Caml feito em ocamllex Resolu¸c˜ao completa: sistema de gest˜ao de notas
compilador e interpretador completo da linguagem arith com target a m´aquina virtual “VM”
Uma frequˆencia resolvida
Resolu¸c˜ao de exerc´ıcio sobre analises LL(1)
Arquivo com provas de anos anteriores (cont´em algumas resolu¸c˜oes). ZIP com exemplos de programas MIPS
ZIP com o c´odigo do compilador arith para MIPS *por completar* ZIP com o c´odigo do compilador arith para MIPS *completo*
ZIP com o c´odigo do compilador arith para MIPS *completo* alternativo (com typechecking)
8.3
Material Suplementar
Enunciado do trabalho.
9
Referˆ
encias Bibliogr´
aficas
As restantes referˆencias listadas em fim de documento s˜ao de consulta alternativa ou ocasional.
10
Hor´
ario
Tipo de aula Hor´ario Sala
Te´orica Segunda-Feira das 9h00 `as 11h00 6.02 Pr´aticas Laboratoriais 1 Quinta-Feira das 11h00 `as 13h00 6.13 Pr´aticas Laboratoriais 2 Quint-Feira das 9h00 `as 11h00 6.13
11
Atendimento
Hor´ario
Sexta-Feira das 9h00 `as 11h00
Referˆ
encias
[1] A. V. Aho, R. Sethi, and J. D. Ullman. Compilers: Principles, Techni-ques, and Tools. Addison-Wesley, 1985.
[2] A. W. Appel. Modern Compiler Implementation in C. Cambridge Uni-versity Press, 1998.
[3] A. W. Appel. Modern Compiler Implementation in Java. Cambridge University Press, Cambridge, 1998.
[4] A. W. Appel. Modern Compiler Implementation in ML. Cambridge University Press, 1998.
[5] D. Bagley. The great computer language shootout. http://www.bagley.org/~doug/shootout
[6] E. Chailloux, P. Manoury, and B. Pagano. Developing applications with objective caml. http://caml.inria.fr/oreilly-book, 2003.
[7] G. Cousineau and M. Mauny. The functional approach to programming. Cambridge University Press, 1998.
[8] C. J.H. Jacobs, K. G. Langendoen, D. Grune, and H. E. Bal. Modern Compiler Design. Wiley, 2000.
[9] X. Leroy and P. Weis. Le Language Caml. iia, Inter Edition, 1993. [10] X. Leroy and P. Weis. Manuel de R´ef´erence du Language Caml. iia,
Inter Edition, 1993.
[11] J. R. Levine, T. Masson, and D. Brown. Lex & Yacc. Unix Programming Tool. O’Reilly, 1995.
[12] J. Mitchell. Foundation for Programming Languages. Foundations of Computing, MIT Press, 1996.
[13] S. Muchnick. Advanced Compiler Design and Implementation. Morgan Kauffman, 1997.
[14] F. Nielson, H. R. Nielson, and C. L. Hankin. Principles of Program Analysis. Springer-Verlag, 1999.
[15] H. R. Nielson and F. Nielson. Semantics with Ap-plications. John Wiley & Sons, Chichester, 1993. http://www.daimi.au.dk/~bra8130/Wiley_book/wiley.html
[16] OCaml Development Team. The Objective Caml system:Documentation and user’s manual, 2002. http://caml.inria.fr/ocaml/htmlman/index.html
[17] R. Wilhelm and D. Maurer. Compiler Design. Addison Wesley, 1995. [18] G. Winskel. The Formal Semantics of Programming Languages: An
Introduction. Foundations of Computing series. MIT Press, Cambridge, Massachusetts, February 1993.