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

Da wiki Wiki Universidade Aberta
(Ano Letivo 2020/2021)
(Ano Letivo 2020/2021)
Linha 20: Linha 20:
 
* [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/f/f7/21077_Global_2021.pdf Proposta de Resolução (12V)]
+
* [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 Global]
 
* [https://wiki.dcet.uab.pt/files/images/4/40/Enunciado_exame-enunciado_21077_20210927.pdf Recurso Global]
 
* [https://wiki.dcet.uab.pt/files/images/4/40/Enunciado_exame-enunciado_21077_20210927.pdf Recurso Global]

Revisão das 20h42min de 29 de janeiro 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