You are on page 1of 24

Universidade Federal de Santa Catarina - UFSC

Departamento de Informática e Estatística – INE


Centro Tecnológico - CTC
Bacharelado em Sistemas de Informação
INE5622 – Introdução a Compiladores
Prof.: Olinto V. Furtado

Linguagem Object Pascal


(Delphi)

Adriana Orthmann Fernandes 0513800-0


Marcos Kerecki 0423839-7

Florianópolis, 12 de maio de 2008


Introdução

As linguagens de programação podem ser classificadas em linguagem de 1ª, 2ª, 3ª,


4ª e 5ª Geração, sendo que a linguagem Object Pascal faz parte da 3ª Geração. Object
Pascal é baseado no paradigma de orientação a objetos. As linguagens que aceitam este
paradigma, como Java e C++, seguem a mesma filosofia básica, mas diferem em sintaxe
e estilo.
As linguagens orientadas a objetos oferecem muitas vantagens sobre as linguagens
procedurais tradicionais. Como os objetos encapsulam dados e funções relacionados em
unidades coesas, é fácil localizar dependências de dados, isolar efeitos de alterações e
realizar outras atividades de manutenção, e talvez, o mais importante, as linguagens OO
facilitam a reutilização.
Neste trabalho são abordados critérios a serem observados na avaliação de uma
linguagem de programação, especificamente para a linguagem Object Pascal. Critérios
como legibilidade, portabilidade, extensibilidade, ortogonalidade, tipagem, custo,
ambientes de programação.
Além disso são apresentadas características da linguagem, como identificadores,
variaveis, contantes, tipo de dados, estruturas de controle, etc.

Histórico da Linguagem Object Pascal/Delphi

A linguagem de programação Object Pascal utilizada no Delphi não foi inventada em


1995 juntamente com o ambiente de desenvolvimento visual da Borland; a linguagem foi
simplesmente estendida a partir da Object Pascal que já existia nos produtos Borland
Pascal. Mas a Borland não inventou a Pascal; apenas ajudou a torná-la popular e a
estendeu um pouco.
Pascal de Wirth: a Linguagem Pascal foi criada a partir de uma linguagem
chamada ALGOL. Esta linguagem, cuja primeira versão foi apresentada em 1958 e se
chamava ALGOL 58, teve na sua linha evolutiva mais três versões, o ALGOL 60, o ALGOL
68 e o ALGOL-W. A linguagem Pascal foi idealizada originalmente in 1971 por Niklaus
Wirth, professor da Faculdade Politécnica de Zurique, na Suíça. Pascal foi projetada para
ser uma versão simplificada para propósitos educacionais da linguagem Algol, que data de
1960. Quando Pascal foi criada, muitas linguagens de programação já existiam, mas
poucas eram usadas em larga escala: FORTRAN, C, Assembler, COBOL. A idéia principal da
nova linguagem era ordem, obtida através de um forte conceito de tipagem de dados, e
requerendo declarações e controles estruturados de programa. A linguagem foi criada
também para ser uma ferramenta de aprendizado para estudantes de turmas de
programação.
O Pascal ao longo de sua história foi ganhando muita importância, principalmente
no ensino de programação, sendo em meados a década de 70 a linguagem mais utilizada
para este fim. O desenvolvimento do compilador Turbo Pascal, pela Borland, teve grande
importância neste sucesso da linguagem, já que ele não era um simples compilador, mas
um ambiente de desenvolvimento, onde se podia construir e depurar o código, o que foi
uma novidade para a época. Devido a sua grande utilização a linguagem foi incorporando
as novas tecnologias na área de linguagens de programação, como por exemplo a
orientação ao objeto, o que deu origem a uma versão da linguagem popularmente
conhecida como Object Pascal (esta versão foi implementada junto com o IDE Delphi da
Borland). O Object Pascal, a partir da versão 7.0 do Delphi, passou a se chamar
Linguagem Delphi.

2
Classificações e Aplicações da Linguagem

Podemos classificar Object Pascal quanto:

Ao paradigma de programação: Object Pascal é uma linguagem de programação


orientada a objetos, ou seja, segue o paradigma de orientação a objetos (paradigma de
análise, projeto e programação de sistemas de software baseado na composição e
interação entre diversas unidades de software chamadas de objetos).

À estrutura de tipos: Uma das grandes características do Object Pascal é que ele é
fortemente tipado, ou typesafe. Isto significa que variáveis atuais passadas para
procedimentos ou funções devem ser do mesmo tipo que o parâmetro formal identificado
na definição do procedimento ou função.

Ao grau de abstração: Object Pascal é uma linguagem de programação de alto nível,


ou seja, é uma linguagem de programação com um nível de abstração relativamente
elevado, longe do código de máquina e mais próximo à linguagem humana.

À geração: A linguagem em questão está classificada em linguagem de 3ª Geração, que


é uma linguagem de programação projetada para ser facilmente entendida pelo ser
humano, incluindo recursos como variáveis com nomes.

À aplicabilidade: É largamente utilizada no desenvolvimento de aplicações desktop e


aplicações multicamadas (cliente/servidor), compatíveis com os banco de dados mais
conhecidos no mercado. Como uma ferramenta de desenvolvimento genérica, o Object
Pascal/Delphi pode ser utilizado para diversos tipos de desenvolvimento de projetos,
abrangendo desde Serviços a Aplicações Web, Aplicações CTI (tecnologia que permite a
integração de computadores com telefones) e aplicações para dispositivos móveis, tais
como Palmtops, pocketPC e outros.

À implementação: Object Pascal/Delphi tem implementação através do compilador


Delphi, que é também um ambiente de desenvolvimento integrado (IDE). O compilador
Delphi é um programa que traduz um programa escrito em Object Pascal para uma
linguagem de máquina.
O Object Pascal/Delphi é largamente utilizado no desenvolvimento de aplicações
desktop, aplicações multicamadas e cliente/servidor, compatível com os banco de dados
mais conhecidos do mercado. Como uma ferramenta de desenvolvimento genérica, o
Delphi pode ser utilizado para diversos tipos de desenvolvimento de projeto, abrangendo
desde Serviços a Aplicações Web e CTI. Pode ser usado para desenvolver aplicações que
exijam tanto uma linguagem de alto nível como também de baixo nível. Um exemplo de
software conhecido que foi desenvolvido em Delphi é o Skype.

Principais Recursos Oferecidos pela Linguagem Object Pascal/Delphi

1. Identificadores

São os nomes que identificam os elementos de um programa em Object Pascal.


Exemplos de identificadores são nomes de variáveis, constantes, procedures, functions e
componentes. Em Object Pascal todos os identificadores usados devem ser declarados.
Quando um identificador é declarado, é definido um tipo para ele (como inteiro, String,
etc.). Um identificador deve seguir as seguintes regras básicas:
● Pode ter até 63 caracteres. Qualquer caractere que passe desse limite é ignorado
pelo compilador do Delphi.

3
● Identificadores devem começar sempre com letras, ou com o caractere de
sublinhado (_). Um identificador não pode começar com um número. Os outros
caracteres de um identificador (do segundo em diante) podem ser letras, números
ou sublinhados. Nenhum outro caractere é permitido.
● Um identificador não pode ser uma palavra reservada da linguagem Object Pascal.

2. Palavras Reservadas

São todos os identificadores reservados do Object Pascal. Eles desempenham um


papel central na linguagem. A ajuda do Delphi distingue "palavras reservadas" e
"diretivas": as palavras reservadas não podem ser usadas como identificadores, enquanto
as diretivas não devem ser usadas como tais, mesmo que o compilador as aceite.

Palavra-chave Papel
absolute diretiva (variáveis)
abstract diretiva (métodos)
and operador (booleano)
array tipo
as operador (RTTI)
asm instrução
assembler compatibilidade retroativa (asm)
at instrução (exceções)
automated especificador de acesso (classe)
begin marcador de bloco
case instrução
cdecl convenção de chamada de função
class tipo
const declaração ou diretiva (parâmetros)
constructor método especial
contains operador (conjunto)
default diretiva (propriedade)
destructor método especial
dispid especificador de interface
dispinterface tipo
div operador
do instrução
downto instrução (parte do for)
dynamic diretiva (método)
else instrução (parte do if ou case)
end marcador de bloco
except instrução (exceções)
export compatibilidade retroativa (classe)
exports declaração
external diretiva (funções)
far compatibilidade retroativa (classe)
file tipo

4
finalization estrutura de unidade
finally instrução (exceções)
for instrução
forward diretiva de função
function declaração
goto instrução
if instrução
implementation estrutura de unidade
implements diretiva (propriedade)
in operador (conjunto) - estrutura de projeto
index diretiva (interface)
inherited instrução
initialization estrutura de unidade
inline compatibilidade retroativa (ver asm)
interface tipo
is operador (RTTI)
label declaração
library estrutura de programa
message diretiva (método)
mod operador (matemático)
name diretiva (função)
near compatibilidade retroativa (classe)
nil valor
nodefault diretiva (propriedade)
not operador (booleano)
object compatibilidade retroativa (classe)
of instrução (parte do case)
on instrução (exceções)
or operador (booleano)
out diretiva (parâmetros)
overload diretiva de função
override diretiva de função
package estrutura de programa (pacote)
packed diretiva (registro)
pascal convenção de chamada de função
private especificador de acesso (classe)
procedure declaração
program estrutura de programa
property declaração
protected especificador de acesso (classe)
public especificador de acesso (classe)
published especificador de acesso (classe)
raise instrução (exceções)

5
read especificador de propriedade
readonly especificador de interface
record tipo
register convenção de chamada de função
reintroduce diretiva de função
repeat instrução
requires estrutura de programa (pacote)
resident diretiva (funções)
resourcestring tipo
safecall convenção de chamada de função
set tipo
shl operador (matemático)
shr operador (matemático)
stdcall convenção de chamada de função
stored diretiva (propriedade)
string tipo
then instrução (parte do if)
threadvar declaração
to instrução (parte do for)
try instrução (exceções)
type declaração
unit estrutura de unidade
until instrução
uses estrutura de unidade
var declaração
virtual diretiva (método)
while instrução
with instrução
write especificador de propriedade
writeonly especificador de interface
xor operador (booleano)

3. Variáveis

No Object Pascal, toda variável tem que ser declarada antes de ser utilizada. A
declaração de uma variável define o nome e o tipo da variável. Declarações de variáveis
devem ser precedidas pela palavra-chave var. As declarações, junto com a palavra-chave
var constituem o chamado bloco var. Declarações devem ser agrupadas no início do
programa, ou no início de uma procedure ou function (antes da palavra-chave begin).

Variáveis de instância: uma variável de instância é uma variável cujo valor é específico
ao objeto e não à classe; em geral possui uma valor diferente em cada objeto membro da
classe.

Variáveis de classe: é uma variável cujo valor é comum a todos os objetos membros
da classe; mudar o valor de uma variável de classe em um objeto membro

6
automaticamente muda o valor para todos os objetos membros.

Tipos de Variáveis : as variáveis em Object Pascal podem ser classificadas em variáveis


globais e variáveis locais.
As variáveis globais são declaradas fora de qualquer método (na Interface da Unit)
e podem ser acessadas por qualquer Unit usuária. Elas são criadas quando uma instância
da classe é criada e são destruídas quando o objeto é destruído.
Quando variáveis auxiliares são declaradas dentro de um determinado método, são
chamadas variáveis locais. Elas são criadas quando o método é chamado e destruídas
quando ele é encerrado.
A parte de código que identifica uma determinada variável é chamada de escopo da
variável. Assim, o escopo de uma variável global é a classe, e o escopo de uma variável
local é o método, ou bloco contido dentro do método, ao qual ela pertence.

Constantes: constantes são usadas para armazenar valores que não podem (ou não
devem) ser alterados em um programa. Declarações de constantes devem ser precedidas
pela palavra-chave const. As declarações das constantes, junto com a palavra-chave const
constituem o chamado bloco const. Ao contrário das variáveis, as constantes devem ter
seus valores definidos logo na declaração. Além disso, os tipos das constantes não são
definidos explicitamente. Eles são deduzidos pelo Delphi, de acordo com o valor definido
para cada constante.

4. Tipos e estruturas de dados

O tipo declarado para uma variável define o conjunto de valores permitidos para
aquela variável. Há uma grande quantidade de tipos disponíveis em Object Pascal. Os
tipos permitem a detecção antecipada de erros em tempo de compilação, ajudam a
documentar os programas e são úteis na otimização do código gerado.

4.1 Tipos Simples

São os tipos primitivos da linguagem.

Inteiros: são caracterizados como tipos inteiros, os dados numéricos positivos ou


negativos.

Tipos Mínimo Máximo Tamanho (byte)


Integer -2.147.483.647 2.147.483.647 4
Cardinal 0 4.294.967.295 4
Shortint -128 127 1
Smallint -32768 32767 2
Longint -2.147.483.647 2.147.483.647 4
Int64 -2^63 2^63-1 8
Byte 0 255 1
Word 0 65535 2
Longword 0 4.294.967.295 4

7
Reais: são caracterizados como tipos reais, os dados numéricos positivos, negativos e
números fracionários.

Tipos Mínimo Máximo Tamanho Precisão


(byte)
Real 5.0 x 10^-324 1.7 x 10^308 8 15-16
Real48 2.9 x 10^-39 1.7 x 10^38 6 11-12
Single 1.5 x 10^-45 3.4 x 10^38 4 7-8
Double 5.0 x 10^-324 1.7 x 10^308 8 15-16
Extended 3.6 x 10^-4951 1.1 x 10^4932 10 19-20
Comp -2^63+1 2^63 -1 8 19-20
Currency 8 19-20

Char: representa um único caracter, escrito entre apóstrofos ('). A maioria dos
computadores utilizam a tabela de códigos ASCII para representar todos os caracteres
disponíveis.

Boolean: são caracterizados como tipos boleanos os dados com valores TRUE
(verdadeiro) e FALSE (falso), sendo que este tipo de dado poderá representar apenas um
dos dois valores.

4.2. Tipos Estruturados

Estruturas de dados são construções de uma linguagem de programação que


agregam um ou mais elementos de dados para formar um tipo de dado que armazena
uma quantidade maior de informações.
Os elementos de dados que uma estrutura de dados armazena podem ou não ser
do mesmo tipo. Existem estruturas de dados que trabalham só com um tipo de elemento,
como o vetor, e outras que combinam elementos de dados diferentes, no caso do registro,
por exemplo. Uma estrutura de dados também pode conter outra estrutura de dados.
As estruturas de dados são subdivididas em dois grupos, estáticas e dinâmicas.
Uma estrutura de dados estática é aquela que não pode ter a sua quantidade de
elementos de dados alterada durante a execução de um programa. As mais comuns são
os vetores, as strings e os registros. Uma estrutura de dados dinâmica frequentemente
tem elementos inseridos ou retirados do seu interior. Arquivos e listas, filas, pilhas e
árvores são as estruturas de dados dinâmicas mais comuns.

String: Strings em Object Pascal são armazenados internamente como arrays de


caracteres (arrays do tipo Char).
Há dois tipos de Strings em Object Pascal: Strings longos e Strings curtos. Strings
longos têm o comprimento praticamente ilimitado (2 GigaBytes). Eles são declarados
usando somente a palavra-chave String. Strings curtos têm o comprimento limitado em
255 caracteres. Para declarar um String curto, usa-se a palavra-chave String seguida pelo
tamanho desejado, entre colchetes.
Como uma String é um array de caracteres, pode-se acessar cada caractere do
String individualmente, usando índices (os caracteres são indexados a partir de 1).

8
Tipo Tamanho Máximo Memória Requerida Usado para
em caracter
Compatibilidade com
ShortString 255 2 até 256 bytes
versões anteriores
Caracteres 8-bit
AnsiString = String =
~2^31 4 bytes até 2GB (ANSI), DBCS ANSI,
String Longa
MBCS ANSI,etc
Caracteres Unicode,
servidores
WideString ~2^30 4 bytes até 2GB multiusários
e aplicações
multi-linguagens

Registro: tipo de variável que armazena informações de tipos de dados diferentes numa
única estrutura. Um registro é composto por elementos de dados ou por outras estruturas
que não sejam necessariamente do mesmo tipo. Cada elemento de um registro é
conhecido como campo.

Vetores/Arrays: o vetor é uma estrutura de dados estática e ordenada, com elementos


do mesmo tipo. Não pode armazenar numa posição um valor booleano e em outra um
caractere, e nem aumentar de tamanho no momento da execução de um programa. Os
elementos de um array são indexados: para acessar um valor de um array, digite o nome
do array, seguido do índice entre colchetes. O índice pode ser qualquer expressão que
tenha como resultado um valor inteiro.

4.3. Tipos de Dados Definidos pelo Usuário

Tipos Enumerados: a declaração de um tipo enumerado lista diretamente todos os


valores que uma variável pode conter. Definem-se novos tipos usando a palavra-chave
type, que deve ser colocada antes das definições dos tipos (tal como var e const). O bloco
type deve ser posicionado antes dos blocos var e const. Não são usadas aspas para os
valores, porque os valores de um tipo enumerado são armazenados como valores inteiros,
na seqüência em que são definidos (começando a partir de zero).

Tipos de Intervalo (Subrange): são seqüências de valores dos tipos Boolean, Char,
Integer, ou de tipos enumerados. Tipos de intervalo são úteis quando é necessário limitar
uma variável a um intervalo contínuo de valores, como de 1 a 100, ou de "A" a "Z".

Conjuntos: um conjunto é um tipo de dados cujas variáveis podem armazenar uma


coleção não ordenada de valores ordinais, caracteres ou enumerados. Para declarar um
novo tipo set utiliza-se a palavra-reservada set of seguida por um tipo ordinal ou um
subconjunto de possíveis valores. Um conjunto pode apenas conter até 256 elementos.
Deve-se usar colchetes para se referir aos elementos do set. Object Pascal fornece muitos
operadores para usar na manipulação de sets. Podemos usar esses operadores para
determinar intersecção, união, diferença e membros do conjunto.
União e Diferença: uso dos operadores + e - ou os procedimentos Include() e
Exclude(), para adicionar e remover elementos para e de uma variável set.
Intersecção: uso do operador * para calcular a interseção de dois sets. O resultado
da expressão Set1 * Set2 é um conjunto contendo todos os membros que Set1 e Set2
têm em comum.
Membros: uso do operador in para determinar se um dado elemento está contido
em um set particular.

9
Ponteiros: armazenam endereços de memória, mas raramente o programador vai
precisar usá-los como tal. Para definir uma variável como sendo um ponteiro, basta
declará-la com o tipo pointer. Para definir um ponteiro específico para uma estrutura de
dados, use o símbolo ^ antes do tipo da variável.

4.4. Conversão de Tipos e Manipulação de Strings

Principais funções de conversão de tipo:

Função Tipo de origem Tipo de destino


StrToCurr String Currency
StrToDate String TDate
StrToDateTime String TDateTime
StrToFloat String Real
StrToInt String Integer
StrToTime String TTime
IntToStr Integer String
CurrToStr Currency String
DateToStr TDate String
TimeToStr TTime String

Principais rotinas de manipulação de strings:

Função Descrição
Copy(S:string; Indice,Comp: Integer): string A função Copy retorna um string contendo
Comp caracteres, começando com S[Indice].
Delete(var S: string; Indice, Comp: Integer) A procedure Delete remove o substring com
Comp caracteres do string S, começando
com S[Index]. O string resultante é
retornado na variável S.
Length(S: string): Integer A função Length retorna o número de
caracteres no string S.
Trim(S: string): string A função Trim remove espaços à esquerda e
à direita do string S.

5. Expressões e Operadores

Uma expressão é qualquer combinação de operadores, variáveis, constantes,


valores literais e chamadas de funções que resultem em um valor de determinado tipo.
Operadores são usados em expressões e a ordem em que as expressões são
executadas depende da precedência desses operadores.

Operadores aritméticos: representam as operações mais comuns da matemática.

10
Operador Operação Operandos Resultado
+ Adição Inteiro, Real Inteiro, Real
- Subtração Inteiro, Real Inteiro, Real
* Multiplicação Inteiro, Real Inteiro, Real
/ Divisão Real Inteiro, Real Real
DIV Divisão Inteira Inteiro Inteiro
MOD Resto da Divisão Inteiro Inteiro

Operadores relacionais: são usados na comparação de duas expressões de qualquer


tipo, retornando um valor lógico (TRUE ou FALSE) como resultado da operação.

Operador Operação
= igual

> maior

< menor

>= maior ou igual

<= menor ou igual

<> diferente

Operadores lógicos: são usados para combinar expressões lógicas.

Operador Operação
not não (negação)
and e (conjunção)
or ou (disjunção)
xor ou exclusivo
shl deslocamento à esquerda
shr deslocamento à direita

Operador de atribuição: para atribuir um valor a uma variável, use o operador :=.

Operador Operação
:= atribui um valor a uma variável

Operadores de incremento e decremento: são operadores que atuam sobre uma única
variável numérica, aumentando ou diminuindo o seu valor de uma unidade.

Operador Operação Equivalente a


inc() incrementa uma variável variável := variável + 1
dec() decrementa uma variável variável := variável - 1

11
6. Estruturas de controle

Comandos Compostos: os comandos compostos são chamados de blocos de comandos


e são definidos entre as palavras reservadas begin e end.

Comandos de Condição

if ... then/ if ... then ... else -» Este comando condicional é utilizado quando precisamos
avaliar uma determinada condição. Se esta for verdadeira, executaremos determinado
comando. Pode-se executar vários comandos sujeitos a uma condição, colocando-os num
bloco. Pode-se executar certos comandos caso uma condição seja satisfeita, e outros
comandos caso contrário.

if <expressão> then
begin
<bloco de comandos1>;
end
else
begin
<bloco de comandos2>;
end;

case ... of -» Escolhas múltiplas de comandos a serem executados, dependendo do valor


de uma variável. Pode-se incluir o comando else.

case <expressão> of
<sequencias de constantes 1>: <comando 1>;
<sequencias de constantes 2>: <comando 2>;
else
<comando 3>;
end;

Comandos de Repetição

for -» Para repetir um conjunto de instruções um número determinado de vezes.

for <variavel := expressão> to/downto <expressão> do


begin
<comando 1>;
<comando 2>;
end;

Para interromper a repetição de um bloco de comandos dentro de uma estrutura


for...do, use o comando break:

for <variavel := expressão> to/downto <expressão> do


begin
<comando 1>;
break;
end;

12
while ... do -» Para repetir um conjunto de instruções enquanto determinada condição for
satisfeita:

while <expressão> do
begin
<comando 1>;
<comando 2>;
<comando n>;
end;

Para interromper a repetição de um bloco de comandos dentro de uma estrutura


while...do, use o comando break:

while <expressão> do
begin
<comando 1>;
<comando 2>;
break;
end;

repeat ... until -» Para se executar um grupo de comandos repetidas vezes, até
determinada condição ser satisfeita. A diferença é que a <condição> é testada após a
execução do bloco de instruções. Portanto, este bloco é executado no mínimo uma vez:

repeat
begin
<comando 1>;
<comando 2>;
<comando n>;
end;
until <condição>;

Para interromper a repetição de um bloco de comandos dentro de uma estrutura


repeat...until, use o comando break:

repeat
begin
<comando1>;
break;
end;
until <condição>;

continue -» Causa o desvio para o final do laço mais interno de um comando de


repetição:

for <variavel := expressão> to/downto <expressão> do


begin
...
continue;
...
<o comando continue desvia pra cá>
end;

13
while <expressão> do
begin
...
continue;
...
<o comando continue desvia pra cá>
end;

repeat
begin
...
continue;
...
<o comando continue desvia pra cá>
end;
until <condição>;

Desvios Incondicionais

goto -» Este comando desvia o código para um determinado rótulo, onde rótulo é um
rótulo numérico definido na cláusula label da procedure:

goto <rótulo>
...
procedure MinhaProcedure;
label
210;

exit -» Através deste comando você pode sair de um bloco de comandos limitado por
begin...end, evitando que as demais linhas após o comando exit sejam avaliadas:

if <expressão> then
exit;

halt -» Este comando causa o término imediato do programa.

...
if <expressão> then
halt; {Se a condicão for satisfeita, o programa terminará aqui.}
...

7. Abstração Funcional

Um programa em Object Pascal possui um cabeçalho e um corpo, com a seguinte


estrutura:

program <nome_do_programa>;
uses
<units_usadas_pelo_programa>;
begin
...
end.

14
Após o cabeçalho do programa, segue a seção uses. Nesta seção são declaradas os
nomes das units usadas pelo programa. Uma unit é um conjunto de procedimentos e
funções que realizam determinada operação, e será vista com mais detalhes a seguir.

Definição de Classes

Em Object Pascal, classes são definidas através do conceito de Unit. Units são os
módulos individuais do código fonte que constituem um programa Object Pascal. Uma unit
é um local para agrupar funções e procedimentos que podem ser chamados do programa
principal. Para ser uma unit, um módulo fonte deve consistir ao menos de três partes:
uma instrução unit, a parte chamada interface e uma parte chamada implementation.
Opcionalmente, pode-se ter uma parte chamada initialization e uma chamada finalization.
Quando representamos uma classe utilizando uma unit, na seção Interface deve ser
declarada a classe, ou seja, o nome da classe juntamente com os atributos que terão suas
instâncias e quais métodos poderão ser executados. Na seção Implementation devem ser
especificadas, para cada um dos métodos, quais as instruções a serem executadas pelo
computador, quando um objeto da classe for solicitado a executar o serviço implementado
pelo respectivo método. Abaixo, a estrutura de uma Unit:

Unit <identificador>;

Interface
{Especifica o que será exportado pela UNIT a fim de ser utilizados por
outros módulos}

type <nome_da_classe> = class

[uses <lista de units>;]

<seções de declaração>

Implementation
{Declaração de Variáveis, Constante e tipos locais a UNIT e Implementação
dos métodos.

[uses <lista de units>;]

<definições>

[Initialization
{Código executado automaticamente quando um aplicativo que utiliza a UNIT
é executado}
<instruções>]

[Finalization
{Código executado automaticamente quando um aplicativo que utiliza a UNIT
é finalizado}
<instruções>]

end.

Instrução Unit -» Toda unit deve ter como sua primeira linha uma instrução dizendo que
é uma unit e identificando o nome da unit. O nome da unit sempre deve ser o mesmo
nome do arquivo.

15
Interface -» Depois da instrução unit, uma próxima linha funcional da unit do código
deve ser a instrução Interface. Tudo que seguir esta instrução, até a instrução
Implementation, é informação que pode ser compartilhada com seu programa e com
outras units. A parte de interface de uma unit é onde você declara tipos, constantes,
variáveis, procedimentos e funções que você quer tornar disponível para seu programa
principal e para outras units. Apenas declarações — nunca corpos de procedimentos —
podem aparecer na interface.

Implementation -» Segue a parte de Interface da unit. Embora a parte de


Implementation da unit tenha principalmente procedimentos e funções, é também onde
você declara qualquer tipo, constante ou variável que você não queira que esteja
disponível fora desta unit. A parte de Iimplementation é onde você define quaisquer
funções e procedimentos que você declarou na parte de interface.

Inicialization -» Esta porção da unit, que é localizada próxima do fim do arquivo, contém
qualquer código de inicialização para a unit. Este código será executado antes que o
programa principal comece a executar, e executará apenas uma vez.

Finalization -» Esta porção da unit, que é localizada entre a Initialization e end. da unit,
contém qualquer código de limpeza que será executado quando o programa termina.

Cláusula uses -» A cláusula uses é onde são listadas as units que você quer incluir em
um programa ou unit particular. Units podem ter duas cláusulas uses: uma na seção
interface e outra na seção implementation.

Definição de Métodos

Em Object Pascal, um método constitui-se de um conjunto de instruções que serão


executadas pelo computador, representando a ação de um objeto. Um método possui 4
partes básicas:

Método Construtor -» É o método executado no momento de criação da instância da


classe. Dentro da sua declaração, pode-se colocar a inicialização de variáveis, entre outros
processos que preparam o objeto para ser utilizado. Outra atribuição aos métodos
construtores é ligar o objeto recém criado aos demais métodos deste objeto. Toda classe
deve ter ao menos um método construtor, e apenas um deve ser executado, uma única
vez, antes de qualquer outro. Métodos construtores são definidos com a palavra reservada
constructor à frente do nome do método.

Método Destrutor -» É o método executado para destruir o objeto e liberar a memória


até então alocada. Toda classe precisa de um e apenas um método destrutor. Este deve
ser o último método a ser executado. Métodos destrutores são definidos com a palavra
reservada destructor à frente do nome do método.

Método Estático -» É o tipo de método tradicional. Ele é declarado como procedure ou


function e não recebe qualquer sufixo. A localização deste método é definido em tempo de
compilação.
- Procedure: é um método que não retorna nenhum resultado.
- Function: é um método que retorna resultado.

Método Dinâmico -» É o tipo de método que é ligado em tempo de execução, conforme


a classe do objeto que o chamou. Para se implementar o Polimorfismo, é necessário um
tratamento diferenciado para métodos semelhantes - enquanto classes genéricas criam a
chamada para determinada tarefa, as classes herdeiras implementam esta tarefa. Para

16
que isto funcione corretamente, o método na classe genérica deverá ser dinâmico.
Métodos dinâmicos são definidos com a palavra reservada dynamic, logo após a
declaração completa do método.

Método Virtual -» Tem funcionamento idêntico ao método dinâmico, exceto que um


método dinâmico possui uma implementação que favorece o tamanho do código, e um
método virtual favorece o tempo de execução. Métodos virtuais são definidos com a
palavra reservada virtual logo após a declaração completa do método.

Métodos Sobrescritos -» Os métodos sobrescritos são as implementações de métodos


dinâmicos ou virtuais. Criar um método dinâmico ou virtual em uma classe genérica é um
pré-requisito para criar métodos sobrescritos nas classes herdeiras. Os métodos
sobrescritos irão sobrepor as implementações herdadas, porém, de forma inteligente. Com
esta técnica é possível utilizar uma classe genérica para chamar um método
implementado em uma classe herdeira. Métodos sobrescritos são definidos com a palavra
reservada override, logo após a declaração completa do método.

Métodos Sobrecarregados -» Assim como procedimentos e funções regulares, métodos


podem ser sobrecarregados de forma que uma classe possa conter múltiplos métodos com
o mesmo nome com diferente listas de parâmetros. Métodos sobregarrecados são
definidos com a palavra reservada overload.

Métodos Abstratos -» São métodos cuja implementação será feita apenas através dos
herdeiros da classe. Utiliza-se em conjunto com métodos virtuais ou dinâmicos. Pode ser
necessário criar um método tão genérico em uma classe, que ele sequer possui
implementação, sequer possui um código. Para não criar um método que simplesmente
possui um begin seguido de um end, declara-se o método como abstrato e dispensa-se a
necessidade de implementação. Métodos abstratos são definidos com a palavra reservada
abstract, logo após a declaração dynamic ou virtual.

Definição de Atributos

Em Object Pascal, atributos representam as características do objeto, e podem ser


fixos ou variáveis.

Interface

Uma interface define um conjunto de funções e procedimentos que podem ser


usados para interagir com um objeto. A definição de uma dada interface é conhecida tanto
pelo implementador quanto pelo cliente da interface, atuando como um contrato dizendo
como uma interface será definida e usada. Uma classe pode implementar múltiplas
interfaces, fornecendo múltiplas "faces" pelas quais um cliente pode controlar um objeto.
Como seu nome implica, uma interface define apenas uma interface pela qual objeto e
clientes se comunicam. É trabalho da classe que suporta uma interface implementar cada
uma das funções e procedimentos da interface.

Mecanismos de passagem de parâmetros

Podemos passar parâmetros para uma função ou um procedimento por valor e por
referência. Quando se passa um parâmetro por valor, estamos realmente passando um
valor ou a cópia de um valor armazendo numa variável. Quando a passagem se faz por
referência, estamos passando o endereço da variável na memória e não o seu valor.
Quando se altera, dentro da função, o valor de uma variável passada por por referência,
esta alteração surte efeito em todo o programa (fora da função). Para passarmos um

17
parâmetro por referência devemos precedê-lo da palavra reservada var.

Especificadores de Visibilidade

Fornecem controle sobre o comportamento dos objetos, permitindo a declaração de


atributos e métodos com diretivas tais como protected, private, public, published e
automated.
● private: a área privada de uma classe contém declarações que não estão
acessíveis, nem fora da classe, nem para seus herdeiros. Útil para guardar
informações que precisam ter o conteúdo preservado ou protegido.
● protected: área cuja declaração é visível apenas pela própria classe e seus
herdeiros. Não é visível fora da classe.
● public: indica declarações visíveis em qualquer local, seja dentro ou fora da classe.
Construtores e destrutores de objetos sempre devem ser public.
● published: declaração pública de propriedades e eventos. É utilizado em
programação visual, e indica o que está visível para o programador em tempo de
projeto. Útil para programação de componentes.
● automated: o especificador automated é obsoleto mas permanece para manter a
compatibilidade com Delphi 2.

8. Concorrência

Mecanismos de Controle de Concorrência disponíveis em Object Pascal/Delphi:


● Thread Synchronized (monitor): protege trechos de código/métodos que
manipulam dados/recursos compartilhados, impedindo o acesso concorrente.
● Mutex: cria uma fila de acesso a um dado/recurso compartilhado, impedindo o
acesso concorrente.
● Semáforo: limita o número de usuários que acessam simultaneamente um recurso,
criando filas de acesso se este número for excedido.

9. Exceções

O Object Pascal contém exceções predefinidas para condições de erro comuns, tais
como falta de memória, divisão por zero, overflow e underflow numérico e erros de E/S de
arquivos. Também permite que você defina suas próprias classes de exceções da forma
que achar conveniente em suas aplicações. As exceções podem ser tratadas através das
instruções try...except e try... finally. A instrução raise é usada para gerar uma exceção.
O bloco try ... except é utilizado para definir um código de programa a ser
executado no momento que ocorrer uma exceção.

try
{Bloco de comandos}
except
{Bloco de comandos a ser executado quando ocorrer uma exceção}
end;

Se ocorrer mais de uma exceção dentro de um mesmo bloco, é necessário utilizar o


comando on...do.

on
{Tipo de exceção}
do
{Bloco de comandos da exceção}

18
O bloco try...finally permite que um bloco de comandos seja executado, mesmo
quando houver uma exceção.

try
{Bloco de comandos}
finally
{Bloco de comandos a ser executado mesmo quando ocorrer uma exceção}
end;

O comando raise permite o lançamento de uma exceção.

...
raise Exception.Create(<mensagem>);
...

Análise da Linguagem Object Pascal/Delphi

1. Correção e confiabilidade

Um programa é confiável se ele se comporta de acordo com suas especificações sob


todas as condições. A confiabilidade é influenciada por: verificação de tipos, tratamento de
exceções, aliasing, legibilidade, facilidade de escrita, etc.
A gramática do Object Pascal não apresenta ambigüidade de interpretação de
códigos.

1.1. Características positivas de uma linguagem

Tipagem forte: Object Pascal possui tipagem forte e estática. Todas a variáveis devem
ter um tipo definido e devem ser declaradas antes de serem utilizadas. Tem tipagem
estática porque o tipo é fixo e escolhido pelo programador.
A verificação dos tipos de expressões durante a compilação torna a linguagem mais
confiável, pois não ocorrerá este tipo de erro durante a execução do programa. Object
Pascal faz a verificação dos tipos das variáveis envolvidas nas atribuições de valores em
tempo de compilação, o que torna o programa executável muito mais confiável.

Exceções: a capacidade de um programa de interceptar erros em tempo de execução,


pôr em prática medidas corretivas e, depois, prosseguir é um grande auxílio à
confiabilidade. Object Pascal possui uma implementação concisa e extensível do
tratamento de exceções. A linguagem possui classes especiais para o tratamento de
exceções, e o desenvolvedor também pode criar suas exceções quando for for necessário
descobrir dados inválidos, operações e comportamentos não convenientes, em tempo de
execução.

Pré e pós-condições: em Object Pascal, os métodos podem ter pré-condições ou pós-


condições. Pré-condições: condição que deve ser observada antes do método ser
chamado. Pós-condições: condição que ocorre depois do método ter sido executado. As
pré/pós-condições são introduzidas na linguagem em forma de asserções. Uma asserção é
uma suposição a respeito de algo que deve ser verdadeiro no momento do teste; se esta
condição não for encontrada é sinal de que algo errado aconteceu. Asserções no Object
Pascal são implementadas através do procedimento Assert. Este procedimento é uma das
funções embutidas no compilador e não é possível encontrar seu código em nenhuma unit.

19
1.2. Características negativas de uma linguagem

goto: embora o Object Pascal permita o uso desta instrução, é altamente recomendável
que ela não seja usada no código-fonte, pois programas que usam esta instrução são
difíceis de ler e de se manter. O Object Pascal fornece maneiras mais estruturadas de
controlar o fluxo da execução do código de um programa, não havendo necessidade
alguma de usar esta instrução.

Variáveis Globais: as variáveis globais são declaradas fora de qualquer método


(usualmente no cabeçalho da classe) e são acessíveis por qualquer método da classe. Elas
são criadas quando uma instância da classe é criada e são destruídas quando o objeto é
destruído.

Aliasing: permite que através de métodos distintos, ou nomes, possa-se acessar a


mesma posição de memória. Object Pascal tem a capacidade de criar novos nomes, ou
apelidos (aliases), para tipos que já estão definidos. O alias do novo tipo definido é
compatível em tudo com o tipo para o qual ele é um alias. Também pode ocorrer como
conseqüência de uma atribuição de um identificador de objeto a um outro de mesmo tipo
que é permitido, mas o endereço (e não o valor) é atribuído.

2. Eficiência

Compilação e Execução

Object Pascal é uma linguagem verdadeiramente compilada, não necessitando de


bibliotecas de runtime. Os executáveis são muito rápidos, sendo a velocidade realmente
comparável à de um programa C ou C++. O código compilado em Object Pascal é
executado pelo menos 10 vezes mais rápido do que o código equivalente em ferramentas
interpretadas ou semi-interpretadas.

3. Portabilidade

Programas escritos em Object Pascal não eram portáveis para plataformas não
Windows até 1999/2000. Nesta época, surgiu o projeto Kylix e, com ele, uma nova
biblioteca chamada CLX, disponível para Linux, Windows, diversos tipo de Unixes, Mac e
também uma versão disponível para Palm. Com este enfoque, a linguagem ganhou muito
no aspecto portabilidade.

4. Extensibilidade

Programas extensíveis são programas que podem crescer sem necessidade de


alterar o que já foi escrito. Os mecanismos da linguagem que ajudam a escrever
programas extensíveis são os seguintes:

Herança: possiblidade de uma classe utilizar os atributos e métodos de uma outra


existente como se fossem seus. Na hierarquia de classes do Delphi, todas as classes são
obrigatoriamente descendentes de uma classe raiz, chamada TObject.

Polimorfismo: habilidade pela qual uma única operação pode ser definida em mais de
uma classe e assumir implementações diferentes em cada uma dessas classes. Assim,
com o polimorfismo, é possível projetar e implementar sistemas que são mais facilmente
extensíveis.

Reintrodução de Nomes de Métodos: mecanismo que permite adicionar um método a

20
uma das classes para substituir um método de mesmo nome em um ancestral da classe.
Neste caso, om objetivo não é cancelar o método da classe pai, mas sim obscurecer e
suplantar completamente o método da classe pai. Ao simplesmente adicionar o método e
compilar, o compilador produzirá um alerta explicando que o novo método oculta um
método de mesmo nome em uma classe base. Para anular este erro, basta usar a diretiva
reintroduce sobre o método na classe pai.

Envio de mensagens: em Object Pascal existem métodos manipuladores de mensagens.


Na assinatura do método, o valor após a palavra reservada message informa para qual
método a mensagem responderá. Métodos de mensagem são usados para criar uma
resposta automática para as mensagens do Windows, e não são chamadas diretamente.

Modularidade: Object Pascal implementa modularidade através da geração de bibliotecas


compartilháveis chamadas DLL (Dynamic-Link Library). Esta modularidade permite que
alterações sejam feitas no código ou dados em uma DLL auto-contida, compartilhada por
vários aplicativos, sem que qualquer modificação seja feita nos aplicativos em si. A
estrutura de uma DLL, na verdade, é a mesma de um projeto comum, exceto que a DLL
começa com a palavra reservada library no cabeçalho ao invés de program.

5. Boa definição

Legibilidade

Esta propriedade refere-se a facilidade com que o programador enxerga seu


código-fonte. As linguagens começam a se tornarem confusas a partir do momento em
que seus códigos não seguem um fluxo de raciocínio, fazendo com que o analista se perca
facilmente caso pretenda acompanhar como está sendo feito um procedimento. Um
código-fonte devidamente identado também facilita seu entendimento.
A legibilidade influencia diretamente nas etapas de desenvolvimento de um
programa, já que a abstração do mundo real para uma linguagem de programação fica
mais fácil se a tradução tiver um sentido mais perto do comumente assimilado pelas
pessoas no seu dia-a-dia.
O critério de legibilidade é muito importante na hora de se escolher uma linguagem
de programação. Se uma pessoa (que não desenvolveu o programa) precisar entender o
código por conta de uma manutençào ou upgrade, isso facilitará futuramente este estudo.

Simplicidade Global: a simplicidade global trata do uso dos termos da linguagem em si.
Por exemplo, o grande número de componentes básicos em uma linguagem pode
atrapalhar na legibilidade se, quem esiver lendo, não conhecer os componentes que estão
sendo utilizados em determinadas partes do programa. Como a linguagem é orientada a
objeto, fatores como polimorfismo e encapsulamento contribuem neste sentido.
Por outro lado, Object Pascal possui vários componentes básicos, o que pode
dificultar a leitura do programa fonte, aumentando o tempo de entendimento do código.
Também é permitida a sobrecarga de métodos, assim, os métodos ficam mais difíceis de
serem lidos e interpretados.

Ortogonalidade: Object Pascal é flexível o suficiente para que seja escrita de forma
bastante simples qualquer instrução. É uma linguagem altamente ortogonal. Existem
poucas exceções quanto a sua escrita. Uma delas é a instrução repeat, onde o par
begin/end para formar grupos de instruções pode ser omitido.

Instruções de Controle: Object Pascal conta com vasta quantidade de instruções de


controle baseados em linguagem imperativa, sendo muito bem estruturado neste sentido.
Suas estruturas de controle favorecem uma boa interpretação do código. Por outro lado,

21
há alguns comandos similares à estrutura goto, que podem causar má interpretação do
código (o uso de break, por exemplo).

Tipos de Dados e Estruturas: Object Pascal possui tipos de dados que podem ajudar
bastante no entendimento do programa, por conseguirem representar uma idéia melhor, e
mais perto do mundo real, do que está sendo abstraído. Object Pascal trabalha com
objetos, evitando o uso de estrutura de dados diretamente, substituindo sua finalidade,
encapsulando também os tipos primitivos de dados.

Sintaxe: a sintaxe de Object Pascal em sua totalidade é bastante complexa, porque tenta
abranger o maior número de possibilidades de implementação e compatibilidade entre
hardware e software. Para implementação usando os recursos mais conhecidos, não há
muita dificuldade no aprendizado. A linguagem permite utilizar um tamanho grande de
caracteres nos nomes das suas declarações, podendo o programador dar nomes coerentes
às suas variáveis, tornando o projeto mais fácil de ser lido. O fato da linguagem usar um
único tipo de comando para definir o início e o final de blocos (begin/end) faz com que o
código tenha uma menor legibilidade. Linguagens que utilizam limitadores diferentes, tais
como: If/Endif, Do/Enddo, etc., são mais legíveis.

Abstração: a capacidade de abstração de dados em Object Pascal (representar entidades


do mundo real em forma de código) é facilmente percebida pelo fato desta linguagem ser
orientada a objetos. Se pudermos utilizar nomes e dar características aos objetos
abstratos, mais pertos do seu similar real, as idéias e funcionalidades de módulos ou
áreas do programa são mais facilmente entendidas, e melhor representadas.

6. Capacidade de Escrita

Corresponde a quão facilmente uma linguagem pode ser usada para criar
programas para um domínio de problemas escolhido. A maioria das características que
afetam a legibilidade também afetam a capacidade de escrita.

Expressividade: em uma linguagem, pode referir-se a diversas características diferentes.


A inclusão da instrução for em Object Pascal torna mais fácil a escrita de laços de
contagem do que com o uso do while, também possível.

Suporte para Abstração: o grau de abstração permitido por uma linguagem de


programação e naturalidade de sua expressão são muito importantes para a capacidade
de escrita. Object Pascal tem a capacidade de representar com clareza entidades do
mundo real em forma de código.

7. Custo

No custo da linguagem não está apenas o custo da aquisição do software


(compilador). Existem vários outros custos associados a uma linguagem, como:
● Custo do software: Delphi é um software proprietário e pago.
● Custo com treinamento de programadores: internamente (na empresa), depende
da simplicidade e adequação da linguagem à aplicação e da experiência dos
programadores. Externamente, o custo de um curso para a linguagem Delphi pode
ser muito alto (como acontece com a maioria dos cursos de linguagens). Como
alternativa, na internet há uma infinidade de materiais sobre a linguagem, onde é
possível encontrar quase tudo o que se procura.
● Custo para escrever os programas: se o programador for experiente, este custo é
irrelevante, se o programador tem pouca experiência, ainda assim é uma
linguagem relativamente fácil de aprender e trabalhar.

22
● Custo para compilar os programas: Object Pascal não exige um custo muito alto
das máquinas atuais para compilar os programas.
● Custo para executar os programas: a execução é muito rápida.
● Custo de manutenção dos programas: fortemente vinculado à legibilidade, pois
geralmente não é feita por quem escreveu os programas.

8. Ambiente de programação

A linguagem Object Pascal possui 2 ambientes de programação (IDEs) de ótima


qualidade, o Delphi e o Kylix (para Linux). Estes ambientes facilitam a edição, testes e
depuração de programas, diminuindo o tempo e facilitando o desenvolvimento. Todos os
ambientes são providos de interface gráfica, o que facilita e muito a programação.

Conclusão

Conforme o demonstrado neste trabalho, a linguagem Object Pascal é complexa,


mas também, potente, robusta e segura, podendo ser utilizada nas mais diferentes áreas
de aplicação, em main-frames, passando por sistemas distribuídos e sistemas para web.
Na maioria dos critérios avaliados, Object Pascal apresentou bom desempenho, o
que justifica sua larga adoção por empresas e profissionais da área.
Possui muito material disponível na web, muitos fóruns de discussões, onde é
possível sanar qualquer tipo de dúvida.
Object Pascal é portável, extensível e eficiente; com isso deve continuar a ser
utilizado por um bom tempo.

23
Bibliografia

SEBESTA, Robert. Conceitos de Linguagens de Programação. 4ª ed. Porto Alegre:


Bookman, 2000. 624 p.

APPLEBY, Doris, Programming Languages – Paradigm and Practice. Ed McGraw-Hill,


Inc., 1991

FURTADO, O. J. V. Notas de Aula – Cap. III. Disponível em:


<http://www.inf.ufsc.br/~olinto/ine5622-cap3.doc>. Acesso em: 09/04/2008.

THIAGO, André; ALVES, Leonardo. Linguagem Pascal. Disponível em:


<http://gigaflops.tripod.com/page/lp/pascal/pascal.html>. Acesso em: 21/04/2008.

CANTÚ, Marco. Pascal Essencial. Traduzido por Odilon Nelson. Disponível em:
<http://www.geocities.com/odin_wan_kenobi/pascal_essencial/ch01hist.htm>. Acesso
em: 21/04/2008.

OLIVEIRA, Civio Couto et al. Object Pascal. Disponível em:


<http://www.fundao.wiki.br/articles.asp?cod=47>. Acesso em 21/04/2008.

TEIXEIRA, Gabriel. Introdução à Linguagem de Programação Delphi. Disponível em:


<http://www.plugmasters.com.br/sys/materias/543/1/Introdu%E7%E3o-a-Linguagem-
de-Programa%E7%E3o-Delphi>. Acesso em: 21/04/2008.

RIBEIRO, Marcos. Apostila de Delphi. Disponível em:


<http://www.cpusoft.com.br/profmarcos/ASA/delphi_pascal.pdf>. Acesso em
09/05/2008.

BARBIERI, Ricardo. Asserções. Disponível em:


<http://www.blpbrasil.com.br/article.aspx?index=12>. Acesso em: 11/05/2008.

ALMEIDA, Alvaro A. de. Curso de Delphi. Disponível em:


<http://www.geocities.com/wallstreet/exchange/1726/computing/delphi/delphi_2.htm>.
Acesso em 21/04/2008.

SIPERT, Lisiane V. Geração e Utilização de DLLs no Delphi. Disponível em:


<http://www.pr.gov.br/batebyte/edicoes/1997/bb65/dll.htm>. Acesso em: 11/05/2008.

COELLO, Juan M. A. Paradigmas de Linguagens de Programação. Disponível em:


<http://docentes.puc-campinas.edu.br/ceatec/juan/cursos/PLP/intro-6tp.pdf>. Acesso
em: 12/05/2008.

WIKIPEDIA. Borland Delphi. Disponível em:


<http://pt.wikipedia.org/wiki/Delphi_%28linguagem_de_programa%C3%A7%C3%A3o%2
9>. Acesso em: 21/04/2008.

Kylix, o Delphi para Linux. Disponível em:


<http://www.apostilando.com/download.php?cod=2058&categoria=Outras%20Linguagen
s%20de%20Programa%C3%A7%C3%A3o>. Acesso em: 11/05/2008.

ZORZO, André L; SONAGLIO, Solange (Comp.). Linguagem Java. UFSC, 2007.

24

You might also like