Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Linguagem de programação (trabalho), Trabalhos de Algoritmos

dissertação

Tipologia: Trabalhos

2014

Compartilhado em 03/11/2014

cristiane-nascimento-pimentel-10
cristiane-nascimento-pimentel-10 🇧🇷

4.4

(5)

2 documentos

1 / 22

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
INSTITUTO BENJAMIN CONSTANT IBC
João Batista dos Santos Pimentel
LINGUAGEM DE PROGRAMAÇÃO
Manaus Am
2014
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16

Pré-visualização parcial do texto

Baixe Linguagem de programação (trabalho) e outras Trabalhos em PDF para Algoritmos, somente na Docsity!

INSTITUTO BENJAMIN CONSTANT – IBC

João Batista dos Santos Pimentel

LINGUAGEM DE PROGRAMAÇÃO

Manaus – Am 2014

João Batista dos Santos Pimentel

LINGUAGEM DE PROGRAMAÇÃO

Projeto de pesquisa apresentado para obtenção de nota na disciplina Lógica de Programação do curso Técnico de Automação Industrial do Instituto Benjamin Constant - IBC.

Prof.(o): Alacy Serrão

Manaus – Am 2014

Introdução

Um computador é uma máquina que, para realizar algo, precisa que alguém lhe indique o que fazer de uma forma que ele entenda. Para que você possa fazer isso, é preciso que:  Conheça o computador e os recursos disponíveis;  Saiba o que quer que o computador faça;  Instrua o computador, através de um programa escrito em uma linguagem de programação. O hardware do computador, constituído de placas e dispositivos mecânicos e eletrônicos, precisa do software para lhe dar vida: programas, com finalidades bem determinadas, que façam o que os usuários querem ou precisam. Alguns programas maiores, como processadores de texto, planilhas eletrônicas e navegadores da Internet, são de fato agrupamentos de dezenas de programas relacionados entre si. As linguagens de programação são usadas para descrever algoritmos; isto é, seqüências de passos que levam à solução de um problema. Uma linguagem de programação pode ser considerada como sendo uma notação que pode ser usada para especificar algoritmos com precisão.

1. História das Linguagens de Programação

Como muitos "primeiros" na história, a primeira linguagem de programação moderna é difícil de ser identificada. No início, as restrições do hardware definiam a linguagem. Cartões perfurados dispunham de até 80 colunas, mas algumas das colunas tinham que ser usados para um número de seqüência de cada cartão. Fortran incluía algumas palavras-chave que eram as mesmas palavras em Inglês, como "IF" (se), "GOTO" (vá para) e "CONTINUE" (continue). O uso de um tambor magnético para a memória significava que os programas de computador também tinham que ser intercalados com as rotações do tambor. Assim, os programas eram mais dependentes do hardware do que hoje. Para algumas pessoas, a resposta depende de quanta energia e legibilidade humana são necessárias antes que o status de "linguagem de programação" seja concedido. Os teares de Jacquard e a máquina diferencial de Charles Babbage, ambos tinham linguagens simples e extremamente limitadas para descrever as ações que estas máquinas deviam executar. Na década de 1940 os primeiros computadores elétricos, reconhecidamente modernos, foram criados. A velocidade limitada capacidade da memória forçava os

programadores a escrever a mão economicamente programas em linguagem de montagem (linguagem de máquina). Logo se descobriu que a programação em linguagem assembly exigia um grande esforço intelectual e era muito sujeita a erros. Em 1948, durante este período algumas linguagens importantes foram desenvolvidas:  1943 - Plankalkül (Konrad Zuse)  1943 - ENIAC coding system  1949 - C-

2. Primeiras linguagens de programação

Na década de 1950 as primeiras três linguagens de programação modernas, cujos descendentes ainda estão em uso difundido hoje foram concebidas:  FORTRAN (1954), a "FORmula TRANslator", inventada por John Backus e outros.;  LISP, a "LISt Processor", inventada por John McCarthy e outros.;  COBOL, a COmmon Business Oriented Language, criada pelo Short Range Committee, com grande influência de Grace Hopper. Outro marco na década de 1950 foi a publicação, por um comitê de cientistas americanos e europeus, de "uma nova linguagem para os algoritmos", a ALGOL 60 através da publicação do relatório "The ALGOL 60 Report (the "ALGOrithmic L anguage")". Este relatório consolidou muitas idéias que circulavam na época e apresentou duas inovações chave quanto ao projeto de linguagens:  Estrutura de blocos aninhados: pedaços significativos de código poderiam ser agrupados em bloco de instruções, sem ter que ser transformados em procedimentos separados e ser explicitamente chamados;  Escopo léxico: um bloco podia ter suas próprias variáveis não acessíveis fora do bloco, e muito menos manipuláveis de fora do bloco.  Outra inovação, relacionada a esta última, foi na forma como a linguagem foi descrita:  Uma notação matemática exata, Backus-Naur (BNF), foi utilizada para descrever a sintaxe da linguagem. Quase todas as linguagens de programação posteriores utilizaram uma variante da BNF para descrever a parte livre de contexto de sua sintaxe. Algol 60 foi particularmente influente na concepção das linguagens posteriores, algumas das quais logo se tornaram mais populares. Os grandes sistemas da Burroughs foram

As linguagens de alto nível por outro lado, 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. A vantagem principal das linguagens de alto nível é a abstração. Isto é o processo em que as propriedades essenciais requeridas para a solução do problema são extraídas enquanto esconde os detalhes da implementação da solução adotada pelo programador. Com o nível de abstração aumentado, o programador pode concentrar-se mais na solução do problema ao invés de preocupar-se como o hardware vai tratar do problema. No início da computação os programadores eram obrigados a programar usando linguagem de máquina, que nada mais é do que seqüências de dígitos binários (0s e 1s). Esta representação tinha muitas desvantagens:  Há uma grande probabilidade de erro em todos os estágios do processo de programação.  A programação mesmo sendo com algoritmos simples resulta em longos programas, o que dificulta o processo de validação e detecção de erros.  O cálculo de endereços de memória devem ser feitos manualmente, com um árduo trabalho e uma grande probabilidade de erros. Algumas das desvantagens podem ser superadas fazendo com que o computador seja o responsável pelo estágio de tradução. O programa ainda é escrito em termos de operações básicas de máquina, mas a tradução em código binário é feita pelo computador. O programa que faz essa tradução é chamado de assembler. Até mesmo o mais simples dos assemblers modernos podem reconhecer endereçamentos simbólicos e mnemônicos representado operações de máquina. Para especificar uma instrução para adicionar o conteúdo de localização ival para o acumulador. O assembler então faz a tradução para a string equivalente de 0s e 1s. O assembler também trata do problema de cálculo de endereço, usando nomes em formato de texto para endereçar os dados. A conseqüência desta automação de tradução é que os programas em linguagem Assembly são muito mais fáceis de escrever e depurar que programas em linguagem de máquina. Existem centenas de linguagens de programação, desenvolvidas desde o início da computação. Essas linguagens foram agrupadas de acordo com suas e características e época em que foram desenvolvidas em 4 gerações:

3.1 Linguagens de primeira geração

A primeira geração de linguagens remonta aos dias da codificação em linguagem de máquina, surgidas com o início da computação na década de 50, especificamente de 1950 a

  1. A Linguagem de máquina e Assembly representam esta primeira geração das linguagens de programação. Essas linguagens totalmente dependentes da máquina, exibem o mais baixo nível de abstração que uma linguagem pode ser representada. Essas linguagens somente devem ser usadas quando as linguagens de mais alto nível não satisfizerem as necessidades ou não forem suportadas.

3.2 Linguagens de Segunda Geração

A segunda geração de linguagens de programação foi desenvolvida de 1962 a 1974 e serviu de base para o desenvolvimento das modernas linguagens de programação. As características marcantes das linguagens de segunda geração foram o amplo uso com grande familiaridade e aceitação no mercado, sistemas de execução em tempo real e desenvolvimento de gerenciadores de base de dados. As linguagens Fortran, Cobol, Algol e algumas extensões como Basic, foram os representantes dessa segunda geração. Fortran é uma linguagem ainda muito utilizada na área de engenharia e pela comunidade científica. Cobol é uma linguagem que foi aceita e ainda continua em uso para aplicações comerciais. Algol foi o precursor de muitas linguagens de terceira geração, por oferecer ricamente estruturas de controle e tipos de dados. Basic foi uma linguagem originalmente criada para o aprendizado e teve seu uso bastante reduzido já na década de 70.

3.3 Linguagens de Terceira Geração

As linguagens de terceira geração também chamadas de linguagens de programação modernas ou estruturadas são caracterizadas pela grande capacidade procedural e estrutural de seus dados, foram desenvolvidas de 1974 a 1986. As linguagens de terceira geração tiveram como principais características a possibilidade de criar sistemas distribuídos, incorporar recursos mais inteligentes, e exigir um hardware menos robusto. Podem ser divididas em duas grandes categorias: linguagens de propósito geral e linguagens especializadas.

As linguagens de quarta geração podem ser classificadas em três categorias: linguagens de consulta, geradoras de programas e outras linguagens (4GL). As linguagens de consulta foram desenvolvidas para manipular bases de dados, permitindo o gerenciamento de um grande número de informações armazenadas em arquivos. As linguagens geradoras de programas representam uma sofisticada classe das linguagens 4GL. Permitem ao usuário ou programador criar facilmente programas complexos em linguagens de terceira geração, utilizando bem menos declarações e comandos. Estas linguagens possuem um nível bem mais alto que as de terceira geração. Enquadradas como outras linguagens de quarta geração temos as linguagens usadas em sistemas de apoio à decisão, linguagens utilizadas para modelagem de sistemas, linguagens de prototipação, e linguagens de especificação formal que produzem código de máquina.

3.5 Linguagens de quinta geração

A nova geração das linguagens de programação, que já é chamada por muitas pessoas de quinta geração, é baseada em métodos de consulta e utilizam comandos escritos em linguagens naturais, permitindo uma fácil comunicação com o computador. Essas linguagens são baseadas nos conceitos de objetos, que agrupam comandos de programação com dados em objetos que podem ser usados o tempo todo durante a execução do programa, o que é muito útil em ambientes de execução paralela. Outra tendência dos ambientes de desenvolvimento de programas é fornecer além das linguagens de programação, um ambiente de geração automática de código, onde o programador especifica através de ferramentas visuais as características do programa e a ferramenta se encarrega de gerar a codificação na linguagem específica. Estas ferramentas são muito difundidas na programação para Windows, e são também chamados de RAD (Desenvolvimento Rápido de Aplicativos).

4. Classificação das linguagens de programação em tipos

Um tipo é definido a partir de um conjunto de valores e de operações ao qual está associado. O sistema de tipos de uma linguagem de programação (LP) usualmente inclui um conjunto básico de tipos;  mecanismos para a associação entre tipos e construções básicas da LP;

 regras para a definição de novos tipos;  regras de compatibilidade e inferência. A forma como a representação de um tipo de dado é implementada torna-se transparente, podendo inclusive ser modificada sem afetar o funcionamento do programa. Toda LP possui um conjunto primitivo de tipos, que geralmente incluem:  Caracter (char)  Strings  Inteiros  Reais  Boleanos Além disso muitas LPs permitem que o usuário defina novos tipos de dados através de declarações específicas ( typedef em C, type em Pascal e Módula 2, etc). Podemos classificar os tipos compostos disponíveis em LPs nas seguintes categorias:  Produto cartesiano;  Conjunto potência;  Domínios finitos;  União discriminada;  Sequências;  Definição recursiva; Produto Cartesiano é um produto cartesiano de dois ou mais conjuntos é uma combinação de valores agregados (tuplas) retirados de cada um dos conjuntos de dados. Conjunto Potência é um produto que permite definir valores a um subconjunto de um tipo qualquer. Operações típicas de conjunto potência são: união, interseção e pertence. Domínios Finito, permitem definir uma associação entre um conjunto finito (domínio) e valores de um conjunto qualquer (contradomínio). Como principal exemplo desta categoria temos o array, que é o tipo composto mais comum e mais importante em LPs. Poucas LPs permitem a comparação (Fortran, Ada) e atribuição direta entre arrays (Java). Diversas LPs permitem a definição dos limites de um array dinamicamente (Java, Lua). União Discriminada é um produto que permite a definição concomitante de mais de um tipo para uma variável. É interessante em situações em que uma variável precisa assumir valores de mais de um tipo, ou para economia de memória.

Síntese : Constrói o desejado programa alvo (código de máquina) a partir da representação intermediaria. Se divide em: geração do código e otimização do código. Análise Léxica: é o processo de analisar a entrada de linhas de caracteres e produzir uma seqüência de símbolos chamados “símbolos léxicos” (lexical tokens), ou somente "símbolos" (tokens), que podem ser manipulados mais facilmente pelo compilador. A análise léxica é a forma de verificar determinado alfabeto. Quando analisamos uma palavra, podemos definir através da análise léxica se existe ou não algum caractere que não faz parte do nosso alfabeto, ou um alfabeto inventado por nós. O analisador léxico é a primeira etapa de um compilador, logo após virá à análise sintática. Análise Sintática: é o processo de analisar uma seqüência de entrada para determinar sua estrutura gramatical segundo uma determinada gramática formal. Essa análise faz parte de um compilador. A análise sintática transforma um texto na entrada em uma estrutura de dados, em geral uma árvore, o que é conveniente para processamento posterior e captura a hierarquia implícita desta entrada. Através da análise léxica é obtido um grupo de tokens, para que o analisador sintático use um conjunto de regras para construir uma árvore sintática da estrutura. Em termos práticos, pode também ser usada para decompor um texto em unidades estruturais para serem organizadas dentro de um bloco. Análise semântica: é a terceira fase da compilação onde se verifica os erros semânticos, (por exemplo, uma multiplicação entre tipos de dados diferentes) no programa- fonte (código-fonte) e coleta as informações necessárias para a próxima fase da compilação que é a geração de programa-objeto (código objeto).

Figura 1 - Fases de um compilador

Compiladores

Vantagens Desvantagens

Execução mais rápida Várias etapas de tradução Permite estruturas de programação mais completas

Programação final é maior, necessitando mais memória para a sua execução Permite a optimização do código fonte.

Processo de correcção de erros e depuração é mais demorado Quadro 1- Vantagens e Desvantagens dos Compiladores

5.2 Interpretador

Um interpretador, transforma um código fonte em código que só ele (o programa que você está utilizando para escrever o código) entende. Assim, quando um programa interpretado for iniciado, ele necessita de uma DLL para poder rodar, que irá traduzir esse código para uma linguagem que o computador entenda. Interpretadores são programas de computador que lêem um código fonte de uma linguagem de programação e os convertem em código executável. Seu funcionamento pode variar de acordo com a implementação. Em muitos casos o interpretador lê linha-a-linha e converte em código objeto à medida que vai executando o programa. Linguagens interpretadas são mais dinâmicas por não

 as linguagens orientadas a objeto , que oferecem mecanismos sintáticos e semânticos de suporte aos conceitos da programação orientada a objetos; alguns exemplos destas linguagens são Smalltalk, Eiffel, C++ e Delphi. Aqui um programa pode ser visto como uma seqüência de chamadas de procedimentos. Um exemplo de procedimento clássico é o cálculo de uma raiz quadrada. Uma chamada de procedimento é usada para invocar o procedimento, podendo ser passado alguns parâmetros (por exemplo, o número cuja raiz quadrada deve ser calculada). Após a seqüência ser executada, o controle retorna justo após o ponto de chamada do procedimento. Introduzindo parâmetros tão bem quanto procedimentos de procedimentos (sub- procedimentos), programas podem ser escritos mais em mais estruturados e livres de erro. Por exemplo, se um procedimento é correto, toda vez que ele é usado ele produz um resultado correto. Conseqüentemente, no caso de erros você pode direcionar sua busca àqueles lugares que não são livres de erros. Uma das desvantagens da programação estruturada é a tendência em gerar códigos onde tratamentos de dados são misturados com o comportamento do programa. Além disso, quando se desejava criar um programa semelhante a um que já tivesse feito, era complicado pegar determinadas partes deste programa já pronto e trazer para o novo projeto, uma vez que eram necessárias, na maior parte das vezes, realizar mudanças substanciais no código.

7. Programação Modular

No passar dos anos, a ênfase no projeto de programas passou do projeto de procedimentos para a organização dos dados, surgindo a programação modular. Nela, procedimentos relacionados e dados que eles utilizam são agrupados em módulos separados. Por exemplo, todas as funções de manipulação de uma pilha (empilhar, desempilhar, etc.) e a pilha em si podem ser agrupadas em um módulo. Um programa, portanto não consiste mais de apenas uma parte única. Ele é agora composto de várias pequenas partes que interagem através de chamadas de procedimento. Cada módulo tem seus próprios dados. Isto permite que cada módulo gerencie um estado interno que é modificado por chamadas a procedimentos deste módulo. São programações denominadas de subprogramas, essas permitem a divisão de um programa em módulos, cada um dos quais pode ser desenvolvido separada e

independentemente dos outros, podendo estes módulos, posteriormente, serem integrados num único programa. As linguagens de alto nível fornecem dois processos distintos de produzir módulos, dando um deles origem à criação de funções e o outro à criação de procedimentos. Um subprograma para ser executado tem de ser integrado num programa.

8. Programação orientada à objetos

Em contraste com as outras técnicas apresentadas, nós agora temos uma malha de objetos que interagem cada um mantendo seu próprio estado. A essência da programação orientada a objetos consiste em tratar os dados e os procedimentos que atuam sobre os dados como um único objeto – uma entidade independente com uma identidade e certas características próprias. Este paradigma de programação será o objeto de estudo deste curso. Uma abordagem orientada a objetos identifica as palavras-chaves no problema. Estas palavras-chaves são descritas então em um diagrama e setas são desenhadas entre estas palavras-chaves para definir uma hierarquia interna. As palavras-chaves serão os objetos na implementação e a hierarquia define a relação entre estes objetos. O termo objeto é usado aqui para descrever uma estrutura bem definida, contendo todas as informações sobre certa entidade: dados e funções para manipular os dados. Os objetos introduzem uma maneira diferente de conceber, de programar, de analisar e de manter as aplicações. Após um longo período de maturação em laboratórios de pesquisa, as linguagens à objetos começam a invadir os domínios profissionais. É possível hoje em dia dizer que não se trata de um modo, mas de um processo de mutação. O principal argumento desses novos produtos inclui as facilidades de reutilização de código e em conseqüência ganhos de produtividade são alcançados. A reusabilidade depende em muito da modularidade dos programas. A POO foi criada para tentar simular o mundo real dentro do computador e para isso utiliza objetos. Desta forma, fica a cargo do programador modelar objetos e a interação entre eles. Essa modelagem leva em consideração alguns conceitos, dentre os principais, pode-se citar:  Classe: É o molde para criar objetos. Possui todas as especificações de um grupo deles. Ex.: Os objetos Eddie Vedder e Kurt Cobain, apesar de serem diferentes, derivam da mesma classe Pessoa.

9. Programação Linear

A utilização de programação linear é recomendada para problemas de maior porte, em que muitas variáveis e restrições devem ser consideradas sem dúvida nenhuma a Programação Linear é uma das técnicas da Pesquisa Operacional das mais utilizadas em se tratando de problemas de otimização. A Programação linear se incube de achar a solução ótima de um problema, uma vez definida o modelo linear, ou seja, a função objetivo e as restrições lineares. Quando se esta diante de um problema de PL práticos, que se pretende resolver, ele pode estar escrito de forma de maximização (ou minimização) de uma função objetivo linear, que é sujeita a um conjunto de restrições que podem ser expressos sob a forma de inequações ou equações lineares. O passo mais importante na formulação de um modelo é a escolha apropriada das variáveis de decisão. Se as variáveis de decisão forem selecionadas adequadamente, a função objetivo e as restrições devem ser obtidas sem muita dificuldade. Problemas na determinação da função objetivo e restrições normalmente são devido a uma escolha incorreta das variáveis de decisão.

10. Principais linguagens atuais

A evolução das linguagens de programação continua, tanto na indústria quanto na pesquisa. Algumas das tendências atuais incluem:  Mecanismos para a adição de segurança e verificação da confiabilidade para a linguagem: verificação estática prolongada, controle de fluxo de informação, estático segurança em threads.  Mecanismos alternativos de modularidade: mixin s, Delegação de programação, programação orientada a aspectos.  Desenvolvimento de software orientado a componentes.  Metaprogramação, Reflexão ou acesso a árvores de sintaxe abstratas.  Maior ênfase na distribuição e mobilidade.  Integração com bases de dados, incluindo XML e bancos de dados relacionais.  Suporte para Unicode de forma que o código-fonte não esteja restrito aos caracteres contidos no código ASCII; permitindo, por exemplo, o uso de scripts não latinos ou pontuação estendida.

 XML para à interfaces gráficas (XUL, XAML). Algumas linguagens importantes que foram desenvolvidas durante o período de 1990 à 2008, são: 1990 - Haskell, 1991 - Python, 1991 - Java, 1993 - Ruby, 1993 - Lua, 1994 – ANSI Common Lisp, 1995 - JavaScript, 1995 - PHP, 2000 - C#, 2008 - JavaFX Script.