linguagens de programaÇÃo: noÇÕes preliminares · 2012-04-02 · linguagens de programaÇÃo:...

Post on 15-Dec-2018

218 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

LINGUAGENS DE PROGRAMAÇÃO: NOÇÕES PRELIMINARES

PROGRAMA

Duas formas de manifestação:

• Como documento: especificação de um conjunto de operações;• Em execução: realização das operações especificadas

Programa, uma máquina abstrata: manipula e produz entidades abstratas (dados).

É, ao mesmo tempo, a descrição da máquina (documento) e a própria máquina (em execução).

Papel da linguagem de programação(LP): define recursos para a construção de máquinas abstratas específicas.

LP: conjunto de recursos que podem ser compostos para construir programas, mais um conjunto de regras de composição.

As regras visam a implementações com qualidade apropriada (ex: verificação de tipos).

Elementos a serem observados no projeto de uma LP:

• requisitos: universo de problemas a serem resolvidos;• expressividade: qual a melhor forma de representar os elementos

da linguagem?• paradigma: qual a forma mais apropriada para representar e

resolver os problemas daquele domínio.• implementação: os requisitos e sua representação são passíveis de

implementação? (ex: recursividade)• eficiência: a implementação se dá em um nível aceitável de

eficiência?

SINTAXE E SEMÂNTICA

Para que uma LP atenda aos requisitos especificados de forma eficiente, deve ser especificada de forma única (não ambígua). Isso envolve a definição:

• sintática: como os elementos da LP são compostos.• semântica: o que significa cada elemento. O que um progtrama

bem-formado irá realizar.

Ex1 - a declaração de uma variável é feita em cada linguagem, de acordo com suas regras sintáticas:

a: real; {pascal}float a; // C/C++

A semântica indica que a declaração de uma variável A acarretará a reserva de memória para A.

Ex2 – o uso de expressões aritméticas deve obedecer às regras sintáticas da LP:

a + b * c {pascal}(+ a (* b c)) ; lisp

A semântica indica que a resolução da expressão se dará pelo produto de b por c, seguido da soma desse resultado com a.

COMPILADORES E INTERPRETADORES

A implementação de cada um dos elementos de uma LP é feita através de processadores:

compiladores: os programas são transformados por inteiro em um conjunto de instruções que podem ser fisicamente efetuadas por um computador.

Interpretadores: cada expressão é transformada nas instruções correspondentes e acionada no computador.

METODOLOGIA DE PROGRAMAÇÃO

Novas formas de resolver problemas podem requerem desde novos elementos básicos nas LP até novos paradigmas.

Diferentes paradigmas advêm de formas diferentes de resolver problemas (novas orientações metodológicas)

• LP orientadas a objetos(OO): soluções de problemas a partir de objetos;

• LP imperativas: soluções de problemas orientadas por dados;• LP declarativas: soluções de problemas orientadas por relações

entre declarações;

Cada linguagem deve prover os mecanismos que permitam a representação e a manipulação natural dos elementos básicos, conforme o paradigma de referência. De acordo com a evolução das metodologias de desenvolvimento, novos elementos são incorporados às LP.

Ex: a verificação de tipos, tradicionalmente feita no momento da compilação, é feita durante a execução em linguagens mais modernas.

CARACTERÍSTICAS DESEJÁVEIS PARA UMA LP

1 - LEGIBILIDADE: a LP deve possuir elementos de fácil entendimento e não-ambíguos.

Para preservar a legibilidade, a LP deve combinar:

Simplicidade: a linguagem deve prover um número reduzido de elementos básicos, evitando-se multiplicidade de escrita.

Ortogonalidade: a linguagem deve possuir um conjunto mínimo de primitivas que possam ser combinadas para gerar componentes mais elaborados.

Instruções de controle claras: estas devem se reduzir a um conjunto estritamente essencial para o controle do fluxo de execução.

o uso indiscriminado de instruções de desvio (go to) prejudica a legibilidade:

100 I = 1;110 se I > N then goto 190120 J = 1;130 se J > N then goto 110140 leia(M[I,J]);150 J = J+1;160 goto 130 ;170 I = I+1;180 goto 110;190 …

Sem goto...

for i:= 1 to N dofor j:= 1 to N do

readln(M[i,j]);

Facilidade para representação de estruturas de dados: deve haver mecanismos claros de definição e manipulação de tipos primitivos e compostos.

Sintaxe “limpa” e concisa: cada instrução deve representar de forma única e intuitiva seu significado.

2 – FACILIDADE DE ESCRITAA LP deve possuir expressividade suficiente para resolver

problemas de forma clara e natural. Isso envolve:

• simplicidade e ortogonalidade• suporte a abstrações (forma de tratar objetos em que apenas os

elementos essenciais são representados)

facilidade de escrita está relacionada com legibilidade

3 – CONFIABILIDADE

As implementações correspondentes aos problemas devem produzir os resultados esperados. Ex:

mecanismos de verificação de tipos impedem que programadores façam operações com tipos conflitantes

manipulação de exceções: resultados são produzidos apenas para dados consistentes, e exceções são providas quando a consistência é violada (tendência das LP atuais)

4 – CUSTO

• custo de desenvolvimento (a aceitação no mercado provoca amortização desse custo)

• custo de uso: treinamento, custo de escrita, compilação e execução.

Linguagens legíveis, de fácil escrita e confiáveis tendem a ter um custo menor.

TIPOLOGIA DAS LP

LINGUAGENS ASSERTIVAS: baseiam-se em expressões que modificam valores de entidades (dados ou objetos). Incluem:

• linguagens imperativas : construção de programas é dirigida pela transformação de dados

• linguagens OO : construção de programas dirigida pelas mudanças de estado de entidades abstratas denominadas objetos.

Objeto: repositório de dados mais um conjunto de operações capazes de transformar os valores desses dados.

Exemplo - classe de objetos pilha:

LINGUAGENS DECLARATIVAS: baseiam-se em expressões que verificam ou induzem a que ocorram relações entre declarações.

• linguagens funcionais: relações são caracterizadas por mapeamentos (funções) entre estruturas simbólicas;

• linguagens lógicas: relações são caracterizadas como expressões da lógica matemática;

Cada um desses paradigmas apresenta características (propriedades sintáticas e semânticas) que o torna mais adequado para certos tipos de problema.

VALORES E TIPOS

• Dados: razão de ser dos programas;• Programas razão de ser das LP

importância do estudo da natureza dos dados

Dados: três aspectos básicos:

• valores: representações simbólicas de conceitos

• tipos: classes de valores

• variáveis: os valores precisam ser registrados para passar de uma expressão a outra

Importância do estudo de tipos de dados

necessidade da representação de valores para que estes possam ser manipulados;

conveniência em tratar uniformemente valores semanticamente relacionados

operações em LP devem ser definidas para um tipo como um todo (e não para valores em particular)

Tipos de dados: agrupamento de elementos de natureza semelhante. Isso envolve:

• valores que elementos de um certo tipo podem assumir;• operações para tratamento desses elementos (com regras

unificadas)

Ex: para tipos numéricos desejamos operações aritméticas e comparações entre valores

mesmo elementos de tipos não numéricos possuem entre si uma ordem

os principais tipos de dados têm influências de conceitos matemáticas.

Os tipos de dados são divididos em dois grandes grupos:• primitivos• compostos

além destes, podemos definir tipos em função deles próprios: tipos recursivos

TIPOS PRIMITIVOS

Tipos cujos valores são atômicos (não podem ser desmembrados em valores mais simples)

a implementação de um tipo primitivo é feita “fora” da LP: não há como descrevê-lo através dos elementos da LP.

a implementação dos tipos primitivos numéricos varia de uma LP para outra e de acordo com o ambiente computacional.

Ex: • tipo Word (Pascal): com 2 bytes, representa 216 valores: 0 a

65.535.

• tipos reais: alguns bits representam o expoente de notação científica (ponto flutuante) e outros bits representam a “mantissa”.

um valor real, quando implementado no computador é aproximado pelo valor representável mais próximo.

os intervalos entre reais (valores representados) cresce à medida que cresce o expoente

para que não se confunda essa representação aproximada com números reais, usa-se o termo número de ponto flutuante.

os conjuntos de inteiros e reais (matemática) são infinitos: só podem ser parcialmente representados em computador.

A escolha dos tipos primitivos para uma LP depende dos propósitos para os quais a linguagem foi criada.

Ex: a linguagem MATLAB (voltada para problemas matemáticos), possui matrizes como um tipo primitivo.

TIPOS NUMÉRICOS

Os tipos numéricos primordiais fazem parte da maioria das LPEx: inteiro e real

Pascal C JavaRepresentação de inteiros

integer, word, byte, etc.

int, unsigned int, long int, etc.

byte, short, int. long

Repr.de números de ponto flutuante

real, double,extended, etc.

float, double, etc.

float, double

Obs: Faixa de valores do tipo long de Java: -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807

TIPOS NÃO NUMÉRICOS

Mais comuns:

• booleanos• caracteres

os ponteiros (apontadores) são usados para manipular o valor de memória correspondente ao seu endereço.

Exemplo de definição (ponteiro para inteiro)

var PtInt: ^integer; {linguagem Pascal}

int *PtInt; //linguagem C/C++

TIPOS ENUMERADOS

Além dos tipos pré-definidos, alguns problemas requerem a construção de novos tipos.

As LP em geral fornecem mecanismos para construção de novos tipos

Ao se construir um tipo enumerado, são explicitados todos os valores possíveis para as suas variáveis. Ex:

{Pascal}type Meses = (jan,fev,mar,abr,mai,jun, jul,ago,set,out,nov,dez);

{C/C++} enum Meses = {jan,fev,mar,abr,mai,jun, jul,ago,set,out,nov,dez);

Os elementos que aparecem na enumeração serão os únicos valores possíveis para variáveis daquele tipo. Ex:

var M: Meses;begin M := jan; { sem aspas }

Há uma relação de ordem entre os valores. Portanto, pode-se comparar dois valores (jan<fev) ou variáveis do tipo.

Para implementar relações de ordem, em geral as LP associam cada valor a um valor inteiro, iniciando-se em 0: jan é associado a 0, fev a 1, etc.

SUBINTERVALOS

Novos tipos, criados como subconjuntos de tipos já existentes (primitivos ou definidos pelo usuário). Ex:

type DiasMes = 1..31; PrimSem = jan..jun;

TIPOS COMPOSTOS

Os tipos apresentados anteriormente relacionam-se com valores atômicos: não temos acesso a partes do valor.

Há vários problemas que exigem a modelagem de valores compostos, ou seja, constituídos de um conjunto de valores mais simples.

Ex: podemos estar interessados em ter acesso separadamente às partes de uma data (dia, mês ou ano)

As LP provêem mecanismos para criação de tipos compostos, cujos valores podem ser desmembrados em valores mais simples.

Os tipos compostos visam ao agrupamento de valores que representam os dados das aplicações (resoluções de problemas)

Os elementos matemáticos que inspiram os agrupamentos de valores nas LP são:

• produto cartesiano• união disjunta• mapeamentos• conjunto potência

PRODUTO CARTESIANO

Dados dois conjuntos A e B, o produto cartesiano AXB corresponde a todos os pares onde o primeiro elemento pertence a A e o segundo elemento a B.

C = AXB = {(x,y)|x∈A, y∈B}

Sendo #S o número de elementos (cardinalidade) de um conjunto S,

#C = #A * #B

Ex: A = {jan, fev, mar}B = {1,2,3}AxB = {(jan,1),(jan,2),(jan,3), (fev,1),(fev,2),( fev,3), (mar,1),(mar,2),( mar,3) }

Se qualquer dos conjuntos for infinito, o produto cartesiano resultante será infinito.

Em várias situações é necessário agrupar valores dessa forma. Assim, as LP provêem construtores para a formação de produtos cartesianos: record (em Pascal), struct (em C).

Ex:type Meses = (jan,fev,mar,abr,mai,jun, jul,ago,set,out,nov,dez);

Dias = 1..31;

Data = record D: Dias; M: Meses; end;

Com o tipo Data, pode-se representar datas do ano, através do par <dia, mês>.

UNIÃO DISJUNTA

A união de dois conjuntos gera um terceiro com todos os elementos de ambos os conjuntos originários.

A união disjunta tem a peculiaridade de podermos distinguir o conjunto origem de cada elemento.

C = S+T = {prim x|x∈S} U {seg y|y∈T}

Por convenção, adotou-se o termo prim para indicar que o elemento provém do primeiro conjunto e o termo seg para indicar que provém do segundo conjunto.

O número de elementos do conjunto C é:

#C = #S + #T

Na união de conjuntos, quando os dois conjuntos possuem elementos iguais, somente um deles fará parte do resultado.

Na união disjunta, os dois elementos são considerados, já que é usado um discriminador.

Ex:A = {jan,fev,mar}B = {1,2,3}A+B = (prim jan, prim fev, prim mar, seg 1, seg 2, seg 3}

Em termos práticos, um elemento do conjunto A+B tanto pode assumir um valor do conjunto A (jan,fev,mar) quanto um valor do conjunto B (1,2,3).

Em Pascal, a união disjunta é implementada através de um registro que possui uma variável que discrimina o tipo.

type Precis=(exato,aprox); Num = record case P: Precis of exato: (VlInt:integer); aprox: (VlRl :real); end;var X: Num;begin X.P := exato; X.VlInt := 3;

A variável X pode assumir tanto um valor inteiro quanto um valor de ponto flutuante.

Apenas um campo dentro do case pode ser usado por vez.

O mesmo espaço de memória é compartilhado pelos campos (é alocado espaço para o campo “maior” – real no exemplo acima: 6 bytes).

Implementação na linguagem C:

union N { int VlInt; float VlRl; };

OBS: em C não há o elemento discriminador.

MAPEAMENTOS

O mapeamento de dois conjuntos resulta em um terceiro conjunto de pares onde:

• o primeiro elemento provém do primeiro conjunto• o segundo elemento provém do segundo conjunto

cada elemento do primeiro conjunto está associado, no máximo, a um elemento do segundo.

Ex:A = {jan,fev,mar}B = {1,2,3}

Mapeamentos possíveis (entre outros):C = {jan→1,fev→3,mar→1}D = {jan→2,fev→2,mar→1}

Definição:

m:S→T = {x|x∈S ⇒m(x)∈T}

O primeiro conjunto é denominado de domínio e o segundo é o contradomínio ou imagem.

os elementos do domínio correspondem aos índices em LP

A cardinalidade (número de elementos) do conjunto S→T é dada por:

#(S→T) = (#T)#S

Os mapeamentos aparecem nas LP como arrays.

Em algumas LP os domínios são sempre inteiros (ou naturais) Outras permitem que os índices sejam definidos pelo programador

Ex: em Pascal, o conjunto de índices é explicitamente definido. Já em C, apenas o número de elementos do domínio é definido.

Domínios inteiros em Pascal e C:

varV:array[1..10] of integer; {Pascal} int V[10]; // C

Domínios não inteiros (Pascal)

Representação da menor temperatura de cada mês do ano:

type Meses = (jan,fev,mar,abr,mai,jun, jul,ago,set,out,nov,dez);var MinTemp: array[Meses] of real;

Outras possibilidades:

MinTemp: array[jan..dez] of real; MinTempSem: array[jan..jun] of real;

Possibilidades de manuseio:

var i: Meses;begin for i:= jan to dez do readln(MinTemp[i]);

As funções na maioria das LP também são mapeamentos entre um domínio e um contradomínio.

Nesse caso, um algoritmo descreve a relação entre os elementos do domínio e do contradomínio.

CONJUNTOS POTÊNCIA

Alguns problemas computacionais requerem uma representação de conjuntos (em vez de um único elemento)

Dado um conjunto S, o conjunto potência P(S) é o conjunto formado por todos os possíveis subconjuntos de S.

Definição:P(S) = {R|R ⊆ S}

O número de elementos (cardinalidade) do conjunto P(S)é:

#(P(S)) = 2#S

Ex:A = {vermelho,azul,amarelo}

P(A) = {{},{vermelho},{azul},{amarelo}, {vermelho,azul},{vermelho,amarelo}, {azul,amarelo},{vermelho,azul,amarelo}}

#(P(A)) = 2#A = 23 = 8

Aplicação: a partir das cores primárias, representar as várias cores por meio da mistura destas cores primárias.

A linguagem C não implementa conjuntos

Pascal e Modula-3 estão entre as poucas linguagens que provêem manipulação de conjuntos (construtores e operadores).

{exemplo acima em Pascal}type Cores=(vermelho,azul,amarelo); NovasCores = set of Cores;

TIPOS RECURSIVOS

Aqui entra um texto que fiz em casa

Definição em Pascal de uma lista de inteiros:

type PtNo = ^No; No = record Valor: integer; Prox: PtNo; end;

OBS: Em Pascal não pode ser definido um tipo usando-se seu próprio nome.

Torna-se necessário um elemento auxiliar para a referência (PtNo)

A mesma definição em C:

typedef struct No *PtNo; struct No { int Valor; PtNo Prox; }

Alternativa:

struct No { int Valor; No *Prox; }

TIPOS CONSTRUÍDOS PELO PROGRAMADOR

O programador pode definir tipos de dados pela:

• Renomeação de tipos existentes• Agregação de tipos predefinidos ou criados na LP (através de seus

construtores)

Vantagens de tipos nomeados :

• legibilidade (tipos são nomeados de forma significativa para o contexto)

• facilidade de escrita (não é necessário definir a estrutura para cada variável)

• facilidade de modificação (basta modificar o tipo para modificar todas as variáveis correspondentes)

VARIÁVEIS

Necessidade de armazenar valores de forma que eles possam ser usados posteriormente: variáveis.

PAPEL DAS VARIÁVEIS

A Solução de problemas, em geral, é uma transformação sucessiva dos valores originais até a obtenção dos valores desejados.

Variável: uma forma de abstrair a representação efetiva de cada valor (através de um nome “fantasia”).

Variáveis são utilizadas para modelar objetos reais de forma que seus valores possam ser consultados ou modificados.

O armazenamento é feito através de células de memória ( o número de células depende do tipo associado e da LP)

Para cada variável tem-se:• Um identificador• Um endereço da célula de memória• O conteúdo

A declaração de uma variável envolve, portanto, três subtarefas:

• Associar um tipo à variável• Alocar espaço de memória apropriado• Associar a esse espaço o identificador

ARMAZENAMENTO E ACESSO A VALORES

Variáveis podem armazenar tanto conteúdos atômicos quanto compostos

• variáveis simples: o acesso é feito, em geral, sobre o valor como um todo

• variáveis compostas: podemos armazenar e ter acesso a partes (valores mais simples)

VARIÁVEIS SIMPLES

Espaços de memória que podem ter seus conteúdos armazenados e acessados atomicamente.

TIPOS PRIMITIVOS:

Os valores dos tipos primitivos são sempre referidos como elementos atômicos (embora sejam armazenados por meio de elementos que possam ser desmembrados)

Ex: • números inteiros são representados internamente com um bit para

sinal e um conjunto de bits para o valor.... • números reais (ponto flutuante) são representados internamente

por um expoente e uma parte fracionária...

...entretanto, não fazemos referência a essas partes separadamente.

Ex (linguagem C)

int i1,i2;float r;

i1 = 10;i2 = i1 – 10;r = 20.5;

Assim como os numéricos, os caracteres e booleanos são também armazenados em variáveis simples.

Definição em C do tipo booleano

Enum Bool {false, true};...Bool b;

...

If (b = true) ...

OBS: alguns compiladores C++ suportam o tipo bool, outros não.

PonteirosSão também tipos primitivos: guardam endereços de memória

onde se encontram determinados conteúdos necessários.

Ex (Pascal):var PtInt1, PtInt2: ^Integer; I: Integer;

... New(PtInt1); I := 10; PtInt2 := @I; PtInt1^ := I; Dispose(PtInt1);

Em C...

int * PtInt1, *PtInt2; int I;

... PtInt1 = (int *) malloc(sizeof(int)); I = 10; PtInt2 = &I; *PtInt1 = I; free(PtInt1);

TIPOS COMPOSTOS

completar

VARIÁVEIS COMPOSTAS

As variáveis compostas possuem componentes que podem ser tratados seletivamente.

(tipos compostos possuem acesso seletivo aos seus subcomponentes)

top related