Diferenças entre edições de "Linguagens de Programação"

Da wiki Wiki Universidade Aberta
m (Corpo Docente:)
(Ano Letivo 2021/2022)
(Há 26 revisões intermédias de 7 utilizadores que não estão a ser apresentadas)
Linha 6: Linha 6:
  
 
== Planos da Unidade Curricular (PUC): ==
 
== Planos da Unidade Curricular (PUC): ==
 +
*[https://wiki.dcet.uab.pt/files/images/b/be/PUC_LP_2021_2022.pdf PUC Linguagens de Programação 2021-2022]
 
*[https://wiki.dcet.uab.pt/files/images/e/e7/PUC_LP_2020-21.pdf PUC Linguagens de Programação 2020-2021]
 
*[https://wiki.dcet.uab.pt/files/images/e/e7/PUC_LP_2020-21.pdf PUC Linguagens de Programação 2020-2021]
 
*[https://wiki.dcet.uab.pt/files/images/0/07/Plano_da_Unidade_Curricular_LP_2020.pdf PUC Linguagens de Programação 2019-2020]
 
*[https://wiki.dcet.uab.pt/files/images/0/07/Plano_da_Unidade_Curricular_LP_2020.pdf PUC Linguagens de Programação 2019-2020]
Linha 14: Linha 15:
  
 
== Enunciados e Resoluções de e-Fólios, p-Fólios e Exames de anos anteriores ==
 
== Enunciados e Resoluções de e-Fólios, p-Fólios e Exames de anos anteriores ==
 +
 +
=== Ano Letivo 2021/2022 ===
 +
* [https://wiki.dcet.uab.pt/files/images/6/6f/1efolio-21077_OCaml_2022.pdf E-fólio A]
 +
 +
* [https://wiki.dcet.uab.pt/files/images/b/b9/2efolio-21077_Prolog_2022.pdf E-fólio B]
 +
* [https://wiki.dcet.uab.pt/files/images/7/77/Enunciado_Exame2022.pdf Exame]
 +
 
=== Ano Letivo 2020/2021 ===
 
=== Ano Letivo 2020/2021 ===
 
* [https://wiki.dcet.uab.pt/files/images/4/43/1efolio-21077_OCaml_2021.pdf E-fólio A] - Possíveis Resoluções: [https://github.com/PauloJMNicolau/efolioA_LP 1(3.82v)] - [https://github.com/RenatoMBDuarte/21077_LP_EfolioA  2(4v)]
 
* [https://wiki.dcet.uab.pt/files/images/4/43/1efolio-21077_OCaml_2021.pdf E-fólio A] - Possíveis Resoluções: [https://github.com/PauloJMNicolau/efolioA_LP 1(3.82v)] - [https://github.com/RenatoMBDuarte/21077_LP_EfolioA  2(4v)]
 
* [https://wiki.dcet.uab.pt/files/images/5/51/2efolio-21077_Prolog_2021.pdf E-fólio B]  - Possiveis Resoluções: [https://github.com/PauloJMNicolau/efolioB_LP 1(4v)] - [https://github.com/RenatoMBDuarte/21077_LP_EfolioB  2(4v)]
 
* [https://wiki.dcet.uab.pt/files/images/5/51/2efolio-21077_Prolog_2021.pdf E-fólio B]  - Possiveis Resoluções: [https://github.com/PauloJMNicolau/efolioB_LP 1(4v)] - [https://github.com/RenatoMBDuarte/21077_LP_EfolioB  2(4v)]
* [https://wiki.dcet.uab.pt/files/images/2/28/Enunciado_efolio_global-enunciado_21077_20210609.pdf E-fólio Global]
+
* [https://wiki.dcet.uab.pt/files/images/2/28/Enunciado_efolio_global-enunciado_21077_20210609.pdf E-fólio Global] - [https://wiki.dcet.uab.pt/files/images/f/f7/21077_Global_2021.pdf Proposta de Resolução (12V)]
* [https://wiki.dcet.uab.pt/files/images/d/d3/Enunciado_exame-enunciado_21077_20210609.pdf Exame Global]
+
* [https://wiki.dcet.uab.pt/files/images/d/d3/Enunciado_exame-enunciado_21077_20210609.pdf Exame]
 +
* [https://wiki.dcet.uab.pt/files/images/4/40/Enunciado_exame-enunciado_21077_20210927.pdf Exame de Recurso]
 
* [https://wiki.dcet.uab.pt/files/images/f/f8/2020-2021_z_efolios_LP2021_criteriosEGlobal.pdf Critérios Correcção Efolio/Exame]
 
* [https://wiki.dcet.uab.pt/files/images/f/f8/2020-2021_z_efolios_LP2021_criteriosEGlobal.pdf Critérios Correcção Efolio/Exame]
  
Linha 93: Linha 102:
 
'''OCaml'''
 
'''OCaml'''
  
Livro online [https://realworldocaml.org/v1/en/html/index.html Real World Ocaml]
+
Oficial OCaml Tutorials [https://ocaml.org/learn/tutorials/ OCaml.org]
  
 
Introdução OCaml - UBI [http://www.di.ubi.pt/~desousa/OCaml/aula_ocaml1-pp.pdf PDF]
 
Introdução OCaml - UBI [http://www.di.ubi.pt/~desousa/OCaml/aula_ocaml1-pp.pdf PDF]
Linha 110: Linha 119:
  
 
== Materiais de Apoio==
 
== Materiais de Apoio==
=== 2013/2014 ===
 
Neste ano a ordem das linguagens de programação foi, primeiro Java depois Prolog e por fim OCaml. Os e-fólios foi resolver o mesmo problema utilizando as diferentes linguagens.
 
 
  
=== 2009/2010 ===
+
Aborda-se três diferentes paradigmas de programação:
 
 
Foram abordados três diferentes paradigmas de programação:
 
  
 
     Programação Funcional;
 
     Programação Funcional;
Linha 126: Linha 130:
 
A programação funcional constituiu uma parte significativa de toda a matéria (6 semanas). Foi utilizada a linguagem OCaml da qual apenas se estudou a parte funcional. A leitura da bibliografia fornecida não foi difícil nem muito demorada mas foi fundamental fazer bastantes exercícios. Há alguns conceitos novos, por vezes contrastantes com os de outros paradigmas, o que pode causar alguma dificuldade de adaptação. A ideia fundamental é a de que uma computação complexa se obtém pela composição de funções (como na matemática) e cada função apenas devolve um valor, não alterando o estado de outras "variáveis" - os chamados side-effects. Aqui tudo são (converte-se em) valores, até mesmo uma função "é" um valor e pode ser utilizada como argumento de outras funções, sendo estas denominadas funções de ordem superior. Esta é uma das características mais poderosas deste tipo de linguagens. Outros conceitos que importa interiorizar para nos adaptarmos a este paradigma são coisas como static binding, currying, closure, polimorfismo... mas a "força motriz" da programação funcional é mesmo a recursividade. Os algoritmos são sempre recursivos, não há ciclos iterativos do tipo while ou for. Até os tipos podem também ser recursivos!
 
A programação funcional constituiu uma parte significativa de toda a matéria (6 semanas). Foi utilizada a linguagem OCaml da qual apenas se estudou a parte funcional. A leitura da bibliografia fornecida não foi difícil nem muito demorada mas foi fundamental fazer bastantes exercícios. Há alguns conceitos novos, por vezes contrastantes com os de outros paradigmas, o que pode causar alguma dificuldade de adaptação. A ideia fundamental é a de que uma computação complexa se obtém pela composição de funções (como na matemática) e cada função apenas devolve um valor, não alterando o estado de outras "variáveis" - os chamados side-effects. Aqui tudo são (converte-se em) valores, até mesmo uma função "é" um valor e pode ser utilizada como argumento de outras funções, sendo estas denominadas funções de ordem superior. Esta é uma das características mais poderosas deste tipo de linguagens. Outros conceitos que importa interiorizar para nos adaptarmos a este paradigma são coisas como static binding, currying, closure, polimorfismo... mas a "força motriz" da programação funcional é mesmo a recursividade. Os algoritmos são sempre recursivos, não há ciclos iterativos do tipo while ou for. Até os tipos podem também ser recursivos!
  
Recursos utilizados:
+
Recursos utilizados
 +
 
 +
The OCaml top level 
 +
    REPL -> https://ocaml.org/learn/tutorials/up_and_running.html
 +
    UTOP -> https://opam.ocaml.org/blog/about-utop/
 +
 
 +
Compilador (opcional dado que é suficiente trabalhar apenas em top level)
 +
    https://ocaml.org/learn/tutorials/a_first_hour_with_ocaml.html#Compiling-OCaml-programs
  
Compilador
 
    http://caml.inria.fr/resources/index.en.html
 
 
Bibliografia
 
Bibliografia
     Chailloux, E.; Manoury, P.; Pagano, B., Developing Applications With Objective Caml, INRIA 1995-2005
+
     Jason Hickey, "Introduction to the Objective Caml Programming Language", 2004
  
 
[http://wiki.dcet.uab.pt/files/images/3/32/Exercicios_resolvidos_OCaml.pdf ExerciciosResolvidosOCaml]
 
[http://wiki.dcet.uab.pt/files/images/3/32/Exercicios_resolvidos_OCaml.pdf ExerciciosResolvidosOCaml]
Linha 144: Linha 153:
 
     http://www.swi-prolog.org/
 
     http://www.swi-prolog.org/
 
Bibliografia
 
Bibliografia
     Sterling, L.; Shapiro, E., The Art of Prolog, MIT Press, 1994
+
     Leon Sterling and Ehud Shapiro, The Art of Prolog (2nd Edition), MIT Press, 1994
  
 
Nota:
 
Nota:
Linha 156: Linha 165:
  
 
IDE
 
IDE
     Eclipse
+
     Netbeans (12.4)
 
Bibliografia
 
Bibliografia
     David J. Eck, Introduction to Programming Using Java, 2006
+
     F. Mário Martins, Java 8 - POO + Construções Funcionais, FCA
    Martins, F. M. J., Java 6 e Programação Orientada Pelos Objectos, FCA, 2009
 
 
 
A unidade curricular estava bem organizada, sendo a bibliografia acessível e suficiente, exceptuando o caso do Prolog em que o livro é de qualidade, bom para conhecer os conceitos fundamentais, mas mais complexo e difícil de ler. No entanto foi fornecido um tutorial on-line que vai directo ao assunto, traduzido, tornando a aprendizagem mais rápida.
 
 
 
Os e-fólios foram equilibrados, 4 valores cada, e o grau de dificuldade estava de acordo com aquilo que foi trabalhado ao longo do semestre. O primeiro e-fólio foi sobre a programação funcional, com um problema sobre árvores binárias. O segundo e-fólio consistiu em fazer um programa em Java para simular uma leiloeira on-line, tipo eBay, que recebendo um ficheiro de comandos com diversas transacções produzia outro ficheiro com o resultado dessas transacções. Embora laborioso e com alguma extensão, o grau de dificuldade estava de acordo com as actividades propostas e no livro encontrava-se tudo o que era necessário para construir uma solução, sem ser necessário inventar algoritmos complexos, para os quais não tínhamos tido qualquer tipo de formação.
 

Revisão das 18h54min de 11 de junho de 2022


Guia Informativo Oficial

Planos da Unidade Curricular (PUC):

Enunciados e Resoluções de e-Fólios, p-Fólios e Exames de anos anteriores

Ano Letivo 2021/2022

Ano Letivo 2020/2021

Ano Letivo 2019/2020:

Ano Letivo 2018/2019:

Ano Letivo 2017/2018:

Ano Letivo 2016/2017:

Ano Letivo 2015/2016:

Ano Letivo 2014/2015:

Ano Letivo 2013/2014:

Ano Letivo 2012/2013:

Corpo Docente:

Links úteis:

Java

The Java™ Tutorials Tutorial da Oracle

Livro online Introduction to Programming using Java 7ed Livro muito bem escrito e de fácil leitura.

Livro Introduction to programming in Java


OCaml

Oficial OCaml Tutorials OCaml.org

Introdução OCaml - UBI PDF

Apontamentos feitos por Cátia Santos @ 2020 Resumo de OCAML

PROLOG

Video introdutório sobre Prolog Prolog Tutorial (5 estrelas)

Site livro online Learn Prolog Now

Lista de manuais em Prolog [1]

Apontamentos feitos por Cátia Santos @ 2020 Resumo de PROLOG

Materiais de Apoio

Aborda-se três diferentes paradigmas de programação:

   Programação Funcional;
   Programação Lógica;
   Programação por Objectos.

OCaml

A programação funcional constituiu uma parte significativa de toda a matéria (6 semanas). Foi utilizada a linguagem OCaml da qual apenas se estudou a parte funcional. A leitura da bibliografia fornecida não foi difícil nem muito demorada mas foi fundamental fazer bastantes exercícios. Há alguns conceitos novos, por vezes contrastantes com os de outros paradigmas, o que pode causar alguma dificuldade de adaptação. A ideia fundamental é a de que uma computação complexa se obtém pela composição de funções (como na matemática) e cada função apenas devolve um valor, não alterando o estado de outras "variáveis" - os chamados side-effects. Aqui tudo são (converte-se em) valores, até mesmo uma função "é" um valor e pode ser utilizada como argumento de outras funções, sendo estas denominadas funções de ordem superior. Esta é uma das características mais poderosas deste tipo de linguagens. Outros conceitos que importa interiorizar para nos adaptarmos a este paradigma são coisas como static binding, currying, closure, polimorfismo... mas a "força motriz" da programação funcional é mesmo a recursividade. Os algoritmos são sempre recursivos, não há ciclos iterativos do tipo while ou for. Até os tipos podem também ser recursivos!

Recursos utilizados

The OCaml top level

   REPL -> https://ocaml.org/learn/tutorials/up_and_running.html
   UTOP -> https://opam.ocaml.org/blog/about-utop/

Compilador (opcional dado que é suficiente trabalhar apenas em top level)

   https://ocaml.org/learn/tutorials/a_first_hour_with_ocaml.html#Compiling-OCaml-programs

Bibliografia

   Jason Hickey, "Introduction to the Objective Caml Programming Language", 2004

ExerciciosResolvidosOCaml

Prolog

Deste paradigma fez-se apenas uma pequena introdução, mas mesmo assim é imprescindível estudar a bibliografia e, mais uma vez, praticar bastante. Esta linguagem de programação assenta num conceito completamente diferente das restantes. Aqui nada é avaliado/convertido em valores. Aquilo com que se trabalha são factos e regras. Toda a computação consiste em verificar se uma determinada proposição é falsa ou verdadeira, verificando os factos existentes e as regras sobre eles definidos. Este processo tem por base o conceito de "unificação", fundamental para entender a linguagem. Até mesmo a aritmética - o único lugar da linguagem onde se calcula o valor de uma expressão - funciona de uma forma inesperada. É interessante (e espantoso) aquilo que se consegue fazer pensando sempre em "é falso ou verdadeiro?". No vocabulário deste paradigma estão palavras como clausula, termo, predicado, aridade, query... e recursividade! Uma grande parte da computação é conseguida de forma recursiva.

Recursos utilizados:

Compilador

   http://www.swi-prolog.org/

Bibliografia

   Leon Sterling and Ehud Shapiro, The Art of Prolog (2nd Edition), MIT Press, 1994

Nota: Nestes dois paradigmas é essencial esquecer tudo (quase tudo) o que se sabe de programação e embarcar numa viagem por terras desconhecidas, culturas diferentes. Tal como nessa circunstância, não devemos tentar empregar (forçar) as técnicas e procedimentos que já conhecemos mas antes tentar perceber qual é a "filosofia", qual é a "cultura".

Java

Neste caso foi muito mais rápida a fase inicial, com muita coisa semelhante ao que se faz em C/C++, mas é tudo muito mais trabalhoso. É um grande contraste com os paradigmas anteriores (especialmente o funcional) o número de linhas de código que é necessário escrever para fazer mesmo a coisa mais simples. É importante dominar o conceito de apontador e referência para entender os problemas de violação do encapsulamento - um dos princípios fundamentais em POO - mas em Java não se faz nada parecido com a manipulação dos endereços de memória como em C ou C++. Se quisermos caracterizar numa frase esta linguagem (exagerando um bocadinho) podemos dizer que em Java tudo são objectos. Até os tipos numéricos têm umas "embalagens" para funcionar como tal. O vocabulário desta linguagem é já conhecido: classe, método, atributo, instância, interface, composição, herança, polimorfismo, overloading... switch e instanceof são coisas a evitar, faz-se muito foreach com as colecções e os tipos podem ser parametrizados.

Recursos utilizados:

IDE

   Netbeans (12.4)

Bibliografia

   F. Mário Martins, Java 8 - POO + Construções Funcionais, FCA