Baixe o app para aproveitar ainda mais
Prévia do material em texto
�PAGE � �PAGE �11� Modelos de Linguagens de Programação - Aula 1 Introdução a Teoria de Linguagens de Programação Uma LP (Linguagem de Programação) é uma linguagem destinada a ser usada por usuários para expressar um processo através do qual um computador pode resolver um problema. Porque estudar Linguagens de Programação? Maior habilidade em resolver problemas: uma maior compreensão de uma LP pode aumentar nossa habilidade em pensar em como resolver problemas. Tanto melhor se dominarmos os vários modelos de LP. Melhor uso de uma LP: compreensão das funções e implementação das estruturas de uma LP nos levam a usar a LP de modo a extrair o máximo de sua funcionalidade e eficiência. Melhor escolha de uma LP: adequação ao problema. Maior facilidade em aprender novas LPs: conceitos chaves comuns às LPs. Melhor designer de LPs: linguagens de interfaces de sistemas, extensão de LP via operadores e tipos de dados. Por que diferentes Linguagens de Programação? Propósitos diferentes Avanços tecnológicos Interesses comerciais Cultura e background científico Breve histórico das linguagens de programação Aplicações Científicas: as primeiras linguagens de programação tinham uma aplicação puramente científica. FORTRAN e ALGOL 60, por exemplo, se destinaram a atender implementações de cálculos científicos com sistemas numéricos. - Fortran (FORmula TRANslating) Desenvolvida em 1956 por John Backus, foi proposta visando a resolução de problemas científicos, para isto utilizando a notação algébrica. Criada inicialmente para o IBM 704. Primeira Linguagem de “alto nível” amplamente utilizada. Um dos motivos pelos quais o FORTRAN é ainda utilizado é a disponibilidade de uma vasta biblioteca de software contendo rotinas freqüentemente utilizadas, tais como rotinas para cálculo de funções trigonométricas, equações algébricas polinomiais, etc., o que permite uma redução dos custos e tempo de desenvolvimento dos programas. Contribuições de FORTRAN para futuras linguagens: variáveis comando de atribuição conceito de tipos modularidade (com o uso de subprogramas) E/S formatadas Exemplo de programa FORTRAN � * Programa que converte um valor decimal, maior ou igual a zero, * lido através do console do sistema, em seu correspondente valor * binário, imprmindo este valor na tela do console. * Autores: J. C. Maldonado * R.L.Dias Cereda * Data: Abril/87 * - Programa Principal - * Declaracao de variaveis, constantes simbolicas e iniciializacoes INTEGER CONT, J, LIMITE,NUMERO, VETRES(8) PARAMETER (LIMITE = 255) DATA VETRES/8*0/ * Leitura e impressão do valor decimal WRITE(*,*) 'DIGITE O VALOR DECIMAL' READ(*,*) NUMERO WRITE(*,10) NUMERO 10 FORMAT(1X,//,1X,'VALOR DECIMAL FORNECIDO: ',I3) * Verificacao do limite IF (NUMERO.GT.LIMITE) $THEN WRITE(*,*) 'NUMERO MUITO GRANDE ELSE * Chamada da rotina para conversao e impressao dos resultados CONT = 0 CALL CONV(NUMERO, VETRES, CONT) WRITE(*,20) (VETRES(J), J=CONT, 1, -1) 20 FORMAT(1X, 'VALOR BINARIO CORRESPONDENTE: ', 8I2) ENDIF STOP END * Sub-rotina que faz a conversao de um numero decimal, maior * ou igual a zero, em um numero binario * Parametro de entrada * NUM: valor a ser convertido * Parametros de saida * VETRES: vetor que contem o resultado * PONT: numero de bits do resultado SUBROUTINE CONV(NUM, VETRES, PONT) * Declaracao dos parametros INTEGER NUM, PONT, VETRES(8) * Declaracao de variavel local INTEGER AUX * conversao 100 IF (NUM.GE.2) THEN * inicio do enquanto PONT = PONT + 1 AUX = NUM/2 VETRES(PONT) = NUM - AUX*2 NUM = AUX GOTO 100 * fim do enquanto ENDIF PONT = PONT + 1 VETRES(PONT) = NUM RETURN END - Algol (ALGOrithmic Language) Linguagem algébrica de origem européia (1960 - Zurique), desenvolvida pelo comitê Internacional popular, destinada à resolução de problemas científicos. Influenciou o projeto de quase todas as linguagens projetadas a partir de 1960. Descrita em BNF (Backus-Naur Form), foi projetada independente da implementação, o que permite uma maior criatividade, porém de implementação mais difícil. É pouco usada em aplicações comerciais devido à ausência de facilidades de E/S na descrição e pelo pouco interesse de vendedores. Além disso, tornou-se padrão para a publicação de algoritmos. Contribuições de Algol para futuras linguagens: estrutura de blocos: habilidade de se criar blocos de comandos para o escopo de variáveis e extensão de influência de comandos de controle comandos de controle estruturados: if-then-else e uso de uma condição geral para controle de iteração recursividade: habilidade de um procedimento chamar a si próprio Exemplo de programa ALGOL 60 � Procedimento que calcula raiz quadrada. procedure EQ2OR (A, B, C, z1r, z1i, z2r, z2i, INDETERMINATE); value A, B, C; real A, B, C, z1r, z1i, z2r, z2i; label INDETERMINATE; begin real discriminant; if A 0 then go to normal; ir B = 0 then go to INDETERMINATE; z1r := z2r := -C/B; go to set zero; normal: discriminant := B 2 - 4 x A x C; if discriminant > 0 then go to real solution; complex: z1r := z2r := -B/2/A; z1i := sqrt(-discriminant)/2/A; z2i := - z1i; go to finis; real solution: z1r := (-B+(if B > 0 then -1 else 1)xsqrt(discriminant))/2/A; z2r := C/A/z1r; set zero: z1i := z2i := 0; finis: end EQ2OR Aplicações Comerciais: após as aplicações científicas, veio COBOL que teve aplicação em sistemas comerciais e bancários. As aplicações comerciais abriram as portas para o emprego da computação para vários outros fins. - COBOL A linguagem COBOL, desenvolvida em 1959 pelo Departamento de Defesa dos EUA e fabricantes de computadores (Comissão CODASYL), Foi padrão para as aplicações comerciais e ainda utilizada hoje. Seu desenvolvimento se deu de forma independente da máquina. O código é "English-like" e é excelente para a manipulação de arquivos. Contribuições de Cobol para futuras linguagens: código mais legível estrutura de dados heterogênea (record) Exemplo de programa COBOL � Organização de um programa COBOL: Um programa COBOL possui quatro divisões que devem ser colocadas na ordem adequada. A sua estrutura completa é: IDENTIFICATION DIVISION PROGRAM-ID. nome-do-programa [AUTHOR. [comentários] ...] [INSTALLATION. [comentários] ...] [INSTALLATION. [comentários] ...] [DATE-WRITTEN. [comentários] ...] [DATE-COMPILED. [comentários] ...] [SECURITY. [comentários] ...] [REMARKS. [comentários] ...] ENVIRONMENT DIVISION [CONFIGURATION SECTION. SOURCE-COMPUTER. OBJECT-COMPUTER. [SPECIAL-NAMES. ]]. [INPUT-OUTPUT SECTION. FILE-CONTROL. [I-O-CONTROL. ENTRADA.]]. DATA DIVISION. [FILE SECTION. { Descrição dos arquivos { Descrição dos registros } ... } ... ]. [WORKING-STORAGE SECTION. [Descrição dos itens de dados] ... [Descrição de registros] ... ]. [LINKAGE SECTION. [Descrição dos itens de dados] ... [Descrição de registros] ... ]. [COMMUNICATION SECTION. {Descrição das Entradas de Comunicação. [Descrição das Entradas de Registros] ... } ... ]. [REPORT SECTION. {Descrição de relatórios} {Descrição dos grupos de relatórios} ... } ... ]. PROCEDURE DIVISION. [USING identificador-1 [identificador-2] ...] [DECLARATIVES. {nome-da-seção SECTION. USE SENTENCE. {nome-de-parágrafo. {sentença} ... } ... } ... END DECLARATIVES.] {nome-da-seçãoSECTION [prioridade] - ] {nome-de-parágrafo. {sentença} ... } ... } ... Exemplo: 001 010 IDENTIFICATION DIVISION. 001 020 PROGRAM-ID. TABSORT. 001 030 AUTHOR. ALEX BASTOS. 001 040 INSTALLATION. RDC-DIV USUARIOS. 001 050 DATE-WRITEN. 18/12/72. 001 060 DATE-COMPILED. 20/12/72. 001 070 REMARKS. Este programa grava arquivo sequencial em ordem crescente e classifica-o apos em ordem decrescente. 001 100 ENVIRONMENT DIVISION. 001 110 CONFIGURATION SECTION. 001 120 SOURCE-COMPUTER. IBM-370-165. 001 130 OBJECT-COMPUTER. IBM-370-165. 001 140 INPUT-OUTPUT SECTION 001 150 FILE-CONTROL. 001 160 SELECT ARQUIVO ASSIGN TO DA-S-DISCO. 001 170 SELECT TRABALHO ASSIGN TO DA-S-SORTWK01. 001 180 DATA DIVISION. 001 190 FILE SECTION. 001 200 FD ARQUIVO LABEL RECORDS ARE STANDARD 002 010 DATA RECORD IS ENTRADA. 002 020 01 ENTRADA. 002 030 02 X PIC 99. 002 040 02 Y PIC X(10). 002 050 02 FILLER PIC X(20). 002 060 SD TRABALHO LABEL RECORDS ARE STANDARD 002 070 DATA RECORD IS TRAB. 002 080 01 TRAB. 002 090 02 Z PIC 99. 002 100 02 K PIC X(10). 002 110 02 FILLER PIC X(20). 002 120 WORKING-STORAGE SECTION. 002 130 77 I PIC 99 VALUE ZEROS. 002 140 PROCEDURE DIVISION. 002 150 OPEN OUTPUT ARQUIVO. 002 160 MOVE 'TESTE-SORT' TO Y. 002 170 GRAVACAO. 002 180 MOVE I TO X. 002 190 ADD 1 TO I. 002 200 WRITE ENTRADA. 003 010 IF I 100 GO TO GRAVACAO. 003 020 SORT TRABALHO DESCENDING Z USING 003 030 ARQUIVO GIVING ARQUIVO. 003 040 OPEN INPUT ARQUIVO. 003 050 GRAVA. 003 060 READ ARQUIVO AT END GO TO FIN. 003 070 DISPLAY X' Y. 003 080 GO TO GRAVA. 003 090 FIN. 003 100 CLOSE ARQ. 003 110 STOP RUN. Inteligência Artificial (IA): é uma área abrangente das aplicações de computação caracterizada pelo uso de computações simbólicas em vez de numéricas. A primeira linguagem desenvolvida para aplicações de IA foi LISP. Programação de Sistemas: linguagens que oferecem recursos de baixo nível que permitem o software fazer interface com os dispositivos externos. Nesta classe de linguagens está a C, BLISS, PL/S, Extended ALGOL. - BASIC Final da década de 70 Beginner´s All-purpose Simbolic Instruction Code Criada para iniciantes em programação - Pascal Década de 60 Criada por Niklaus Wirth Propósito : ensinar programação Linguagem segura e robusta - Outras: Assembly, PL/I, APL, Modula-2 e 3, ADA Linguagens de Scripting: as linguagens de scripting desenvolveram-se lentamente no decorrer dos últimos 25 anos e são usadas colocando-se uma lista de comandos, chamados de script, em um arquivo para serem executados. A Java Script é uma delas desenvolvida pela Netscape para uso tanto de servidores Web como em navegadores. Java Script e Perl são linguagens diferentes das convencionais mas possuem recursos interessantes. Linguagens de Propósitos Especiais: uma grande quantidade de linguagens para propósitos especiais surgiu no decorrer dos últimos 40 anos. Citamos a RPG, usada para produzir relatórios comerciais, a APT, usada para construir ferramentas de máquinas programáveis e a GPSS, usada para simulação de sistemas. Um exemplo comparativo entre Linguagens - Pascal VAR NMEDIA : REAL; NSOMA : INTEGER; NA,NB : INTEGER; BEGIN CLRSCR; WRITELN (‘Calcula a Média Aritmética’); WRITE (‘Informe o 1º : ‘); READLN (NA); WRITE (‘Informe o 2º : ’); READLN (NB); NSOMA := NA + NB; NMEDIA := NSOMA / 2; WRITELN (‘A Média entre ’,NA, ‘ e ’, NB, ‘ é ’, NMEDIA); END. - COBOL WORKING-STORAGE SECTION. 01 NMEDIA PIC 999V99. 01 NSOMA PIC 999. 01 NA PIC 99. 01 NB PIC 99. PROCEDURE DIVISION. INICIO. DISPLAY "Calcula a Média Aritmética " DISPLAY "Informe O 1º : " ACCEPT NA DISPLAY "Informe O 2º : " ACCEPT NB COMPUTE NSOMA = NA + NB COMPUTE NMEDIA = NSOMA / 2 DISPLAY "A Média entre ",NA," e ",NB," é ",NMEDIA STOP RUN. FIM. - Clipper INICIO LOCAL NMEDIA := NSOMA := NA := NB := 0 CLS @ 10,10 SAY "Calcula a Média Aritmética” @ 11,10 SAY "Informe o 1º : " GET NA PIC "99" @ 12,10 SAY "Informe o 2º : " GET NB PIC "99" READ NSOMA := NA + NB NMEDIA := NSOMA / 2 @ 13,10 SAY "A Média entre ",NA," e ",NB," é ",NMEDIA QUIT FIM Critérios da Avaliação das Linguagens Com avaliar uma linguagem de programação? Usamos alguns critérios: I- Legibilidade de programas: os programas escritos em uma linguagem de programação devem ser fáceis de serem lidos e entendidos. Como a linguagem influencia nisso? - Simplicidade: linguagens complexas permitem construções difíceis de entender. Linguagens muito simples podem requerer programas longos ou construções substitutas pouco claras. - Ortogonalidade: os conceitos da linguagem se aplicam a todos os itens da linguagem. Por exemplo: há vetores e eles podem conter dados de qualquer tipo. O excesso de ortogonalidade também pode provocar confusão (pode haver vetores de função?). O importante é haver poucas exceções para se aprender. - Boa definição: envolve clareza na gramática e semântica. As construções da linguagem devem ser baseadas em regras claras. - Facilidade de escrita: os programas devem ser fáceis de escrever. - Suporte a abstração: deve oferecer criação de tipos abstratos de dados, sub-programas, etc. II- Confiabilidade: os programas gerados devem ter poucos erros. Os fatores que influenciam na capacidade de escrita e legibilidade também influenciam neste critério. Considera-se também: - Verificação de Tipos: com tipos fortes, erros comuns são detectados mais facilmente. - Tratamento de Exceções: é a capacidade de um programa de detectar erros em tempo de execução. Facilita a codificação de programas em que certas exceções são esperadas e facilita a detecção de erros inesperados durante a execução. III- Custos: os custos incluem gastos com a compra de compiladores e ferramentas, treinamento e manutenção, tempo de desenvolvimento, compilação e execução. A viabilidade de custos é também um critério decisivo a ser considerado. As linguagens de programação e o processo de desenvolvimento de software Alterações significativas se processaram na história da computação, e, com o barateamento dos custos dos equipamentos de computação, hoje grande parte da importância inicialmente atribuída ao hardware passou para o software. Máquinas mais complexas e poderosas exigem programação mais sofisticada, para que o seu potencial possa se realizar, e a produção de software é hoje fundamental para virtualmente qualquer espécie de atividade humana. O "ciclo de vida" a seguir é um dos diversos modelos que nos auxiliam a compreender essa complexa atividade e descreve, de modo bem simplificado, as fases da história de um programa: · especificação de requisitos: Nesta fase se procura definir com clareza qual é o problema considerado, e que características deve ter uma solução computacional (um sistema de hardware e software adequados), para que essa solução seja satisfatória para a aplicação e o usuário. · projeto global: Nesta fase se procura definir, em linhas gerais, como deve ser o software a ser construído, para estabelecer a viabilidade de sua construção e de sua utilização nas condições reais. É nesta fase que deve ser escolhida a linguagem (ou possivelmente as linguagens) de programação a utilizar. · codificação: Nesta fase o softwareé efetivamente escrito em uma ou mais linguagens escolhidas para isso. · validação: Nesta fase o sistema é testado, ou de alguma outra forma examinado, para que se tenha uma garantia de seu funcionamento satisfatório. · utilização e evolução: Nesta fase o sistema finalmente preenche seus objetivos. Se existem, são então descobertos erros e problemas que, de alguma forma, tornam o sistema inadequado para o uso pretendido. São também examinadas possibilidades de alteração e extensão do sistema que visam torná-lo mais adequado para a aplicação, cujas necessidades já podem ser diferentes daquelas consideradas na fase de especificação de requisitos. As alterações a serem feitas constituem o que se chama de manutenção ou evolução do software. Naturalmente, cada uma das fases mencionadas pode ser várias vezes repetida, até que o produto final seja considerado satisfatório. Quanto mais cedo um erro é descoberto, mais simples e barata é sua correção, e por essa razão, é importante que os erros sejam descobertos o mais cedo possível, nas fases iniciais do ciclo de vida. Note-se que a escolha da linguagem de programação influi, decisivamente, apenas em duas das fases do ciclo apresentado: a fase de codificação, onde o programa é escrito na linguagem, e a fase de evolução/manutenção, em que o programa é alterado, através da introdução ou substituição de trechos de código escritos na linguagem. Nestas fases, portanto, é que defeitos e qualidades de uma linguagem de programação se tornam aparentes. São características muito importantes a serem consideradas em linguagens de programação: 1) Legibilidade: a linguagem não deve induzir o programador a erros, em particular erros que não possam ser descobertos com facilidade. Naturalmente, erros descobertos durante a compilação criam problemas menores que erros descobertos posteriormente (às vezes chamados de "erros de lógica"). a linguagem deve ajudar o programador a corrigir os erros, facilitando sua identificação e a determinação da ação de correção, seja qual for a causa original do erro. Por essas razões, podemos considerar que a principal virtude de uma linguagem é a sua legibilidade, isto é, a facilidade que a linguagem oferece para que um programador leia e compreenda um programa, com o grau de confiança necessário para alterá-lo. Um programa em processo de alteração pode ter sido escrito há algum tempo, ou por outra pessoa que não se encontra disponível para consulta, e por isso boa documentação e boa utilização de comentários são importantes, por mais legível que seja o texto de um programa. Por outro lado, também é desejável que a linguagem ofereça facilidade de escrita de programas. Na prática, a forma mais comum de garantir a legibilidade é através de marcas acrescentadas ao texto do programa para caracterizar de maneira mais direta sua estrutura e, portanto, sua forma de execução. Essas marcas (palavras reservadas, sinais de pontuação etc.) facilitam a localização dos pontos importantes do programa mas. 2) eficiência do programa compilado: a estrutura da linguagem facilita o processo de geração e otimização de código, permitindo a construção de compiladores que gerem código objeto que faça uso eficiente dos recursos de máquina disponíveis. 3) eficiência do processo de compilação: a estrutura da linguagem facilita o processo de compilação, permitindo a construção de compiladores e ambientes de programação em que seja mais eficiente o processo de desenvolvimento de software na linguagem. 4) disponibilidade de ferramentas: existem compiladores, interpretadores, ambientes de programação e de desenvolvimento amigáveis, adequados para a linguagem nas máquinas em que a implementação deve ser realizada. Além disso, essas ferramentas devem poder ser adaptadas a casos particulares, permitindo a máxima eficiência em cada caso. Por exemplo, os compiladores devem ter opções de compilação que permitam gerar o melhor tipo de código objeto para cada aplicação. 5) disponibilidade de bibliotecas: existem bibliotecas de software de uso geral e de uso específico para a aplicação, que permitem a utilização de software já escrito, dispensando a necessidade de sua construção. Essas bibliotecas podem ser de texto fonte na linguagem, ou de código pré-compilado, escrito em qualquer linguagem, mas que possa ser ligado ao código escrito na linguagem. 6) portabilidade: é fundamental no desenvolvimento de projetos. Um projeto desenvolvido com uma LP deve ser possível de execução em variadas plataformas, sem a necessidade de reescrever ou adaptá-lo. 7) Reusabilidade: o reaproveitamento do código-fonte economiza tempo e custos.
Compartilhar