Conceitos Importantes sobre Linguagens de Progemação

Post on 29-Jun-2015

174 views 9 download

Transcript of Conceitos Importantes sobre Linguagens de Progemação

Linguagens de Programação: Implementação e Técnicas de

Implementação

Histórico da Programação

Recuperando o contexto histórico da evolução das linguagens de programação, pode-se dizer que elas representam graus variados de abstração da arquitetura subjacente, chamada Von Neumann ( processador, memória e entradas e saídas).

Arquitetura de Von Neumann

Os computadores disponíveis no final da década de 40 e início da década de 50, além dos problemas decorrentes da tecnologia da época, eram difíceis de serem programados pela ausência de software.

Na falta de linguagens de programação de alto nível, ou mesmo linguagens de montagem, a programação era feita em código de máquina (por exemplo, uma instrução para "somar", deveria ser especificada por um código em vez do seu uso textual).

Essa maneira de programar tornava os programas ilegíveis, além de ser bastante complicado o seu processo de depuração. Do ponto de vista do programador, essa foi uma motivação importante para a criação das linguagens de montagem e seus montadores.

.

Além disso, as aplicações numéricas da época requeriam o uso de certas facilidades que não estavam incluidas no hardware das máquinas de hoje, tais como, (números reais, acesso a elementos de um conjunto por seu índice, por exemplo) surgindo assim a necessidade da criação de linguagens de mais alto nível que incluíssem tais recursos.Sendo assim, foram desenvolvidas, ao longo da história da computação, diversas “linguagens de programação”, cada qual, a seu tempo, introduzindo facilidades e recursos que foram tornando a tarefa de programar mais fácil e menos susceptível a erros

O que é uma Linguagem de Programação

Uma Linguagem de Programação é uma ferramenta utilizada pelo profissional de computação para escrever programas, isto é, conjuntos de instruções a serem seguidas pelo computador para realizar determinador processo.

Linguagens de programação são instrumentos para facilitar a comunicação entre humanos e computadores a fim de solucionar problemas.

Assim, linguagens de programação têm o objetivo de representar alguma informação por meio de uma seqüência de símbolos

Qual necessidade fez surgi-la

Na época do surgimento dos primeiros computadores, eles só podiam ser programados por meio de linguagens de programação muito simples.

Caracterizavam-se por um pequeno conjunto de instruções capazes de realizar ações muito elementares e de uso exclusivo de um computador especifico .

À medida que a computação avança e as aplicações iam se tornando cada vez mais complexas, constata-se que o uso de linguagens tão simples e especificas reduzia significativamente a produtividade dos programadores e impedia a ampla disseminação do computador.

Para contornar este problema, surgiram as linguagens de programação de alto nível. Caracterizavam-se por não serem especificas a apenas a um computador e por terem um conjunto mais amplo e expressivo de tipos de instrução.

Classificação das Linguagens

Conforme uma maior ou menor proximidade com a linguagem de máquina, classificam-se as linguagens em:

• LINGUAGENS DE BAIXO NÍVEL

• LINGUAGENS DE ALTO NÍVEL

Linguagens de Baixo Nível

As linguagens de baixo nível

- Restritas a linguagem de máquina

- Forte relação entre as operações implementadas pela linguagem e as operações implementadas pelo hardware.

-Indicada para funções que precisam implementar instruções de máquina específicas que não são suportadas por linguagens de alto nível

- A grande eficiência e o reduzido tamanho dos programas

Linguagens de Alto Nível

• Problemas podem ser solucionados muito mais rapidamente e com muito mais facilidade.

• O programa em linguagem de alto nível é normalmente fácil de seguir e entender cada passo da execução.

As linguagens de alto nível

• Aproximam-se das linguagens utilizadas por humanos para expressar problemas e algoritmos

• Cada declaração numa linguagem de alto nível equivale a várias declarações numa linguagem de baixo nível.

Especificação de Linguagens de Programação

Ao se criar uma LP é necessário definir a forma de escrever programas validos nessa linguagem e como os programas válidos devem se comportar.

Essa definição deve ser feita por meio de documentos descritos que estabeleçam de maneira precisa como essas duas atividades devem ser realizadas .

Tais documentos formam a especificação da LP.

A especificação de um LP requer a descrição de :

- Um Léxico

- Uma Sintaxe

- Uma Semântica

Um Léxico

O Léxico da LP corresponde ao vocabulário que pode ser utilizado para formar sentenças na linguagem ou seja símbolos ( tokens).

Por exemplo:

O seguinte comando da Linguagem Pascal

A := B;O Léxico da LP estabelece que os símbolos A, := , B e ; fazem parte do vocabulário da LP.

Uma Sintaxe

A Sintaxe da LP corresponde ao conjunto de regras que determinam quais sentenças podem ser formadas a partir da combinação dos itens léxicos.

O léxico e a sintaxe estão relacionados com a forma dos programas, isto é, como expressões, comandos, declarações e outros elementos da LP podem ser combinados para forma programas válidos.

soma:= x + sqrt(b+3.2);readln (x);x :integer

Por exemplo :

O seguinte comando da Linguagem Pascal

A := B + 2;

A Sintaxe da LP indica que a sentença formada pelo identificador A, o símbolo := , o identificador B, o símbolo +, o numero 2 e o símbolo ; designa um comando válido de soma.

Uma Semântica

A Semântica da LP descreve como as construções sintaticamente corretas são interpretadas ou executadas.

A semântica esta relacionada com o significado dos programas, isto é, como eles se comportam quando são executados por computadores.

Por exemplo :

O seguinte comando da Linguagem C

A = B;

A Semântica da LP indica que esse comando deve ser executado de modo a substituir o valor de A pelo valor atual de B e retornar o valor de A.

Métodos de Implementação de Linguagens de Programação

Todo e qualquer Programa escrito em uma LP necessita ser traduzido para a linguagem de maquina a fim de ser executado.

Para fazer isso, é necessário aplicar um programa que recebe como entrada o código-fonte do programa a ser traduzido e gere o código traduzido na linguagem de maquina.

Esse programa tradutor é quem determina como os programas na LP serão implementados, isto é, como o código–fonte traduzido se comportará efetivamente quando executado no computador.

São descritos três métodos gerais de implementação de linguagens de programação , são eles:

• Compilação

• Interpretação Pura

• Hibrido

Compilação

Um Compilador traduz o programa fonte inteiro, produzindo um outro programa equivalente, em linguagem executável.

A vantagem é que o compilador precisa traduzir um comando apenas uma única vez, não importando quantas vezes ele será executado.

Na prática o compilador é usado para gerar o código definitivo (eficiente) de um programa.

Exemplos de linguagens compiladas : Pascal, C, C++,Java e outras

Interpretação Pura

Um interpretador traduz o programa fonte um comando por vez e chama uma rotina para executar esse comando.

A vantagem é que o interpretador não traduz comandos que podem não ser executados e pode relatar erros na linguagem original em cada ponto de execução. Na prática as linguagens interpretadas servem para a realização de uma prototipagem rápida.

Exemplos de linguagens interpretadas: Prolog, linguagens de script

Hibrido

Processo que combina tanto a execução eficiente quanto a portabilidade de programas pela aplicação combinada dos dois métodos anteriores.

A base para o método hibrido é a existência de um código intermediário, mais fácil de ser interpretado e, ao mesmo tempo, não especifico de uma de uma plataforma computacional.

O método hibrido é dividido , portanto, em duas etapas: compilação para um código intermediário e interpretação desse código.

Exemplos de linguagens hibridas : JAVA e PERL

Gráfico Data x Linguagens

O gráfico mostra o surgimento e a evolução das principais linguagens de programação. FORTRAN (1957): aplicações numéricas

LISP (1959): programação funcional

ALGOL (1960): programação estruturada

COBOL (1960): aplicações comerciais

BASIC (1964): ensino para leigos

PASCAL (1971): programação estruturada; simplicidade

C (1972): implementação de UNIX

PROLOG (1972): programação lógica

SMALLTALK (1972): programação orientada a objetos

ADA (1983): programação concorrente

C++ (1985): disseminação de programação O. objetos

JAVA (1995): mais simples e confiável que C++; Internet

Ler enquanto mostra figura da próxima pagina

Paradigmas

Paradigmas:Modelo, padrão ou estilo de programação suportado por linguagens que agrupam certas características comuns.

Cada linguagem apresenta uma maneira particular de modelar o que é um programa.

Cada paradigma agrupa linguagens que representam programas de forma semelhante.

A escolha de um determinado paradigma influencia a forma com que uma aplicação real é modelada do ponto de vista computacional

Existem diversas classificações de Paradigmas de LPs , sendo a mais comum a que divide os paradigmas de LPs nos paradigmas : Imperativo e Declarativo

Visual Estruturado Orientado a Objetos Orientado a aspectos Concorrente

Funcional Lógico

ImperativoLinguagens

DeclarativoLinguagens

Mostrar figura próximo slide enquanto le

Paradigma Imperativo

O Paradigma Imperativo engloba os paradigmas fundamentados na idéia de computação como um processo que realiza mudanças de estados. Nesse sentido, um estado representa uma configuração qualquer da memória do computador. Os conceitos fundamentais são de variável, valor e atribuição,.

Paradigma Visual

As linguagens de programação visual partem do princípio de que gráficos são mais fáceis de serem entendidos do que textos. Sendo assim, a especificação de um programa por meio de diagramas e outros recursos gráficos tende a tornar a própria programação mais fácil, permitindo mesmo que usuários sem muitas habilidades em programação gerem programas.As LPV são divididas em dois grupos:

- Linguagens Visuais Puras

- Linguagens Visuais Hibridas

As linguagens de programação visual puras são aquelas em que o programa é determinado exclusivamente por meio dos gráficos e diagramas que o especificam.

Dentre elas podemos citar:

Khoros - computação gráfica.

Simulink - simulação de sistemas dinâmicos.

Linguagens Visuais Hibridas

As linguagens que incluem-se nesta categoria são normalmente linguagens de programação convencional, acrescidas das ferramentas visuais que lhes dão o “status” de visuais.

Exemplos incluem o :

Delphi, Visual Basic, Visual C++.

• Boas para definir – interconexão entre componente – configuração de linhas de produtos – mas não para restrições associadas

• Razoáveis para definir – estados de um sistema– mas não para fluxo de controle em geral

VANTAGENS DO MODELO VISUAL

Este tipo de representação normalmente limita bastante a flexibilidade dos programas que podem ser desenvolvidos.

DESVANTAGEN DO MODELO VISUAL

Paradigma Estruturado

A Programação Estruturada pode ser entendida como uma forma de programar que visa facilitar a escrita, entendimento, validação e manutenção de programas.

Para Dijkstra, “a arte de programar consiste na arte de organizar e dominar a complexidade”.

A Programação Estruturada procurar reduzir o nível de complexidade através de três níveis:

•desenvolvimento do programa em diferentes fases por refinamento sucessivo (desenvolvimento top-down);

•decomposição do programa total em módulos funcionais, organizados de preferência num sistema hierárquico;

•uso de um número limitado de estruturas básicas de fluxo de controle dentro de cada módulo.

Modelo Computacional do Paradigma Estruturado

Entrada Programa Saída

Estado

• Eficiência (embute modelo de Von Neumann)

• Modelagem “natural” de aplicações do mundo real

• Paradigma dominante e bem estabelecido

VANTAGENS DO MODELO ESTRUTURADO

DESVANTAGENS DO MODELO ESTRUTURADO

- Relacionamento indireto entre E/S resulta em:

– difícil legibilidade

– erros introduzidos durante manutenção

– descrições demasiadamente operacionais focalizam o como e não o que

Algumas linguagens de programação do paradigma estruturado :

Fortran – 1957

Algol – 1960

Cobol – 1960

Basic – 1964

Pascal – 1971

C – 1971

C++ – 1985

Paradigma Orientado a Objetos

• Não é um paradigma no sentido estrito: é uma subclassificação do imperativo

• A diferença é mais de metodologia quanto à concepção e modelagem do sistema

• A grosso modo, uma aplicação é estruturada em módulos (classes) que agrupam um estado e operações (métodos) sobre este

• Classes podem ser estendidas e/ou usadas como tipos (cujos elementos são objetos)

Paradigma Orientado a Objetos

No "meio" orientado a objetos, as unidades de programa são objetos.

Por exemplo, desde uma constante numérica até um sistema para manipular arquivos, são todos objetos.

Mensagens possibilitam a comunicação entre os objetos e é através delas que uma operação de um objeto é requisitada.

Vantagens do Paradigma Orientado a objetos

Todas as do estilo imperativo

Classes estimulam projeto centrado em dados: modularidade, reusabilidade e extensibilidade

Aceitação comercial crescente

Problemas do Paradigma OO

Semelhantes aos do paradigma imperativo, mas amenizadas pelas facilidades de estruturação

Modelo Computacional do Paradigma Orientado a Objetos

Entrada Programa Saída

Estado

......

......

Estado

Entrada Programa

Saída

Estado

Entrada Programa

Saída

Estado

Entrada Programa

Saída

Estado

Entrada Programa

Saída

Algumas linguagens de programação do paradigma OO:

Smaltalk – 1957

C++ – 1985

Java – 1995

Paradigma Orientado a Aspectos

A Programação Orientada a Aspectos (POA) baseia-se na idéia de que sistemas computacionais podem ser mais bem desenvolvidos pela separação de funçõesespecíficas, afetando diferentes partes do sistema, denominadas preocupações ortogonais (crosscuting concerns).

Exemplos de crosscuting concerns são persistência, distribuição, controle de concorrência e tratamento de exceções.

Com essa separação e o aumento da modularidade proposta pela POA, o sistemaimplementado fica mais legível, o que contribui para o seu projeto e a sua manutenção.

Modelo Computacional do Paradigma Orientado a Aspectos

Entrada Programa

Saída

Estado

......

......

Estado

Entrada Programa

Saída

Estado

Entrada Programa

Saída

Estado

Entrada Programa

Saída

Estado

Entrada Programa

Saída

AspectoAspecto

AspectoAspecto

Vantagens do Paradigma Orientado a Aspectos

Todas as do paradigma OO Útil para modularizar conceitos que a Orientação a Objetos não consegue tratar, preocupações ortogonais (crosscutting concerns) . Em especial, aqueles ligados a requisitos não funcionais Aumenta a extensibilidade e o reuso

Problemas do Paradigma Orientado a Aspectos

Semelhantes aos do OO Ainda é preciso diminuir a relação entre

classes e aspectos Problemas de conflito entre aspectos que

afetam a mesma classe “Weaving” estático

Linguagem de programação do paradigma OA:

A linguagem AspectJ é um superconjunto da linguagem Java para ser usado na Programação OA.

Em uma aplicação orientada a aspectos em AspectJ, os componentes são implementados usando a sintaxe padrão de Java, e os aspectos são implementados usando uma sintaxe específica de AspectJ.

Paradigma Concorrente

A programação concorrente ocorre quando vários processos executam simultaneamente e concorrem por recursos. Eles podem utilizar uma única unidade de processamento ou várias unidades em paralelo. Neste último caso as unidades de processamento podem estar localizadas em um mesmo computador ou distribuídas entre vários. Sistemas concorrentes também podem compartilhar dados ou dispositivos periféricos.

• Principais focos da programação concorrente:

- interação e a comunicação correta entre as diferentes tarefas

- coordenação do acesso concorrente aos recurso computacionais

Vantagens do Paradigma Concorrente

Desvantagens do Paradigma Concorrente

– Não-determinismo

– Dependência de velocidade de execução

– Deadlock

– Starvation (escalonamento desonesto )

Algumas linguagens de programação do paradigma Concorrente:

ADA - 1983

Java - 1995

Paradigma Declarativo

Paradigma Declarativo, em contraste com o paradigma Imperativo, no qual os programas são especificações de como o computador deve realizar uma tarefa, no paradigma declarativo os programas são especificações sobre o que é essa tarefa.

No paradigma declarativo, o programador não precisa se preocupar sobre como o computador é implementado, nem sobre a maneira pela qual ele é melhor utilizado para realizar uma tarefa.

A preocupação do programador é descrever de forma abstrata a tarefa a ser resolvida.

Tipicamente, programas em linguagens declarativas são especificações de relações e funções.

Neste paradigma temos as seguintes linguagens :

- Lógico

- Funcional

Paradigma Lógico

Um programa em lógica é a resolução de um determinado problema através da utilização de sentenças da lógica. Em Pascal ou em C, por exemplo, temos uma seqüência de instruções executadas uma após a outra, que ao final converge em um resultado. Um programa lógico é equivalente à descrição do problema expressar de maneira formal, similar à maneira que o ser humano raciocinaria sobre ele. Linguagens Lógicas: PROLOG

Visão Crítica do Paradigma Lógico

Vantagens Em princípio, todas do paradigma funcional Permite concepção da aplicação em um alto

nível de abstração (através de associações entre E/S)

Problemas Em princípio, todos do paradigma funcional Linguagens usualmente não possuem tipos,

nem são de alta ordem

Paradigma Funcional

Linguagens funcionais operam apenas sobre funções, as quais recebem listas de valores e retornam um valor. O objetivo da programação funcional é definir uma função que retorne um valor como resposta do problema.Um programa funcional é uma chamada de uma função que normalmente chama outras funções para gerar um valor de retorno.

Visão Crítica do Paradigma Funcional

Vantagens Manipulação de programas mais simples: - Prova de propriedades - Transformação (exemplo: otimização) - Concorrência explorada de forma natural Problemas “O mundo não é funcional!” Implementações ineficientes Mecanismos primitivos de E/S e formatação

As linguagens funcionais mais conhecidas são :

LISP, Prolog, Scheme , ASpecT, Erlang, Gofer, Haskell, Hope, Hugs, J, Miranda, ML, OPAL e outras...