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)

 

 

 

 

 

 

 

 

 

 

 

 

1          Introdução

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).

2          Distribuição das Horas de Trabalho

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

3          Requisitos Prévios

Linguagens de Programação 1

Linguagens de Programação 2

4          Competências / Resultados da Aprendizagem

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

5          Conteúdos Programáticos

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

6          Metodologia de Ensino-Aprendizagem e Execução de ECTS

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

7          Sistema de Avaliação

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.

8          Bibliografia

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.

9          Recursos Didácticos

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/

10     Resumo

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).

11     Abstract

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).

 


 

12     ECTS

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