Escolar Documentos
Profissional Documentos
Cultura Documentos
Linguagem de Programação
Linguagem de Programação
!
"
# $%
&
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.
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
1.1
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
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
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
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
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:
<sinal> ::= +
<operador> ::= +/*
Exemplo 1. 8 - Gramtica Simples
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
18
Imperativo
Estruturado
Orientado
a Objetos
Declarativo
Concorrente
Funcional
Lgico
19
20
21
22
23
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