Ficha Unidade Curricular: |
Paradigmas de Programação |
Docente: |
Rui
Silva Moreira |
Grau
Académico: |
Doutor |
Categoria Funcional: |
Professor
Associado |
Curso: |
Engenharia
Informática |
Ciclo De Estudos: |
2º
Ciclo |
Ano
Lectivo: |
2014-2015 |
Semestre
Curricular: |
1º Semestre |
N.º Total ECTS: |
4 |
N.º ECTS Contacto: |
2,5 |
Tipologia Das Aulas: |
Teórico-Prática
(TP) e Prática-Laboratorial (PL) |
Durante muito tempo o desenvolvimento de software seguia regras ad-hoc que dependiam essencialmente da experiência e intuição da equipa de desenvolvimento de software. À medida que as aplicações e as arquitecturas dos sistemas informáticos se tornaram cada vez mais complexas, estruturadas e sofisticadas e os requisitos impostos se assumiam cada vez mais exigentes, os programadores e designers de sistemas tiveram que se adaptar e desenvolver metodologias e abordagens mais eficientes. Actualmente os engenheiros de software adoptam diferentes tipos de abordagens e de linguagens de programação de acordo com a área ou domínio de aplicação, com a necessidade específica do sistema a implementar e com as características particulares da linguagem de implementação. A abordagem seguida no desenvolvimento de sistemas depende não só da formação específica do programador mas também da área específica da aplicação e das potencialidades e particularidades da linguagem de programação.
Neste contexto, a disciplina de paradigmas da programação pretende, inicialmente, introduzir os conceitos gerais sobre as linguagens de programação e em particular sobre a construção dos módulos de um compilador (e.g., Lexer, Parser, etc.); posteriormente, pretende dar a conhecer aos alunos algumas das diferentes abordagens ou paradigmas existentes para o desenvolvimento de software, nomeadamente: o paradigma declarativo (nomeadamente as linguagens funcionais, e.g., Lisp) e o paradigma imperativo (em particular as linguagens orientadas-objectos, e.g., Java).
ECTS:
Presencial: 4
Não Presencial: 0
Total (Presencial + Não Presencial): 4
Tipologia:
(x) Formação Específica
( ) Formação Básica
( ) Unidade Curricular de Opção
( ) Projecto de Graduação
Parcela (Horas)
Teórica
Teórico-Prática: 16
Prática
Prática Laboratorial: 32
Ensino Clínico
Seminário
Trabalho de Campo: 10
Estágio
Orientação Tutorial: 10
Avaliação
Nota: 1 ECTS = 26 horas
Linguagens de Programação 2
Lista de competências a alcançar no final da unidade curricular de acordo com o formato dos Descritores de Dublin:
1. Conhecimento e capacidade de compreensão:
1.1. Capacidade de identificação e caracterização das principais características das linguagens de programação
1.2. Capacidade de identificação e caracterização dos principais paradigmas de programação
1.3. Capacidade de identificação e descrição dos módulos de um compilador
1.4. Capacidade de caracterização das linguagens imperativas e orientadas aos objectos
1.5. Capacidade de caracterização das linguagens funcionais
1.6. Domínio da especificação e geração automática de lexers/parsers
1.7. Domínio das características básicas de programação em Java e Lisp
2. Aplicação de conhecimentos e compreensão:
2.1. Conhecimentos para utilizar/aplicar ferramentas de geração automática para especificar e gerar lexers e parsers em Java
2.2. Conhecimentos para utilizar/aplicar as ferramentas e a linguagem Java na especificação e desenvolvimento de soluções orientadas aos objectos
2.3. Conhecimentos para utilizar/aplicar as ferramentas e a linguagem Lisp na especificação e desenvolvimento de soluções orientadas aos objectos
3. Realização de julgamento/tomada de
decisões:
3.1. Capacidade para definir de forma justificada as melhores soluções técnicas de especificação e geração de lexers e parsers
3.2. Capacidade para seleccionar e justificar a utilização de um paradigma no desenvolvimento de soluções de programação
3.3. Capacidade para escolher soluções técnicas de programação adequadas no âmbito dos paradigmas utilizados
4. Comunicação:
4.1. Capacidade para descrever e caracterizar as principais características das linguagens de programação e dos paradigmas de programação existentes
4.2. Capacidade para descrever e explicar a estrutura e funcionamento de um parser
4.3. Capacidade para descrever e explicar a estrutura e implementação de uma aplicação Java
4.4. Capacidade para descrever e explicar a estrutura e implementação de uma aplicação Lisp
4.5. Capacidades de apresentação e comparação de soluções baseadas em diferentes paradigmas
5. Competências de auto-aprendizagem:
5.1. Capacidade/curiosidade para conhecer e explorar ferramentas e linguagens de programação utilizadas na especificação e geração de lexers e parsers
5.2. Capacidade/curiosidade para conhecer e explorar ferramentas e linguagens de programação de diferentes paradigmas
5.3. Capacidades de autonomia e de auto-disciplina para procurar soluções alternativas e ultrapassar autonomamente dificuldades inerentes ao desenvolvimento de lexers e parsers
5.4. Capacidades de autonomia e de auto-disciplina para procurar soluções alternativas e ultrapassar autonomamente dificuldades inerentes ao desenvolvimento de soluções utilizando diferentes paradigmas de programação
0. Apresentação
0.1. Enquadramento e Objectivos
0.2. Metodologia e Sistema de Avaliação
0.3. Conteúdo Programático e Bibliografia
1. Conceitos Gerais sobre Linguagens de Programação
1.1. Linguagem Natural
1.1.1. Sintaxe e Semântica
1.2. Linguagens Naturais e Linguagens de Programação
1.3. Normalização das Linguagens
1.4. Linguagens de Programação
1.4.1. Arquitectura e Princípios das Linguagens
1.4.2. Classificação das Linguagens
1.4.3. Elementos das Linguagens
1.4.4. Elementos Meta-linguísticos
1.4.5. Descrição Formal de uma Linguagem
2. Modelo de Programação Orientada aos Objectos
2.1. Desenvolvimento Orientado aos Objectos
2.2. Princípios das linguagens Orientadas aos objectos
2.3. Caso Prático (Java)
2.3.1. Descrição do JDK
2.3.2. Introdução à Programação Orientada-Objectos em Java
2.3.3. Classes e Objectos
2.3.4. Atributos e tipos de dados primitivos
2.3.5. Métodos/Operações e variáveis locais
2.3.6. Operadores e expressões
2.3.7. Colecções (Vectores)
2.3.8. Expressões de Controlo de Fluxo e recursividade
2.3.9. Estruturas de dados complexas
3. Modelo de Programação Funcional
3.1. Linguagens Funcionais
3.2. Princípios das Linguagens Funcionais
3.3. Caso Prático (Lisp)
3.3.1. Descrição do XLisp
3.3.2. Introdução e Princípios Básicos do Lisp
3.3.3. Variáveis
3.3.4. Hierarquia de Elementos
3.3.5. Ordem de Avaliação de Expressões-S
3.3.6. Definição de Funções
3.3.7. Variáveis Locais
3.3.8. Listas
3.3.9. Estruturas de Controlo de fluxo e Recursividade
3.3.10. Listas de Associação
Designação da unidade lectiva; Horas Contacto (HC) - (T+TP+P+L+TC+OT); Horas de Estudo Individual (HEI); ECTS; Bibliografia (B)
1. Apresentação; HC: 1
2. Conceitos Gerais sobre Linguagens de Programação; HC: 12; HEI: 22; ECTS: 1,3; B: [1], [2], [5]
3. Modelo de Programação Orientada aos Objectos; HC: 12; HEI: 22; ECTS: 1,3; B: [3], [5]
4. Modelo de Programação Funcional; HC: 12; HEI: 22; ECTS: 1,3; B: [4], [5]
Horas Contacto (TP+PL): 68
Horas Estudo Individual: 36
Horas Totais: 104
ECTS: 3
Nº ECTS = Nº horas/26
O sistema de avaliação desta disciplina segue na generalidade o regulamento pedagógico da UFP e define em específico as seguintes regras de cálculo.
1 - Avaliação
contínua
A avaliação compreende duas componentes: uma componente Teórico-Prática (TP) e uma componente Prática-Laboratorial (PL). A classificação final da disciplina será calculada através da seguinte expressão:
Nota final = 50% Nota Componente TP + 50% Nota Componente PL
Componente
Teórico-Prática (TP)
A componente TP realiza-se de forma contínua durante o semestre e inclui os seguintes elementos de avaliação:
• Um teste de avaliação individual TP: incide sobre os conhecimentos leccionados até ao momento da sua realização. O teste realiza-se próximo do fim do semestre em data a indicar. Nesta avaliação poderá ser pedido aos alunos para resolverem exercícios específicos de geração de lexers ou parsers, desenvolvimento OO, desenvolvimento Lisp. Esta componente será complementada por perguntas de escolha múltipla, verdadeiros/falso e perguntas de desenvolvimento sobre os temas abordados.
• Desempenho nas aulas: esta componente procurará avaliar a participação e o progresso dos alunos nas aulas e a capacidade para a realização de exercícios.
A falta aos momentos de avaliação será convertida numa nota 0 (zero) para efeitos de cálculo da classificação. A classificação obtida na componente TP será calculada através da seguinte expressão:
Nota Componente TP = 90% Teste + 10% Desempenho Aluno Aulas
Componente Prática-Laboratorial
(PL)
A componente PL realiza-se de modo contínuo durante as aulas e através da realização de projectos práticos realizados em grupo (máximo 2 alunos), sobre um ou mais temas propostos durante o semestre. A avaliação da componente PL poderá inclui os seguintes elementos de avaliação: i) Projecto Lexer/Parser: desenvolvimento de um lexer/parser; ii) Projecto Java/Lisp: comparação da implementação de problemas de acordo com os paradigmas abordados.
• Desempenho nas aulas: esta componente procurará avaliar a participação e o progresso dos alunos nas aulas e a capacidade para a realização de exercícios.
A falta aos momentos de avaliação será convertida numa nota 0 (zero) para efeitos de cálculo da classificação. A classificação obtida na componente PL será calculada através da seguinte expressão:
Nota Componente PL = 90% Projectos (Lexer/Parser + Java/Lisp) + 20% Desempenho Aluno Aulas
O acesso às épocas de exame, relativas apenas à componente TP, faz-se de acordo com o regulamento pedagógico. A componente PL não pode ser efectuada por exame.
2 - Exames
Os exames serão realizados de acordo com o regulamento pedagógico da UFP nos períodos previstos no cronograma e incidirão sobre a totalidade da matéria incluída no programa da disciplina. O docente poderá solicitar o desenvolvimento de trabalhos com apresentação oral de modo a melhor aferir o nível de conhecimentos e competências alcançadas pelos alunos. A classificação final do aluno será calculada utilizando a equação indicada acima.
Principal
[1] Fischer, Alice, Grodzinsky,
Frances, “The Anatomy of Programming Languages”, Prentice-Hall, 1993.
[2] Appleby, Doris, “Programming Languages,
Paradigm and Practices”, McGraw-Hill, 1991.
[3] Andre W. Appel, Modern Compiler Implementation
in Java, 2nd Ed., Cambridge University Press 2004.
[4] Eckel, Bruce,
“Thinking in Java”, President, MindView Inc., 1997,
www.eckelobjects.com.
[5] Steel, Guy L. Jr., “Common Lisp”, 2nd Ed.
(HTML Version: www.cs.virginia.edu/~vision/cltl2/clm/node1.html (Last visited 2012)).
Complementar
[6]
Friedman, Daniel, Wand, Mitchell, “Essentials of Programming Languages”, MIT
Press, 1992
[7] Sethi, Ravi, “Programming Languages: Concepts and
Constructs”, Addison-Wesley, Reading, Massachusetts, 1989.
[8] Moreira, Rui, Apontamentos de apoio às aulas de PP, UFP, 2009.
[9] Wirth, Niklaus, Compiler Construction (revised version of book
published by Addison-Wesley in 1996), Zürich, November 2005.
[10] A.V. Aho, J.D. Ullman, Principles of Compiler Design, Reading
MA: Addison-Wesley, 1985.
Computador Portátil
JFlex (gerador de analisadores lexicais em Java), http://jflex.de/
Java Cup (gerador de parsers em Java), http://www2.cs.tum.edu/projects/cup/
Netbeans
IDE, http://www.netbeans.org/downloads
Eclipse
IDE, http://www.eclipse.org/downloads
XLisp, http://www.mv.com/ipusers/xlisper/
Conceitos Gerais sobre as Linguagens: linguagem natural, sintaxe e semântica, linguagens naturais e linguagens de programação, normalização das linguagens. Linguagens de programação: arquitectura e princípios das linguagens, classificação das linguagens, elementos das linguagens, elementos meta-linguísticos, descrição formal de uma Linguagem. Modelo de Programação Orientada aos Objectos: metodologias orientadas aos objectos, modelização gráfica OMT, caso prático (Java). Modelo de Programação Funcional: linguagens funcionais, princípios das linguagens funcionais, caso prático (Lisp).
General
concepts about languages: natural languages, syntax and semantic, natural
languages and programming languages, language normalisation.
Programming languages: evaluation principals of language designs, language
classification, language elements, meta-language elements, and languages formal
description. Object-Oriented programming model: object oriented methodologies,
graphical notation OMT, practical study case (Java). Functional programming
model: functional languages, functional language principles, practical study
case (Lisp).
Disciplina: Paradigmas
da Programação / Programming Paradigms |
Código |
|||||
Língua de
instrução PT |
Avaliação Exame & Projectos Exam & Projects |
Nível Alunos
licenciatura Undergraduate |
Créditos 6 ECTS |
|||
Ano
curricular |
Docente Rui
Moreira |
1º
Semestre X |
Nº total
de horas: 150 104 |
|||
Objectivos: Introduzir
os conceitos gerais sobre as linguagens de programação e paradigmas de
programação. Introduce the general concepts about programming
languages and programming paradigms. |
||||||
Conteúdos: 1. Conceitos
Gerais sobre Linguagens de Programação (sintaxe e semântica) 2. Modelo
de Programação Orientada aos Objectos 3. Modelo
de Programação Funcional |
1. General concepts about programming languages
(syntax e semantic) 2. Object-oriented programming model 3. Functional programming model |
|||||
Bibliografia |
[1] Fischer, Alice, Grodzinsky, Frances, “The Anatomy of Programming
Languages”, Prentice-Hall, 1993. [2] Appleby, Doris,
“Programming Languages, Paradigm and Practices”, McGraw-Hill, 1991. [3] Andre W. Appel, Modern
Compiler Implementation in Java, 2nd Ed., Cambridge University Press 2004. [4] Eckel,
Bruce, “Thinking in Java”, President, MindView
Inc., 1997, www.eckelobjects.com. [5] Steel, Guy L. Jr.,
“Common Lisp”, 2nd Ed. (HTML Version:
www.cs.virginia.edu/~vision/cltl2/clm/node1.html (Last visited 2012)). |
|||||
Bibliografia
suplementar |
[6] Friedman, Daniel, Wand,
Mitchell, “Essentials of Programming Languages”, MIT Press, 1992 [7] Sethi,
Ravi, “Programming Languages: Concepts and Constructs”, Addison-Wesley,
Reading, Massachusetts, 1989. [8]
Moreira, Rui, Apontamentos de apoio às aulas de PP, UFP, 2009. [9] Wirth, Niklaus, Compiler Construction (revised version of book
published by Addison-Wesley in 1996), Zürich, November 2005. [10] A.V. Aho, J.D. Ullman, Principles of Compiler Design, Reading
MA: Addison-Wesley, 1985. |
|||||
Tipologia |
Aulas
teóricas e práticas / Theoretical and practical classes. |
|||||
Pré-requisitos
|
Capacidades
de programação / Programming skills |
|||||
Métodos de
avaliação |
Exames
& Projectos / Exam & Projects |
|||||
Responsável
|
Rui
Moreira |
e-mail:
rmoreira@ufp.edu.pt |
||||