title |
---|
Aspectos preliminares |
-
Aumentar a capacidade de expressar ideias \pause
-
Melhorar as condições de escolha da linguagem apropriada para cada problema \pause
-
Aumentar a capacidade de aprender novas linguagens \pause
-
Melhorar o uso das linguagens já conhecidas \pause
-
Entender a importância da implementação \pause
-
Avanço da área de computação
Linguagens de programação com objetivos diferentes
- Desde controle de usinas nucleares até jogos em dispositivos móveis
Aplicações científicas
-
Estruturas simples (arranjos e matrizes)
-
Muitas operações com pontos flutuantes
-
Fortran, C/C++
-
Recentemente
-
Hardware especializado (GPU, TPU)
-
Python (numpy), Octave (Mathlab), Julia
-
Aplicações comerciais
-
Inicialmente
-
Integração com banco de dados
-
Produção de relatórios
-
Armazenamento e manipulação de números decimais e texto
-
Cobol
-
-
Atualmente
-
Muitos requisitos
-
Muitas linguagens
-
Inteligência artificial
-
Manipulação de símbolos (estruturas encadeadas ao invés de arranjos)
-
Criação e execução de código
-
Lisp, Prolog
-
Atualmente
-
Métodos numéricos
-
Python, C/C++
-
Software de sistema
-
Software básico e ferramentas de suporte a programação
-
Sistemas operacionais
-
Construções para interfaceamento com dispostos externos
-
Eficiência devido ao uso contínuo
-
-
Compiladores e interpretadores \pause
-
-
E os softwares que são executados continuamente? \pause
- Navegadores, \pause Sistemas web \pause
-
C/C++, \pause D, Go, Rust
Sistemas Web
-
Apresentação de conteúdo dinâmico
-
Código junto com a tecnologia de apresentação
-
Inicialmente
- PHP, JavaScript
-
\pause
-
Segurança
-
Escalabilidade
-
Desempenho
-
Integração com sistemas existentes
É comum a seguinte classificação hierárquica:
-
Imperativas
-
Procedurais (Fortran, Pascal, C, ...)
-
Orientada a Objetos (Smalltalk, Java, C++, ...)
-
-
Declarativas
-
Funcionais (Lisp/Scheme, Haskell, Ocaml, ...)
-
Lógicas (Prolog)
-
A maioria das linguagens é multiparadigma, por isso, ao invés de classificação hierárquica é mais útil identificar as características de cada paradigma presente em uma linguagem.
A seguir, mostramos como o problema de encontrar o valor máximo em uma lista não vazia de números inteiros pode ser resolvido utilizando os paradigmas imperativo, funcional e lógico.
-
Inicialize a variável
max
com o primeiro elemento da lista -
Para cada elemento
x
da lista a partir do segundo elemento, faça:- Se
x
é maior domax
, então atribua o valorx
paramax
- Se
-
A variável
max
contém o maior valor da lista
Código em C
int maximo(int lst[], size_t n)
{
assert(n > 0);
int max = lst[0];
for (size_t i = 1; i < n; i++) {
if (lst[i] > max) {
max = lst[i];
}
}
return max;
}
-
O valor
maximo(lst)
é definido como:-
O primeiro elemento de
lst
selst
só tem um elemento -
O primeiro elemento de
lst
se ele é maior do que omaximo
do restante delst
-
maximo
do restante delst
se ele é maior ou igual ao primeiro elemento delst
-
-
Para computar o valor de
maximo
de uma dada lista, expanda e simplifique esta definição até que ela termine
Código em Racket
(define (maximo lst)
(cond
[(empty? (rest lst))
(first lst)]
[(> (first lst) (maximo (rest lst)))
(first lst)]
[else (maximo (rest lst))]))
-
A proposição
maximo(lst, x)
é verdadeira se:-
x
é o único elemento delst
; ou -
x
é primeiro elemento delst
e existe um valorm
tal quem
é o máximo do restante delst
ex
é maior do quem
; ou -
x
é o máximo do restante delst
e existe um valorp
que é o primeiro elemento delst
ex
é maior ou igual ap
-
-
Para computar o valor máximo de uma dada lista, busque por um valor
x
que permita provar que a proposiçãomaximo(lst, x)
é verdadeira.
Código em Prolog
maximo([X], X).
maximo([X | Xs], X) :- maximo(Xs, M), X > M.
maximo([P | Xs], X) :- maximo(Xs, X), X >= P.
Nível de abstração
-
Baixo nível
- Poucas abstrações sobre os detalhes do computador
-
Alto nível
- Abstrações sobre os detalhes do computador
Linguagens de scripting
-
"Automatizar" execução de tarefas que poderiam ser executadas manualmente
-
Também usado para referenciar linguagens dinâmicas de propósito geral
-
Compilação
-
Interpretação
-
Híbrido
-
Como os recursos das linguagens influenciam o desenvolvimento de software?
-
Alguns critérios podem ser controversos
-
Alguns critérios são objetivos, enquanto outros não
-
Algumas pessoas valorizam mais alguns critérios do que outros
- O Sebesta valoriza muito as características que permitem que erros possam ser detectados em tempo de compilação, mas estas características podem tornam os programas mais difíceis de serem mantidos do que o necessário
-
Legibilidade (facilidade de leitura)
- Deve ser considerada em relação ao domínio do problema
-
Facilidade de escrita
- Deve ser considerada em relação ao domínio do problema
-
Confiabilidade
-
Custo
\footnotesize
Característica | Legibilidade | Facilidade de escrita | Confiabilidade |
---|---|---|---|
Simplicidade | |||
Ortogonalidade | |||
Tipos de dados | |||
Projeto de sintaxe | |||
Suporte para abstração | |||
Expressividade | |||
Verificação de tipos | |||
Tratamento de exceções | |||
Apelidos restritos |
Simplicidade
-
Um conjunto bom de características e construções
-
Poucas formas de expressar cada operação
-
Sobrecarga de operadores?
-
Muito simples não é bom (assembly)
Ortogonalidade
-
Poucas características podem ser combinadas de várias maneiras
-
Uma característica deve ser independente do contexto que é usada (exceções a regra são ruins)
-
Muito ortogonalidade não é bom (Algol68)
-
Linguagens funcionais oferecem uma boa combinação de simplicidade e ortogonalidade
\scriptsize
void f(par x) { x.primeiro = 10; }
void test_f() { par x = {1, 2}; // passagem de parâmetro // por valor f(x); assert(x.primeiro == 1); }
</div>
<div class="column" width="50%">
\pause
```c
void g(int x[2]) {
x[0] = 10;
}
void test_g() {
int x[2] = {1, 2};
// vetores não podem ser passados
// como parâmetro por valor!
g(x);
assert(x[0] == 10);
}
Tipos de dados
- Tipos pré-definidos adequados
Sintaxe
-
Flexibilidade para nomear identificadores
-
Forma de criar sentenças compostas
-
A forma deve ter relação com o significado
Simplicidade e ortogonalidade
- Poucas construções e um conjunto consistente de formas de combinação
Suporte para abstração
-
Definir e usar estruturas e operações de maneira que os detalhes possam ser ignorados
-
Suporte a subprogramas
-
Suporte a tipos abstratos de dados
Expressividade
- Maneira conveniente de expressar a computação
Algumas linguagens tem a sintaxe e/ou a semântica tão densas e bizarras que são chamadas de "Linguagens somente de escrita"!
Um programa é dito confiável quando está de acordo com suas especificações em todas as condições
-
Verificação de tipos
-
Tratamento de exceções
-
Apelidos (um ou mais nomes para acessar a mesma célula de memória)
-
Facilidade de leitura e escrita
Os testes automatizados são extremamente importantes para aumentar a confiabilidade/manutenibilidade dos programas
-
Especificação executável
-
Frameworks de testes
\tiny
\
vector<int> v = {10, 20, 30};
int soma = 0;
for (int &x : v) {
soma += x;
if (x == 20) {
v.push_back(1);
}
}
assert(soma == 61);
\
Pode ou não falhar... x
pode referenciar memória desalocada
Java
\
ArrayList<Integer> lista =
new ArrayList<>(
asList(10, 20, 30));
int soma = 0;
for (Integer x : lista) {
soma += x;
if (x == 20) {
lista.add(1);
}
}
assert soma == 61;
\
Falha na execução: lista.add
gera o erro java.util.ConcurrentModificationException
Rust
\
let mut v = vec![10, 20, 30];
let mut soma = 0;
for &x in &v {
soma += x;
if x == 20 {
v.push(1);
}
}
assert_eq!(soma, 61);
\
Falha na compilação: cannot borrow v
as mutable because it is also borrowed
as immutable
Os fatores que mais afetam os custos são
-
Desenvolvimento
-
Manutenção
-
Confiabilidade
-
Treinar programadores
-
Escrever programas
-
Aspectos importantes
-
Ambiente de desenvolvimento (IDE)
-
Gerenciamento de pacotes
-
-
Compilar programas
-
Executar programas
-
Aspectos importantes
-
Compiladores/Interpretadores (software livre)
-
Linguagens com execução eficiente
-
-
Confiabilidade
-
Manutenção
-
Portabilidade
-
Padronização
\pause
Diferentes visões
-
Programador
-
Projetista da linguagem
-
Implementador da linguagem
Arquitetura do Computador
-
Arquitetura de von Neumann
-
Arquiteturas multicore
-
Outras?
\pause
Metodologias de Programação
-
Orientada a processos
-
Orientada a dados
-
Orientada a objetos
- Robert Sebesta, Concepts of programming languages, 9ª edição. Capítulo 1.