Escolar Documentos
Profissional Documentos
Cultura Documentos
Sumrio
Motivao Evoluo das LPs A arte de projetar LPs Classificao Mtodos de implementao Critrios de avaliao
Motivao
Por que estudar linguagens de programao?
formal para especificar processamentos Ferramenta para escrever programas Meio de comunicao entre programadores Meio de controlar dispositivos computacionais
A profundidade com que uma pessoa pode pensar influenciada pelo poder de expresso da linguagem utilizada para expressar estes pensamentos
Ou seja, difcil criar estruturas que no podemos descrever de forma escrita ou falada (pensamos utilizando uma linguagem)
Quanto mais recursos das LPs o programador conhece, mais ser capaz de expressar seus algoritmos Mesmo que a LP no tenha um determinado recurso, muitas vezes possvel simular este recurso
Ex.: strings e arrays associativos em C Se a LP oferece o recurso, podemos expressar de forma mais clara e com menor chance de erro
Temos a tendncia de utilizar apenas a LP que estamos acostumados, mesmo no sendo a melhor opo para o novo projeto
A computao ainda uma cincia nova, onde LPs e metodologias rapidamente tornam-se obsoletas Ou seja, o profissional de computao est continuamente tendo de aprender novas tecnologias, inclusive LPs Quando os fundamentos de LPs so bem entendidos, aprender uma nova LP mais fcil Ex.: Java mais fcil para quem conhece a metodologia OO
Ajudar a encontrar erros e problemas de performance Ex.: Por que recurso lenta?
Tcnicas para soluo de problemas e algoritmos Tcnicas para desenvolver aplicaes grandes (engenharia de software) Como a mquina e o SO funcionam Descobrir e entender detalhes sintticos relevantes de uma LP As caractersticas fundamentais dos paradigmas de programao, e escolha do paradigma apropriado para o problema
Quanto mais slido os conceitos gerais de LPs, mais rpido ser o aprendizado da nova LP
Nesta disciplina...
Buscamos
Qual
Conhecimento
Anlise
Principais
paradigmas
Domnios de aplicao
Estruturas simples, mas muitos clculos de ponto flutuante (Fortran) Principal preocupao: performance Nenhuma superou de forma significante o Fortran (1 LP de alto nvel) Relatrios (manipulao de texto), e representao de moeda (sem erro de preciso) COBOL, ~1960 Mais recentemente, surgiram as planilhas e sistemas de bancos de dados Manipulao de smbolos ao invs de nmeros, e listas encadeadas ao invs de arrays LISP, 1959, 1 LP funcional Prolog, ~1970, paradigma lgico
Comerciais ~1950
Inteligncia artificial
Domnios de aplicao
Necessrio eficincia, devido ao uso contnuo (C/C++) 1960 ~ 1970, cada fabricante tinha sua LP
IBM -> PL/S, Digital -> BLISS, Burroughts -> Extended ALGOL
Mais tarde a LP C foi utilizada para implementar o sistema UNIX, base do sistema Linux
Comandos que podem ser inseridos em outros arquivos (Perl, PHP, Javascript) Linguagens de marcao (ex.HTML) e LPs de uso geral, como Java Cdigo inserido em linguagem de marcao atravs de linguagens de script, que podem ser executados no cliente ou no servidor
Linguagens de script
Web
Os primeiros computadores eletrnicos (anos 40) eram mquinas enormes, ocupando vrias salas, consumindo energia equivalente a uma fbrica, e custando milhes de dlares...
Desempenho
de uma calculadora de bolso atual Era difcil imaginar que estas mquinas se tornariam populares...
O tempo de execuo era mais valioso que o tempo do programador Programao em linguagem de mquina
Sequncia
de bits que mandam o processador somar, comparar e mover dados na memria (apenas operaes elementares) Programar neste nvel de detalhes tedioso...
Ex.: cdigo de mquina (processador MIPS R4000) do algoritmo de Euclides (mximo divisor comum):
Com o aumento do tamanho dos programas, surgiu a necessidade de uma notao melhor Assembler permitia usar mneumnicos no lugar de cdigos hexadecimal
Correspondncia
Com o aumento no nmero de fornecedores, era frustrante ter que reescrever o sistema para cada novo processador Dificuldade em conhecer os detalhes dos programas cada vez maiores (baixa abstrao) Pessoas queriam LP independente da mquina e com notao prxima matemtica (programas mais comuns na poca)
de Von Neumann
e programas so armazenados na memria A memria separada da CPU Instrues e dados so transmitidos da memria para a CPU
A principal razo das LPs imperativas serem amplamente utilizadas o fato das mquinas possurem arquitetura de von Neumann
Base
das LP imperativas
Variveis
modelam clulas de memria Atribuies modelam movimentos de dados Repetio uma operao eficiente:
No
Evita
Problema:
Ex.:
No
Metodologias de programao
Anos 50 e incio dos anos 60: aplicaes simples, preocupao com eficincia de execuo Final dos anos 60: eficincia das pessoas torna-se importante, legibilidade, boas estruturas de controle
Mquinas mais baratas, mo-de-obra mais cara, sistemas maiores (ex.: controle de refinaria, reserva de passagens) Programao estruturada (em blocos) Projeto top-down e refinamentos sucessivos Desejo de melhor verificao de tipos e estruturas de controle (no usar GOTOs)
Metodologias de programao
Final
Encapsulamento,
mtodos Smalltalk (1989): 1a LP puramente OO Facilmente suportada por LPs imperativas: C++, Java Tambm em Lisp (CLOS, 1988) e Prolog++ (1994)
Metodologias de programao
Programao
Arquiteturas
concorrente
usada apenas para propsitos especficos (ex.: drivers) Por que existem tantas LPs?
Evoluo,
Evoluo
Computao
jovem, constantemente buscando formas melhores de fazer as coisas... Anos 60 e 70: programao estruturada
goto
(Fortran, Cobol, Basic) deu lugar a estruturas em bloco como while e case (Algol, Pascal, Ada)
Anos
Smalltalk,
Propsito especfico
Lisp
boa para manipular smbolos e estruturas complexas Snobol boa para manipular strings C boa para software bsico (como SOs) Prolog boa para raciocinar sobre relacionamentos lgicos nos dados muito mais fcil programar em uma LP dentro de seu domnio de aplicao
Preferncia pessoal
Alguns
gostam da programao concisa do C, outros odeiam Alguns acham natural pensar recursivamente, outros preferem iterao Alguns gostam de trabalhar com ponteiros, outros preferem dereferenciao implicta (como Java) improvvel uma LP universalmente aceita...
de expresso, facilidade de aprendizado, facilidade de implementao, cdigo aberto, compiladores excelentes, economia, patrocnio e inrcia
Poder de expresso
Teoricamente
as LPs tm a mesma capacidade computacional (mquina de Turing) Porm, alguns recursos de LP tm grande impacto na capacidade de escrever cdigo claro, conciso e de fcil manuteno, principalmente em sistemas grandes
Abstrao
de dados e algoritmos
Facilidade de aprendizado
Basic
era a mais fcil de aprender em sua poca Logo popular em escolas primrias: crianas de 5 anos conseguem aprend-la Pascal foi utilizada por anos para ensinar programao, por ser mais compacta e fcil que as LPs srias Hoje Java mais comum no ensino, embora mais complexa que Pascal, muito mais simples que C++
Facilidade de implementao
Basic
podia ser utilizada em mquinas pequenas, com poucos recursos Pascal tinha uma implementao portvel, gratuita para todas as universidades Java foi disponibilizados gratuitamente para vrias plataformas
Cdigo aberto
A
maioria das LPs possuem compilador ou interpretador de cdigo aberto, embora C esteja mais associada a este tipo de projeto C foi desenvolvida nos anos 70 em conjunto com o Unix, o SO mais usado nas universidades O Linux foi desenvolvido em C 60% do projetos no Sourceforge.net so em C
Compiladores excelentes
Parte
do sucesso do Fortran foi a disponibilidade de timos compiladores, financiado por empresas Verses anteriores ao Fortran 90 no tinham recurso nem ponteiros: estes recursos dificultam gerao de cdigo rpido Por outro lado, algumas LPs possuem compiladores e ferramentas que auxiliam no gerenciamento de projetos grandes (ex.: Common Lisp)
e PL/I foram financiados pela IBM Ada foi financiado pelo Dep. de defesa dos EUA
Devido
C#
no teria recebido toda a ateno sem o patrocnio da Microsoft Algumas LPs continuam sendo usadas mesmo com alternativas melhores: alto custo para substituir os sistemas legados
mais alto: foco no problema Ex.: funcional (Lisp, ML, Haskell), lgica (Prolog)
Imperativas:
Predomina
por razo de performance Ex.: von Neumann (Fortran,C), script (PHP, Python, Ruby, Perl), OO (C++, Java)
A principal dificuldade no projeto de LPs declarativas conseguir se livrar de detalhes de implementao irrelevantes, sem perder muito controle da estrutura do algoritmo
Mesmo
com hardware cada vez melhor, o projeto de algoritmos eficientes continua fundamental em sistemas que processam grande quantidade de dados
Ainda no se sabe se compiladores sero capazes de descobrir bons algoritmos para problemas definidos em um nvel muito alto
Ex.:
dada a definio matemtica de nm. primo, o compilador deveria construir o algoritmo para determinar de forma eficiente se um dado nm. primo ou no
Paradigmas
IMPERATIVAS
C, Pascal, Ada
Orientado a objetos
Encapsula dados com processamento Herana e vinculao dinmica de mtodos Fcil adaptao das LPs imperativas C++, Java, Ada 95
Paradigmas
Funcional (declarativo)
Computao atravs da aplicao de funes sobre parmetros, recursividade, formas funcionais Lisp, Scheme, ML, Haskell
Lgico (declarativo)
Baseado em regras lgicas, ou invs de algoritmos Prolog
Outras categorias
Linguagens paralelas
Suporta criao de threads e execuo paralela Deve tambm suportar coordenao e compartilhamento
Linguagens visuais
Visual Basic, .net Arrastas e soltar para gerar parte do cdigo Facilita gerao de interfaces grficas
Linguagens de marcao
HTML, XML No especifica computao, logo no so LPs Projeto, avaliao e implementao similar a LPs
primitivas, entendidas pelo processador de alto nvel: entrada/sada, gerenciamento de arquivos, gerenciamento de recursos
Sistema operacional
Primitivas
Compiladores
Fornece
o computador virtual: visto pelo programador de LPs de alto nvel Interface entre o programador e o SO/mquina
Compilao pura
Compilador traduz cdigo de alto nvel para linguagem de mquina Depois, o usurio solicita a execuo ao SO
Compilao pura
Agrupa caracteres do cdigo-fonte em tokens: identificadores, operadores, pontuao Constri estruturas hierrquicas chamadas parse trees que representam a estrutura sinttica do programa A tabela de smbolos contmerros de semntica Verifica informaes de tipo (como erros de tipo) e cria e atributos das variveis definidas pelointermedirio (nvel cdigo programador mais alto que assembly)
Processo de Compilao
(parser)
O programa de mquina deve ser linkado ao SO (ex. Bibliotecas de I/O) e carregado na memria. Programa de mquina + cdigo SO = mdulo de carga
Interpretao pura
O SO executa o interpretador, que executa o cdigo de alto nvel como uma mquina virtual capaz de entender estas instrues
Maior
flexibilidade e melhores msgs de erro Capacidade de produzir e executar cdigo (ex.: Lisp, Prolog, Python, Ruby, Perl, Tcl) No precisa recompilar tudo aps uma modificao (fase de desenvolvimento)
Interpretao pura
Geralmente cdigo compilado tem melhor performance que o interpretado (10-100x pior)
Ex.:
se o endereo de uma var. conhecido na compilao, ele pode aparecer explicitamente no cdigo (ao invs de buscar em uma tabela) A traduo de alto nvel para ling. de mquina pode ser feito vrias vezes p/ uma mesma instruo (dentro de loop ou funo)
Compilador
Interpretao pura
Fcil de depurar: em todo erro em tempo de execuo aparece imediatamente a linha onde o problema ocorreu
No
Hbrido
Java
Hbrido
Traduz programa de alto nvel para linguagem intermediria A linguagem intermediria intepretada Mais rpido que puramente interpretado, pois a decodificao realizada apenas uma vez Perl, Java
Algumas
Sistema Hbrido
Pr-processador
Constantes, includes, macros Compilao condicional (vars. de ambiente determinam o que vai ser removido
Bootstrapping
Nos anos 70 a portabilidade era um grande problema: muitas arquiteturas, pouca memria e capacidade de processamento Niklaus Wirth forneceu ferramentas p/ Pascal:
Compilador
Pascal -> P-code, em Pascal Compilador Pascal -> P-code, em P-code Interpretador P-code, em Pascal
Compilao just-in-time
Byte code Java pode ser executado nas arquiteturas que possuem mquina virtual Java Byte code Java pode ser transferido pela Internet e transformado em ling de mquina (na arquitetura local) imediatamente antes da execuo O mesmo ocorre com C#
Ambientes de programao
Eclipse
Open
source
Processo de Compilao
(parser)
a entrada (menos tokens que chars) Categoriza (anlise morfolgica) Remove comentrios
Anlise semntica
A anlise semntica gerencia os identificadores que aparecem no cdigo, garantindo que se refira entidade correta e seja usado de forma consistente Para isso, ele mantm uma tabela de smbolos, para coletar os dados de cada id (ex.: nome, tipo, escopo)
Anlise semntica
Utilizando a tabela de smbolos, possvel garantir regras que no so capturadas pelas rvores sintticas. Por exemplo,
Todo
id declarado antes de ser usado Uso em contexto errado (ex.: somar int com str) Qtde e tipos dos argumentos de funes Labels do case devem ser distintos Toda funo deve ter um return
Anlise semntica
Quando as regras semnticas so realizadas na compilao (disparadas pelo parser), so chamadas de semntica esttica
Caso
no inicializadas no podem ser usadas em expresses Dereferenciar ponteiros apenas com obj vlido Verificar limite de ndices em arrays Overflow em operaes aritmticas
Gerao de cdigo
A fase de gerao de cdigo utiliza a rvore sinttica e a tabela de smbolos para produzir cdigo na linguagem alvo
Otimizao de cdigo
A fase de otimizao de cdigo transforma o programa em uma verso mais eficiente e/ou com menos consumo de memria
Utilizado
Critrios de avaliao
Caracterstica Simplicidade/ortogonalidade Estruturas de controle Tipos de dados simples e estruturados Projeto da sintaxe Suporte para abstrao Expressividade Verificao de tipos Legibilidade Escrita Confiabilidade
Manipulao de excees
Apelidos restritos
Critrios de avaliao
Legibilidade
O
Antes
dos anos 70, a nfase era eficincia de execuo e traduo pela mquina (mais cara) A escrita de cdigo apenas uma pequena parte do processo de engenharia de software Hoje a facilidade de manuteno do cdigo mais importante (mo-de-obra cara)
Uma
Critrios de avaliao
Legibilidade: fatores
Simplicidade
Muitos
Poucos
recursos ruim (muito cdigo, ex: assembly) Muitas formas de fazer a mesma coisa
Ex.: (C, Java) x = x+1; x += 1; x++; ++x;
Sobrecarga
Regularidade
Critrios de avaliao
Legibilidade: fatores
Ortogonalidade
Um
pequeno conjunto de primitivas podem ser combinadas de poucas maneiras para produzir todas as estruturas de dados e controle da LP Toda combinao possvel de primitivas permitida e possui significado Exemplo:
Primitivas de tipos: int, float, double, char Operadores de tipos: array, pointer Operadores de tipos podem ser aplicados neles prprios, e nas primitivas de tipos Se no permitir ponteiros para arrays, limita as estruturas de dados possveis
Critrios de avaliao
Legibilidade: fatores
Ortogonalidade
Torna
a LP mais fcil de ler e aprender Falta de ortogonalidade produz excees Problemas de ortogonalidade em C
Por que estruturas podem ser retornadas por funes, mas arrays no podem? Por que uma funo ou void no podem ser elementos de um array? Por que todos os parmetros so passados por valor, exceto arrays?
Critrios de avaliao
Legibilidade: fatores
Ortogonalidade
Excesso
Boa
Temos apenas funes e parmetros (listas no caso de Lisp) No possui operadores de atribuio (sem efeitos colaterais)
Critrios de avaliao
Legibilidade: fatores
Estruturas
C
Critrios de avaliao
Legibilidade: fatores
Tipos
de dados e estruturas
apropriados para o domnio de
Tipos/estruturas
aplicao
Ex.:
tipo booleano mais claro que usar nmeros Registros facilitam o agrupamento de dados relacionados Fortran
Critrios de avaliao
Legibilidade: fatores
Consideraes de sintaxe
Fortran 77 (6 caracteres), BASIC 78 (letra ou letra+dgito) Escolha das palavras: while, for, class.. Reservar palavras especiais: varivel chamada if, for... ?? Palavras que finalizam estruturas de controle: end for, end if
Palavras especiais
A semntica deve ser natural para a sintaxe No usar palavras especiais com significados diferentes Ex.: static em C tem 2 significados, depende do contexto
Critrios de avaliao
Facilidade de escrita
Quo
facilmente uma LP pode ser usada para escrever programas de um dado domnio
COBOL
Critrios de avaliao
e ortogonalidade
grandes so difceis de entender e usar corretamente Melhor ter poucas primitivas e conjunto consistente de regras (ortogonalidade) Muita ortogonalidade: tudo aceito, difcil capturar erros
Critrios de avaliao
para abstrao
Abstrao:
capacidade de ocultar detalhes Abstrao de processos: subprogramas e mdulos Abstrao de dados: estruturas, registros, objetos
Critrios de avaliao
cdigo menor
Imprime todos os primos de 1 at R (~RR.R)/R1R Ordena palavras na matriz X, por tamanho X[X+.' ';] Remove tags HTML:
Critrios de avaliao
Confiabilidade
Funcionar
Critrios de avaliao
Confiabilidade: fatores
Legibilidade
M
e facilidade de escrita
legibilidade afeta manuteno (inserimos bugs) Escrita: quanto mais cdigo, mais chance de bugs
Verificao
C ANSI
de tipos de excees
78 permitia parmetro float receber int sem converso C++, Fortran, Ada
Manipulao
Java, Ex:
Apelidos
(Perigoso!)
Critrios de avaliao
Custo
Escrita de programas
Java gratuito, Ada era inicialmente cara Um bug pode derrubar um avio, explodir uma refinaria, alterar contas bancrias... Legibilidade
Confiabilidade
Manuteno
Critrios de avaliao
Custo
Os
Tempo
no)
Fcil
Flexibilidade x Confiabilidade
Registros
variantes: permite vrios tipos em um mesmo campo Ponteiros em C Flexvel, mas perigoso durante a execuo
Critrios de avaliao
Pontos de vista:
Projetista:
Deseja
inventor da linguagem
elegncia
Implementador:
Simplicidade
p/ implementar os recursos da LP
Programador
Legibilidade
e facilidade de escrita
Equipes do Trabalho
8.
9. 10. 11. 12.
13.
14. 15. 16. 17.
C Java C++ PHP JavaScript Python C# Perl Ruby Shell (ex.: Bourne Shell - Unix) Visual Basic Lisp/Scheme Pascal Haskell Fortran Lua Prolog
12 equipes com ~4 alunos Apresentaes de 15 min Ilustrar executando cdigo Mesma ordem em todas as apresentaes
Perde ponto se no estiver pronta no horrio marcado (inclusive a 1 equipe) Instalao e execuo de exemplo Histria da linguagem Suporta quais paradigmas? Domnio de aplicao Sistema de implementao O que influenciou o projeto?
08/03 e 14/03