Professional Documents
Culture Documents
Aviso: Essas notas de aula tem por finalidade orientar o professor no encaminhamento das aulas, a fim de no deixar assuntos fora da ordem planejada. A leitura deste material no reduz a necessidade de leitura da bibliografia recomendada. ltima atualizao em 28/02/12.
comum encontrar autores que classificam a Programao Orientada a Objetos como sendo um paradigma de programao. Essa classificao considera que o projeto de programas orientados a objetos segue conceitos de destaque suficiente para que esse estilo de programao seja classificado parte da programao imperativa. Este texto se concentra na programao imperativa, apesar de apresentar conceitos que so independentes do paradigma de programao. Alguns conceitos em particular so melhor
exemplificados atravs de suas implementaes em linguagens funcionais como (LISP, ML, Haskell, etc.) e nesses casos daremos preferncia a exemplos nessas linguagens.
2.1.1 Inteiros
Diferentes capacidades. Com ou sem sinal. Complemento de dois X Complemento de um. Complemento de dois requer circuito simples. Complemento de um permite duas representaes para o zero.
A norma IEEE 754 estabelece 23 bits de mantissa e 8 de expoente para preciso simples; 52 bits de mantissa e 11 bits de expoente para preciso dupla.
2.1.3 Decimais
Ponto fixo, til em aplicaes comerciais. Algumas mquinas tinham hardware prprio para esse tipo e representavam nmeros como strings de bits, desperdiando um pouco de espao. Hoje em dia, costuma-se usar emulao desse tipo no software.
2.1.4 Booleanos
Um nico bit no normalmente enderevel na memria. Tipos booleanos aumentam a legibilidade da linguagem (ver exemplo na seo de expresses booleanas). Algumas linguagens permitem que o valor de qualquer tipo seja testado.
2.1.5 Caracteres
Existem vrios sistemas de representao. Alguns usam tamanhos fixos e outros usam tamanhos variveis. Considerar UNICODE como um sistema de codificao de caracteres um erro comum. O prprio livro do Sebesta, afirma que o UNICODE um conjunto de caracteres de 16 bits, o que errado. Dizer que os caracteres so representados de acordo com a tabela ASCII outro.
2.1.6 Ponteiros
Proporcionam flexibilidade para outros tipos. Essa flexibilidade tem uma relao importante com o fato de que ponteiros podem apontar para lugar nenhum (ex.: nil em Pascal, null em Java). Esse valor especial quase sempre o nmero zero. Outro elemento importante a capacidade de representar informaes de uma forma segmentada (partes da informao ficam num lugar da memria e partes ficam em outro). Uma linguagem em que os tipos so na verdade ponteiros para os respectivos tipos, permite a representao de variveis que no tem valor.
2.1.7 Strings
Quando so tipos primitivos, strings costumam vir acompanhas de diversos operadores para comparar, extrair substring, concatenar, etc. Para manter o tamanho varivel num espao esttico de memria, preciso algum tipo de controle. FORTRAN usa strings sempre cheias. C usa o terminador zero. Pascal usa o tamanho no primeiro elemento do vetor (problemas de limite para o tamanho). Strings podem ser dinmicas. Por serem elementos compostos, as operaes podem ser complicadas (atribuir, comparar, etc.). As linguagens que fornecem formas de descrever padres de strings se destacam na criao de programas que precisam manipular texto. Destas, SNOBOL (em especial a verso 4) tem importncia especial por entender os padres como tipos de primeira classe (que podem ser manipulados como qualquer outro tipo primitivo). Das linguagens mais modernas, Perl, uma das
prof. Bruno Schneider 3
mais lembradas por seus recursos de casamento de padres. Os padres so geralmente descritos por expresses chamadas de expresses regulares. Com frequncia, diz-se que SNOBOL e Perl tem nfase em processamento de strings por causa dessa poderosa forma de processar texto. Exemplo: teste em Perl para ver se uma string contm uma data:
if $linha =~ (0[1-9]|[12][0-9]|3[01]) / (0[1-9]|1[012]) / ([12][0-9]{3})
A representao interna pode usar listas ou vetores (dentre outras possibilidades menos populares), trazendo para a string as vantagens e desvantagens desses tipos. Algumas linguagens permitem interpolao de strings, o que facilita a construo de strings a partir de diversos valores de tipos diferentes. Strings tem um papel importante na segurana de computadores (buffer overflow).
2.1.8 Enumerados
Amentam a legibilidade do programa. Usa constantes simblicas para os valores possveis. Temos problemas se uma mesma constante aparece em mais de um tipo.
2.1.9 Subfaixas
Facilitam a deteco de erros de faixa/limite. Aumentam a legibilidade ao tornar explcitos limites de um tipo numrico. Erros podem ser detectados em tempo de compilao. Costumam herdar as operaes do tipo pai.
2.1.10 Vetores
Agregado homogneo de valores. Os valores ficam em posies consecutivas na memria. Algumas linguagens usam parnteses para os ndices, outras usam colchetes. Uso de parnteses deixa a sintaxe semelhante uma chamada de funo. Algumas linguagens permitem o uso de enumerados ou subfaixas como ndices. Algumas linguagens determinam o valor mnimo do ndice. Algumas linguagens no verificam os limites dos ndices. Alocao esttica ou dinmica.
2.1.12 Registros
Agregado heterogneo. Elementos referenciados por nomes. A declarao de classes supre a necessidade dos registros.
2.1.14 Listas
uma estrutura de dados homognea e recursiva. Requer que a estrutura seja percorrida para acessar um valor. Por ser segmentada, aumenta e diminui com facilidade.
2.1.15 Conjuntos
Linguagens mais antigas podem ter limitaes severas com relao quantidade de elementos do conjunto. Fornecem apenas facilidade na implementao (ex.: verificar se uma letra uma vogal).
2.2 Vinculaes
Programas lidam com informaes abstradas em variveis. O compilador/interpretador precisa ter controle da relao entre a abstrao que aparece no cdigo fonte e a entidade manipulada pelo hardware. Para isso, os vrios elementos de um programa (em especial as variveis), so associados aos seguintes atributos: nome (relacionado ao conceito de escopo), tipo, armazenamento (ou endereo - relacionado ao conceito de tempo de vida) e valor.
5
Nem todos os atributos so definidos no mesmo momento. Nem todos precisam existir num momento qualquer. A associao de um atributo ao seu valor uma vinculao. As variveis aumentam a legibilidade dos programas (em relao endereos) e resolvem o problema dos endereos absolutos. Uma vinculao esttica se for se a mesma durante todo o tempo de execuo. Vinculao dinmica aquela que pode ser alterada durante a execuo. Vinculaes podem acontecer no tempo de: projeto da linguagem, implementao da linguagem, compilao, ligao, carregamento ou execuo.
2.2.2 Escopo
O escopo de uma varivel o trecho de cdigo no qual seu nome pode ser usado, ou melhor, existe um nome vinculado ela. Nos idos de 1960 era muito comum que qualquer instruo de um programa pudesse fazer uso de qualquer varivel do programa. Essa uma viso bem prxima ao conceito de varivel do ponto de
prof. Bruno Schneider 6
vista do hardware: os registradores disponveis a qualquer hora. Entretanto, isso mostrou-se um problema, j que as variveis mudavam de valor e ficava difcil entender o motivo. As linguagens passaram ento a fornecer formas de declarar variveis ao longo do programa, de maneira que seu nomes seriam vlidos somente em algumas instrues. Surge ento o problema da declarao de variveis diferentes com o mesmo nome. Para que um nome esteja vinculado uma nica entidade (varivel ou subprograma), numa dada instruo, comum que as linguagens de programao determinem que uma vinculao de um nome uma entidade, invalida as vinculaes anteriores para uma determinada parte do programa. Neste caso, dizemos que uma vinculao oculta a outra, num sistema de controle que lembra uma pilha. Isto leva ao conceito informal de que "o nome que vale o da declarao mais interna". O problema com essa afirmao que o conceito de "interno" bastante flexvel. Ainda assim, nem sempre uma vinculao de nome oculta as vinculaes anteriores. Dependendo do conceito de "interno" na linguagem de programao, a nova vinculao pode simplesmente ser um erro. Os namespaces so uma forma de manter os vrios nomes disponveis. Esse sistema nos leva ao conceito de varivel local (aquela cujo nome foi declarado no prprio bloco de cdigo em questo) e varivel externa (aquela cujo nome foi declarado fora do bloco em questo). O conceito de local/externo sempre relativo algo. Uma varivel pode ser local a um bloco ao mesmo tempo que externa a outro. O conceito de varivel global deve ser evitado, visto que um conceito absoluto e frequentemente mal usado. Por exemplo: variveis cujo escopo se estende por um arquivo inteiro so frequentemente chamadas de globais, quando na verdade esto fora de escopo em outros arquivos do mesmo programa. A alterao de uma varivel externa chamada de efeito colateral. Efeitos colaterais so perigosos e devem ser evitados sempre que possvel. O conjunto de nomes que podem ser usados numa determinada instruo chamado de ambiente de referenciamento da instruo. desejvel restringir tanto quanto possvel o escopo das variveis e procedimentos, para que no haja mltiplos nomes disponveis um bloco de cdigo sem necessidade. Esse conceito frequentemente chamado de diretriz do escopo mnimo. Para minimizar o escopo das variveis, o mnimo que um programador deve fazer evitar o uso de variveis externas. Algumas linguagens (como C++) se destacam ao oferecer recursos prprios para ajudar nessa minimizao: a possibilidade de declarar variveis em qualquer posio do cdigo, atrasando o incio de seu escopo e a possibilidade de usar instrues compostas (ver 2.4.1) em qualquer lugar do cdigo, adiantando o final do escopo para algumas variveis.
Muito da filosofia por trs de uma linguagem de programao se reflete na forma como ela gerencia os nomes das variveis, operadores e subprogramas. As linguagens variam muito nesse aspecto, passando de casos extremamente simples como C++ a casos extremamente complicados como Perl.
exigir a declarao de tipos. Por outro lado, declaraes de tipo so uma forma de documentao, us-las mesmo quando no so necessrias pode melhorar a legibilidade de um programa. A inferncia de tipos nem sempre funciona, ou seja, nem sempre possvel determinar o tipo das variveis pelo seu uso, o que faz com que as linguagens que usam esse recurso ofeream formas de declarar tipos, permitindo que o programador resolva esses casos especiais.
A primeira forma muito restritiva e com frequncia diferencia tipos que o programador no queria diferenciar. Exige que tipos sejam declarados globalmente, podendo causar problemas com bibliotecas. A segunda forma traz problemas de indireo pois tipos podem ser formados de outros tipos e podem ser recursivos. Ela torna impossvel a diferenciao de tipos com a mesma estrutura (o que pode ser desejvel)
1 Na verso traduzida do livro texto, onde se define o que a verificao de tipos, l-se que um tipo que seja convertido automaticamente compatvel. Isso causa algum conflito com a definio da compatibilidade de tipos (ver 2.2.3.3) e provavelmente dificulta a fixao desse segundo conceito. Por isso, a definio de verificao de tipos aparece aqui ligeiramente diferente. prof. Bruno Schneider 9
Na prtica as linguagens usam uma mistura dos dois tipos pois nenhum dos dois produz os resultados tidos como desejveis em alguns casos. Na orientao a objetos a compatibilidade de tipos est fortemente ligada ao conceito de herana.
O gerenciamento do heap pode ser feito por algoritmos de garbage collection. O tempo de vida de uma varivel geralmente tempo de execuo de um bloco. Vrias linguagens oferecem formas de vinculao esttica ao armazenamento, o que permite a criao de um tipo de memria em subprogramas. Nem sempre uma varivel vinculada a um armazenamento acessvel, o que desejvel, seguindo o princpio do escopo mnimo. Vinculao dinmica ao armazenamento uma propriedade que conflita com instrues tipo goto.
2.2.5 Inicializao
Inicializao a vinculao ao valor no momento da vinculao ao armazenamento. Variveis estticas em termos de armazenamento precisam ser vinculadas a um valor antes da execuo. Nesse caso, pode no ser possvel usar uma expresso para a inicializao. Nem toda linguagem oferece recursos de inicializao (ex.: Pascal).
mais operandos e podem ser sobrecarregados em algumas linguagens. Quase sempre as linguagens usam parnteses para fazer associao explcita.
processamento. Uma atribuio envolve dois elementos: uma expresso cujo valor pode ser encontrado, chamada de right value (valor direito) j que costuma aparecer do lado direito da atribuio nas vrias regras de sintaxe e uma expresso cujo armazenamento pode ser encontrado, chamada de left value (valor esquerdo). Frequentemente as linguagens tm regras sintticas que impedem elementos como constantes (literais ou no) e expresses aritmticas (variveis temporrias) de serem usadas onde se espera um left value.
13
14
Algumas linguagens usam sequncias de instrues (em oposio a instrues compostas) nos seletores, o que exige um marcador de final e elimina a ambiguidade.
Em muitas linguagens, a seleo mltipla requer nmeros inteiros, algumas permitem qualquer tipo discreto. Nem sempre a seleo mltipla por valores discretos adequada. Vrias linguagens oferecem a possibilidade de aninhar testes nos seletores bidirecionais (elseif/elsif/elif), tornando-os seletores mltiplos que no sofrem da falta de legibilidade do aninhamento profundo de seletores bidirecionais. Esse tipo de estrutura mais genrica que a anterior (case/switch).
a validade de alterar os parmetros e, caso seja vlido, o efeito da alterao; a avaliao nica dos parmetros ou a cada iterao.
Algumas formas so muito flexveis e complicadas (C / Algol60) permitindo inclusive a mistura entre o controle numrico e lgico.
16
Essa instruo ainda parte fundamental do conjunto de instrues de qualquer processador e usada pelos compiladores para produzir as instrues de controle de fluxo (alto nvel) das linguagens de programao em geral (seletores e laos). A tendncia que seja eliminada apenas dos cdigos de alto nvel de abstrao. O desvio incondicional funciona em conjunto com rtulos, que so identificadores (s vezes numricos) para instrues de um programa. Para reduzir os problemas relacionados com o desvio incondicional, as linguagens proporcionam formas limitadas de uso desse comando. Frequentemente as limitaes incluem desviar somente para frente e mesmo assim, somente para o comando imediatamente aps um bloco. Nessa forma, o comando no diz para onde o fluxo de instrues ser desviado, evitando abusos por parte do programador. Exemplos comuns so o break para sair de laos e o return para sair de subprogramas. Algumas linguagens procuram desincentivar at mesmo essa forma limitada de desvio. Por exemplo, em Pascal e em Python, existe uma varivel especial para definir o valor que uma funo retorna (em oposio a algo tipo return), dificultando a criao de sadas mltiplas.
2.5 Subprogramas
So essenciais para a abstrao de um programa, permitindo que processos completos possam ser abstrados numa entidade nica e reusados em vrios contextos. Ajudam a ressaltar a estrutura geral de um programa. desejvel permitir a compilao de subprogramas para criao de bibliotecas (tambm chamadas de pacotes).
17
2.5.1.3 Parmetros
So uma forma de fornecer os dados para o processamento de um subprograma. Deixam o subprograma mais legvel que o uso de variveis externas. O escopo reduzido ajuda a evitar erros. Eles tambm so usados para receber dados resultantes do processamento dos subprogramas. Parmetros podem ser dados ou subprogramas. A vinculao entre parmetros reais e formais por ser feita pela posio ou pelo nome. Em algumas linguagens pode-se usar a duas formas ao mesmo tempo (ex.: Ada e Python). Nem sempre obrigatrio usar todos os parmetros. Nesse caso preciso existir alguma regra a respeito daqueles no vinculados. Nem sempre preciso definir um nmero fixo de parmetros. Nesses casos, parmetros so geralmente vistos como elementos de um vetor ou lista. So geralmente variveis stack-dinmicas.
18
As funes so mais genricas que os procedimentos j que podem fazer tudo o que eles fazem e ainda retornar um valor. Apesar disso, algumas linguagens reduzem ou limitam completamente (no caso de linguagens no procedurais) a possibilidade de criao de efeitos colaterais numa funo, aproximado-as das funes matemticas e tornando-as distintas dos procedimentos. Em algumas linguagens (como C, C++ e Java) no existem procedimentos e as funes no precisam fazer parte de uma expresso.
vinculado a dois ou mais parmetros formais). Pode causar semntica ambgua em funo do momento em que se determina o endereo de retorno. Assim como a passagem por valor, exige mais tempo e armazenamento. Os compiladores costumam usar este mtodo para retornar o valor de funo. Esse retorno um parmetro especial, no sentido de que ele no aparece junto dos outros parmetros e o parmetro real no vinculado a um nome. Isso ajuda na reduo dos problemas do mtodo.
como a da passagem por valor (semntica de entrada). Se for uma varivel, pode-se usar uma implementao como a passagem por referncia (semntica de entrada/sada).
[ISO7185].
As restries aos tipos de retorno so parcialmente justificadas pelo fato de que a troca de valores geralmente feita via passagem por resultado, causando ineficincia para grandes quantidades de informao. Uma exceo comum o tipo registro (ou tuplas) que de certo modo podem ser usados para retornar mais de um valor. Nas linguagens que permitem retornar tipos compostos, a atribuio entre esses tipos pode ser interessante para separao dos valores em variveis independentes. Ex.: (encontrado, indice) := Buscar(vetor, elemento); if (encontrado) then print(Encontrado na posio,indice); else print(No encontrado);
2.5.9 Co-rotinas
So um tipo bem diferente de subprograma. Elas se prestam uma relao de igual para igual entre unidade chamadora e chamada. Ainda assim, co-rotinas so hierarquicamente ligadas uma unidade de programa chamada unidade mestra. A unidade mestra cria uma srie de co-rotinas que se conhecem e as inicializa. Em seguida, o controle passado para uma delas que passam o controle adiante para outra co-rotina do grupo e assim sucessivamente at eventualmente todas acabam e o controle retorna unidade mestra. As co-rotinas no tem um nico ponto de entrada e mantm uma memria de suas ativaes anteriores. Os pontos em que passam o controle adiante so determinados pelo programador e cada vez que uma co-rotina ganha o controle de fluxo, ela retoma a execuo de onde parou. A invocao de uma co-rotina chamada de retomada. As co-rotinas apareceram na linguagem SIMULA que tinha o propsito de oferecer facilidade para simulao de sistemas. Um dos elementos desejados na linguagem era uma forma de proporcionar a execuo em tempo compartilhado entre unidades de programa, como se elas estivessem executando ao mesmo tempo. So geralmente implementadas na forma de laos que passam adiante o controle de fluxo a cada repetio. As co-rotinas formaram a base para a programao concorrente e so a base conceitual da multitarefa cooperativa. Dificultam a criao de mdulos independentes de programas, uma vez que o fluxo de instrues precisa ser passado voluntariamente entre as vrias co-rotinas. Um erro em uma co-rotina pode afetar todas as outras j que a execuo de qualquer co-rotina depende de retomadas a partir de suas irms. Esse mesmo problema aparece em relao aos programas na multitarefa cooperativa e foi um forte motivo para a evoluo para a multitarefa por tempo compartilhado. Exemplos de linguagens modernas que apresentam o recurso so Lua e Modula-2. So tidas como mais genricas que os subprogramas comuns.
Uma instncia de um TAD um objeto. Vrios autores consideram que precisa haver ocultao de dados para que o encapsulamento possa ser considerado um TAD. Seguiremos essa linha. Um encapsulamento um agrupamento de subprogramas e os dados que eles manipulam. Assim, um TAD caso especial de encapsulamento. Suporte aos TADs como nica forma de encapsulamento pode trazer problemas relativos a operaes entre tipos diferentes (ex.: somar ponto com vetor). Para facilitar o entendimento, podemos pensar no ponto flutuante como se fosse um TAD. De maneira no muito precisa, podemos dizer que variveis do tipo ponto flutuante so usadas para representar um tipo de informao (nmero racional); elas podem ser manipuladas com um conjunto de operaes (somar, multiplicar, etc.); o programador no precisa conhecer a sua representao interna para us-lo; no pode alterar diretamente as partes fundamentais da sua representao e no pode construir novas operaes para ele (a no ser pela composio das operaes existentes). As linguagens de programao passaram a permitir que o programador crie TADs, preferencialmente de forma que as definies do tipo e de suas operaes ficam numa unidade de compilao, enquanto que outras unidades de compilao podem declarar variveis desse tipo e usar as operaes definidas para ele. Esconder os detalhes de um tipo de dados importante para manter a independncia entre mdulos de um programa. Por exemplo: suponha que um compilador de uma determinada linguagem usa mais bits para a mantissa de um nmero de ponto flutuante do que outro compilador. Nesse caso, os programas desenvolvidos funcionam nos dois casos, e a mudana na representao de um deles no necessita mudana no cdigo que faz uso dele. Essa ideia d origem ao conceito de ocultao de dados (data hiding). A ocultao de dados uma forma de controle de acesso que limita o uso que se pode fazer de um identificador. Esse controle estende o controle proporcionado pelo escopo. Em linguagens em que a ocultao de dados mais simples, pode-se simplesmente limitar o acesso a um nome, ou seja, mesmo que o nome seja visvel pelas regras de escopo, o compilador pode no permitir que o nome seja usado. Em linguagens em que a ocultao mais sofisticada, pode-se limitar o uso do nome de uma varivel a um right-value numa expresso, ou seja, cria-se uma varivel que somente para leitura em determinados contextos. A ocultao de dados no tem como objetivo esconder dados (no sentido de impedir que o cliente saiba de usa existncia), como o nome poderia sugerir 3. Ela proporciona proteo (no sentido de impedir que o cliente possa us-los), que importante para manter a independncia entre os mdulos de um programa. Para entender o estado de um TAD num dado instante da execuo, no necessrio olhar fora do encapsulamento, j que tais instrues no poderiam alter-lo. No poderiam porque os dados do TAD esto protegidos pela ocultao. Dizemos que a ocultao de dados ajuda a manter a consistncia de um TAD, ou seja, como o estado de um TAD s pode ser alterado pelas operaes definidas no encapsulamento, fica mais fcil garantir que as vrias partes do TAD fazem sentido quando vistas como um todo. Um objeto assim dito um objeto consistente. Por exemplo, imagine que TAD que representa um vetor, que tem como caractersticas um tamanho (inteiro) e um ponteiro para um vetor dinmico interno de elementos. O tamanho usado para que seja possvel saber quantos dos elementos no vetor interno so realmente valores do vetor TAD e quantos so lixo. Se o vetor TAD tem 2 elementos mais o
3 Em alguns textos sobre ocultao, usa-se o termo visvel ou visibilidade na explicao, como em: os dados no ficam visveis. Esses termos remetem ao sentido de secreto para a palavra ocultao e por isso costumam confundir leitores. prefervel, ento, usar algo como os dados no ficam acessveis. prof. Bruno Schneider 24
tamanho dele vale 3, dizemos que o vetor TAD est num estado inconsistente. Para formalizar melhor o conceito de encapsulamento, deve-se dizer que necessrio existir um elemento sinttico da linguagem agrupando os dados e os subprogramas. Declarar um tipo de dados e mais alguns subprogramas que tem a finalidade de processar esse tipo de dados, sem um elemento sinttico que engloba isso tudo no declarar um TAD. Da mesma forma, usar um elemento sinttico que existe para declarar TADs sem declarar dados e subprogramas que possam ser entendidos como um tipo de dados, no declarar um TAD.
Em C++ a estrutura que proporciona encapsulamento a classe. Classes so tipos de dados. A ocultao de informaes funciona de maneira semelhante da Ada. Essas duas caractersticas juntas proporcionam um suporte mais direto aos TADs. Outras facilidades oferecidas so os construtores e destrutores que podem ser usados para gerenciar a inicializao, alocao e desalocao de recursos (ex.: memria no heap). O suporte de Java muito parecido como o de C++, com algumas diferenas importantes. Todos os tipos definidos pelo programador em Java devem ser classes. Todas as variveis que so TADs so alocadas no heap e acessadas por meio de referncias. Alm das classes, Java permite a definio de pacotes (encapsulamento geral) e oferece o escopo de pacote, em que partes protegidas das classes so acessveis em outras partes do pacote.
condies anormais ficam misturadas com a condio normal e (b) dificultar o projeto de funes que retornam o resultado de um processamento (alm do status). A segunda pode ser reduzida pela tipificao dinmica, que permite a criao de uma funo que retorna algum tipo que representa erro ou um tipo que representa o resultado do processamento. Nas bibliotecas padro da linguagem C, o valor de retorno de um subprograma geralmente usado como cdigo de erro.
Uma forma popular de vincular a ocorrncia de uma exceo execuo do tratador conhecida como propagao de erro. Ela consiste em checar se houve erro na execuo de algum subprograma e ento repassar essa indicao para o chamador. Essa passagem que feita manualmente usando cdigos de erro feita automaticamente pela manipulao de excees.
checagem, preferencialmente, em tempo de compilao. Portanto, um sistema de tipos (no contexto de linguagens de programao) o conjunto de regras que permite a classificao de expresses de acordo com um tipo. Declarar o tipo de cada varivel antes do seu uso uma forma simples de proporcionar isso, mas oferece pouca flexibilidade para o programador, limitando o reuso e a facilidade de manuteno. Para conciliar essas duas necessidades contraditrias, pode-se usar declaraes mais gerais, em que no se define um tipo por completo, mas que fornecem elementos suficientes para a checagem. O conceito de polimorfismo (tratamento de tipos diferentes de maneira uniforme) a flexibilidade desejada e difcil de conciliar com a verificao de tipos. Nas linguagens em que os tipos precisam ser completamente determinados, temos monomorfismo. Naquelas em que o tipo precisa ser parcialmente determinado (somente o suficiente para checagem de tipos nas expresses) ou em que no h sistemas de tipos, temos polimorfismo. O polimorfismo pode ento ser obtido em nveis variados, ou seja, as linguagens proporcionam mais ou menos recursos para o tratamento homogneo de tipos diferentes. Alguns dos recursos que proporcionam polimorfismo e j foram analisados so: vinculao dinmica de tipos; escopo dinmico; sobrecarga de subprogramas (e operadores); subprogramas genricos.
Nenhuma linguagem completamente monomrfica. Mesmo linguagens como Pascal possuem subprogramas polimrficos como o write, apesar de no proporcionarem esse tipo de recurso para o programador. Isso uma inconsistncia da linguagem e os projetos de linguagens mais modernas procuram oferecer ao programador um sistema de tipos consistente; com um nvel maior de polimorfismo. O polimorfismo paramtrico dos subprogramas genricos pode ser usado tambm na declarao de tipos. Essa estratgia extremamente til em tipos agregados como vetores, listas, rvores, etc. Nesse tipos, podemos variar o tipo dos valores individuais sem alterar a estrutura geral. As linguagens funcionais ML e Haskell combinam o polimorfismo paramtrico com a inferncia de tipos, proporcionando a robustez da tipificao forte com a convenincia de escrita da tipificao fraca. Entretanto, no recomendvel abusar da inferncia de tipos. Mais do que declarar tipos para o compilador, a declarao de tipos serve como uma forma de documentao do cdigo, evidenciando o significado das coisas. Alguns sistemas de tipos usam o conceito de herana para permitir restries aos parmetros de tipos. Se considerarmos que alguns tipos so casos especiais de outros, podemos agrupar tipos em conjuntos. Esses conjuntos podem ser usados como restries aos parmetros do polimorfismo paramtrico. Por exemplo: nmeros inteiros sem sinal e subfaixas podem ser considerados casos especiais (subtipos) do tipo inteiro. Algumas linguagens permitem especificar que um subprograma recebe um valor de um tipo t qualquer, desde que t pertena ao conjunto dos tipos que so nmeros inteiros. Dessa forma, parmetros reais de tipos subfaixa so vlidos para esse subprogramas mas os de tipo ponto flutuante no so. Algumas linguagens como Haskell definem subtipos em funo das operaes disponveis para eles
prof. Bruno Schneider 28
(ex.: o conjunto dos tipos em que existe a comparao de equivalncia; conjuntos dos tipos para os quais existem operaes aritmticas, etc.). O programador pode ento criar um TAD com as operaes relevantes e inclu-lo em um ou mais conjuntos de tipos. Outras linguagens como Ada, fornecem formas de declarar subtipos em funo de particularidades das suas instncias. Por exemplo, suponha o tipo pessoa, como um registro que possui, entre outras coisas, o campo gnero. possvel ento declarar o tipo homem que um caso especial de pessoa, onde o gnero masculino. O termo herana usando dentro do conceito da orientao, em que, alm de vermos tipos como casos especiais de outros tipos e termos operaes comuns a vrios tipos, existe tambm a preocupao a respeito de como essas operaes alteram os valores de um tipo. A ideia bsica, entretanto a mesma.
3. Eventos
X
Referncias
[Budd 91] Budd, Timothy. An Introduction to Object-Oriented Programming. Addison-Wesly. 1991. [ISO7185] Pascal (ISO 7185:1990). [VEEN 06] http://www.few.vu.nl/~nsilvis/PPL/2006/REPORTS/pascal-vanVeen.pdf [Moore 10] http://www.standardpascal.org/standards.html
29