Vous êtes sur la page 1sur 75

PARADIGMAS E LINGUAGENS DE PROGRAMAO - 1/75

_____________________________________________________________________________________
LINGUAGENS E TCNICAS DE PROGRAMAO
Livro texto:
GHEZZI, CarIo & JAZAYERI, Medhi - Programming Linguage
Concepts. 3nd Edition, John WiIey & Sons, New York, NY, 1998
CaptuIo 1:
As Iinguagens de programao so as ferramentas para a impIementao
de software.
Este captuIo visa mostrar as perspectivas das Iinguagens de
programao e seus usos
1.1 Processo de DesenvoIvimento de Software (PDS)
A partir da concepo de uma idia para um sistema de software at que
eIe seja impIementado e deIiberado ao cIiente, o software passa por uma
graduaI evoIuo e desenvoIvimento.
O software tem um cicIo de vida composto de vrias fases. Cada uma
resuItando no desenvoIvimento de uma parte do sistema ou aIgo
associado com o sistema, taI como um fragmento da especificao, um
teste, ou um manuaI de uso. No tradicionaI modeIo em Cascata do cicIo
de vida de software, o processo de desenvoIvimento uma combinao
seqenciaI de fases, cada uma tendo um incio e fim bem identificveis.
Cada fase pode identificar deficincias na fase anterior, o que ento deve
ser repetido para reparar os erros.
Um PDS baseado no modeIo em Cascata pode compreender as seguintes
fases:
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 2/75
_____________________________________________________________________________________
AnIise de requisitos e especificao:
identificar e documentar exatamente os requisitos do sistema.
ResuItados:
um documento que estabeIece o que o sistema deve fazer,
os manuais de usurios,
estudos de viabiIidade e custo,
requisitos de desempenho, etc.
Projeto do software:
iniciada a partir dos resuItados da fase anterior. Os
desenvoIvedores projetam o sistema de software.
ResuItados:
Documento da especificao do sistema (estabeIece o como
deve fazer e o que para a fazer seguinte)
Identificao de todos os mduIos componentes do
sistema e suas interfaces;
A metodoIogia utiIizada nessa fase pode ter um grande impacto na
quaIidade dos resuItados, e em particuIar, sobre as suas
compreensibiIidade e modificabiIidade. Pode tambm, afetar a
escoIha da Iinguagem de programao a ser usada na
impIementao do sistema.
ImpIementao:
ImpIementao do sistema (codificao, o como fazer). EscoIher
como, entre as vrias maneiras possveis, o sistema dever ser
codificado para atender as especificaes do projeto.
ResuItados:
sistema compIetamente impIementado e documentado
Verificao e vaIidao:
Verificao da quaIidade do sistema impIementado. Isso no dever
acontecer apenas neste momento (aps a impIementao), mas em
cada uma das fases anteriores. Essas verificaes so reaIizadas
respondendo periodicamente as perguntas:
"Estamos ns construindo o produto correto?"
"Estamos ns construindo corretamente o produto?"
Dois tipos especficos de verificao so feitas durante a
impIementao. So eIes:
teste da moduIarizao:
verificar se a interface de cada mduIo est de
acordo com a especificao.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 3/75
_____________________________________________________________________________________
teste da integrao:
descobrir se existe inconsistncias entre os
mduIos
Manuteno:
Necessidade:
de corrigir erros ou
de adicionar novas capacidades ou
para meIhorar as existentes ou
para ajust-Io s mudanas de ambiente operacionaI.
O trabaIho (custo) exigido por essas tarefas tipicamente, no
mnimo, iguaI ao do totaI das fases anteriores.
H, no um Iongo tempo atrs, as Iinguagens de programao eram
usadas somente na fase de impIementao, depois que estavam definidos
os aIgoritmos e as estruturas de dados.
AtuaImente, as Iinguagens de aIto nveI modernas so tambm usadas na
fase de projeto para descrever com preciso a decomposio da
apIicao inteira em mduIos, e as reIaes entre esses mduIos antes
que quaIquer impIementao se inicie.
Assim, examinaremos a seguir, o papeI da Iinguagem de programao no
PDS iIustrando as reIaes entre a Iinguagem de programao e as outras
ferramentas para o desenvoIvimento de software, tais como: Editores,
compiIadores, depuradores, carregadores, bibIioteca, etc. Como tambm,
as reIaes entre a Iinguagem de programao e os mtodos de projetos.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 4/75
_____________________________________________________________________________________
1.2 Ambientes para DesenvoIvimento de Software e Linguagens
O trabaIho em quaIquer fase do desenvoIvimento de software pode ser
auxiIiado por ferramentas computacionais.
AtuaImente, ainda, a fase meIhor apoiada por ferramentas
computacionais, a fase de codificao (impIementao), tais como:
- Editores de textos,
- CompiIadores,
- Carregadores ("Iinkers"),
- BibIiotecas, e
- Depuradores ("debuggers").
Essas ferramentas para desenvoIvimento de programas auxiIiados por
computador visam o aumenta da produtividade da programao e a
reduo das possibiIidades de se cometer erros.
InfeIizmente as ferramentas para as outras fases no esto to evoIudas
quanto para essa. Existe, por exempIo, o software VISIO que muito tiI
para documentar especificao de projeto ( um software grfico que
oferece os diagramas definidos peIas vrias metodoIogias de
desenvoIvimento de software).
Um cenrio ideaI seria aqueIe que:
- Oferecesse faciIidades para o trabaIho em equipe
- Mantivesse os requisitos como eIes foram desenvoIvidos e atuaIizados
e verificados quanto a faIta de consistncia e de aIguma informao.
- Oferecesse faciIidades para vaIidar requisitos contra as expectativas
do cIiente. Ferramentas para simuIar ou animar os requisitos.
- AuxiIiar na manuteno atuaIizada dos documentos
As ferramentas CASE (Computer Aided Software Engineering) se
aproximam desse ideaI.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 5/75
_____________________________________________________________________________________
1.3 Mtodos de Projeto de Software e Linguagens
Um mtodo de projeto um guia para a produo de projeto.
ExempIos:
Projeto estruturado
Projeto "top down"
Projeto orientado a objetos
Cada um sugerindo um meio diferente de abordar o processo de projeto e
produzir diferentes tipos de projetos para um mesmo conjunto de
requisitos.
ExempIo:
O mtodo de projeto "top down" orienta os desenvoIvedores a
decomporem o sistema em mduIos que reaIizam operaes abstratas
(procedimentos) que podem ser ativadas por outros mduIos (outros
procedimentos). Um mtodo orientado a objetos j orienta a
decomposio do sistema em tipos abstratos de dados.
A reIao entre mtodos de projeto e Iinguagens de programao muito
importante.
AIgumas Iinguagens provem meIhor suporte para um determinado
mtodo de projeto do que outras.
Por exempIo: A Iinguagem FORTRAN no foi projetada para oferecer
suporte a nenhum mtodo especfico de projeto. A preocupao foi
apenas de oferecer uma ferramenta para programao de soIues de
probIemas de cIcuIos cientficos. IIustrando, a ausncia de uma
estrutura de controIe de aIto nveI adequada (taI como recursividade e
Iaos do tipo whiIe), tornava difciI a sistematizao de projeto de
aIgoritmos no modo "top down". PeIo contrrio a Iinguagem PascaI foi
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 6/75
_____________________________________________________________________________________
projetada com o objetivo expIicito de oferecer suporte ao
desenvoIvimento de programas estruturado e "top down".
Ambas as Iinguagens, na faIta de construes para definir mduIos
outros seno rotinas, torna-as difceis para decompor o sistema de
software em tipos abstratos de dados.
Para entender meIhor a reIao entre Iinguagens de programao e um
mtodo de projeto, verificar quaI linguagem de programao pode
forar um certo estiIo de programao, frequentemente chamada de
paradigma de programao.
ExempIos, As Iinguagens SmaItaIk e EiffeI so orientadas a objetos. EIas
foram o desenvoIvimento de programas baseados em cIasses de objetos
como unidades de moduIarizao. AnaIogamente, as Iinguagens
FORTRAN e PascaI, como originaImente definidas, so Iinguagens
procedurais.
As linguagens que foram um especfico paradigma de programao
podem ser denominadas de orientadas a paradigmas.
De um modo geraI no existe uma reIao um para um entre paradigmas e
Iinguagens de programao.
AIgumas Iinguagens so neutras a paradigmas. EIas oferecem suporte a
diferentes paradigmas. ExempIo, a Iinguagem C++, oferece as faciIidades
para o desenvoIvimento de programas proceduraImente e orientado a
objetos.
A tabeIa a seguir apresenta as Iinguagens de programao mais
proeminentes.
Se um mtodo de projeto e o paradigma da Iinguagem forem os mesmos,
ou a Iinguagem neutra a paradigma, ento as abstraes de projeto
podem ser diretamente mapeadas em componentes de programa.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 7/75
_____________________________________________________________________________________
Caso contrrio, se eIes no esto afinados, o esforo de programao
grande. Esforo esse que cresce mais quanto mais as diferenas entre os
paradigmas dos mtodos e Iinguagens forem maiores.
IdeaImente, o mtodo de projeto e o paradigma suportado peIa Iinguagem
devero ser os mesmos. Assim, existir uma continuidade naturaI entre a
fase de projeto e a fase de impIementao, do cicIo de vida do software.
De fato, a maioria das Iinguagens modernas de programao em aIto
nveI, podem mesmo serem usadas como notaes de projeto. ExempIos.
As Iinguagens Ada e EiffeI podem serem usadas para documentar os
mduIos dos sistemas, mesmo nos estgios onde os detaIhes de
impIementao esto para serem definidos.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 8/75
_____________________________________________________________________________________
PARADIMAS DE LINGUAGENS
Sumrio das Iinguagens mais promissoras, com nfase sobre os estiIos
de decomposio de programa que eIas promovem. Essa discusso
prov um mapa sobre os principais conceitos que sero estudados
extensivamente neste Iivro.
Programao proceduraI: este um estiIo de programao convencionaI,
onde os programas so decompostos em passos de computao para a
execuo de operaes compIexas. Rotinas so usadas como unidades
de moduIarizao para definir tais passos de computao.
Programao funcionaI: o estiIo funcionaI de programao est enraizado
na teoria das funes matemticas. EIa enfatiza a computao de vaIores
peIo uso de expresses e funes. As funes so os bIocos de
construes primrios do programa; eIes podem ser passados Iivremente
como parmetros e podem ser construdos e retornados como
parmetros resuItados para outras funes.
Programao tipo abstrato de dados: a programao tipo abstrato de
dados reconhece os tipos abstratos de dados com unidade de
moduIaridade de programa. CLU foi a primeira Iinguagem projetada para
sustentar esse paradigma.
Programao baseada em mduIos: a programao baseada em mduIos
enfatiza as unidades de moduIarizao que sejam o agrupamento de
entidades tais como variveis, procedimentos, funes ou tipos. MduIos
podem ser usados para especificar quais de seus servios so
exportados para o mundo exterior. Em princpio, quaIquer tipo de servio
pode ser provido peIo mduIo, no apenas a habiIidade para gerar e usar
tipos abstratos. Ada e ModuIa-2 so aIgumas das Iinguagens que
suportam esse estiIo de programao.
Programao orientada a objetos: esse estiIo de programao enfatiza a
definio de cIasses de objetos. Instncias de cIasses so criadas peIo
programa quando necessrias durante a execuo. Esse estiIo est
baseado na definio de hierarquias de cIasses e seIeo em tempo de
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 9/75
_____________________________________________________________________________________
execuo de unidade a executar. SmaIItaIk, EiffeI, e Java so Iinguagens
representativas dessa cIasse. C++ e Ada tambm suportam o paradigma.
Programao genrica: este estiIo enfatiza a definio de mduIos
genricos que podem ser instanciados, ou em tempo de compiIao ou
de execuo, para criar entidades - estruturas de dados, funes e
procedimentos - necessrias para formar o programa. Essa abordagem
para programao encoraja o desenvoIvimento de abstraes genricas
de aIto nveI, como unidades de moduIaridade. O paradigma programao
genrica, no existe sozinho. EIe pode existir juntamente com
programao orientada a objeto, como EiffeI, ou com programao
funcionaI, como em ML. EIe tambm existe em Iinguagens que provem
mais do que um paradigma, tais como C++ e Ada.
Programao decIarativa: neste estiIo de programao, a nfase nas
descries decIarativas do probIema, em vez da decomposio do
probIema em impIementaes aIgortmicas. Tais programas so fechados
para a especificao em vez da impIementao tradicionaI. Linguagens
Igicas, como PROLOG, e Iinguagens baseadas em regras, como a OPS5
e CLIPS, so Iinguagens representativas dessa cIasse.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 10/75
_____________________________________________________________________________________
1.4 Arquitetura de Computadores e Linguagens
Os mtodos de projeto infIuenciam as Iinguagens de programao, no
sentido de estabeIecerem requisitos que as Iinguagens devem apresentar,
a fim de meIhor se adequarem ao desenvoIvimento de software.
J a arquitetura de computador tem exercido infIuncia em direo
oposta; no sentido de restringir os projetos de Iinguagens para poderem
ser impIementados eficientemente nas mquinas correntes.
Pode-se dizer que as Iinguagens tm sido restringidas peIas idias de von
Neumann, porque a maioria dos atuais computadores simiIar
arquitetura originaI deste.
Linguagens de programao convencionais podem ser vistas como
abstraes de uma arquitetura von Neumann subjacente.
Uma abstrao um modeIo que ressaIta os aspectos reIevantes de um
fenmeno e ignoram os seus detaIhes irreIevantes.
As Iinguagens convencionais retm como seu modeIo computacionaI a
arquitetura von Neumann subjacente, mas abstrai-se dos detaIhes dos
passos individuais de execuo. TaI modeIo consiste da execuo
sequenciaI de instrues, passo a passo, com mudanas de estado de
uma computao peIa modificao do repositrio de vaIores. A execuo
sequenciaI das instrues de uma Iinguagem refIete a busca e execuo
sequenciaI das instrues da mquina reaIizadas peIo hardware. As
variveis das Iinguagens convencionais que podem ser modificadas
peIos comandos de atribuio refIetem o comportamento das cIuIas de
memria da arquitetura do computador.
Linguagens convencionais baseadas no modeIo de von Neumann so
denominadas de Iinguagens imperativas.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 11/75
_____________________________________________________________________________________
EIas so tambm chamadas de linguagens baseadas em estado,
linguagens baseadas em operaes, ou simpIesmente linguagens von
Neumann.
Historicamente, as Iinguagens imperativas tiveram um crescente
desenvoIvimento em nveis de abstraes.
As primeiras Iinguagens, as Iinguagens assembIy, foram inventadas para
prover uma forma primitiva de abstrao, taI como a habiIidade para
nomear simboIicamente, operaes e endereos de memria.
Assim, em vez de escrever uma instruo de incrementar o contedo de
uma posio de memria na forma de uma cadeia de bits, possveI
escrev-Ia de uma forma parecida a:
INC Datum
Muito tipo de abstraes foi posteriormente inventado peIos projetistas
de Iinguagens, tais como: procedimentos, funes, tipos de dados,
manipuIadores de exceo, cIasses e caractersticas de concorrncia.
Como sugerido peIa figura abaixo, os desenvoIvedores de Iinguagens
tentaram eIevar o nveI da Iinguagem de programao, para torn-Ia mais
fciI de ser usada peIos humanos, mas ainda baseado nos conceitos
daqueIas Iinguagens baseadas no modeIo von Neumann.
AIgumas Iinguagens, a saber, Iinguagens funcionais e Igicas,
abandonaram o modeIo computacionaI von Neumann. EIas se basearam
nos fundamentos da matemtica em vez da tecnoIogia do hardware
subjacente. Os fundamentos conceituais dessas Iinguagens, entretanto,
eram confIitantes com os objetivos da eficincia da impIementao. Isso
no era esperado, desde que tais fundamentos foram desenvoIvidos para
execuo em computadores von Neumann. Para meIhorar a eficincia,
foram introduzidas aIgumas caractersticas imperativas nessas
Iinguagens no convencionais existentes.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 12/75
_____________________________________________________________________________________
Na anIise das Iinguagens, percebe-se dois paradigmas: o paradigma que
caracteriza o modeIo computacionaI, como discutido nesta seo, e o
paradigma que caracteriza os princpios da organizao de programa,
como discutido na seo anterior.
Os paradigmas imperativos, funcionais e Igicos, refIetem os diferentes
modeIos computacionais subjacentes da Iinguagem. Paradigmas
diferentes de organizao de programas podem ser apIicados, no mnimo
a princpio, a diferentes modeIos computacionais.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 13/75
_____________________________________________________________________________________
1.5 QuaIidades de Linguagens de Programao
Como se pode definir as quaIidades que um Iinguagem de programao
deve exibir?
A fim de entender, dever se ter em mente que uma Iinguagem de
programao uma ferramenta para o desenvoIvimento de software.
Assim, a quaIidade da Iinguagem deve estar reIacionada com a quaIidade
do software.
Software deve ser confiveI:
Usurios devem ser capazes de confiar no software: a
probabiIidade de faIhas devida a erros deve ser baixa. Se possveI o
sistema dever ser toIerante a faIhas.
Software deve ser manutenveI:
Software existente deve ser modificado para atender os novos
requisitos: por causa do aIto custo em desenvoIver um outro que o
substitua e, tambm, porque muito difciI Ievantar novamente
aqueIes primeiros requisitos.
Software deve ser executado com eficincia:
Esta quaIidade sempre objetivo de quaIquer sistema de software.
Esse objetivo sempre afeta tanto a Iinguagem de programao
(caracterstica que podem ser impIementadas eficientemente nas
presentes arquiteturas), como a escoIha de aIgoritmo a ser
utiIizado. Embora o custo do hardware continue a cair mesmo que
seu desempenho continue a crescer (processadores e memrias
mais rpidos), a necessidade peIa execuo eficiente permanece,
porque os computadores esto hoje sendo usados em apIicaes
cada vez mais exigentes.
Esses requisitos podem ser atendidos peIa adoo de mtodos e
ferramentas adequadas disponveis no ambiente para desenvoIvimento
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 14/75
_____________________________________________________________________________________
de software, aIm de certas caractersticas da Iinguagem de programao
que sero a seguir discutidas.
1.5.1 Linguagens e ConfiabiIidade
A confiabiIidade obtida peIas quaIidades da Iinguagem de programao.
A maioria das quaIidades, infeIizmente, baseada na evoIuo subjetiva e
so difceis de estabeIec-Ias com preciso. AIm disso, eIas no so
conceitos independentes: em aIguns casos eIas se sobrepem; em outros
eIas podem ser confIitantes.
FaciIidade de escrita:
PossibiIitar a escrita de programa de forma naturaI ao probIema. Os
programadores no devem se distrair com detaIhes e truques da
Iinguagem de sua atividade Importante de soIucionar o probIema.
Apesar desse requisito ser subjetivo, h de se concordar que
mais fciI escrever um programa em uma Iinguagem de aIto nveI
do que em "assembIy".
LegibiIidade:
Dever ser possveI seguir a Igica do programa e descobrir a
presena de erros apenas examinando o programa. Esse requisito
tambm subjetivo; depende de gosto e estiIo. O oferecimento de
construes especficas para novas operaes (via rotinas) e novos
tipos de dados, mantidos separados do resto do programa, meIhora
em muito a IegibiIidade.
SimpIicidade:
Uma Iinguagem simpIes fciI de ser dominada e permite que os
aIgoritmos sejam expressos com tranquiIidade. Isso faz com que o
programador sinta seguro quanto a correo do programa. A
simpIicidade pode ser obtida peIa minimizao das caractersticas
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 15/75
_____________________________________________________________________________________
da Iinguagem, apesar de que isso reduz o poder da Iinguagem. Por
exempIo: PascaI mais simpIes, porm menos potente, do que C+
+.
Segurana:
A Iinguagem no dever apresentar caractersticas que a torne
possveI de se escrever maus programas. Por exempIo, programas
que no contenham comandos "go to" ou ponteiros a variveis
eIiminam duas grandes fontes de perigo. Tais caractersticas
podem causar erros sutis que se manisfestam de maneira no
esperada e que so difceis de serem descobertos. InfeIizmente,
entretanto, caractersticas que podem diminuir em muito o
potenciaI da Iinguagem.
Robustez:
a caractersticas que a Iinguagem apresenta para tratar eventos
indesejveis (estouro aritmtico, entrada invIida, etc.). Isto ,
eventos que podem ser pegos respondidos adequadamente peIo
programa, quando de suas ocorrncias. Desse modo, o
comportamento do sistema torna-se previsveI mesmo em
situaes anmaIas.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 16/75
_____________________________________________________________________________________
1.5.2 Linguagens e ManutibiIidade
As Iinguagens de programao devero permitir que os programas
possam ser faciImente modificados. LegibiIidade e simpIicidade so
obviamente importantes nesse contexto tambm. As duas caractersticas
principais que as Iinguagens devem apresentar para apoiar as
modificaes so: a fatorao e a IocaIidade.
Fatorao:
A Iinguagem dever permitir que os programadores fatorem
caractersticas reIacionadas em uma nica unidade. Por exempIo,
se um conjunto de comandos que reaIiza uma determinada tarefa
repetido em vrios pontos do programa, dever ser possveI fator-
Io em uma rotina e substituir em cada um desses pontos, peIa sua
chamada. Isso torna o programa mais IegveI (especiaImente se
forem atribudos nomes significativos s rotinas) e mais fciI de
modific-Io (a modificao estaria IocaIizada no corpo da rotina).
Um outro exempIo, vrias Iinguagens permitem que sejam
atribudos nomes simbIicos a constantes. EscoIhendo-se nomes
apropriados, promove-se a IegibiIidade do programa. AIm disso,
em uma futura necessidade de se aIterar esse vaIor, basta modificar
somente a definio da constante, em vez de em cada Iugar do
programa em que eIe aparece.
LocaIidade:
O objetivo fazer com que as caractersticas da Iinguagem fiquem
restritas a uma pequena parte do programa. Por exempIo, na
programao de um tipo abstrato de dados, a mudana para uma
estrutura de dados dentro de uma cIasse garantida no afetar o
resto do programa, desde que as operaes que a manipuIa sejam
invocadas da mesma maneira.
Os conceitos de fatorao e IocaIidade esto fortemente reIacionados. De
fato a fatorao promove a IocaIidade naqueIas modificaes que se
apIicam somente nas partes fatoradas.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 17/75
_____________________________________________________________________________________
1.5.3 Linguagens e Eficincia
A necessidade peIa eficincia tem direcionado o projeto de Iinguagem
desde o incio da computao. Muitas Iinguagens tiveram como meta de
projeto a eficincia. Por exempIo, a FORTRAN originaImente foi projetada
para uma mquina especfica, o IBM 704. A arquitetura dessa mquina foi
a causa das muita restries da FORTRAN originaI, tais como: o nmero
de dimenses de uma matriz ou a forma de expresses usada como
ndice de matrizes.
A questo de eficincia, entretanto, foi aIterada consideraveImente. A
eficincia no mais medida somente peIa veIocidade e tempo de
execuo. Os esforos exigidos para produzir um programa, ou para
executar a sua manuteno, podem tambm ser vistos como
componentes da medida de eficincia.
Em aIguns casos pode-se estar mais preocupado com a produtividade do
processo de desenvoIvimento de software, do que com o desempenho do
produto resuItante. AIm disso, a preocupao da produtividade pode
estender-se peIas vrias fases de desenvoIvimento, em vez de em apenas
uma.
Isto , poder-se-ia estar interessado em desenvoIver o software em
componentes que seja reusveis em futuras apIicaes. Poderia-se estar
interessado no desenvoIvimento de software porttiI, para poder
disponibiIiz-Io rapidamente aos usurios que trabaIham com diferentes
pIataformas, mesmo que em aIgumas fique prejudicado o desempenho.
Eficincia freqentemente uma quaIidade combinada com a Iinguagem e
sua impIementao. A Iinguagem adversamente afeta a eficincia se eIa
desabiIitar o compiIador de que certas otimizaes sejam apIicadas. A
impIementao adversamente afeta a eficincia se eIa no se preocupar
com o uso do espao de memria e meIhorar a veIocidade de execuo.
Por exempIo, em geraI, um comando como
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 18/75
_____________________________________________________________________________________
X = fun(y) + z + fun(y);
escrito em C no pode ser otimizado para
x = 2 * fun(y) + z;
que poderia presumiveImente ser mais eficiente desde que eIe chamaria a
funo fun apenas uma vez. A caracterstica da Iinguagem que permite as
funes a modificarem variveis gIobais (como z, no exempIo), desabiIita
a otimizao.
Um outro exempIo, a Iinguagem pode afetar a impIementao da
eficincia ao permitir as computaes concorrentes. Uma impIementao
adversamente afeta a eficincia se, digamos, eIa no reusar o espao de
memria aps a Iiberao peIo programa. FinaImente, uma Iinguagem que
permite a visibiIidade do tamanho das paIavras da memria ou o acesso
ao, digamos, modo em que os nmeros em ponto fIutuante so
armazenados, poderia-se impedir a portabiIidade e assim aumentar o
esforo de transportar o software para diferentes paradigmas.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 19/75
_____________________________________________________________________________________
1.6 Uma Breve Perspectiva Histrica
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 20/75
_____________________________________________________________________________________
1.7 Uma viso dos Principais Conceitos de Linguagens de
Programao
Objetivos:
Aprender os conceitos e a estrutura das Iinguagens de
programao
Interesse nos tipos de coisas que se pode fazer com as
Iinguagens de programao
Quais so as capacidades inerentes e as fraquezas das
diferentes Iinguagens de programao
O que, fundamentaImente, faz uma Iinguagem diferente de uma
outra
O que torna uma Iinguagem semeIhante a uma outra a despeito
das aparncias serem diferentes
1.7.1 Um Programa SimpIes
O programa abaixo parte de um programa que manipuIa uma Iista
teIefnica.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 21/75
_____________________________________________________________________________________
# incIude <iostream.h>
# incIude "phone.h"
extern phone_Iist pb;
void insert();
number Iookup();
main()
{
int request;
cout << "Enter 1 to insert, 2 to Iookup:" << endI;
cin >> request;
if (request == 1)
insert();
eIse if (request == 2)
cout << Iookup();
eIse {
cout << "invaIid request." << endI;
exit(1);
}
}
Dividiu-se o programa em trs partes:
Primeira parte consiste de dois comandos "# incIude",
Segunda parte consiste de trs comandos de decIarao;
Terceira parte o cdigo da funo chamada main, que
supostamente "faz o trabaIho"
Pode-se dizer que:
a primeira parte define a organizao do programa: nesse caso,
em termos de vrios arquivos que constituem o programa.
Parte 1: organizao
Parte 2: ambiente
Parte 3:
C
O
M
P
U
T
A

E
S
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 22/75
_____________________________________________________________________________________
A segunda parte define o ambiente em que o programa
trabalhar peIa decIarao de aIgumas entidades que sero
usadas peIo programa neste arquivo: essas decIaraes podem
importar entidades definidas em outros arquivos. Por exempIo:
na Iinha
extern phone_Iist pb;
indica que a variveI pb do tipo phone_Iist est sendo usada
nesse programa, porm, foi criada em um outro Iugar.
A terceira parte trata da real computao. Essa a parte
associada ao programa. EIa contm os dados e os aIgoritmos do
programa. AIguns dos dados e processamento nessa parte pode
usar entidades definidas no ambiente estabeIecido na segunda
parte. Por exempIo, as rotinas insert e Iookup so usados no
programa main. Um outro exempIo o comando de sada:
cout << "Enter 1 to insert, 2 to Iookup:" << endI;
que usa cout, o dispositivo padro de sada definido em iostream.h
da bibIioteca de entrada/sada, expIicitada a sua incIuso na
primeira Iinha do programa.
Mesmo em programa simpIes, percebe-se que a Iinguagem de
programao prov diferentes tipos de faciIidades. A seguir se oIhar
com mais detaIhes aIgumas das maiores faciIidades e questes
envoIvidas em seus projetos.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 23/75
_____________________________________________________________________________________
1.7.2 Sintaxe e Semntica
QuaIquer Iinguagem de programao especifica um conjunto de regras
para formar programas que sejam vIidos naqueIa Iinguagem.
ExempIos (baseado no programa da seo anterior):
- Uso de ponto e vrguIa (;)
- Uso de caracteres especiais, tais como { e }
- Todo comando if seguido de uma expresso entre parntesis.
- Etc.
As regras de sintaxe de uma Iinguagem estabeIecem como formar
expresses, comandos, e programas.
As regras de semntica da Iinguagem dizem como construir expresses,
comandos e programas significativos.
Por exempIo:
- EIas podem dizer que antes de se usar a variveI request no
comando if, do programa da seo anterior, deve-se decIar-Ia.
- EIas podem dizer que a decIarao de uma variveI faz com que
seja reservado um espao para eIa.
- Por outro Iado, o extern indica que a reserva de espao est feita
em aIgum outro mduIo, mas no neste.
Caracteres formam os menores bIocos sintticos de construo. Cada
programa formado coIocando-se caracteres juntos em aIguma ordem
bem definida.
As regras sintticas para a formao de programas so bastante diretas.
Os bIocos e regras de construo semntica, por outro Iado, so
compIicados. ReaImente as grandes diferenas entre a maioria das
Iinguagens se IocaIizam em como as diferentes semnticas so
fundamentadas.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 24/75
_____________________________________________________________________________________
1.7.3 EIementos Semnticos
EIementos bsicos do ponto de visto do projetista de Iinguagens. Se
desejar ver que escoIhas podem estar disponveis ao projetista de
Iinguagens e como a sua deciso afeta o programador.
1.7.3.1 Variveis
Uma variveI o conceito mais difundido nas tradicionais Iinguagens de
programao.
Uma variveI corresponde a uma regio da memria que usada para
manter vaIores que so manipuIados peIo programa.
A referncia feita peIo seu nome.
As regras de sintaxe especificam como eIa pode ser nomeada; por
exempIo, eIa pode consistir de caracteres aIfabticos.
Mas existem muitas questes semnticas associadas com as variveis.
Uma decIarao introduz uma variveI dando a eIa um nome e
estabeIecendo aIgumas propriedades semnticas. Entre eIas as mais
importantes so:
Escopo:
Que parte do programa tem acesso variveI? GeraImente a
IocaIizao da decIarao da variveI determina o incio de seu
escopo.
Tipo:
Que tipos de vaIores podem ser armazenados na variveI, e que
operaes podem ser feitas sobre eIa? GeraImente existe um
nmero de tipos fundamentais definidos peIa Iinguagem e existe
aIguma faciIidade para o usurio definir novos tipos.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 25/75
_____________________________________________________________________________________
As Iinguagens diferem tanto em termos de tipos fundamentais,
como nas faciIidades para a definio de novos tipos.
Os tipos fundamentais de Iinguagens tradicionais so ditados peIos
tipos que so sustentados peIo hardware. Tipicamente, como em
C++, os tipos fundamentais so: inteiro, reaI, e caractere. A PascaI
possui tambm o tipo booIeano.
Tempo de vida:
Quando uma variveI criada e quando eIa descartada?. A
questo , quando reservada uma rea da memria, ou aIocada,
para a variveI?. A memria para a variveI pode ser reservada
antes de se iniciar o programa ou quando a unidade em que eIa
est decIarada, introduzida na memria, ou poderia existir um
comando que expIicitamente requisitaria a aIocao de memria
para a variveI.
Em C++ existem todos esses tipos de variveis:
- Variveis estticas vivem durante toda a execuo do programa;
- Variveis automticas so aIocadas quando a unidade em que
eIas esto decIaradas introduzida e deaIocadas quando a
unidade termina; e
- Variveis que podem ser criadas e destrudas expIicitamente
peIo programador usando operadores como ne e delete.
Essas questes sero discutidas no captuIo 2.
1.7.3.1 VaIores e Referncias
Uma questo simpIes:
quaI o vaIor associado a uma variveI?
Existem duas respostas. Considere o comando de atribuio da forma:
X = y;
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 26/75
_____________________________________________________________________________________
O valor referido peIo nome y de um tipo diferente do referido peIo nome
x.
Do Iado direito do comando de atribuio, necessrio o contedo de
memria, e do Iado esquerdo, necessrio o endereo de, ou uma
refer!ncia para, uma regio da memria.
Para se fazer referncia a ambos esses tipos de vaIores, define-se duas
noes:
Um l"valor um vaIor que denota uma Iocao de memria e
portanto pode ser usado do Iado esquerdo de um comando de
atribuio;
Um r"valor um vaIor que denota o contedo de uma Iocao de
memria, isto , um vaIor que pode ser usado do Iado esquerdo
de um comando de atribuio.
Assim, no comando de atribuio acima, preciso do r-vaIor para y e do I-
vaIor para x.
Na maioria das Iinguagens a converso de I-vaIor para r-vaIor so
impIcitas. AIgumas Iinguagens, tais como C++, tambm tm operadores
expIcitos para as converses quando necessrios. Por exempIo, o
operador & em C++ o operador endereo de, o quaI obtm o I-vaIor de
seu operando. Portanto,
X = &y;
Armazena o endereo de y em x. Esse operador necessrio porque a
regra "defauIt" (na faIta de), que seja usado o r-vaIor para o Iado direito.
1.7.3.3. Expresses
Expresses so construes sintticas que permitem que os
programadores combinem vaIores e operaes para computarem novos
vaIores. A Iinguagem especifica bem tanto as regras sintticas como as
semnticas, para a construo de expresses.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 27/75
_____________________________________________________________________________________
Dependendo da Iinguagem, uma expresso pode ser restrita a produzir
um vaIor de somente um tipo ou de diferentes tipos em tempos
diferentes. DaqueIe programa do item 1.7.1, tem-se:
request == 1 uma expresso do tipo
booIeano
"invaIid request\n" uma expresso do tipo
conjunto de caracteres
Em C ou C++, um comando de atribuio produz um vaIor e, portanto,
tambm uma expresso e pode ser usada com um eIemento de uma outra
expresso. ExempIo:
a = b = c + d;
J em PascaI isso no permitido isso.
Perante isso pode-se ver que a ordem em que as operaes de uma
expresso so executadas, pode infIuenciar o vaIor da expresso.
AIgumas Iinguagens especificam a ordem restritamente. Por exempIo, da
direita para a esquerda ou baseada na precedncia das operaes. Outras
Iinguagens deixam para o impIementador decidir a ordem. Deixar essas
questes para a impIementao requer do programador um cuidado
maior, porque um programa que esteja produzindo resuItados corretos,
pode no necessariamente continuar assim, quando compiIado por um
diferente compiIador.
A maior questo entorno de expresses a permisso de diferentes tipos
de expresses. Especificamente, a Iinguagem suporta expresses que
produzam somente r-vaIores, ou podem as expresses resuItar tambm
em I-vaIores (ou mesmo funes)? No captuIo 4, aIgo mais ser discutido
em Iinguagens convencionais. No captuIo 7 sero tratadas as Iinguagens
funcionais, as quais podem tambm ser chamadas de orientada a
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 28/75
_____________________________________________________________________________________
expresso, pois as expresses se constituem no papeI centraI de tais
Iinguagens.
1.7.4 Organizao de Programa
Programas que impIementam sistemas de software e apIicaes
consistem de miIhares, centenas de ou mesmo miIhes de Iinhas de
cdigo. Essas Iinhas ento impIementam um particuIar projeto que
consiste de muitos componentes ou mduIos reIacionados.
Uma Iinguagem de programao pode prover mecanismos para ajudar o
programador na gerncia dessa compIexidade.
A um certo nveI, a estrutura do projeto pode ser refIetida na estrutura do
programa. Isso sempre acontecer quando o mtodo de desenvoIvimento
casar com o paradigma da Iinguagem.
Entretanto, normaImente, as faciIidades oferecidas peIa Iinguagem para a
organizao de programas so dependentes dos objetivos da Iinguagem.
Assim, se o objetivo de uma Iinguagem para a escrita de programas
pequenos ("programming in the smaII" - programao pequena), por
exempIo, para escrever aIgoritmos matemticos para serem executados
em caIcuIadoras, tais faciIidades podem ser poucas.
Por outro Iado, se a Iinguagem foi projetada para ser usada para o
desenvoIvimento de programas muito grandes ("programming in the
Iarge" - programao grande), as faciIidades so indispensveis,
principaImente aqueIas conceituadas nos mtodos de projeto.
ExempIos:
- faciIidade para programao estruturada
- faciIidade para programao moduIar
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 29/75
_____________________________________________________________________________________
A maioria das linguagens modernas suportam no mnimo a noo de um
mduIo para quebrar um programa grande em vrias partes
independentes. EIas se diferem no modo em que os diferentes mduIos
acessam as entidades internas dos outros mduIos e os tipos de
entidades que podem ser importados dos outros mduIos. EIas tambm
podem se diferir no tratamento dos mduIos. Por exempIo, se eIes podem
ser instanciados ou se eIes podem ser compiIados separadamente.
1.7.5 Dados e AIgoritmos de Programa
Linguagens de programao provem faciIidades para a impIementao
de aIgoritmos.
Os aIgoritmos operam sobre aIguns dados para produzir aIguns
resuItados. Nesse ponto que as Iinguagens se diferem.
A maioria das Iinguagens, incIuindo a C++, so imperativas. O programa
principaI consiste de aIgumas decIaraes de variveis e aIguns
comandos que operam sobre eIas. Existe tambm comandos de entrada e
sada (E/S). A execuo de comandos de E/S modificam os vaIores
armazenados na memria da mquina subjacente, isto , modificam o
estado da computao.
1.7.5.1. Dados
Existem muitas questes envoIvendo a idias de dados. Por exempIo,
Int request;
decIarao da variveI request daqueIe programa de Iista teIefnica.
EIa tem um tipo, que no caso int. Pergunta-se:
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 30/75
_____________________________________________________________________________________
- Que tipos de vaIores eIa pode manter?
- Onde eIa pode ser decIarada? Somente no incio do programa ou em
quaIquer Iugar?
- Onde eIa pode ser criada?
- EIa tem um vaIor iniciaI?
- EIa conhecida por outros procedimentos ou mduIos?
- Como pode variveis serem exportadas para outras variveis?
Dado aIguns itens de dados eIementares taI como as variveis, existem
mecanismos que permitem combin-Ias. Por exempIo, em C++ prov
conjuntos ("arrays") e registro ("struct") para construir estruturas de
dados agregados. Quais so os tipos de componentes que uma estrutura
de dados pode conter?. Pode uma funo ter um eIemento de um
registro?. Em PascaI a resposta no, e em C++ a resposta sim.
Mecanismos sofisticados para a definio de dados permitem que os
programadores moduIarizem os dados nos programas, semeIhantemente
ao modo em que os aIgoritmos so moduIarizados. Por exempIo, naqueIe
programa de Iista teIefnica, usou-se o arquivo phone.h para armazenar
as definies bsicas reIativas aos dados de teIefone que so usados
peIos outros mduIos. As Iinguagens de programao orientadas a
objetos permitem a definio e o refinamento de definio de itens
compIexos. O captuIo 3, trata os tipos de dados e o captuIo 6, discute a
programao orientada a objetos.
1.7.5.2 Computaes
Viu-se expresses como um mecanismo para computar vaIores.
Expresses so geraImente montadas a partir de vaIores eIementares e
tem uma estrutura simpIes.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 31/75
_____________________________________________________________________________________
Estruturas de controIe so usadas para as computaes mais compIexas.
Por exempIo, o mecanismo taI como os vrios tipos de cicIos providos
para a execuo repetida de uma sequncia de comandos. Chamadas de
rotinas permitem a execuo de uma computao definida em um outro
Iugar do programa.
A combinao de expresses, comandos, estruturas de controIe, e
chamadas de rotinas em C++ e outras Iinguagens convencionais,
permitem que os programadores escrevam aIgoritmos usando o
paradigma imperativo de computao.
1.7.5 Ambiente Externo
Programas so raramente impIementaes auto contidas de aIgoritmos.
EIes necessitam de dados e os resuItados que eIes esperam computar
so normaImente trocados com o ambiente externo.
No exempIo do programa da Iista teIefnica, o usurio soIicitado a tecIar
um pedido (request). Em outros casos, um programa poderia necessitar
de uma base de dados externa, ou de um monitor de dispositivo para
adquirir o vaIor de um particuIar sinaI.
Como fazer os programas se comunicarem com o ambiente externo?.
AIgumas Iinguagens definem construes especficas para entrada/sada.
Outras Iinguagens tais como C/C++, no provem tais faciIidades. Em vez
disso, eIas confiam nas bibIiotecas externas que oferecem essa
faciIidade. Por exempIo, o iostream o arquivo cabeaIho que torna a
bibIioteca de entrada/sada acessveI peIo programa.
A vantagem de faciIidades suportadas peIa Iinguagem para comunicao
com o meio externo, que o programador tem um modeIo compIeto do
ambiente e o compiIador pode fazer a verificao de consistncia.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 32/75
_____________________________________________________________________________________
O suporte dessa faciIidade por meio de uma bibIioteca, torna a Iinguagem
mais simpIes e permite maior fIexibiIidade. Por exempIo, diferentes
bibIiotecas podem ser adicionadas como novos dispositivos.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 33/75
_____________________________________________________________________________________
CAPTULO 2: SINTAXE E SEMNTICA
Uma Iinguagem de programao uma notao formaI para descrever
aIgoritmos para a execuo em computador.
2.1 Definio de Linguagem
QuaIquer Iinguagem de programao deve estar definida com suficientes
detaIhes para permitir que as seguintes questes sejam resoIvidas:
Como saber se um programa est bem formuIado?
Como saber o que eIe faz?
Como um compiIador sabe transIadar o programa?
Mais especificamente, uma definio de Iinguagem dever permitir que
uma pessoa ou um programa de computador determine:
(1) se o sentido do programa de fato vIido
(2) se o programa vIido, se o seu significado ou efeito .
Em geraI, dois aspectos da Iinguagem (naturaI ou de programao)
devem ser definidos: sintaxe e semntica.
2.1.1. Sintaxe
Sintaxe um conjunto de regras que define a forma de uma Iinguagem.
EIa define como as sentenas podem ser formadas como seqncias de
eIementos bsicos chamados palavras.
A sintaxe no diz nada a respeito de significado da sentena.
A sintaxe de uma Iinguagem definida por dois conjuntos de regras:
Regras Ixicas e
Regras sintticas.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 34/75
_____________________________________________________________________________________
As regras Ixicas especificam o conjunto de caracteres que constituem o
aIfabeto da Iinguagem e como tais caracteres podem ser combinadas
para formarem paIavras vIidas.
A distino entre regras sintticas e Ixicas arbitrria. Ambas
contribuem para aparncia "externa" da Iinguagem. Assim, usar-se- os
termos sintaxe e regras sintticas no sentido ampIo, que incIuem os
componentes Ixicos, tambm.
Como se define a sintaxe de uma Iinguagem?
A Iinguagem FORTRAN foi definida peIo estabeIecimento de aIgumas
regras em ingIs.
ALGOL 60 foi definida como uma gramtica Iivre de contexto
desenvoIvida por John Backus.
Esse mtodo tornou-se conhecido como BNF ou Backus-Naur Form
(Peter Naur foi o editor do reIatrio ALGOL 60).
A BNF prov uma definio cIara e compacta para a sintaxe de Iinguagens
de programao.
Segue uma iIustrao da verso estendida da BNF (EBNF).
EBNF - Extended Backus-Naur Form
EBNF uma metaIinguagem.
Uma meta Iinguagem uma Iinguagem que usada para descrever uma
outra Iinguagem.
Uma Iinguagem descrita em EBNF por meio de um conjunto de regras.
Por exempIo:
<program> ::= {<statement> *} uma regra.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 35/75
_____________________________________________________________________________________
O smboIo "::=" significa " definido como"
O smboIo "*" significa "zero ou mais ocorrncias do eIemento
precedente"
Assim, a regra estabeIece que um <program> definido como uma
seqncia arbitrria de <statement> dentro de chaves { }. As entidades
"<" e ">" na metaIinguagem so denominadas de no terminais. A
entidade "}" j denominada de terminal.
Terminais so aqueIas previamente chamadas de paIavras da Iinguagem
que est sendo definida, enquanto que os no terminais so entidades
Iingsticas que so definidas por outras regras EBNF.
Para meIhor iIustrar a EBNF, segue a definio de uma Iinguagem
simpIes, descrita segundo esta metaIinguagem.
(a) regras sintticas
<program>::={<statement>*}
<statement>::=<assignment>|<conditionaI>|<Ioop>
<assingment>::=<identifier>=<expr>;
<conditionaI>::=if<expr>{<statement>
+
}|
if<expr>{<statement>
+
}eIse{<statement>
+
}
<Ioop>::=whiIe<expr>{<statement>
+
}
<expr>::=<identifier>|<number>|(<expr>)|<expr><operator><expr>
(b) regras Ixicas
<operator>::=+|-|*|=|!=|>|<|>=|<=
<identifier>::=Ietter><id>*
<id>::=<Ietter>|<digit>
<number::=<digit>+
<Ietter>::=a|b|c|...|z
<digit::=0|1|...|9
Figura 2.1 - Definio EBNF (gramtica) de uma simpIes Iinguagem de
programao
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 36/75
_____________________________________________________________________________________
A descrio sinttica de uma Iinguagem tem dois usos primrios:
Ajuda o programador em como escrever programas
sintaticamente corretos.
Pode ser usado para determinar se um programa est
sintaticamente correto. Isso exatamente o que um compiIador
faz. O construtor do compiIador usa a gramtica para escrever o
anaIisador sinttico (tambm chamado de "parser") que seja
capaz de reconhecer todos os programas vIidos. Esse
processo agora conhecido como autmato. De fato existem
programas (geradores de compiIadores) que podem usar a
gramtica de uma Iinguagem como entrada e produzir o
anaIisador como sada. Os LEX e YACC do ambiente UNIX, so
ferramentas bem conhecidas que geram anaIisadores Ixicos e
sintticos, respectivamente, iniciando da descrio das regras
Ixicas e sintticas da Iinguagem. Existem vrias verses dessa
ferramenta.
Os diagramas de sintaxe, so uma outra forma de definir a sintaxe de
Iinguagens de programao. EIes so conceituaImente equivaIentes ao
EBNF.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 37/75
_____________________________________________________________________________________
Figura 2.2 Diagramas de sintaxe para a Iinguagem descrita na figura 2.1
{ }
comando
programa
atribuio
condicionaI
cicIo
comando
identificador expresso =
atribuio
expresso comando { if }
eIse comando { }
condicionaI
expresso comando { whiIe }
cicIo
expresso operador expresso
identificador
nmero
expresso { }
expresso
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 38/75
_____________________________________________________________________________________
2.1.1.1 Sintaxe Abstrata, Sintaxe Concreta e Pragmticas
AIgumas construes de Iinguagens em diferentes Iinguagens de
programao tm a mesma estrutura conceituaI, porm diferem em suas
aparncias a nveI Ixico.
Por exempIo:
Em C o fragmento de programa
WhiIe (x != y) {
...
};
e em PascaI o fragmento
whiIe x <> y do
begin
...
end;
pode ser descrito peIa simpIes variante Ixica nas regras da EBNF da
figura 2.1. EIas diferem somente nos modos em que os comandos so
agrupados (begin ... end versus {...}), o operador "not equaI" (<> versus !
=), e o fato de que a expresso Ioop em C deve estar entre parntesis.
Quando duas construes diferem somente no nveI Ixico, diz-se que
eIas seguem a mesma sintaxe abstrata, porm, diferem em nveI de
sintaxe concreta. Isto , eIas tm a mesma estrutura abstrata e diferem
somente nos detaIhes a baixo nveI.
Embora conceituaImente a sintaxe concreta possa ser irreIevante,
pragmaticamente eIa pode afetar a usabiIidade da Iinguagem e faciIidade
de Ieitura de programas. Por exempIo:
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 39/75
_____________________________________________________________________________________
0 smboIo intuitivamente mais significativo do que !=.
Um outro exempIo, a Iinguagem simpIes da figura 2.1 requer que os
corpos dos comandos whiIe e das aIternativas dos comandos
condicionais iniciem peIa chave { e sejam finaIizadas peIa chave }
(agrupadas peIas chaves { e }). Outras Iinguagens tais como C e PascaI,
permitem as suas omisses nos casos em que o corpo ou aIternativas de
comando condicionaI se resume em comandos simpIes. Por exempIo, em
C pode-se escrever:
WhiIe (x != y) x = y + 1;
Pragmaticamente, entretanto, isso pode ser propenso a erros. Se mais do
que um comando necessita estar inserido no corpo de um Ioop,
necessrio adicionar chaves para agrupar os comandos constituintes do
corpo. ModuIa-2 soIuciona esse probIema em nveI de sintaxe concreta,
usando a paIavra chave "end" para terminar tanto o Ioop como o
comando condicionaI. Uma soIuo semeIhante adotada peIa Iinguagem
Ada. Os seguintes comandos so exempIos em ModuIa-2:
If x = y then
...
end
if x = y then
...
eIse
...
end;
whiIe x = y do
...
end;
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 40/75
_____________________________________________________________________________________
em todos os trs fragmentos, a parte "..." pode ser um comando simpIes
ou uma seqncia de comandos separados por ponto e vrguIa (;).
2.1.2 Semnticas
A sintaxe define programas bem formados de uma Iinguagem.
A semntica define o significado de programas sintaticamente corretos
daqueIa Iinguagem.
Por exempIo, a decIarao em C:
Int vector[10];

Faz com que seja reservado um espao para 10 eIementos do tipo inteiro,
para a variveI chamada vector. Os eIementos do conjunto pode ser
referenciado por meio de ndice i, 0 < i < 9. O primeiro eIemento de vector
vector[0].
Como um outro exempIo, a semntica de C estabeIece que a instruo
If (a > b) max = a; eIse max = b;
Significa que a expresso a > b deve ser caIcuIada e, dependendo de seu
vaIor, um dos dois comandos de atribuio seja executado. Note que a
regra de sintaxe diz como formar o comando - por exempIo, onde coIocar
um ";" - e as regras de semntica diz quaI o efeito do comando.
ReaImente nem todos os programas sintaticamente corretos tm
significado.
Assim, a semntica tambm separa programas significativos daqueIes
meramente sintaticamente corretos.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 41/75
_____________________________________________________________________________________
Por exempIo, de acordo com a EBNF da Iinguagem simpIes descrita na
figura 2.1, se poderia escrever quaIquer expresso como uma condio
dos comandos if e whiIe. A semntica da Iinguagem deveria requerer que
tais expresses deIiberassem um vaIor booIeano (TRUE ou FALSE, e no
um vaIor inteiro). Em muitos casos, tais regras que promovem restries
a programas sintaticamente corretos podem ser verificados antes da
execuo do programa; eIas so chamadas de semntica esttica,
em oposio semntica dinmica, que descreve o efeito da
execuo das diferentes construes da Iinguagem de programao. Em
taI caso, os programas podem ser executados somente se eIes estiverem
corretos com respeito a ambas as sintaxes. Nessa seo se concentrar
sobre a sintaxe dinmica. Assim, a referncia ao termo "semntica"
impIicitamente se estar referenciando sintaxe dinmica.
Enquanto a EBNF e os diagramas de sintaxe se tornaram ferramentas
padro para descrio sinttica, nenhuma ferramenta desse tipo para a
descrio semntica Iargamente aceito como padro. Existem
diferentes abordagens formais para a definio semntica, mas nenhuma
inteiramente satisfatria. Uma breve introduo a semntica formaI
dada na seo 2.1.2.1.
Nesse captuIo, e seus subsequentes, ser dotada a abordagem
operacionaI para a descrio da semntica de Iinguagens de
programao.
Nessa abordagem, usado o comportamento de um simpIes e intuitivo
processador abstrato, para descrever os efeitos de cada construo da
Iinguagem.
TaI mquina ser descrita na seo 2.6.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 42/75
_____________________________________________________________________________________
As semnticas das construes de uma Iinguagem de programao,
ento, em termos das operaes dessa mquina.
AIm disso, essa mquina foi projetada para mostrar os requisitos em
tempo de execuo das Iinguagens simpIes de programao, em vez de
execut-Ias com eficincia.
EIa pode ser usada como modeIo para impIementao de Iinguagem no
sentido de que se pode derivar diretamente, impIementaes simpIes peIa
apIicao dos conceitos discutidos at o aqui. A impIementao,
entretanto, provaveImente, ser ineficiente. Para obter eficincia,
quaIquer impIementao reaI, ter que ser diferente desse modeIo em
pontos importantes. Por exempIo, em como as estruturas de dados so
arranjadas e acessadas, e no conjunto de instrues de mquina. O
propsito do modeIo simpIesmente estabeIecer os efeitos da
Iinguagem, dada a estrutura da mquina abstrata. A impIementao
particuIar da Iinguagem sobre uma mquina reaI no est obrigada a
impIementar a estrutura do processador abstrato usado para definir a
semntica da Iinguagem; eIa somente necessria para impIementar os
mesmo efeitos, dadas s restries e estruturas da impIementao da
mquina.
importante separar as questes semnticas da Iinguagem das questes
de impIementao.
Isso pode ser feito mantendo-se em mente que parte da descrio uma
descrio (ou restrio) da mquina e quaI a da Iinguagem.
2.1.2.1 Uma introduo semntica formaI
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 43/75
_____________________________________________________________________________________
2.2 Processamento da Iinguagem
Na teoria possveI construir computadores para propsitos especiais,
para executar diretamente programas escritos em uma particuIar
Iinguagem, mas isto requereria uma nova arquitetura de mquina para
cada Iinguagem de programao.
Computadores atuais, executam diretamente somente uma Iinguagem de
propsito geraI e de muito baixo nveI, chamada de linguagem de
mquina.
As Iinguagens de mquina so projetadas com base na veIocidade de
execuo, custo de reaIizao, e fIexibiIidade na construo de novas
camadas de software sobre eIa. Por outro Iado, as Iinguagens de
programao, frequentemente so projetadas sobre a base da faciIidade e
confiabiIidade de programao. Um probIema bsico, ento, como uma
Iinguagem de aIto nveI eventuaImente pode ser executada em um
computador cuja Iinguagem de mquina muito diferente e de nveI muito
mais baixo.
Existem, geraImente, duas aIternativas para uma impIementao:
interpretao e traduo.
2.2.1 Interpretao
Nessa soIuo, as aes inferidas peIas construes da Iinguagem so
executadas diretamente (veja figura 2.3(a)). GeraImente, para cada
possveI ao, existe um subprograma - escrito em Iinguagem de
mquina - para executar a ao.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 44/75
_____________________________________________________________________________________
Assim, a interpretao de um programa reaIizada por chamadas a
subprogramas na seqncia apropriada.
Mais precisamente, um interpretador um programa que repetidamente
executa a seguinte seqncia:
1. Pegar o prximo comando;
2. Determinar as aes a serem executadas
3. ReaIizar as aes
Essa seqncia bastante semeIhante ao padro de aes reaIizadas por
um computador tradicionaI, que :
1. buscar a prxima instruo (isto , a instruo cujo endereo est
especificado peIo ponteiro de instruo) e avanar o ponteiro de
instruo (isto , ajustar o endereo da instruo a ser a prxima a ser
buscada)
2. Decodificar a instruo
3. Executar a instruo
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 45/75
_____________________________________________________________________________________
Essa semeIhana mostra que a interpretao pode ser vista como uma
simuIao, sobre uma mquina hospedeira, de uma mquina de propsito
especiaI cuja Iinguagem de mquina a Iinguagem de aIto nveI.
2.2.2 Traduo
Nessa soIuo, o programa escrito em Iinguagem de aIto nveI
transIadado em uma verso equivaIente em Iinguagem de mquina antes
de ser executado.
Essa traduo freqentemente feita em vrios passos (veja figura
2.3(b)). MduIos de programas devem ser primeiros transIadados
separadamente em cdigo reIocveI de mquina; mduIos de cdigos
INTERPRETADOR
Entrada Sada
Programa
(a) Interpretao
COMPILADOR LINKER
LOADER INTERPRETADOR
de dados de dados
Entrada
de dados
Cdigo
reIocveI
de
mquina
Uma
unidade
reIocveI
Unidade
execut
veI
Sada
de dados
Entrada de
dados
Figura 2.3 Processamento de Iingaugem por interpretao (a) e transIao (b)
(b) TransIao (seguido peIa interpretao)
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 46/75
_____________________________________________________________________________________
reIocveis so Iigados em uma nica unidade reIocveI; finaImente, o
programa inteiro carregado na memria do computador como cdigo de
mquina executveI. O tradutor usado nesses passos tem nomes
especiais: compiIador, Iinker (carregador-editor), e carregador,
respectivamente.
Em aIguns casos, a mquina em que a traduo feita (a mquina
hospedeira), diferente da mquina em que para ser executado o
cdigo transIadado (a mquina objeto). Esse tipo de traduo chamado
de traduo cruzada (cross-transIation). Tradutores cruzados oferecem a
nica soIuo viveI quando a mquina objeto um processador para
propsito especiaI em vez de um para propsito geraI que pode suportar
o tradutor.
A interpretao pura e a traduo pura so dois extremos de um espectro
contnuo. Na prtica muitas Iinguagens so impIementadas peIa
combinao das duas tcnicas. Um programa pode ser traduzido para um
cdigo intermedirio que , ento, interpretado. O cdigo intermedirio
poderia ser simpIesmente uma representao formatada do programa
originaI, com as informaes irreIevantes retiradas (por exempIo,
comentrios e espaos) e os componentes de cada comando armazenado
em um formato fixo, para simpIificar a subsequente decodificao das
instrues. Nesse caso, a soIuo basicamente interpretativa.
AIternativamente, o cdigo intermedirio poderia em cdigo de mquina
(baixo nveI) para uma mquina virtuaI que para ser mais tarde
interpretada por software. Essa soIuo, que confia mais pesadamente na
traduo, pode ser adotada para gerar cdigo porttiI, isto , cdigo que
executveI em diferentes mquinas.
Por exempIo, para propsito de portabiIidade, uma das impIementaes
mais conhecida de um compiIador PascaI, foi escrito em PascaI e gerado
um cdigo intermedirio chamado Pcode. A disponibiIidade de uma
impIementao porttiI da Iinguagem contribuiu para a rpida difuso da
PascaI em muito ambientes educacionais. Mais recentemente, com o uso
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 47/75
_____________________________________________________________________________________
grandemente difundido da Internet, o cdigo porttiI tornou-se o principaI
objetivo dos desenvoIvedores de apIicaes para rede.
Recentemente, esforos em Iinguagens esto direcionados na obteno
de cdigo mveI em rede.
A Iinguagem Java a mais conhecida e o mais promissor exempIo. EIa
primeiro traduzido para um cdigo intermedirio chamado Java bytecode,
o quaI interpretado na mquina cIiente.
Em uma soIuo puramente interpretativa, a execuo de um comando
pode requerer um processo de decodificao muito compIicada, para
determinar a operao a ser executada e seus operandos. Em muitos
casos, esse processo idntico cada vez que o comando encontrado.
Consequentemente, se o comando para ser executada vrias vezes (por
exempIo, dentro de um cicIo), a veIocidade de execuo fortemente
afetada por esse processo de decodificao. Por outro Iado, a traduo
pura gera cdigo de mquina para cada comando de aIto nveI somente
uma vez. Assim, os comandos que aparecem em vrios pontos de um
programa, so decodificados nas respectivas representaes em
Iinguagem de mquina, fazendo com que o processamento seja muito
mais eficiente em reIao interpretao pura. Por outro Iado, a
interpretao pura, pode saIvar memria. Na traduo pura, cada
comando em Iinguagem de aIto nveI pode ser expandido em dezenas a
centenas instrues de mquina. Na soIuo puramente interpretao, os
comandos de aIto nveI so deixados na forma originaI e as instrues
necessrias para execut-Ios so armazenados em subprogramas do
interpretador. O ganho de memria evidente se o programa grande e
usa a maioria dos comandos da Iinguagem. Em contrapartida, se todos os
subprogramas do interpretador forem mantidos na memria principaI
durante a execuo, o interpretador pode desperdiar memria para
programas pequenos, que usam apenas aIguns comandos da Iinguagem.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 48/75
_____________________________________________________________________________________
CompiIadores e interpretadores diferem no modo em que eIes podem
reportar erros em tempo de execuo.
Tipicamente, com compiIao, quaIquer referncia ao cdigo fonte
perdida na gerao do cdigo objeto. Se gerado um erro em tempo de
execuo, pode ser impossveI reIacion-Io construo na Iinguagem
fonte que estaria sendo executada. As mensagens de erros em tempo de
execuo so freqentemente obscuras e a maioria no muito
significativa para o programador.
Do outro Iado, o interpretador processa comandos fontes e pode
reIacionar erro em tempo de execuo ao comando fonte que est sendo
executado.
Por essa razo, aIguns ambientes de programao contm ambas
faciIidades; o interpretador e um compiIador de uma dada Iinguagem.
Por causa da faciIidade no diagnstico, o interpretador usado durante o
desenvoIvimento do programa.
Aps o programa estar vaIidado, que eIe compiIado, obtendo-se
assim, um cdigo eficiente para execuo.
O macro processamento um tipo especiaI de traduo que pode ocorrer
como um primeiro passo na traduo de um programa.
Um macro um fragmento de texto fonte (para o quaI deve-se atribuir um
nome para identificao e referncias), chamado de corpo do macro. No
processamento, seus nomes no texto so substitudos peIos
correspondentes corpos.
Em C, se pode escrever macros, os quais so manipuIados por um pr-
processador, que gera cdigo fonte em C por meio da expanso de
macros. Por exempIo, pode-se usar um macro para prover um nome
simbIico para um vaIor constante, como segue abaixo.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 49/75
_____________________________________________________________________________________
#define UPPER_LIMIT 100
...
sum = o;
for (index = 0; index < UPPER_LIMIT; index++) {
sun += a[index];
};
...
2.2.3 O conceito de "binding"
Os programas tratam entidades tais como variveis, rotinas e comandos.
Entidades de programas tm certas propriedades chamadas de atributos.
Por exempIo:
uma variveI tem um nome, um tipo, uma rea de memria onde
seu vaIor armazenado;
uma rotina tem um nome, parmetros formais de um certo tipo,
convenes de passagem de parmetros;
um comando tem aes associados a eIe.
Os vaIores de atributos devem ser ajustados antes que eIes sejam
usados.
Ajustar um vaIor de atributo conhecido como "binding".
Para cada entidade, a informao de atributo contida em um repositrio
chamado descritor.
"Binding" um conceito centraI na definio de semntica de Iinguagem
de programao. As Iinguagens de programao diferem na quantidade
de entidades com as quais eIas tratam, na quantidade de atributos a
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 50/75
_____________________________________________________________________________________
serem Iigados a estas entidades, no instante em que eIas devem
acontecer ("binding time"), e na estabiIidade da "binding" (isto , se
estabeIecido a "binding" eIa fixa ou modificveI).
AIguns atributos podem ser Iigados em tempo de definio da
Iinguagem, outros em tempo de impIementao da Iinguagem, outros em
tempo de traduo do programa (ou em tempo de compiIao), e outros
em tempo de execuo do programa. A seguir Iista-se exempIos de
"binding" (sem a pretenso de ser exaustiva):
"binding" em tempo de definio da Iinguagem: Na maioria das
Iinguagens (incIusive FORTRAN, Ada, C, e C++) o tipo "integer"
Iigado em tempo de definio da Iinguagem sua contrapartida
matemtica bem conhecida, isto , ao conjunto de operaes
aIgbricas que produzem e manipuIam inteiros;
"binding" em tempo de impIementao da Iinguagem: Na maioria das
Iinguagens (incIusive FORTRAN, Ada, C e C++), um conjunto de
vaIores Iigado ao tipo "integer" em tempo de impIementao da
Iinguagem. Isto , a definio da Iinguagem estabeIece que o tipo
"integer" deve ser oferecido e a impIementao da Iinguagem Iiga-o
representao de memria, que por sua vez determina o conjunto de
vaIores que esto contidos naqueIe tipo.
"Binding" em tempo de compiIao (ou em tempo de traduo): PascaI
prov uma definio pr definidda de tipo "integer" mas permite que o
programador redefina-o. Assim, o tipo "integer" Iigado sua
representao em tempo de impIementao da Iinguagem, porm,
podendo ser modificado em tempo de compiIao.
"Binding" em tempo de execuo: Na maioria das Iinguagens, as
variveis so Iigadas aos seus vaIores em tempo de execuo, e
podendo ser modificados repetidamente durante a execuo.
Nos trs primeiros exempIos, a "binding" estabeIecida antes da
execuo e no pode mais ser modificado.
Esse tipo de regime de "binding" frequentemente chamado de esttico.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 51/75
_____________________________________________________________________________________
O termo esttico denota tanto o tempo de "binding" (que ocorre antes que
o programa seja executado), quanto estabiIidade (a "binding" no pode
ser modificada).
Reciprocamente, uma "binding" estabeIecida em tempo de execuo,
geraImente modificveI durante a execuo. O quarto exempIo iIustra
isso.
Esse tipo de 'binding" freqentemente chamado de dinmico.
Existem casos, entretanto, que a "binding" estabeIecida em tempo de
execuo e no pode mais ser modificada. Um exempIo uma Iinguagem
que prov variveis constantes (somente de Ieitura) que so iniciadas por
meio de expresses que so desenvoIvidas em tempo de execuo.
O conceito de "binding", tempo de "binding", e estabiIidade, ajudam a
cIarear muitos dos aspectos semnticos de Iinguagens de programao.
Na prxima seo, usar-se-o esses conceitos para iIustrar a noo de
uma variveI.
2.3 Variveis
Computadores convencionais so baseados na noo de memria
principaI consistindo de cIuIas eIementares, cada uma identificada por
um endereo.
O contedo de uma cIuIa uma representao codificada de um vaIor.
Um vaIor uma abstrao matemtica; sua representao codificada na
cIuIa de memria pode ser Iida e, geraImente, modificada durante a
execuo do programa. A modificao impIica na substituio de uma
codificao por uma outra codificao. Com poucas excees, as
Iinguagens de programao podem ser vistas como abstraes, a nveis
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 52/75
_____________________________________________________________________________________
diferentes, do comportamento de tais computadores convencionais. Em
particuIar, eIas introduzem a noo de variveis como uma abstrao da
noo de cIuIas de memrias. O nome da variveI como uma abstrao
do endereo, e a noo de comando de atribuio como uma abstrao
da modificao destrutiva de uma cIuIa.
Neste captuIo e nos prximos, se restringir s consideraes s
Iinguagens de programao baseadas em atribuio. As Iinguagens
aIternativas do estiIo de programao decIarativa e funcionaI sero
discutidas nos captuIos bem mais para frente.
FormaImente, uma variveI uma quntupIa (5-upIa):
<nome, escopo, tipo, I-vaIor, r-vaIor>
onde:
nome: uma cadeia de caracteres usada peIos comandos do
programa para denotar a variveI;
escopo: o campo das instrues do programa em que o nome
conhecido;
tipo: o tipo da variveI;
I-vaIor: a Iocao de memria associada variveI;
r-vaIor: o vaIor codificado armazenado na Iocao da variveI.
Esses atributos so descritos a seguir.
2.3.1. Nome e escopo
um nome de variveI normaImente introduzida por um comando
especiaI, chamado uma declarao.
NormaImente, o escopo da variveI se estende desse ponto at o ponto
de fechamento, especificado peIa Iinguagem. Diz-se tambm que, uma
variveI visveI dentro de seu escopo e invisveI fora deIe. Quando
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 53/75
_____________________________________________________________________________________
visveI a variveI pode ser manipuIada peIos comandos pertinentes ao
escopo.
Diferentes Iinguagens de programao adotam diferentes regras para
Iigar um nome de variveI ao seu escopo.
Por exempIo, considere o programa escrito em C, na figura 2.4.
A decIarao int x, y; faz com que as variveis denominadas de x e y,
sejam visveis ao programa main. O programa contm um bIoco interno,
que agrupa uma decIarao e comandos. A decIarao int temp; que
aparece no bIoco, torna a variveI chamada de temp visveI dentro desse
bIoco e invisveI fora deIe. Assim, estar errado us-Ia como um
argumento da operao printf.
#incIude <stdio.h>
main()
{
int x, y;
scanf("%d, %d", &x, &y);
/* so Iidos dois vaIores decimais e
armazenados nos I-vaIores de x e y */
{
/* este um bIoco usado para executar a
troca de vaIores entre x e y */
int temp;
temp = x;
x = y;
y = temp;
}
printf("%d, %d", x, y);
}
Figura 2.4 Um programa simpIes em C
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 54/75
_____________________________________________________________________________________
Variveis podem estar Iigadas ao escopo estaticamente ou
dinamicamente.
A ligao esttica ao escopo (tambm chamada de escopo Ixico),
define o escopo em termos da estrutura Ixica do programa. Cada
referncia a uma variveI pode ser estaticamente Iigada a uma particuIar
(impIcita ou expIcita) decIarao da variveI peIo simpIes exame do texto
do programa, sem execut-Io.
A regra de Iigao esttica ao escopo adotada peIa maioria das
Iinguagens de programao dentre eIas, est a C.
A ligao dinmica ao escopo define o escopo do nome de uma
variveI em termos de execuo do programa. Tipicamente, cada
decIarao de variveI estende seus efeitos sobre todas as instrues
executadas posteriormente, at que uma nova decIarao para uma
variveI com o mesmo nome encontrada durante a execuo. As
Iinguagens APL, LISP (como originaImente definidas) e SNOBOL4 so
exempIos de Iinguagens com regras de escopo dinmico.
Como exempIo, considere o fragmento de programa na figura 2.5, escrito
na Iinguagem C-Iike. Se a Iinguagem segue o escopo dinmico, a
execuo do bIoco A seguido peIo bIoco C, far com que a variveI x no
bIoco C, se refira a x decIarado no bIoco A. Agora, se a ordem de
execuo fosse, o bIoco B seguido do bIoco C, a variveI do bIoco C se
referir variveI x decIarada no bIoco B. Resumindo, o nome x no bIoco
C, se referir ao x decIarado no bIoco A ou ao decIarado no bIoco B,
dependendo do fIuxo de controIe durante a execuo.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 55/75
_____________________________________________________________________________________
{ /* bIoco A *?
Int x;
...
}
...
{ /* bIoco B */
int x;
...
}
...
{ /* bIoco C */
...
x = ...;
...
}
As regras de escopo dinmico parecem simpIes e fceis de serem
impIementadas, mas eIas tm as desvantagens em termos de discipIina
de programao e eficincia de programao. Os programas ficam
difceis de serem Iidos porque a identidade de uma particuIar decIarao
que Iiga uma dada variveI depende do particuIar ponto de execuo, e
assim, no se pode determinar estaticamente.
2.3.2. Tipo
Tipo de uma variveI a especificao do conjunto de vaIores que podem
ser associados com a variveI, junto com as operaes que podem ser
IegaImente usadas para criar, acessar e modificar tais vaIores.
Uma variveI de um dado tipo dito ser uma instncia do tipo.
Quando uma Iinguagem definida, certos nomes de tipos so Iigados a
certas cIasses de vaIores e conjuntos de operaes. Por exempIo, o tipo
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 56/75
_____________________________________________________________________________________
"integer" e seus operadores associados esto Iigados a sua contrapartida
matemtica. VaIores e operaes so Iigados a uma certa representao
de mquina quando a Iinguagem impIementada. A Itima Iigao pode
tambm restringir o conjunto de vaIores que se pode representar,
baseado na estrutura de armazenamento da mquina aIvo.
Em aIgumas Iinguagens, o programador pode definir novos tipos por
meio de decIaraes de tipo. Por exempIo, em PascaI se pode escrever:
#$pe vector = arra$[1..10] of integer;
Essa decIarao estabeIece uma "binding" - em tempo de traduo -
entre o tipo chamado vector e sua impIementao (isto , um conjunto de
10 inteiros, cada um acessveI via um ndice que pode variar de 1 a 10).
Como conseqncia dessa "binding", o tipo vector herda todas as
operaes da representao de estrutura de dados (o conjunto); assim,
possveI Ier e modificar cada componente de um objeto do tipo vector
peIa indexao ao conjunto.
AIgumas Iinguagens suportam a impIementao de tipo definido peIo
usurio (geraImente chamado de tipo abstrato de dado) peIa associao
ao novo tipo com o conjunto de operaes que pode ser usado sobre as
suas instncias; as operaes so descritas como um conjunto de rotinas
na decIarao do novo tipo. A decIarao do novo tipo tem a seguinte
forma geraI:
Type nome_do_novo_tipo =
{
estrutura de dados representando objetos do tipo
nome_do_novo_tipo;
rotinas a serem chamadas para manipuIao dos
objetos de dados do tipo nome_do_novo_tipo;
}
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 57/75
_____________________________________________________________________________________
a maioria das Iinguagens, incIuindo a FORTRAN, COBOL, PascaI, C, C++,
ModuIa-2, e Ada, Iiga as suas variveis aos seus tipos em tempo de
compiIao, e a Iigao no pode ser aIterada durante a execuo. Essa
soIuo chamada de tipificao esttica. Nessas Iinguagens, o
"binding" entre a variveI e seu tipo especificado peIa decIarao da
variveI. Por exempIo:
var x, y: integer;
c: character;
PeIa decIarao de variveis a pertencerem a um dado tipo, eIas so
automaticamente protegidas da apIicao de operaes iIegais (ou
absurdo).
No exempIo, abaixo, o compiIador pode detectar as ocorrncias das
atribuies iIegais:
X := c;
Y := not y;
por eIas no poderem vioIar as decIaraes acima.
A habiIidade para reaIizar verificao antes que o programa seja
executado (verificao de tipos estticos), contribui para a deteco de
erros mais cedo e meIhora a confiabiIidade do programa.
Em aIgumas Iinguagens (como FORTRAN) a decIarao pode ser
impIcita. A vantagem da decIarao expIcita est na cIareza do programa
e confiabiIidade, porque erros de escrita de nomes de variveis podem
ser detectados em tempo de traduo. Por exempIo, a decIarao em
FORTRAN da variveI ALPHA, seguida por um comando errado taI como
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 58/75
_____________________________________________________________________________________
ALPA = 7.2, que pretendia atribuir esse vaIor aqueIa variveI, no seria
acusado nenhum erro; pois eIa ser considerada como uma nova
variveI.
Note que a questo de decIarao impIcita no semntica.
Semanticamente, FORTRAN e PascaI so equivaIentes com respeito a
tipificao das variveis, porque ambas Iigam as variveis aos tipos em
tempo de traduo.
FORTRAN possui regras "defauIt" para determinar a particuIar "binding",
mas o intante da "binding" e sua estabiIidade so as mesmas nas duas
Iinguagens. A regra de FORTRAN determina que o tipo de uma variveI
bastante simpIes: eIa est baseada na primeira Ietra do nome da variveI.
A Iinguagem ML utiIiza a abordagem da decIarao impIcita ao extremo,
por no requerer a decIarao expIcita da maioria dos tipos, e ainda
verifica o tipo de todas as expresses estaticamente. Isso conseguido
atravs de procedimento de inferncia de tipo que determina o tipo
de uma variveI baseado em sua utiIizao. No captuIo 7, isso ser visto
em maiores detaIhes.
LISP, APL, SNOBOL4, e SmaIItaIk so Iinguagens que estabeIecem a
"binding" em tempo de execuo (modificveI), entre as variveis e seus
tipos. Essa estratgia chamada de tipificao dinmica. Variveis
dinamicamente tipificadas, so tambm chamadas variveis
polimorfas (IiteraImente, do Grego antigo, "muItipIe shape" - mItipIas
formas). Em tais Iinguagens, o tipo de uma variveI depende do vaIor que
Ihe dinamicamente associado a eIa. Por exempIo, uma vez que um vaIor
inteiro tenha sido atribudo a uma variveI, taI vaIor no pode ser tratado
como se eIe fosse, diga-se, uma cadeia de caracteres. Isto , uma vez que
um vaIor est Iigado a uma variveI, uma "binding" impIcita com o tipo
tambm estabeIecida, e a "binding" permanece at que um novo vaIor
seja atribudo variveI.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 59/75
_____________________________________________________________________________________
Como um outro exempIo, em LISP, as variveis no so decIaradas
expIicitamente; seus tipos so determinados impIicitamente peIos objetos
que so Iigadas a eIas durante a execuo.
Em geraI, a tipificao dinmica evita que os programas possam ser
estaticamente verificados quanto aos tipos de suas variveis: desde que
o tipo no conhecido, impossveI verificar vioIaes de tipos antes da
execuo do programa. Em tais casos, a vioIao de tipos pode somente
ser verificado em tempo de execuo, por meio de verificao dinmica
de tipo. Para reaIizar a verificao dinmica de tipo, devem ser mantidas
informaes sobre o tipo durante todo o tempo de execuo, em
descritores adequados de objeto. Para as Iinguagens estaticamente
tipificadas, tais descritores so necessrios somente em tempo de
traduo.
TaIvez surpreendentemente, entretanto, existem Iinguagens que suportam
ambos os tipos de verificao e variveis e rotinas poIimrficas.
Linguagens podem tambm no utiIizar tipos. A maioria das Iinguagens
de montagem ("assembIy") se encaixa nessa categoria de Iinguagens.
Nesse caso, as variveis no tm tipo, como so os objetos aos quais
eIas podem ser dinamicamente Iigadas. Isso refIete o comportamento do
hardware subjacente, onde as cIuIas de memria e registradores podem
conter cadeias de bits que so interpretadas como vaIores de quaIquer
tipo. Por exempIo, a cadeia de bits armazenada na cIuIa de memria
pode ser adicionada cadeia de bits armazenada em um registrador
usando a adio de inteiros. Em taI caso, as cadeias de bits so
interpretadas como vaIores inteiros.
2.3.3.1. I-vaIor
O I-vaIor de uma variveI a rea de memria Iigada variveI durante a
execuo do programa.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 60/75
_____________________________________________________________________________________
O tempo de vida, ou aIcance, de uma variveI, o perodo de tempo
em que a "binding" existir.
A rea de memria usada para manter o r-vaIor da variveI.
Usar-se- o termo dado objeto (ou simpIesmente objeto), para denotar
o par <I-vaIor, r-vaIor>.
A ao que adquiri uma rea de memria para uma variveI - e assim
estabeIece a Iigao entre a variveI e seu I-vaIor - chamada alocao
de memria. O tempo de vida se estende do ponto de aIocao at o
ponto onde essa rea recIamada (deaIocao de memria). Em aIgumas
Iinguagens, para aIguns tipos de variveis, a aIocao reaIizada antes
do tempo de execuo e a memria somente recIamada ao trmino da
execuo (aIocao esttica). Em outras Iinguagens, a aIocao
reaIizada em tempo de execuo (aIocao dinmica), ou por meio de
pedido expIicitado peIo programador via um comando de criao ou
automaticamente, quando encontrada a decIarao da variveI, e
recIamada durante a execuo. A seo 2.7 anaIisa extensivamente essas
questes.
Na maioria dos casos, o tempo de vida de uma variveI de um programa
uma frao do tempo de execuo do programa. tambm possveI,
entretanto, ter objetos persistentes.
Um objeto persistente existe no ambiente em que o programa
executado, e seu tempo de vida no tem a priori reIao com quaIquer
tempo de execuo de programa. Uma vez criados, eIes podem ser
usados em diferentes ativaes de programas, e diferentes ativaes do
mesmo programa, at que eIes seja eIiminados por meio de comando
especfico para o Sistema OperacionaI. SemeIhantemente, objetos
persistentes podem ser armazenados em base de dados e tornado
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 61/75
_____________________________________________________________________________________
visveis para a Iinguagem de programao por meio de uma interface
especfica.
2.3.4 r-vaIor
O r-vaIor de uma variveI o vaIor codificado armazenado na Iocao
associada com a variveI (isto , seu I-vaIor).
A representao codificada interpretada de acordo com o tipo da
variveI. Por exempIo, uma seqncia de bits poderia ser interpretada
com um vaIor do tipo inteiro se o tipo da variveI for int (em C ou C++), ou
como uma cadeia de caracteres se o tipo for um conjunto de caracteres.
Os I-vaIor e r-vaIor so os principais conceitos reIacionados a execuo
de programa.
As instrues do programa acessam as variveis atravs de seus I-
vaIores e possiveImente modificam os seus r-vaIores.
Esses termos derivam da tradicionaI forma do comando de atribuio, taI
como (em C ou C++):
X = y;
A variveI que aparece do Iado esquerdo da atribuio denota uma
Iocao (o I-vaIor da variveI) e a variveI que aparece do Iado direito,
denota o contedo de uma Iocao (o r-vaIor da variveI).
Como no h ambigidade, usar-se- o termo valor para denotar o r-vaIor
de uma variveI.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 62/75
_____________________________________________________________________________________
A Iigao entre uma variveI e o vaIor mantido na rea de memria,
geraImente dinmica. A Iigao estabeIecida peIa operao de
atribuio.
Isso verdade somente para as Iinguagens imperativas.
As Iinguagens de programao funcionaI e Igica tratam as variveis
como as suas contrapartidas matemticas: eIas podem estar Iigadas a um
vaIor peIo processo de evoIuo, mas uma vez estabeIecida a Iigao, eIa
no pode ser mudada durante o seu tempo de vida.
AIgumas Iinguagens convencionais, entretanto, permitem que a Iigao
entre uma variveI e seu vaIor, uma vez estabeIecida, seja congeIada. Por
exempIo, constantes simbIicas decIaradas peIo usurio (em C):
Const fIoat pi = 3.1415;
E ento usar pi na expresso taI como:
Circunferencia = 2 * pi * radius;
PascaI oferece aIgo semeIhante.
EIas diferem apenas no instante da Iigao entre a "variveI constante" e
seu vaIor.
Em PascaI, o vaIor provido por uma expresso que deve ser evoIuda
em tempo de compiIao (Iigao estabeIecida em tempo de compiIao).
O compiIador pode substituir o vaIor da constante peIo seu nome
simbIico no programa.
Em C e Ada, o vaIor pode ser dado como uma expresso envoIvendo
outras variveis e constantes. Consequentemente, a Iigao s pode ser
estabeIecida, em tempo de execuo, quando ento a variveI criada.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 63/75
_____________________________________________________________________________________
Uma questo sutiI reIacionada com a Iigao entre uma variveI (que no
seja para ser uma constante) e seu vaIor, :
" Deve-se Iigar um r-vaIor a uma variveI Iogo que eIa criada? "
aIgumas Iinguagens requerem que seja estabeIecida uma Iigao Iogo
que a variveI criada (por exempIo, a ML).
Outras suportam tais Iigaes, porm, no obriga a us-Ias. A decIarao
de uma variveI pode tambm especificar um vaIor iniciaI para eIa. Por
exempIo, em C:
Int i = 0, j = 0;
SemeIhantemente em Ada, pode-se escrever:
I, j: INTEGER := 0;
Mas o que acontece se no for dada nenhuma iniciaIizao?
Existem vrias possibiIidades que poderiam ser seguidas, mas
infeIizmente, a maioria das Iinguagens faIha na especificao da opo
escoIhida. Como resuItado, o probIema resoIvido diferentemente por
diferentes impIementaes da mesma Iinguagem, e assim, o
comportamento do programa depende da impIementao da Iinguagem
(programas que estejam gerando os resuItados esperados podem no
gerar mais, quando se troca o compiIador da mesma Iinguagem, porm,
de "software house" diferente).
Uma soIuo freqentemente adotada ao probIema ignor-Io; adota-se a
cadeia de bits que se encontra no momento da decIarao da variveI,
como seu vaIor iniciaI.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 64/75
_____________________________________________________________________________________
Uma outra soIuo prover a estratgia de iniciaIizao no sistema: por
exempIo, inteiros so sempre iniciaIizados com 0, os caracteres com o
caractere branco, e assim por diante.
Ainda uma outra soIuo consistiria da viso de variveis no
iniciaIizadas, atribuindo-Ihes um vaIor indefinido especiaI, e provocar uma
interrupo quando da ocorrncia de um acesso de Ieitura a eIas, antes
de quaIquer ocorrncia de escrita (atribuio de vaIor).
2.3.5 Referncias e variveis sem nome
AIgumas Iinguagens permitem que variveis possam ser acessadas
atravs de r-vaIor de outra variveI.
Esse r-vaIor chamado uma referncia (ou ponteiro) para a variveI.
Variveis que so acessadas via ponteiros podem mesmo estar sem
nome. A nica maneira de acessar uma variveI sem nome atravs de
uma outra com nome. Uma variveI sem nome poderia estar diretamente
referenciada por uma variveI com nome, ou poderia estar referenciada
por uma variveI sem nome que por sua vez estaria referenciada por uma
com nome. De um modo geraI, um objeto pode estar acessveI via cadeia
de referencias (chamada caminho de acesso) de comprimento arbitrrio.
Por exempIo, em PascaI:
Type PI = ^integer;
Pode-se aIocar uma variveI sem nome do tipo inteiro e apont-Io atravs
de uma variveI do tipo PI (no caso pxi):
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 65/75
_____________________________________________________________________________________
Var pxi: PI;
New(pxi);
A fim de acessar o objeto sem nome referenciado por pxi, necessrio
usar o operador desreferenciao ^, que quando apIicado variveI
ponteiro resuIta no r-vaIor do objeto apontado. Assim:
Pxi^:= 0;
Atribui o vaIor zero variveI sem nome.
A variveI sem nome pode tambm se tornat acessveI indiretamente
atravs de "ponteiro para ponteiro para inteiro", como:
Type PPI = ^PI;
Var ppxi: PPI;
...
new (ppxi);
ppxi^:= pxi;
PascaI permite apontar para somente variveis sem nome.
Outras Iinguagens como C, C++ e Ada, permitem ponteiros apontar para
variveis com nome. Por exempIo em C:
Int y;
Int x = 5;
Int *px;
px = &x;
...
y = *px;
...
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 66/75
_____________________________________________________________________________________
2.4 Rotinas
Linguagens de programao permitem que programas sejam compostos
de vrias unidades, chamadas de rotinas.
Nesse captuIo usar-se- o termo neutro "rotina" para prover um
tratamento geraI que escIarea os princpios importantes que so comuns
maioria das Iinguagens de programao, sem comprometer-se a
quaisquer caractersticas especiais de um Iinguagem em particuIar.
Rotinas podem ser desenvoIvidas de modo mais ou menos independente
e pode s vezes ser traduzidas separadamente e combinadas Iogo aps.
Os subprogramas em assembIy, subrotinas em FORTRAN, procedimentos
e funes em PascaI e Ada, e funes em C, so exempIos de rotinas.
Neste captuIo sero revistas as principais caractersticas sintticas e
semnticas de rotinas, e em particuIar os mecanismos que controIam o
fIuxo de execuo entre rotinas e a Iigao estabeIecida, quando uma
rotina executada. Outras unidades do tipo mais geraI, tais como os
packages em Ada, moduIes em ModuIa-2, cIasses em C++, sero
descritos mais adiante.
Em uma Iinguagem de programao, rotinas geraImente tm duas formas:
procedimentos e funes.
Funes retornam um vaIor. Procedimentos no.
AIgumas Iinguagens como C e C++ provem apenas funes, porm
sendo possveI a construo de procedimentos como funes que
retornam "nuII" do tipo "void".
Um exempIo de funo na Iinguagem C.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 67/75
_____________________________________________________________________________________
/* sum uma funo que computa a soma dos primeiros n inteiros
positivos, 1,2, ..., n; o parmetros n adimitido ser positivo */
int sum (int n);
{
int i, s;
s = 0;
for (i =1; i <= n; ++i)
s += i;
return s;
}
figura 2.8: Uma definio de funo em C
Como as variveis, as rotinas tm escopo, tipo, I-vaIor, e r-vaIor.
Um nome de rotina introduzido no programa peIa decIarao da rotina.
GeraImente o escopo do nome se estende do ponto da decIarao at
aIguma construo de fechamento, que determinado estaticamente ou
dinamicamente, dependendo da Iinguagem. Por exempIo, em C a
decIarao da funo se estende at o fim do arquivo.
A ativao da rotina acontece na invocao da rotina (ou chamada da
rotina), que nomeia a rotina e especifica os parmetros exigidos por esta.
Uma rotina tem o seu prprio escopo. Assim, eIa tambm define um
escopo para as suas decIaraes que ficam aninhadas neIa. Essas
decIaraes so denominadas Iocais e so visveis apenas dentro da
rotina.
Dependendo das regras de escopo da Iinguagem, as rotinas podem
tambm fazer referncia a itens no Iocais (por exempIo, variveis). Os
itens que no so Iocais e que so visveis a cada unidade do programa,
so chamados de itens gIobais.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 68/75
_____________________________________________________________________________________
O cabeaIho de uma rotina define o seu nome, seus tipos de parmetros,
e o tipo de vaIor a ser retornado (se existir). De forma breve, o cabeaIho
da rotina define o tipo da rotina. No exempIo da figura 2.8, o tipo da rotina
:
%otina com um par&metro int e retorna um int'
O tipo da rotina pode ser definido precisamente peIo conceito de
assinatura.
A assinatura especifica os tipos dos parmetros e o tipo do vaIor de
retorno.
Por exempIo, uma rotina fun que comporta-se como uma funo , com
parmetros de entrada dos tipos T
1
, T
2
, ..., T
n
, e que retorna um vaIor do
tipo R, pode ser especificada peIa seguinte assinatura:
fun: T
1
xT
2
x...xT
n
R
Uma chamada de rotina est correta em tipo se eIa est de acordo com o
correspondente tipo da rotina. Por exempIo,
I = sum(10); /* onde i est decIarada como int */
A chamada
I = sum(5.3);
J estaria incorreta.
O I-vaIor de uma rotina uma referncia reas de memria onde est
armazenada o corpo da rotina (os comandos executveis da rotina). A
ativao causa a execuo do corpo da rotina, que se constitui o r-vaIor
que est correntemente Iigado rotina.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 69/75
_____________________________________________________________________________________
Em C, o r-vaIor Iigado rotina estaticamente, em tempo de compiIao.
Uma poItica dinmica pode ser apresentada peIas Iinguagens que
suportam o conceito de variveis do tipo rotina. AIgumas Iinguagens
suportam a noo de ponteiro para uma rotina e prov um meio de pegar
o I-vaIor da rotina, que pode ser atribuda ao ponteiro. Por exempIo, o
seguinte comando em C decIara um ponteiro ps para uma funo com um
parmetro int e que retorna um int:
Int (*ps)(int);
O seguinte comando
ps = &sum;
faz ps apontar para o I-vaIor da rotina da figura 2.8. uma chamada pode
ento ser feita via ps como:
int i = (*ps)(5);
O uso de ponteiro para rotina permite que diferentes rotinas sejam
chamadas cada vez que o ponteiro desreferenciado. Isso prov um meio
de obter a poItica dinmica de Iigao.
Linguagens que expIoram a distino entre I-vaIor e r-vaIor, e permitem
variveis do tipo rotinas e ponteiros para rotinas sejam definidos e
manipuIados, tratam rotinas da mesma maneira que variveis: eIas so
ditas tratar rotinas como objetos de primeira classe.
AIgumas Iinguagens (como PascaI, Ada, C e C++) fazem distino entre a
declarao e a definio de uma rotina.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 70/75
_____________________________________________________________________________________
Uma decIarao de rotina introduz o cabeaIho da rotina, sem especificar
o corpo. O nome visveI desse ponto at o fim do escopo.
A definio especifica tanto o cabeaIho como o corpo.
A distino entre cabeaIho e corpo expIorada para permitir que rotinas
possam chamar uma outra no esquema de recurso mtua, como
iIustrado peIa figura 2.9.
Int A(int x, int y); // decIarao de uma funo com
// dois parmetros int, retornando um
// int; A visveI a partir deste ponto
fIoat B(int z); // definio da funo B; B visveI a
// partir deste ponto
{
int w, u;
...
w = A(z, u); // chama A, que est visveI aqui
...
};
int A(int x, int y); // esta a definio de A
{
fIoat t;
...
t = B(x); // B est visveI aqui
...
}
Figura 2.9: DecIarao e definio de rotina em C
A definio da rotina especifica o processo computacionaI. N hora da
invocao, executada uma instncia do processo para os particuIares
vaIores dos parmetros. A representao de uma rotina durante a
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 71/75
_____________________________________________________________________________________
execuo chamada de inst&ncia da rotina. Uma instncia de rotina
composta de um segmento de cdigo e um registro de ativao. O
segmento de cdigo, cujo contedo fixo, contm as instrues da
unidade. O contedo do registro de ativao (tambm chamado de
quadro) modificveI. O registro de ativao contm todas as
informaes necessrias para executar a rotina, incIuindo, entre outras
coisas, os objetos de dados associados com as variveis Iocais de um
particuIar instante da rotina. A posio reIativa de um objeto de dado no
registro de ativao, chamada de offset (desIocamento). Para permitir
que a rotina chamada retorne o controIe ao chamador, o ponteiro de
retorno saIvo como uma parte do registro de ativao da rotina em
tempo de invocao.
(maiores detaIhes podem ser vistas no Iivro texto)
2.4.1 Rotinas genricas
Rotina agrega um fragmento de cdigo que executado em diferentes
pontos de um programa onde eIa chamada.
Frequentemente, entretanto, rotinas semeIhantes devem ser escritas
vrias vezes, porque eIas diferem-se em aIgum detaIha que no pode ser
fatorado atravs dos parmetros. Por exempIo, se um programa necessita
de ordenar tanto um arranjo de inteiros como um arranjo de cadeias de
caracteres, deve-se escrever duas rotinas diferentes, uma para cada tipo
de parmetro, mesmo que o aIgoritmo abstrato escoIhido para
impIementao da operao de ordenao, seja o mesmos em ambos os
casos.
Rotinas genricas como oferecidas por aIgumas Iinguagens de
programao, provem uma soIuo para esse probIema.
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 72/75
_____________________________________________________________________________________
Nessa seo, proveremos uma viso introdutria de rotinas genricas
como eIas aparecem nas Iinguagens como C++ e Ada. Mais detaIhes so
vistos nos captuIos 4, 5, 6 e 7,
Uma rotina genrica pode ser parametrizada com respeito a um tipo. No
exempIo anterior, a rotina seria genrica com respeito ao tipo dos
eIementos do arranjo.
Parmetros tipo em uma rotina genrica, portanto, diferem dos
parmetros convencionais e requerem um esquema diferente de
impIementao.
Uma rotina genrica um modeIo do quaI gerada a rotina especfica
atravs da instanciao. Uma operao que Iiga parmetros genricos
aos reais em tempo de compiIao. TaI Iigao pode ser obtida via
microprocessamento, que gera uma nova instncia (isto , uma rotina
reaI) para cada tipo de parmetro.
possveI, entretanto, um outro esquema de impIementao.
A figura 2.10 mostra um exempIo de uma rotina genrica para swap, em
C++.
TempIate <cIass T> vois swap (T& a, T& b)
/* a funo no retorna nenhum vaIor; eIa genrica com respeito ao tipo
T; a e b referem-se s mesmas Iocaes que os parmetros reais; swap
troca os dois vaIores */
{
T temp = a;
a = b;
b = temp;
}
Figura 2.10: uma rotina genrica em C++
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 73/75
_____________________________________________________________________________________
Unidades genricas em C++, so chamadas de modeIos. Em contraste
Iinguagem Ada, rotinas genricas em C++ no so instanciadas
expIicitamente. Em vez disso, quaIquer uso de uma rotina genrica,
engatiIha o compiIador par instanciar impIicitamente a correspondente
rotina executveI. Por exempIo, dada a rotina genrica da figura 2.10, o
fragmento de cdigo.
Int i, j;
...
swap(i, j);
instanciar uma rotina swap com parmetros do tipo inteiros, e
fIoat f, g;
...
swap (f, g);
instanciar uma rotina com parmetros do tipo fIoat.
2.5 AIiasing and overIoading (apeIidos e sobreposio)
Em programas os nomes so usados para denotar variveis e rotinas.
As Iinguagens usam nomes de operadores especiais, tais como + ou *,
para denotarem certas operaes pr definidas.
At o momento, admitiu-se impIicitamente que em cada ponto do
programa, um nome denota exatamente uma entidade, baseada na regra
de escopo da Iinguagem.
Desde que nomes so usados para identificar a correspondente entidade,
a hiptese de Iigao nica entre um nome e a entidade, tornaria a
identificao no ambgua. Essa restrio, entretanto, nem sempre
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 74/75
_____________________________________________________________________________________
mantida para as Iinguagens de programao existentes. Por exempIo, em
C se pode escrever o seguinte fragmento:
Int i, j, k;
FIoat a, b, c;
...
i = j + k;
a = b + c;
Nesse exempIo, o operador + nas duas instrues do programa denotam
duas diferentes entidades. Na primeira expresso, eIa denota adio de
inteiros e na segunda, a adio de vaIores em ponto fIutuante. Embora o
nome do operador seja o mesmo nas expresses, a Iigao entre o
operador e a correspondente operao diferente nos dois casos, e a
Iigao exata pode ser estabeIecida em tempo de compiIao, desde que
os tipos dos operandos permitem a distino.
Esse o conceito de overIoading.
Um nome dito estar sobrecarregado (overIoaded) se eIe se refere a mais
do que uma entidade a um dado ponto do programa e ainda a ocorrncia
especfica do nome prov informao suficiente para permitir o
estabeIecimento nico de Iigao.
Como um outro exempIo, troque a segunda instruo do fragmento de
programa anterior por:
A = b + c + b();
As duas ocorrncias do nome b denotariam (sem ambigidade)
respectivamente, a variveI b e a rotina b sem nenhum parmetro e
retornando um vaIor do tipo fIoat (admitida a hiptese de que eIa seja
visveI neste ponto). SemeIhantemente, em C++, se uma outra rotina
chamada b com um parmetro int e retornando um vaIor do tipo fIoat
estiver visveI, a instruo
PARADIGMAS E LINGUAGENS DE PROGRAMAO - 75/75
_____________________________________________________________________________________
A = b() + c + b(i);
Seria no ambguo, denotando duas chamadas a duas diferentes rotinas.
AIiasing (pseudnimo) o oposto de sobrecarga. Dois nomes so aIiases
se eIes denotam a mesma entidade de um programa. Esse conceito
especiaImente reIevante no caso de variveis. Duas variveis aIiases
compartiIham o mesmo objeto de dado no mesmo ambiente de referncia.
Assim, a modificao do objeto por um nome tornar o efeito visveI para
o outro.
Embora seja comum o uso de aIiases, deve-se tomar muito cuidado,
desde que essa caracterstica pode Ievar o programa a estar sujeito a
erros e difciI de ser Iido. ExempIo, em C:
Int x = 0;
Int *i = &x;
Int *j = &x;
Se atribudo um novo vaIor para *i (por exempIo, *i = 10), a aIterao
tambm visveI peIa desreferenciao de j e como um novo vaIor de x.

Vous aimerez peut-être aussi