Linguagens Computacionais
(Conceitos Básicos)
George Darmiton da Cunha Cavalcanti([email protected])
Tópicos
� Razões para estudar os conceitos de
linguagens de programação
� Domínios de programação
� Critérios de avaliação de linguagens
� Influências sobre o projeto de uma linguagem
� Categorias de Linguagens
� Custo\benefício no projeto da linguagem
� Métodos de Implementação
� Ambientes de programação
Razões para estudar os conceitos
de linguagens de programação
� Aumento da capacidade de expressar idéias
– Capacidade intelectual ⇔ poder de se expressar
– Facilidades de algumas linguagens podem ser simuladas em outras linguagens
� Maior embasamento para a escolha de linguagens
apropriadas
– Escolha mais consciente
� Capacidade aumentada para aprender novas
linguagens
– Consolidação dos conceitos das linguagens
Razões para estudar os conceitos de linguagens de programação
� Entender melhor a importância da
implementação
– Uso de uma linguagem de forma mais inteligente
� Aumento da capacidade de projetar novas
linguagens
� Avanço global da computação
Domínios de Programação
� Aplicações científicas– Grande número de operações com números reais
– Fortran
� Aplicações comerciais– Produção de relatórios, uso de números decimais e texto
– COBOL
� Inteligência artificial– Uso de computações simbólicas em vez de numéricas
– LISP
� Programação de sistemas– Precisa de eficiência devido ao uso contínuo
– C
� Softwares para a Web– Coleção eclética de linguagens: markup (XHTML), scripting (PHP),
general-purpose (Java)
Critérios de avaliação da linguagem
� Legibilidade (Readability)– Quão facilmente um programa pode ser lido e entendido
� Capacidade escrita (Writability)– Quão facilmente uma linguagem pode ser usada para criar
programas
� Confiabilidade (Reliability)– Conformidade com as especificações sob todas as
condições
� Custo– O custo final de uma linguagem é uma função de suas
características
Critérios de avaliação da linguagem
Legibilidade (Readability)
� Simplicidade global
– Linguagens com um pequeno número de
componentes básicos são mais fáceis de aprender
– Multiplicidade de recursos (mais de uma maneira
para realizar uma operação particular)
– Sobrecarga (overloading) de um operador, ou seja,
um único símbolo possui mais de um significado.
Um exemplo em C para incrementar uma variável inteira simples:cont = cont +1
cont += 1
cont++
++cont
Legibilidade (Readability)
� Ortogonalidade
– Um conjunto relativamente pequeno de construções primitivas pode ser combinado em um número relativamente pequeno de maneiras
– Toda combinação possível é legal e significativa
Legibilidade (Readability)Ortogonalidade
Um exemplo: adicionar valores inteiros de 32 bits que residem na
memória ou nos registradores e substituir um dos valores pela soma.
Computadores de grande porte da IBMA Reg1, célula_de_memória
AR Reg1, Reg2
Semântica: Reg1 ← conteúdo(Reg1) + conteúdo(célula_de_memória)
Reg1 ← conteúdo(Reg1) + conteúdo(Reg2)
Instrução de adição do VAXADDL operando_1, operando_2
Semântica: operando_2 ← conteúdo(operando_1) + conteúdo(operando_2)
O projeto da instrução VAX é ortogonal, pois uma única operação pode usar registradores ou células de memória como operandos.
Legibilidade (Readability)
� Instruções de controle– A existência de estruturas de controle bem
conhecidas (exemplo: while)
while (incr < 20) {
while (sum <= 100) {
sum += incr;
}
incr++;
}
loop1:
if (incr >= 20) goto out;
loop2:
if (sum > 100) goto next;
sum += incr;
goto loop2;
next:
incr++;
goto loop1;
out:
Legibilidade (Readability)
� Tipos de dados e estruturas
– A presença de facilidades adequadas para definir
tipos de dados e estruturas de dados
– Exemplo: suponha que em uma linguagem não exista um tipo de dado booleano e um tipo numérico seja
usado para substituí-lo:• timeOut = 1 (significado não claro)
• timeOut = true (significado claro)
Legibilidade (Readability)
� Considerações sobre a sintaxe
– Formas identificadoras
• Restringir os identificadores a tamanhos muito pequenos prejudica a legibilidade
– Palavras especiais
• Formas das palavras especiais de uma linguagem (exemplo: while, class, for e begin-end)
• Palavras especiais de uma linguagem podem ser usadas como nomes de variáveis?
– Forma e significado
• Projetar instruções de forma que sua aparência indique sua finalidade
Capacidade de Escrita (Writability)
� Simplicidade e ortogonalidade
– Poucos construtores, um pequeno número de primitivas, um pequeno conjunto de regras para combiná-los
� Suporte para abstração
– A capacidade de definir e de usar estruturas ou operações complexas de maneira que permita ignorar muitos dos detalhes
� Expressividade
– Um conjunto relativamente conveniente de maneiras de especificar operadores
– Exemplos:
• count++ é mais conveniente do que count = count + 1
• a inclusão do for em muitas linguagens modernas
Confiabilidade (Reliability)
� Verificação de tipos– Testar se existem erros de tipos
� Manipulação de Exceções– Capacidade de interceptar erros em tempo de execução e por
em prática medidas corretivas
� Apelidos (Aliasing)– Presença de dois ou mais métodos, ou nomes, distintos que
referenciam a mesma célula de memória
� Legibilidade (Readability) e Capacidade de Escrita (Writability)– Uma linguagem que não suporta maneiras naturais de
expressar os algoritmos usará, necessariamente, abordagens não-naturais. Assim, a legibilidade será reduzida.
– A legibilidade afeta a confiabilidade tanto na escrita quanto namanutenção.
Custo
� Treinamento dos programadores para usar a linguagem
� Escrita de programas na linguagem
� Compilação programas na linguagem
� Execução dos programas
� Sistema de implementação da linguagem:– existência de compiladores free
� Confiabilidade– Confiabilidade baixa leva a altos custos
� Manutenção dos programas
Custo
Sabendo que esses são funções da capacidade de escrita e da legibilidade.
Fatores importantes
para os custos da linguagem
Manutenção
Desenvolvimento
do Programa
Confiabilidade
Outros critérios de avaliação
� Portabilidade
– Quão facilmente um programa pode ser movido de
uma implementação para outra
� Generalidade
– Seu uso em uma gama de aplicações
� Boa definição (Well-definedness)
– A precisão e a completeza da definição oficial da linguagem
Influências sobre o projeto da linguagem
� Arquitetura do Computador– Linguagens são desenvolvidas com base na
arquitetura mais usada, conhecida como arquitetura von Neumann
� Metodologias de programação– Novas metodologias de desenvolvimento de software
(exemplo, desenvolvimento orientado a objetos) levam a novos paradigmas de programação, e novas linguagens de programação
Influência da arquitetura de computador
� Arquitetura Von Neumann
� As Linguagens Imperativas são as dominantes, motivadas por computadores von Neumann
– Dados e programas armazenados na memória
– Memória separada da CPU
– Instruções e dados trafegam da memória para a CPU
A arquitetura von Neumann
Influências sobre as metodologias de programação
� Década de 1950 e início da década de 1960
– aplicações simples; preocupações com a eficiência da máquina
� Final da década de 1960
– a eficiência das pessoas se tornou um ponto importante; legibilidade, melhores estruturas de controle
• Programação estruturada
• Projeto top-down e refinamento passo-a-passo
� Final da década de 1970
– orientado para processo → orientada a dados
• Abstração de dados
� Meados da década de 1980
– programação orientada a objetos
• Abstração de dados + herança + polimorfismo
Categorias de Linguagens� Imperativa
– Características centrais: variáveis, estruturas de atribuição e iteração
– Exemplos: C, Pascal
� Funcional– Principal maneira de computar é através da aplicação de funções para
os parâmetros fornecidos
– Exemplos: LISP, Scheme
� Lógica– Baseado em regras (regras são especificadas sem ordem pré-
determinada)
– Exemplo: Prolog
� Orientada a objetos– Abstração de dados, herança
– Exemplos: Java, C++
� Marcação (Markup)– Nova; não especificam computação, são usadas para definir o layout
de informação em documentos Web
– Exemplos: XHTML, XML
Custo\benefício no projeto da linguagem
� Confiabilidade versus Custo de Execução– Critérios conflitantes– Exemplo: Java requer que todas as referências a vetores sejam
checadas para garantir que os índices estejam dentro dos limites, mas isso aumenta o custo de execução
� Readability versus writability– Critérios conflitantes– Exemplo: APL provê muitos operadores poderosos (e uma
grande quantidade de novos símbolos), permitindo que computações complexas sejam escritas em programas compactos, porém isso dificulta a leitura
� Writability (flexibility) versus reliability– Critérios conflitantes– Exemplo: ponteiros em C++ são poderosos e muito flexíveis
Interface de computadores disposta em camadas
Métodos de Implementação
� Compilação
– Programas são traduzidos para linguagem de
máquina
� Interpretação pura
– Programas são interpretados por outro
programa conhecido como interpretador
� Sistemas de Implementação Híbridos
– Um meio-termo entre compiladores e
interpretadores puros
Compilação
� Traduz programas em alto-nível (linguagem fonte) em
código de máquina (linguagem de máquina)
� Tradução lenta, execução rápida
� O processo de compilação possui várias fases:
– Análise léxica
• Converte caracteres de um programa fonte em unidades léxicas
– Análise sintática
• Transforma unidades léxicas em parse trees, as quais
representam a estrutura sintática do programa
– Análise semântica
• Gera código intermediário
– Geração de código
• Código de máquina é gerado
O processo de compilação
Gargalo de Von Neumann
� Velocidade de conexão entre a memória do
computador e seu processador determina a
velocidade de um computador
� As instruções geralmente são executadas mais
rapidamente do que podem ser transferidas
� Conhecido como o gargalo de von Neumann;
esse é o fator limitante primário da velocidade
dos computadores
Interpretação Pura
� Sem tradução
� Fácil implementação de programas (erros de execução podem ser facilmente e rapidamente mostrados)
� Execução lenta (de 10 a 100 vezes mais lenta do que programas compilados)
� Geralmente requer mais espaço
� Cada vez mais raro em linguagens de alto-nível
� Embora não seja uma linguagem simples, JavaScript é puramente interpretado
O processo de interpretação pura
Sistemas de Implementação Híbridos
� Um meio-termo entre compilador e interpretador puro
� Um programa em uma linguagem de alto-nível é traduzido para uma linguagem intermediária que permite fácil interpretação
� Mais rápido do que interpretação pura
� Exemplos– Programas em Perl são parcialmente compilados para detectar erros
antes da interpretação
– Implementações iniciais de Java eram híbridas
• A forma intermediária, byte code, provinha portabilidade para qualquer máquina que tivesse o interpretador de byte code e um sistema de run-time(juntos, esses são chamados de Java Virtual Machine)
O processo de implementação híbrida
Pré-processadores
� Macros instruções são normalmente usadas
para especificar que um código de outro
arquivo deve ser incluído
� Um pré-processador processa um programa
imediatamente antes do programa ser
compilado, expandindo as macros
� Um exemplo: pré-processador C
– expande #include, #define, entre outras
Ambientes de Programação
� Uma coleção de ferramentas usadas no desenvolvimento de software
� UNIX– Um sistema operacional e um conjunto de ferramentas– Atualmente, normalmente usada através de uma GUI
(exemplos: CDE, KDE ou GNOME) que roda em cima do UNIX
� Borland JBuilder– Um ambiente integrado de desenvolvimento para Java
� Microsoft Visual Studio.NET– Um grande e complexo ambiente– Usado para programar C#, Visual BASIC.NET, Jscript, J# ou
C++
Sumário
� O estudo de linguagens de programação é válido por uma série de motivos:
– Aumenta nossa capacidade de usar diferentes construções para escrever programas
– Nos habilita a escolher linguagens de forma mais inteligente
– Nos ajuda a aprender novas linguagens mais facilmente
� Os critérios mais importantes para a avaliação de linguagens:
– Readability, writability, reliability e cost
� As principais influências no projeto de uma linguagem têm sido aarquitetura da máquina e as metodologias de projeto de software
� Os principais métodos para implementar linguagens são:
– compilação, interpretação pura e implementação híbrida