Você está na página 1de 31

INSTITUTO DE INFORMÁTICA

Universidade Federal de Goiás

Introdução
Linguagens e Paradigmas de Programação

Prof Bruno Silvestre


brunoos@inf.ufg.br
Por que Estudar e Linguagens de Programação?

● Aumento da capacidade de expressar ideias


● Maior conhecimento para a escolha de linguagens apropriadas
● Facilidade para aprender novas linguagens
● Entender melhor a importância da implementação
● Melhor uso das linguagens que já são conhecidas
● Avanço global da computação

2
Por que Estudar e
Linguagens de
Programação?

3
Domínios de Programação
● Aplicações científicas
○ Computação com ponto flutuante; array; eficiência

○ Fortran

● Aplicações comerciais
○ Relatórios, números decimais e caracteres

○ COBOL

● Inteligência artificial
○ Manipulação de símbolos em vez de números e uso de listas

○ LISP, Prolog
4
Domínios de Programação
● Programação de sistemas
○ Eficiência na execução por causa do uso contínuo
○ C
● Software para web
○ Coleção eclética de linguagens
■ Markup (e.g., HTML, CSS)
■ Scripting (e.g., PHP, JavaScript)
■ Propósito geral (e.g., Java)

5
Critérios de Avaliação
de Linguagens

6
Critérios de Avaliação da Linguagem

● Legibilidade: facilidade com que os programas podem ser lidos e


entendidos

● Redigibilidade: facilidade de uso de uma linguagem para criar


programas para um domínio de problema escolhido

● Confiabilidade: um programa é confiável se ele se comportar de


acordo com suas especificações em todas as situações

7
Critérios de Avaliação da Linguagem

8
Critérios de Avaliação: Legibilidade
Ponto de vista...

VS

9
Critérios de Avaliação: Legibilidade
Foco: Homem x Máquina

int max(int a, int b) { max:


pushl %ebp
int tmp; movl %esp, %ebp
if (a > b) subl $16, %esp
tmp = a; movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
else jle .L2
tmp = b; movl 8(%ebp), %eax
return tmp; movl %eax, -4(%ebp)
jmp .L3
} .L2:
movl 12(%ebp), %eax
movl %eax, -4(%ebp)
.L3:
movl -4(%ebp), %eax
leave 10
Critérios de Avaliação: Legibilidade

● Simplicidade como um todo:


○ Um conjunto gerenciável de características e construções
○ Multiplicidade de recursos reduzida
○ Sobrecarga de operadores mínima

11
Critérios de Avaliação: Legibilidade
Muitas maneiras de fazer a mesma coisa

int main() {
int cont = 0;
count = count + 1;
cont += 1;
cont++;
++cont;
return 0;
}

12
Critérios de Avaliação: Legibilidade
Sobrecarga de operador

Point Point::operator +(Point param) { int main () {


Point temp; Point a(3,1);
temp.x = x + param.x; Point b(1,2);
temp.y = y + param.y;
return temp;
Point c;
}
c = a + b;

return 0;
}

13
Critérios de Avaliação: Legibilidade

● Estruturas de controle adequadas


○ Não resolver tudo com “if / goto” (ou “cmp / jmp”)

● Tipos de dados
○ Tipos de dados adequados e pré-definidos
○ Ex: C não tem booleanos (ou tem?)

14
Critérios de Avaliação: Legibilidade

● Considerações de sintaxe
○ Formas dos identificadores (nomes): deve ser flexível
○ Palavras especiais: “ } ” vs “end” vs “end if”
○ Forma e significado: construções autodescritivas, palavras-chave
significativas (e.g., static)

15
Critérios de Avaliação: Legibilidade

● Ortogonalidade
○ “Um conjunto relativamente pequeno de construções primitivas pode
ser combinado em um número relativamente pequeno de maneiras
para construir as estruturas de controle e de dados da linguagem”
○ Toda combinação possível é aceita, gerando menos exceções às
regras da linguagem

16
int main() {
int vet[3] = {10,20,30};
int *ptr;

ptr = &vet[0];
ptr = ptr + 1; Sucessor?

// Imprime “20”
Ortogonalidade printf(“%d\n”, *ptr);

return 0;
}

ptr (ptr+1) (ptr+2)

vet

17
int main() {
short vet[3] = {10,20,30};
short *ptr;

ptr = &vet[0];
ptr = ptr + 1; Sucessor?

// Imprime “20”
Ortogonalidade printf(“%d\n”, *ptr);

return 0;
}

ptr (ptr+1) (ptr+2)

vet

18
void hello() {
printf(“Hello\n”);
}

Ortogonalidade
int main() {
void x;
hello();
return 0;
}

19
Critérios de Avaliação: Redigibilidade

● Geralmente os problemas que afetam a legibilidade


também afetam a redigibilidade

● Simplicidade e ortogonalidade

○ Um número menor de construções primitivas e um


conjunto consistente de regras para combiná-las é
melhor do que ter um número grande de primitivas

20
Critérios de Avaliação: Redigibilidade

● Suporte à abstração
○ Capacidade de definir e usar estruturas ou operações complicadas
de uma maneira que permita ignorar muitos dos detalhes
■ Abstração de processo
■ Abstração de dados

● Exemplo:
○ Função de ordenação em relatórios
○ Implementação de árvore usando vetor

21
Critérios de Avaliação: Redigibilidade

Suporte à abstração: Java vs Lua


public class Obj { local class = {__index={}}
private int x;
public Obj(int v) {x = v;} function class.__index.inc(self)
public void inc() {x++;} self.x = self.x + 1
} end

Obj obj1 = new Obj(0); obj1 = setmetatable({x=0},class)


Obj obj2 = new Obj(2); obj2 = setmetatable({x=2},class)

obj1.inc() obj1:inc()
obj2.inc() obj2:inc()
22
Critérios de Avaliação: Redigibilidade

● Expressividade
● Operadores ou funções que realizam operações poderosas e/ou
complexas
○ Por exemplo: APL

23
Critérios de Avaliação: Redigibilidade
● Expressividade
○ Exemplo: Quicksort em Haskell

quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs

24
Critérios de Avaliação: Redigibilidade

● Um conjunto de maneiras convenientes de especificar as


operações. Por exemplo:
○ “cont++” vs “count = count + 1”
○ “for” vs “while”

● Número de operadores e funções pré-definidos

25
Critérios de Avaliação: Redigibilidade
public class Foo {

public static void main(String[] args) {


int[] vet = new int[]{1,2,3,4,5};

for (int i = 0; i < vet.length; i++)


System.out.println(vet[i]);

for (int v : vet)


System.out.println(v);
}
}

26
Critério de Avaliação: Confiabilidade
● Verificação de tipos
○ Testar se existem erros de tipo
● Tratamento de erros
○ Interceptar erros em tempo de execução e realizar medidas
corretivas
C Java
r = fread (buf, 1, size, fd); try {
if (r != size) { fd.read(buf, 0, size);
// Erro } catch(IOException e) {
} // Erro
}

27
Critério de Avaliação: Confiabilidade

● Legibilidade e redigibilidade
○ Uma linguagem que não suporta maneiras naturais de
expressar algoritmos usará, necessariamente, métodos não-
naturais, reduzindo a confiabilidade
○ Programas fáceis de escrever têm maior chance de estarem
corretos
○ Programas fáceis de ler são mais fáceis de entender,
escrever e modificar

28
Critério de Avaliação: Custo
● Treinamento de programadores para usar a linguagem
● Custo de escrever programas: domínio da aplicação
● Custo de compilação: tempo e memória
○ Compiladores estão melhores
● Custo de execução: requisitos mínimos do sistema
○ Influenciado pelo projeto da linguagem
● Custo do sistema de implementação da linguagem
○ Disponibilidade de compiladores gratuitos
● Confiabilidade: baixa confiabilidade eleva os custos
● Manutenção de programas

29
Critérios de Avaliação: Outros
● Portabilidade
○ Facilidade de mudar programas de uma plataforma para a outra

● Generalidade
○ Uso da linguagem em uma ampla variedade de aplicações

● Boa definição
○ A completude e precisão da documentação oficial da linguagem

30
Resumo
● Razões para estudar conceitos de linguagens de programação

● Domínios de programação

● Critérios de avaliação da linguagem


○ Legibilidade (readability)

○ Redigibilidade (writability)

○ Confiabilidade (reliability)

○ Outros: custo, portabilidade, generalidade e boa definição

31

Você também pode gostar