Movatterモバイル変換


[0]ホーム

URL:


Saltar para o conteúdo
Wikipédia
Busca

Programação genérica

Origem: Wikipédia, a enciclopédia livre.
Esta página cita fontes, mas não cobrem todo o conteúdo
Esta páginacita fontes, mas quenão cobrem todo o conteúdo. Ajude ainserir referências (Encontre fontes:Google (N •L •A •I •WP refs)  •ABW  •CAPES).(Fevereiro de 2018)

Programação genérica é umparadigma de programação no qual osalgoritmos são escritos em umagramática estendida de forma a adaptar-se através da especificação das partes variáveis que são definidas na instância do algoritmo. Especificamente, a gramática estendida eleva um elemento não variável ou uma construção implícita na gramática base para uma variável ou constante, permitindo a utilização do código genérico.

É diferente da forma normal deprogramação na medida em que invoca de certa forma as facilidades de metaprogramação da linguagem. Como isso ocorre em uma extensão da linguagem, novas semânticas são introduzidas e a linguagem é enriquecida no processo. É relacionada com a metaprogramação, mas não envolve a geração decódigo fonte, pelo menos visivelmente aoprogramador. É diferente também da programação pormacros, já que esta refere-se somente a busca e substituição de termos, não fazendo parte da gramática da linguagem, implementada somente na fase depré-processamento do código.

Para efeitos práticos, o paradigma permite que um parâmetro assuma diferentestipos de dados desde que certas regras sejam mantidas, como sub-tipos e assinaturas. Por exemplo, para criar umalista usando programação genérica, uma possível declaração seriaList<T>, no qualT é o tipo de dado. Para instanciar, poderia-se usarList<Inteiro> ouList<Animal>, já que o conceito de lista independe do tipo utilizado.

Entrelinguagensorientadas a objeto,C++,Linguagem D,BETA,Eiffel e versões deJava (1.5 e acima) fornecem o paradigma genérico.Visual Basic .NET,C# eDelphi.Net começaram a fornecer o paradigma a partir do.NET 2.0. Muito antes de todas as linguagens mencionadas, programação genérica já havia sido implementada nadécada de 1970 em linguagens comoCLU eAda.

Mas somente o conceito detemplates do C++ que popularizou o conceito. A técnica permite que algoritmos sejam escritos independente dos tipos de dados utilizados.

Os autores do conceituado livro de1995Design Patterns[1] referem-se à programação genérica comotipos parametrizados, o que permite que um tipo possa ser definido sem especificar todos os outros tipos que ele utilizada. Os autores ainda descrevem que tal técnica é muito poderosa, especialmente quando combinada com o padrãoDelegar.

Utilização em C++:templates

[editar |editar código-fonte]

Templates são de grande utilidade paraprogramadoresC++, especialmente quando combinado comherança múltipla e sobrecarga de operadores. Abiblioteca padrão do C++ fornece várias funções úteis dentro de uma rede detemplates conectados.

Templates em C++ podem também serem usados para funções diversas à programação genérica. Um exemplo é a meta programação portemplates, um método para executaralgoritmos emtempo de compilação ao invés deexecução.

Visão geral

[editar |editar código-fonte]

Existem dois tipos detemplates. Umafunção template se comporta como uma função que pode aceitar argumentos de vários tipos diferentes. Por exemplo, abiblioteca STL do C++ contém funçõestemplatemax(x, y) que retornam oux ouy, qual for maior.max() poderia ser definida assim:

template<typenameT>Tmax(Tx,Ty){if(x<y)returny;elsereturnx;}

Essetemplate pode ser chamado para diversos tipos de dado:

cout<<max(3,7);// imprime 7 -> tipo de dado é ''int''cout<<max(3.239,5.238);// imprime 5.238 -> tipo de dado é ''float''

Ocompilador determina, ao examinar os argumentos, que a primeira chamada possui assinaturamax(int, int) e instancia uma versão da função no qual o tipoT éint. Da mesma forma, ele determina que a segunda chamada possui assinaturamax(float, float), e instancia a função parafloat.

Isso somente funciona pois os tiposint efloat definem a operação<. Para tipos de dados próprios (comoclasses), é possível usar sobrecarga de operadores para definir< para seu tipo, permitindo que ele seja usado na funçãomax(). Apesar de parecer um benefício simples, no contexto de bibliotecas como a STL isso permite que programadores tenham mais funcionabilidade para seus tipos definidos ao definir os operadores. Por exemplo, definir< permite que um tipo possa ser usado com as funções padrãosort(),stable_sort(), ebinary_search(); além de estruturas de dados comosets, entre outras.

Como exemplo contrário, o tipo padrãocomplex não define o operador<, pois não existe ordenação definida emnúmeros complexos. Logomax(x, y) não poderá ser utilizado sex ey são do tipocomplex. Da mesma forma, outrostemplates que necessitam de< não podem ser utilizados comcomplex.

Umaclasse template amplia o mesmo conceito para classes. Elas são usadas geralmente para criarcontainers genéricos. Por exemplo, a STL possui o containerlist, que representa umalista encadeada. Para criar listas encadeadas de inteiros, utiliza-selist<int>. Da mesma forma, uma lista de cadeias de texto é definida comolist<string>.list possui um conjunto de funções padrão associadas a ele, que funcionam independente do tipo utilizado para a lista.

Vantagens e desvantagens

[editar |editar código-fonte]

Algumas aplicações de templates, como a funçãomax(), eram anteriormente criadas por macros de função:

# define max(a,b) ( (a) < (b) ? (b) : (a) )

Tanto macros quantotemplates são instanciados emtempo de compilação. Macros são sempre expandidas no próprio local onde foram utilizadas;templates também podem ser expandidos no próprio local onde foram utilizadas, se o compilador considerar adequado. Logo, tanto macros de função quanto funçõestemplate não exigem mais processamento na execução.

Apesar disso,templates são considerados uma evolução sobre macros nesse propósito. Eles verificam a tipagem de dados, evitam alguns dos erros mais comuns ao se utilizar macros excessivamente e são mais robustos que macros.

Antigamente, os compiladores não tinham bom suporte paratemplates. No entanto, praticamente todos os compiladores atuais do mercado conseguem lidar comtemplates sem problemas. Ainda assim, existem duas desvantagens no uso detemplates. Primeiro, quase todos os compiladores produzem mensagens de erros emtemplates que são confusas e de pouca ajuda, o que torna o desenvolvimento mais difícil. Segundo, quanto mais tipos de dados diferentes utilizados emtemplates, geralmente mais código é gerado pelo compilador (uma versão da função ou classe para cada tipo de dado), logo, o uso indiscriminado pode levar a executáveis excessivamente grandes.

O primeiro problema mencionado será eliminado com a chegada dosConceitos novo padrão C++ (C++0x, que está previsto para 2009). Através dos conceitos será possível estabelecer um mecanismo formal para verificação de tipos e operações esperadas por um parâmetrotemplate. Com isso, mensagens de erro serão sempre claras e objetivas.

Utilização em Haskell

[editar |editar código-fonte]

EmHaskell, algumas extensões à linguagem foram desenvolvidas para a programação genérica. Além disso a própria linguagem contém alguns aspectos do paradigma incluídos.

Suporte na própria linguagem

[editar |editar código-fonte]

Dado a declaração de um tipo de dado definido pelo usuário (umaárvore binária com o tipo de dadoa para os nós):

dataBinTreea=Leafa|Node(BinTreea)a(Bintreea)deriving(Eq,Show)

Apalavra-chavederiving seguida de dois tipos de dados torna possível para o programador ter uma função definida paraBinTree de igualdade (Eq) e saída padrão (Show). Assim, o compilador Haskell pode gerar instâncias de funções particulares para qualquer tipo de dado (com algumas restrições).

ExtensãoPolyP

[editar |editar código-fonte]

PolyP foi a primeira linguagem de extensão para programação genérica para Haskell. Nelas as funções são chamadaspolytypic. A linguagem introduz uma construção especial no qual as funçõespolytypic podem ser definidas por induções estruturais sobre a estrutura dofunctor do padrão de umtipo de dado. Tipos de dado regulares (nativos) são um sub-conjunto dos tipos regulares do Haskell. Um exemplo é dado abaixo:

flatten::Regulard=>da->[a]flatten=cataflpolytypicfl::fa[a]->[a]casefofg+h->eitherflflg*h->\(x,y)->flx++fly()->\x->[]Par->\x->[x]Rec->\x->xd@g->concat.flatten.pmapflCont->\x->[]cata::Regulard=>(FunctorOfdab->b)->da->b

Utilização em OCaml

[editar |editar código-fonte]

EmOCaml, a programação genérica é implementada através depolimorfismo. Apesar da linguagem ter tipagem estática, os tipos não precisam ser declarados (a não ser no caso em que se pretende restringir a entrada ou saída de uma função), então sempre que possível os códigos escritos irão se aplicar a vários tipos de dados. Como um exemplo, a função:

 let duplicar lista =   lista @ lista

Irá duplicar a lista de entrada, ou seja, para uma lista que na sintaxe deOCaml seja escrita como[1; 2; 3], essa função irá retornar[1; 2; 3; 1; 2; 3]. Essa função tem o mesmo comportamento para lista de outros tipos de dados, comochar efloat.

Esse tipo indefinido é chamado detipo polimórfico. OCaml representa o polimorfismo por letra, de forma que a função acima irá resultar na definição:

 val duplicar : 'a list -> 'a list = <fun>

Indicando que a lista de entrada e a lista de saída são de um tipo indefinido (mas que são do mesmo tipo; caso fossem de tipos diferentes, uma seria 'a list, a outra 'b list).

Referências

  1. Erich Gamma et. al. (1994).Design Patterns. Elements of Reusable Object-Oriented Software. [S.l.]: Addison-Wesley Professional. 416 páginas.ISBN 978-0201633610 

Leitura adicional

[editar |editar código-fonte]

Ligações externas

[editar |editar código-fonte]
Obtida de "https://pt.wikipedia.org/w/index.php?title=Programação_genérica&oldid=55151474"
Categoria:
Categorias ocultas:

[8]ページ先頭

©2009-2025 Movatter.jp