Você está na página 1de 26

Captulo I Introduo

!
"

# $%
&

Uma Linguagem de Programao (LP) um instrumento utilizado pelo


profissional de computao para escrever programas, isto , conjuntos de
instrues a serem seguidas pelo computador para realizar um determinado processo.
Em virtude das limitaes fsicas dos computadores e da pouca maturidade da cincia da computao na poca de surgimento dos primeiros computadores, eles s podiam ser programados atravs de linguagens de programao muito simples. Tais linguagens disponibilizavam um pequeno
conjunto de tipos de instrues capazes de realizar aes muito elementares e se caracterizavam por serem de uso exclusivo de um computador
especfico. Por conta disso, hoje elas so conhecidas como linguagem de
mquina ou de baixo nvel.
medida que a computao avanava e se vislumbrava o potencial dessa
nova ferramenta, as aplicaes iam se tornando cada vez mais complexas.
Nessa poca, foi constatado que o uso de linguagens to simples e especficas reduzia significativamente a produtividade dos programadores e impedia a ampla disseminao dos computadores. Para contornar esse problema, surgiram as linguagens de programao de alto nvel. Em contraste com as linguagens de mquina, essas linguagens se caracterizam por
no serem especficas para um computador e por terem um conjunto mais
amplo e expressivo de tipos de instruo.
O enfoque desse livro no estudo dessas linguagens. Dessa maneira,
sempre que for utilizado o termo linguagem de programao, estaremos
nos referindo a uma linguagem de programao de alto nvel.
Para que os programadores possam construir programas em uma determinada linguagem necessrio definir os smbolos que podem ser utilizados
e a forma como devem ser combinados para produzir um programa vlido. Alm disso, os programadores tambm precisam entender como um
programa vlido ser executado pelo computador.
Embora existam inmeras linguagens de programao, cada qual com seu
prprio conjunto de smbolos e regras para formao e interpretao de
programas, possvel e interessante estud-las focando os principais con1

ceitos que lhes so comuns e esclarecendo como eles podem ser utilizados na programao e como podem ser implementados nas linguagens.
Conceitos relevantes e especficos existentes em uma linguagem particular tambm devem ser compreendidos pois podem ser um instrumento
valioso para melhor entendimento de uma tcnica de programao ou para futuras evolues e novos projetos de linguagens.
Para tornar o aprendizado de um conceito mais efetivo, importante que
ele seja utilizado na construo de um programa em uma linguagem de
programao que oferea recursos para utilizao do conceito. As trs
linguagens (C, C++ e JAVA), que so usadas primordialmente nos exemplos deste texto, oferecem recursos para a programao da grande maioria
dos conceitos abordados aqui.
O estudo e a discusso sobre as caractersticas e os mecanismos existentes
em linguagens de programao requer entendimento sobre as propriedades desejveis em uma linguagem de programao, os papis que podem
ser exercidos pela linguagem e o contexto no qual seu projeto foi realizado.
Nesse captulo apresentada uma introduo ao estudo de Linguagens de
Programao. So discutidas as razes para se conhecer profundamente
esse tema, o papel das linguagens de programao no processo de desenvolvimento de programas e as principais propriedades desejveis em linguagens de programao. Em seguida, so apresentadas noes importantes sobre a especificao, implementao e padronizao de uma linguagem. Cada um dos paradigmas mais comuns de linguagens de programao so brevemente abordados. Por fim, discutida a evoluo e histria
dessas linguagens.
1.1 Razes para Estudar Linguagens de Programao
Embora qualquer programador reconhea que linguagens de programao
so instrumentos fundamentais dentro de sua especialidade, importante
destacar quais so os benefcios que um estudo aprofundado de Linguagens de Programao pode proporcionar ao estudante. Esses benefcios
so apresentados a seguir:
a) Maior capacidade de desenvolver solues computacionais para problemas. Uma maior compreenso sobre os conceitos de uma LP pode
aumentar nossa habilidade em como pensar e resolver problemas. Por
exemplo, o conhecimento do conceito de tipos abstratos de dados estimulam a utilizao desse mtodo de programao mesmo em LPs
que no possuem mecanismos especficos para a sua implementao.

b) Maior habilidade ao usar uma LP. O maior entendimento a respeito


das funcionalidades e implementao de uma LP possibilita ao programador construir programas melhores e mais eficientes. Por exemplo, conhecendo como as LPs so implementadas pode-se entender
porque algoritmos recursivos so menos eficientes que os iterativos
correspondentes.
c) Maior capacidade para escolher LPs apropriadas. Conhecer os recursos oferecidos por uma linguagem e saber como esses recursos so
implementados pode determinar uma boa escolha da linguagem de
programao a ser usada em um projeto. Por exemplo, saber que C
no realiza checagem dinmica dos ndices de acessos a posies de
vetores pode ser decisivo para escolher essa linguagem em aplicaes
de tempo real que fazem uso frequente de acessos vetoriais.
d) Maior habilidade para aprender novas LPs. Por exemplo, programadores que aprenderam os conceitos de orientao a objetos tem maior facilidade para aprender C++ e JAVA.
e) Maior habilidade para projetar novas LPs. Muito embora poucos profissionais de computao tenham a oportunidade, ao longo de suas carreiras, de participar da criao de uma linguagem de programao de
propsito geral, no raro se depararem com situaes nas quais necessrio projetar linguagens para um propsito especfico. Por exemplo, ao construir as interfaces com o usurio de sistemas pode ser necessrio projetar e implementar uma linguagem de comandos para
comunicao entre o usurio e o sistema.
1.2 O Papel das Linguagens de Programao no Processo de
Desenvolvimento de Software
Linguagens de programao foram criadas para tornar mais produtivo o
trabalho dos programadores. Logo, em ltima instncia, o objetivo das
linguagens de programao tornar mais efetivo o processo de desenvolvimento de software. importante enfatizar que esse processo existe tanto para tornar mais produtiva a gerao e manuteno de software quanto
para garantir que ele seja produzido atendendo a padres de qualidade.
Assim, uma maneira de saber como as linguagens de programao podem
apoiar esse processo envolve o conhecimento das propriedades requeridas
em um software de qualidade. As principais propriedades desejadas em
um software so confiabilidade, manutenibilidade e eficincia.
A confiabilidade diz respeito ao atendimento adequado da especificao
funcional, da garantia de segurana contra erros e da integridade dos dados manipulados pelo software. Uma LP pode promover a confiabilidade
3

de programas facilitando a existncia de ferramentas computacionais que


verifiquem a ocorrncia de erros nos programas. Por exemplo, LPs que
requerem a declarao de variveis, tais como C, PASCAL, e MODULA2, facilitam a identificao de erros de digitao de nomes. Caso um usurio digite um nome incorreto, um verificador de erros pode identific-lo
porque no foi declarado.
A manutenibilidade diz respeito a facilidade de alterao do software.
Necessidades de modificao so provenientes de erros de especificao,
projeto ou implementao, de alteraes no ambiente tecnolgico onde o
software executado e de novas demandas do usurio. Uma LP pode
promover a manutenibilidade de programas fornecendo mecanismos que
permitam a sua adaptao a diferentes contextos. Por exemplo, a declarao de constantes em Pascal e Modula-2 facilita a realizao de modificaes nos programas. Caso um programa utilize uma constante para definir
o tamanho mximo de um vetor, basta modificar essa constante para adaptar todo o programa a um aumento no tamanho mximo do vetor.
A eficincia diz respeito ao uso otimizado dos recursos computacionais
em termos de tempo de execuo, de espao de memria utilizado e de
uso de dispositivos perifricos. Uma LP pode promover a eficincia de
programas incentivando o uso de mecanismos computacionalmente eficientes. Por exemplo, FORTRAN (com exceo de FORTRAN 90) no
permite o uso de recurso para tornar mais eficiente o processamento e o
consumo de memria.
Outro modo de saber como as linguagens de programao podem apoiar o
processo de desenvolvimento de software conhecendo como ele realizado. O processo de desenvolvimento de software normalmente compreendido em cinco etapas [PRESSMAN, 1997]:
1.2.1 Especificao de Requisitos
Nessa etapa se identifica o que o software dever realizar em termos de
funcionalidades. necessrio especificar o ambiente no qual o software
atuar, quais sero as suas atividades, quais os impactos que dever produzir e de que maneira ele dever interagir com os usurios. Em particular, dever-se- especificar os requisitos de desempenho do sistema em
termos de tempo de resposta desejado, espao de memria requerido e
tambm de interao com outros dispositivos e usurios.
Outra atividade importante nessa etapa a realizao de um estudo de
viabilidade e custo do software a ser desenvolvido. Esse estudo tem por
objetivo responder se a confeco e implantao do software vivel tcnica, cronolgica e socialmente, bem como determinar, atravs da estimativa do custo de desenvolvimento do software, se a sua construo vi4

vel economicamente. A confeco de verses dos manuais do usurio do


software tambm uma atividade desta etapa.
O estudo de linguagens de programao influencia pouco a realizao
dessa etapa. Basicamente, o conhecimento sobre linguagens de programao pode ser usado no estudo de viabilidade para ajudar a responder se
possvel desenvolver o software no perodo de tempo desejado.
1.2.2 Projeto do Software
Tendo por base os documentos de especificao de requisitos, pode-se
projetar o sistema de programao. O projeto envolve a escolha de um
mtodo de projeto e sua aplicao na especificao da arquitetura do
software e seus procedimentos, das suas estruturas de dados e de suas interfaces.
O resultado desta fase um documento de especificao do projeto do
sistema, identificando todos os mdulos que compem a arquitetura do
sistema, as estruturas de dados utilizadas por cada mdulo, as interfaces
de comunicao entre mdulos (interfaces internas), com outros sistemas
(interfaces externas) e com as pessoas que o utilizam (interface com o
usurio). Tambm faz parte desse documento as descries procedimentais de cada mdulo da arquitetura.
O principal papel das LPs nessa etapa dar suporte ao mtodo de projeto.
Isto possibilita que a implementao de um sistema reflita o seu projeto,
evitando adaptaes e distores no projeto e perda de correspondncia.
Pode-se observar que algumas linguagens de programao so mais adequadas quando se utilizam certos mtodos de projeto. Por exemplo, enquanto C mais adequada ao mtodo de projeto hierrquico-funcional,
JAVA mais adequada ao mtodo orientado a objetos.
Existem vrias ferramentas CASE que oferecem suporte s atividades
dessa etapa. Muitas dessas ferramentas j geram parte da codificao do
software em uma LP.
1.2.3 Implementao
A etapa de implementao onde ocorre a programao dos mdulos do
software. Obviamente, LPs so essenciais nessa etapa uma vez que os
programas devem ser escritos em uma linguagem. Essa etapa a mais
atendida por ferramentas, tais como editores de texto que destacam os
vocbulos da linguagem e identam automaticamente o texto, analisadores
lxicos, sintticos e semnticos de programas e bibliotecas de subprogramas e mdulos.

1.2.4 Validao
O propsito dessa etapa verificar se o sistema satisfaz as exigncias das
especificaes de requisitos e de projeto. Geralmente, isto feito testando-se o sistema contra as especificaes. Existem trs tipos de testes: teste de mdulo, teste de integrao e teste de sistema. No teste de mdulo
verificado se ele cumpre o que lhe foi especificado. No teste de integrao verificado se os mdulos se integram apropriadamente, isto , se
eles interagem tal como estabelecido nas especificaes de suas interfaces. O teste de sistema averigua se o software cumpre as funcionalidades
para o qual foi desenvolvido e atende a todos os demais requisitos de usabilidade e eficincia.
LPs podem auxiliar a validao de vrios modos. Por exemplo, a natureza
de algumas linguagens facilita a construo de depuradores de erros e
ambientes nos quais fcil executar mdulos de programa independentemente da existncia de outros mdulos. Isso pode ser muito valioso para
realizar os testes de mdulo e integrao.
1.2.5 Manuteno
A ltima etapa do processo de desenvolvimento de software a manuteno e evoluo do sistema. Para que o ciclo de vida de um software possa
ser ampliado necessrio que ele seja capaz de facilitar a correo de erros residuais (isto , erros descobertos aps a sua liberao para o usurio), adaptar-se a mudanas no seu contexto de aplicao (tal como, um
novo ambiente computacional) e atender a demandas por melhoria e incluso de servios.
LPs que oferecem recursos de modularizao tendem a gerar programas
mais fceis de serem mantidos uma vez que as alteraes em um mdulo
no interferem nos demais mdulos constituintes do software.
1.3 Propriedades Desejveis em uma Linguagem de Programao
A partir da chamada crise do software [PRESSMAN, 1997], o aproveitamento do tempo do profissional de programao se tornou um conceito
central no processo de desenvolvimento de software. Consequentemente,
as propriedades desejveis nas LPs devem enfatizar esse aspecto. Discutem-se a seguir algumas das principais propriedades desejveis em uma
LP:

1.3.1 Legibilidade
Essa propriedade diz respeito facilidade para se ler e entender um programa. Quanto mais fcil for seguir as instrues de um programa, mais
fcil ser entender o que est sendo feito e tambm descobrir erros de
programao.
LPs que requerem o uso extensivo do comando goto normalmente reduzem a legibilidade dos programas porque permitem a ocorrncia da chamada programao macarrnica ou no estruturada. Nesse tipo de programao, os programas possuem fluxo de controle que no obedecem a
padres regulares. Isto torna difcil acompanhar e entender o que fazem
esses programas. Programas em verses antigas de FORTRAN e BASIC,
por exemplo, tendiam a ser mal estruturados porque estas verses requeriam o uso de goto para implementar as estruturas de seleo e repetio.
O uso de um mesmo vocbulo da LP para denotar diferentes comportamentos dependendo do contexto onde usado tambm prejudicial legibilidade. Por exemplo, o vocbulo this pode ser usado em JAVA tanto
para referenciar um objeto quanto para fazer uma chamada a uma funo
construtora de dentro de outra. Outro exemplo o operador * em C, que
tanto pode denotar a operao de multiplicao de nmeros quanto operaes de manipulao de ponteiros. Isso permite a criao de expresses
confusas. Por exemplo, a seguinte linha de cdigo C apresenta o uso do
operador * em trs diferentes contextos:
*p = (*p)*q;
Observe que a operao designada pelo * mais a direita nessa linha de
cdigo a operao de multiplicao. Por sua vez, a operao designada
pelo * do meio a de retorno do contedo da clula de memria apontada
pelo ponteiro p. Por fim, o * mais esquerda denota a operao de retorno do endereo da clula apontada por p.
Efeitos colaterais so mudanas adicionais promovidas no estado do programa (isto , nos valores das variveis do programa) durante a avaliao
de uma determinada de expresso ou a execuo de um comando ou subprograma. O termo adicionais se refere ao fato das mudanas provocadas
pelos efeitos colaterais no serem o objetivo principal da expresso, comando ou subprograma realizado. Por exemplo, a operao x++ de C tem
como efeito principal retornar o valor da varivel x e como efeito colateral incrementar o valor dessa varivel. Efeitos colaterais podem ser prejudiciais a legibilidade quando seus resultados no ficam explcitos no trecho de programa que utiliza a operao. Observe no exemplo 1.1, em C,
que a chamada da funo retornaCinco provoca alterao na varivel
global x.
7

int x = 1;
int retornaCinco() {
x = x + 3;
return 5;
}
main() {
int y;
y = retornaCinco ();
y = y + x;
}
Exemplo 1. 1- Problema de Legibilidade Causado por Efeito Colateral em C

Note que esse efeito no fica explcito no trecho de cdigo que chama
retornaCinco. Algum que fizesse uma rpida inspeo no cdigo do exemplo 1.1 tentando identificar o que o programa faz e apenas olhasse a
funo main no conseguiria entender que o valor final de y nove e no
seis. Efeitos colaterais podem causar problemas ainda mais graves do que
o de legibilidade (por exemplo, podem causar indeterminismo na expresso x + retornaCinco())1.1.
Marcadores de blocos de comandos, tais como o BEGIN({)END(}) de
PASCAL e C, tambm podem causar confuses na leitura do programa
quando existem vrios comandos de repetio e seleo aninhados. A inexistncia de um marcador especfico que indique onde o comando if de
C se encerra possibilita a escrita de comandos ifs aninhados difceis de
serem entendidos. No exemplo 1.2, embora o else pertena ao if mais interno, tem-se a impresso que ele se refere ao if mais externo.
if (x>1)
if (x==2)
x=3;
else
x=4;
Exemplo 1. 2 Problema de Legibilidade Relacionado com Marcadores de Bloco

ADA reduz este problema usando beginendif e beginendloop.


Algumas LPs adotaram posturas altamente questionveis com relao
legibilidade. FORTRAN, por exemplo, permite que palavras reservadas
como DO, END, INTEGER e REAL sejam tambm nomes de variveis.

1.1

Esse problema ser discutido em maiores detalhes no captulo 5 desse livro.

1.3.2 Redigibilidade
Essa propriedade possibilita ao programador se concentrar nos algoritmos
centrais do programa, sem se preocupar com aspectos no relevantes para
a resoluo do problema. Esta caracterstica a que melhor diferencia as
linguagens de mquina (nas quais o programador deve se preocupar principalmente com detalhes de implementao) e linguagens de programao (nas quais o programador se concentra na descrio do algoritmo que
resolve o problema).
LPs com tipos de dados limitados requerem o uso de estruturas complexas. Isto acaba dificultando a redao de programas. Por exemplo, como
FORTRAN no possui registros, armazenar dados de empregados de uma
firma requer a criao de vetores especficos para cada tipo de dado. Ao
redigir um subprograma para ordenar os dados seria necessrio usar vrias instrues para trocar os elementos correspondentes em cada vetor.
LPs que requerem muita programao de entrada e sada e que no dispem de mecanismos para o tratamento de erros tendem a obscurecer os
algoritmos centrais nos programas.
A redigibilidade de programas pode conflitar com a legibilidade. C permite a redao de comandos complexos, mas que podem no identificar
de maneira muito clara a sua funcionalidade. Observe o comando for do
exemplo 1.3 e tente identificar o que ele faz.
void f(char *q, char *p) {
for (;*q=*p; q++,p++);
}
Exemplo 1. 3 - Redigibilidade X Legibilidade

fcil perceber o quo concisa essa implementao. Contudo, o preo a


ser pago a falta de entendimento imediato sobre sua funcionalidade.
Programadores inexperientes encontraro dificuldades para entender o
que esse comando faz, enquanto programadores experientes podero se
confundir ao fazer uma rpida leitura.
1.3.3 Confiabilidade
Essa propriedade se relaciona aos mecanismos fornecidos pela LP para
incentivar a construo de programas confiveis.
LPs que requerem a declarao de dados permitem verificar automaticamente erros de tipos durante compilao ou execuo. Um compilador de
JAVA pode detectar durante a compilao um erro de digitao cometido

por um programador em situaes como a do exemplo 1.4, onde o v foi


inadvertidamente trocado por u no trecho v = u + 2; :
boolean u = true;
int v = 0;
while (u && v < 9) {
v = u + 2;
if (v == 6) u = false;
}
Exemplo 1. 4 Declarao de Tipos e Confiabilidade

LPs que possuem mecanismos para detectar eventos indesejveis e especificar respostas adequadas a tais eventos permitem a construo de programas mais confiveis. No trecho de cdigo em JAVA, apresentado no
exemplo 1.5, poder haver um erro se o valor de i estiver fora dos limites
de ndices do vetor a. Caso isto ocorra, o programa interrompe seu fluxo
normal de execuo e passa para o trecho de cdigo responsvel pelo tratamento desse erro.
try {
System.out.println(a[i]);
} catch (IndexOutofBoundsException) {
System.out.println(Erro de Indexao);
}
Exemplo 1. 5 - Tratamento de Excees e Confiabilidade

1.3.4 Eficincia
De acordo com as demandas por recursos de um tipo de aplicao, certas
LPs so mais recomendadas e outras no devem ser usadas. Aplicaes
de automao em tempo real, por exemplo, normalmente requerem o uso
de LPs que minimizem o tempo de execuo e de acesso aos dispositivos
perifricos, bem como o consumo de espao de memria.
Muito embora, hoje, boa parte da responsabilidade em gerar cdigo eficiente seja transferida para o compilador, atravs da otimizao automtica
de cdigo, as caractersticas de uma LP podem determinar se o programa
gerado naquela LP ser mais ou menos eficiente. Assim, LPs que requerem a verificao de tipos durante a execuo so menos eficientes do
que aquelas que no fazem este tipo de requisio.
Por exemplo, o mecanismo de tratamento de excees existente em JAVA impem que os ndices de vetores sejam verificados em todos os acessos durante a execuo dos programas. Isso implica na necessidade de
se fazer um teste antes de qualquer acesso aos vetores. Por outro lado,
10

como C no faz esse tipo de exigncia, o cdigo gerado economizar a


realizao desse teste e, portanto, ser mais veloz.
1.3.5 Facilidade de aprendizado
O programador deve ser capaz de aprender a linguagem com facilidade.
LPs com muitas caractersticas e mltiplas maneiras de realizar a mesma
funcionalidade, tal como C++, tendem a ser mais difceis de aprender.
Por exemplo, num determinado contexto, os seguintes comandos em C ou
C++, tm o mesmo efeito:
c = c + 1;

c+=1;

c++;

++c;

Alm disso, outro aspecto negativo causado pelo excesso de caractersticas o fato de levar os programadores a conhecerem apenas uma parte da
linguagem, o que torna mais difcil a um programador entender o cdigo
produzido por outro.
1.3.6 Ortogonalidade
Ortogonalidade diz respeito capacidade da LP permitir ao programador
combinar seus conceitos bsicos sem que se produzam efeitos anmalos
nessa combinao. Assim, uma LP to mais ortogonal quanto menor for
o nmero de excees aos seus padres regulares.
LPs ortogonais so interessantes porque o programador pode prever, com
segurana, o comportamento de uma determinada combinao de conceitos. Isso pode ser feito sem que se tenha de implementar testes para averiguao do uso combinado de dois ou mais conceitos, ou mesmo buscar
na especificao da LP se existe alguma restrio quela combinao.
A falta de ortogonalidade, por sua vez, dificulta o aprendizado da LP e
pode estimular a ocorrncia de erros de programao. No exemplo 1.6
mostrada a falta de ortogonalidade de um cdigo JAVA:
int x, y = 2, z = 3;
byte a, b = 2, c = 3;
x = y + z;
a = b + c;
Exemplo 1. 6 - Falta de Ortogonalidade em JAVA

Embora tanto o tipo int quanto o tipo byte sejam tipos inteiros, a linha de
cdigo onde ocorre a soma de tipos int legal enquanto a que soma tipos
byte ilegal (tente descobrir porqu). Ora, essa falta de ortogonalidade
claramente uma fonte potencial de erros, uma vez que a maioria dos
11

programadores pensaria que a mesma regra que se aplica ao tipo int se


aplicaria aos outros tipos de inteiros.
Outro exemplo clssico de falta de ortogonalidade ocorre em PASCAL.
Nessa LP, funes podem retornar qualquer tipo de dados com exceo
de registros e vetores.
1.3.7 Reusabilidade
Outra propriedade desejvel em LPs a reusabilidade de cdigo, isto , a
possibilidade de reutilizar o mesmo cdigo para diversas aplicaes.
Quanto mais reusvel for um cdigo, maior ser a produtividade de programao, uma vez que, na construo de novos programas, bastar utilizar e, eventualmente, adaptar cdigos escritos anteriormente sem que se
faa necessrio reconstru-los novamente a partir do zero.
LPs podem incentivar a criao de cdigo reusvel de vrias maneiras. A
forma mais simples de facilitar a reusabilidade atravs da parametrizao de subprogramas. Por exemplo, o subprograma em C apresentado no
exemplo 1.7 pode ser utilizado em qualquer aplicao na qual se queira
trocar os valores de duas variveis inteiras quaisquer.
void troca (int *x, int *y) {
int z = *x;
*x = *y;
*y = z;
}
Exemplo 1. 7 - Reuso por Parametrizao de Subprogramas

Outro mecanismo muito til para permitir o reuso de cdigo a modularizao atravs das bibliotecas de subprogramas. A linguagem C oferece
inmeras funes de entrada e sada (tais como, printf, scanf e fprintf)
como parte de sua biblioteca padro. Essas funes podem ser usadas em
qualquer programa sem que o programador necessite reescrev-las.
1.3.8 Modificabilidade
Essa propriedade se refere s facilidades oferecidas pelas LPs para possibilitar ao programador alterar o programa em funo de novos requisitos
sem que tais modificaes impliquem em mudanas em outras partes do
programa.
Exemplos de mecanismos que proporcionam boa modificabilidade so o
uso de constantes simblicas e a separao entre interface e implementao na construo de subprogramas e tipos abstratos de dados.

12

Em C, vrias constantes simblicas so usadas, tais como NULL e EOF.


O comando seguinte cria uma constante simblica em C denotando o nmero pi com preciso de duas casas decimais.
const float pi = 3.14;
Se em algum momento for constatada a necessidade de maior preciso na
definio do nmero pi, basta fazer a alterao nessa mesma linha (incluindo mais casas decimais) e todas as ocorrncias da constante pi no programa sero ajustadas para o seu novo valor numrico, sem que seja necessrio realizar alteraes em outras partes do programa onde pi usado.
1.3.9 Portabilidade
altamente desejvel que programas escritos em uma LP se comportem
da mesma maneira independentemente da ferramenta utilizada para traduzir os programas para a linguagem de mquina ou da arquitetura computacional (hardware ou sistema operacional) sobre a qual esto sendo
executados.
Dessa maneira, um mesmo programa ou biblioteca pode ser utilizado em
vrios ambientes em diferentes situaes sem que seja necessrio dispender tempo de programao para reescrev-los ou adapt-los ao novo ambiente de traduo ou execuo.
LPs podem facilitar a obteno de programas portveis atravs da amarrao rigorosa do comportamento de seus elementos em tempo de projeto
da linguagem, no dando liberdade para que os implementadores definam
comportamentos distintos para um mesmo elemento.
Contudo, essa postura pode impor algumas restries implementao
das linguagens, em particular, no que diz respeito busca por eficincia
na execuo dos programas. Nesse caso, pode-se optar por sacrificar a
completa portabilidade dos programas na LP em benefcio da potencializao de outras propriedades. Mesmo assim, deve-se procurar maximizar
a portabilidade permitindo que os programas escritos na LP sejam transportados para outros ambientes requerendo apenas poucas modificaes
em seu cdigo.
1.4 Especificao de LPs
Ao se criar uma LP necessrio definir como se faz para escrever programas nessa linguagem e como os programas vlidos devem se comportar. Essa definio deve ser feita atravs de documentos descritivos que
estabeleam de maneira precisa como essas duas atividades devem ser
realizadas. Tais documentos formam a especificao da LP. Sem uma es13

pecificao apropriada, implementaes das LPs no podem ter uniformidade, fazendo com que programas construdos para uma implementao
tenham comportamento bem diferenciado ou mesmo no sejam vlidos
em outra implementao.
A especificao de uma LP requer a descrio de um lxico, de uma sintaxe e de uma semntica para a LP. O lxico da LP corresponde ao vocabulrio que pode ser utilizado para formar sentenas na linguagem.
A sintaxe da LP corresponde ao conjunto de regras que determinam quais
sentenas podem ser formadas a partir da combinao dos itens lxicos. O
lxico e sintaxe esto relacionados com a forma dos programas, isto ,
como expresses, comandos, declaraes e outros elementos da LP podem ser combinados para formar programas vlidos.
A semntica da LP descreve como as construes sintaticamente corretas
so interpretadas ou executadas. A semntica est relacionada com o significado dos programas, isto , como eles se comportam quando executados por computadores. Por exemplo, no comando seguinte, em C:
a = b;
O lxico da LP estabelece que a, =, b e ; fazem parte do vocabulrio
da LP.
A sintaxe da LP indica que a sentena formada pelo identificador a, o
smbolo =, o identificador b e o smbolo ; designa um comando vlido
de atribuio.
A semntica da LP indica que este comando deve ser executado de
modo a substituir o valor de a pelo valor atual de b.
A sintaxe de uma LP influencia como os programas so escritos pelo programador, lidos por outros programadores e analisados pelo computador.
A semntica de uma LP influencia como os programas so criados pelo
programador, entendidos por outros programadores e interpretados pelo
computador.
A sintaxe de uma LP descrita por uma gramtica. Uma notao muito
utilizada para descrever gramticas de LPs a BNF (Backus-Naur Form).
O exemplo 1.8 apresenta uma gramtica para formao de expresses aritmticas elementares, descrita em BNF:

<expresso> ::= <valor><valor><operador><expresso>


<valor> ::= <nmero><sinal><nmero>
<nmero> ::= <semsinal><semsinal>.<semsinal>
<semsinal> ::= <dgito><dgito><semsinal>
<dgito> ::= 0123456789
14

<sinal> ::= +
<operador> ::= +/*
Exemplo 1. 8 - Gramtica Simples

Recomenda-se descrever a semntica de uma LP formalmente. Contudo,


descries formais de semntica so freqentemente complexas para ler e
escrever. Como resultado, na maior parte das vezes, a semntica de LPs
descrita de maneira informal atravs de documentos que explicam em
linguagem natural qual o significado dos comandos da LP. Uma outra
abordagem muito adotada o enfoque operacional, que consiste em descrever o significado de um comando atravs da apresentao de um cdigo equivalente numa linguagem mais elementar.
Um problema que ocorre muito frequentemente com LPs a ausncia de
uma padronizao. Ao invs de se ter uma especificao nica adotada
por todos os implementadores de LPs, surgem vrias implementaes distintas com as suas prprias especificaes. Isso ocorre normalmente
quando a linguagem ainda no se encontra totalmente estabelecida. Assim, os implementadores discordam a respeito de quais elementos devem
fazer parte da linguagem e como eles devem se comportar. Muitas vezes
essa discordncia provocada pela necessidade de explorar as caractersticas especficas do ambiente onde a implementao ser realizada.
Contudo, na medida que a linguagem vai se popularizando e amadurecendo, essa variao de comportamentos acaba por gerar problemas significativos de portabilidade de programas.
Para resolver esses problemas, procura-se estabelecer uma especificao
padro nica que deve ser respeitada por todos os implementadores da
LP. Variaes podem at continuar a existir, mas um ncleo de elementos
comum necessita ser implementado para que a LP esteja em conformidadade com o padro estabelecido. Assim, os programadores podem escrever programas garantidamente portveis, desde que s utilizem os elementos padronizados.
Normalmente, a padronizao de uma LP promovida por alguma instituio especializada nesse servio, tais como a ISO (International Standards Organization), o IEEE (Institute of Electrical and Electronics Engineers), o ANSI (American National Standards Institute) e o NIST (National Institute for Standards and Technology). O processo de padronizao
envolve a formao de um grupo de voluntrios especialistas que trabalham para definir quais elementos devem fazer parte da padronizao.
Esse trabalho complexo e demorado, pois envolve a obteno de consenso entre os participantes do grupo de padronizao. Alm disso, o consenso geralmente obtido omitindo-se as caractersticas mais polmicas.
15

Outro problema a definio do momento de padronizao. Se muito cedo, a falta de experincia com a LP pode produzir um padro inadequado
que iniba o seu uso e disseminao. Se muito tarde, a existncia de muitas
verses incompatveis com um grande legado de cdigo pode dificultar
ou retardar a aceitao do padro pela comunidade.
1.5 Mtodos de Implementao de LPs
Todo e qualquer programa escrito em uma LP necessita ser traduzido para
a linguagem de mquina para ser executado. Para fazer isto necessrio
aplicar um programa (ou conjunto de programas) que receba como entrada o cdigo fonte do programa a ser traduzido e gere o cdigo traduzido
na linguagem de mquina. Esse programa tradutor quem determina como os programas na LP sero implementados, isto , como o cdigo fonte
traduzido se comportar efetivamente quando executado no computador.
Sebesta [SEBESTA, 1999] descreve trs mtodos gerais de implementao de LPs (ilustrados na figura 1.1).
Compilao
LP

Interpretao

Fonte LP
Compilao
L.M.

L.M.

Hbrido

Fonte LP

Fonte
Compilao

Interpretao

Cdigo
Intermedirio

Dados

Dados
Execuo

Execuo

Interpretao

L.M.
Dados

Execuo
Figura 1. 1 - Mtodos de Implementao de LPs

1.5.1 Compilao
O processo de compilao efetua a traduo integral do programa fonte
para o cdigo de mquina. Uma vez traduzido, o programa em linguagem
de mquina pode ser executado diretamente.
A grande vantagem desse mtodo de traduo a otimizao da eficincia na execuo dos programas. A execuo rpida porque no se ne16

cessita fazer qualquer traduo durante a execuo e porque boa parte das
verificaes de erros j podem ser efetuadas durante a traduo. Alm
disso, o prprio tradutor tem mais liberdade para realizar otimizaes na
gerao do cdigo executvel, uma vez que pode considerar o cdigo fonte globalmente.
Uma outra vantagem do processo de compilao requerer apenas o cdigo executvel para que o programa possa ser executado. Assim, no
necessrio possuir o cdigo fonte do programa para sua execuo.
A principal desvantagem do mtodo de compilao a no portabilidade
do cdigo executvel para mquinas com arquitetura diferenciada daquela
na qual ele foi compilado. Por exemplo, um programa em C compilado
sobre o ambiente Linux no executado sobre o ambiente Windows e
vice-versa.
Outro problema se refere depurao. Uma vez que o cdigo executvel
normalmente no guarda referncias ao texto do cdigo fonte, qualquer
indicao de erro de execuo no pode ser devidamente identificada com
a informao do nome da varivel envolvida no erro ou da linha correspondente no cdigo fonte que ocasiona o erro. importante mencionar,
no entanto, que existem sistemas de desenvolvimento de programas que
permitem a depurao de programas compilados. Esses sistemas mantm
uma correspondncia entre o cdigo compilado e o cdigo fonte para poder realizar a execuo passo a passo do cdigo, inspeo de valores de
variveis durante a execuo e prestar informaes referentes ao cdigo
fonte sobre um eventual erro de execuo.
1.5.2 Interpretao pura
No processo de interpretao pura, um programa interpretador age como
um simulador de um computador virtual que entende as instrues da LP.
Basicamente, cada instruo do cdigo fonte traduzida para a linguagem
de mquina quando essa instruo necessita ser executada. Imediatamente
aps a traduo, o cdigo gerado executado. Deste modo, em contraste
com a compilao, a traduo e a execuo de programas interpretados
podem ser vistos como um processo nico, no existindo etapas separadas
de traduo e de execuo.
A interpretao pura apresenta como vantagens: a facilidade para prototipao, visto que se pode executar comandos e partes do programa assim
que so construdos, verificando se atuam corretamente; a facilidade de
depurao, visto que as mensagens de erro podem se referir diretamente
ao cdigo fonte; e a facilidade de escrever programas mais flexveis, visto
que o interpretador da LP est presente durante a execuo (permitindo,

17

por exemplo, a execuo de trechos de programas criados, alterados ou


obtidos durante a prpria execuo).
A grande desvantagem da interpretao pura em relao compilao a
execuo muito mais lenta do programa. A razo para essa lentido decorre da necessidade do interpretador decodificar comandos complexos
da LP, verificar erros do programa e gerar cdigo em linguagem de mquina durante a prpria execuo do programa. Alm disso, enquanto na
compilao os comandos internos de uma repetio s necessitam ser traduzidos e verificados uma nica vez, na interpretao pura, de modo geral, esse processo se repete para cada ciclo de execuo da repetio.
Outra desvantagem o maior consumo de espao de memria, pois devem ser mantidos em memria uma tabela de smbolos, o cdigo fonte e
o prprio programa interpretador.
1.5.3 Hbrido
Processo que combina tanto a execuo eficiente quanto a portabilidade
de programas atravs da aplicao combinada dos dois mtodos anteriores. A base para o mtodo hbrido a existncia de um cdigo intermedirio, mais fcil de ser interpretado e, ao mesmo tempo, no especfico de
uma plataforma computacional. O mtodo hbrido dividido, portanto,
em duas etapas: compilao para um cdigo intermedirio e interpretao
deste cdigo.
Embora ainda de execuo mais lenta que o cdigo compilado, a interpretao do cdigo intermedirio muito mais rpida que a interpretao
pura do cdigo fonte porque as instrues do cdigo intermedirio so
muito mais simples que as do cdigo fonte e porque a maior parte das verificaes de erro realizada j na etapa de compilao.
Por sua vez, como o cdigo intermedirio no especfico para uma plataforma, os programas j compilados para este cdigo podem ser portados
para as mais diferentes plataformas sem necessidade de adaptao ou
mesmo recompilao, bastando que exista um interpretador do cdigo
intermedirio instalado na plataforma onde se deseja executar o programa.
JAVA adota o mtodo hbrido. O cdigo intermedirio chamado de bytecode. O interpretador de bytecode a JVM (JAVA Virtual Machine).
Cada plataforma computacional necessita possuir a sua prpria JVM para
que o programa em bytecode possa ser executado.

18

1.6 Paradigmas de LPs


D-se o nome de paradigma a um conjunto de caractersticas que servem
para categorizar um grupo de linguagens. Existem diversas classificaes
de paradigmas de LPs, sendo a mais comum a que divide os paradigmas
de LPs nos paradigmas imperativo, orientado a objetos, funcional e lgico. A classificao utilizada aqui adapta a proposta apresentada por Appleby [APPLEBY, 1991]. As nicas alteraes realizadas nessa classificao so a substituio do termo distribudo pelo termo, mais genrico,
concorrente e a remoo do paradigma de linguagens de bancos de dados.
A figura 1.2 ilustra a classificao adotada aqui:
Paradigmas

Imperativo

Estruturado

Orientado
a Objetos

Declarativo

Concorrente

Funcional

Lgico

Figura 1. 2 - Paradigmas de LPs

Nessa classificao os paradigmas so subdivididos em duas categorias


principais: imperativo e declarativo.
1.6.1 Paradigma Imperativo
O paradigma imperativo engloba os paradigmas baseados na idia de
computao como um processo que realiza mudanas de estados. Nesse
sentido, um estado representa uma configurao qualquer da memria do
computador. Programas de LPs que so includas nesse paradigma especificam como uma computao realizada atravs de uma sequncia de
alteraes no estado da memria do computador.
O foco dos programas no paradigma imperativo se encontra em especificar como um processamento deve ser feito no computador. Os conceitos
fundamentais so de varivel, valor e atribuio. Variveis so vistas como sendo um conjunto de clulas de memria. Elas possuem um valor
associado em um determinado instante do processamento e podem ter seu
valor modificado atravs de operaes de atribuio.

19

O paradigma imperativo subdividido nos paradigmas estruturado, orientado a objetos e concorrente.


1.6.1.1 O Paradigma Estruturado
As primeiras LPs foram fortemente influenciadas pela programao em
linguagem de mquina. Esse tipo de programao se caracterizava pela
existncia de uma sequncia monoltica de comandos e pelo uso de desvios condicionais e incondicionais para determinar o fluxo de controle da
execuo do programa.
Logo se percebeu que esse estilo de programao estimulava a ocorrncia
de erros e reduzia a produtividade do programador. Para contornar essa
dificuldade surgiu a programao estruturada. Esse tipo de programao
se baseia na idia de desenvolvimento de programas por refinamentos
sucessivos (top-down). A programao estruturada consegue organizar
o fluxo de controle de execuo dos programas desestimulando o uso de
comandos de desvio incondicional e incentivando a diviso dos programas em subprogramas e em blocos aninhados de comandos. PASCAL e
C so linguagens que adotam o paradigma estruturado.
1.6.1.2 O Paradigma Orientado a Objetos
Com o avano da computao, os sistemas de software tm se tornado
cada vez maiores e mais complexos. O paradigma orientado a objetos oferece conceitos que objetivam tornar mais rpido e confivel o desenvolvimento desses sistemas.
Enquanto as linguagens que adotam o paradigma estruturado enfocam as
abstraes de controle de execuo dos programas, as linguagens que adotam o paradigma orientado a objetos enfocam as abstraes de dados
como elemento bsico de programao. Classes so abstraes que definem uma estrutura de dados e um conjunto de operaes que podem ser
realizadas sobre elas, chamadas mtodos. Objetos so instncias de classes. Outros conceitos importantes nesse paradigma so a herana e o polimorfismo.
Por utilizarem os conceitos do paradigma estruturado na especificao
dos mtodos, o paradigma orientado a objetos pode ser considerado uma
evoluo do paradigma estruturado. SMALLTALK, C++ e JAVA so
linguagens que adotam o paradigma orientado a objetos.

20

1.6.1.3 O Paradigma Concorrente


A programao concorrente ocorre quando vrios processos executam
simultaneamente e concorrem por recursos. Sistemas concorrentes tm se
tornado cada vez mais usados. Eles podem utilizar uma nica unidade de
processamento ou vrias unidades em paralelo. Nesse ltimo caso as unidades de processamento podem estar localizadas em um mesmo computador ou distribudas entre vrios. Sistemas concorrentes tambm podem
compartilhar dados ou dispositivos perifricos.
O paradigma concorrente engloba linguagens que oferecem facilidades
para o desenvolvimento desses sistemas. ADA provavelmente a linguagem mais conhecida que oferece suporte a concorrncia.
1.6.2 Paradigma Declarativo
Em contraste com o paradigma imperativo, no qual os programas so especificaes de como o computador deve realizar uma tarefa, no paradigma declarativo os programas so especificaes sobre o que esta tarefa. No paradigma declarativo, o programador no precisa se preocupar
sobre como o computador implementado, nem sobre a maneira pela
qual ele melhor utilizado para realizar uma tarefa. A preocupao do
programador em descrever de forma abstrata a tarefa a ser resolvida.
Tipicamente, programas em linguagens declarativas so especificaes de
relaes ou funes. No existem atribuies a variveis dos programas
uma vez que as variveis declarativas so de fato incgnitas e no representam clulas de memria.
Os interpretadores ou compiladores das LPs declarativas gerenciam a
memria do computador, tornando transparente para o programador a necessidade de alocao e desalocao de memria.
1.6.2.1 O Paradigma Funcional
Linguagens funcionais operam apenas sobre funes, as quais recebem
listas de valores e retornam um valor. O objetivo da programao funcional definir uma funo que retorne um valor como a resposta do problema. Um programa funcional uma chamada de funo que normalmente chama outras funes para gerar um valor de retorno. As principais
operaes nesse tipo de programao so a composio de funes e a
chamada recursiva de funes. Outra caracterstica importante que funes so valores de primeira classe que podem ser passados para outras

21

funes. LISP, HASKELL e ML1.2 so exemplos de linguagens funcionais.


1.6.2.2 O Paradigma Lgico
Linguagens lgicas so normalmente baseadas em um subconjunto do
clculo de predicados. Um predicado define uma relao entre fatos ou
entre variveis. Um programa lgico composto por clusulas que definem predicados e relaes factuais. A caracterstica diferencial do paradigma lgico que a execuo dos programas corresponde a um processo
de deduo automtica.
Assim, quando uma questo formulada, um mecanismo de inferncia
tenta deduzir novos fatos a partir dos existentes para verificar a veracidade da questo. PROLOG o exemplo mais conhecido de linguagem que
adota o paradigma lgico.
1.7 Evoluo das LPs
Antes do surgimento das LPs, a programao de computadores era feita
exclusivamente em linguagem de mquina. Programadores tinham de conhecer profundamente a arquitetura da mquina onde o programa seria
executado, seu conjunto de instrues e sua forma de funcionamento.
Mesmo dominando todo esse conhecimento, a atividade de programao
era pouco produtiva porque as instrues das linguagens de mquina so
muito simples.
As primeiras LPs surgiram no final dos anos 50 e incio dos anos 60 para
facilitar o trabalho de programao. Por conta da cultura de programao
dessa poca e da limitao de recursos dos computadores, essas linguagens foram fortemente influenciadas pelas linguagens de mquina e pela
arquitetura de Von Neumman dos computadores. A eficincia computacional era o foco principal das LPs porque os recursos como memria e
processadores eram escassos. FORTRAN e COBOL so exemplos de linguagens que surgiram nessa poca.
Na medida que os recursos computacionais se desenvolviam, os computadores iam se tornando mais poderosos e teis. Novamente, a atividade
de programao se tornava um gargalo para a disseminao dos sistemas
computacionais. No final dos anos 60, as LPs passaram a enfocar a eficincia na produtividade dos programadores. Surgiram as LPs que enfatizavam a programao estruturada. PASCAL e C so exemplos de linguagens que surgiram nessa poca.
1.2

ML no considerada uma linguagem puramente funcional. Ela tambm possui caractersticas de


uma linguagem imperativa.

22

Com o aumento da complexidade dos sistemas computacionais, uma nova


tcnica de programao passou a ser o foco das LPs no final dos anos 70
e incio dos anos 80 - a abstrao de dados. Essas LPs enfocavam a construo modularizada de programas e bibliotecas e o conceito de tipos abstratos de dados. MODULA-2 e ADA so exemplos de linguagens que
surgiram nessa poca.
Durante os anos 80 e 90 houve uma vasta disseminao do uso de computadores pessoais e das estaes de trabalho. Surge a indstria do software
e com ela a necessidade de se produzir e atualizar software rapidamente.
O reuso passa a ser um conceito central para a produtividade no desenvolvimento de software. Para atender esse requisito so desenvolvidas as
LPs orientadas a objetos. SMALLTALK, EIFFEL, C++ e JAVA so exemplos de linguagens que surgiram nessa poca.
importante dizer que muitas linguagens foram incorporando novas caractersticas na medida que se constatava a sua necessidade. Assim, verses atuais de FORTRAN e COBOL, por exemplo, j incorporam os conceitos de programao estruturada.
Cabe dizer ainda que as linguagens declarativas evoluram em paralelo
com as imperativas. LISP surgiu no final dos anos 50 e PROLOG no incio dos anos 70. O maior interesse no desenvolvimento dessas linguagens
tem sido demonstrado no meio acadmico, em particular, nas reas de
pesquisa sobre Linguagens de Programao e Inteligncia Artificial.
Apresenta-se a seguir uma breve descrio da origem e principais caractersticas de algumas das LPs mais conhecidas.
1.7.1 Origem de LPs
FORTRAN (1957): Desenvolvida inicialmente por Backus para computadores IBM. Destinou-se a aplicaes numrico-cientficas (caracterizadas por poucos dados e muita computao). Enfatizava eficincia
computacional (por exemplo, no havia alocao dinmica de memria). No enfocava eficincia dos programadores (por exemplo, as estruturas de controle eram todas baseadas no comando GOTO). Verses
atuais de FORTRAN incorporaram avanos das outras LPs.
LISP (1959): Criada por John McCarthy no MIT. Adota o paradigma
funcional. Apropriada para processamento simblico. Ainda hoje a
LP mais usada na Inteligncia Artificial. COMMON LISP e SCHEME
so dialetos.

23

ALGOL (1960): Criada por um comit de especialistas. Primeira LP


com sintaxe formalmente definida. Importncia terica enorme, tendo
influenciado todas as LPs imperativas subsequentes, embora ela prpria no tenha sido muito usada (at hoje se usa o termo ALGOLlike).
COBOL (1960): Criada por comit de especialistas. Primeira LP encomendada pelo Departamento de Defesa Americano (DoD). Destinada para aplicaes comerciais (caracterizada por muitos dados e pouca
computao). Tentou enfatizar legibilidade (LP mais prxima do ingls), mas acabou comprometendo redigibilidade.
BASIC (1964): Criada por Kemeny e Kurtz na Universidade de Darmouth. Objetivava ser de fcil aprendizado para uso por estudantes de
artes e cincias humanas.
PASCAL (1971): Criada por Niklaus Wirth. Foi projetada para ser
usada no ensino de programao estruturada. Enfocou a simplicidade.
C (1972): Criada por Dennis Ritchie no Bell Labs. Projetada para ser
usada no desenvolvimento de sistemas de programao (em particular,
para a implementao do sistema operacional UNIX).
PROLOG (1972) - Criada por Comerauer e Roussel, na Universidade de Aix-Marseille, com o auxlio de Kowalski, da Universidade de
Edinburgo. Adota o paradigma lgico, sendo bastante usada em Inteligncia Artificial.
SMALLTALK (1972): Criada por Alan Key e Adele Goldberg no
Xerox PARC. Primeira LP totalmente orientada a objetos. O ambiente
de programao de SMALLTALK introduziu o conceito de interfaces
grficas com o usurio que hoje amplamente utilizado.
ADA (1983): Criada pela empresa Cii-Honeywell Bull, liderada pelo
francs Jean Ichbiah, vencedora de licitao promovida pelo DoD para
atender demanda de uma linguagem de programao de alto-nvel
padronizada. Demandou o maior esforo para o desenvolvimento de
uma LP, envolvendo centenas de pessoas durante oito anos. LP muito
grande e complexa. Apropriada para programao concorrente e sistemas de tempo real.

24

C++ (1985): Criada por Bjarne Stroustrup no Bell Labs. Projetada para ser uma extenso de C com orientao a objetos. Tinha como requisito no implicar em perda de eficincia em relao ao cdigo em C.
Responsvel pela rpida aceitao da orientao a objetos. Se tornou
uma LP muito complexa.
JAVA (1995): Criada pela SUN para ser usada na construo de softwares para sistemas de controle embutido (tais como eletrodomsticos), mas acabou no sendo usada para este fim. Baseou-se fortemente
em C++, mas bem mais simples. uma LP orientada a objetos. No
utiliza explicitamente o conceito de ponteiros e foi projetada para enfatizar a portabilidade. Tem se tornado amplamente utilizada por causa
da sua confiabilidade e portabilidade, pelo advento da INTERNET e
porque os programadores de C e C++ a aprendem facilmente.
1.8 Consideraes Finais
Nesse captulo foram apresentados diversos temas importantes para o entendimento dos conceitos discutidos no resto desse livro. Em particular,
importante ter compreendido como cada uma das propriedades apresentadas na seo 1.3 podem influenciar o projeto, implementao e uso das
LPs. Ter uma boa noo sobre como LPs podem ser especificadas e implementadas tambm contribui para a compreenso de diversos tpicos
subseqentes.
Por fim, vale repetir que o foco desse livro ser na discusso das LPs que
se enquadram sobre o paradigma imperativo, isto , linguagens que adotam o paradigma estruturado, orientado a objetos ou concorrente. Vale
ressaltar tambm que os exemplos sero dados primordialmente nas linguagens C, C++ e JAVA.
1.9 Exerccios
1. Identifique problemas de legibilidade e redigibilidade nas LPs que conhece. Verifique se existem casos nos quais essas propriedades so
conflitantes.
2. Identifique problemas de confiabilidade e eficincia nas LPs que
conhece. Verifique se existem casos nos quais essas propriedades so
conflitantes.
3. Identifique problemas de falta de ortogonalidade nas LPs que conhece.
Esses problemas comprometem a facilidade de aprendizado da LP?

25

4. Reusabilidade e modificabilidade muitas vezes contribuem para a melhoria uma da outra. D exemplos de situaes nas quais isso ocorre.
5. Identifique situaes nas quais a busca por eficincia computacional
compromete a portabilidade de LPs e vice-versa.
6. Uma LP sempre pode ser implementada usando tanto o mtodo de
compilao quanto o de interpretao? Em caso positivo, discuta se
existem LPs que se ajustam melhor a um mtodo de implementao
do que a outro. Em caso negativo, apresente um exemplo de uma LP
na qual s se pode utilizar um mtodo de implementao e justifique.
7. Faa uma anlise lxica, sinttica e semntica das seguintes linhas de
cdigo C e descreva quais as concluses obtidas:
int a, i;
int b = 2, c =3;
a = (b + c) * 2;
i = 1 && 2 + 3 | 4;
8. Enumere e explique quais os principais fatores que influenciaram a
evoluo das LPs imperativas.
9. Induzir a legibilidade, confiabilidade e reuso de programas so algumas das propriedades desejveis em Linguagens de Programao.
Mostre, atravs de exemplos (um para cada propriedade) retirados de
linguagens de programao conhecidas, como elas podem cumprir estes papis e justifique os seus exemplos.

26

Você também pode gostar