UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO

Tamanho: px
Começar a partir da página:

Download "UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO"

Transcrição

1 UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO GERADOR DE CÓDIGO OBJETO PARA O HAPPY PORTUGOL Área de Compiladores por Marcos Roberto Fischer André Luís Alice Raabe, Dr. Orientador Itajaí (SC), junho de 2006

2 UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO GERADOR DE CÓDIGO OBJETO PARA O HAPPY PORTUGOL Área de Compiladores por Marcos Roberto Fischer Relatório apresentado à Banca Examinadora do Trabalho de Conclusão do Curso de Ciência da Computação para análise e aprovação. Orientador: André Luís Alice Raabe, Dr. Itajaí (SC), junho de 2006

3 SUMÁRIO LISTA DE ABREVIATURAS...iv LISTA DE FIGURAS...v LISTA DE TABELAS...vi RESUMO...vii ABSTRACT...viii 1 INTRODUÇÃO PROBLEMATIZAÇÃO Formulação do Problema Solução Proposta OBJETIVOS Objetivo Geral Objetivos Específicos METODOLOGIA ESTRUTURA DO TRABALHO FUNDAMENTAÇÃO TEÓRICA HAPPY PORTUGOL Modelo de Casos de Uso Demais Funcionalidades Tecnologias utilizadas CONSTRUÇÃO DE COMPILADORES Análise léxica Análise sintática Análise semântica GERAÇÃO DE CÓDIGO Código de triplo endereço Otimização Código Objeto ou Código Final WIN32ASM Definições gerais Alocação de memória Registradores Principais comandos ou mnemônicos Visão geral de um programa Win32asm Uso de operandos Tipos de operandos possíveis Chamada a procedimentos MONTADORES ii

4 2.5.1 Comandos de alto nível Exemplos de programas PROJETO Ações semânticas para geração de código para declaração de variáveis Ações semânticas para geração de código para atribuições e expressões Ações semânticas para geração de código para desvios condicionais simples Ações semânticas para geração de código para desvios condicionais compostos Ações semânticas para geração de código para laço de repetição Outros comandos disponíveis no Happy Portugol DESENVOLVIMENTO CORREÇÃO DE BUGS DO HAPPY PORTUGOL IMPLEMENTAÇÃO DO GERADOR DE CÓDIGO Ações semânticas para geração de código para declaração de variáveis Ações semânticas para geração de código para atribuições e expressões Ações semânticas para geração de código para leitura de dados do console Ações semânticas para geração de código para escrita de dados no console Ações semânticas para geração de código para desvios condicionais simples Ações semânticas para geração de código para laço de repetição para INTEGRAÇÃO DO WIN32ASM AO HAPPY PORTUGOL TESTES LIMITAÇÕES E RESTRIÇÕES Conclusões TRABALHOS FUTUROS REFERÊNCIAS BIBLIOGRÁFICAS...70 iii

5 LISTA DE ABREVIATURAS API ASA ASCII C3E EXE GLC TCC UNIVALI YACC Application Programming Interface Árvore Sintática Abstrata American Standard Code for Information Interchange Código de Triplo Endereço Executável Gramática Livre de Contexto Trabalho de Conclusão de Curso Universidade do Vale do Itajaí Yet Another Compiler-Compiler iv

6 LISTA DE FIGURAS Figura 1. Passos para transformação de um código fonte em executável...10 Figura 2. Interface que o Happy Portugol disponibiliza para a criação dos programas...15 Figura 3. Modelo de casos de uso da ferramenta Happy Portugol...16 Figura 4. Estrutura de um programa portugol...19 Figura 5. Esquema de geração de código alvo...21 Figura 6. Árvore sintática da expressão aritmética A[index] = Figura 7. Árvore sintática abstrata da expressão aritmética 2*a + (b-3)...24 Figura 8. Representação da expressão em uma linguagem de alto nível 2 * a +(b-3) em C3E...25 Figura 9. Seqüência de instruções para chamada de rotinas...26 Figura 10. Declaração de estrutura na linguagem C...30 Figura 11. Ilustração da alocação da variável x em memória...31 Figura 12. Organização típica de código para um comando if-else...32 Figura 13. Organização típica de código para um comando while...33 Figura 14. Esqueleto de um programa Win32asm...39 Figura 15. Estrutura da seção.code...41 Figura 16. Exemplo da seção.code...41 Figura 17. Exemplo do uso dos operandos...42 Figura 18. Exemplos de uso dos tipos de operandos possíveis nas operações...43 Figura 19. Chamada de procedimento usado call...43 Figura 20. Chamada de procedimento usado invoke...43 Figura 21. Forma de criação de procedimentos internos...44 Figura 22. Exemplo de use de.if,.else e.elseif...45 Figura 23. Exemplo de use de.repeat...46 Figura 24. Exemplo de use de.while...46 Figura 25. Programa Portugol que exibe o maior de cinco números digitados pelo usuário...47 Figura 26. Programa Win32asm que exibe o maior de cinco números digitados pelo usuário...48 Figura 27. Gramática resumida do Happy Portugol...50 Figura 28. Estrutura da tabela de símbolos...55 Figura 29. Procedimento para a geração de código para declaração de variáveis Figura 30. Nova interface que o Happy Portugol disponibiliza para a criação dos programas...62 Figura 31. Implementações realizadas sobre a ferramenta Happy Portugol...63 v

7 LISTA DE TABELAS Tabela 1. Representação em C3E da instrução em alto nível z = (1 + c) * (a / -c) por triplos...27 Tabela 2. Representação em C3E da instrução em alto nível z = (1 + c) * (a / -c) por quádruplos...27 Tabela 3. Principais mnemônicos utilizados na programação Win32asm (Parte I)...37 Tabela 4. Principais mnemônicos utilizados na programação Win32asm (Parte II)...38 Tabela 5. Tipos de dados que podem ser utilizados na identificação das variáveis...41 Tabela 6. Comparação entre os montadores...44 Tabela 7. Operadores que podem ser usados nas condições das instruções...46 Tabela 8. Alguns procedimentos ou macros existentes nas bibliotecas...47 Tabela 9. Ações semânticas para geração de código para declaração de variáveis...50 Tabela 10. Ações semânticas para geração de código para atribuições e expressões...50 Tabela 11. Ações semânticas para geração de código para desvio condicional simples...51 Tabela 12. Ações semânticas para geração de código para desvio condicional composto...51 Tabela 13. Ações semânticas para geração de código para laço de repetição...52 Tabela 14. Tradução dos principais comandos portugol para Win32asm...53 Tabela 15. Ações semânticas para geração de código para declaração de variáveis...55 Tabela 16. Ações semânticas para geração de código para atribuições e expressões...57 Tabela 17. Ações semânticas para geração de código para leitura de dados do console...58 Tabela 18. Ações semânticas para geração de código para escrita de dados no console...58 Tabela 19. Ações semânticas para geração de código para desvio condicional simples...59 Tabela 20. Ações semânticas para geração de código para laço de repetição para...60 Tabela 21. Exemplo de programa que escreve helloworld na tela Tabela 22. Exemplo de programa calcula a média e diz se o aluno foi aprovado ou não...65 Tabela 23. Exemplo de programa que informa o maior de cinco valores digitados pelo aluno...66 vi

8 RESUMO FISCHER, Marcos Roberto. Gerador de Código Objeto para o Happy Portugol. Itajaí, f. Trabalho de Conclusão de Curso (Graduação em Ciência da Computação) Centro de Ciências Tecnológicas da Terra e do Mar, Universidade do Vale do Itajaí, Itajaí, O desenvolvimento da lógica algorítmica e a aquisição de familiaridade com ambientes de programação são exigidos dos acadêmicos dos cursos de Ciência da Computação já nos primeiros semestres de estudo, pois são habilidades fundamentais ao longo do curso. Para auxiliar neste processo, normalmente utiliza-se alguma ferramenta de auxílio a aprendizagem de programação. No caso da disciplina de Algoritmos e Programação do Curso de Ciência da Computação da Univali, os alunos utilizam atualmente a ferramenta Happy Portugol que disponibiliza uma linguagem com comandos em português para criação de algoritmos. Porém, esta ferramenta internamente gera um código C e é dependente do compilador Turbo C 1.01 para gerar código objeto e para criar um programa executável. Desta forma, este projeto visa eliminar esta dependência desenvolvendo um gerador de código objeto para o Happy Portugol compatível com a plataforma Windows 32 bits. Para isso o código será gerado em uma linguagem de montagem denominada Win32asm, tornandoo independente de outro compilador e possibilitando a posterior criação de um programa executável. Neste sentido este trabalho está focalizado no estudo e implementação das técnicas para geração de código objeto. Palavras-chave: Compiladores. Gerador de Código Objeto. Win32asm. vii

9 ABSTRACT The development of the algorithmic logic and the acquisition of familiarity with programming environments are demanded of the academics of the Computer Science`s Courses already in the first semesters of study, therefore they are basic abilities to the long of the course. To assist in this process, normally some tool is used to aid in the programming learning. In the case of the discipline of Algorithms and Programming of the Computer Science`s Course of the Univali, the pupils currently use the tool Happy Portugol that supplies a language with commands in Portuguese for creation of algorithms. However, this tool internally generates C code and is dependent of the Turbo C 1.01 compiler to generate object code and to create an executable file. This project aims to eliminate this dependence developing a object code generator for the Happy Portugol compatible with the Windows 32 bits platform. This code will be generated in a Assembler language called Win32asm becoming it independent of another compiler and making possible the latter creation of one executable file. In this direction this work is focused in the study and implementation of the techniques for code object generation. Keywords: Compilers. Code Object Generator. Win32asm. viii

10 1 INTRODUÇÃO Geralmente nos cursos de Ciência da Computação, os alunos iniciam a aprendizagem de lógica de programação utilizando para isso alguma ferramenta. Esta ferramenta pode ser um compilador comercial ou versões simplificadas voltadas ao público iniciante. O objetivo é permitir aos alunos criarem programas simples a fim de desenvolver a lógica algorítmica e se habituarem a um ambiente de programação. Um algoritmo é a lógica de um programa de computador. A representação desta lógica em uma linguagem de programação (composta por instruções e comandos pré-definidos) cria um programa. Segundo Price e Toscani (2001), cronologicamente, as linguagens podem ser classificadas em cincos gerações: (1ª) linguagens de máquina, (2ª) linguagens simbólicas (Assembly), (3ª) linguagens orientadas ao usuário, (4ª) linguagens orientadas a aplicação e (5ª) linguagens de conhecimento. As linguagens de 1ª e 2ª gerações são consideradas de baixo nível; as demais linguagens são classificadas como de alto nível. As linguagens de programação mais utilizadas são as de alto nível por serem consideradas mais próximas das linguagens naturais. Segundo Aho, Sethi e Ullman (1995), para que um algoritmo codificado em uma linguagem de programação possa ser transformado em um programa executável, é necessário um compilador. Compiladores são programas que recebem um código fonte escrito em uma determinada linguagem de programação, analisam esse código fonte e geram um código objeto, para que seja interpretado e executado pelos computadores. Para este código objeto ser executado ele ainda passará por um montador e um linker. Um montador basicamente traduz o código fonte Assembly para linguagem de máquina na qual o programa será executado. A principal característica deste tipo de tradutor é que para cada instrução Assembly será gerada uma única instrução de máquina. O linker ou ligador é responsável por coletar programas traduzidos separadamente como bibliotecas e ligá-los em um único módulo, normalmente denominado módulo absoluto de carga ou simplesmente programa executável (o EXE). A Figura 1 ilustra a seqüência de passos para um código fonte se tornar executável.

11 Figura 1. Passos para transformação de um código fonte em executável 1.1 PROBLEMATIZAÇÃO Formulação do Problema Na disciplina de Algoritmos e Programação do Curso de Ciência da Computação da Univali, os alunos utilizam atualmente a ferramenta Happy Portugol para aprender noções básicas de construção de programas. O Happy Portugol oferece a possibilidade de utilizar uma linguagem com comandos em português para criação de algoritmos (chamado de portugol), porém esta ferramenta utiliza um gerador de código externo, criando uma dependência do compilador Turbo C Solução Proposta Este trabalho propõe construir um gerador de código objeto para o Happy Portugol tornando-o independente de um outro compilador. Pretende-se que o código objeto gerado seja compatível com as novas versões do sistema operacional Microsoft Windows 32 Bits (posteriores ao Windows 95), sendo necessário para isso 10

12 utilizar o conjunto de instruções denominado Win32asm. A geração do executável será feita através de uma ferramenta externa (montador). O objeto de interesse deste trabalho é gerar o código Win32asm para que este seja convertido em um executável por esta ferramenta. A realização deste trabalho também se justifica em nível de Trabalho de Conclusão de Curso para o Curso de Ciência da Computação, pois trata do desenvolvimento de um projeto computacional que faz uso de várias tecnologias, conceitos e teorias relevantes a essa área, e por ser um trabalho precursor em geração de código Win32asm. Além disso, com o aprendizado e domínio desta linguagem está se contribuindo para a inclusão deste tópico como conteúdo de ensino para a disciplina de Compiladores, e possibilitando aos alunos de Algoritmos uma alternativa mais rica em recursos para apoiar a aprendizagem da lógica de programação. Cabe salientar que não é objeto deste trabalho realizar a análise de trabalhos similares que apóiam a aprendizagem de algoritmos e programação, pois o foco está na aplicação de uma tecnologia (Win32asm) que ainda não possui referências em projetos de natureza acadêmica. 1.2 OBJETIVOS Objetivo Geral O objetivo geral deste trabalho é construir um gerador de código objeto Win32asm para o Happy Portugol Objetivos Específicos Os objetivos específicos deste trabalho são: Compreender o funcionamento de um gerador de código; Delimitar o subconjunto da linguagem portugol que será implementado; Conhecer e utilizar o conjunto de instruções Win32asm para implementar o gerador de código utilizando o compilador C++ Builder; Selecionar uma ferramenta para montagem e link-edição do programa executável; e Realizar testes de funcionamento do gerador de código integrado ao Happy Portugol. 11

13 1.3 Metodologia A metodologia para a realização deste trabalho consiste em duas grandes etapas: (i) Estudo; e (ii) Projeto para tradução. A etapa de estudo consiste em estudar e entender o funcionamento dos geradores de código e demais tecnologias envolvidas, a fim de adquirir o conhecimento necessário para possibilitar a conclusão do trabalho. Nesta etapa realizaram-se os seguintes estudos: Happy Portugol: uma vez que a geração de código objeto é para a ferramenta Happy Portugol, realizou-se um estudo a fim de conhecer o funcionamento da mesma; Construção de compiladores: buscou-se mostrar noções gerais da construção e funcionamento dos compiladores; Geração de código intermediário: sendo esta uma etapa que pode existir num compilador, realizou-se um estudo sobre a geração de código intermediário; Código objeto ou código final: tendo em vista que a proposta deste projeto é a geração de código objeto para o Happy Portugol, buscou-se mostrar os procedimentos necessários para a geração de código objeto ou código final; Win32asm: como o código objeto gerado será Win32asm, foram realizados estudos que abrangem seu conceito, uso de registradores, conjunto de instruções e outros aspectos pertinentes; e Definição do montador: sendo necessário para a geração do EXE o uso de um montador, foi definido o montador e estudou-se as funcionalidades que este dispõe. A etapa de projeto de tradução consiste em mostrar como os comandos em Portugol serão traduzidos para os comandos Win32asm. Nesta etapa, foram realizadas as seguintes tarefas: Construção da tabela de tradução: esta tabela mostra como os comandos escritos em Portugol serão traduzidos para Win32asm; Apresentação de ações semânticas para geração de código: as principais ações semânticas que permitirão ao analisador sintático realizar a geração do código Win32asm foram apresentadas; e 12

14 Integração do Gerador de Código com o Happy Portugol: através da interface do sistema foram realizadas chamadas ao gerador de código e o resultado do processo (código Win32asm gerado) é exibido na tela. As chamadas do montador e do executável da aplicação também tiveram que ser construídas. 1.4 Estrutura do trabalho Este trabalho está estruturado em 5 capítulos: (i) Introdução; (ii) Fundamentação Teórica; (iii) Projeto; (iv) Desenvolvimento; e (v) Conclusões. O Capítulo 1 (Introdução) apresenta o contexto do projeto, descreve sucintamente o tema e aborda a importância e os objetivos que se pretende alcançar com o trabalho. O Capítulo 2 (Fundamentação Teórica) apresenta o estudo sobre geradores de código, uma descrição da ferramenta Happy Portugol, descreve o funcionamento e o conjunto de instruções Win32asm, além de apresentar o montador escolhido e seu funcionamento. O Capítulo 3 (Projeto) apresenta de forma detalhada o projeto e suas funcionalidades, mostrando exemplos de implementação e como será feita a geração do código Win32asm a partir do portugol. O Capítulo 4 (Desenvolvimento) apresenta como os comandos escritos em portugol foram traduzidos para os comandos Win32asm e mostra como o Happy Portugol foi integrado com o código Win32asm gerado. O Capítulo 5 (Conclusões) apresenta o relacionamento entre o projeto e seus objetivos, além de mostrar os resultados obtidos com a conclusão do projeto. 13

15 2 FUNDAMENTAÇÃO TEÓRICA Existem várias ferramentas que podem ser usadas para criação de algoritmos. Um algoritmo é a lógica de um programa e essa lógica é representada por uma linguagem de programação que segundo Crespo (1998), é um conjunto de frases formado por um alfabeto e um conjunto de regras que restrinjam as combinações possíveis das frases. Aho, Sethi e Ullman (1995) afirmam que, para que um algoritmo escrito em uma linguagem de programação possa ser transformado em um programa executável, é necessário um compilador. Existem várias fases que constituem um compilador, cada uma com suas peculiaridades. Como descrito no Capítulo 1, o intuito deste projeto é gerar código objeto para o Happy Portugol. A geração de código objeto é uma fase ou passo de um compilador, e para ser possível seu desenvolvimento é necessário ter o conhecimento também de suas outras fases. Assim nas seções subseqüentes serão descritas informações necessárias ao desenvolvimento deste projeto. A Seção 2.1 mostra uma visão geral do Happy Portugol, onde também é feita uma descrição desta ferramenta. A Seção 2.2 descreve uma noção geral da construção de compiladores. Na Seção 2.3 serão mostrados algoritmos de geração de código e na Seção algoritmos de geração de código objeto. A Seção 0 mostra o conjunto de instruções Win32asm que serão utilizadas na geração do código objeto. E por fim, para que o código objeto seja transformado num executável, é necessária a utilização de um montador, que será descrito na Seção Happy Portugol Happy Portugol é uma ferramenta para auxiliar na aprendizagem da lógica de programação. Esta ferramenta oferece a possibilidade de utilizar uma linguagem com comandos em português estruturado para criação de algoritmos (chamado de portugol). Após o usuário escrever seu programa em portugol, a ferramenta converte este Portugol para Turbo C++, compila este código convertido e gera o programa executável com o compilador Turbo C da Borland. Vale lembrar que não será removido o conversor de código Portugol para C++ existente hoje na ferramenta Happy Portugol. 14

16 A interface do Happy Portugol foi escrita utilizando a linguagem C++ Builder da Borland, e a Figura 2 mostra a interface disponibilizada para a criação dos programas. Figura 2. Interface que o Happy Portugol disponibiliza para a criação dos programas Modelo de Casos de Uso Os casos de uso representam as funcionalidades do sistema. Os diagramas de casos de uso especificam os relacionamentos entre os casos de uso e os atores e estes relacionamentos indicam a existência de comunicação entre os atores e os casos de uso (PAULA FILHO, 2001). A Figura 3 apresenta o modelo de casos de uso da ferramenta Happy Portugol. 15

17 Figura 3. Modelo de casos de uso da ferramenta Happy Portugol UC Cria Programa Permite que um usuário crie um programa no Happy Portugol. Cenários Cria Programa {Principal}. 1. O Happy portugol apresenta a tela de desenvolvimento. 2. O usuário escreve o programa na linguagem portugol UC Compila Programa Permite que um usuário compile um programa que escreveu no Happy Portugol. Cenários Compila Programa {Principal}. 1. O usuário solicita ao Happy Portugol a conversão para C++. 16

18 2. O Sistema faz a análise léxica, sintática e semântica e converte o programa escrito em portugol para C++. Erros {Exceção}. 1. Caso no passo 2 do cenário Compila Programa, o Happy Portugol encontre erros no programa portugol, ele mostrará mensagens de erros para o usuário e não fará a conversão para C UC Testa Programa Permite que um usuário teste o programa que escreveu no Happy Portugol. Cenários Testa Programa {Principal}. 1. O usuário solicita ao Happy Portugol o teste do programa convertido. 2. O Sistema verifica se o programa escrito em portugol foi convertido para C++ e executa o programa convertido. Nao convertido {Exceção}. 1. Caso no passo 2 do cenário Testa Programa, o Happy Portugol verificar que o programa escrito em portugol não foi convertido para C++, ele mostrará uma mensagem de erro dizendo: "É necessário converter para C++ antes de testar" e não executará o programa Demais Funcionalidades Além das funcionalidades para criar, compilar e testar os programas, a interface do Happy Portugol oferece outras funcionalidades em sua barra de ferramentas, conforme segue: Novo cria um novo programa. Abrir abre um programa salvo anteriormente. Salvar salva o programa atual. Imprimir imprime o programa atual. 17

19 Desfazer desfaz uma digitação. Refazer refaz uma digitação que foi desfeita. Copiar copia um texto selecionado para área de transferência. Colar cola um texto que estava na área de transferência. Além da barra de ferramentas o Happy Portugol disponibiliza também um menu com as opções: Arquivo opções Novo, Abrir, Salvar, Salvar Como, Imprimir e Sair. Editar opções Desfazer, Refazer, Copiar e Colar. Testar opções Converter e Executar. Ajuda opções Sintaxe do Portugol F1, Limitações e Sobre Tecnologias utilizadas Para ser possível escrever um programa em Happy Portugol foi definida uma gramática que determina quais símbolos e de que forma estes podem ser agrupados ou produzidos, para que posteriormente possam ser reconhecidos pelos analisadores léxico, sintático e semântico. Assim, um programa em Happy Portugol deve possuir a estrutura conforme a Figura 4. A definição completa consta no Anexo IV. 18

20 programa <nome_do_programa> Declarações <definição_de_constantes> <declarações_de_variáveis> inicio <instruções_do_programa> fim Por exemplo: programa soma declarações inteiro a, b, soma inicio a <- 5 b <- 4 soma <- a+b escreva (soma) fim Ou programa <nome_do_programa> I nicio <instruções_do_programa> fim por exemplo: programa ola inicio escreva ("olá") fim Figura 4. Estrutura de um programa portugol Quando o usuário solicita ao Happy Portugol para fazer a conversão do programa portugol para o Turbo C++, o programa portugol é analisado. Nesta etapa são, caso hajam, identificados os erros presentes no programa. Esta etapa é subdividida em três fases de análise: Léxica, Sintática e Semântica, cada uma delas tratando de um aspecto do programa fonte. Na análise léxica são vistos os aspectos léxicos do programa. Aqui entra em cena o analisador léxico, também conhecido como scanner. Ele lê o texto do programa e o separa em tokens, que são os símbolos básicos de uma linguagem de programação. Eles representam palavras reservadas, literais numéricos e de texto, identificadores, operadores e pontuações. Para a análise léxica o Happy Portugol utiliza o LEX. O LEX é um dos mais tradicionais geradores de analisadores léxicos, (Gesser, 2003). Trata-se originalmente de um programa UNIX que lê uma especificação léxica formada de expressões regulares, que neste caso é o programa escrito em portugol, e gera um código fonte de análise léxica na linguagem C. Na análise sintática é vista a estrutura sintática do programa, com base na definição da gramática. São lidos os tokens gerados pelo analisador léxico e é feito o agrupando de acordo com a estrutura sintática da linguagem. O resultado desta análise é chamado de árvore de derivação. 19

21 Para a análise sintática o Happy Portugol utiliza o YACC (Yet Another Compiler- Compiler). O YACC é utilizado em parceria com o LEX e é um dos mais utilizados geradores de analisadores sintáticos. (Crespo, 1998). Recebe como entrada uma especificação das características sintáticas da linguagem definidas formalmente através de uma gramática livre de contexto (GLC), com ações semânticas inseridas, e como o LEX, gera um programa fonte na linguagem C para a análise sintática. A gramática do portugol com os tokens utilizados pela ferramenta Happy Portugol encontra-se no ANEXO II. Como saída o YACC gera uma tabela de análise sintática LALR, uma rotina de controle que executa em cima da tabela, e as ações semânticas que foram especificadas durante a definição da linguagem no arquivo de entrada. O analisador é gerado para trabalhar em conjunto com um programa de análise léxica gerada pelo LEX, o que permite uma fácil integração entre os analisadores léxico (gerado pelo LEX), sintático e semântico (gerados pelo YACC). Na análise semântica são vistos aspectos semânticos do programa, levando-se em consideração o sentido do programa. São feitas análises como a verificação de tipos, verificação de fluxo de controle, verificação de unicidade e verificações relacionadas aos nomes de subrotinas. É através da análise semântica que são extraídas as informações que possibilitam a posterior geração de código. No fim de cada produção pode ser escrita uma ação semântica a ser tomada quando uma produção for identificada pelo analisador sintático. A ação é escrita diretamente na linguagem utilizada para desenvolver o Happy, apenas a chamada é feita pelo analisador. Apesar de o Happy Portugol fornecer uma linguagem com comandos em português estruturado, o que torna mais fácil a criação de algoritmos, ele tem a limitação de depender de um compilador externo para poder gerar o programa executável. A geração do código objeto torna o Happy Portugol independente de outro compilador para a geração de um programa executável e traz mais uma opção para os alunos verem como os comandos escritos em uma linguagem de alto nível se transformam em uma linguagem de baixo nível, mas próxima ao que os computadores realmente entendem ou executam. 20

22 2.2 Construção de Compiladores Compiladores são programas que fazem tradução de uma linguagem para outra. Um compilador recebe um código fonte escrito em uma determinada linguagem de programação, analisa esse código fonte e gera um código objeto ou código alvo, para que seja interpretado e executado pelos computadores, (Aho, Sethi e Ullman, 1995). Esquematicamente este processo pode ser visto conforme a Figura 5. Figura 5. Esquema de geração de código alvo Fonte: Adaptado de Louden (2004). Um compilador é internamente constituído por vários passos ou fases. Essas fases podem ser entendidas como partes separadas do compilador, e também podem ser implementadas separadamente, embora na prática elas sejam normalmente agrupadas. Estas fases são a análise léxica, análise sintática, análise semântica, geração de código intermediário, otimização e geração de código alvo. Estas etapas serão explicadas brevemente para uma melhor contextualização da etapa de geração de código objeto, que é o foco deste projeto Análise léxica Nesta etapa é feita a leitura do código-fonte. Segundo Louden (2004), geralmente o código fonte é fornecido como uma seqüência de caracteres e essa seqüência é organizada em unidades significativas chamadas marcas, que podem ser entendidas como palavras em uma linguagem natural. Por exemplo, considerando a linha de código a seguir, que poderia pertencer a um programa escrito em C: A[index] = Este código contém 12 caracteres diferentes de espaço, porém somente 8 marcas; 21

23 A identificador [ colchete à esquerda index identificador ] colchete à direita = atribuição 4 número inteiro + sinal de adição 2 número inteiro Cada marca pode ser constituída de um ou mais caracteres, que são agrupados em unidades para prosseguir o processamento Análise sintática O analisador sintático recebe do analisador léxico o código fonte na forma de marcas e faz a análise sintática que consiste em determinar a estrutura do programa. A análise sintática identifica os elementos estruturais do código fonte e seus relacionamentos e tem seus resultados geralmente representados na forma de uma árvore de análise sintática ou uma árvore sintática, (Louden, 2004). A Figura 6 mostra a árvore sintática da expressão A[index] = Figura 6. Árvore sintática da expressão aritmética A[index] = Análise semântica Segundo Aho, Sethi e Ullman (1995), nesta fase, baseado na estrutura hierárquica determinada pela análise sintática, é verificado se o código fonte segue as convenções estáticas e 22

24 semânticas da linguagem fonte e são capturadas informações para a fase subseqüente de geração de código. Esta verificação é chamada de verificação estática e inclui: Verificação de tipos: relata um erro se um operador for aplicado a um operando incompatível, por exemplo, a soma de um número com um caracter; Verificação de fluxo de controle: enunciados que fazem o fluxo de controle deixar uma construção devem ter um local para transferir o controle, por exemplo, um enunciado break em C deixa o while, for ou switch envolvente mais interno, um erro será exibido se existir um break e não estiver dentro de um while, for ou switch; Verificação de unicidade: há situações em que um objeto deve ser definido uma única vez, por exemplo, em pascal, um identificador precisa ser declarado uma única vez; e Verificações relacionadas aos nomes: algumas vezes, o mesmo nome precisa aparecer duas ou mais vezes, por exemplo, em Ada, um laço ou bloco precisa ter um nome que apareça no início e no final da construção. 2.3 Geração de Código Segundo Louden (2004), a geração de código é a parte mais complexa de um compilador, porque não depende somente das características da linguagem do programa-fonte, mas também de detalhes da arquitetura alvo, da estrutura do ambiente de execução e do sistema operacional alvo. Em virtude desta complexidade de geração de código, normalmente um compilador quebra essa fase em vários passos, que utilizam diversas estruturas de dados intermediárias e algum tipo de código abstrato, denominado código intermediário. Conforme Price e Toscani (2001), a grande diferença entre o código intermediário e o código objeto final é que o código intermediário não especifica detalhes da máquina alvo, como quais endereços da memória serão referenciados ou quais registradores serão usados. Segundo Louden (2004), o código intermediário é muito útil quando o objetivo do compilador é produzir um código alvo bastante eficiente e quando se deseja facilitar o redirecionamento de um compilador para outras máquinas alvo, pois se o código intermediário for independente da máquina alvo, para gerar o código objeto final para uma máquina alvo diferente, basta reescrever o tradutor do código intermediário para o código alvo, o que geralmente é mais fácil que reescrever o gerador de código completo. 23

25 Conforme Crespo (1998), há várias formas para representação de código intermediário, porém as mais utilizadas na implementação dos compiladores são a notação em árvore sintática abstrata, a notação pós-fixada e o código de triplo endereço. Existem ainda outras representações como listas, grafo de sintaxe e P-código. Uma árvore sintática abstrata (ASA) representa a estrutura hierárquica natural de um código fonte. A árvore sintática é gerada a partir da determinação dos elementos estruturais do programa fonte e seus relacionamentos, feitos pelo analisador sintático. Essa árvore é um recurso bastante útil para visualizar a sintaxe de um programa ou elemento de programa. Considerando a expressão aritmética 2*a + (b-3), a árvore sintática para a expressão ficaria da forma que mostra a Figura 7. Figura 7. Árvore sintática abstrata da expressão aritmética 2*a + (b-3) Fonte: Adaptado de Aho, Sethi e Ullman (1995). A notação pós-fixada é uma representação linear de uma árvore sintática e é particularmente adaptada para representação e cálculo de expressões. Na notação pós-fixada os operandos são indicados primeiro e o operador é indicado em ultimo lugar, por exemplo, a expressão 2*a + (b-3), em notação pós-fixada é representada como 2 a * + b Código de triplo endereço Na representação por Código de Triplo Endereço (C3E), cada instrução faz referência, no máximo, a três variáveis ou endereços de memória. Segundo Crespo (1998), uma instrução representada pelo C3E, formada por um operador e três operandos possui o formato NNN oper(arg1, arg2, res), onde NNN representa o endereço abstrato da C3E, oper é um operador como +,- ou cpy que indicaria cópia de literal ou variável, arg1 e arg2 são operandos que podem ser endereços de variáveis ou literais e res constitui o resultado da instrução e pode ser um endereço de uma variável ou um endereço de uma instrução C3E, mas não pode ser uma constante ou literal. Por exemplo, considerando a instrução z = x + 1, em uma linguagem de programação de alto nível, na notação C3E a mesma instrução poderia ser descrita por 100 +(x, 1, z). 24

26 Quando as instruções C3E utilizarem somente parte dos operandos, convenciona-se atribuir aos operandos não utilizados o valor nulo, que pode ser representado por _. Por exemplo, considerando a instrução z = - x, em uma linguagem de programação de alto nível, na notação C3E a mesma instrução poderia ser descrita por 100 -(x, _, z). Diz Louden (2004), que em várias situações o C3E requer que o compilador gere nomes para variáveis temporárias, por exemplo, a expressão em uma linguagem de alto nível 2 * a +(b-3), poderia ser representada em C3E como mostra a Figura 8. t1 = 2 * a t2 = b 3 t3 = t1 + t2 Figura 8. Representação da expressão em uma linguagem de alto nível 2 * a +(b-3) em C3E A forma como essas variáveis temporárias devem ser alocadas na memória não são especificadas por esse código, em geral, elas são atribuídas a registradores ou podem também ser mantidas em registros temporários. Conforme Crespo (1998), as instruções que existem no C3E são semelhantes as existentes no código alvo. Algumas instruções típicas do C3E necessárias em um código intermediário são: Instruções de Operadores Binários e Unários: operadores aritméticos usuais (soma, subtração, multiplicação e divisão), o operador negação aritmética e operadores relacionais (igual, maior, menor); Instruções de Cópia de Literal ou Variável: Esta instrução é necessária para representar em C3E instruções da linguagem de alto nível do tipo x = a ou X = 1. Vale lembrar que esta instrução não é estritamente necessária, uma vez que pode ser substituída por uma operação com operando nulo. Por exemplo, a instrução de cópia do valor da variável x à variável z, cpy(x, _, z), é equivalente a instrução C3E +(x, 0, z). A instrução de cópia de literal ou variável é disponibilizada por razões de otimização de código; Instruções de Acesso a Elementos de Uma Tabela: Essas instruções de acesso indexado a elementos de uma tabela possuem a forma idxr(x, i, z) e idxl(x, i, z) e correspondem, respectivamente, às atribuições z = x[i] e z[i] = x. O índice i determina o elemento relativo à primeira posição da tabela; 25

27 Instruções de Salto: Instruções de salto condicional tem o formato ifoper(x, y, l) no qual ifoper é um operador relacional e para saltos incondicionais o C3E disponibiliza a instrução jmp(_, _, l) que implementa o salto incondicional para a instrução de endereço l; Instruções de Chamada e Retorno de Rotinas: Uma instrução de chamada a rotina numa linguagem de alto nível P(A1,A2,...,An) é traduzida para C3E conforme a seqüência de instruções mostradas na Figura 9: param(a1, _, _) param(a2, _, _)... param(an, _, _) call(p, _, _) Figura 9. Seqüência de instruções para chamada de rotinas de retorno; e O retorno de rotinas é codificado pela instrução ret(val, _, _), onde val indica o valor Instrução de Referenciação e de Dereferenciação de Ponteiros: No C3E são disponibilizadas três instruções de referenciação e de dereferenciação de ponteiros. Elas possuem a forma addr(x, _, z), locr(x, _, z) e locl(x, _, z) e correspondem, respectivamente, às instruções da linguagem de alto nível C z = &x, z = *x e *z = x. A estratégia de implementação de um C3E depende da representação explícita, ou não, das variáveis temporárias. No primeiro caso a implementação é feita usando quádruplos e a segunda usando triplos. A vantagem dos quádruplos é a facilidade na implementação e na otimização de código e a dos triplos é a poupança de memória, tanto no número de campos nos registros C3E quanto na representação de variáveis temporárias. Nos quádruplos o operador e os três operandos são campos de registros de C3E, já nos triplos, a diferença é que o operando res não é campo dos registros do C3E. Nos triplos não há criação explícita de variáveis temporárias. Sempre que uma instrução C3E tiver um operando arg com referência a uma variável temporária, no seu lugar é indicado o endereço da instrução C3E onde o valor foi calculado. Considerando a instrução em alto nível z = (1 + c) * (a / -c), sua representação por triplos é mostrada na Tabela 1. 26

28 Tabela 1. Representação em C3E da instrução em alto nível z = (1 + c) * (a / -c) por triplos Triplos Endereço oper arg1 arg c 101 uminus c 102 / a (101) 103 * (100) (102) 104 Cpy (103) z Fonte: Crespo (1998). Considerando a mesma instrução em alto nível z = (1 + c) * (a / -c), sua representação por quádruplos é mostrada na Tabela 2. Tabela 2. Representação em C3E da instrução em alto nível z = (1 + c) * (a / -c) por quádruplos Quádruplos Endereço oper arg1 arg2 res c t1 101 uminus c t2 102 / a t2 T3 103 * t1 t3 t4 104 cpy t4 z Fonte: Crespo (1998) Otimização Segundo Crespo (1998), o processo de geração de código tende a produzir instruções: Inacessíveis: Instruções que nunca serão executadas; Redundantes: Instruções em que a execução não altera o estado da aplicação; Lentas: Instruções para as quais existem blocos de código ou comandos equivalentes que são mais rápidos e produzem os mesmos resultados; e Pesadas: Instruções para as quais existem blocos de código ou comandos equivalentes que ocupam menos recursos de memória RAM e utilizam menos registradores do processador. 27

29 Crespo (1998), diz ainda que etapa de otimização tem por objetivo substituir o código produzido por outro código equivalente, porém, que tenha maior velocidade e ocupe menor espaço de memória. Existem diversas técnicas para a otimização de código, entretanto, dificilmente se consegue atingir um código ótimo no sentido matemático, o que acontece na maioria das vezes é uma melhoria de código. Vale ressaltar que um programador dificilmente irá ou deva utilizar todas as técnicas de otimização de código, mas sim analisar e julgar que técnicas melhor se aplicariam a uma determinada situação para resultar em melhoras significativas no código com menor impacto na complexidade do gerador Código Objeto ou Código Final Conforme Crespo (1998), a etapa de geração de código objeto ou código final recebe como entrada uma representação intermediária do programa fonte ou o próprio programa fonte e produz como saída um programa semanticamente equivalente e executável numa máquina alvo. Esta etapa é estruturada em três componentes: 1. Determinação das estruturas de dados: O código intermediário pode possuir várias estruturas de dados, tais como, estruturas do programa fonte e variáveis temporárias, assim, nesta fase são atribuídas as estruturas de dados do código intermediário os recursos da máquina alvo, como registradores, localizações de memória e localizações de pilha do processador; 2. Seleção das instruções da máquina alvo: São selecionadas as instruções, de linguagem de máquina, que transcrevem a representação intermediária para a linguagem da máquina alvo; e 3. Criação do ambiente de execução: Na geração de código final também são identificadas as estruturas de dados necessárias para a formação do ambiente de execução do programa Geração de código para variáveis e referências a estrutura de dados Há diversas situações que exigem cálculos de endereços para localizar um determinado endereço, e esses cálculos devem ser expressos diretamente. Esses cálculos ocorrem na indexação de matrizes, nos campos de registros e nas referências de ponteiros. 28

30 Referências de matrizes Uma referência de matriz requer a indexação de uma variável de matriz por uma expressão para chegar a uma referência ou valor de um único elemento da matriz. Por exemplo, no código em alto nível da linguagem C: int a[size]; int i, j; a[i + 1] = a[j * 2] + 3; Nesta atribuição, a indexação de a pela expressão i + j produz o endereço alvo da atribuição, e a indexação de a pela expressão j * 2 produz o valor no endereço calculado pelo tipo de endereço de a, neste caso int. Como as matrizes são armazenadas seqüencialmente na memória, cada endereço deve ser calculado a partir do endereço base de a e de um deslocamento que dependa linearmente do valor do índice. Quando se deseja obter o valor em vez do endereço, um passo adicional precisa ser feito para capturar o valor no endereço calculado. O deslocamento é calculado a partir do valor do índice, da seguinte forma: inicialmente, deve-se ajustar o valor do índice caso o intervalo de índices não comece por zero. Depois, o valor do índice ajustado deve ser multiplicado por um fator de escala, que é igual ao tamanho de cada elemento da matriz na memória e por ultimo, o índice resultante é somado ao endereço de base para obter o endereço final do elemento da matriz. Por exemplo, no caso da linguagem C, onde o nome de uma matriz denota seu endereço base, o endereço de referência da matriz a[i + 1] é: a + (i + 1) * sizeof(int). De maneira geral, o endereço de um elemento de matriz a[t] em qualquer linguagem é endereço_base(a) + (t limite_inferior(a)) * tamanho_elemento(a) Referências de matrizes multidimensionais Um fator complicador para o cálculo de endereços de matrizes é a existência, na maioria das linguagens, de matrizes com múltiplas dimensões. Por exemplo, na linguagem C, uma matriz com duas dimensões e tamanhos diferentes de índices pode ser declarada como: int a[15][10]. 29

31 Essas matrizes podem ser indexadas de forma parcial, levando à matrizes de dimensões menores, por exemplo, com a declaração acima de a em C, a expressão a[i] indexa parcialmente a, levando a uma matriz unidimensional de inteiros, e a expressão a[i][j] indexa totalmente a e leva a um valor do tipo inteiro. Assim, para a obtenção do endereço de uma variável de tipo matriz parcial pode-se utilizar a aplicação recursiva das técnicas descritas para o caso das matrizes unidimensionais Estruturas de registros e referências de ponteiros O cálculo do endereço de um campo de registro ou estrutura é similar ao cálculo de um endereço da matriz indexada. Primeiramente, o endereço da base da variável precisa ser calculado, em seguida, o deslocamento do campo com o nome é encontrado, e por fim, os dois são somados para obter o endereço resultante. A Figura 10 mostra um exemplo as declaração de estrutura na linguagem C: Typedef struct x { int i; char c; int j; } Rec rec x; Figura 10. Declaração de estrutura na linguagem C Normalmente, a variável x é alocada na memória de acordo como mostra a Figura 11, e cada campo(i, c e j) tem um deslocamento a partir do endereço base de x. 30

32 Figura 11. Ilustração da alocação da variável x em memória Fonte: Louden, (2004). Os campos são alocados linearmente, o deslocamento de cada campo é uma constante e o primeiro campo (x.i) tem deslocamento zero. Vale observar que os deslocamentos dos campos dependem dos tamanhos dos diferentes tipos de dados na máquina alvo, mas não é necessário usar nenhum fator de escala como acontece nas matrizes. As estruturas de registros são tipicamente usadas em conjunto com ponteiros e memória dinâmica, para implementar estruturas de dados dinâmicas como listas e árvores. Assim, um ponteiro estabelece um nível adicional de referência indireta Geração de código para declarações de controle e expressões lógicas Segundo Louden (2004), as principais formas de declarações de controle são as declarações estruturadas if e while. Existem ainda outras formas como break, goto, repeat, for e a declaração case ou switch Geração de código para declarações if e while A maior dificuldade para gerar código para essas declarações é traduzir as características de controle estruturado em uma forma equivalente sem estrutura ou linear com saltos. Os compiladores devem gerar código para essas declarações em uma forma padrão que permite o uso eficiente de um subconjunto de saltos possíveis considerando a arquitetura de uma máquina alvo. 31

33 Abaixo são mostradas as organizações possíveis para cada uma das declarações. Em cada uma dessas organizações, há apenas dois tipos de saltos, saltos incondicionais e saltos nos quais a condição é falsa. O caso verdadeiro é sempre um caso de seguir em frente, ou seja, não requer saltos. Isto reduz a quantidade de saltos que o compilador tem que gerar. A Figura 12 mostra a organização típica de código para um comando de desvio condicional (if-else). Figura 12. Organização típica de código para um comando if-else Fonte: Adaptado de Aho, Sethi e Ullman (1995). No caso de um laço de repetição os saltos devem possibilitar que determinadas instruções sejam realizadas repetitivamente, sendo neste caso um salto para uma instrução anteriormente realizada. A Figura 13 mostra a organização típica de código para um laço de repetição com teste lógico no início (while). 32

34 Figura 13. Organização típica de código para um comando while Fonte: Adaptado de Aho, Sethi e Ullman (1995) Geração de rótulos e ajuste retroativo (backpatching) Um problema que pode acontecer durante a geração de código para declarações de controle é que, em alguns casos, os saltos para um rótulo podem ser gerados antes da definição do próprio rótulo. Durante a geração do código alvo, esses rótulos podem ser passados para um montador se for gerado código de montagem, mas caso o código gerado seja executável, esses rótulos precisam ser resolvidos como localizações absolutas ou relativas (Louden, 2004). Um método para gerar esses saltos para adiante é deixar um espaço em branco no código em que o salto deve ocorrer ou gerar uma instrução temporária de salto para uma localização fictícia. Então, quando o salto é determinado, a localização é usada para ajustar retroativamente o código que ficou faltando. Para isso é necessário que o código gerado fique armazenado em um repositório na memória, para que o ajuste de código retroativo seja feito durante o processo, ou que o código seja gerado num arquivo temporário e, posteriormente o código seja relido deste arquivo e seja ajustado retroativamente quando for necessário. Para os dois casos, os ajustes retroativos podem ser armazenados numa pilha que age como repositório ou mantidos localmente em procedimentos recursivos. 33

35 É necessário cuidado adicional no processo de ajuste retroativo, pois pode ocorrer um problema, porque muitas arquiteturas têm dois tipos de salto, um curto, ou ramificação, e um longo que exige mais espaço de código. Neste caso, o gerador pode inserir instruções nop (not operation) para encurtar os saltos ou efetuar várias passadas para condensar o código Geração de código de expressões lógicas Segundo Louden (2004), a geração de código alvo para expressões lógicas geralmente requer que valores booleanos sejam representados aritmeticamente, pois a maioria das arquiteturas não apresenta um tipo de dado booleano interno. A forma padrão é representar o valor booleano falso com zero e o valor booleano verdadeiro com um. Isto requer que o resultado das operações de comparação como < ou > sejam normalizados para zero ou um. Pode acontecer em algumas arquiteturas como na linguagem C, de uma expressão ser um curto-circuito, ou seja, quando não se pode avaliar seu segundo argumento. Por exemplo, se a for uma expressão booleana calculada como falsa, a expressão booleana a and b pode ser determinada de imediato como falsa sem avaliar b. Neste caso, é necessário o uso adicional dos saltos condicionais. As operações de curto-circuito são extremamente úteis para o codificador, pois a avaliação da segunda expressão causaria um erro se um operador não fosse de curto-circuito. Por exemplo, na linguagem C é comum escrever: If ((p!=null) && (p->val= =0)) onde a avaliação de p->val, quando p for nulo, provocaria um erro de memória Geração de código para chamadas de procedimentos e funções A complexidade da geração de código para esses mecanismos é um pouco maior, em decorrência de diferentes máquinas alvo utilizarem mecanismos consideravelmente diferentes para as ativações dos procedimentos e das funções e também porque as ativações dependem da organização do ambiente de execução. Desta forma a chamada de procedimentos e funções será apresentada em detalhes na seção pertinente ao assembly do Win32asm. 34

Geração de código intermediário. Novembro 2006

Geração de código intermediário. Novembro 2006 Geração de código intermediário Novembro 2006 Introdução Vamos agora explorar as questões envolvidas na transformação do código fonte em uma possível representação intermediária Como vimos, nas ações semânticas

Leia mais

Geração de código. Ivan Ricarte INTRODUÇÃO À COMPILAÇÃO

Geração de código. Ivan Ricarte INTRODUÇÃO À COMPILAÇÃO Geração de código Ivan Ricarte 2008 Sumário Geração de código intermediário Código de três endereços Notação pós-fixa Otimização de código Heurísticas de otimização Geração de código em linguagem simbólica

Leia mais

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS UNIVERSIDADE REGIONAL DE BLUMENAU CENTRO DE CIÊNCIAS EXATAS E NATURAIS CURSO DE CIÊNCIAS DA COMPUTAÇÃO BACHARELADO AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS Orientando: Oliver Mário

Leia mais

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 3.1 - IDENTIFICADORES Os objetos que usamos no nosso algoritmo são uma representação simbólica de um valor de dado. Assim, quando executamos a seguinte instrução:

Leia mais

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM 71 Introdução Difere dos níveis inferiores por ser implementado por tradução A tradução é usada quando um processador está disponível para uma mensagem fonte mas

Leia mais

Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: 2010-1 Prof. Dr. Raimundo Moura

Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: 2010-1 Prof. Dr. Raimundo Moura UFPI CCN DIE Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: 2010-1 Prof. Dr. Raimundo Moura O projeto Desenvolver um compilador de um subconjunto básico da linguagem PORTUGOL.

Leia mais

1.1. Organização de um Sistema Computacional

1.1. Organização de um Sistema Computacional 1. INTRODUÇÃO 1.1. Organização de um Sistema Computacional Desde a antiguidade, o homem vem desenvolvendo dispositivos elétricoeletrônicos (hardware) que funciona com base em instruções e que são capazes

Leia mais

OPERADORES E ESTRUTURAS DE CONTROLE

OPERADORES E ESTRUTURAS DE CONTROLE OPERADORES E ESTRUTURAS DE CONTROLE 3.1 Operadores Os operadores indicam o tipo de operação matemática que será executada gerando novos valores a partir de um ou mais operadores. São muito utilizados em

Leia mais

Geração e Otimização de Código

Geração e Otimização de Código Geração e Otimização de Código Representação de código intermediária Código de três endereços, P-código Técnicas para geração de código Otimização de código Prof. Thiago A. S. Pardo 1 Estrutura geral de

Leia mais

Resolução de problemas e desenvolvimento de algoritmos

Resolução de problemas e desenvolvimento de algoritmos SSC0101 - ICC1 Teórica Introdução à Ciência da Computação I Resolução de problemas e desenvolvimento de algoritmos Prof. Vanderlei Bonato Prof. Cláudio Fabiano Motta Toledo Sumário Análise e solução de

Leia mais

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá. INTRODUÇÃO A lógica de programação é extremamente necessária para as pessoas que queiram trabalhar na área de programação, seja em qualquer linguagem de programação, como por exemplo: Pascal, Visual Basic,

Leia mais

Dadas a base e a altura de um triangulo, determinar sua área.

Dadas a base e a altura de um triangulo, determinar sua área. Disciplina Lógica de Programação Visual Ana Rita Dutra dos Santos Especialista em Novas Tecnologias aplicadas a Educação Mestranda em Informática aplicada a Educação ana.santos@qi.edu.br Conceitos Preliminares

Leia mais

ARQUITETURA DE COMPUTADORES. Rogério Spindula Rosa

ARQUITETURA DE COMPUTADORES. Rogério Spindula Rosa ARQUITETURA DE COMPUTADORES 1 Rogério Spindula Rosa 2 EXECUÇÃO DE PROGRAMAS PROGRAMA 3 4 INTRODUÇÃO Hoje é raro escrever um programa diretamente em linguagem de computador em virtude da enorme dificuldade

Leia mais

Componentes do Computador e. aula 3. Profa. Débora Matos

Componentes do Computador e. aula 3. Profa. Débora Matos Componentes do Computador e modelo de Von Neumann aula 3 Profa. Débora Matos O que difere nos componentes que constituem um computador? Princípios básicos Cada computador tem um conjunto de operações e

Leia mais

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008 Tabela de Símbolos Análise Semântica A Tabela de Símbolos Fabiano Baldo Após a árvore de derivação, a tabela de símbolos é o principal atributo herdado em um compilador. É possível, mas não necessário,

Leia mais

UNIVERSIDADE DO OESTE DE SANTA CATARINA CAMPUS DE SÃO MIGUEL DO OESTE

UNIVERSIDADE DO OESTE DE SANTA CATARINA CAMPUS DE SÃO MIGUEL DO OESTE UNIVERSIDADE DO OESTE DE SANTA CATARINA CAMPUS DE SÃO MIGUEL DO OESTE CURSO: CIÊNCIAS DA COMPUTAÇÃO DISCIPLINA: COMPILADORES PROFESSOR: JOHNI DOUGLAS MARANGON Back-End Compilação 1. Compilação etapa Back-end

Leia mais

Introdução à Programação

Introdução à Programação Introdução à Programação Introdução a Linguagem C Construções Básicas Programa em C #include int main ( ) { Palavras Reservadas } float celsius ; float farenheit ; celsius = 30; farenheit = 9.0/5

Leia mais

Construção de Compiladores. Construção de Compiladores. Motivação. Motivação. Contexto Histórico. Classificações: Gerações 09/03/2010

Construção de Compiladores. Construção de Compiladores. Motivação. Motivação. Contexto Histórico. Classificações: Gerações 09/03/2010 Construção de Compiladores Prof. Raimundo Santos Moura (http://www.ufpi.br/rsm) Construção de Compiladores Livro-Texto: AHO, Alfred V.; ULLMAN, Jeffrey D.; SETHI, R. Compiladores: princípios, técnicas

Leia mais

COMPILADORES E INTERPRETADORES

COMPILADORES E INTERPRETADORES Aula 16 Arquitetura de Computadores 12/11/2007 Universidade do Contestado UnC/Mafra Curso Sistemas de Informação Prof. Carlos Guerber COMPILADORES E INTERPRETADORES Um compilador transforma o código fonte

Leia mais

Feature-Driven Development

Feature-Driven Development FDD Feature-Driven Development Descrição dos Processos Requisitos Concepção e Planejamento Mais forma que conteúdo Desenvolver um Modelo Abrangente Construir a Lista de Features Planejar por

Leia mais

Apostila de Fundamentos de Programação I. Prof.: André Luiz Montevecchi

Apostila de Fundamentos de Programação I. Prof.: André Luiz Montevecchi Apostila de Fundamentos de Programação I Prof: André Luiz Montevecchi Introdução O mundo atual é dependente da tecnologia O uso intenso de diversos aparatos tecnológicos é parte integrante do nosso dia-a-dia

Leia mais

ALP Algoritmos e Programação. . Linguagens para Computadores

ALP Algoritmos e Programação. . Linguagens para Computadores ALP Algoritmos e Programação Iniciação aos computadores. Linguagens para Computadores. Compiladores, Interpretadores. Ambientes de Programação 1 Linguagens para Computadores. Linguagem binária: Dispositivos

Leia mais

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br LP II Estrutura de Dados Introdução e Linguagem C Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br Resumo da aula Considerações Gerais Introdução a Linguagem C Variáveis e C Tipos de

Leia mais

Algoritmos e Programação Estruturada

Algoritmos e Programação Estruturada Algoritmos e Programação Estruturada Virgínia M. Cardoso Linguagem C Criada por Dennis M. Ritchie e Ken Thompson no Laboratório Bell em 1972. A Linguagem C foi baseada na Linguagem B criada por Thompson.

Leia mais

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br Introdução O computador como ferramenta indispensável: Faz parte das nossas vidas; Por si só não faz nada de útil; Grande capacidade de resolução

Leia mais

PROJETO LÓGICO DE COMPUTADORES Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br

PROJETO LÓGICO DE COMPUTADORES Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br - Aula 5 - O NÍVEL DA LINGUAGEM DE MONTAGEM 1. INTRODUÇÃO É relativamente fácil compreender os fundamentos da programação de computadores, sob o ponto de vista da inteligibilidade dos comandos de alto

Leia mais

Organização e Arquitetura de Computadores I. de Computadores

Organização e Arquitetura de Computadores I. de Computadores Universidade Federal de Campina Grande Unidade Acadêmica de Sistemas e Computação Curso de Bacharelado em Ciência da Computação Organização e Arquitetura de Computadores I Organização Básica B de Computadores

Leia mais

Orientação a Objetos

Orientação a Objetos 1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou

Leia mais

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto ALGORITMOS PARTE 01 Fabricio de Sousa Pinto Algoritmos: Definição 2 É uma sequência de instruções finita e ordenada de forma lógica para a resolução de uma determinada tarefa ou problema. Algoritmos 3

Leia mais

Introdução à Lógica de Programação

Introdução à Lógica de Programação Introdução à Lógica de Programação Sistemas Numéricos As informações inseridas em um computador são traduzidos em dados, ou seja, em sinais que podem ser manipulados pelo computador. O computador trabalha

Leia mais

UMA BREVE INTRODUÇÃO AO ESTUDO E IMPLEMENTAÇÃO DE COMPILADORES

UMA BREVE INTRODUÇÃO AO ESTUDO E IMPLEMENTAÇÃO DE COMPILADORES UMA BREVE INTRODUÇÃO AO ESTUDO E IMPLEMENTAÇÃO DE COMPILADORES 1 BRANCO; Guido Aparecido Junior, 2 TAMAE, Rodrigo Yoshio 1-Discente do Curso Sistemas de Informação FAEG/Garça 2-Docente do Curso Sistemas

Leia mais

Linguagem algorítmica: Portugol

Linguagem algorítmica: Portugol Programação de Computadores I Aula 03 Linguagem algorítmica: Portugol José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/34 Introdução I Lógica A lógica é usada

Leia mais

Análise semântica. Análise Semântica. Estrutura de um compilador. Anotação da árvore sintática. Tipos de comunicação de atributos?

Análise semântica. Análise Semântica. Estrutura de um compilador. Anotação da árvore sintática. Tipos de comunicação de atributos? Estrutura de um compilador Análise semântica Tradução orientada pela sintaxe 1 2 Análise Semântica Anotação da árvore sintática Análise semântica: Tipos (& Declarações) Escopo Checagens estáticas: Idéia:

Leia mais

e à Linguagem de Programação Python

e à Linguagem de Programação Python Introdução a Algoritmos, Computação Algébrica e à Linguagem de Programação Python Curso de Números Inteiros e Criptografia Prof. Luis Menasché Schechter Departamento de Ciência da Computação UFRJ Agosto

Leia mais

Figura 1 - O computador

Figura 1 - O computador Organização e arquitectura dum computador Índice Índice... 2 1. Introdução... 3 2. Representação da informação no computador... 4 3. Funcionamento básico dum computador... 5 4. Estrutura do processador...

Leia mais

3. O NIVEL DA LINGUAGEM DE MONTAGEM

3. O NIVEL DA LINGUAGEM DE MONTAGEM 3. O NIVEL DA LINGUAGEM DE MONTAGEM Nas aulas anteriores tivemos a oportunidade de discutir dois diferentes níveis presentes na maioria dos computadores atuais. Nesta aula dedica-se a outro nível que também

Leia mais

[RÓTULO:] MNEMÔNICO [OPERANDOS] [;COMENTÁRIO]

[RÓTULO:] MNEMÔNICO [OPERANDOS] [;COMENTÁRIO] Instruções de uso do montador DAEDALUS (baseadas em texto extraído da monografia apresentada como trabalho de diplomação no curso de Bacharelado em Ciência da Computação por Luís Ricardo Schwengber, sob

Leia mais

Introdução à Lógica de Programação

Introdução à Lógica de Programação Sistemas Operacionais e Introdução à Programação Introdução à Lógica de Programação 1 Estruturas de dados Representação computacional das informações do problema ser resolvido Informações podem ser de

Leia mais

Conceitos Importantes:

Conceitos Importantes: Conceitos Importantes: Variáveis: Por Flávia Pereira de Carvalho, 2007 i O bom entendimento do conceito de variável é fundamental para elaboração de algoritmos, consequentemente de programas. Uma variável

Leia mais

Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri. Banco de Dados Processamento e Otimização de Consultas

Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri. Banco de Dados Processamento e Otimização de Consultas Processamento e Otimização de Consultas Banco de Dados Motivação Consulta pode ter sua resposta computada por uma variedade de métodos (geralmente) Usuário (programador) sugere uma estratégia para achar

Leia mais

Algoritmos e Estrutura de Dados III. Árvores

Algoritmos e Estrutura de Dados III. Árvores Algoritmos e Estrutura de Dados III Árvores Uma das mais importantes classes de estruturas de dados em computação são as árvores. Aproveitando-se de sua organização hierárquica, muitas aplicações são realizadas

Leia mais

Tais operações podem utilizar um (operações unárias) ou dois (operações binárias) valores.

Tais operações podem utilizar um (operações unárias) ou dois (operações binárias) valores. Tais operações podem utilizar um (operações unárias) ou dois (operações binárias) valores. 7.3.1.2 Registradores: São pequenas unidades de memória, implementadas na CPU, com as seguintes características:

Leia mais

Treinamento em BrOffice.org Calc

Treinamento em BrOffice.org Calc Treinamento em BrOffice.org Calc 1 Índice I. INTRODUÇÃO...3 II. NÚMEROS, TEXTOS, FÓRMULAS E DATAS...4 III. MENUS BÁSICOS...5 1. Arquivo...5 2. Editar...5 3. Formatar...5 IV. FÓRMULAS...8 V. REFERÊNCIAS

Leia mais

Programação de Computadores III

Programação de Computadores III Programação de Computadores III Introdução a Linguagens de Programação Professor Leandro Augusto Frata Fernandes laffernandes@ic.uff.br Material disponível em http://www.ic.uff.br/~laffernandes/teaching/2013.1/tcc-00.157

Leia mais

Introdução. Introdução. Introdução. Organização Estruturada de Computadores. Introdução. Máquinas Multiníveis

Introdução. Introdução. Introdução. Organização Estruturada de Computadores. Introdução. Máquinas Multiníveis Ciência da Computação Arq. e Org. de Computadores Máquinas Multiníveis Prof. Sergio Ribeiro Computador digital máquina que resolve problemas executando uma série de instruções. Programa conjunto de instruções

Leia mais

Java. Marcio de Carvalho Victorino www.dominandoti.eng.br

Java. Marcio de Carvalho Victorino www.dominandoti.eng.br Java Marcio de Carvalho Victorino www.dominandoti.eng.br 3. Considere as instruções Java abaixo: int cont1 = 3; int cont2 = 2; int cont3 = 1; cont1 += cont3++; cont1 -= --cont2; cont3 = cont2++; Após a

Leia mais

3/9/2010. Ligação da UCP com o barramento do. sistema. As funções básicas dos registradores nos permitem classificá-los em duas categorias:

3/9/2010. Ligação da UCP com o barramento do. sistema. As funções básicas dos registradores nos permitem classificá-los em duas categorias: Arquitetura de Computadores Estrutura e Funcionamento da CPU Prof. Marcos Quinet Universidade Federal Fluminense P.U.R.O. Revisão dos conceitos básicos O processador é o componente vital do sistema de

Leia mais

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO Capítulo 1 INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO 1.1 Histórico de Linguagens de Programação Para um computador executar uma dada tarefa é necessário que se informe a ele, de uma maneira clara, como ele

Leia mais

FACULDADE DE ENGENHARIA DE COMPUTAÇÃO. PROJETO FINAL I e II PLANO DE TRABALHO <NOME DO TRABALHO> <Nome do Aluno> <Nome do Orientador>

FACULDADE DE ENGENHARIA DE COMPUTAÇÃO. PROJETO FINAL I e II PLANO DE TRABALHO <NOME DO TRABALHO> <Nome do Aluno> <Nome do Orientador> FACULDADE DE ENGENHARIA DE COMPUTAÇÃO PROJETO FINAL I e II PLANO DE TRABALHO O Trabalho de Conclusão de Curso (TCC) a ser desenvolvido

Leia mais

Introdução aos cálculos de datas

Introdução aos cálculos de datas Page 1 of 7 Windows SharePoint Services Introdução aos cálculos de datas Aplica-se a: Microsoft Office SharePoint Server 2007 Ocultar tudo Você pode usar fórmulas e funções em listas ou bibliotecas para

Leia mais

MC102 Algoritmos e Programação de Computadores 2ª Aula Programa, entrada e saída de dados

MC102 Algoritmos e Programação de Computadores 2ª Aula Programa, entrada e saída de dados MC102 Algoritmos e Programação de Computadores 2ª Aula Programa, entrada e saída de dados 1. Objetivos Falar sobre programa de computador, diferenciando programa em linguagem de máquina, de programa em

Leia mais

ARQUITETURA DE COMPUTADORES - 1866

ARQUITETURA DE COMPUTADORES - 1866 7 Unidade Central de Processamento (UCP): O processador é o componente vital do sistema de computação, responsável pela realização das operações de processamento e de controle, durante a execução de um

Leia mais

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA Responda 1) Quem desenvolveu a linguagem C? Quando? 2) Existe alguma norma sobre a sintaxe da linguagem C? 3) Quais são os tipos básicos de dados disponíveis na linguagem C? 4) Quais são as principais

Leia mais

ICC Introdução para JavaScript

ICC Introdução para JavaScript ICC Introdução para JavaScript Arquitetura Genérica de um Computador Máquina de Von Neumann Diagrama conhecido como Máquina de Von Neumann (grande nome da informática) A finalidade de um computador é receber,

Leia mais

Iniciação à Informática

Iniciação à Informática Meu computador e Windows Explorer Justificativa Toda informação ou dado trabalhado no computador, quando armazenado em uma unidade de disco, transforma-se em um arquivo. Saber manipular os arquivos através

Leia mais

Arquitetura de Computadores. Tipos de Instruções

Arquitetura de Computadores. Tipos de Instruções Arquitetura de Computadores Tipos de Instruções Tipos de instruções Instruções de movimento de dados Operações diádicas Operações monádicas Instruções de comparação e desvio condicional Instruções de chamada

Leia mais

O que é um programa? Programa é uma lista de instruções que descrevem uma tarefa a ser realizada pelo computador.

O que é um programa? Programa é uma lista de instruções que descrevem uma tarefa a ser realizada pelo computador. O que é um programa? Programa é uma lista de instruções que descrevem uma tarefa a ser realizada pelo computador. Linguagem de Programação Uma linguagem de programação é um método padronizado para expressar

Leia mais

Status. Barra de Título. Barra de Menu. Barra de. Ferramentas Padrão. Caixa de nomes. Barra de. Ferramentas de Formatação. Indicadores de Coluna

Status. Barra de Título. Barra de Menu. Barra de. Ferramentas Padrão. Caixa de nomes. Barra de. Ferramentas de Formatação. Indicadores de Coluna O que é uma planilha eletrônica? É um aplicativo que oferece recursos para manipular dados organizados em tabelas. A partir deles pode-se gerar gráficos facilitando a análise e interpretação dos dados

Leia mais

Tutorial de Matlab Francesco Franco

Tutorial de Matlab Francesco Franco Tutorial de Matlab Francesco Franco Matlab é um pacote de software que facilita a inserção de matrizes e vetores, além de facilitar a manipulação deles. A interface segue uma linguagem que é projetada

Leia mais

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software PROCESSO DE DESENVOLVIMENTO DE SOFTWARE Introdução Modelos de Processo de Desenvolvimento de Software Os modelos de processos de desenvolvimento de software surgiram pela necessidade de dar resposta às

Leia mais

PONTIFÍCIA UNIVERSIDADE CATÓLICA DE GOIÁS Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas

PONTIFÍCIA UNIVERSIDADE CATÓLICA DE GOIÁS Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas PONTIFÍCIA UNIVERSIDADE CATÓLICA DE GOIÁS Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas CMP1132 Processo e qualidade de software II Prof. Me. Elias Ferreira Sala: 402 E Quarta-Feira:

Leia mais

1. NÍVEL CONVENCIONAL DE MÁQUINA

1. NÍVEL CONVENCIONAL DE MÁQUINA 1. NÍVEL CONVENCIONAL DE MÁQUINA Relembrando a nossa matéria de Arquitetura de Computadores, a arquitetura de Computadores se divide em vários níveis como já estudamos anteriormente. Ou seja: o Nível 0

Leia mais

Sintaxe e Semântica. Fases da Compilação. programa fonte

Sintaxe e Semântica. Fases da Compilação. programa fonte Sintaxe e Semântica mleal@inf.puc-rio.br Fases da Compilação programa fonte tokens parse tree árvore anotada ou outra forma intermediária código intermediário código objeto código objeto otimizado scanner

Leia mais

Linguagem e Técnicas de Programação I Programação estruturada e fundamentos da linguagem C

Linguagem e Técnicas de Programação I Programação estruturada e fundamentos da linguagem C Linguagem e Técnicas de Programação I Programação estruturada e fundamentos da linguagem C Prof. MSc. Hugo Souza Material desenvolvido por: Profa. Ameliara Freire Continuando as aulas sobre os fundamentos

Leia mais

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann Universidade Federal de Santa Maria NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann O modelo (ou arquitetura) de von

Leia mais

Instruções para a atividade

Instruções para a atividade 1/13 Instruções para a atividade 1. Orientações gerais. Leia atentamente: a. Esta é uma atividade contínua, baseada nos recursos do MS Excel. Foi idealizada para que a ferramenta em questão possa ter seus

Leia mais

Algoritmos e Estrutura de Dados. Introdução a Linguagem Python (Parte I) Prof. Tiago A. E. Ferreira

Algoritmos e Estrutura de Dados. Introdução a Linguagem Python (Parte I) Prof. Tiago A. E. Ferreira Algoritmos e Estrutura de Dados Aula 1 Introdução a Linguagem Python (Parte I) Prof. Tiago A. E. Ferreira Linguagem a ser Utilizada? Nossa disciplina é de Algoritmos e Estrutura de Dados, e não de linguagem

Leia mais

A Linguagem Pascal e o Ambiente de Programação Dev-Pascal. Introdução à Ciência da Computação I

A Linguagem Pascal e o Ambiente de Programação Dev-Pascal. Introdução à Ciência da Computação I A Linguagem Pascal e o Ambiente de Programação Dev-Pascal Introdução à Ciência da Computação I Março/2004 Introdução (1 de 3) Homenagem a Blaise Pascal, filósofo e matemático do século XVII. Desenvolvida

Leia mais

Desenvolvendo Websites com PHP

Desenvolvendo Websites com PHP Desenvolvendo Websites com PHP Aprenda a criar Websites dinâmicos e interativos com PHP e bancos de dados Juliano Niederauer 19 Capítulo 1 O que é o PHP? O PHP é uma das linguagens mais utilizadas na Web.

Leia mais

Processadores BIP. Conforme Morandi et al (2006), durante o desenvolvimento do BIP, foram definidas três diretrizes de projeto:

Processadores BIP. Conforme Morandi et al (2006), durante o desenvolvimento do BIP, foram definidas três diretrizes de projeto: Processadores BIP A família de processadores BIP foi desenvolvida por pesquisadores do Laboratório de Sistemas Embarcados e Distribuídos (LSED) da Universidade do Vale do Itajaí UNIVALI com o objetivo

Leia mais

CONVENÇÃO DE CÓDIGO JAVA

CONVENÇÃO DE CÓDIGO JAVA CONVENÇÃO DE CÓDIGO JAVA Eligiane Ceron - Abril de 2012 Versão 1.0 Conteúdo Considerações iniciais... 2 Introdução... 2 Extensão de arquivos... 2 Arquivos de código Java... 2 Comentários iniciais... 2

Leia mais

Manual SAGe Versão 1.2 (a partir da versão 12.08.01)

Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Submissão de Relatórios Científicos Sumário Introdução... 2 Elaboração do Relatório Científico... 3 Submissão do Relatório Científico... 14 Operação

Leia mais

Aula 2 Modelo Simplificado de Computador

Aula 2 Modelo Simplificado de Computador Aula 2 Modelo Simplificado de Computador Um computador pode ser esquematizado de maneira bastante simplificada da seguinte forma: Modelo Simplificado de Computador: Memória Dispositivo de Entrada Processador

Leia mais

ULA Sinais de Controle enviados pela UC

ULA Sinais de Controle enviados pela UC Solução - Exercícios Processadores 1- Qual as funções da Unidade Aritmética e Lógica (ULA)? A ULA é o dispositivo da CPU que executa operações tais como: Adição Subtração Multiplicação Divisão Incremento

Leia mais

Aula 4 Pseudocódigo Tipos de Dados, Expressões e Variáveis

Aula 4 Pseudocódigo Tipos de Dados, Expressões e Variáveis 1. TIPOS DE DADOS Todo o trabalho realizado por um computador é baseado na manipulação das informações contidas em sua memória. Estas informações podem ser classificadas em dois tipos: As instruções, que

Leia mais

&XUVRGH,QWURGXomRDR (GLWRUGH3ODQLOKDV([FHO

&XUVRGH,QWURGXomRDR (GLWRUGH3ODQLOKDV([FHO Universidade Federal de Viçosa Departamento de Informática &XUVRGH,QWURGXomRDR (GLWRUGH3ODQLOKDV([FHO Flaviano Aguiar Liziane Santos Soares Jugurta Lisboa Filho (Orientador) PROJETO UNESC@LA Setembro de

Leia mais

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP) Hardware (Nível 0) Organização O AS/400 isola os usuários das características do hardware através de uma arquitetura de camadas. Vários modelos da família AS/400 de computadores de médio porte estão disponíveis,

Leia mais

Algoritmo. Linguagem natural: o Ambígua o Imprecisa o Incompleta. Pseudocódigo: o Portugol (livro texto) o Visualg (linguagem) Fluxograma

Algoritmo. Linguagem natural: o Ambígua o Imprecisa o Incompleta. Pseudocódigo: o Portugol (livro texto) o Visualg (linguagem) Fluxograma Roteiro: Conceitos básicos de algoritmo, linguagem, processador de linguagem e ambiente de programação; Aspectos fundamentais da organização e do funcionamento de um computador; Construções básicas de

Leia mais

CISC RISC Introdução A CISC (em inglês: Complex Instruction Set Computing, Computador com um Conjunto Complexo de Instruções), usada em processadores Intel e AMD; suporta mais instruções no entanto, com

Leia mais

Curso: Técnico de Informática Disciplina: Redes de Computadores. 1- Apresentação Binária

Curso: Técnico de Informática Disciplina: Redes de Computadores. 1- Apresentação Binária 1- Apresentação Binária Os computadores funcionam e armazenam dados mediante a utilização de chaves eletrônicas que são LIGADAS ou DESLIGADAS. Os computadores só entendem e utilizam dados existentes neste

Leia mais

Algoritmos com VisuAlg

Algoritmos com VisuAlg Algoritmos com VisuAlg Prof Gerson Volney Lagemann Depto Eng de Produção e Sistemas UDESC - CCT Algoritmos com VisuAlg Introdução A linguagem VisuAlg é simples, seu objetivo é disponibilizar um ambiente

Leia mais

QualiQuantiSoft Versão 1.3c

QualiQuantiSoft Versão 1.3c QualiQuantiSoft Versão 1.3c Qualiquantisoft v1.3c Pág.: 1/15 Índice Apresentação do programa... 3 Funções operacionais do programa... 3 Itens de menu... 6 Teclas de atalho... 6 Instrumento de Análise de

Leia mais

Programação Básica em Arduino Aula 2

Programação Básica em Arduino Aula 2 Programação Básica em Arduino Aula 2 Execução: Laboratório de Automação e Robótica Móvel Variáveis são lugares (posições) na memória principal que servem para armazenar dados. As variáveis são acessadas

Leia mais

Introdução às Linguagens de Programação

Introdução às Linguagens de Programação Introdução às Linguagens de Programação Histórico de Linguagens de Programação O computador não faz nada sozinho Precisamos informar, de forma clara, como ele deve executar as tarefas Ou seja, o computador

Leia mais

Componentes da linguagem C++

Componentes da linguagem C++ Componentes da linguagem C++ C++ é uma linguagem de programação orientada a objetos (OO) que oferece suporte às características OO, além de permitir você realizar outras tarefas, similarmente a outras

Leia mais

Algoritmos Estruturas Seqüenciais. José Gustavo de Souza Paiva

Algoritmos Estruturas Seqüenciais. José Gustavo de Souza Paiva Algoritmos Estruturas Seqüenciais José Gustavo de Souza Paiva 1 Introdução Objetivo básico da computação auxiliar os seres humanos em trabalhos repetitivos e braçais, diminuindo i i d esforços e economizando

Leia mais

Microsoft Access XP Módulo Um

Microsoft Access XP Módulo Um Microsoft Access XP Módulo Um Neste primeiro módulo de aula do curso completo de Access XP vamos nos dedicar ao estudo de alguns termos relacionados com banco de dados e as principais novidades do novo

Leia mais

CURSO DE PROGRAMAÇÃO EM JAVA

CURSO DE PROGRAMAÇÃO EM JAVA CURSO DE PROGRAMAÇÃO EM JAVA Introdução para Iniciantes Prof. M.Sc. Daniel Calife Índice 1 - A programação e a Linguagem Java. 1.1 1.2 1.3 1.4 Linguagens de Programação Java JDK IDE 2 - Criando o primeiro

Leia mais

Conceitos básicos da linguagem C

Conceitos básicos da linguagem C Conceitos básicos da linguagem C 2 Em 1969 Ken Thompson cria o Unix. O C nasceu logo depois, na década de 70. Dennis Ritchie, implementou-o pela primeira vez usando o sistema operacional UNIX criado por

Leia mais

O Processo de Programação

O Processo de Programação Programação de Computadores I Aula 04 O Processo de Programação José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/23 Algoritmo Um algoritmo é uma seqüência de

Leia mais

Arquitetura de Rede de Computadores

Arquitetura de Rede de Computadores TCP/IP Roteamento Arquitetura de Rede de Prof. Pedro Neto Aracaju Sergipe - 2011 Ementa da Disciplina 4. Roteamento i. Máscara de Rede ii. Sub-Redes iii. Números Binários e Máscara de Sub-Rede iv. O Roteador

Leia mais

Organização e Arquitetura de Computadores I

Organização e Arquitetura de Computadores I Organização e Arquitetura de Computadores I Caminho de Dados Slide 1 Sumário Introdução Convenções Lógicas de Projeto Construindo um Caminho de Dados O Controle da ULA Projeto da Unidade de Controle Principal

Leia mais

Análises Geração RI (representação intermediária) Código Intermediário

Análises Geração RI (representação intermediária) Código Intermediário Front-end Análises Geração RI (representação intermediária) Código Intermediário Back-End Geração de código de máquina Sistema Operacional? Conjunto de Instruções do processador? Ambiente de Execução O

Leia mais

Criando Quiz com BrOffice.impress

Criando Quiz com BrOffice.impress Criando Quiz com BrOfficeimpress A ferramenta de apresentação possibilita o desenvolvimento de várias atividades interativas como: Sete erros Quiz (Perguntas/Respostas), Colocar em ordem objetos, alfabeto,

Leia mais

Algoritmos Computacionais ( Programas )

Algoritmos Computacionais ( Programas ) Algoritmos Computacionais ( Programas ) A partir deste tópico, consideramos a utilização do universo Computacional na solução de problemas. Para tanto devemos lembrar que a transposição de problemas do

Leia mais

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

MC102 Algoritmos e programação de computadores Aula 3: Variáveis MC102 Algoritmos e programação de computadores Aula 3: Variáveis Variáveis Variáveis são locais onde armazenamos valores na memória. Toda variável é caracterizada por um nome, que a identifica em um programa,

Leia mais

Introdução a Informática. Prof.: Roberto Franciscatto

Introdução a Informática. Prof.: Roberto Franciscatto Introdução a Informática Prof.: Roberto Franciscatto APRESENTAÇÃO Os computadores chegaram aos diversos níveis das organizações Nestes contexto: Que linguagem entendem? Que produtos podem usar? Dúvidas

Leia mais

Introdução à Arquitetura de Computadores

Introdução à Arquitetura de Computadores 1 Introdução à Arquitetura de Computadores Hardware e software Organização de um computador: Processador: registradores, ALU, unidade de controle Memórias Dispositivos de E/S Barramentos Linguagens de

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Aula 3 Software Prof.: Edilberto M. Silva http://www.edilms.eti.br SO - Prof. Edilberto Silva Barramento Sistemas Operacionais Interliga os dispositivos de E/S (I/O), memória principal

Leia mais