Você está na página 1de 133

PARADIGMAS DE

LINGUAGEM DE
PROGRAMAÇÃO

Professor Esp. Ronie Cesar Tokumoto

GRADUAÇÃO

Unicesumar
Reitor
Wilson de Matos Silva
Vice-Reitor
Wilson de Matos Silva Filho
Pró-Reitor de Administração
Wilson de Matos Silva Filho
Pró-Reitor de EAD
Willian Victor Kendrick de Matos Silva
Presidente da Mantenedora
Cláudio Ferdinandi

NEAD - Núcleo de Educação a Distância


Direção Operacional de Ensino
Kátia Coelho
Direção de Planejamento de Ensino
Fabrício Lazilha
Direção de Operações
Chrystiano Mincoff
Direção de Mercado
Hilton Pereira
Direção de Polos Próprios
James Prestes
Direção de Desenvolvimento
Dayane Almeida
Direção de Relacionamento
Alessandra Baron
Head de Produção de Conteúdos
Rodolfo Encinas de Encarnação Pinelli
Gerência de Produção de Conteúdo
Gabriel Araújo
Supervisão do Núcleo de Produção de
Materiais
Nádila de Almeida Toledo
Supervisão de Projetos Especiais
Daniel F. Hey
Coordenador de Conteúdo
Fabiana de Lima
C397 CENTRO UNIVERSITÁRIO DE MARINGÁ. Núcleo de Educação a Design Educacional
Distância; TOKUMOTO, Ronie Cesar. Ana Claudia Salvadego

Paradigmas de Linguagem de Programação. Ronie Cesar Iconografia
Tokumoto. Amanda Peçanha dos Santos, Ana Carolina
Maringá-Pr.: UniCesumar, 2016. Reimpresso em 2018. Martins Prado
133 p.
“Graduação - EaD”. Projeto Gráfico
Jaime de Marchi Junior, José Jhonny Coelho
1. Paradigmas. 2. Linguagem de Programação. 3. EaD. I. Título. Arte Capa
ISBN 978-85-459-0360-4
Arthur Cantareli Silva
CDD - 22 ed. 005.3 Editoração
CIP - NBR 12899 - AACR/2 Robson Yuiti Saito
Qualidade Textual
Hellyery Agda
Pedro Afonso Barth
Ficha catalográfica elaborada pelo bibliotecário
João Vivaldo de Souza - CRB-8 - 6828 Ilustração
Marta Sayuri Kakitani
Impresso por:
Em um mundo global e dinâmico, nós trabalhamos
com princípios éticos e profissionalismo, não so-
mente para oferecer uma educação de qualidade,
mas, acima de tudo, para gerar uma conversão in-
tegral das pessoas ao conhecimento. Baseamo-nos
em 4 pilares: intelectual, profissional, emocional e
espiritual.
Iniciamos a Unicesumar em 1990, com dois cursos
de graduação e 180 alunos. Hoje, temos mais de
100 mil estudantes espalhados em todo o Brasil:
nos quatro campi presenciais (Maringá, Curitiba,
Ponta Grossa e Londrina) e em mais de 300 polos
EAD no país, com dezenas de cursos de graduação e
pós-graduação. Produzimos e revisamos 500 livros
e distribuímos mais de 500 mil exemplares por
ano. Somos reconhecidos pelo MEC como uma
instituição de excelência, com IGC 4 em 7 anos
consecutivos. Estamos entre os 10 maiores grupos
educacionais do Brasil.
A rapidez do mundo moderno exige dos educa-
dores soluções inteligentes para as necessidades
de todos. Para continuar relevante, a instituição
de educação precisa ter pelo menos três virtudes:
inovação, coragem e compromisso com a quali-
dade. Por isso, desenvolvemos, para os cursos de
Engenharia, metodologias ativas, as quais visam
reunir o melhor do ensino presencial e a distância.
Tudo isso para honrarmos a nossa missão que é
promover a educação de qualidade nas diferentes
áreas do conhecimento, formando profissionais
cidadãos que contribuam para o desenvolvimento
de uma sociedade justa e solidária.
Vamos juntos!
Seja bem-vindo(a), caro(a) acadêmico(a)! Você está
iniciando um processo de transformação, pois quando
investimos em nossa formação, seja ela pessoal ou
profissional, nos transformamos e, consequentemente,
transformamos também a sociedade na qual estamos
inseridos. De que forma o fazemos? Criando oportu-
nidades e/ou estabelecendo mudanças capazes de
alcançar um nível de desenvolvimento compatível com
os desafios que surgem no mundo contemporâneo.
O Centro Universitário Cesumar mediante o Núcleo de
Educação a Distância, o(a) acompanhará durante todo
este processo, pois conforme Freire (1996): “Os homens
se educam juntos, na transformação do mundo”.
Os materiais produzidos oferecem linguagem dialógica
e encontram-se integrados à proposta pedagógica, con-
tribuindo no processo educacional, complementando
sua formação profissional, desenvolvendo competên-
cias e habilidades, e aplicando conceitos teóricos em
situação de realidade, de maneira a inseri-lo no mercado
de trabalho. Ou seja, estes materiais têm como principal
objetivo “provocar uma aproximação entre você e o
conteúdo”, desta forma possibilita o desenvolvimento
da autonomia em busca dos conhecimentos necessá-
rios para a sua formação pessoal e profissional.
Portanto, nossa distância nesse processo de cresci-
mento e construção do conhecimento deve ser apenas
geográfica. Utilize os diversos recursos pedagógicos
que o Centro Universitário Cesumar lhe possibilita.
Ou seja, acesse regularmente o Studeo, que é o seu
Ambiente Virtual de Aprendizagem, interaja nos fóruns
e enquetes, assista às aulas ao vivo e participe das dis-
cussões. Além disso, lembre-se que existe uma equipe
de professores e tutores que se encontra disponível para
sanar suas dúvidas e auxiliá-lo(a) em seu processo de
aprendizagem, possibilitando-lhe trilhar com tranqui-
lidade e segurança sua trajetória acadêmica.
AUTOR

Professor Esp. Ronie Cesar Tokumoto


Possui graduação em Bacharelado em Informática pela Universidade
Federal do Paraná (2001). Pós-Graduações em Docência no Ensino Superior
pela Unicesumar, Pós-Graduação em Tutoria em Educação à Distância pela
Faculdade Eficaz, e Pós-Graduação em Gestão Escolar Integrada e Práticas
Pedagógicas. Experiência na área de educação desde 1993 atuando em
escolas profissionalizantes e colégios estaduais. Experiência em Coordenação
de Curso Técnico no ano de 2013 e Participação em Palestras e Eventos
Organizados para o Curso durante o mesmo ano. Atualmente atuando
como: Professor Mediador no EAD-Unicesumar no curso de Graduação EAD
em Engenharia de Software e Gestão em Tecnologia da Informação; como
professor do Curso Técnico em Informática ofertado pelo programa Pronatec
na mesma instituição; como Professor na rede Estadual de Ensino do Paraná
em Maringá-PR, nos Cursos Técnicos Profissionalizantes.
APRESENTAÇÃO

PARADIGMAS DE LINGUAGEM DE
PROGRAMAÇÃO

SEJA BEM-VINDO(A)!
Caro(a) acadêmico(a), este livro tem como finalidade principal mostrar como as lingua-
gens de programação utilizadas diferem sob diversos aspectos e em que isso pode in-
fluenciar dentro do tipo de função ao qual se aplica.
Podemos ter linguagens muito específicas para determinadas tarefas diretamente liga-
das a Tecnologia da Informação (TI) ou não, sendo que estas podem ser indicadas para o
desenvolvimento de software rodando em determinado tipo de hardware.
Sobre hardware, temos a ideia de que representa tudo relacionado à parte física, onde o
software, que seria a parte lógica, é executado. Ou seja, softwares englobam os progra-
mas de forma geral enquanto hardwares englobam os equipamentos.
Assim, temos que toda linguagem de programação é usada para criar e gerir processos
executados em máquinas para que estas sejam capazes de executar suas tarefas.
O ponto em que os estudos levarão indicará, dentre as diferentes opções de linguagens
existentes, aquelas que seriam mais adequadas para determinadas tarefas.
Linguagens mais recentes têm estrutura diferente em sua programação, agregando
conceitos inovadores, capazes de reduzir codificação ou permitir a criação de progra-
mas que contemplem um estado tecnológico mais atual.
A própria programação chamada de Orientada a Objeto é muito utilizada e domina o
mercado de novos produtos de software, mas existem tendências que podem mudar
toda a forma de se programar com o tempo.
Diferenças de plataformas para as quais se programa, contemplando as particularidades
de cada sistema operacional, também podem ser características que influenciam a esco-
lha entre uma linguagem e outra.
Durante as unidades do livro, aspectos relevantes serão detalhados para fornecer fer-
ramentas para que programadores experientes ou pessoas que tenham interesse em
escolher uma linguagem para aprender possam optar com mais segurança dentre alter-
nativas disponíveis por aquela que mais se adeque a suas necessidades.
Portanto, não basta conhecer as funções e a sintaxe dos comandos de uma linguagem,
mas poder escolher aprender uma linguagem de programação pelas necessidades reais
envolvidas.
09
SUMÁRIO

UNIDADE I

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE,


SEMÂNTICA E ANÁLISE LÉXICA

15 Introdução

16 Avaliação de Linguagens e Categorias de Linguagens

19 Métodos de Implementação

21 Evolução das Linguagens de Programação

33 Orientação a Objetos

37 Linguagens para Internet

44 Considerações Finais

48 Referências

49 Gabarito

UNIDADE II

NOMES, TIPOS DE DADOS, OPERADORES, EXPRESSÕES E


ESTRUTURAS

53 Introdução

54 Sintaxe e Semântica

61 Análise Sintática e Léxica

62 Nomes e Tipos de Dados

65 Operadores e Expressões

67 Estruturas de Controle
10
SUMÁRIO

69 Considerações Finais

74 Referências

75 Gabarito

UNIDADE III

SUB-ROTINAS E FUNÇÕES

79 Introdução

80 Sub-Rotinas

81 Implementando Sub-Rotinas

83 Funções

84 Passagem de Parâmetros

86 Bibliotecas

88 Considerações Finais

92 Referências

93 Gabarito

UNIDADE IV

TIPOS ABSTRATOS DE DADOS, ORIENTAÇÃO A OBJETO

97 Introdução

98 Abstração de Dados

99 Encapsulamento
11
SUMÁRIO

100 Programação Orientada a Objeto

101 Estrutura de Programas Orientados a Objeto

104 Estudo de Caso

107 Considerações Finais

112 Referências

113 Gabarito

UNIDADE V

CONCORRÊNCIA, TRATAMENTO DE EXCEÇÕES, PROGRAMAÇÃO


FUNCIONAL E PROGRAMAÇÃO LÓGICA

117 Introdução

118 Concorrência

120 Tratamento de Exceções

122 Programação Funcional

123 Programação Lógica

126 Considerações Finais

130 Referências

131 Gabarito

133 CONCLUSÃO
Professor Esp. Ronie Cesar Tokumoto

I
EVOLUÇÃO DAS LINGUAGENS

UNIDADE
DE PROGRAMAÇÃO, SINTAXE,
SEMÂNTICA E ANÁLISE LÉXICA

Objetivos de Aprendizagem
■■ Compreender algumas diferentes linguagens e suas aplicações.
■■ Conhecer formas de implementação de programas.
■■ Compreender sintaxe, semântica e análise sintática.

Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
■■ Avaliação de linguagens e categorias de linguagens
■■ Métodos de implementação
■■ Evolução das linguagens de programação
■■ O início
■■ Orientação a objetos
■■ Linguagens para internet
15

INTRODUÇÃO

Estudar conceitos a respeito de linguagens de programação traz benefícios que


podem melhorar o trabalho de desenvolvimento e a forma como se pensa a pro-
gramação em si.
Conhecer uma linguagem e a que tipo de atividades ela é mais indicada per-
mite que um programador saiba explorar melhor a potencialidade da linguagem
e tire dela códigos mais precisos e otimizados.
Um analista envolvido com projetos pode alocar profissionais com conhe-
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

cimento em determinada linguagem de acordo com as necessidades de cada


projeto, de acordo com a linguagem que mais se adeque ao propósito do projeto.
Uma melhor compreensão de linguagens de programação em geral permite
uma melhora na capacidade de expressar ideias, tendo como base a dificuldade
em conceituar estruturas que não se possa descrever ou verbalizar, por exemplo.
Também melhora naturalmente, com o conhecimento mais aprofundado das
características de linguagens diversas, a capacidade de escolha daquela linguagem
que melhor atenda ao tipo de programação desejada para o desenvolvimento.
Isso ocorre também pelo fato de que, com a evolução das linguagens e dos
métodos de programação, o conhecimento que um programador possui em rela-
ção a uma linguagem, aos poucos vai ficando obsoleto e, assim, precisam aprender
novas linguagens para se manterem no mercado de trabalho.
Conhecer os motivos de cada linguagem ser implementada da forma como
foi permite que o programador possa utilizá-la de forma mais consciente e inte-
ligente, aumentando as chances de se obter códigos mais otimizados.
Assim, além de terem melhores condições de usar uma linguagem de forma
adequada, conhecendo suas características, é possível explorar seus recursos e
utilizar ferramentas antes desconhecidas.
Conhecendo as linguagens de programação, o programador tem maior capa-
cidade de escolher uma linguagem não apenas por sua popularidade no meio
profissional ou acadêmico, mas saber qual linguagem possui as características
adequadas a determinada área do desenvolvimento de programas.

Introdução
16 UNIDADE I

AVALIAÇÃO DE LINGUAGENS E CATEGORIAS DE


LINGUAGENS

Linguagens de programação podem ser organizadas de diversas formas, de acordo


com critérios técnicos ou não.
Uma forma de distingui-las é por meio da finalidade ao qual se destinam,
podendo ter uma diversidade de usos computacionais de complexidades distin-
tas e com graus de complexidade também distintos.
Existem linguagens com fins científicos, em que aplicações de dados são

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
simples, mas que manipulam valores extremamente precisos e com grande quan-
tidade de casas decimais, utilizando a totalidade dos recursos de hardware, de
máquinas simples a supercomputadores.
Há também aplicações comerciais que exigem menos capacidade computa-
cional, mas que demandam estruturas de dados mais complexas, com necessidade
muito maior de armazenamento para estes dados, normalmente.
Projetos que envolvam o desenvolvimento de sistemas operacionais tam-
bém necessitam de linguagens diferenciadas, capazes de manipular o hardware
a fim de que possam, com isso, garantir o controle necessário do sistema opera-
cional criado ao hardware onde quer que seja utilizado.
A inteligência artificial necessita de menor processamento matemático, mas
maior capacidade de análise simbólica e flexibilidade no uso de dados, pois é
uma área que trabalha com situações menos exatas e lida com probabilidades.
Finalmente, temos as aplicações para web, mais recentes e contemplando parte
dos conceitos das aplicações comerciais no uso de dados, mas podendo também
utilizar conceitos das demais áreas, constituindo o que há de mais recente entre as
alternativas citadas até o momento. Algumas características também diferenciam
linguagens de acordo com a forma com que seus programas são escritos e seu
código compreendido. A facilidade de leitura e compreensão de um programa é
um fator muito importante na popularização de uma linguagem de programação,
pois afeta muito o tempo necessário para que se possa iniciar o desenvolvimento
de programas e a facilidade com que estes são compreendidos por quem precise

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


17

realizar manutenções em programas já escritos. Com isto, uma linguagem mais


simples pode ter a leitura e interpretação das funções implementadas pelo seu
código, devido à menor variedade de comandos para uma mesma tarefa.
Linguagens mais complexas tendem a possibilitar variações muito gran-
des de soluções para um mesmo problema, por mais simples que sejam, e, com
isso, diferentes programadores podem enxergar formas totalmente distintas para
resolver problemas.
Algumas destas soluções podem ser de fácil leitura e compreensão, mas podem
também ter um nível de raciocínio lógico muito complexo e que demande um
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

esforço lógico maior para compreender o que foi feito pelo programador que
criou o código.
Problemas diversos envolvem linguagens complexas, desde sintaxes que per-
mitam muitas variações e operadores que possam sofrer sobrecargas com valores
não esperados, gerando problemas em tempo de execução.
Podemos então observar que linguagens mais limitadas e que tenham recur-
sos para reduzir a quantidade de erros em tempo de execução que possam ocorrer
são mais simples de se entender e aprender.
Tendo em mente essas ideias, temos que uma linguagem simples permite
maior facilidade no aprendizado e compreensão de seus códigos implementa-
dos. É muito provável que se tenha, com isso, maiores limitações em relação
à quantidade de soluções que possam ser implementadas em linguagens que
sejam mais simples e que aceitem menos variações de sintaxe e combinações
entre seus comandos.
Um conceito chamado ortogonalidade traz esta ideia, pois representa que
uma linguagem de programação com fraca ortogonalidade tem comandos que
aceitam maior variedade de usos e interpretações, mas uma linguagem com
forte ortogonalidade é mais restrita e com menor variação em sua programação.
Uma fraca ortogonalidade faz com que a programação, numa linguagem
assim, permita que exceções indevidas ocorram mais facilmente e limitem as
possibilidades de desenvolvimento de soluções e diferentes combinações entre
comandos, tipos de dados ou estruturas.

Avaliação de Linguagens e Categorias de Linguagens


18 UNIDADE I

Tipos de dados influenciam essa ideia, pois quando temos em uma lingua-
gem a definição precisa para o uso de cada tipo de dado, as exceções também
diminuem, mas no caso da linguagem C que, por exemplo, não possui um tipo
para Verdadeiro e Falso definido, é preciso improvisar, usando um tipo numérico.
A sintaxe afeta diretamente a leitura e compreensão de programas devido ao
uso de símbolos para finalizar blocos de comandos, ao invés de palavras reser-
vadas próprias que indiquem a qual comando se referem como SE e FIMSE.
A facilidade de codificação de uma linguagem é afetada por aspectos como
sua facilidade na leitura e compreensão dos códigos escritos, quantidade de

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
comandos e tipos de dados possíveis, afetando sua ortogonalidade.
A implementação da abstração de dados em uma linguagem permite que
recursos como trechos de código sejam representados por funções, chamadas
por vezes em diversos trechos do programa, evitando a replicação sem necessi-
dade de código repetitivo.
Checagem de tipos de dados em tempo de execução também são muito
inconvenientes e linguagens que o fazem durante a compilação tendem a ser
muito menos custosas para manutenção e leitura do código.
Tratamentos de erros e exceções durante a execução também são recursos
muito bem-vindos, sendo algo que diferencia as linguagens C e C++, pois C pre-
cisa do tratamento manual de erros sem recursos automatizados disponíveis.
A referência a variáveis por meio de ponteiros também é perigosa pelo fato de
ser possível a atribuição de mais de um ponteiro a uma variável ao mesmo tempo,
podendo provocar confusão em relação a valores que uma variável possa conter.
Existe um custo quando se usa uma linguagem de programação que envolve,
além das características citadas anteriormente, as características de cada progra-
mador e as técnicas de codificação que cada um adota.
Isso inclui uma série de elementos envolvidos como treinamento de novos
programadores em função da facilidade do aprendizado da linguagem e leitura
de seus códigos, seu tempo de compilação e execução.
O hardware (parte física) onde é executado o programa e os demais softwa-
res (programas) que funcionam em paralelo ao programa desenvolvido como
sistemas operacionais e softwares de proteção interfere diretamente na veloci-
dade de execução e compatibilidade do software com o equipamento.

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


19

MÉTODOS DE IMPLEMENTAÇÃO

As linguagens de programação são divididas em quatro categorias principais,


sendo elas de linguagens imperativas, funcionais, lógicas e orientadas a objeto.
Essas categorias de linguagens podem ter ramificações, como no caso das
linguagens imperativas que podem ser visuais ou não (.NET), linguagens de
scripts como Javascript, ou que aceitam a orientação a objetos como C++, sem
deixarem de ter como base a programação imperativa.
Numa linguagem imperativa, o código que representa um algoritmo é muito
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

detalhado e a ordem de execução é bem definida. Já numa linguagem lógica, esta


se baseia em regras sem uma ordem pré-definida, ficando a critério de o sistema
definir a ordem adequada de execução do código.
Linguagens de marcação como HTML fazem parte de uma onda mais recente
de linguagens de programação desenvolvidas com o propósito de desenvolver
aplicações web, podendo ser consideradas como uma categoria a parte.
Sabe-se que a memória armazena temporariamente os dados e o programa
propriamente dito em tempo de execução, e o processador realiza as operações
básicas lógicas e aritméticas.
Assim, para haver o correto funcionamento, as linguagens em geral possuem
um conjunto de macroinstruções que são implementadas por outro conjunto de
microinstruções que lidam mais diretamente com sistema operacional e hardware.
O processo de execução de programas codificados em diferentes linguagens
de programação pode ocorrer diretamente na máquina, no caso de linguagens de
máquina, ou em passos, como ocorre com compiladores que convertem lingua-
gem de alto nível com comandos na sintaxe da linguagem não compreensíveis
pelo hardware para linguagem de máquina compreensível pelo hardware.
Esse método de compilação permite uma execução rápida de programas,
pois gera um aplicativo independente do compilador depois de terminado o
processo como na linguagem C.
O processo parece simples, mas envolve etapas que serão detalhadas no
decorrer do livro, que lidam diretamente com conjuntos de regras para análise
de códigos escritos em determinada linguagem.

Métodos de Implementação
20 UNIDADE I

Outro processo bastante comum é a interpretação pura, em que um sof-


tware interpretador compreende a codificação da linguagem sem necessidade
de compilação e executa seus comandos de acordo com a ordem indicada do
fluxo da execução.
Essa interpretação tem a vantagem de poder indicar com maior exatidão
onde um erro ocorreu e facilitar a solução de problemas ocorridos em run-time
(tempo de execução).
Por outro lado, pelo fato da interpretação ser feita em tempo real, o tempo
de execução aumenta e maior poder de processamento é necessário no equipa-

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
mento, ou maior simplicidade nas tarefas executadas pelo código.
Uma forma híbrida de implementação consiste em compilar uma lingua-
gem de alto nível em outra intermediária, mas de interpretação bem mais rápida
para garantir melhores resultados em tempo de execução.
Algumas versões de Java são híbridas, pois convertem o código Java em
uma forma intermediária compatível com qualquer plataforma chamada byte
code que roda na Java Virtual Machine específica de cada plataforma, mas há
versões que convertem byte code em linguagem de máquina para maior veloci-
dade de execução.
Just-in-Time (JIT) também funciona de forma híbrida, sendo que o sistema
traduz a linguagem inicial em Java, por exemplo, em linguagem intermediária
para ser interpretada em tempo de execução, mas o código interpretado é man-
tido para as execuções seguintes.
O pré-processador é um software que faz a primeira preparação antes da
compilação, para preparar tipos definidos pelo programador e carregar o código
de bibliotecas para dentro do código original.

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


21

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO


Figura 1 – Genealogia das principais linguagens de programação

Fortran I FLOW-MATIC
Fortran II ALGOL 58
USP
ALGOL 60 APL COBOL

Fortran IV CPL
SIMULA I SNOBOL
BASIC PL/I
ALGOL W
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

SIMULA 67
ALGOL 68
BCPL
B
Pascal C

Prolog
Scheme

MODULA 2
Fortran 77 awk ML
Smalltalk 80

ICON
Ada 83 Miranda
C++ COMMON LISP
Perl
MODULA Oberon QuickBasic Haskell
Ansi C (C89)
Fortran 90 Eiffel Visual Basic
Python

Lua PHP Java


Fortran 95 Ada 95 Ruby

Javascript
C99
C# Python 2.0
Visual Basic.NET

Fortran 2003
Ruby 1.8 Java 5.0
Ada 2005
Java 6.0 C# 2.0 Python 3.0
C# 3.0
Fortran 2008 Ruby 1.9
C# 4.0
Java 7.0

Fonte: Sebesta (2012 - p. 37).

Evolução das Linguagens de Programação


22 UNIDADE I

O INÍCIO

Konrad Zuse provavelmente tenha sido o criador da primeira linguagem chamada


Plankalkül na década de 1940 para equipamentos desenvolvidos por ele mesmo.
Uma linguagem que já continha tipos de dados baseados em bits, estruturas
de dados como vetores e registros, além de laços de repetição e uso de variáveis
em expressões matemáticas.
Os computadores desta época eram grandes, caros, lentos e sua programa-
ção era bem específica, em linguagem de máquina para otimizar os escassos

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
recursos que possuíam.
Ainda no final da década de 1940, o UNIVAC I (primeiro computador ven-
dido nos Estados Unidos com fins comerciais) utilizava uma linguagem chamada
Short Code, que trabalhava dentro das especificações da arquitetura diferenciada
do hardware do UNIVAC I.
Anos depois, a IBM conseguiu criar uma das mais importantes linguagens da
história, chamada Fortran (The IBM Mathematical Formula Translating System),
na década de 1950, para ser utilizada com o IBM 704 como, provavelmente, a
primeira linguagem compilada de alto nível.
A linguagem era baseada nas instruções do IBM 704 e continha certas regras
em sua sintaxe que padronizavam regras como a que variáveis iniciadas com as
letras I, J, K, L, M e N seriam do tipo inteiro, e as demais para valores de ponto
flutuante.
Mudanças foram ocorrendo com o passar dos anos e a linguagem Fortran
sofreu modificações, como suporte a orientação a objetos, até a versão 2008
(ISO/IEC 1539-1, 2010).

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


23

Figura 2 – Exemplo de código Fortran


Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: Sebesta (2012 - p. 46-47).

Evolução das Linguagens de Programação


24 UNIDADE I

A linguagem LISP também surgiu no final dos anos 1950 como exemplo
de linguagem de programação funcional, baseada em suas predecessoras IPL-I,
IPL-II e FLPL que eram mais limitadas.
A linguagem LISP trabalha apenas com átomos e listas representando símbo-
los literais simples ou agrupados (delimitados entre parênteses) respectivamente,
sendo ideal para uso na área de inteligência artificial (IA) e de codificação sim-
ples devido a pouca variação de comandos em seu código.
Figura 3 – Exemplo de código LISP

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Fonte: Sebesta (2012 - p. 50-51).

ALGOL (Algorithmic Language) foi uma linguagem com fins científicos que ser-
viu de base para muitas outras e teve base na linguagem Fortran, modificando
diversos conceitos para torná-la universal e sem ligação com algum hardware
específico.
Sua versão 58 ficou mundialmente conhecida e, com o tempo, sugestões de
mudanças foram debatidas para que sua versão 60 fosse implementada, incluindo
conceitos como passagem de parâmetros para sub-rotinas e recursividade.

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


25

Figura 4 – Exemplo de código ALGOL


Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: Sebesta (2012 - p. 57-58).

Evolução das Linguagens de Programação


26 UNIDADE I

A linguagem COBOL é uma das mais usadas na história e pode ter influen-
ciado algumas outras linguagens que vieram depois dela, pois era fortemente
voltada ao desenvolvimento de aplicações comerciais.
Implementada no final dos anos de 1950, assim como a linguagem FLOW-
MATIC para UNIVACs, COMTRAN, implementada pela IBM, e a linguagem
AIMACO usada pela Força Aérea Norte Americana.
A linguagem COBOL teve modificações padronizadas pelo padrão ANSI
até o início dos anos 2000 e continua em uso em softwares específicos e main-
frames. O aumento da capacidade de hardware contribuiu para que a linguagem

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
sobrevivesse, pois, com baixa performance, seu custo e benefício se tornaram
menos atrativos.
Figura 5 - Exemplo de código COBOL

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Evolução das Linguagens de Programação


27
28 UNIDADE I

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Fonte: Sebesta (2012 - p. 61-63).

A linguagem BASIC (Beginner’s All-purpose Symbolic Instruction Code), criada na


década de 1970, foi muito popular pela facilidade de aprendizado e pela popu-
larização dos microcomputadores na década de 1980.
Seu código era bastante simples, mas limitado, e até o surgimento da versão
Visual BASIC, seu uso foi sendo reduzido continuamente.

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


29

Figura 6 - Exemplo de código BASIC


Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: Sebesta (2012 - p. 65).

Evolução das Linguagens de Programação


30 UNIDADE I

A linguagem PL/I foi a primeira linguagem desenvolvida para ser genérica,


atendendo a qualquer tipo de aplicação e sem vínculo a algum hardware mais
específico da época.
Uniu qualidades das demais linguagens citadas como recursividade, estruturas
de dados e qualidade na entrada e saída de dados, combinadas com novos concei-
tos para criar uma linguagem complexa e que acabou não se firmando por isso.
Outras linguagens que também não seguiram por muito tempo foram as lin-
guagens APL, SNOBOL, SIMULA 67, e ALGOL 68, mas todas puderam trazer
algum acréscimo para as linguagens desenvolvidas posteriormente.

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Na década de 1970, quando surgiu a linguagem Pascal, que teve sua base ins-
pirada em linguagens como o ALGOL 60, sua popularidade foi tremenda devido
ao seu uso no meio acadêmico para o aprendizado de programação.
Uma linguagem ideal para a época, por ter códigos de fácil leitura e ser
capaz de implementar códigos para diversos tipos de aplicações diferentes. Foi
amplamente usada até a década de 1990, quando começou a perder espaço para
linguagens como C++.
No início dos anos 2000, a linguagem Delphi, híbrida de imperativa com
orientação a objetos, utilizou a linguagem Pascal como base, incluindo compo-
nentes para desenvolvimento em plataforma visual.
Figura 7 - Exemplo de código Pascal

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


31
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: Sebesta (2012 - p. 76 a 77).

No início dos anos de 1970, a linguagem C foi implementada por Dennis Ritchie
baseando-se nos conceitos de linguagens como B, BCPL e CPL, que foram desen-
volvidas anteriormente, partindo do início dos anos de 1960.
Essa linguagem é utilizada em larga escala, sendo uma das três linguagens
mais utilizadas no mundo por servir de base para uma quantidade enorme de
softwares que interajam diretamente com hardware e sirvam de base para outros
softwares como sistemas operacionais ou sistemas embarcados.
Tem uma leitura um pouco mais difícil por permitir maior variação nos coman-
dos e ser menos ortogonal que muitas outras linguagens, mas como serviu de
base para a elaboração de quase todas as linguagens que vieram após ela, direta
ou indiretamente, segue sendo uma referência no desenvolvimento de softwares e
aprendizado de programação.

Evolução das Linguagens de Programação


32 UNIDADE I

Figura 8 - Exemplo de código C

#include <stdio.h>
int main () {
float notas [3][2];
int i, j;
float media[3];
for (i=0; i<3; i++) {
for (j=0; j<2; j++) {

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
printf (“Aluno %d - nota %d: “, i+1, j+1);
scanf (“%f ”, &notas [i][j]);
}
}
for (i=0; i<3; i++) {
printf (“\n\nNota do aluno %d”, i+1);
for (j=0; j<2; j++) {
printf (“\n%f . nota: “, notas [i][j]);
media[i] = media[i] + notas [i][j];
}
printf (“\nMedia: %f ”, media[i]/2);
}
}

Fonte: O autor.

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


33

A linguagem Prolog é baseada em programação lógica não procedural que


poderia ser uma alternativa à programação imperativa, mas mostrou ser menos
eficiente e muito específica em termos de área de aplicação.
Outra linguagem bastante conhecida foi Ada, desenvolvida pelo Departamento
de Defesa dos Estados Unidos, que usava seus códigos em sistemas embarca-
dos. Era capaz de trabalhar encapsulamento, muitas facilidades para tratamento
de exceções.
Esta linguagem Ada teve evoluções nos e anos de 1990 e 2000, foi melho-
rando sua programação orientada a objetos, incluindo melhorias como herança,
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

mas seu uso pode ter declinado quando o Departamento de Defesa dos Estados
Unidos deixou de solicitar programas na linguagem Ada.

ORIENTAÇÃO A OBJETOS

Smalltalk foi a primeira linguagem realmente implementada para programação


orientada a objetos, e foi desenvolvida por Alan Kay que, na década de 1960, já
imaginava que um dia computadores de menor porte poderiam ser utilizados
por pessoas sem conhecimentos em programação.
A linguagem Smalltalk se baseia no conceito do envio de mensagens a um
objeto para ativar seus métodos e este retornar nova mensagem ao objeto que
o chamou.
Outro ponto fundamental da linguagem Smalltalk foi o uso de interface
gráfica no desenvolvimento de aplicações que se tornou o ambiente padrão de
desenvolvimento das posteriores linguagens de programação criadas.

Orientação a Objetos
34 UNIDADE I

Figura 9 - Exemplo de código Smalltalk

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: Sebesta (2012 - p. 87).

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


35

A combinação entre diferentes tipos de categorias de linguagens de progra-


mação é algo que ocorre com frequência cada vez maior ao longo da evolução
das ferramentas de programação.
Uma evolução muito importante que ocorreu foi a união entre a programa-
ção imperativa e a orientada a objeto, permitindo o surgimento de evoluções
como a linguagem C++, que adicionou à linguagem original C toda a parte de
programação orientada a objeto.
Importante ressaltar que esta evolução não trouxe prejuízos significativos
quanto a performance, e manteve total compatibilidade com códigos feitos em
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

linguagem C, mostrando que não houve necessidade de remover componentes


da implementação original.
No início dos anos 2000, com o surgimento da plataforma Microsoft para
desenvolvimento. NET, que trouxe a linguagem C++ para o ambiente web, e que
após uma versão chamada MC++, evoluiu para a atual C#.
Outra implementação muito importante surgida no final dos anos 2000,
chamada Objective-C, que combinava a base da linguagem C com a sintaxe da
linguagem Smalltalk utilizada em larga escala pela Apple, após o fracasso da
empresa NeXT de Steve Jobs, que permitiu seu uso como padrão para o desen-
volvimento dos aplicativos para iPhone.
No final dos anos 2000 ainda, outra linguagem baseada em C implementada
foi a linguagem Go dentro da Google, permitindo que códigos extensos em C++
que demoravam a serem compilados pudessem ser mais rapidamente compila-
dos na nova linguagem.
Algumas das principais características era que funções podem retornar múl-
tiplos valores e a declaração de variáveis é feita de maneira diferente de C. Go
não implementa a orientação a objetos tradicional e os comandos em si são os
mesmos da linguagem C com algumas diferenças e inclusões.
A linguagem Java baseou-se em C++, modificando alguns conceitos, mas
tendo uma sintaxe em sua construção de código bastante semelhante, mais oti-
mizada e segura.

Orientação a Objetos
36 UNIDADE I

Durante a década de 1990, quando a Internet se tornou uma realidade em


escala mundial, a linguagem Java encontrou seu propósito maior e popularizou-
-se rapidamente nos anos seguintes, tornando-se a maior rival da linguagem C
e C++ em termos de linguagem mais utilizada.
Algumas diferenças conceituais como a inexistência de ponteiros, substituí-
veis por outros tipos de dados capazes de referenciar classes, por exemplo. Tipo
booleano também inexistente em C para uso em estruturas de decisão, mas assim
como em C e C++, não se pode utilizar expressões em estruturas de decisão.
Figura 10 - Exemplo de código Java

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


37

Fonte: Sebesta (2012 - p. 94).


Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Com tantas opções de linguagens de programação no mercado, é preciso


conhecer várias ou ser especialista em uma ou duas? A área de atuação é
importante e ajuda na escolha.

LINGUAGENS PARA INTERNET

Linguagens de scripts são mais recentes e também se desenvolveram com a evo-


lução da Internet, a partir da década de 1990, e mantêm um ritmo de evolução
constante e com novas ideias surgindo de tempos em tempos.
Uma delas, chamada Perl, semelhante a linguagens imperativas, têm parti-
cularidades como uma compilação de código, variáveis com indicação de suas
estruturas de dados por meio de caracteres como “@”, “$” e “%”.
Matrizes dinâmicas e controladas de formas diferentes de acordo com a
necessidade por meio de cadeias de caracteres ou com lacunas entre as célu-
las da matriz, permitindo, por exemplo, o aumento de tamanho de estruturas
quando necessário.

Linguagens para Internet


38 UNIDADE I

Figura 11 - Exemplo de código Perl

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: Sebesta (2012 - p. 96-97).

Javascript, uma linguagem que surgiu no início dos anos 2000, baseou-se na lin-
guagem LiveScript de 1995 e teve sucessivas evoluções que adicionam recursos
a esta poderosa linguagem a cada nova implementação.
A linguagem Javascript pode ter seu interpretador adequado para ser embu-
tido em aplicações e navegadores web, tendo seu código incluído dentro do
código HTML, neste caso.

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


39

Sua forma de codificação similar a Java, mas com conceitos diferentes, per-
mite tipos definidos em tempo de execução e estruturas de dados dinâmicas,
além de orientação a objetos sem recursos como herança.
Figura 12 - Exemplo de código Javascript
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: Sebesta (2012, p. 98).

Linguagens para Internet


40 UNIDADE I

A linguagem de scripts PHP (Personal Home Page) também surgiu em meados


da década de 1990. É uma linguagem que teve um crescimento enorme devido
a sua capacidade de trabalhar com dados.
Servidores web em geral continham websites que gerenciavam dados, e
esta linguagem PHP pode embutir seu código dentro de códigos HTML, assim
como Javascript, para aumentar as potencialidades da linguagem de marcação
para páginas web HTML.
Similar à linguagem Perl, Python é uma linguagem para propósitos diver-
sos, criada durante a década de 2000. Tem uma estrutura de código diferente e

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
se baseia em três tipos de dados (listas, tuplas e dicionários),
É uma linguagem orientada a objetos como Perl e contém tratamento de
exceções, controle de objetos descartados, computação gráfica e acesso a dados
pelo navegador.
Ruby, uma linguagem implementada nos anos 1990, continua em uso e seu
código é todo voltado para orientação a objetos, assim como Smalltalk. Classes
e objetos podem ter métodos adicionados dinamicamente e isso faz com que, a
cada execução, classes e objetos possam ser diferentes.
A linguagem Lua, desenvolvida no Brasil durante a década de 1990 por
Roberto Ierusalimschy, Waldemar Celes e Luis Henrique de Figueiredo na
Pontifícia Universidade do Rio de Janeiro, suporta programação procedural e
funcional.
É uma linguagem não orientada a objetos, mas segue os conceitos desta cate-
goria de linguagens de programação, sendo uma linguagem simples com poucas
palavras reservadas e costumando servir de complemento para outras linguagens.
A linguagem C#, desenvolvida na década de 2000 pela Microsoft, mescla
conceitos de várias linguagens como C++, Java e Delphi, trabalhando com pro-
gramação visual e desenvolvimento .NET no pacote de desenvolvimento criado
pela própria Microsoft chamado Visual Studio.
C# é uma linguagem poderosa e segue em evolução para, assim como Java,
ser uma referência na programação .NET, tendo as qualidades essenciais de C++
e podendo adicionar as evoluções advindas da programação web.

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


41

Figura 13 - Exemplo de código C#


Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: Sebesta (2012 - p. 103-104).

Linguagens para Internet


42 UNIDADE I

Linguagens de programação podem ser utilizadas por muito tempo, como a


linguagem COBOL, que até hoje existente em sistemas legados de grandes
mainframes.
Algumas não sofrem modificações, mas outras vão sendo adaptadas para
gerarem novas implementações que evoluem e se adaptam às necessida-
des do mercado.
A linguagem C continua em uso por diversos motivos citados ao longo do

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
livro, mas também teve novas implementações que permitiram o surgimen-
to de novas versões que também seguem fazendo sucesso no mercado do
desenvolvimento de aplicações.
A mais importante foi a linguagem C++, que permitiu um avanço enorme
na programação e afastou um pouco o programador do baixo nível de pro-
gramação.
Outra implementação com base na linguagem C foi a linguagem Java e sua
variante Javascript, com seu foco voltado para o desenvolvimento web.
C# e Objective-C foram desenvolvidas para criação de aplicações web, sendo
que C# permite programação para várias plataformas e a outra é mais espe-
cífica para a Apple.
Fonte: VEJA quais são as 20 linguagens de programação mais populares. Olhar Di-
gital, 2015. Disponível em: <http://olhardigital.uol.com.br/noticia/veja-quais-sao-as-
-20-linguagens-de-programacao-mais-populares/46271>. Acesso em: 29 mar. 2016.

Finalmente, as linguagens de marcação como XML e HTML formam a base do


desenvolvimento de páginas web e são simples, sem conceitos avançados como
orientação a objetos, pois têm uma função única de estruturar e elementos a
serem dispostos em páginas.
São linguagens que aceitam o acréscimo de códigos de outras linguagens

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


43

como Javascript e PHP, que contribuem com a qualidade dos resultados obtidos
e agregam muitas funcionalidades a estas linguagens de marcação.
Uma linguagem desenvolvida para auxiliar a produção de código em lingua-
gens de marcação foi a linguagem CSS, que sofre evoluções para agregar novas
funcionalidades. É uma linguagem simples, agregada ao HTML para padroni-
zação de formato dos elementos das páginas como texto e imagem.
Figura 14: Exemplo de código HTML
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: O Autor.

CONSIDERAÇÕES FINAIS

Um paradigma de programação se refere diretamente ao método de desenvol-


vimento de código por parte do programador, sabendo que cada linguagem
tem em seus paradigmas, os limites que suas técnicas de programação impõem.
Desta forma, a escolha de uma linguagem adequada a cada caso envolve tais
paradigmas, pois a escolha de uma opção equivocada pode prejudicar a quali-
dade, o tempo de desenvolvimento ou até impossibilitar a produção do código
capaz de atender às necessidades do projeto, devido às limitações da linguagem.
Num paradigma estruturado ou procedural, é possível resolver problemas

Considerações Finais
44 UNIDADE I

dividindo-os em partes de forma a tratar frações do problema, simplificando a


codificação, e podendo tratar em funções ou procedimentos interligados por
parâmetros para, no conjunto, chegar a uma solução ideal para problema.
Já no paradigma orientado a objetos, ao invés de funções e procedimentos,
objetos são instanciados a partir de classes criadas para que a forma como cada
objeto trabalhe seja encapsulada e independente do resto do código, de certa
forma, e possa ser facilmente reaproveitado em códigos futuros.
Existe alguma similaridade nas formas de programação, pois partem de cer-
tos princípios lógicos comuns a todas as linguagens, mas a forma como estes

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
princípios são utilizados e quais técnicas mais específicas são implementadas
representam as diferenças entre as linguagens.
Independente de quais sejam os paradigmas de cada linguagem, cabe ao pro-
gramador identificar aqueles relacionados à sua forma de produzir código e de
que forma as especificidades técnicas de cada linguagem afetam seu trabalho.
Se a aplicação a ser desenvolvida envolver programação orientada a objetos
ou programação estrutural, por exemplo, isso pode ser um critério para a deci-
são em relação à linguagem a ser utilizada na implementação.

EVOLUÇÃO DAS LINGUAGENS DE PROGRAMAÇÃO, SINTAXE, SEMÂNTICA E ANÁLISE LÉXICA


45

1. Existem diversas linguagens diferentes de programação. Quais


as diferenças entre as linguagens Smalltalk e HTML?
2. A linguagem C é uma das linguagens antigas que sobreviveram
até os dias atuais. Ela sofreu evoluções e modificações. Quais
linguagens que evoluíram de C, contendo características perti-
nentes a essa evolução.
3. Existem linguagens voltadas para a criação de softwares para
uso em desktops isolados ou em rede. Existem também lingua-
gens para desenvolvimento de produtos para web. Cite as lin-
guagens populares para desenvolvimento desktop e web.
4. Algumas linguagens, com o passar dos anos, sofreram altera-
ções ou novas aplicações para continuarem ativas e se adap-
tar às novas tecnologias e funcionalidades nos computadores.
Surgiram alternativas de desenvolvimento tais como Delphi
e Visual Studio. Quais linguagens serviram de base para estas
tecnologias que surgiram muitos anos depois das linguagens
utilizadas por elas?
a) C e Java
b) HTML E CSS
c) Pascal e C++
d) PHP e Javascript
5. Algumas linguagens, além de usar letras em seus comandos,
utilizam outros símbolos para sua codificação. O símbolo $ é
usado em qual linguagem, por exemplo?
46

Classificação das Linguagens de Programação quanto à Geração


Alguns autores dividem as linguagens de programação de acordo com a época em que
surgiram, e, segundo Maclennan, temos cinco gerações distintas, tendo elas detalhes
fundamentais que contribuíram para a divisão das categorias.
Uma primeira geração seria representada por linguagens que contém instruções que
trabalham em nível de hardware e instruções de controle mais simples, sem muitos re-
cursos.
A segunda geração poderia ser representada por linguagens com estruturas de controle
mais elaboradas, permitindo aninhamento entre estruturas e não lidando tão direta-
mente com a máquina.
Numa terceira geração temos linguagens de alto nível, distantes do hardware e conten-
do instruções já bem avançadas e com grande capacidade de variação nas aplicações
possíveis, utilizando estruturas de dados mais complexas.
A quarta geração representava linguagens orientadas a objeto com abstração de dados
e demais conceitos relativos a esta forma de programação.
Na quinta geração, ocorre a união das diferentes categorias de paradigmas de progra-
mação como orientação a objetos e programação funcional.
Assim, pode-se observar que linguagens de programação com finalidades muito distin-
tas podem ser agrupadas, mas não existe um critério único para isto, pois mudanças de
paradigma ou de formas de programação influenciam toda uma geração de linguagens
criadas com propósitos coerentes com os tipos de aplicação comuns em determinada
época.
De qualquer maneira, uma linguagem pode ser classificada de acordo com a finalidade
profissional a qual se destina, seja ela de manipulação de hardware puro em dispositivos
com tecnologias embarcadas ou linguagens para aplicações comerciais de alto nível.
Linguagens de programação são ferramentas muito poderosas e variadas em sua capa-
cidade técnica e utilizações, mas certos conceitos são fundamentais para que se possa
situar uma linguagem em relação à outra.
Conhecer os fundamentos da programação é muito importante para o aprendizado de
qualquer linguagem específica e, após o aprendizado de uma linguagem, outras são
mais facilmente aprendidas.
Fonte: Sebesta (2012).
MATERIAL COMPLEMENTAR

Título: Linguagens de Programação - Princípios e Paradigmas – 2ª ed.


Autor: Allen B Tucker; Robert Nooman
Editora: Amgh Editora
Sinopse: Livro bastante conceituado sobre o projeto de linguagens
de programação com exemplos práticos comentados de forma a
facilitar a compreensão de instruções e como funcionam linguagens de
programação em geral.

Material Complementar
REFERÊNCIAS

REFERÊNCIA LIVROS
ASCENCIO, A. F. G. Fundamentos da programação de computadores: algoritmos
PASCAL, C/C++ (padrão ANSI) e JAVA. 3. São paulo: Ed. Pearson Education do Brasil,
2012.
MACLENNAN, B. J. Principles of Programming Languages: Design, Evaluation and
Implementation (em inglês). 3ª ed. Oxford: Oxford University Press, 1999.
SEBESTA, R. W. Concepts of programming languages.10ª ed. New Jersey: Pd. Pear-
son EducationInc., 2012.

REFERÊNCIA LINKS
VEJA quais são as 20 linguagens de programação mais populares. Olhar Digital,
2015. Disponível em: <http://olhardigital.uol.com.br/noticia/veja-quais-sao-as-
-20-linguagens-de-programacao-mais-populares/46271>. Acesso em: 29 mar. 2016.
49
GABARITO

1. Smalltalk é uma linguagem totalmente voltada à programação orientada a obje-


tos, compilada e capaz de criar programas, e HTML é uma linguagem de marca-
ção para web, sem recurso algum de orientação a objetos, interpretada e neces-
sita de um navegador para que seus códigos funcionem.
2. A linguagem C++, evolução da linguagem C, evolui com a principal aquisição
da programação orientada a objetos em sua definição. Alterações na sintaxe e
funcionalidade de alguns comandos, novos tipos, e estruturas de dados foram
implementadas. C# que foi modificada para WEB, e Objective-C para desenvolvi-
mento de aplicações Apple.
3. C, Pascal, Basic, Java e Smalltalk para programação desktop, e Javascript, HTML,
Perl, PHP e CSS para programação web.
4. C - Pascal e C++.
5. Perl e PHP.
Professor Esp. Ronie Cesar Tokumoto

II
NOMES, TIPOS DE DADOS,

UNIDADE
OPERADORES, EXPRESSÕES
E ESTRUTURAS

Objetivos de Aprendizagem
■■ Conhecer regras para definição de nomes utilizados em linguagens.
■■ Conhecer os tipos de dados aceitos.
■■ Saber os tipos de operadores aceitos.
■■ Compreender a estrutura de expressões lógicas e matemáticas.
■■ Ser capaz de elaborar estruturas compostas de dados.

Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
■■ Sintaxe e semântica
■■ Análise sintática e léxica
■■ Nomes e tipos de dados
■■ Operadores e expressões
■■ Estruturas de controle
53

INTRODUÇÃO

Uma linguagem de programação, independente da época em que tenha sur-


gido, deve possuir regras bem definidas para que códigos gerados nela possam
realmente ser efetivos e cumprir seu papel no desenvolvimento de aplicações.
O programador deve conhecer uma linguagem para poder programar nela,
mas não é obrigado a saber exatamente tudo que uma linguagem pode ofere-
cer, e tende a descobrir aos poucos os limites da linguagem com a qual trabalha.
Independente do quanto conheça de uma linguagem, uma certeza que possui
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

é que, provavelmente, errará muitas vezes ao desenvolver programas na mesma,


e tais erros devem ser encontrados pelo responsável pela verificação do código
antes de seu uso como produto executável.
Analisadores de códigos embutidos em compiladores ou interpretadores
devem ser capazes de ler um código criado e vasculhar sua estrutura para iden-
tificar todos os possíveis erros que possam prejudicar seu funcionamento, de
preferência antes do mesmo ser executado e gerar erros em tempo de execução.
Tais erros em tempo de execução são piores, pois podem prejudicar gran-
des operações dependendo de onde estiverem inseridos e sua função, podendo
ser algo simples ou extremamente complexo.
A sintaxe e a semântica são duas áreas da verificação de códigos que preci-
sam ser muito bem definidas para reduzir a ocorrência de exceções e efetuar as
devidas ligações entre as partes de um programa.
A forma como essas análises são realizadas é o foco desta unidade, que se
preocupa em mostrar um pouco da análise que é feita em um código para veri-
ficar sua validade e acerto.
Estruturas em forma de árvore são úteis para ilustrar como instruções de
um código são construídas e compreendidas, separando em ramificações os ele-
mentos que compõem estas instruções.
A simbologia, operadores e demais elementos que podem compor instru-
ções são estudados para que sejam compreensíveis as regras que definem como
uma linguagem se comporta e quais suas limitações.

Introdução
54 UNIDADE II

SINTAXE E SEMÂNTICA

Toda linguagem de programação é composta por comandos organizados den-


tro de certa lógica e seguindo a mesma no desenvolvimento de seus códigos, de
acordo com sua finalidade e forma como se implementam os programas.
Descrever uma linguagem é um processo complicado, pois precisa ser feito
de forma completa e levando em consideração as diferentes interpretações que
um texto pode receber.
Toda linguagem, enquanto implementada, precisa ser testada para que possa

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
ser avaliada por possíveis usuários e tenha, por meio dos retornos (feedback),
trazidos por estes, a possibilidade de ser ajustada até que possa ser oficialmente
lançada no mercado e utilizada profissionalmente no desenvolvimento de soluções.
Guias de referência, livros e cursos precisam ser ofertados para capacitar
todos os interessados na ferramenta para que sejam capacitados a explorar as
potencialidades da linguagem.
Neste contexto, o termo sintaxe se refere a como são construídos os coman-
dos de uma linguagem de programação, indicando, para cada palavra reservada,
parâmetros aceitos e a forma correta de usá-los.
Complementarmente, a semântica avalia a correta colocação dos comandos
que podem conter ou não blocos com outros comandos associados a estes blo-
cos, e sua colocação dentro de subprogramas ou do programa como um todo.
Em geral, uma linguagem é formada por caracteres de um alfabeto agrupados
em cadeias que formam sentenças. O termo comando será utilizado para deno-
minar estas sentenças aceitas por uma linguagem de programação, mesmo que,
em diversas linguagens, se utilize outras nomenclaturas, como TAG ou seletor.
Uma análise de sintaxe parte do princípio que determinada linguagem con-
tenha palavras reservadas formadas por símbolos de um alfabeto definido. O
processo lê uma cadeia de símbolos contidos em uma linha até que se encontre
um símbolo marcador de final de comando.
Todas as sequências menores de símbolos são analisadas separadamente para
serem validadas em relação às regras de construção de comandos na linguagem
em termos de palavras reservadas e parâmetros.

NOMES, TIPOS DE DADOS, OPERADORES, EXPRESSÕES E ESTRUTURAS


55

Existem geradores de código capazes de construir, com limitações, progra-


mas inteiros para atender demandas, mas, pela limitação que o gerador possui
de criação de variações de comandos, o programa tende a ser mais limitado e
padronizado.
Um termo muito utilizado nesta área de estudos é metalinguagem, que repre-
senta uma linguagem utilizada para representar outra, em que a BNF (Backus-Naur
form) é uma metalinguagem para programação.
Pelas regras da BNF, a associação, por exemplo, se baseia no conceito de que
uma variável recebe um valor ou expressão, sendo o símbolo de igualdade (=),
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

responsável por separar as duas partes do comando.


Listas de identificadores são separadas pelo símbolo de vírgula (,), lem-
brando que estes identificadores podem ser valores ou expressões, por exemplo.
Operadores também têm seus símbolos definidos no caso de operadores
matemáticos, como soma (+), subtração (-), operadores lógicos como E(&), OU
(|), e operadores relacionais como maior (>) e menor (<).
A escolha das palavras-chave, regras de construção de comandos e expressões
válidas é implementada de forma particular em cada linguagem, e as limitações
e exceções que influenciam diretamente a ortogonalidade da linguagem estão
diretamente ligadas ao uso de metalinguagens como a BNF.
A Figura 1 contém um exemplo de código gerado utilizando apenas os ele-
mentos definidos até o momento, seguindo a simbologia definida como padrão
e utilizando os conceitos básicos de estruturação de algoritmos para a constru-
ção dos comandos.
Figura 1 - Exemplo de código em metalinguagem

Fonte: O Autor.

Toda metalinguagem segue um raciocínio semelhante na estruturação de suas


sentenças que pode ser organizado em partes que podem formar uma árvore
que define todos os componentes de cada comando.

Sintaxe e Semântica
56 UNIDADE II

A figura 2 mostra como poderia ser a árvore de um dos comandos mostra-


dos na figura 1, separando todos os elementos do comando dentro da estrutura.
Figura 2 - Exemplo de árvore de sintaxe de um comando

<atribuição>

<atribuição> = <expressão>

Var3 Var1 + Var2

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Fonte: O Autor.

Pode acontecer de expressões diferentes em sua estrutura terem resultados iguais,


devido à equivalência de alguns operadores, e gerarem árvores diferentes, mas
com interpretações iguais, gerando ambiguidade.
Neste caso há ambiguidade, pois, tendo o mesmo resultado, duas expressões
podem, então, resolver um mesmo problema.
Existem casos onde esta mudança gera problemas com resultados, e estas
exceções precisam ser tratadas utilizando outros símbolos adicionais como
parênteses ou regras de formação de expressões que reduzam as possibilidades
de ocorrência de situações inesperadas, como expressões não desejadas.
Uma regra importante para estabelecer a forma como são interpretadas
expressões em determinada metalinguagem são as precedências entre opera-
dores que indicam quais tem prioridade sobre outros na ordem dos cálculos.
Outro ponto importante sobre o uso de operadores é a ordem em que estes
são utilizados em expressões e sua prioridade nos cálculos, pois é preciso regras
para garantir que os cálculos sigam regras matemáticas tradicionais.
Operadores como a adição não sofrem influência na ordem com que duas
somas são realizadas, pois o resultado será sempre o mesmo, mas operadores
como a divisão geram resultados diferentes quando a ordem correta para as divi-
sões que foram calculadas não é respeitada.
Além dos operadores e expressões, temos diversas outras estruturas como
variáveis, comandos e estruturas de dados que precisam ter regras cuidadosa-
mente estabelecidas para que a metalinguagem seja funcional.

NOMES, TIPOS DE DADOS, OPERADORES, EXPRESSÕES E ESTRUTURAS


57

Estruturas como laços de repetição, por exemplo, precisam ser implemen-


tadas de forma que sua sintaxe seja clara e exceções que possam gerar erros de
execução sejam evitadas, como repetições em quantidade errada ou contado-
res de tipos indevidos.
Como um laço de repetição gera uma quantidade de repetições de outros
comandos, estes precisam de delimitadores claros para que o processo de aná-
lise sintática seja eficiente, podendo avaliar comandos aceitos ou não dentro de
um laço e a sintaxe de cada um destes comandos embutidos.
Figura 3 - Exemplo de Laço de repetição
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: O Autor.

O exemplo da Figura 3 mostra um comando que define um laço de repetição


simples, em que temos a definição do número de repetições, o conteúdo a ser
executado nas repetições e o fechamento do bloco de operações a serem reali-
zadas durante o laço.
Observando a Figura 4, é perceptível a divisão do comando em diversos ele-
mentos para definir o laço de repetição e a forma como sua sintaxe é estruturada.
Figura 4 - Exemplo de árvore de sintaxe de um laço de repetição

<laço>

para <identificador> de <identificador> ate <identificador> faça

Var3 <valor> <valor>


Fonte: O Autor.

A semântica é outro ponto fundamental para a definição de uma metalingua-


gem e um código gerado por essa linguagem precisa ser analisado tanto em sua
sintaxe quanto em sua semântica.

Sintaxe e Semântica
58 UNIDADE II

A semântica analisa questões estruturais mais complexas à correta coloca-


ção dos comandos de acordo com a ordem em que devem estar dispostos em
um código e detalhes como declarações de variáveis que podem ser necessárias
antes do uso das mesmas, dependendo de como se queira implementar uma
metalinguagem.
Uma gramática é composta de símbolos que formam seu vocabulário, sendo
que esses símbolos são formados por elementos pertencentes a um alfabeto defi-
nido para delimitar a quantidade possível de símbolos.
Cada símbolo tem uma interpretação diferente e possui uma lista de proprieda-

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
des válidas que ampliam o uso de cada símbolo na construção da metalinguagem.
Esses atributos podem ser sintetizados para passar informações sobre o
símbolo para níveis superiores da árvore de análise semântica ou herdados que
passam informações para níveis inferiores da árvore de análise semântica.
Além destes dois tipos de atributos, existe um terceiro que é gerado quando
se declaram variáveis e estruturas de dados, por exemplo, que criam novos símbo-
los que passam a ser aceitos dentro da análise semântica como válidos, contendo
a forma de uso já previamente determinada na metalinguagem.
Uma variável em diversas linguagens de programação é declarada com um
nome com regras de uso de caracteres restrita, um tipo válido dentre os acei-
tos e, em alguns casos, um símbolo terminal para indicar o fim da declaração.
Com isto, antes deste símbolo terminal, pode-se utilizar outro símbolo sepa-
rador para que mais de uma variável de mesmo tipo seja declarada num mesmo
comando a ser analisado sintática e semanticamente.
Um exemplo pode ser visto na Figura 5, em que é mostrada a mesma situ-
ação de associação de valor a uma variável pelo ponto de vista sintático e, em
seguida, semântico, para que se perceba a diferença na estruturação do comando.
Figura 5 - Exemplo de atribuição de valor à variável

Fonte: O Autor.

NOMES, TIPOS DE DADOS, OPERADORES, EXPRESSÕES E ESTRUTURAS


59

A semântica de uma linguagem de programação é complexa e exige uma


definição muito clara de seus elementos, sendo interessante a descrição de uma lin-
guagem base, sem ambiguidades e simplificada para ser facilmente compreendida.
Assim, poderia ser considerada uma linguagem intermediária entre o que
seria uma linguagem de baixo nível, muito simples, mas desnecessariamente
preocupada com o uso do hardware normalmente. Estaria num nível abaixo de
uma linguagem completa de alto nível, por possuir uma complexidade muito
elevada e ambígua.
A partir da definição desta linguagem intermediária, é preciso que um inter-
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

pretador seja desenvolvido para verificar códigos criados nesta linguagem e sua
estrutura, lógica e comandos.
A semântica é mais complexa que a sintaxe, e descrever o significado de suas
expressões em uma linguagem é uma tarefa difícil, mas importante para que os
profissionais que programarem na linguagem conheçam as instruções e suas
funções dentro de um código.
A chamada Semântica Operacional lida com programas em execução, inter-
pretando o que ocorre com cada instrução e alterações que possam ocorrer com
valores utilizados pelo hardware durante o processo.
Na Figura 6, temos um exemplo em que um comando de decisão do tipo
“se” é interpretado de forma a deixar bem claro como os desvios do fluxo ocor-
rem e a condição para que estes desvios sejam feitos.
Figura 6 - Exemplo de análise semântica operacional

Fonte: O Autor.

Toda linguagem precisa que as expressões construídas em seu código sejam


validadas e, para isto, é preciso provas algébricas para demonstrar as regras que
tratam da validade de operadores e expressões.

Sintaxe e Semântica
60 UNIDADE II

Isso pode ser feito por meio de outra semântica chamada axiomática, que
se baseia em lógica matemática e trabalha com expressões lógicas antes e depois
de cada instrução do código para garantir que as condições para execução das
instruções ocorra adequadamente.
Outro método bastante importante, chamado de Semântica Denotacional,
se baseia na teoria da recursividade para descrever uma linguagem de progra-
mação. Ela, com objetos matemáticos e funções para descrever o significado de
programas, sendo que objetos matemáticos são precisos e bem definidos, ao
passo que instruções de linguagem, não.

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Assim, é preciso trabalhar para conseguir definir os objetos para a lingua-
gem e associar estas funções ligadas a estes objetos para definir os elementos da
sintaxe da linguagem.
Um exemplo de relação denotacional poderia ser utilizado para analisar a
Figura 4, em que poderíamos ter uma função como a da Figura 7 em que letras
maiúsculas com índices indicam as funções associadas ao conceito de pré-con-
dição de uma estrutura de decisão.
Figura 7 - Exemplo de semântica denotacional para estrutura de decisão

Fonte: O Autor.

Temos na Figura 7 diversos símbolos que representam regras da semântica deno-


tacional, como Δ que indica a descrição de uma função matemática; M1, Mb e
Ms que indicam os nomes das funções utilizadas na análise; A e B que repre-
sentam expressões válidas ou não; e s o estado relativo aos dados da instrução.

NOMES, TIPOS DE DADOS, OPERADORES, EXPRESSÕES E ESTRUTURAS


61

ANÁLISE SINTÁTICA E LÉXICA

A análise léxica é a busca por padrões em cadeias de símbolos que sejam aceitos
em uma linguagem de programação. Esta análise é feita antes da análise sintá-
tica, pois verifica, um a um, todos os símbolos e sua validade, uma vez que, em
caso de falha, a análise sintática nem precisa ocorrer para aquela instrução.
Um exemplo simples é mostrado na Figura 8, em que é ilustrada a análise
léxica da primeira linha da estrutura de decisão baseada na estrutura mostrada
na Figura 6 que representa a parte fundamental da estrutura em si.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Figura 8 - Exemplo de análise léxica em estrutura de decisão

Fonte: O autor.

Os compiladores utilizam a análise léxica para gerar os lexemas já analisados e


extraídos do código e passa-los ao analisador sintático para efetuar sua etapa de
verificação do código, podendo assim ter apenas a função de verificar a sintaxe,
sem se preocupar com a identificação de símbolos incompreensíveis já verifica-
dos pelo analisador léxico.
A análise sintática é realizada para verificar um código criado para uma
determinada linguagem de programação e conferir se está sintaticamente cor-
reto, fornecendo mensagens de feedback em caso de erros, além de produzir
uma estrutura contendo a análise realizada, para servir de base para sequência
do processo de compilação do código.
A estrutura sintática pode ser obtida através de um processo que inicia pela
parte superior da possível estrutura (cima-baixo) ou pela parte inferior até sua
extremidade superior (baixo-cima), ambas complexas e lentas, pois o processo
de análise se baseia na ideia da leitura de visualizar apenas um próximo símbolo.

Análise Sintática e Léxica


62 UNIDADE II

A análise recursiva descendente trabalha com a regra cima-baixo para utili-


zar subprogramas de forma recursiva para analisar códigos contendo blocos de
instruções e estruturas aninhadas.
Segundo uma norma adequada para este caso, chamada BNF estendida,
pode-se usar colchetes para representar elementos que são opcionais em uma
instrução e usar chaves para representar elementos que podem se repetir uma
ou mais vezes.
Na Figura 9 temos um exemplo em notação BNF estendida utilizando uma
instrução de atribuição para oferecer mais de uma alternativa possível e ilustrar

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
como estruturar a análise descendente recursiva.
Figura 9 - Exemplo de BNF estendida e subprograma para análise recursiva

Fonte: O Autor.

NOMES E TIPOS DE DADOS

O uso de nomes é utilizado em programação para definir elementos que comple-


mentam instruções baseadas no uso de palavras-chave, e seguem certas regras
definidas por cada linguagem para que seus analisadores léxicos e sintáticos con-
sigam interpretar cada instrução codificada.

NOMES, TIPOS DE DADOS, OPERADORES, EXPRESSÕES E ESTRUTURAS


63

A linguagem FORTRAN foi a primeira a permitir nomes com mais de um


caractere, permitindo até seis caracteres em sua implementação inicial, abrindo
as portas para que novas regras com maior quantidade de caracteres aceitos fos-
sem surgindo.
Algumas linguagens exigem nomes contendo apenas letras do alfabeto,
podendo ser maiúsculas ou minúsculas apenas, ou ambas as opções em con-
junto, além de caracteres como “_”.
Palavras reservadas também têm suas regras em cada linguagem de pro-
gramação, e estas regras podem até ser diferentes das utilizadas na composição
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

dos demais tipos de nomes permitidos numa linguagem, como nomes de vari-
áveis e constantes.
Variáveis que representam endereços de memória associados a nomes em
programas para armazenamento de dados são comuns em todas as linguagens,
assim como constantes que apenas se diferenciam pela não alteração dos valo-
res armazenados em memória durante a execução do programa.
Toda variável ou constante tem um tipo de dado associado que indica o
tipo de valor aceito para armazenamento em memória e o quanto de espaço na
memória do hardware é reservado para este armazenamento, podendo este ser
temporário na memória RAM ou permanente em disco, no caso de alguns tipos
de dados para manipulação de arquivos.
Entende-se por valor para uma variável ou constante o tipo de dado que é
permitido e a faixa de valores aceitos pela definição do tipo de dado na lingua-
gem e o limite aceito pelo espaço reservado para o armazenamento em memória.
Vincular um tipo a uma variável é uma associação que ocorre durante a codi-
ficação, usando elementos aceitos em uma linguagem de programação ou espaços
de memória reservados para tipos variáveis em tempo de execução.
Esta vinculação permite que compiladores façam as ligações necessárias
entre sub-rotinas e elementos de ligação no código e que realizem chamadas a
estas sub-rotinas durante a execução.
Os vínculos que ocorrem dinamicamente em tempo de execução, por exem-
plo, possuem tempo de vida associado ao quanto são utilizados em tempo de
execução de um programa e perdem seus vínculos no momento em que dei-
xam de ser utilizados.

Nomes e Tipos de Dados


64 UNIDADE II

Uma variável local pertencente a uma sub-rotina, com escopo apenas para
uso durante a execução da mesma. Esta sub-rotina é liberada da memória assim
que é finalizada, assim como ocorre com objetos que sejam finalizados por méto-
dos destrutores em linguagens orientadas a objeto.
Dentro da declaração de tipos, uma linguagem que seja do tipo fortemente
tipada tem bem estabelecido o tipo de dado aceito por variáveis e constantes,
tendo então a reserva de memória já padronizada em termos de espaço a ocupar.
Uma linguagem fracamente tipada já permite que a reserva de espaço em
memória seja menos padronizada e ocorra de forma bem dinâmica durante a

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
execução, associando a quantidade de memória para armazenamento de valo-
res de acordo com o dado recebido, por exemplo.
É preciso ter regras bem definidas numa linguagem em relação à compatibili-
dade entre tipos de dados e conversões possíveis para evitar exceções indesejadas
em tempo de execução.
O chamado escopo citado a pouco define se variáveis têm uso permitido ape-
nas dentro de sub-rotinas quando chamadas (variáveis locais) ou em outras áreas
do código (variáveis globais), mas existe outra categoria de escopo que permite
que uma variável seja visível dentro da sub-rotina em que foi declarada, assim
como em outras sub-rotinas chamadas por ela, utilizando o conceito de herança
da programação orientada a objetos.
Os tipos de dados definem com quais valores um programa desenvolvido em
determinada linguagem pode trabalhar em tempo de execução, podendo mani-
pular desde tipos simples até estruturas de dados mais complexas.
Tipos primitivos representam a categoria básica de valores aceitos na lingua-
gem e contemplam, em geral, valores numéricos inteiros ou de ponto flutuante
(números com casas decimais), tipos caractere (texto em geral), booleanos (ver-
dadeiro ou falso), e cadeias de valores ou caracteres.
Tipos podem ser definidos pelo usuário como listas de valores chamadas
tipos enumerados, restringindo a faixa de valores de aceitos de um tipo primi-
tivo, ou matrizes e registros que representam coleções de outros tipos agrupados
em uma estrutura com uma ou mais dimensões.
Registros são mais comumente usados para armazenamento de tipos varia-
dos em uma mesma estrutura e matrizes para dados de mesmo tipo de dado,

NOMES, TIPOS DE DADOS, OPERADORES, EXPRESSÕES E ESTRUTURAS


65

sendo que estas podem ser, inclusive, muitas vezes do tipo registro.
O tipo união também é utilizado em algumas linguagens para agrupar dados
de tipos diferentes, de forma que a memória reserve espaço adequado para rece-
ber dados de quaisquer dos tipos pertencentes à união criada.
Ponteiros também são úteis, pois permitem a criação de listas dinâmicas de
dados capazes de alterarem o espaço utilizado em memória durante a execu-
ção, permitindo o trabalho com o endereçamento direto de memória, em que
ficam os dados.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Tipos de dados são essenciais na programação e a evolução traz tipos novos,


como foi o caso dos tipos abstratos de dados tratados na unidade IV. A pro-
gramação continuará sempre em evolução.

OPERADORES E EXPRESSÕES

Em relação a operadores, estes precisam ser definidos em relação ao tipo de dados


com os quais podem trabalhar e o que ocorre com estes dados quando aplica-
das as operações sobre eles.
Regras de precedência também são essenciais para garantir os resultados
esperados em cada operação, assim como a matemática, que tem todas as suas
regras para operações bem definidas.
Quais operações têm preferência em expressões para serem resolvidas antes
e como se faz a leitura de uma expressão são tópicos que também precisam ter
suas regras bem claras, assim como o uso de delimitadores como parênteses, col-
chetes ou chaves para permitir expressões mais complexas.
Os operadores precisam também de regras para definir a compatibilidade
ou não entre os tipos de dados aceitos em cada linguagem para reduzir a ocor-
rência de exceções que podem ser detectadas apenas em tempo de execução.
Regras matemáticas tais como associatividade de operadores, como no caso

Operadores e Expressões
66 UNIDADE II

da soma e multiplicação matemáticas, onde a ordem das operações iguais não


influencia o resultado, ou seja, 2 x 3 é igual a 3 x 2.
A sobrecarga de operadores também é algo muito comum em linguagens,
permitindo que variáveis de certos tipos aceitem valores vindos de tipos que
possam ser convertidos para adequação como números que podem ser converti-
dos em caracteres, números inteiros que podem se tornar decimais, ou matrizes
menores que podem ser atribuídas a outras maiores.
Mas existem problemas, como expressões usando tipos inteiros, que podem
resultar em números decimais a serem armazenados em uma variável decimal,

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
podem incluir um valor incorreto truncado, ou seja, os componentes inteiros
da expressão calculados podem gerar um número decimal com suas casas deci-
mais eliminadas em função do tipo dos dados da expressão antes da operação
de atribuição à variável decimal.
Existem, além dos operadores matemáticos, operadores relacionais como >
e < usados em comparações em instruções de decisão, ou operadores booleanos
como AND e OR usados em conjunto com os demais operadores anteriormente
citados para análises mais complexas de decisão, por exemplo.
A figura 10 ilustra alguns exemplos de operadores mais comuns em expressões
e estruturas de ecisão diversas, mostrando a quantidade de variações possíveis
com o seu uso.
Figura 10 - Exemplos de expressões matemáticas, relacionais e booleanas

Fonte: O Autor.

Nos exemplos da Figura 8 são mostradas variações de expressões que, inclusive,


misturam os tipos diferentes de operadores entre si, mas são exemplos genéri-
cos que podem ou não ser aceitos por cada diferente linguagem, dependendo
de como são definidas suas regras para operadores e seu uso.

NOMES, TIPOS DE DADOS, OPERADORES, EXPRESSÕES E ESTRUTURAS


67

ESTRUTURAS DE CONTROLE

Controlar o fluxo de execução de um programa é tarefa extremamente complexa,


pois, além de compreender a lógica de funcionamento do programa, é preciso
saber o que uma linguagem de programação oferece em termos de controle da
sua execução de desvios, laços e blocos de instruções.
As chamadas instruções de seleção ou decisão servem para que instruções
sejam executadas ou não de acordo com condições a serem satisfeitas em tempo
de execução.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Essas instruções de decisão podem ser aninhadas em geral nas linguagens


de programação, permitindo que o fluxo de execução de um programa possa
contemplar mais de um desvio, como indicado na Figura 11.
Figura 11 - Exemplo de instrução de decisão baseada em condições

Fonte: O Autor.

O exemplo da Figura 11 segue uma linguagem mais próxima à definição de


algoritmos, mas a maioria das linguagens segue esta mesma estrutura, trocando
apenas as palavras reservadas e símbolos delimitadores, de acordo com as sin-
taxes de suas definições.
Também, uma variação que ocorre se deve ao tipo de instrução aceita den-
tro de cada desvio, pois, em geral, as linguagens aceitam que se coloquem blocos
de instruções delimitados por símbolos ou palavras reservadas para melhorar as
possibilidades de uso destas instruções de decisão.
Essas estruturas de decisão podem variar utilizando critérios diferentes para
elaboração de sua lógica de funcionamento, como na instrução CASE da lingua-
gem C, que aceita múltiplos desvios para blocos de instruções de acordo com a
variação do valor de uma variável simples.

Estruturas de Controle
68 UNIDADE II

Laços de repetição também são estruturas muito importantes dentro das lin-
guagens de programação, pois permitem instruções isoladas ou que blocos de
instruções sejam executados um número fixo ou variável de vezes, eliminando
a repetição desnecessária de código.
A Figura 12 mostra exemplos de instruções que criam laços de repetição
diferentes, em que primeiro laço FOR tem seu número de repetições pré-defi-
nido, ao passo que o laço WHILE depende de uma condição ser satisfeita para
que alguma repetição ocorra.
Figura 12 - Exemplos de laços de repetição em linguagem C

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Fonte: O Autor.

Existem regras para o uso de laços em cada linguagem, e estilos de laços aceitos
também, como o caso do comando GOTO usado em muitas linguagens que pode
criar desvios até pontos específicos de um código, sendo que estes não precisam
estar necessariamente em blocos definidos dentro da própria instrução de desvio.
Há problemas que precisam ser tratados como um que pode ocorrer com o
código da Figura 12, em que o código à esquerda tem sua variável de controle
inicializada, um valor limite definido e uma regra de incremento da variável
de controle, completando as regras necessárias para um laço de repetição com
número de repetições conhecido.
Mas, na mesma Figura 12, o comando WHILE à direita não possui esses
parâmetros todos definidos em sua instrução de controle, e cabe ao programa-
dor inicializar a variável antes de seu uso dentro do laço, a menos que aceite o
valor 0 padrão utilizado pela linguagem no momento da sua criação.

NOMES, TIPOS DE DADOS, OPERADORES, EXPRESSÕES E ESTRUTURAS


69

O uso de desvios de execução dentro de códigos é utilizado desde algumas


das linguagens mais antigas como C e BASIC, mas a forma como são usa-
dos estes desvios sofreu poucas mudanças de conceito, mantendo sempre
a mesma linha de raciocínio.
Um comando muito comum em implementações de algumas linguagens,
mas que caiu em desuso com o tempo pela criação de novas formas de se
desviar o fluxo de execução de um programa durante sua execução.
O comando goto era a base do uso de desvios controlados em programas
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

BASIC, por exemplo, mas devido à sua simplicidade e pouca variação lógica,
deu lugar a outras estruturas, como as definidas por comandos como while
ou repeat de linguagens como C e Pascal, respectivamente.
Fonte: Adaptado de: Linguagens e Ambientes de Programação (2015/2016).
Disponível em: <http://ctp.di.fct.unl.pt/~amd/lap/teoricas/09.html>. Acesso em: 29.
mar. 2016.

CONSIDERAÇÕES FINAIS

Compreender como uma linguagem funciona é importante no momento de


decisão entre uma e outra, pois aprender uma linguagem é um processo que
leva certo tempo, e conhecer bem como utilizar seus recursos linguagem leva
um tempo maior ainda.
Cada linguagem tem suas particularidades, e pode ser fator decisivo entre
o sucesso ou fracasso de um projeto a correta escolha de uma linguagem ade-
quada, assim como para toda a carreira profissional.
A sintaxe das instruções de uma linguagem também influencia sua populari-
dade a e chance de que se torne uma boa ferramenta de trabalho, pois linguagens
extremamente complexas acabam se restringindo a áreas muito específicas ou
deixam de existir.

Considerações Finais
70 UNIDADE II

A semântica também é essencial para a definição de uma linguagem por ser


a parte responsável por converter a linguagem que o programador usa para algo
melhor estruturado para o compilador.
Um conjunto de regras serve de base para uma linguagem e o uso de nomes
e tipos também deve ser devidamente definido de forma a complementar a sin-
taxe das instruções aceitas por ela.
Além disso, o uso de operadores matemáticos, lógicos ou relacionais também
é utilizado em linguagens para realizar atualizações de dados e expressões, tendo
regras claras para construção de expressões e regras de precedência nos cálculos.

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Uma parte essencial de qualquer linguagem se refere a instruções de con-
trole capazes de influenciar todo o processamento por meio de instruções mais
complexas, capazes de agregar outras instruções de mesmo tipo ou não em blo-
cos que são controlados através destas instruções.
Essas instruções podem ser laços de repetição que eliminam a repetição des-
necessária de instruções que necessitem ser executadas diversas vezes, ou podem
ser estruturas de decisão que podem fazer por si só escolhas entre blocos de ins-
truções a serem executadas dinamicamente.
Parte importante do estudo de uma linguagem de programação se refere a
como ela lida com sub-rotinas, e este é o ponto a ser tratado na próxima unidade.

NOMES, TIPOS DE DADOS, OPERADORES, EXPRESSÕES E ESTRUTURAS


71

1. Defina sintaxe de uma instrução.


2. O que seria uma árvore de sintaxe?
3. As análises facilitam o trabalho de um compilador. De que for-
ma estas análises podem contribuir?
4. Em termos de análise sintática, por que não se devem utilizar
palavras-chave como nomes de variáveis, por exemplo?
5. Operadores são elementos úteis em uma linguagem, mas para
que servem suas regras de precedência?
72

A Execução de um Programa
Toda linguagem de programação é constituída por instruções que, agrupadas, conse-
guem, de certa forma, criar produtos utilizados nas mais diversas áreas profissionais,
pesquisa e educação, por exemplo.
A chamada metalinguagem contida em cada linguagem não é exatamente como o por-
tuguês, mas sim uma forma abreviada que contém regras de sintaxe e semântica como
em uma língua qualquer.
Essas instruções são claras para um programador que desenvolva código em uma
linguagem de programação, mas, para o hardware em que será executado, é algo
incompreensível, pois máquinas compreendem instruções mais próximas de seu
funcionamento, em que são especificados os recursos a serem utilizados a todo o
momento, e como devem ser utilizados.
Esta chamada linguagem de máquina compreendida pelo hardware é diferente da me-
talinguagem de programação, pois se encontra em um “nível” mais baixo de interação
com este hardware.
O processo de conversão do código escrito em linguagem de programação de nível
mais alto para um baixo nível de linguagem de máquina pode ocorrer por interpretação
ou por compilação.
Um interpretador simplesmente lê o código e, à medida em que vai conseguindo com-
preender as ações indicadas pelas instruções, vai executando as mesmas, como ocorre
em linguagens como BASIC e Javascript, por exemplo.
No caso do compilador, este, por meio de sua conversão da linguagem de alto nível, cria
um novo arquivo considerado executável pelo sistema operacional, e este é capaz de
realizar tarefas por si só depois de criado, sem a necessidade do compilador, fato que
não ocorre com linguagens interpretadas que sempre usam um software intermediário.
Existe também o caso de linguagens compiladas que geram um arquivo intermediário
que é executado através de uma máquina virtual, como é o caso das linguagens Java e
C#, sendo uma das formas mais estudadas de programação na atualidade.
De qualquer maneira, o objetivo de uma linguagem de programação sempre será o de
servir de intermediário entre o programador e o hardware, de forma que o fato de ser
uma linguagem interpretada por outro programa, ou compilada, gere um software in-
dependente.
Fonte: Adaptado de: Linguagens e Ambientes de Programação (2015/2016). Disponível em:
<http://ctp.di.fct.unl.pt/~amd/lap/teoricas/09.html>. Acesso em: 29. mar. 2016.
MATERIAL COMPLEMENTAR

Título: Conceitos de Linguagens de Programação - 9ª Ed. - 2011


Autor: Sebesta, Robert W.
Editora: Bookman
Sinopse: Livro que oferece material para conhecer e avaliar linguagens
modernas de programação. Mostra como são estruturadas linguagens e
suas características, como orientação a objetos

Material Complementar
REFERÊNCIAS

REFERÊNCIAS LIVROS
ASCENCIO, A. F. G. Fundamentos da programação de computadores: algoritmos
PASCAL, C/C++ (padrão ANSI) e JAVA. 3. São Paulo: Ed. Pearson Education do Brasil,
2012.
MACLENNAN, B. J. Principles of Programming Languages: Design, Evaluation and
Implementation (em inglês). 3ª ed. Oxford: Oxford University Press, 1999.
SEBESTA, R. W. Concepts of programming languages.10ª ed. New Jersey: ed. Pear-
son Education, Inc,2012.

REFERÊNCIAS LINKS
INSTRUÇÃO GoTo. Developer Network, 2015. Disponível em: <https://msdn.micro-
soft.com/pt-br/library/69whc95c.aspx>. Acesso em: 29 mar. 2016.
Linguagens e Ambientes de Programação (2015/2016). Disponível em: <http://
ctp.di.fct.unl.pt/~amd/lap/teoricas/09.html>. Acesso em: 29. mar. 2016.
75
GABARITO

1. Sintaxe se refere a como são construídos os comandos de uma linguagem de


programação, indicando, para cada palavra reservada, parâmetros aceitos e a
forma correta de usá-los.
2. Toda metalinguagem segue um raciocínio semelhante na estruturação de suas
sentenças que pode ser organizado em partes que podem formar uma árvore
que define todos os componentes de cada comando.
3. As análises sintática e semântica, sendo realizadas antes da conversão da lingua-
gem de alto nível para linguagem de baixo nível, permitem que o compilador
necessite apenas fazer este trabalho de conversão se o código estiver dentro do
esperado pelas regras da linguagem.
4. Usar nomes repetidos para diferentes estruturas, como instruções ou nomes,
gera confusão tanto na lógica quanto na funcionalidade de um programa. Se
uma análise não encontra erros deste tipo, o programa final compilado pode ser
executado, depois, com erros graves.
5. A precedência garante que operações sejam realizadas seguindo regras claras
que impeçam resultados adversos de ocorrerem pela realização errada da or-
dem das operações
Professor Esp. Ronie Cesar Tokumoto

III
UNIDADE
SUB-ROTINAS E FUNÇÕES

Objetivos de Aprendizagem
■■ Compreender o conceito de sub-rotina.
■■ Conhecer as vantagens do uso de sub-rotinas em programas.
■■ Ser capaz de optar entre as diferentes formas de uso de sub-rotinas.

Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
■■ Sub-rotinas
■■ Implementando sub-rotinas
■■ Funções
■■ Passagem de parâmetros
■■ Bibliotecas
79

INTRODUÇÃO

Programas são sequências de instruções capazes de realizar tarefas diversas, de


acordo com o propósito ao qual se destina uma linguagem.
Um dos maiores propósitos dos programadores, além de produzir códigos,
é o de aperfeiçoá-los, seja esta tarefa feita sobre programas já concluídos com
o objetivo de melhorar seu desempenho, ou durante a criação de novos pro-
gramas, utilizando técnicas comprovadamente mais eficientes, descobertas em
experiências anteriores.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

A chamada otimização é a arte de se reinventar, descobrir técnicas e reuti-


lizar códigos extremamente bem feitos para atingir melhores resultados e obter
programas cada vez mais capazes de extrair o melhor dos equipamentos onde
se aplicam.
As primeiras técnicas de programação utilizavam laços de repetição con-
trolados ao invés de simples instruções de decisão unidos aos comandos mais
simples de controle de fluxo, como o comando GOTO da linguagem BASIC.
Aos poucos, com a evolução das linguagens, as chamadas sub-rotinas per-
mitiram uma enorme otimização na programação, pois implementavam o uso
de blocos de instruções que poderiam ser chamados pelo fluxo de execução nor-
mal do programa.
Estas sub-rotinas permitiam que o programador pudesse criar uma ligação
entre o programa principal e uma sub-rotina através de valores passados de um
para outro, facilitando o desenvolvimento de programas em que era sabida a
função de uma sub-rotina, e bastava apenas enviar os valores corretos para que
esta pudesse realizar suas tarefas de forma adequada ao propósito do programa.
Depois, com o tempo, estas sub-rotinas passaram a também se repetir em
programas diversos, e poderiam ser reutilizadas em larga escala, fornecendo sub-
sídios para que se pudessem criar as chamadas bibliotecas.
Essas bibliotecas otimizariam ainda mais os programas por permitirem que
um único arquivo que contivesse diversas sub-rotinas pudesse ser utilizado por
vários programas diferentes.

Introdução
80 UNIDADE III

SUB-ROTINAS

Sub-rotinas são trechos de código que podem ou não ser chamados durante a
execução do código principal de uma linguagem.
Uma sub-rotina é criada para permitir que blocos de instruções, que podem
ser executados várias vezes durante a execução de um programa, não precisem
ser repetidos diversas vezes dentro do código principal, reduzindo a quantidade
de linhas do programa.
Toda sub-rotina é chamada, em algum momento, pelo programa principal,

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
que tem sua execução suspensa até que a sub-rotina seja executada por completo
e possa retornar ao ponto da execução do programa principal, em que houve o
desvio de execução do programa.
Na maioria das linguagens de programação, as sub-rotinas são chamadas de
funções ou procedimentos, e possuem uma série de recursos associados ao seu
uso, como a possibilidade de declaração de variáveis locais.
Uma diferença entre procedimento e função é que um procedimento é exe-
cutado sem se preocupar em retornar um valor como resultado, ao passo que
uma função já tem um tipo atribuído ao seu nome para que um valor deste tipo
seja retornado, ao final de sua execução, para uso do programa principal.
Assim como blocos de instruções, as sub-rotinas precisam que suas instru-
ções possuam delimitadores como símbolos do tipo { e }, ou palavras reservadas
como início (begin) e fim (end).
Existem linguagens fortemente tipadas que exigem que o tipo de dados acei-
tos por cada parâmetro seja definido na declaração da sub-rotina, mas outras
permitem que apenas o nome dos parâmetros seja definido para que a execução
defina o tipo de acordo com os parâmetros que receba no momento da chamada.

SUB-ROTINAS E FUNÇÕES
81

IMPLEMENTANDO SUB-ROTINAS

Sub-rotinas envolvem mudanças na execução de programas em relação a recur-


sos de hardware utilizados em tempo real, e a memória é o principal envolvido
no momento em que ocorre a chamada a uma sub-rotina.
No momento em que ocorre uma chamada, antes da sub-rotina ser aces-
sada e utilizar recursos computacionais, é preciso garantir que o fluxo normal
de execução do programa principal retorne de forma segura ao final da execu-
ção da sub-rotina.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Então, todo o estado das variáveis e demais estruturas, como laços em execu-
ção no momento de chamar a sub-rotina, devem ser armazenados, e a indicação
do ponto na memória onde buscar este retorno ao estado anterior é armazenado
de forma dinâmica e temporária.
Após todo este procedimento, a sub-rotina pode ser chamada, ativando
todas as estruturas para a nova etapa de execução, como variáveis recebidas
como parâmetros e a reserva de memória para o próprio tipo de retorno, no
caso de uma função.
Na memória, todas as estruturas utilizadas, tanto no programa principal
quanto em sub-rotinas, são organizadas em pilhas de dados na memória do
computador.
Imaginando um programa que contenha uma sub-rotina com parâmetros e
um tipo de retorno, teríamos uma organização na memória semelhante à indi-
cada na ilustração da Figura 1.
Figura 1 - Ilustração da organização em pilha do programa na memória

Variável local 2
Variável local 1
Parâmetro 1 Parâmetro 1
Tipo de retorno da sub-rotina
Tipo de retorno da sub-rotina
Link dinâmico da pilha
Variável local Programa principal
Fonte: O Autor.

Implementando Sub-Rotinas
82 UNIDADE III

A pilha é montada de baixo para cima, tendo embaixo tudo relativo ao pro-
grama principal que, no caso da Fugira 1, indica que o programa principal possui
apenas uma variável local a ser armazenada dinamicamente na memória.
Acima, temos o endereço de retorno para que uma sub-rotina chamada possa
retornar ao estado anterior do programa principal e continuar sua execução.
Depois, temos em ordem o tipo declarado da função que representa a sub-ro-
tina do exemplo que conterá o valor a ser devolvido para o programa principal
a ser armazenado na única variável local existente, um parâmetro passado na
chamada da sub-rotina, e duas variáveis locais criadas para uso privado da sub-

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
-rotina em seu processamento do parâmetro recebido.
O link dinâmico da pilha segue o fluxo da execução da sub-rotina enquanto
estiver ativa na memória e, ao fim de sua execução, é descartado, assim como
todos os dados armazenados na pilha e pertencentes à sub-rotina.
Recursos como a recursão que permite a chamada de uma sub-rotina por
ela mesma para efetuar seguidas instâncias da mesma sub-rotina em situações
onde, por exemplo, tenhamos cálculos desta natureza (fatorial ou potência) criam
pilhas maiores, pois a cada nova chamada da mesma sub-rotina um novo con-
junto de dados é armazenado na pilha sobre os dados já existentes.

Qual poderia ser a vantagem de se utilizar sub-rotinas em programas além


da redução de código em um programa?
O uso de sub-rotinas permite que seja possível um maior encapsulamen-
to de dados e processos, criando componentes com maior independência
dentro de um programa, e que podem ser reutilizados em outros programas
que necessitem do mesmo tipo de processamento.
Esta reutilização, aos poucos, cria um conjunto de sub-rotinas extremamen-
te úteis e que podem ser largamente reutilizadas na linha de produção de
software, permitindo que um próximo passo seja possível.
Neste próximo passo, é possível agrupar diversas sub-rotinas em um mesmo
arquivo, gerando uma chamada biblioteca, como será visto mais adiante.
Fonte: Adaptado de Sebesta (2012).

SUB-ROTINAS E FUNÇÕES
83

FUNÇÕES

Toda sub-rotina do tipo função, em sua declaração, precisa incluir um tipo, um


nome seguindo as regras de nomenclatura da linguagem, e uma lista de parâme-
tros opcionais que podem ser passados para uso durante sua execução, chamados
de parâmetros formais.
Estes parâmetros podem ser valores simples, como números ou caracteres,
variáveis declaradas ali mesmo no cabeçalho da sub-rotina para terem valores
atribuídos no momento em que a sub-rotina é chamada pelo programa princi-
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

pal, que indica estes valores na chamada.


Existem casos de linguagens que aceitam parâmetros mais complexos como
ponteiros, que permitirão à sub-rotina acessar diretamente o valor gravado em
uma variável do programa principal.
Também podem receber parâmetros como matrizes e estruturas de dados
inteiras, desde que as definições da linguagem assim o permitam, pois são casos
em que a linguagem precisa ser muito bem elaborada para reduzir a chance da
ocorrência de exceções geradas por códigos que contenham elementos não tra-
tados pela definição de uso de sub-rotinas na linguagem.
Na Figura 2 temos um exemplo de função em linguagem C, em que se pode
notar a diferença em relação a uma sub-rotina do tipo procedimento sem tipo
de retorno já na sua declaração, e depois pela não necessidade de informar um
valor de retorno.
Figura 2 - Exemplo de função em linguagem C

Fonte: O Autor.

Pelo exemplo da Figura 2, podemos perceber claramente que a sub-rotina é


do tipo função pela existência de um tipo int (inteiro), indicando que a função
nomeFuncao necessitará retornar algum valor antes de encerrar sua execução e
retornar ao programa principal.

Funções
84 UNIDADE III

A instrução return var; mostra de que maneira ocorrerá este retorno por
meio da devolução do valor contido na posição de memória referente à variável
local da função var declarada para manipular dados.

Usar função ou procedimento é uma decisão simples. É preciso estar ciente


da diferença do uso de cada alternativa, pois toda função que retorne algum

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
valor precisa ser controlada em seu encerramento.

PASSAGEM DE PARÂMETROS

A chamada de uma sub-rotina que contenha parâmetros deve ser cuidadosamente


definida, pois parâmetros podem ser chamados de diferentes formas durante a
execução de um programa, mas também precisam ser declarados de diferentes
formas durante a declaração da sub-rotina.
Uma sub-rotina pode ter parâmetros de entrada ou de saída, recebendo ou
enviando valores reais ou não, mas essa variação depende do tipo da sub-rotina
ou das possibilidades aceitas pela definição de cada linguagem.
Parâmetros podem ser passados por valor, ou seja, valores dos parâmetros reais
são utilizados para inicializar parâmetros formais na chamada a uma sub-rotina,
sendo este um método direto e com menores chances de exceções e erros.
Existe a passagem de parâmetros por resultado que indicam o retorno de
uma sub-rotina ao programa principal, devolvendo ao programa valores que
foram processados na sub-rotina e que são normalmente necessários ao pro-
grama principal. Um detalhe é que o parâmetro formal de entrada pode ser o
mesmo de saída e retorno à execução normal do programa.
Existe a passagem de parâmetros por referência que usa uma ligação entre o
parâmetro formal da sub-rotina e uma variável do programa principal.

SUB-ROTINAS E FUNÇÕES
85

Este tipo de passagem permite que, ao invés da sub-rotina receber uma cópia
de um valor armazenado por uma variável do programa principal em memória,
a sub-rotina receba o endereço de memória utilizado pela variável do programa
e possa manipular seu valor real diretamente de dentro da sub-rotina.
Isso muda muito o uso de sub-rotinas, pois assim elas têm liberdade para
manipular dados processados pelo programa principal, tendo maior influência
sobre o estado em que o programa estará ao ocorrer o retorno da sub-rotina.
Outra forma de passagem de parâmetros é por nome, onde a sub-rotina
recebe, no momento de sua chamada, como parâmetro, uma variável ou estru-
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

tura para ser manipulada diretamente dentro de si, sendo o tipo de elemento
aceito como parâmetro de entrada definido pela linguagem. Observe um exem-
plo na Figura 3.
Figura 3 - Exemplo de passagem de parâmetro por nome

Fonte: O Autor.

No exemplo da Figura 3, temos que a variável x pertence ao programa principal


e, no momento da execução, é inicializada com valor 2. Em seguida, com a cha-
mada da sub-rotina muda_valor, x é passado como parâmetro por nome para
que seja manipulada dentro da sub-rotina.
Com isso, a sub-rotina, que possui uma variável local a, atribui um valor
10 para ela e numa atribuição a variável x recebida como parâmetro, muda seu
valor para um novo através da multiplicação com a. Assim, ao final da sub-ro-
tina, x contém um novo valor 20 para ser utilizado pelo programa principal.

Passagem de Parâmetros
86 UNIDADE III

BIBLIOTECAS

Quando criamos sub-rotinas com a capacidade de realizar tarefas comuns a diver-


sos programas diferentes, mas utilizando a codificação original da sub-rotina,
sabemos que poderíamos simplesmente repetir este código em cada programa
que necessitasse dela.
Para eliminar esta repetição de código, a criação de arquivos contendo apenas
as declarações e implementações destas sub-rotinas poderia tornar desnecessá-
ria tanta repetição de código, bastando que cada programa fizesse apenas uma

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
referência a este arquivo de sub-rotinas e pudesse, a partir deste arquivo, aces-
sá-las livremente, reduzindo o tamanho do próprio programa.
Diversas linguagens como C e Java permitem o uso destes arquivos chama-
dos de bibliotecas, que seguem regras levemente diferentes de nomenclatura,
diferenciando suas extensões de programas normais da linguagem.
Em C, os arquivos de código seguem uma momenclatura padrão do tipo
nomedoarquivo.c (ou nomedoarquivo.cpp em linguagem C++, por exemplo), e
bibliotecas que possa chamar sejam nomeadas como nomedabiblioteca.h (tanto
em C como em C++).
O uso da extensão diferenciada já indica ao compilador se o arquivo contém
um código de programa ou uma biblioteca para ser agregada a este programa.
A Figura 4 mostra um pequeno exemplo de biblioteca que contém apenas
uma função para limpar a tela do console na plataforma Linux, codificada em
linguagem C, e que pode ser utilizada em C++.

SUB-ROTINAS E FUNÇÕES
87

Figura 4 - Exemplo de biblioteca em C

Fonte: O Autor.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

A instrução printf(“\e[H\e[2J”); é utilizada pela biblioteca para realizar a função


de limpar a tela por meio de comando direto ao sistema operacional, utilizando
um comando padrão de entrada e saída printf da linguagem implementado em
outra biblioteca padrão da linguagem chamada stdio.h.
Este arquivo fonte para a criação da biblioteca poderia ser chamado, por exem-
plo, de limpatela.h e ser utilizado em quaisquer programas C ou C++ por meio
do comando #include logo no início do programa, como indicado na Figura 4.

Bibliotecas
88 UNIDADE III

CONSIDERAÇÕES FINAIS

Programas complexos tendem a possuir uma grande quantidade de linhas de


código e podem ficar cada vez mais confusos e terem dentro de si sub-rotinas
muito eficientes e úteis que poderiam ser facilmente reutilizadas em outros pro-
gramas posteriormente.
Criar bibliotecas utilizando sub-rotinas reutilizáveis é uma prática bastante
aconselhável por desenvolvedores profissionais pois, ao término de um programa,
é comum a necessidade de criação de outros programas para novos projetos que,

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
muitas vezes, atendem a um mesmo nicho de mercado, e que podem reutilizar
algumas destas sub-rotinas sem alterações.
Estas sub-rotinas podem ser do tipo procedimento sem tipo definido de
retorno, ou funções com tipo de retorno indicado para que o programa princi-
pal tenha uma espécie de feedback desta sub-rotina, sem que seja necessário o
uso de variáveis do programa principal, exceto pelas passadas por parâmetros.
Parâmetros são melhores para uma sub-rotina do que o uso de variáveis glo-
bais, pois permitem um melhor controle das ações de sub-rotinas em relação a
um programa, uma vez que mantêm um nível seguro de encapsulamento que
reduz a ocorrência de erros em tempo de execução.
Estes parâmetros que podem ser passados de diferentes formas a uma sub-ro-
tina são muito úteis para auxiliar no processamento da mesma, pois, sem receber
valores passados pelo programa principal, pode ser difícil uma sub-rotina inte-
ragir com o programa que a chamou sem usar variáveis globais do programa.
Mesmo sub-rotinas do tipo procedimento, que não geram valor de retorno,
são úteis para manipular valores utilizando parâmetros passados por referência ou
ações que se baseiem apenas nos parâmetros recebidos, podendo armazená-los em
um arquivo físico em disco, por exemplo.
Na próxima unidade é mostrada uma evolução que houve em relação ao
uso de sub-rotinas, a qual permitiu a garantia do encapsulamento e outras téc-
nicas mais modernas de programação, baseadas na ideia da abstração de dados.

SUB-ROTINAS E FUNÇÕES
89

1. Conforme estudamos nesta unidade, o código de um programa


pode estar todo contido em um único arquivo ou dividido entre
uma parte principal em um arquivo e outras em arquivos com-
plementares. Assim, diferencie Programa de Biblioteca.
2. Parâmetros passados por valor a uma sub-rotina influenciam
valores dentro do programa principal diretamente?
3. Sub-rotinas são blocos de comandos que podem ser executados
diversas vezes em um programa. Qual a diferença entre uma
sub-rotina do tipo “procedimento” e outra do tipo “função”?
4. Quais os tipos principais de valores armazenados em memória
durante a execução de uma sub-rotina?
5. Parâmetros são essenciais para manter o encapsulamento.
Quais os tipos de passagem de parâmetros utilizados em lin-
guagens de programação?
90

O Tipo Vazio
O uso de funções é muito comum, e as linguagens de programação utilizam, em maior
quantidade, funções ao invés de procedimentos, pois a função permite maior interação
com o programa principal e pode funcionar como procedimento muitas vezes, se aceito
pela linguagem como alternativa de programação.
A linguagem C e suas variantes, por exemplo, aceitam definir uma função como tipo
void (vazio) para que não seja necessário o retorno de um valor ao final de sua execução,
pois não existe a sub-rotina do tipo procedimento puramente dita nestas linguagens.
Acaba sendo uma prática muito comum de vários programadores utilizar em demasia
esse recurso, tornando todas as funções de um programa similares a procedimentos
na prática, pois sempre tem seu tipo atribuído como vazio no momento da declaração
destas funções.
Isso reduz a interação da sub-rotina com o programa principal, e faz com que a passa-
gem de parâmetros na chamada da função seja o único mecanismo de compartilha-
mento de dados entre as partes de um programa.
Uma função sem tipo definido não pode retornar um resultado diretamente a uma va-
riável do programa principal, e acaba tendo que receber parâmetros por referência, por
exemplo, onde possa internamente manipular dados do programa principal.
Se não utilizar recursos assim, pode apenas servir de sub-rotina auxiliar ao programa
principal, sem alterar valores deste, e apenas realizar tarefas independentes como criar
um arquivo, exibir uma janela de informações ou outras ações sem ligação com o estado
em que se encontre a execução.
Cabe ao usuário, inclusive, se incluirá no momento de criação de bibliotecas próprias
funções com retorno de valores ou não, de acordo com as ações a serem realizadas pelas
funções e procedimentos codificados para a biblioteca, lembrando que uma biblioteca
contém funções de uso comum e que se baseiam na ideia do reuso de código.
Alguns programadores utilizam o tipo vazio em todas as funções que codificam em pro-
gramas de linguagens que não possuem procedimentos, mas essa prática se revela não
muito boa, devido a eliminar a possibilidade de interligar melhor os componentes de
um programa.
Fonte: VOID (c++). Developer Network, 2015. Disponível em: <https://msdn.microsoft.com/pt-
-br/library/fxky5d0w.aspx>. Acesso em: 29. mar. 2016.
MATERIAL COMPLEMENTAR

Título: Fundamentos de Linguagem de Programação


Autor: Friedman, Daniel P.
Editora: Berkeley Brasil
Sinopse: Livro que trabalha com métodos práticos baseados em um
interpretador chamado Scheme para exemplificar seus conceitos.

Material Complementar
REFERÊNCIAS

REFERÊNCIA LIVROS
ASCENCIO, Ana Fernanda Gomes. Fundamentos da programação de computa-
dores: algoritmos PASCAL, C/C++ (padrão ANSI) e JAVA. 3. São Paulo: Ed. Pearson
Education do Brasil, 2012.
MACLENNAN, Bruce J. Principles of Programming Languages: Design, Evaluation
and Implementation (em inglês). 3ª ed. Oxford: Oxford University Press, 1999.
SEBESTA, Robert W. Concepts of programming languages.10ª New Jersey:Ed. Pe-
arson Education, Inc., 2012.

REFERÊNCIA LINKS
VOID (c++). Developer Network, 2015. Disponível em: <https://msdn.microsoft.
com/pt-br/library/fxky5d0w.aspx>. Acesso em: 29. mar. 2016.
93
GABARITO

1. Bibliotecas são conjuntos de sub-rotinas contendo código útil a diversos progra-


mas que podem utilizar tais bibliotecas por meio de comandos de inclusão das
mesmas, ou implementar todas estas sub-rotinas diretamente em seu código.
2. Parâmetros passados por valor indicam números ou outros tipos de valor que
são diretamente incluídos na chamada de uma sub-rotina como parâmetros e
não estão associados a nenhuma variável ou estrutura do programa principal.
3. Procedimentos são sub-rotinas que podem receber parâmetros, mas que não
retornam valores ao programa principal como resultado, e por isto não têm um
tipo definido na sua declaração.
4. Funções possuem tipo definido em sua declaração, e por isso precisam retor-
nar um valor ao programa chamador, podendo receber parâmetros de entrada
como os procedimentos.
5. Tipo de retorno em funções, parâmetros e variáveis locais.
6. Passagem por valor, Passagem por referência e Passagem por nome.
Professor Esp. Ronie Cesar Tokumoto

IV
TIPOS ABSTRATOS DE

UNIDADE
DADOS, ORIENTAÇÃO A
OBJETO

Objetivos de Aprendizagem
■■ Compreender a abstração de dados.
■■ Conhecer detalhes da orientação a objetos em algumas linguagens
de programação conhecidas.
■■ Saber interpretar um programa orientado a objeto.

Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
■■ Abstração de dados
■■ Encapsulamento
■■ Programação orientada a objeto
■■ Estrutura de programas orientados a objeto
■■ Estudo de caso
97

INTRODUÇÃO

Nas unidades anteriores foi visto que existem diversos conceitos envolvendo a pro-
gramação e como uma linguagem de programação tem seus conceitos definidos.
Conceitos como laços e estruturas são complexos em sua definição, pois
necessitam que todas as regras de uso sejam definidas, assim como alternativas
de implementação, instruções aceitas e combinações possíveis entre elas.
Algumas linguagens trabalham conceitos de programação estruturada, onde
se utilizam diversas sub-rotinas para dividir, em partes, problemas computacio-
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

nais complexos para que sejam mais facilmente resolvidos.


A técnica de programação baseada nos conceitos de orientação a objetos
muda uma série de conceitos tradicionais, criando novas formas de organizar
processos e tratamento de dados.
Uso de classes com seus métodos e atributos podem manter um alto grau
de independência e permitir que classes inteiras sejam reutilizadas em outros
softwares para reduzir o processo de criação de novas ferramentas.
Conceitos que tratam de formas de compartilhar elementos entre classes
também são tratados para exemplificar outros recursos disponíveis para per-
mitir melhores técnicas de programação, podendo obter melhores resultados
e programas.
Técnicas como herança e polimorfismo são discutidas com o objetivo de
oferecer meios que indiquem como os recursos disponíveis em linguagens orien-
tadas a objeto são versáteis e proporcionam provavelmente o melhor conjunto
de conceitos para programação disponíveis até então.
A estrutura de uma linguagem é determinada por diversos aspectos que
podem limitar ou ampliar a quantidade de diferentes implementações possíveis
para uma mesma solução de software.
Assim, a escolha de uma linguagem se baseia em vários aspectos, mas pode-se
dizer que a programação orientada a objetos é uma excelente técnica para produ-
ção de softwares por diversas qualidades indicadas a seguir.

Introdução
98 UNIDADE IV

ABSTRAÇÃO DE DADOS

A abstração de dados é um processo em que instâncias de elementos de um pro-


grama são formas de acesso mais simples em termos de manipulação de dados
que reduzem a complexidade na manipulação destes elementos do programa.
Uma sub-rotina pode ser uma abstração de dados, pois isola seu funciona-
mento do programa principal de forma a simplificar a codificação, como propõe
a definição.
As sub-rotinas recebem parâmetros e os manipulam, trazendo resultados

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
sem que o programador tenha que se preocupar com a forma como os dados são
manipulados internamente pela sub-rotina, focando seus esforços no desenvol-
vimento do programa principal.
Tal forma de abstração é chamada de abstração de processo e é a mais comum
em linguagens de programação pelo fato de oferecer o ocultamento de proces-
sos internos às sub-rotinas de um programa ou outros elementos que possam
ser utilizados sem a preocupação em como foram implementados.
Essa característica facilita a codificação de programas sempre que sub-ro-
tinas puderem ser reutilizadas sem modificações, pois partes essenciais de um
programa de tamanho maior já se encontram prontas e não precisam ser ana-
lisadas nem escritas.
Na Figura 1 é mostrada a estrutura básica de uma classe definida com seus
atributos e métodos de forma a ilustrar a base da orientação a objetos que depende
da divisão do código em classes ao invés do uso apenas de sub-rotinas como fun-
ções espalhadas pelo código.
Figura 1: Exemplo de classe em C++

Fonte: O Autor.

TIPOS ABSTRATOS DE DADOS, ORIENTAÇÃO A OBJETO


99

Nesse exemplo de definição de classes, a classe Exemplo é declarada para


logo na linha seguinte ser associada à instrução private, para que sua variável seja
local e apenas visível no método como será comentado mais adiante, e depois
utiliza-se a instrução public, que também será vista mais adiante, permitindo que
o método da classe seja acessível em outras partes do código.
A declaração de atributos e métodos segue linha semelhante
às declarações de variáveis e sub-rotinas, mas em função do diferente uso na pro-
gramação orientada a objetos, a forma de acesso a estes elementos é diferente
dentro do restante de um programa qualquer.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

ENCAPSULAMENTO

O encapsulamento em programas representa o agrupamento de sub-rotinas e


seus dados, podendo estar contido dentro de um código principal ou ser um
código externo chamado pelo programa para ser compilado junto, como biblio-
teca adicional.
Sub-rotinas podem ser organizadas dentro de sub-rotinas maiores de forma
a, cada vez mais, especializarem códigos e deixarem cada sub-rotina encarregada
de determinada tarefa bem específica, mas não são boas técnicas de construção
de programas, como já visto anteriormente.
O ideal é o uso de bibliotecas que permitam ao programador ter ferramen-
tas prontas disponíveis para serem utilizadas em quaisquer outros programas
de tamanhos variados, mas que possam aproveitar os recursos já implementa-
dos das bibliotecas.
Um tipo de encapsulamento muito importante é a abstração de dados que
representa os dados e os processos que ocorrem com os mesmos durante a exe-
cução, representando conceitos que serão vistos mais adiante nesta unidade, em
relação à programação orientada a objeto.

Encapsulamento
100 UNIDADE IV

Existem diferentes tipos de encapsulamento definidos em cada linguagem


que contenha este conceito, como na linguagem Ada que cria pacotes contendo
estas estruturas encapsuladas, ou em linguagens mais modernas que criam clas-
ses para encapsular estruturas.
Como visto na Figura 1, o fato de utilizarmos as classes com instruções, como
private e public, contribui para o encapsulamento, deixando a forma como um
método de uma classe processar seus dados, invisível ao restante do código em
que estejam inseridas classes diversas.

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
PROGRAMAÇÃO ORIENTADA A OBJETO

Algumas linguagens oferecem tipos abstratos a partir da técnica de encapsula-


mento, e outras oferecem tipos abstratos a partir de classes que oferecem técnicas
muito eficientes de programação.
Essas classes são utilizadas por meio da declaração de variáveis definidas
como instâncias do tipo classe que podem ser acessadas como estruturas de
dados comuns.
Em linguagem C++, por exemplo, existe o uso de estruturas de dados por
meio do comando struct, e o uso de classes em orientação a objeto através do
comando class. A diferença é o fato de struct criar estruturas de dados comuns
do tipo registro de dados e atribuídos a variáveis e as classes serem instancia-
das por variáveis.
Aparentemente, o funcionamento das duas estruturas é igual, pois ambas são
associadas a variáveis, mas o uso de classes em orientação a objeto possui artifícios
mais completos em relação ao uso de estruturas de dados em variáveis comuns.

TIPOS ABSTRATOS DE DADOS, ORIENTAÇÃO A OBJETO


101

ESTRUTURA DE PROGRAMAS ORIENTADOS A


OBJETO

Antes da linguagem Smaltalk, a linguagem Simula versão 67 implementou os


conceitos fundamentais dessa técnica ainda sem muita efetividade, mas serviu
de base para os conceitos até hoje em evolução.
Temos a ideia de classe como ponto de partida do estudo da programação
orientada a objetos e, a partir dela, todos os demais conceitos vão sendo defi-
nidos de acordo com a proposta de toda linguagem que utilize esta forma de
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

programação.
Toda classe é estruturada para que represente um agrupamento de elemen-
tos que tenham relação entre si e atendam a alguma demanda de programação.
Ela possui atributos representados por variáveis e parâmetros em sua decla-
ração que servem para manipular os dados necessários à sua finalidade, além de
métodos que são sub-rotinas capazes de processar os seus e realizar tarefas tam-
bém relativas ao seu propósito.
Cada instância de classe atribuída a uma variável acessa os mesmos méto-
dos definidos, mas cria estruturas de atributos personalizados para que tenham
dados próprios para uso da instância, sem interferir nos valores de outras ins-
tâncias atribuídas a uma mesma definição de classe.
Uma instância de classe é criada a partir de um chamado objeto que controla
o tempo em que uma instância ocupará a memória do computador ou deixará
de ocupar ao término de sua utilização, sendo esse processo automaticamente
realizado pelo próprio programa, ou manualmente quando necessário.
Dentro de um programa, a declaração de uma classe deve ser feita toda
no início do programa ou pode também ter apenas seu cabeçalho no início do
código e toda sua estrutura em um ponto mais ao final do código, abaixo da
parte principal do programa.
Outra forma de utilização de classes é colocando apenas o cabeçalho de
declaração da classe no programa principal, e a classe em si estar codificada em
um arquivo externo chamado no processo de compilação para criação do pro-
grama executável, fazendo com que o código do programa principal seja menor.

Estrutura de Programas Orientados a Objeto


102 UNIDADE IV

As classes são a base da programação orientada a objetos e, dentro dessas,


são incluídos atributos e métodos que podem ou não ser visíveis a outras par-
tes do programa.
Um programa com várias classes pode permitir que os atributos dessas
diversas classes sejam todos visíveis entre si, incluindo, antes das declarações de
atributos e métodos, a cláusula public.
Isso permite fácil acesso aos atributos entre os diversos métodos e o pro-
grama principal, aumentando a transparência do código, mas aumenta também,
consideravelmente, o risco de erros em tempo de execução.

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Além de prejudicar a segurança dos dados de atributos e erros devido a cha-
madas impróprias de atributos e métodos por objetos que podem prejudicar a
correta execução dos métodos das classes, fere a regra do encapsulamento.
O ideal é que haja níveis de acesso a atributos e métodos para garantir o
correto encapsulamento, permitindo que outras características da programa-
ção orientada a objetos sejam utilizadas.
O que bloqueia o acesso a atributos e métodos de uma classe por outras ins-
tâncias é a cláusula private que também deve ser utilizada antes da declaração
de atributos e métodos a encapsular.
Existem funções chamadas de construtores e destrutores, utilizadas para ini-
cializar atributos de objetos instanciados e para encerrar estes objetos quando
não são mais necessários, respectivamente.
Essas funções são executadas automaticamente em linguagens, mas podem
ser manualmente controladas por comandos para este fim com na linguagem
C++, que usa as palavras-chave constructor e destructor.
A ideia da reutilização de software que começou com a popularização do
computador pessoal, durante a década de 80, trouxe novas necessidades para a
programação, pois apenas a ideia de classes com encapsulamento não era sufi-
ciente para garantir a reutilização, devido a diferenças entre atributos dos novos
e já existentes códigos para reutilização.
Para resolver estes problemas de ajustes entre dados da antiga codificação
e da nova, surgiu um recurso que permitiu que novos tipos abstratos pudessem
herdar atributos de tipos abstratos já implementados.

TIPOS ABSTRATOS DE DADOS, ORIENTAÇÃO A OBJETO


103

Ademais, a herança permite que tipos abstratos já criados possam ser modifi-
cados e que novos tipos abstratos criados possam absorver atributos e métodos já
existentes e, em subclasses, incluir novos elementos necessários ao novo programa.
Para efeito de referência, uma classe que está um nível acima de uma sub-
classe é chamada de superclasse e representa o tipo abstrato de dados original,
de onde a subclasse obtém seus principais métodos e atributos.
Quando métodos de classes são utilizados em tempos de execução, chama-
mos de mensagem sua chamada de um objeto para outro, sendo esta a base da
programação orientada a objetos.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Um dos motivos do encapsulamento é o ocultamento de atributos e méto-


dos de partes que não tenham interferência no programa, mantendo isolados os
métodos independentes, mas, para a herança ocorrer, é preciso que sejam visí-
veis tanto métodos quanto atributos de classes que tenham subclasses.
Para melhorar esta regra, algumas linguagens orientadas a objeto permi-
tem que seja usada outra cláusula chamada protected que permite que atributos
e métodos sejam visíveis apenas para subclasses de uma classe.
Isso mantém o encapsulamento e garante que a herança seja possível, sem
que outras classes sem ligação direta possam ter acesso a dados específicos de
outras classes.
Assim, uma subclasse pode herdar todos os atributos e métodos definidos
como protegidos na superclasse, além de acrescentar novos elementos, sendo que
métodos modificados em geral precisam ser codificados com o mesmo nome na
subclasse para que sobreponha o original em tempo de execução.
O processo de herança pode ocorrer entre uma superclasse e uma subclasse
criando uma herança simples, ou ocorrer entre uma subclasse e mais de uma
superclasse, constituindo uma herança múltipla, mais complexa para lidar na
codificação, mas muito útil.
Polimorfismo é uma técnica para vincular dinamicamente uma mensagem
passada entre objetos a definições de métodos, permitindo a criação de variá-
veis associadas a superclasses, capazes de acessar objetos instanciados de todas
as suas subclasses.

Estrutura de Programas Orientados a Objeto


104 UNIDADE IV

Um programa sem essa técnica precisaria embutir em seu código artifícios


utilizando instruções de decisão para escolher entre classes associadas com vari-
áveis em objetos instanciados para que pudessem ser utilizados num programa.
Se houvesse a necessidade de incluir uma nova classe atribuída a uma variável,
a estrutura de decisão e talvez outras partes do código teriam que ser alteradas.
Por meio do polimorfismo, este processo seria muito mais simples, pois uma
superclasse precisa apenas incluir a indicação de herança a uma nova classe para
que possa acessar seus recursos e, ao invés do uso de uma instrução de decisão,
um novo método de escolha poderia ser dinamicamente associado à superclasse

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
em tempo de execução.
Esse processo funciona de forma distinta em várias linguagens que aceitam
a orientação a objetos com C++ onde um método precisa ser definido como vir-
tual para ser vinculado dinamicamente, mas em Java todos os métodos criados
já permitem a vinculação, a menos que sejam definidos que não.

Os conceitos de uma linguagem orientada a objetos sempre são confusos


no aprendizado, mas permitem que um código seja melhor modularizado e
que a comunicação entre seus elementos seja mais eficiente.

ESTUDO DE CASO

A melhor forma de compreender os conceitos básicos da orientação a objetos é


por meio da análise de um código simples, mas que contenha classes com seus
métodos e atributos sendo trabalhados dentro destes conceitos.
Na Figura 2 temos um exemplo mais completo, em que uma classe princi-
pal Livro é declarada para conter o método principal de cadastro de livro num
sistema de biblioteca.
O método CadastraLivro é definido como virtual para que possa trabalhar
com o polimorfismo e, de acordo com o desenvolvimento do programa, acessar

TIPOS ABSTRATOS DE DADOS, ORIENTAÇÃO A OBJETO


105

o cadastro de livros de acordo com sua categoria (romance ou ficção).


Depois, são declaradas classes Romance e Ficcao associadas à classe Livro,
podendo elas utilizar o mesmo método CadastraLivro, mas ajustando sua fun-
cionalidade às suas necessidades.
Um detalhe importante é que a classe Romance tem seu método já decla-
rado e codificado dentro da própria classe, mas a classe Ficcao apenas declara o
método que depois é codificado fora dela, mostrando assim duas formas dife-
rentes de programação.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

O Futuro da programação depende de muitos aspectos, como futuras ino-


vações tecnológicas, por exemplo.
Mas algumas linguagens que surgem prometem de alguma forma mexer
com o radar dos programadores em termos de investimento em aprendi-
zado.
O artigo cita nove linguagens com diferentes características que podem in-
teressar àqueles que gostam de investir em novas áreas de trabalho.
Erlang é uma linguagem voltada a programação funcional para sistemas em
tempo real. A linguagem Go, criada pela Google, parece ser interessante por
seguir a base da linguagem C com sintaxe simplificada.
OCaml trabalha com dados de forma mais livre, CofeeScript pode ser uma
boa alternativa para uma forma facilitada de criar scripts Javascript e Scala,
que permite programação funcional para a Máquina Virtual Java.
Dart pode ser uma boa alternativa para complementar a programação web,
Haskell é uma linguagem simples puramente funcional com mecanismos de
entrada e saída, e, finalmente, Julia, que trouxe velocidade para programa-
dores Phyton, permitindo compilação em segundo plano.
Fonte: Adaptado de: ESPECIAL: Nove linguagens de programação que vale a pena
aprender agora. Computerworld, 11 set. 2015 às 08h15. Disponível em: <http://
computerworld.com.br/especial-nove-linguagens-de-programacao-que-vale-pe-
na-aprender-agora>. Acesso em: 29 de mar. de 2016.

Estudo de Caso
106 UNIDADE IV

Figura 2 - Exemplo de código C++ orientado a objetos

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

TIPOS ABSTRATOS DE DADOS, ORIENTAÇÃO A OBJETO


107

Fonte: O Autor.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

O programa principal ilustrado pela Figura 2 declara duas variáveis para a classe
Livros que são em seguida instanciadas para as subclasses Ficção e Romance, mas
observamos que não é instanciada a própria classe Livro, que já é o tipo das vari-
áveis criadas para conter os objetos.
Assim, tendo o tipo declarado da classe principal, a variável já pode ser ins-
tanciada às subclasses, criando os objetos Obj1 e Obj2 que, em seguida, chamam
seus respectivos métodos de cadastro de livros (CadastraLivro) implementados
de forma distinta em cada subclasse, mas acessíveis por meio dos conceitos de
herança e polimorfismo.

Estudo de Caso
108 UNIDADE IV

CONSIDERAÇÕES FINAIS

O uso da orientação a objetos é uma técnica muito interessante, pois permite que
haja uma forte independência entre as partes de num programa e que isso gere
maiores facilidades no futuro, com reuso de código e evoluções do software criado.
Técnicas como encapsulamento são mais comuns entre as diversas lingua-
gens existentes, mas nem todos os conceitos definidos pela teoria da programação
orientada a objetos são comuns nas linguagens.
O uso de classes contendo atributos e métodos definidos com cláusulas para

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
torná-los públicos ou privados permite que conceitos muito importantes, como
a permissão destes atributos e métodos em subclasses associadas a uma super-
classe, sejam fundamentais na subdivisão de problemas computacionais em
partes que possam ser interligadas se necessário.
O uso da cláusula de privado para atributos ajuda a manter uma classe inde-
pendente de qualquer parte de um programa, facilitando seu reuso em outros
programas que necessitem apenas indicar parâmetros pedidos pelos métodos
da classe para processamento dos dados.
Já o uso da cláusula pública para classes que permite que sejam visíveis para
todo o código ajuda na ligação entre as partes de um programa e auxilia para
que novas implementações para métodos da classe sejam utilizadas por meio da
virtualização oferecida pelo polimorfismo.
O reuso é algo muito importante na produção de software, pois reduz o
tempo de codificação de um novo software que tenha partes em comum com
outros softwares já produzidos, e por isso a criação de uma biblioteca de códigos
e classes reutilizáveis auxilia empresas a criar novos produtos em menor tempo,
mantendo padrões que facilitam a manutenção do software.
Assim, temos que o uso da orientação a objetos possui pontos positivos e
negativos, mas, independente de quais ou quantos sejam, seus conceitos de pro-
gramação são válidos ao ponto de servirem de base para praticamente todas as
linguagens dominantes do mercado.

TIPOS ABSTRATOS DE DADOS, ORIENTAÇÃO A OBJETO


109

1. Sub-rotinas são trechos de código, mas como são chamadas em


linguagens de programação?
2. O que são classes em uma linguagem orientada a objetos?
3. Diferencie atributo de método.
4. Como poderíamos definir encapsulamento?
5. Qual seria a ideia geral de herança?
110

Linguagens para Programação Orientadas a Objeto


Algumas linguagens foram definidas de acordo com os padrões da programação orien-
tada a objetos e têm características particulares que as diferenciam de linguagens para
programação estruturada.
A linguagem Smalltalk foi a pioneira puramente orientada a objeto, mas logo em segui-
da diversas outras linguagens foram surgindo, baseadas nos mesmo conceitos, popula-
rizando-se de forma rápida e tomando conta do mercado.
A linguagem C++ surgiu como evolução da linguagem C e trouxe consigo a possibili-
dade de criar código tanto em programação estruturada quanto em orientada a objeto.
É uma linguagem fortemente tipada, boa portabilidade entre plataformas diferentes
(Windows e Linux), e é utilizada para a criação de uma infinidade de tipos de software.
Smalltalk já difere por ser totalmente orientada a objetos e, por isso, não contém tipos
primitivos de dados como números inteiros, pois estes são considerados objetos, assim
como cadeias de caracteres são consideradas classes. Todos os processos que ocorrem
no programa dependem da troca de mensagens entre objetos.
A linguagem Java é uma linguagem totalmente orientada a objeto que não aceita pro-
gramação estruturada e é totalmente portátil entre plataformas (sistemas para desktop
ou dispositivos móveis). Possui uma grande biblioteca de funções prontas para todo
tipo de aplicação, e cria um código intermediário compilado que é executado em má-
quinas virtuais implementadas de forma específica para cada plataforma.
Algumas linguagens orientadas a objeto são típicas do uso para Internet, como o Javas-
cript que é interpretada pelo navegador, e segue a base da linguagem Java. Outra lin-
guagem muito conhecida é a PHP, ideal para integração de banco de dados em páginas
web, e ActionScript, embutida em Flash para controlar animações e que antes foi muito
usada para o desenvolvimento de websites.
Linguagens modernas tendem a eliminar diversos aspectos que podem ser suprimidos
em programas, pois as linguagens tradicionais mais antigas tinham diversos comandos
e elementos que eram descartáveis do ponto de vista funcional de um programa.
Assim, linguagens como Go, Swift e Hack têm códigos mais enxutos e capazes de realizar
quantidade semelhante de aplicações, dentro de suas respectivas áreas de atuação.
Fonte: Adaptado de: FACEBOOK cria linguagem de programação chamada “Hack”. Olhar digital,
20 de mar. de 2014 às 17h. Disponível em: <http://olhardigital.uol.com.br/pro/noticia/facebook-
-cria-linguagem-de-programacao-chamada-hack/40937>. Acesso em: 29 de mar. de 2016.

Adaptado de: JACKSON, J. Apple anuncia Swift, uma nova linguagem de programação para o iOS
e OS X. Macworld on-line, 02 de jun. de 2014 às 19h24. Disponível em: < http://macworldbrasil.
com.br/noticias/2014/06/02/apple-anuncia-swift-uma-nova-linguagem-de-programacao-para-
-o-ios-e-os-x/>. Acesso em: 29 de mar. de 2016.
MATERIAL COMPLEMENTAR

Título: Princípios de Linguagens de Programação


Autor: MELO, Ana Cristina; SILVA, Flávio Soares Corrêa da
Editora: Blucher
Sinopse: Livro que trata dos princípios de linguagens de programação
de forma acessível, com exemplos acessíveis a estudantes e
profissionais.

Material Complementar
REFERÊNCIAS

REFERÊNCIA LIVROS
ASCENCIO, Ana Fernanda Gomes. Fundamentos da programação de computa-
dores: algoritmos PASCAL, C/C++ (padrão ANSI) e JAVA. 3. São Paulo: Ed Pearson
Education do Brasil, 2012.
MACLENNAN, Bruce J. Principles of Programming Languages: Design, Evaluation
and Implementation (em inglês). 3ª ed. Oxford: Oxford University Press, 1999.
SEBESTA, Robert W. Concepts of programming languages.10ª ed. New Jersey: Pe-
arson Education, Inc., 2012.

REFERÊNCIA LINKS
ESPECIAL: Nove linguagens de programação que vale a pena aprender agora. Com-
puterworld, 11 set. 2015 às 08h15. Disponível em: <http://computerworld.com.
br/especial-nove-linguagens-de-programacao-que-vale-pena-aprender-agora>.
Acesso em: 29 de mar. de 2016.
FACEBOOK cria linguagem de programação chamada “Hack”. Olhar digital, 20 de
mar. de 2014 às 17h. Disponível em: <http://olhardigital.uol.com.br/pro/noticia/fa-
cebook-cria-linguagem-de-programacao-chamada-hack/40937>. Acesso em: 29 de
mar. de 2016.
JACKSON, J. Apple anuncia Swift, uma nova linguagem de programação para o iOS
e OS X. Macworld on-line, 02 de jun. de 2014 às 19h24. Disponível em: < http://
macworldbrasil.com.br/noticias/2014/06/02/apple-anuncia-swift-uma-nova-lin-
guagem-de-programacao-para-o-ios-e-os-x/>. Acesso em: 29 de mar. de 2016.
113
GABARITO

1. Procedimento ou função.
2. Estrutura abstrata de dados que servem de base para a programação orientada
a objetos.
3. Atributos são as variáveis de uma classe. Métodos são as sub-rotinas responsá-
veis por processar dados de uma classe.
4. É uma forma de isolar os elementos de uma sub-rotina para garantir que seja
independente do restante do código de um programa.
5. A herança trata da ligação possível entre classes, podendo facilitar o comparti-
lhamento de métodos entre superclasses e subclasses.
Professor Esp. Ronie Cesar Tokumoto

V
CONCORRÊNCIA, TRATAMENTO

UNIDADE
DE EXCEÇÕES
PROGRAMAÇÃO FUNCIONAL E
PROGRAMAÇÃO LÓGICA

Objetivos de Aprendizagem
■■ Compreender os princípios de concorrência, semáforos e monitores.
■■ Tratar exceções e eventos de acordo com a linguagem utilizada.
■■ Conhecer os conceitos das programações funcional e lógica.

Plano de Estudo
A seguir, apresentam-se os tópicos que você estudará nesta unidade:
■■ Concorrência
■■ Tratamento de exceções
■■ Programação funcional
■■ Programação lógica
117

INTRODUÇÃO

A programação permite o desenvolvimento de inúmeros tipos de software para


diversas áreas, e algumas dessas aplicações necessitam de recursos especiais.
Executar tarefas paralelamente num mesmo hardware parece uma tarefa
simples, pois fazemos algo semelhante o tempo todo fisicamente, mas a progra-
mação para funcionamento nesse estilo de execução é complexo.
Recursos típicos para esta finalidade são mostrados nesta unidade de forma
a possibilitar uma compreensão maior de como a programação pode ser diver-
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

sificada e complicada.
Assim como lidar com processos que ocorrem paralelamente, temos momen-
tos em que exceções ocorrem e podem ser tratados pelo programa de forma a
ocultar erros mais simples ou permitir que o próprio programa gerencie esssas
ocorrências de forma devida.
Além de conhecer algumas técnicas mais avançadas de programação, pode-
mos, nesta unidade, conhecer estilos diferentes de programação, voltados a áreas
mais específicas, como inteligência artificial.
A programação funcional oferece uma maneira de lidar com cálculos mate-
máticos de forma estruturada, podendo criar grandes códigos capazes de resolver
problemas mais complexos, sem a necessidade de utilizar todas as demais instru-
ções disponíveis nas demais linguagens, pois esta variedade reduz o desempenho
dos programas em tempo de execução, sendo este o fator primordial em cálculo
matemático.
Finalmente, outro tipo de programação baseada em lógica também oferece
uma forma totalmente diferente de codificar programas baseados em regras que
estabelecem uma base de conhecimento para consultas e podem também ser uti-
lizados em mecanismos de inteligência artificial.
Esta unidade complementa as demais, mostrando recursos que podem exis-
tir em linguagens comentadas durante as unidades anteriores, mas o essencial
são os conceitos mostrados e a forma como estes influenciam todo o trabalho
profissional, necessitando de programadores com perfil diferenciado para tra-
balhar com tais formas de programação.

Introdução
118 UNIDADE V

CONCORRÊNCIA

A concorrência pode ocorrer em diversos níveis na informática como programas


executando de forma concorrente ou instruções em nível de máquina dividindo
recursos de hardware.
Dentro da programação, é importante observar a possibilidade de instru-
ções e de sub-rotinas, por exemplo, fazendo com que, além da otimização de
código como já citado anteriormente, seja capaz de melhorar o desempenho de
um programa, mas a execução de tarefas concorrentemente de um mesmo pro-

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
grama pelo hardware também aumenta muito sua eficiência.
Isso pode ocorrer por meio da capacidade do hardware de processar dife-
rentes tarefas ao mesmo tempo ou do próprio sistema operacional multitarefa,
que pode processar mais de uma tarefa ao mesmo tempo, ou podendo utilizar
um sistema de time-sharing (compartilhamento de tempo).
Poder dividir o processamento das instruções de um programa para que
possam ser executadas paralelamente permite novas possibilidades para uma
linguagem e programação, mas criar códigos capazes de funcionar desta forma
é uma tarefa mais complexa do que pode parecer num primeiro momento.
É preciso especificar no código do programa de que forma os dados podem
ser distribuídos pelos recursos computacionais disponibilizados pelo hardware
ou pelo sistema operacional, e quais dentre os utilizados no programa podem.
Muitos computadores possuem a capacidade de utilizar processamento
ocioso para realizar processamento paralelo para aumentar a eficiência do uso
de seus recursos.
Um exemplo seria o processamento de outras atividades enquanto uma tarefa
lenta que exige pouco recurso, como impressão ou processos de entrada e saída,
é realizada pelo programa principal em atividade.
Existem tipos diferentes de computadores com capacidade de realizar o
processamento de multitarefa como servidores com dois ou mais processado-
res acoplados em seu hardware, ou os atuais processadores com vários núcleos
simulando vários processadores, capazes de efetuar processamento paralelo.
Por meio da sincronização de tarefas de um programa que possam ocor-
rer concorrentemente, duas ou mais tarefas de sub-rotinas podem ocorrer

CONCORRÊNCIA, TRATAMENTO DE EXCEÇÕES


119

concorrentemente podendo haver troca de mensagens ou parâmetros entre elas.


Os chamados semáforos são recursos muito eficientes apesar de sua simpli-
cidade, armazenando em uma fila, na memória, ligações com tarefas a serem
executadas.
Seu funcionamento consiste em liberar um acesso limitado a estruturas do
código para que tarefas executadas concorrentemente acessem alternadamente
essas estruturas para evitar conflitos e falhas na execução do programa.
Para garantir este tipo de encapsulamento das estruturas de dados, outra
forma é a criação de estruturas de dados abstratas referentes às estruturas reais
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

para facilitar a sincronização das tarefas sem o uso de semáforos.


Esse método chamado de monitor armazena em uma unidade todos os dados
compartilhados e sincroniza o acesso a eles ordenadamente, por meio de uma
fila de chamadas aos procedimentos do monitor, se estiver ocupado.
Em sistemas distribuídos, em que temos mais de um processador com seus
recursos separados, fica mais complexa a tarefa de estabelecer um processo moni-
tor capaz de monitorar o acesso aos dados por tarefas distribuídas.
Na Figura 1 temos um exemplo de algoritmo para a implementação de um
semáforo em duas funções que controlam seu funcionamento, sendo SemáforoLivre
para liberar o acesso a dados para uma tarefa que esteja na fila para acesso e a
função Pausa que controla o bloqueio ao acesso de dados quando ocupados por
uma tarefa.
Figura 1 - Exemplo de sub-rotina semáforo

Fonte: O Autor.

Concorrência
120 UNIDADE V

O valor da função SemaforoLivre indica o número de unidades disponíveis


para acesso e se alterna para que as tarefas possam acessar as unidades protegi-
das toda vez que liberadas por ela.
Assim, o valor da variável numRecursosDisponíveis muda de acordo com a
utilização ou não das unidades, tornando-se negativo caso estejam todas as uni-
dades sendo acessadas por tarefas e, aos poucos, torna-se positivo com a liberação
dessas unidades para que outras tarefas as acessem.

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
TRATAMENTO DE EXCEÇÕES

Erros detectados por hardware ou pelo sistema operacional são chamados de


exceções ocorridas e que necessitam ser tratadas pelo programa para evitar falhas,
principalmente em tempo real.
É opcional de um programa tratar ou ignorar erros por meio do chamado
tratamento de exceções, sendo que alguns erros já são automaticamente tra-
tados pelo hardware ou pelo sistema operacional, mas a maioria dos tipos de
exceção pode ser abrangida em um programa para ser tratada como desejado
pelo programador.
Em linguagem C++, por exemplo, temos comandos específicos para o trata-
mento de exceções como try e catch. Try é um comando que estrutura o tratamento
de exceções indicadas nos comandos catch através de parâmetros que indicam
valores referentes a erros que possam ocorrer. As exceções são capturadas pelo
programa, mas podem ser novamente geradas pelo comando throw para uso
posterior no programa.
A Figura 2 mostra um exemplo de tratamento de exceções usando os
comandos try, catch e throw de forma a receber uma exceção ocorrida durante
a execução e tratá-la.

CONCORRÊNCIA, TRATAMENTO DE EXCEÇÕES


121

Figura 2 - Exemplo de tratamento de exceções em linguagem C++


Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: O Autor.

O exemplo da Figura 2 mostra, como resultado, uma mensagem por meio do


comando printf informando o erro consultado na sub-rotina “FuncaoConsultaErro”
criada para que busque os erros através do número ao qual esteja associada.
Catch captura o resultado de “Funcao” armazenando como cadeia de carac-
teres na variável exceção para exibição no comando printf.

Tratar erros é essencial em um programa ou pode ser considerado um recur-


so adicional em caso de um projeto estar adiantado?

Tratamento de Exceções
122 UNIDADE V

PROGRAMAÇÃO FUNCIONAL

Uma linguagem funcional tem como base o uso de funções matemáticas e repre-
senta um conjunto de linguagens como LISP, Scheme, ML e Haskell que trabalham
dentro da ideia de conjuntos domínio e imagem, como na matemática.
Assim, temos que a sequência de execução dessas linguagens se baseia mais
na ordem em que as operações devem ocorrer de acordo com suas regras, e não
de forma sequencial, como nas linguagens tradicionais chamadas imperativas.
Na linguagem LISP, provavelmente a mais popular, utiliza-se apenas dois

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
tipos de dados em sua implementação inicial chamados de átomos e listas, mas
têm uso diferente dos tipos em linguagens imperativas.
Essas listas definidas entre parênteses contendo átomos ou outras listas com
seus elementos entre parênteses também, como por exemplo, (a b (c d)), sendo
(c d) uma lista considerada um dos três elementos da lista completa.
As funções da linguagem são implementadas de forma simples, baseando-
-se na sintaxe básica onde é primeiramente indicada a função matemática como
primeiro elemento entre parênteses e depois os elementos a serem utilizados na
função, como por exemplo (+ 2 2) que resultaria 4.
Com o tempo, novas formas de construção de código em LISP foram imple-
mentadas para que funções pudessem ser vinculadas a outras, como em (+ 2 (*
2 2)) que resultaria em 6. Comandos foram agregados com o passar do tempo
para manter a linguagem popular e aumentar sua eficiência.
Na Figura 3 temos um exemplo de código que calcula o fatorial de um valor,
em que o comando if verifica se a recursão deve encerrar e iniciar o retorno até
que se possa exibir o resultado final do cálculo.
Figura 3 - Exemplo de código em linguagem LISP

Fonte: O Autor.

CONCORRÊNCIA, TRATAMENTO DE EXCEÇÕES


123

Já na Figura 4 temos o mesmo cálculo seguindo a sintaxe da linguagem


Scheme, que se assemelha a LISP mas que utiliza o comando lambda para defi-
nir o que seria o terceiro elemento para completar o elemento define.
Figura 4 - Exemplo de código em linguagem Scheme
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

Fonte: O Autor.

PROGRAMAÇÃO LÓGICA

Após conhecer linguagens funcionais, temos as linguagens lógicas que traba-


lham sobre regras de inferências lógicas para obter seus resultados desejados
em linguagens como Prolog.
Uma linguagem lógica trabalha sobre proposições que podem ter valores
verdadeiros ou falsos e consideram relações entre elementos como sua base para
criar sua sintaxe básica.
Essencialmente, a linguagem trabalha com proposições atômicas compostas
por uma relação semelhante a de uma sintaxe de programação funcional onde
duas partes compõe a sintaxe, sendo a relação e uma lista de elementos entre
parênteses que compõem essa relação.
A Figura 5 mostra um exemplo simples de proposição válida para ilustrar
uma relação e seus elementos, como já citado.

Programação Lógica
124 UNIDADE V

Figura 5 - Exemplo de relação em programação lógica

Fonte: O Autor.

Conectivos lógicos como união, intersecção, contido, contém, negação e equi-


valência fazem parte do uso de proposições lógicas, mas, na programação, o uso
desses conectivos se restringe às limitações da linguagem e seus símbolos à con-

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
venções definidas na linguagem.
A linguagem Prolog trabalha com o chamado termo, que representa uma
constante (átomo em LISP) ou variável, podendo ser também uma estrutura.
Uma constante é representada por cadeias de caracteres todos minúsculos, uma
variável por caracteres iniciando por letra maiúscula, e estruturas que represen-
tam as relações seguindo a sintaxe da Figura 5.
Conjunções em Prolog permitem termos compostos separados por ope-
radores lógicos como E ou OU utilizando símbolos próprios para cada tipo de
operador definido na linguagem.
Um exemplo seria indicar que uma regra é consequência de outra se for
verdadeira, seguindo a sintaxe consequência :- condição, onde consequência e
condição representam proposições, como nos exemplos da Figura 6.
Figura 6 - Exemplo de regras em programação lógica

Fonte: O Autor.

Além das regras mostradas aqui, temos diversas outras aceitas pela linguagem
Prolog capazes de torná-la muito interessante para realizar operações lógicas e
oferecer uma linguagem com potencial para sua área de atuação, não sendo a
toa sua posição de linguagem lógica mais popular.

CONCORRÊNCIA, TRATAMENTO DE EXCEÇÕES


125

A programação é uma das mais promissoras áreas de trabalho para o futuro,


supondo que a evolução natural que se vê mundialmente continue.
Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.

A programação funcional possui suas particularidades, como o uso extensi-


vo de funções na forma de subprogramas, mas com base na ideia de receber
parâmetros e devolver resultados, assim como na programação orientada a
objetos ou estruturada.
Por terem um alto nível de abstração, os códigos neste tipo de programação
podem ser validados mais facilmente e necessitam de menor complexidade
em seus programas, permitindo foco no controle de processamento parale-
lo, por exemplo.
Por esta redução toda em sua complexidade, acaba sendo inadequada para
o desenvolvimento de aplicações como bancos de dados que são melhor
desenvolvidos através de programação orientada a objetos ou pela progra-
mação estruturada.
Fonte: Adaptado de: PARADIGMA Funcional: Conceitos Básicos. Departamento de
Informática – UEM. Disponível em: <http://din.uem.br/ia/ferramentas/lisp/lisp3.
htm>. Acesso em 29 de mar. de 2016.

Considerações Finais
126 UNIDADE V

CONSIDERAÇÕES FINAIS

Assim, findando esta unidade, temos uma ideia de como o universo da progra-
mação é vasto e se mantém em constante evolução, criando novos conceitos e se
adaptando às novas tecnologias que emergem a todo o momento.
Linguagens foram criadas, como as recentes Go criada pela Google para fins
diversos, Hack desenvolvida para uso no Facebook, e Swift criado pela Apple
para, aos poucos, substituir a linguagem Objective-C, variação de C utilizada
para o desenvolvimento de aplicações para seus dispositivos.

Reprodução proibida. Art. 184 do Código Penal e Lei 9.610 de 19 de fevereiro de 1998.
Assim, muda o perfil dos novos estudantes de programação que a cada dia,
entram em áreas mais específicas do desenvolvimento de software com foco vol-
tado a áreas como desenvolvimento de aplicativos para dispositivos móveis ou
sistemas embarcados em dispositivos eletrônicos.
Independente de qual seja a área em que se deseje ingressar, é preciso estar
disposto a entrar em um ramo em que estar atualizado e conhecer novas tecno-
logias é uma constante, assim como em toda a área de Tecnologia da Informação.
Conhecer linguagens como as exemplificadas nesta unidade são um desafio
diferente das linguagens mais populares, pois é mais difícil encontrar material
de estudo e exemplos de código para servirem de base teórica.
Estudar e criar códigos cada vez melhores, mais otimizados e eficientes pode
ser a porta de entrada para o mercado de trabalho, pois quem desenvolve sof-
twares de boa qualidade acaba sendo reconhecido e buscado pelas empresas.
Refinamentos como o tratamento de erros e exceções permitem que se criem
programas mais robustos com mecanismos que deixam o usuário mais confor-
tável e menos receoso em trabalhar com o mesmo.
É preciso estar sempre pesquisando conteúdos adicionais sobre linguagens
que conheça, sem deixar de observar novas tendências e nichos para os quais se
possa desenvolver aplicações, visando ou não o lucro.

CONCORRÊNCIA, TRATAMENTO DE EXCEÇÕES


127

1. Explique o que são processos concorrentes.


2. Como um hardware ou sistema operacional poderia trabalhar
com processos concorrentes?
3. O que seria uma exceção na execução de um programa?
4. Dentre os diversos tipos de linguagens de programação, po-
demos dividi-las quanto ao seu paradigma. Defina linguagem
com paradigma funcional.
5. Dentre os diversos tipos de linguagens de programação, po-
demos dividi-las quanto ao seu paradigma. Defina linguagem
lógica.
128

Os Dispositivos Móveis
Dispositivos baseados no sistema operacional IOS e OSX da Apple utilizam aplicativos
desenvolvidos por programadores espalhados em todo o mundo, da mesma forma que
aplicativos para os sistemas Android e Windows Phone.
No caso da Apple, a linguagem oficial para desenvolvimento de aplicações para seus
dispositivos se chama Objective-C, que deriva das linguagens C e C++, acrescentando
todas as funcionalidades necessárias para programação mobile.
A própria Apple desenvolveu uma linguagem chamada Swift para substituir a lingua-
gem padrão utilizada até então, com o propósito de manter sob seu domínio a ferra-
menta de desenvolvimento das suas aplicações.
Como a linguagem Objective-C deriva de C, existe a necessidade da retrocompatibilida-
de com a sintaxe da linguagem C, ao passo que a linguagem Swift, por ser totalmente
nova, não necessita ser compatível com linguagem alguma, por mais que mantenha
muito da sintaxe da linguagem Objective-C.
Fazendo uma comparação entre um código escrito com linguagem Objective-C e Swift,
é nítida a redução de código, pois bibliotecas adicionadas por #include, e outras partes
dispensáveis do código por não afetarem diretamente a funcionalidade do mesmo não
existem na linguagem Swift.
Linguagens antigas tendem a detalhar mais seu código, necessitando de maior quanti-
dade de instruções para a realização de tarefas, ao passo que, com evolução das lingua-
gens, todo tipo de instrução descartável é retirada para melhorar desempenho, desde o
momento da compilação até a sua execução.
Novas versões que são implementadas de linguagens já existentes tendem a acrescen-
tar funções ou otimizar a própria linguagem e sua codificação. Tudo para que as melho-
rias aconteçam regularmente.
É importante que novas tecnologias sejam agregadas na definição de linguagens, pois
linguagens que não sofreram alterações acabaram restritas a aplicações legadas ou des-
continuadas em razão de não comportarem as novas tecnologias que surgiram com o
passar do tempo.
Fonte: Disponível em: JACKSON, J. Apple anuncia Swift, uma nova linguagem de programação
para o iOS e OS X. Macworld on-line, 02 de jun. de 2014 às 19h24. Disponível em: <http://ma-
cworldbrasil.com.br/noticias/2014/06/02/apple-anuncia-swift-uma-nova-linguagem-de-progra-
macao-para-o-ios-e-os-x/>. Acesso em: 29 de mar. de 2016.
MATERIAL COMPLEMENTAR

Título: Conceitos de Linguagens de Programação


Autor: GHEZZI, Carlo
Editora: Campus
Sinopse: Livro que trata de conceitos teóricos tradicionais sobre
linguagens de programação utilizados anos atrás, mas que servem de
base para compreender as atuais evoluções tecnológicas na área de
programação.

Material Complementar
REFERÊNCIAS

REFERÊNCIA LIVROS
ASCENCIO, A. F. G. Fundamentos da programação de computadores: algoritmos
PASCAL, C/C++ (padrão ANSI) e JAVA. 3. Ed. São Paulo: Ed. Pearson Education do
Brasil, 2012.
MACLENNAN, B. J. Principles of Programming Languages: Design, Evaluation and
Implementation (em inglês). 3ª ed. Oxford: Oxford University Press, 1999.
SEBESTA, R. W. Concepts of programming languages.10ª ed. New Jersey: Pearson
Education, Inc., 2012.

REFERÊNCIA LINKS
JACKSON, J. Apple anuncia Swift, uma nova linguagem de programação para o iOS
e OS X. Macworld on-line, 02 de jun. de 2014 às 19h24. Disponível em: <http://ma-
cworldbrasil.com.br/noticias/2014/06/02/apple-anuncia-swift-uma-nova-lingua-
gem-de-programacao-para-o-ios-e-os-x/>. Acesso em: 29 de mar. de 2016.
PARADIGMA Funcional: Conceitos Básicos. Departamento de Informática – UEM.
Disponível em: <http://din.uem.br/ia/ferramentas/lisp/lisp3.htm>. Acesso em 29 de
mar. de 2016.
131
GABARITO

1. Processos que podem ocorrer paralelamente dividindo recursos físicos para se-
rem processados.
2. Hardware com dois ou mais processadores ou sistemas operacionais que podem
realocar recursos ociosos durante processos lentos.
3. Exceções são eventos fora do esperado que podem ocorrer durante a execução
e um programa ou eventos esperados e que podem tratados pelo programa.
4. É uma linguagem própria para trabalhar com funções matemáticas, com imple-
mentação de códigos diferente das linguagens estruturadas ou orientadas a ob-
jeto, pois se tem foco em cálculo.
5. É uma linguagem que utiliza regras para criar uma base de dados que permite
efetuar consultas lógicas utilizadas em inteligência artificial.
133
CONCLUSÃO

As linguagens de programação são a ferramenta principal do mercado de Tecnolo-


gia da Informação, e têm sua utilidade de acordo com os propósitos para os quais
foram criadas.
Linguagens ultrapassadas como COBOL ou Delphi ainda encontram seu lugar no
mercado em softwares legados de grandes empresas, em que o esforço pessoal e
computacional para recriar programas já estabelecidos e estáveis geram barreiras
que impedem a evolução natural, mas abrem espaço para que programadores ex-
perientes nestas linguagens tenham garantidos empregos e altos ganhos.
Conhecer novas formas de programação em novas linguagens ou em linguagens
em que ainda não se tinha total domínio de seus recursos é fundamental para se
tornar um profissional cada vez mais valorizado e capaz de sobreviver às mudanças
que a tecnologia cria a todo instante.
O mercado de trabalho é o que mais cresce no mundo para a área de programa-
ção, devido ao aumento constante de novas áreas que se estabelecem ao redor da
Tecnologia da Informação por meio de softwares de controle e o próprio uso de
hardware para controle de processos antes realizados manualmente.
De qualquer maneira, estudar é imprescindível, e a escolha de qual linguagem es-
tudar, para qual plataforma e com qual finalidade é o maior objetivo de quem inicia
seus estudos em programação.
Linguagens que podem ser utilizadas em várias plataformas distintas são interes-
santes por permitirem a migração de uma aplicação para vários sistemas operacio-
nais diferentes, mas é preciso estar atento às particularidades de cada versão imple-
mentada.
Linguagens como C contêm diferenças sutis, principalmente na implementação de
suas bibliotecas padrão que obrigam o programador a realizar ajustes para cada
plataforma em que deverá rodar o software.
A linguagem Java, que possui excelente portabilidade, utiliza um mesmo código
para qualquer plataforma, necessitando apenas que seja utilizada a versão da cha-
mada máquina virtual de cada uma.