Introdução a Linguagens de Programação Prof a.dra.thatyana de Faria Piola Seraphim Universidade Federal de Itajubá thatyana@unifei.edu.br
Dados Importantes O material com todas as informações referentes à disciplina, podem ser encontrados na página: Datas Importantes: Nota: http://www.thatyana.unifei.edu.br Prova 01 25/09. Prova 02 13/11. Substitutiva 27/11. P1+P2 2
Referências Bibliográcas Allen B. Tucker; Robert E. Noonan. Linguagens de Programação: Princípios e Paradigmas. McGrawHill. 2 a Edição. Marcus Vinícius Midena Ramos; João José Neto; Ítalo Santiago Vega. Linguagens Formais: Teoria, Modelagem e Implementação. Editora Bookman. 2009. Harry R. Lewis; Christos H. Papadimitriou. Elementos da Teoria da Computação. Editora Bookman. 2 a Edição. Paulo Blauth Menezes. Linguagens Formais e Autômatos. Editora Bookman. 5 a Edição. Michael Sipser. Introduçao à Teoria da Computação. Editora Thompson. 2 a Edição. Tiarajú Asmuz Diverio; Paulo Blauth Menezes. Teoria da Computação: Máquinas Universais e Computabilidade. Editora Bookman. 2 a Edição.
Tópicos da Disciplina Programação Imperativa Programação Orientada a Objetos Programação Funcional Programação Lógica Programação Orientada a Eventos Programação Concorrente
Introdução O estudo dos princípios e fundamentos de linguagens de programação é essencial para qualquer prossional de programação. É a partir desse estudo que as características especícas de cada linguagem podem ser identicadas, permitindo que programas sejam desenvolvidos. Características desejáveis para linguagens de programação podem ser identicadas e cuidadosamente descritas, para serem incorporadas às linguagens novas ou já existentes. Assim como ocorre com as linguagens naturais (português, inglês, etc.), as linguagens de programação permitem seu estudo partindo de dois extremos opostos: Poliglota iletrado. Linguista teórico.
Introdução Poliglota Iletrado É uente em diversos idiomas. É um iletrado em assuntos de linguística. Assim, é incapaz de abstrair e generalizar as estruturas linguísticas presentes nos diversos idiomas que ele domina. Para um poliglota iletrado aprender um novo idioma é sempre difícil e penoso. O poliglota iletrado é prático.
Introdução Linguista Teórico Entende muito bem as estruturas linguísticas presentes em qualquer idioma. O que lhe possibilita apreciar essas estruturas em diferentes idiomas, sejam eles, conhecidos ou ainda por conhecer. Estuda essas estruturas e teoriza a respeito delas. Entretanto, é incapaz de utilizar confortavelmente os idiomas estudados em uma conversação uente. Se restringe a ser teórico.
Introdução Programação de Computadores Poliglota iletrado: consegue programar utilizando diversas linguagens, mas tem diculdades para explorar de forma eciente os recursos especícos oferecidos por aquelas linguagens. Linguista teórico: consegue explicar e analisar cada um dos recursos especícos de cada linguagem de programação; porém, sente grande diculdade em programar em qualquer linguagem. O objetivo desta disciplina é apresentar e estudar os principais paradigmas de programação através das linguagens.
Introdução Para armazenar um algoritmo na memória do computador e para que ele possa comandar as operações a serem executadas é necessário que ele seja programado. O algoritmo deve ser escrito para uma linguagem que o computador possa entender. Os computadores só podem executar diretamente os algoritmos escritos em linguagem de máquina. Linguagem de Máquina: é um conjunto de instruções capazes de ativar diretamente os dispositivos eletrônicos do computador.
Introdução A linguagem de máquina tem vários inconvenientes: é diferente para cada tipo de computador, pois depende de sua arquitetura; é extremamente rudimentar e exige que, mesmo as operações mais simples ainda sejam renadas, para expressá-las em termos de registros, acumuladores e outros dispositivos da máquina; a linguagem de máquina é expressa em forma numérica (binária ou hexadecimal), o que a torna pouco expressiva para alguns usuários. Nos primeiros computadores, a linguagem de máquina era a única opção para a programação. Logo surgiu a idéia de escrever programas em linguagem simbólica, conhecida também como Linguagem Assembly ou linguagem montadora.
Introdução Na Linguagem Assembly as instruções não são expressas apenas por números, mas também por letras e símbolos. O posicionamento dos dados e instruções na memória é também feito de forma simbólica. Para controlar o computador, um programa em Assembly, deve primeiro ser transformado em linguagem de máquina. Programa Montador ou Assembly : programa que transforma cada comando da linguagem Assembly em um comando da linguagem de máquina. Com o sucesso da linguagem Assembly, os primeiros pesquisadores criaram linguagens em que a programação era feita através de uma notação matemática e de algumas palavras da língua inglesa. Deixando ao próprio computador a tarefa de traduzir o programa para a linguagem de máquina, através de um programa chamado compilador.
Introdução A primeira linguagem que teve ampla aceitação é a linguagem FORTRAN (FORmula TRANslation) que surgiu em 1957 e é ainda hoje utilizada. Existe uma grande vantagem, além da facilidade, em escrever programas em linguagens de alto nível: a sua independência da máquina a ser usada. O programador não precisa se deter em particularidades do computador que irá usar. Um programa escrito em linguagem de alto nível, geralmente com poucas alterações, é aceito por qualquer computador. A escolha da linguagem de programação a ser usada em um computador depende da existência de um programa: Compilador: programa que traduz o algoritmo escrito na linguagem escolhida para a linguagem de máquina. Interpretador: programa que interpreta cada comando do programa e execute uma série de instruções que a ele correspondem.
Introdução A existência de compiladores ou interpretadores para diversas linguagens, a escolha pela linguagem a ser usada pode ser: pela preferência ou mais familiaridade do programador para com a linguagem; pela linguagem melhor implementada no computador; ou mesmo pela linguagem mais adequada para o tipo de aplicação que se deseja fazer. Para se resolver um problema em um computador, o mais importante do que a escolha da linguagem de programação é o desenvolvimento de um algoritmo adequado. O algoritmo deve ser desenvolvido objetivando sobretudo a clareza, permitindo que os erros cometidos sejam detectados o quanto antes, evitando excessivas revisões e visando facilitar futuras modicações.
Paradigmas de Programação Paradigma: é um padrão de pensamento que guia um conjunto de atividades relacionadas. Paradigma de programação: é um padrão de resolução de problemas que se relaciona a um determinado gênero de programas e linguagens. Existem quatro paradigmas de programação distintos e fundamentais que evoluíram nas últimas décadas: Programação Imperativa. Programação Orientada a Objetos. Programação Funcional. Programação Lógica.
Paradigmas de Programação Programação Imperativa: é o paradigma de programação mais antigo e bem desenvolvido. Surgiu com os primeiros computadores na década de 1940. Seus elementos espelham diretamente as características arquiteturais dos computadores modernos (modelo computacional clássico de von Neumann). Neste modelo, tanto o programa quanto as suas variáveis são armazenados juntos, e o programa contém uma série de comandos para: executar cálculos, atribuir valores a variáveis, obter entradas, produzir saídas ou redirecionar o controle para outro ponto nessa série de comandos. As linguagens de programação imperativas predominantes incluem Cobol, Fortran, C, Ada, Pascal e Perl.
Paradigmas de Programação Programação Orientada a Objetos: este paradigma fornece um modelo no qual um programa é uma coleção de objetos que interagem entre si, passando mensagens que transformam seu estado. A passagem de mensagens permite que objetos de dados se tornem ativos em vez de passivos, característica que ajuda a distinguir melhor a programação orientada a objetos da imperativa. O encapsulamento de objetos, herança e a passagem de mensagens são componentes fundamentais da programação orientada a objetos. Exemplos de linguagens de programação orientadas a objetos são: Smalltalk, C++, Java, C# e Python.
Paradigmas de Programação Programação Funcional: modela um problema computacional como uma coleção de funções matemáticas, cada uma com um espaço de entrada (domínio) e o respectivo resultado (faixa). Emergiu como um paradigma distinto no início da década de 1960. Sua criação foi motivada pela necessidade dos pesquisadores no desenvolvimento de inteligência articial e em seus subcampos: computação simbólica, prova de teoremas, sistemas baseados em regras e processamento de linguagens naturais. Essas necessidades não eram bem atendidas na época pelas linguagens imperativas. Exemplos de linguagens funcionais são: Lisp, Scheme, Haskell e ML.
Paradigmas Computacionais Programação Lógica (declarativa): surgiu como um paradigma distinto nos anos 70. Permite que o programador modele um problema declarando qual resultado o programa deve obter, em vez de como ele deve ser obtido. Essas linguagens são chamadas de linguagens baseadas em regras, já que as declarações do programa se parecem mais com um conjunto de regras ou restrições sobre o problema, em vez de uma sequência de comandos a serem executados. Interpretar as declarações de um programa lógico cria um conjunto de todas as soluções possíveis para o problema que ele especica.
Paradigmas de Programação Programação Lógica: Duas características são: Não-determinismo: um programa não-determinístico pode encontrar várias soluções para um problema em vez de apenas uma. Backtracking : possibilita o não-determinismo dos programas, sendo implícito em todos os programas. Este mecanismo já está dentro do interpretador Prolog. A principal linguagem de programação lógica é o Prolog.
Paradigmas de Programação Além dos quatro paradigmas, alguns tópicos para o projeto de linguagens de programação são destacados: Programação Orientada a Eventos. Programação Concorrente. Programação Orientada a Eventos: os programas não controlam a sequência na qual ocorrem eventos de entrada; em vez disso, eles são escritos para reagir a qualquer sequência de razoável de eventos. Um programa orientado a eventos é apenas um programa cujo comportamento é inteiramente determinado por questões de manipulação de eventos. A manipulação de eventos está frequentemente acoplada ao paradigma orientado a objetos, embora ela ocorra dentro do paradigma imperativo. O exemplo mais comum é a interface gráca do usuário.
Paradigmas de Programação Programação Orientada a Eventos Os dados de entrada governam a sequência de operações que são executadas pelo programa, mas o programa não determina a ordem da sequência de entrada. Um programa acionado por eventos é projetado para executar indenidamente, ou pelo menos até que o usuário selecione o botão de saída. Programas acionados por eventos também controlam aplicações baseadas na Internet, por exemplo, um sistema de reservas de uma empresa aérea. A programação orientada a eventos é também usada em dispositivos de telefonia móvel, motores de automóveis, sistema de navegação em aviões e sistemas de segurança residencial. Em sistemas de navegação de aviões, os eventos que causam respostas programadas incluem mudança na direção, velocidade do vento ou temperatura, ou seja, eventos que não ocorrem em qualquer ordem determinada ou previsível. Linguagens: Delphi, Visual Basic, Java e Tcl/Tk.
Paradigmas de Programação Programação Concorrente: pode ocorrer dentro do paradigma imperativo, orientado a objetos, funcional ou lógico. A concorrência ocorre quando o programa possui uma coleção de elementos assíncronos que podem compartilhar informações ou sincronizar entre si em intervalos de tempo. A concorrência também ocorre dentro de um processo individual como a execução paralela de diferentes iterações de um laço. Linguagens de programação concorrente incluem SR, Linda, e High Performance Fortran.
Histórico das Linguagens Década de 1940: As primeiras linguagens de programação foram as linguagens de máquina e as linguagens assembly dos primeiros computadores. Década de 1950: marcou o início da era das linguagens de ordem mais elevada (HOL em inglês). Uma HOL se distingue de uma linguagem de máquina ou assembly porque seu estilo de programação é independente de alguma arquitetura de máquina especíca. As primeiras linguagens de ordem mais alta foram Fortran, Cobol, Algol e Lisp. Fortran e Cobol sobreviveram e se desenvolveram bastante desde o seu surgimento no nal da década de 1950. Ainda existem muitos códigos legados destas linguagens. Lisp teve substancialmente seu uso diminuído e Algol desapareceu completamente.
Histórico das Linguagens Os projetos inovadoras dessas primeiras linguagens tiveram grande inuência sobre suas sucessoras. Exemplos: A demonstração de Fortran de que notação algébrica poderia ser traduzida em código eciente agora é admitida como padrão. A introdução da estrutura de registros em Cobol. O projeto de Pascal para a compilação em um passo. A demonstração em Algol de que uma gramática linguística poderia denir formalmente sua sintaxe. A maior motivação para o desenvolvimento de linguagens de programação nas últimas décadas foi a rápida evolução da demanda de poder computacional e as novas aplicações por parte de uma grande e diversa comunidade de usuários.
Histórico das Linguagens Exemplos de comunidades: Inteligência Articial: se preocupa com o desenvolvimento de programas que modelam o comportamento da inteligência humana, a dedução lógica e a cognição. A manipulação de símbolos, as expressões funcionais e o projeto de sistemas de prova lógica têm sido os objetivos centrais deste trabalho em andamento. Os paradigmas da programção funcional e da programação lógica se desenvolveram bastante por intermédio dos esforços dos programadores de IA. Linguagens de programação funcional proeminentes nos últimos anos incluem Lisp, Scheme, ML e Haskell. Prolog, na área de programação lógica, tem sido o ator principal, e a Prolog tem tido pouca inuência sobre o projeto de linguagens em outras áreas de aplicação.
Histórico das Linguagens Educação: nas décadas de 1960 e 1970, diversas linguagens importantes foram projetadas com o objetivo principal de ensinar programação aos alunos, destacando-se Basic e Pascal. Estas linguagens têm sido substituídas nos últimos anos nos currículos educacionais por linguagens de apelo comercial como C, C++ e Java. Ciência e Engenharia: a comunidade de programação cientíca e de engenharia desempenhou um papel importante no início da história da computação e continua a desempenhar um papel importante atualmente. Os primeiros programas foram escritos na década de 1940 para prever as trajetórias balísticas durante a 2 a Guerra Mundial. Esses programas foram escritos primeiramente em linguagem de máquina e assembly, por matemáticos.
Histórico das Linguagens Até hoje, a comunidade cientíca permanece como uma atividade central na história da programação e das linguagens de programação. O domínio de seus problemas se refere principalmente à execução de cálculos complexos de forma muito rápida e precisa. Os cálculos são denidos por modelos matemáticos que representam fenômenos cientícos e são implementados principalmente por meio do uso do paradigma de programação imperativa. Quanto mais complexo o fenômeno cientíco se torna, maior a necessidade de linguagens de programação e computadores altamente sosticados e paralelos.
Histórico das Linguagens Ciência e Engenharia: A programação concorrente é fortemente motivada pelas necessidades de tais aplicações cientícas. Algumas linguagens, como High Performance FortranHPF, suportam programação concorrente por meio da inclusão de recursos a uma linguagem básica amplamente usada (Fortran). Sistemas de Informação: programas projetados para instituições gerenciarem seus sistemas de informação provavelmente são os mais prolícos do mundo. Os sistemas de informação têm sido desenvolvidos em linguagens de programação como Cobol e SQL. Cobol (Common Business Oriented Language ) foi projetada primeiramente no nal da década de 1950 e usa a língua inglesa como base de sua sintaxe, suportando um estilo de programação imperativo.
Histórico das Linguagens Sistemas de Informação: SQL (Structured Query Language) emergiu na década de 1980 como uma ferramenta de programação declarativa para especicação de bancos de dados, geração de relatórios e recuperação de informações. SQL é a linguagem usada para a especicação e a recuperação de informações de bancos de dados relacionais. Sistemas e Redes: programadores de sistemas projetam e realizam a manutenção do software básico que executa os sistemas: Componentes do sistema operacional, software de rede, compiladores e depuradores de linguagens de programação, máquinas virtuais e interpretadores, sistemas embarcados e de tempo real.
Histórico das Linguagens Sistemas e Redes: Esses tipos de softwares estão intimamente relacionados com as arquiteturas de máquinas especícas. A maioria desses programas é escrita em C, permitindo que os programadores cheguem a um nível muito próximo do nível de linguagem de máquina. A programação de sistemas é geralmente feita com o uso do paradigma de projeto imperativo, mas os programadores de sistemas também devem lidar com a programação concorrente e orientada a eventos. Linguagens de script são largamente usadas atualmente para uma diversidade de tarefas de sistema. Exemplo: um programa awk pode ser projetado rapidamente para vericar a consistência em um arquivo de senhas de uma máquina Unix. Principais linguagens de script são awk, Tcl/Tk e Python.
Histórico das Linguagens World Wide Web: a área mais dinâmica para novas aplicações de programação é a Internet, que é o veículo que permite o comércio eletrônico e uma ampla gama de aplicações acadêmicas, governamentais e industriais. Linguagens de programação que suportam a computação centrada na Web usam a programação orientada a eventos, que promove a interação sistema-usuário. As linguagens de programação que suportam computação centrada na Web incluem Perl, PHP, Visual Basic, Delphi, Java e Python.