• Nenhum resultado encontrado

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
107
0
0

Texto

(1)

UNIVERSIDADE DO VALE DO ITAJAÍ

CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR

CURSO DE CIÊNCIA DA COMPUTAÇÃO

Bipide: AMBIENTE DE DESENVOLVIMENTO INTEGRADO PARA A

ARQUITETURA DOS PROCESSADORES BIP

Área de Compiladores

por

Paulo Viníccius Vieira

André Luis Alice Raabe, Dr.

Orientador

Cesar Albenes Zeferino, Dr.

Co-orientador

(2)

UNIVERSIDADE DO VALE DO ITAJAÍ

CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR

CURSO DE CIÊNCIA DA COMPUTAÇÃO

Bipide: AMBIENTE DE DESENVOLVIMENTO INTEGRADO PARA A

ARQUITETURA DOS PROCESSADORES BIP

Área de Compiladores

por

Paulo Viníccius Vieira

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é Luis Alice Raabe, Dr.

(3)

ii

DEDICATÓRIA

A todos que contribuíram para o desenvolvimento deste trabalho.

(4)

iii

AGRADECIMENTOS

A minha avó, pelo amor que tem por mim, por me educar e fazer com que eu me tornasse o que sou. E mesmo sem saber direito o que eu fazia e o que eu passei nestes últimos meses, torcia por mim.

A minha mãe, que mesmo a distancia, sempre esteve ao meu lado, me amando, motivando e me apoiando. Por ser minha mãe, amiga e confidente.

Ao meu avô, que mesmo não estando mais presente, me deu lições que jamais esquecerei. Ao meu orientador e professor André Luis Alice Raabe, pelo incentivo, confiança e ensinamentos. Simplicidade e objetividade no meu curto tempo disponível para orientação.

Ao meu co-orientador e professor César Albenes Zeferino, pelo incentivo, confiança, ensinamentos e por possibilitar meu ingresso na Pesquisa.

Aos meus professores, pelos ensinamentos passados nestes anos.

Aos meus amigos de faculdade, LSED e L2S que me acompanharam por estes anos de aprendizagem e trabalho.

Ao meu amigo Maicon, que acompanhou de perto meu trabalho e sempre me ajudou.

Ao meu amigo e Ivan, pela compreensão ao me liberar algumas horas de trabalho para desenvolver este projeto.

(5)

SUMÁRIO

LISTA DE ABREVIATURAS ... vi

LISTA DE FIGURAS ... vii

LISTA DE TABELAS ... viii

RESUMO ... ix

ABSTRACT ... x

1

INTRODUÇÃO ... 11

1.1

PROBLEMATIZAÇÃO ... 12

1.1.1

Formulação do Problema ... 12

1.1.2

Solução Proposta ... 12

1.2

OBJETIVOS ... 13

1.2.1

Objetivo Geral ... 13

1.2.2

Objetivos Específicos ... 13

1.3

METODOLOGIA ... 14

1.4

ESTRUTURA DO TRABALHO ... 14

2

FUNDAMENTAÇÃO TEÓRICA ... 15

2.1

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES ... 15

2.1.1

Arquitetura ... 15

2.1.2

Organização ... 18

2.1.3

Processadores ... 20

2.1.4

Microcontroladores ... 21

2.2

PROCESSADORES BIP ... 22

2.2.1

BIP I ... 23

2.2.2

BIP II ... 25

2.2.3

Organização dos Processadores BIP I e BIP II ... 27

2.3

SIMULADORES DE ARQUITETURA ... 28

2.3.1

NeanderWin ... 28

2.3.2

Simularq ... 30

2.3.3

4AC ... 32

2.3.4

VLIW-DLX ... 33

2.3.5

R10k ... 34

2.3.6

MipsIt ... 36

2.3.7

Comparação entre os Simuladores Analisados ... 37

2.4

COMPILADORES ... 38

2.4.1

Fases de um Compilador ... 39

2.4.2

Ferramentas para Construção de Compiladores ... 42

2.5

WINDOWS PRESENTATION FOUNDATION ... 43

(6)

v

3

DESENVOLVIMENTO ... 47

3.1

ESPECIFICAÇÃO ... 47

3.1.1

Requisitos Funcionais ... 47

3.1.2

Requisitos Não Funcionais ... 48

3.1.3

Regras de Negócio ... 48

3.1.4

Modelo de Casos de Uso ... 48

3.2

DEFINIÇÃO DA LINGUAGEM ... 51

3.2.1

Diretrizes para definição do subconjunto da linguagem Portugol ... 52

3.3

IMPLEMENTAÇÃO ... 54

3.3.1

Implementação do compilador ... 54

3.3.2

Implementação do simulador ... 59

3.3.3

Integração do compilador e demais componentes do ambiente ... 62

3.3.4

Visão geral das funcionalidades e dos aspectos da interface gráfica ... 65

3.3.5

Verificação ... 70

4

CONCLUSÕES ... 73

REFERÊNCIAS BIBLIOGRÁFICAS ... 76

A. GRAMÁTICA PORTUGOL DEFINIDA NO ANTLR ... 81

B. CONJUNTO DE INSTRUÇÕES UTILIZADAS PARA

VALIDAÇÃO DO SIMULADOR ... 83

C. PROGRAMAS PORTUGOL UTILIZADOS PARA VALIDAÇÃO

DO COMPILADOR... 86

D. QUESTIONÁRIO PARA AVALIAÇÃO DO AMBIENTE BIPIDE

PELOS USUÁRIOS ... 91

(7)

LISTA DE ABREVIATURAS

ACC Accumulator

ANTLR ANother Tool for Language Recognition ASIP Application-Specific Instruction-set Processor BIP Basic Instruction-set Processor

BNF Bakus-Naur Form

CI Circuito Integrado

CISC Complex Instruction Set Computers CPU Central Processing Unit

E/S Entrada/Saída

IDE Integrated Development Environment

IR Instruction Register

LSED Laboratório de Sistemas Embarcados e Distribuídos MIPS Microprocessor without Interlocked Pipeline Stages OCR Optical Character Recognition

PC Program Counter

PIC Programmable Intelligent Computer

RAM Random Access Memory

RI Registrador de Instruções

RISC Reduced Instruction Set Computer

ROM Read Only Memory

TOS Top of Stack

UCP Unidade Central de Processamento

ULA Unidade Lógica Aritmética

UML Unified Modeling Language

UNIVALI Universidade do Vale do Itajaí VLIW Very Long Instruction Word WPF Windows Presentation Foundation

XAML eXtensible Application Markup Language

XML eXtensible Markup Language

(8)

LISTA DE FIGURAS

Figura 1. Fonte dos operando nas diferentes classes de conjunto de instruções. ... 16

Figura 2. Arquitetura de Memória ... 20

Figura 3. Organização do processador BIP I ... 27

Figura 4. Organização do Processador BIP II ... 28

Figura 5. Tela Principal do Sistema NeanderWin ... 30

Figura 6. Tela Principal do Simularq ... 31

Figura 7. Detalhe de um multiplexador simulado pelo Simularq ... 32

Figura 8. Tela Principal do 4AC ... 33

Figura 9. Tela Principal do VLIW-DLX ... 34

Figura 10. Tela Principal do R10k ... 35

Figura 11. Simulação de uma arquitetura pipeline no MipsIt ... 36

Figura 12. Compilador ... 39

Figura 13. Árvore sintática da expressão 3*a + (b-2) ... 40

Figura 14. Código fonte na linguagem C# para exibir uma janela Windows ... 44

Figura 15. Código fonte na linguagem XAML para exibir uma janela Windows ... 45

Figura 16. Janelas criadas com as linguagens C# e WPF: (a) C#; (b) WPF ... 45

Figura 17. Camada de interface e lógica de aplicação em WPF ... 46

Figura 18. Modelo de Casos de Uso ... 49

Figura 19. Estrutura do programa Portugol ... 51

Figura 20. Mensagem de erro gerada pelo ANTLR ... 57

Figura 21. Ações semânticas para inserção de nome do comando nas mensagens de erro ... 58

Figura 22. Implementação do Método GetErrorMessage para tratamento de erros gerados ... 58

Figura 23. Visão geral da ferramenta Expression Blend 2 ... 59

Figura 24. Implementação de uma animação através do Expression Blend 2 ... 60

Figura 25. Início da animação de uma instrução ADD ... 61

Figura 26. Sequência da animação de uma instrução ADD ... 62

Figura 27. Final da animação de uma instrução ADD ... 62

Figura 28. Visão simplificada das classes onde são armazenados os códigos do Programa ... 64

Figura 29. Interface do módulo de programação ... 65

Figura 30. Interface do módulo de simulação ... 67

Figura 31. Relação de elementos na interface do módulo de simulação ... 69

(9)

LISTA DE TABELAS

Tabela 1. Arquitetura do BIP I ... 24

Tabela 2. Conjunto de instruções do BIP I ... 24

Tabela 3. Arquitetura do BIP II ... 25

Tabela 4. Conjunto de instruções do BIP II ... 26

Tabela 5. Funcionalidades dos sistemas analisados ... 37

Tabela 6. Lista de símbolos da gramática Portugol ... 53

Tabela 7. Ações Semânticas para a geração de declaração e definição de variáveis ... 55

Tabela 8. Ações Semânticas para a geração de desvios condicionais ... 56

Tabela 9. Ações Semânticas para a geração de desvios condicionais ... 57

Tabela 10. Características do Expression Blend 2 em relação ao Visual Studio 2008 ... 60

Tabela 11. Programa utilizado para validar uma instrução de laço de repetição ... 71

Tabela 12. Conjunto de programas utilizados para validação do simulador ... 83

(10)

RESUMO

VIEIRA, Paulo Viníccius. Bipide - Ambiente de Desenvolvimento Integrado para a

Arquitetura dos Processadores BIP. Itajaí, 2009. 107f. 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í, 2009.

O ensino de conceitos introdutórios de programação apresenta um nível de abstração que prejudica o aprendizado de alunos que possuem dificuldades em lidar com o raciocínio lógico necessário ao entendimento da lógica de programação. Pensando nesta dificuldade, uma família de processadores, denominada BIP – Basic Instruction-set Processor, foi desenvolvida visando à integração interdisciplinar e o apoio ao ensino em disciplinas de fases iniciais do curso de Ciência da Computação. Neste contexto este trabalho apresenta um ambiente de desenvolvimento integrado denominado Bipide, que possibilita o desenvolvimento, execução e simulação de programas em linguagem Portugol, relacionando-os à arquitetura dos processadores da família BIP. Com isto, disponibiliza-se uma ferramenta de apoio ao ensino das disciplinas de Algoritmos e Programação que auxiliará na redução da abstração envolvida em conceitos fundamentais da lógica de programação e permitirá coletar evidências empíricas sobre a vantagem em reduzir o nível de abstração envolvido nesta aprendizagem. Este trabalho apresenta uma revisão de fundamentos associados à Arquitetura e Organização de Computadores e ao desenvolvimento de compiladores, assim como descreve o projeto e a implementação do ambiente desenvolvido, o qual se encontra pronto para ser utilizado em experimentos em sala de aula, pois não foram identificados erros nos testes de conformidade realizados.

Palavras-chave: Simuladores de Arquitetura de Computadores. Compiladores. Aprendizagem de

(11)

ABSTRACT

The teaching of introductory programming concepts involves a high level of abstraction that creates difficulties for students who are dealing with initial programming logic. To approach this problem, a family of processors, called BIP - Basic Instruction-set Processor, was developed to support the integration and interdisciplinary teaching in courses of early stages on Computer Science. Therefore, this paper presents an integrated development environment (IDE) called Bipide, which enables the development, implementation and simulation of programs written in structured Portuguese (called Portugol) linking them to the processor architecture of the BIP family. The IDE provides a tool to support the teaching of subjects of introductory programming reducing the abstraction involved in fundamental concepts of programming logic. It will also serve as an instrument to collect empirical evidence on the advantage to reduce the level of abstraction involved in this type of learning. This paper presents a review of fundamentals associated with the Computer Architecture and Organization and compilers development, and describes the design and implementation of the IDE. The system is ready to be used in experiments in the classroom.

(12)

1

INTRODUÇÃO

As disciplinas da área de Arquitetura e Organização de Computadores são fundamentais na formação de alunos dos cursos de Ciência da Computação e de Engenharia da Computação. Estas disciplinas, além de fornecer os conhecimentos básicos para a compreensão dos conceitos apresentados durante o curso, fornecem subsídios fundamentais para a aprendizagem e compreensão da lógica de programação.

Considerando esse último aspecto, é fato amplamente conhecido que alunos apresentam dificuldades na aprendizagem de conceitos de algoritmos e programação, em especial nas fases iniciais do curso (CARBONE; KAASBOLL, 1998; MENEZES; NOBRE, 2002; PIMENTEL et al., 2003; GOOD; BRNA, 2004; KHALIFE, 2006). Essa dificuldade está relacionada, entre outros aspectos, à ausência de afinidade com o raciocínio lógico formal que é o fundamento para a capacidade de abstração dos alunos. Nesse sentido, o estudo da arquitetura do computador cria a possibilidade de estabelecer relações dos conceitos de programação com aspectos concretos do hardware, reduzindo assim a necessidade de abstração.

No entanto, identifica-se uma falta de sincronia nos currículos tradicionais em que o estudo da arquitetura e da organização do computador ocorre depois do ensino da programação. Para contornar esse problema, em muitos cursos costuma-se apresentar algumas noções básicas de arquitetura e organização de computadores no primeiro ano do curso. Essa abordagem normalmente apresenta dois problemas: (i) a falta de uma articulação adequada entre os professores das disciplinas introdutórias a fim de estabelecer uma sincronia na apresentação dos conteúdos que possa beneficiar a aprendizagem de programação; e (ii) a limitação dos modelos utilizados para a apresentação dos conceitos básicos de arquitetura (MORANDI et al., 2006).

Uma iniciativa para minimizar esses problemas foi desenvolvida por pesquisadores do Laboratório de Sistemas Embarcados e Distribuídos da Universidade do Vale do Itajaí. Trata-se de uma família de processadores com um conjunto de instruções básicas, denominada BIP (Basic Instruction-set Processor), projetada visando auxiliar o aprendizado de conceitos de arquitetura e organização de computadores por alunos de fases iniciais de cursos de graduação em Computação e promover a integração interdisciplinar (MORANDI; RAABE; ZEFERINO, 2006). O objetivo é que esses processadores possam servir de referência para a apresentação dos conceitos básicos necessários ao melhor entendimento das abstrações utilizadas nas disciplinas da área de Algoritmos

(13)

12

e Programação e que também possam ser explorados posteriormente em disciplinas afins, como Circuitos Digitais, Sistemas Operacionais e Compiladores.

1.1

PROBLEMATIZAÇÃO

1.1.1

Formulação do Problema

Acredita-se que introduzir conceitos básicos de Arquitetura e Organização de Computadores aos alunos auxilia na redução da abstração envolvida em conceitos de programação, como variáveis, atribuições, operações aritméticas, desvios e laços de repetição.

Segundo Borges e Silva (2006), o uso de simuladores que permitam a compreensão do funcionamento do processador é fundamental para o ensino adequado da arquitetura de computadores e, consequentemente, pode influenciar positivamente na aprendizagem de alunos que em geral apresentam problemas em lidar com abstrações.

No entanto, os simuladores disponíveis para ensino costumam apresentar uma interface de usuário pouco elaborada e com poucos recursos operacionais, o que ocasiona, mesmo em arquiteturas mais simples, dificuldade em se trabalhar com eles por parte dos alunos. Alguns simuladores necessitam que a codificação do programa seja em linguagem de máquina; outros ainda só suportam a execução através de linha de comando (BORGES; SILVA, 2006; BORUNDA; BREWER; ERTEN, 2006).

1.1.2

Solução Proposta

A solução proposta neste trabalho consiste no projeto e implementação de um ambiente de desenvolvimento integrado1 (IDE - Integrated Development Environment) cujo objetivo é auxiliar na utilização dos processadores BIP na aprendizagem de programação.

Segundo Myatt (2007), a utilização de IDEs oferece benefícios que podem favorecer a redução do tempo de aprendizagem. Entre os benefícios disponibilizados destaca-se: (i) interface

1

IDEs são ambientes de desenvolvimento que oferecem ferramentas de apoio ao desenvolvimento de software e integram serviços que facilitam este processo (MYATT, 2007).

(14)

13

gráfica de desenvolvimento; (ii) integração com o compilador; (iii) facilidade para análise e teste de código; e (iv) facilidade para depuração de código através de execução passo a passo,

O ambiente desenvolvido, denominado Bipide (BIP - Basic Instruction-set Processor – IDE - Integrated Development Environment), possibilita o desenvolvimento de programas em linguagem Portugol2. Estes programas poderão ser compilados e simulados através deste ambiente, onde será exibida a linguagem assembly resultante do processo de compilação e a simulação destes programas sobre a arquitetura dos processadores BIP.

A utilização da linguagem Portugol deve-se ao fato da mesma ser constantemente utilizada nas aulas inicias das disciplinas de Algoritmos e Programação. Esta linguagem utiliza comandos em português, o que facilita o aprendizado da lógica de programação e habitua o aluno iniciante com o formalismo da programação (ESMIN, 2000 apud MIRANDA, 2004).

1.2

OBJETIVOS

1.2.1

Objetivo Geral

O objetivo geral deste trabalho é a construção de um ambiente de desenvolvimento integrado que possibilite a criação de programas e ilustre a execução destes, relacionando-os aos aspectos da arquitetura dos processadores BIP I e BIP II.

1.2.2

Objetivos Específicos

Os objetivos específicos deste trabalho são:

• Consolidar conceitos sobre compiladores;

• Consolidar conceitos de arquitetura e organização de computadores;

• Estudar a arquitetura e o conjunto de instruções dos processadores da família BIP;

• Implementar e disponibilizar um ambiente de desenvolvimento integrado para programação em linguagem Portugol e visualização do assembly e do estado dos componentes dos processadores BIP I e BIP II;

2

(15)

14

• Testar e verificar o sistema desenvolvido; e

• Documentar e divulgar o projeto.

1.3

METODOLOGIA

A metodologia adotada no desenvolvimento deste trabalho foi dividida em quatro partes:

• Estudo: Nesta etapa foram realizados estudos a fim de adquirir o conhecimento necessário sobre os conceitos e tecnologias utilizadas, além de uma pesquisa sobre a característica de ferramentas similares. Os recursos utilizados nesta etapa foram livros, artigos publicados e manuais;

• Projeto: Nesta etapa foi realizada a especificação do sistema, através do levantamento de requisitos e definição de casos de uso. Foi definida também a gramática a ser utilizada no compilador utilizado;

• Revisão: Foi realizada uma revisão do projeto inicial, levando em consideração as questões levantadas durante a apresentação do TCC I;

• Desenvolvimento: Esta etapa é caracterizada pela implementação do ambiente baseada no projeto realizado, compreendendo o desenvolvimento de um compilador, simulador, ajuda e interface do ambiente.

• Avaliação/Verificação: Nesta etapa foram realizados testes a fim de eliminar possíveis erros existentes e validar a ferramenta; e

• Documentação: Consiste na redação deste trabalho, fundamentando e detalhando o desenvolvimento do ambiente Bipide. Esta etapa também inclui a redação de artigo científico divulgando o projeto.

1.4

ESTRUTURA DO TRABALHO

Este documento esta estruturado em três capítulos. O Capítulo 1, Introdução, apresenta uma visão geral sobre o tema abordado no trabalho bem como seus objetivos. O Capítulo 2, Fundamentação Teórica, apresenta o resultado da etapa de estudo, com uma revisão bibliográfica dos temas envolvidos no trabalho. No Capítulo 3, Projeto, é apresentado o projeto do ambiente, incluindo sua especificação e a definição de linguagem do compilador desenvolvido. O capítulo 4 detalha a implementação da ferramenta e apresenta suas principais funcionalidades.

(16)

2

FUNDAMENTAÇÃO TEÓRICA

Neste capítulo é apresentada a revisão bibliográfica sobre os temas envolvidos no projeto. A Seção 2.1 apresenta uma revisão sobre Arquitetura e Organização de Computadores. Na Seção 2.2 é apresentado um levantamento das características dos processadores BIP. A seção 2.3 apresenta uma breve descrição sobre simuladores de arquitetura e apresenta os simuladores analisados durante o estudo de ferramentas similares. Na Seção 2.4 é apresentada uma revisão sobre compiladores e apresenta a ferramenta ANTLR (ANother Tool for Language Recognition), utilizada para o desenvolvimento do compilador. Finalizando este capítulo, a Seção 2.5 apresenta uma breve descrição da tecnologia WPF (Windows Presentation Foundation), uma das tecnologias utilizadas para o desenvolvimento do ambiente.

2.1

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES

Nesta seção são apresentados os conceitos básicos sobre arquitetura e organização de computadores necessários ao desenvolvimento do presente trabalho.

2.1.1

Arquitetura

Segundo Stallings (2005), o termo arquitetura de computador refere-se principalmente aos atributos que têm impacto direto sobre a execução lógica de um sistema e que são visíveis ao programador como: (i) conjunto de instruções; (ii) modos de endereçamento; (iii) memória de programa e dados; (iv) registradores; (v) portas de entrada e saída; e (vi) interrupções.

2.1.1.1 Conjunto de Instruções

Uma instrução indica ao processador uma sequência de micro-operações que deverá ser executada (WEBER, 2004).

De acordo com seu propósito e formato, as instruções podem ser classificadas como: (i) instruções de transferência de dados; (ii) instruções aritméticas e lógicas; e (iii) instruções de desvio (condicional ou incondicional) e de teste (ou de comparação). Um conjunto de instruções refere-se ao conjunto de todas as instruções reconhecidas por um computador (WEBER, 2004).

(17)

16

Segundo Hennessy e Patterson (2003), a forma do armazenamento interno do processador tem influência sobre o conjunto de instruções, já que os operandos das instruções podem variar de acordo com o tipo de armazenamento. Assim, têm-se os seguintes tipos de arquitetura:

• Arquitetura de pilha: Armazenamento baseado em pilha. A arquitetura possui um registrador TOS (Top of Stack) que armazena o topo da pilha. O processamento é realizado com os dois operandos retirados do topo da pilha e o resultado é novamente armazenado no topo da pilha (Figura 1 (a));

• Arquitetura de acumulador: Armazenamento baseado em acumulador. O acumulador é um registrador utilizado como um dos operandos da operação realizada pela ULA (Unidade Lógica Aritmética). Após o cálculo o resultado é armazenado novamente no acumulador, sendo utilizado para a próxima operação a ser realizada (Figura 1 (b)); e

• Arquitetura de registradores de uso real: Armazenamento baseado em banco de registradores. Os operandos são armazenados em registradores ou posições da memória. A Figura 1 (c) ilustra uma arquitetura onde um dos operandos da ULA está armazenado em memória; na Figura 1 (d) são utilizados somente registradores como operandos fonte para a ULA e as variáveis são carregadas e atualizadas por meio de instruções de transferência (load-store) – Figura 1 (d).

Figura 1. Fonte dos operando nas diferentes classes de conjunto de instruções. Fonte: Adaptado de Hennessy e Patterson (2003).

(18)

17

De acordo com a quantidade e tipo de instruções suportadas, os computadores podem ser classificados em duas classes:

• Máquinas CISC (Complex Instruction Set Computers – Computador com um Conjunto Complexo de Instruções): os computadores classificados como CISC possuem um conjunto diversificado de instruções;

• Máquinas RISC (Reduced Instruction Set Computer – Computador com um Conjunto Reduzido de Instruções): possuem um conjunto reduzido de instruções e apresentam como características básicas: (i) um conjunto limitado de instruções com formato fixo; (ii) um grande número de registradores; e (iii) enfoque na otimização do uso do pipeline3 de instruções (STALLINGS, 2005).

A principal diferença entre as duas classes é que máquinas RISC são arquiteturas de

load-store - Figura 1 (c), já em máquinas CISC as instruções podem ler ou gravar seus resultados

diretamente na memória - Figura 1 (d) (CARTER, 2003).

2.1.1.2 Registradores

Em um processador existem diversos registradores, sendo que alguns destes devem ser de conhecimento do programador, denominados de registradores especiais. Weber (2004) cita alguns dos registradores especiais encontrados em arquiteturas de computadores:

• Apontador de Instruções: contém o endereço da próxima instrução a ser buscada na memória e executada. Normalmente são conhecidos como PC (Program Counter);

• Registrador de Instruções (RI): armazena o código da instrução que está sendo executada;

• Registrador de Estado (STATUS): armazena informações a respeito dos resultados da ULA.

3

Pipeline é uma técnica de hardware que permite a busca e execução de novas instruções antes que a execução anterior seja terminada, acelerando o processo de execução de instruções (STALLINGS, 2005).

(19)

18

2.1.1.3 Interrupções

O mecanismo de interrupção presente nos processadores possui três funções principais: (i) permitir que dispositivos externos interrompam o processamento atual do processador para atender sua necessidade; (ii) liberar o processador da tarefa de pesquisar todos os dispositivos verificando se algum necessita de atendimento; e (iii) permitir que o processador execute operações de outro programa enquanto o programa atual aguarda por uma resposta informando que o processador concluiu a tarefa e, então, possa voltar a processar o mesmo programa (WEBER, 2004; STALLINGS, 2005).

2.1.1.4 Portas de Entrada/Saída

As portas de Entrada/Saída (E/S) são os meios físicos que permitem as atividades de troca de informação entre o processador e o meio externo. Através das portas de E/S o processador pode trocar informações com o usuário ou se comunicar com outros dispositivos como, por exemplo, dispositivos de armazenamento (WEBER, 2004).

2.1.2

Organização

O termo organização de computadores refere-se aos atributos que não são visíveis ao programador, ou seja, trata de como o processador é implementado e aborda blocos básicos como caminho de dados e unidade de controle (STALLINGS, 2005).

2.1.2.1 Caminho de Dados

O Hardware necessário para execução de uma instrução é formato pela unidade de execução e pelo banco de registradores. Essas unidades compõem o caminho de dados (WEBER, 2004).

A unidade de execução é composta por uma ou mais ULAs, registradores de uso geral e específicos interligados por um barramento. Ao ser executada na unidade de execução, uma instrução segue um ciclo chamado de ciclo de instrução. Este ciclo normalmente é formado pelas seguintes etapas (WEBER, 2004; STALLINGS, 2005):

• Busca de Instrução: nesta etapa, o registrador de instrução (RI) recebe a instrução da memória de instrução apontada pelo registrador PC e o registrador PC é atualizado para o endereço da próxima instrução;

(20)

19

• Decodificação: a instrução é decodificada pela unidade de controle para definir qual instrução deve ser executada;

• Execução: Nesta etapa, os operandos são carregados do banco de registradores e, de acordo com a operação identificada na etapa de decodificação, é realizado o cálculo pela ULA. Após executado, o resultado da operação é armazenado no banco de registradores.

2.1.2.2 Unidade de Controle

A unidade de controle gera sinais de controle responsáveis por gerenciar o fluxo interno de dados, a memória e a comunicação com os dispositivos de entrada e saída. Cada sinal de controle comanda uma micro-operação, como por exemplo, uma ativação da memória ou a seleção de uma operação pela ULA, conforme a instrução atual (WEBER, 2004).

2.1.2.3 Memórias

O sistema de memória serve como um local para o armazenamento de dados e programa. A memória é dividida em “palavras”, que podem ser identificadas por um endereço único. Existem dois tipos básicos de memória: (i) ROM (Read Only Memory – Memória Apenas de Leitura), que permite acesso apenas para leitura de dados e normalmente é utilizada para armazenar o programa de inicialização; e (ii) RAM (Random Access Memory – Memória de Acesso Aleatório), que permite escrita e leitura de dados e pode ser utilizada para armazenar dados, programas e sistemas operacionais (CARTER, 2003; WEBER, 2004).

A memória de dados e a memória de instruções podem estar juntas em um mesmo espaço de endereçamento ou separadas. Quando as memórias utilizam o mesmo espaço de endereçamento, a arquitetura é referenciada como arquitetura de Princeton (ou de Von Neumann), conforme Figura 2 (a). Quando a memória de dados utiliza um espaço diferente da memória de instrução é referenciada como arquitetura de Harvard (Figura 2 (b)).

A arquitetura de Princeton pode resultar em hardware mais simples, enquanto a arquitetura de Harvard pode resultar em um desempenho melhor, pois permite o acesso simultâneo nas duas memórias (PREDKO, 1998).

(21)

20 Figura 2. Arquitetura de Memória

Fonte: Adaptado de Vahid e Givargis (2002).

2.1.3

Processadores

“A tecnologia de processadores envolve a arquitetura do mecanismo computacional usado para implementar uma funcionalidade desejada do sistema” (VAHID; GIVARGIS, 2002, p. 9).

Vahid e Givargis (2002) descrevem três tecnologias de processadores: (i) processador de propósito geral; (ii) processador de propósito único; e (iii) processador de aplicação específica.

2.1.3.1 Processador de Propósito Geral

Um processador de propósito geral é projetado para atender uma variedade de aplicações e para maximizar o numero de dispositivos vendidos (VAHID; GIVARGIS, 2002).

Também conhecidos como microprocessadores e CPU (Central Processing Unit – Unidade Central de Processamento (UCP)), os processadores de propósito geral apresentam características comuns como: (i) presença de uma memória de programa onde é armazenado um programa com funcionalidade desejada; (ii) caminho de dados genérico o suficiente para manipular uma variedade de computação; e (iii) possuem um banco de registradores grande e uma ou mais ULAs de propósito geral.

(22)

21

2.1.3.2 Processador de Propósito Único

Um processador de propósito único, também conhecido como processador dedicado, é um circuito digital projetado para executar um programa específico. A funcionalidade nesse tipo de processador é implementada diretamente no hardware e representa exatamente a funcionalidade desejada (VAHID; GIVARGIS, 2002; PEREIRA, 2008).

2.1.3.3 Processador de Aplicação Específica

Um processador de aplicação específica (ASIP - Application-Specific Instruction-set Processor) é um meio termo entre os dois processadores descritos anteriormente. Estes processadores são projetados para atender um conjunto de aplicações com características em comum através do acréscimo de unidades funcionais para operações comuns (VAHID; GIVARGIS, 2002).

2.1.4

Microcontroladores

Souza (2003, p. 21) descreve o microcontrolador como “um ‘pequeno’ componente eletrônico, dotado de uma ‘inteligência’ programável, utilizado no controle de processos lógicos”, onde a operação do sistema baseia-se nas operações lógicas que devem ser executadas.

Toda a lógica de operação é estruturada na forma de um programa e gravada dentro do microcontrolador, o que o torna programável. A ULA é responsável por todas as operações matemáticas e lógicas que são executadas no microcontrolador (SOUZA, 2003).

Os componentes de um microcontrolador podem ser construídos a partir de uma única pastilha de silício4 contendo todos os componentes necessários ao controle de um processo como memória de programa, memória de dados, portas de entrada/saída, etc. (STALLINGS, 2005; SOUZA, 2003). Para Souza (2003), esta é uma característica que diferencia microcontroladores de microprocessadores, pois estes últimos, apesar de possuírem uma ULA mais poderosa, não possuem todos os recursos em uma única pastilha.

4

(23)

22

2.2

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 de desenvolver uma série de processadores de arquitetura simplificada que auxiliassem no aprendizado de Arquitetura e Organização de Computadores por alunos de fases iniciais de cursos de graduação em Computação. Outro objetivo do BIP é permitir relacionar os conteúdos de programação com suas representações em hardware, provendo a base necessária para compreensão das abstrações adotadas nas disciplinas da área de Algoritmos e Programação (MORANDI et al., 2006).

Nesse contexto, ao buscar estabelecer uma relação entre a programação de alto nível e a sua representação em hardware, podem ser mencionadas as relações entre: (i) declaração de variável e alocação de memória; (ii) constantes e operandos imediatos; (iii) atribuição de variáveis e operações de acesso a memória; e (iv) operações aritméticas e a utilização de unidades de soma/subtração (MORANDI; RAABE; ZEFERINO, 2006).

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

• A arquitetura do processador deveria ser simples o suficiente para facilitar o entendimento do seu funcionamento e a sua construção a partir dos conceitos estudados na disciplina de circuitos digitais;

• A arquitetura deveria ser extensível; e

• As ferramentas de apoio desenvolvidas no contexto do projeto deveriam priorizar o uso de estruturas de linguagem compreendidas no primeiro ano do curso.

De acordo com estas diretrizes, foram definidos três modelos de processador (MORANDI; RAABE; ZEFERINO, 2006; PEREIRA, 2008):

• BIP I: com foco no suporte ao entendimento de conceitos como níveis de linguagem, constantes, variáveis, representação de dados e de instruções, conjuntos de instruções, programação em linguagem de montagem e geração de código em linguagem de máquina; e

(24)

23

• BIP II: extensão do BIP I, com foco na inclusão de suporte aos conceitos de estruturas de controle para desvios condicionais e incondicionais e laços de repetição.

• µBIP: estende a arquitetura das versões anteriores do BIP e acrescenta suporte a instruções de lógica booleana, deslocamento lógico, manipulação de vetores, instruções de controle, suporte a procedimentos e funcionalidades típicas de microcontroladores como, por exemplo, pinos de E/S e temporizador programável.

Como o foco deste trabalho é auxiliar o entendimento de conceitos básicos aprendidos nas fases iniciais do ensino de programação, é utilizado somente os modelos de arquitetura simplificada dos processadores BIP I e BIP II.

2.2.1

BIP I

O BIP I utiliza uma arquitetura baseada na arquitetura RISC do microcontrolador PIC (Programmable Intelligent Computer). Ele é uma máquina orientada a acumulador e não possui banco de registradores. Todas as operações de transferência e aritmética envolvem o acumulador e, em algumas operações aritméticas, é necessário buscar operandos posicionados na memória (MORANDI et al., 2006).

A arquitetura do BIP I possui um conjunto de instruções com poucos modos de endereçamento e todas as instruções são baseadas neste formato. Como pode ser visto na Tabela 1, o formato de instrução esta dividido em dois campos: 5 bits para o código de operação, o que permite implementar até 32 instruções; e 11 bits reservados para o operando, o que possibilita representar até 2048 posições de endereçamento ou qualquer constante com valores entre -1024 até +1023 (MORANDI; RAABE; ZEFERINO, 2006).

(25)

24 Tabela 1. Arquitetura do BIP I

Tamanho da palavra de dados 16 bits

Tipo de dados Inteiro de 16 bits com sinal: –32768 a +32767 Tamanho da palavra de instrução 16 bits

Formato de instrução 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Cód. Operação Operando

Modos de endereçamento Direto: o operando é um endereço da memória Imediato: o operando é uma constante

Registradores ACC: acumulador

IR: registrador de instrução PC: contador de programa

Classes de instrução Transferência (acesso à memória): STO, LD, LDI Aritmética: ADD, ADDI, SUB e SUBI

Controle: HLT Fonte: Adaptado de Morandi et al. (2006).

A arquitetura do BIP I inclui três registradores: PC, IR e ACC. O contador de programa (PC) aponta para o endereço da próxima instrução a ser executada. O registrador de instrução (IR – Instruction Register) armazena a instrução que está em execução. O acumulador (ACC – Accumulator) é utilizado para armazenamento de dados durante uma operação.

O conjunto de instruções do BIP I, conforme apresentado na Tabela 2, inclui uma instrução de controle, três instruções de transferência (duas de acesso à memória) e quatro instruções de aritmética. Em cada instrução, exceto na instrução Halt (HLT), o PC é incrementado em uma unidade no final do ciclo de execução da instrução. Na tabela, o termo Memory[operand]

representa uma variável armazenada na posição operand da memória de dados. Tabela 2. Conjunto de instruções do BIP I

Código da operação Instrução Operação Classe

00000 HLT Paralisa a execução Controle

00001 STO operand Memory[operand] ACC Transferência

00010 LD operand ACC Memory[operand] Transferência

00011 LDI operand ACC operand Transferência

00100 ADD operand ACC ← ACC + Memory[operand] Aritmética

00101 ADDI operand ACC ACC + operand Aritmética

00110 SUB operand ACC ACC – Memory[operand] Aritmética

00111 SUBI operand ACC ← ACC – operand Aritmética

01000 - 11111 Reservado para futuras gerações Fonte: Adaptado de Morandi et al. (2006).

(26)

25

Como pode ser observado na Tabela 2, O BIP I realiza operações básicas de soma e subtração com variáveis e constantes. Segundo MORANDI et al. (2006), apesar de limitada, esta arquitetura possibilita apresentar a implementação em hardware de diversas abstrações estudadas nas disciplinas da área de Algoritmos e Programação.

2.2.2

BIP II

Trata-se de uma extensão do BIP I e possui as mesmas características arquiteturais. Uma das mudanças realizadas na extensão do BIP I para o BIP II foi a inclusão da classe de instruções de desvio visando a implementação de desvios condicionais, incondicionais e laços de repetição (MORANDI; RAABE; ZEFERINO, 2006). O BIP II possui de três a quatro registradores: PC, ACC, STATUS e IR, conforme ilustrado na Tabela 3. Em uma das implementações apresentadas para este processador, o registrador PC assume as funcionalidades do registrador IR.

Tabela 3. Arquitetura do BIP II

Tamanho da palavra de dados 16 bits

Tipo de dados Inteiro de 16 bits com sinal: –32768 a +32767 Tamanho da palavra de instrução 16 bits

Formato de instrução 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Cód. Operação Operando

Modos de endereçamento Direto: o operando é um endereço da memória Imediato: o operando é uma constante

Registradores ACC: acumulador

IR: registrador de instrução PC: contador de programa

STATUS: registrador de estado com dois flags (Z e N) Classes de instrução Transferência (acesso à memória): STO, LD, LDI

Aritmética: ADD, ADDI, SUB e SUBI Controle: HLT

Desvio: BEQ, BNE, BGT, BGE, BLT, BLE e JMP Fonte: Adaptado de Morandi, Raabe e Zeferino (2006).

Para suportar as instruções de comparação e desvio condicional foi acrescentado um registrador de estado (STATUS). Toda instrução de comparação e desvio condicional deve ser precedida por uma instrução de subtração (SUB ou SUBI). O registrador STATUS possui dois flags que são ativados dependendo do resultado da operação anterior: (i) Z, que indica se o resultado da última operação da ULA foi igual a zero ou não; e (ii) N, que indica se o último resultado da ULA foi um número negativo ou não (MORANDI; RAABE; ZEFERINO, 2006).

(27)

26

A Tabela 4 apresenta o conjunto de instruções do processador BIP II. Na tabela é possível observar as alterações nos registradores ACC (coluna 3) e PC (coluna 4) em cada instrução. Na tabela, o termo Memory[operand] representa uma variável alocada em memória na posição

operand. Nas instruções de desvio, o termo operand representa o endereço para onde o PC deverá apontar.

Tabela 4. Conjunto de instruções do BIP II

Código da operação

Instrução Operação e atualização do PC

00000 HLT Paralisa a execução PC PC

00001 STO operand Memory[operand]← ACC PC ← PC + 1

00010 LD operand ACC ← Memory[operand] PC ← PC + 1

00011 LDI operand ACC ← operand PC ← PC + 1

00100 ADD operand ACC ← ACC + Memory[operand] PC ← PC + 1

00101 ADDI operand ACC ← ACC + operand PC ← PC + 1

00110 SUB operand ACC ← ACC – Memory[operand] PC ← PC + 1

00111 SUBI operand ACC ← ACC - operand PC ← PC + 1

01000 BEQ operand Se (STATUS.Z=1) então PC ← endereço Senão PC ← PC + 1 01001 BNE operand Se (STATUS.Z=0) então PC ← endereço Senão PC ← PC + 1 01010 BGT operand Se (STATUS.Z=0) e (STATUS.N=0) então PC ← endereço Senão PC ← PC + 1 01011 BGE operand Se (STATUS.N=0) então PC ← endereço Senão PC ← PC + 1 01100 BLT operand Se (STATUS.N=1) então PC ← endereço Senão PC ← PC + 1 01101 BLE operand Se (STATUS.Z=1) ou (STATUS.N=1) então PC ← endereço Senão PC ← PC + 1 01110 JMP operand PC endereço

01111-11111 Reservado para as futuras gerações Fonte: Adaptado de Zeferino (2007).

(28)

27

Pereira (2008) apresenta uma descrição mais completa do conjunto de instruções dos Processadores BIP. Parte desta documentação, referente às instruções suportadas pelos processadores BIP I e BIP II é apresentada no Anexo I.

2.2.3

Organização dos Processadores BIP I e BIP II

Segundo Morandi, Raabe e Zeferino (2006), a organização do BIP I utiliza a estrutura Harvard, com memórias separadas para dados e instruções. Conforme ilustrado na Figura 3, o processador é dividido em dois blocos: (i) Controle, responsável por gerar sinais de controle para o caminho de dados e atualização do PC; e (ii) Caminho de Dados, que inclui os circuitos necessários para executar a instrução.

Figura 3. Organização do processador BIP I Fonte: Adaptado de Zeferino (2007).

Essa organização é bastante simples e seus blocos constituintes podem ser descritos apenas pela sua funcionalidade, o que atende o objetivo de facilitar o entendimento por parte de alunos de fases iniciais da área de Arquitetura e Organização de Computadores (MORANDI; RAABE; ZEFERINO, 2006).

(29)

28

A organização do BIP II, conforme mostra a Figura 4, estende a organização do BIP I, incluindo o registrador STATUS e modificações no circuito de atualização do PC. Nas instruções de desvio, a fonte de atualização do PC é definida em função do tipo de desvio e dos valores dos

flags N e Z do registrador STATUS (MORANDI; RAABE; ZEFERINO, 2006).

Figura 4. Organização do Processador BIP II Fonte: Adaptado de Pereira (2008).

2.3

SIMULADORES DE ARQUITETURA

O objetivo desta subseção é apresentar um estudo comparativo de alguns simuladores de arquitetura e organização de computadores, com foco naqueles desenvolvidos com propósito educacional, a fim de levantar as características presentes em cada simulador.

2.3.1

NeanderWin

O NeanderWin é um sistema simulador de caráter educacional desenvolvido para a máquina Neander-X. Este simulador estende o conjunto de instruções inicialmente proposto para a máquina Neander e disponibiliza um ambiente integrado de desenvolvimento, onde é possível editar,

(30)

29

compilar e executar código de programas na linguagem de montagem do processador Neander-X (BORGES; SILVA, 2006).

As instruções do Neander-X são compostas por um ou dois bytes. Nas instruções com apenas um byte, os quatro bits mais significativos contem o código da instrução e os demais não são utilizados. As instruções com dois bytes fazem referência a um dado imediato ou operando na memória. Os quatro bits de mais baixa ordem do primeiro byte são reservados para futuras expansões (BORGES; SILVA, 2006).

O Neander-X apresenta três Modos de endereçamento: (i) Imediato, onde o segundo byte da instrução é o operando; (ii) Direto, em que o segundo byte representa o endereço de memória do operando; e (iii) Indireto, onde o segundo byte da instrução contém o endereço de memória onde está o endereço do operando.

Os recursos disponibilizados pelo simulador NeanderWin incluem:

• Editor de texto, onde é possível escrever e editar programas na linguagem de montagem definida para o processador Neander-X;

Montador, responsável por converter o assembly do Neander-X em linguagem de máquina; e

• Simulador de arquitetura onde é possível visualizar o estado dos registradores principais da CPU e a memória simulada.

O NeanderWin permite ainda a execução passo a passo e indica erros encontrados durante o processo de simulação. Disponibiliza também arquivo de ajuda que descreve a funcionalidade dos registradores utilizados.

A Figura 5 mostra a tela principal do sistema NeanderWin. Na parte superior estão os botões usados em conjunto com o editor de texto. Logo abaixo, à esquerda, está o editor de textos e a direita se situam os verificadores dos registradores principais da CPU e o visualizador da memória.

(31)

30

Figura 5. Tela Principal do Sistema NeanderWin Fonte: Borges e Silva (2006).

2.3.2

Simularq

O Simularq é um simulador gráfico de arquitetura desenvolvido para fins didáticos. Seu objetivo principal é fornecer uma ferramenta de apoio para o ensino de tópicos da disciplina de Arquitetura de Computadores, facilitando o entendimento e o aprendizado do aluno, além de permitir sua utilização em outras disciplinas como Compiladores e Sistemas Operacionais, aproximando a teoria apresentada em sala de aula aos experimentos realizados em laboratório (CANCIAN, 1997; CANCIAN, 2001; RAABE; VALLE FILHO; CANCIAN, 2001).

A arquitetura simulada consiste de uma máquina monoprocessada com três periféricos (teclado, disco rígido e monitor), memória de endereçamento de 8K, temporizador e controle de interrupções. A CPU consiste de uma unidade de processamento, uma unidade de controle, quatro registradores adicionais e cerca de 30 instruções assembly. A memória ROM armazena dados de 23 bits e tem capacidade para 2048 microinstruções (CANCIAN, 1997).

(32)

31

A utilização do Simularq permite ao aluno criar novas instruções assembly ou alterar as existentes, ampliando a capacidade do sistema. Apesar de não disponibilizar um editor de textos próprio, o Simularq permite testar a execução de novos programas, pois trabalha com arquivos texto que podem ser editados em qualquer outro editor (CANCIAN, 1997).

Para observar as variáveis de interesse durante a simulação do sistema podem ser definidos pontos de parada, o que permite visualizar, por exemplo, os registradores da CPU e valores no barramento. A Figura 6 apresenta uma tela do Simularq, representando a simulação de alguns componentes do computador.

Figura 6. Tela Principal do Simularq

O Simularq representa os três principais componentes do computador: processador, memória e dispositivos de entrada e saída, permitindo uma visão completa do computador simulado. A arquitetura está dividida em cerca de treze telas distintas, cada uma apresentando parte da arquitetura. É possível ainda, expandir cada componente a fim de observar em detalhes o nome das conexões e o seu circuito eletrônico. A Figura 7 ilustra o detalhamento de um multiplexador presente na arquitetura simulada (CANCIAN, 1997; RAABE; VALLE FILHO; CANCIAN, 2001).

(33)

32

Figura 7. Detalhe de um multiplexador simulado pelo Simularq Fonte: Adaptado de Raabe, Valle Filho e Cancian (2001).

Segundo Cancian (1997), a utilização de janelas distintas para cada componente permite isolar e visualizar somente as partes de interesse, abstraindo o restante. Porém, a grande quantidade de janelas pode prejudicar o entendimento do programa, o que seria solucionado com uma análise ergonômica e alterações na interface do sistema.

2.3.3

4AC

Moreira e Hajdu (2004) descrevem a implementação de um ambiente de apoio ao aprendizado de Arquitetura de Computadores, denominada 4AC. As funcionalidades disponíveis neste ambiente incluem: (i) conversor de bases; (ii) simplificação de expressões lógicas; e (iii) simulador de instruções de máquina.

A utilização de um simulador de instruções permite a visualização do ciclo de instruções, passo a passo, em nível de micro-instrução, ilustrando as operações realizadas internamente no processador principal e seus barramentos, facilitando desta forma, seu entendimento. O conjunto de instruções adotado oferece operações aritméticas e lógicas, desvios condicionais e incondicionais, operações de leitura e escrita na memória, operações com pilha, operações de E/S e manipulação de bits (MOREIRA; HAJDU, 2004). A Figura 8 demonstra a interface do sistema 4AC.

(34)

33 Figura 8. Tela Principal do 4AC

2.3.4

VLIW-DLX

O VLIW-DLX é um simulador gráfico de um processador VLIW5 (Very Long Instruction Word), desenvolvido com o propósito de ser utilizado em cursos de graduação na área de arquitetura de computadores (BEČVÁŘ; KAHÁNEK, 2007).

A arquitetura simulada consiste de cinco pipelines paralelos: (i) instruções aritméticas de dados do tipo inteiro e instruções de controle; (ii) instruções aritméticas e de transferência (load); (iii) instruções de transferência (load-store); (iv) instruções de ponto flutuante; e (v) multiplicação em ponto flutuante. Esta arquitetura apresenta um banco de 128 registradores de propósito geral, sendo 64 de dados do tipo inteiro e 64 de ponto flutuante (BEČVÁŘ; KAHÁNEK, 2007).

Os recursos oferecidos pelo simulador VLIW-DLX incluem: (i) editor de textos para programação em linguagem assembly; (ii) compilador; (iii) execução passo a passo; (iv) identificação de erros de compilação; (v) visualização dos valores atuais dos registradores; e (vi)

5

O modelo de arquitetura VLIW permite que um grupo de instruções seja executado ao mesmo tempo, visando reduzir o número de instruções executadas pelo processador e, consequentemente, o tempo de execução dos programas (BEČVÁŘ; KAHÁNEK, 2007)

(35)

34

visualização dos ciclos de instruções, que para melhor visualização e entendimento são diferenciados por cores, que também identificam os blocos de instruções correspondentes (BEČVÁŘ; KAHÁNEK, 2007). A interface do VLIW-DLX pode ser vista na Figura 9.

Figura 9. Tela Principal do VLIW-DLX

2.3.5

R10k

O R10k é um simulador de arquitetura superescalar baseado no processador MIPS (Microprocessor without Interlocked Pipeline Stages) R10000. Foi desenvolvido de maneira a facilitar o entendimento das estruturas internas e do comportamento do processador, auxiliando desta forma o processo de ensino-aprendizagem de processadores superescalares6 (GONÇALVES JUNIOR et al., 2007).

O simulador R10k utiliza um subconjunto de 29 instruções do MIPS R10000, entre operações lógicas e aritméticas, desvios condicionais e incondicionais, transferência de dados e acesso a memória, além de chamadas a sub-rotinas. A memória foi dividida em memória de dados e memória de instruções com 256 posições, a fim de facilitar a visualização. Além do banco de

6

Um processador superescalar possui diversas unidades de execução, tornando-o capaz de buscar, executar e finalizar diversas instruções em paralelo.

(36)

35

registradores e das memórias, os valores dos registradores especiais também podem ser observados na interface do programa (GONÇALVES JUNIOR et al., 2007).

A Figura 10 apresenta a tela inicial do sistema R10k.

Figura 10. Tela Principal do R10k Fonte: Gonçalves Junior et al. (2007).

O simulador permite a execução passo a passo das instruções, além de ser possível acompanhar os ciclos de clock, conforme eles são executados. Existe ainda a possibilidade de modificar o programa no próprio simulador e, caso seja encontrado algum erro durante o processo de compilação, o simulador exibe mensagens informando o usuário sobre o erro apresentado.

Para auxiliar a compreensão do funcionamento do simulador, esta disponível no sistema um arquivo de ajuda. Neste arquivo, além do manual de funcionamento do simulador, são descritos o formato e a função de cada instrução, bem como alguns fundamentos de arquiteturas superescalares e informações sobre o MIPS R10000.

(37)

36

2.3.6

MipsIt

O MipsIt consiste de um conjunto de ferramentas que incluem um ambiente de desenvolvimento, uma plataforma de hardware e uma série de simuladores. Foi desenvolvido com o propósito de auxiliar o ensino de arquitetura e organização de computadores (BRORSSON, 2002).

Segundo Brorsson (2002), o ambiente MipsIt pode ser utilizado para o desenvolvimento de programas capazes de serem executados em hardware específico ou simulados através dos simuladores disponíveis na ferramenta. Esses programas são escritos em linguagem assembly ou em conjunto com a linguagem C.

O simulador foi desenvolvido para ser flexível e permitir a simulação de programas em diferentes microarquiteturas. Ele permite carregar um programa em memória e executá-lo passo a passo, o que permite monitorar o conteúdo da memória e dos registradores durante sua execução. A cada passo executado o gráfico exibido é modificado, atualizando o conteúdo dos registradores e posicionando os sinais de controle de acordo com a instrução corrente. A Figura 11 mostra uma arquitetura pipeline de cinco estágios simulada através do MipsIt (BRORSSON, 2002).

Figura 11. Simulação de uma arquitetura pipeline no MipsIt Fonte: Brorsson (2002).

(38)

37

2.3.7

Comparação entre os Simuladores Analisados

A partir da utilização e do estudo de publicações e manuais dos simuladores descritos, foi possível estabelecer uma comparação entre suas funcionalidades. A Tabela 5 apresenta um resumo com as principais funcionalidades identificadas nos sistemas apresentados e as funcionalidades presentes no ambiente Bipide.

Tabela 5. Funcionalidades dos sistemas analisados

Características 4AC MipsIt NeanderWin R10k Simularq

VLIW-DLX Bipide

Desenvolvimento de programas em linguagem de alto nível

Não Sim Não Não Não Não Sim

Desenvolvimento de programas em linguagem

assembly

Não Sim Sim Sim Sim Sim Não

Visualização da linguagem

assembly

Não Sim Sim Sim Não

Identificado Sim Sim

Visualização da

Memória Sim Sim Sim Sim Sim Sim Sim

Visualização dos valores dos registradores

Sim Sim Sim Sim Sim Sim Sim

Execução Passo a

Passo Sim Sim Sim Sim Sim Sim Sim

Simulação da

Organização Não Sim Não Não Sim Não Sim

Identificação de erros de compilação Não Identificado Não

Identificado Sim Sim

Não

Identificado Sim Sim

Alteração de valores em tempo de execução

Não

Identificado Não Não Sim

Não

Identificado Não Não

Arquivos de

(39)

38

2.4

COMPILADORES

Com o advento da computação surgiu a necessidade de se escrever sequências de códigos, ou programas, para que os computadores efetuassem as computações desejadas. Inicialmente esses programas foram escritos em linguagem de máquina, ou seja, códigos numéricos representando as operações a serem executadas (LOUDEN, 2004).

A utilização desta linguagem mostrou-se entediante e com alto tempo de desenvolvimento, sendo rapidamente substituída pela linguagem de montagem (assembly), onde as instruções e endereços de memória adotam formas simbólicas. As linguagens de montagem, entretanto, apresentam limitações, dentre os quais o fato de serem de difícil escrita, leitura e compreensão, além de serem extremamente dependentes da máquina para a qual são escritas (LOUDEN, 2004).

O passo seguinte na tecnologia de programação foi escrever as operações de um programa de forma concisa, semelhante a uma notação matemática ou linguagem natural, menos dependente de uma máquina em particular, com um nível de abstração mais elevado e passível de tradução por um programa em código executável. (LOUDEN, 2004; AHO et al., 2008; DELAMARO, 2004). Esta linguagem é conhecida como linguagem de alto nível ou linguagem de terceira geração (AHO

et al., 2008).

Com a utilização de linguagens de alto nível obteve-se vantagens em relação às linguagens de máquina e montagem, entre as quais se destacam: (i) adaptabilidade; (ii) portabilidade; (iii) possibilidade de estruturação e orientação a objeto; (iv) simplicidade; e (v) facilidade de detecção de erros (TERRY, 1996).

Louden (2004, p. 1) define compiladores como “programas de computador que traduzem de uma linguagem para outra”. Um compilador recebe como entrada um programa escrito em linguagem de programação, a linguagem fonte, e o traduz para um programa equivalente em outra linguagem, a linguagem objeto (Figura 12). A linguagem fonte geralmente é uma linguagem de alto nível, como C ou C++ e a linguagem objeto é um código escrito usando as instruções de máquina do computador no qual ele será executado (linguagem de máquina) (LOUDEN, 2004).

(40)

39 Figura 12. Compilador

Fonte: Adaptado de Aho et al. (2008).

2.4.1

Fases de um Compilador

As subseções a seguir descrevem as quatro principais fases que tradicionalmente compõem o processo de compilação: (i) análise léxica; (ii) análise sintática; (iii) análise semântica; e (iv) geração de código.

2.4.1.1 Análise Léxica

A primeira etapa do processo de compilação é responsável por ler o fluxo de caracteres que compõem o programa fonte e separar cada símbolo que tenha algum significado para a linguagem, identificando a que tipo pertence e agrupando-os em sequências significativas denominadas lexemas (AHO et al., 2008; DELAMARO, 2004).

Os símbolos identificados e seus atributos são armazenados em uma estrutura denominada tabela de símbolos. Estes atributos oferecem informações como o espaço de memória alocado para um nome, seu tipo e onde seu valor pode ser utilizado no programa (AHO et al., 2008).

A análise léxica deve também avisar quando um símbolo inválido é encontrado no programa fonte e relacionar as mensagens de erro geradas pelo compilador com o programa fonte. Deve ainda remover conteúdo insignificante para a linguagem como espaços em branco, quebras de linha, tabulação e comentários (DELAMARO, 2004; AHO et al., 2008).

2.4.1.2 Análise Sintática

O analisador sintático é construído sobre uma gramática composta de regras que descrevem as construções válidas para a linguagem. Segundo Delamaro (2004), esta etapa é responsável por

(41)

40

verificar a ordem em que os símbolos aparecem no programa fonte e determinar se essa sequência forma um programa válido ou não.

Outra função do analisador sintático é a construção de uma estrutura em forma de árvore que descreve as construções da linguagem reconhecida pelo analisador sintático. Nesta estrutura, conhecida como árvore sintática ou árvore de derivação, cada nó interior representa uma operação e os filhos do nó representam os argumentos desta operação (LOUDEN, 2004; AHO et al., 2008). Assim, para a expressão aritmética 3*a + (b-2), a árvore sintática ficaria conforme mostra a Figura 13.

Figura 13. Árvore sintática da expressão 3*a + (b-2) Fonte: Adaptado de Aho et al. (2008).

Os analisadores sintáticos costumam ser classificados em analisadores sintáticos descendentes e ascendentes. Os analisadores descendentes começam a análise com o símbolo inicial da gramática e constrói a árvore de cima para baixo (top-down); os analisadores ascendentes começam com os símbolos terminais que formam as folhas e constroem a árvore de baixo para cima (botton-up) (LOUDEN, 2004; AHO et al., 2008).

2.4.1.2.1 Analisadores LL(k)

Os analisadores LL(k) são analisadores preditivos7 que utilizam o método de análise sintática descendente.

O primeiro “L” em LL(k) significa que o processamento é realizado da esquerda para direita (Left-to-right); o segundo “L” se refere ao fato de o analisador acompanhar uma derivação mais à

7

Analisadores sintáticos preditivos tentam prever a construção seguinte na cadeia de entrada com base em uma ou mais marcas de verificação à frente.

(42)

41

esquerda para a cadeia de entrada (Leftmost). O k entre parênteses significa que são verificados k símbolos adiante na entrada para prever a direção da análise. Quando apenas um símbolo à frente é utilizado, a análise é classificada como LL(1) (LOUDEN, 2004; AHO et al., 2008).

Ao contrario da análise sintática descendente recursiva, a análise LL(k) utiliza uma pilha explicita, em vez de ativações recursivas. Segundo Louden (2004, p. 152), “a representação dessa pilha de forma padrão é útil para facilitar e agilizar a visualização das ações do analisador sintático”.

2.4.1.3 Análise Semântica

Durante a análise semântica, são verificados se existem incoerências quanto ao significado das construções utilizadas no programa fonte, como: (i) tipos de operandos incompatíveis com operadores (verificação de tipo); (ii) variáveis não declaradas; (iii) redeclaração de variáveis; e (iv) chamadas de funções com o número incorreto de parâmetros (DELAMARO, 2004).

Para a verificação de inconsistência no programa fonte o analisador semântico utiliza a árvore sintática criada na etapa anterior como representação do programa e a tabela de símbolos, na qual busca informações sobre as variáveis declaradas e o tipo de cada uma delas. Reúne ainda informações adicionais sobre as variáveis, que são armazenadas para uso na etapa de geração de código (AHO et al., 2008; DELAMARO, 2004).

2.4.1.4 Geração de Código

Após a verificação de que não existem erros sintáticos ou semânticos no programa fonte, o compilador realiza a tarefa de geração de código do programa objeto. O gerador de código recebe como entrada uma representação intermediária do programa fonte e o mapeia em uma linguagem objeto, refletindo, mediante instruções de baixo nível, os comandos do programa fonte (AHO et al., 2008; DELAMARO, 2004).

Nesta fase da compilação as propriedades da máquina para a qual o programa será criado devem ser observadas como, por exemplo, a quais registradores serão atribuídas as variáveis do programa, ou ainda a localização de memória para cada uma das variáveis utilizadas (LOUDEN, 2004).

Referências

Documentos relacionados

Verificou-se que mais de 80% dos casos se referiam a conviventes de doentes com exame bacteriol6gico da expectoray3o positivo por exame directo com colorayao de Ziehl-Neelsen

E HABILIDADES DESAFIO DO DIA FORTALECENDO SABERES DINÂMICA LOCAL INTERATIVA LINGUAGENS MAT.,

Entre estes pacientes, 52 intervenções (50%) foram realizadas em decorrência de edema de laringe após broncoscopia, 11 casos para assistência ventilatória, 12 para introdução

[r]

- (EA-112) SOCIEDADE AMADORA NACIONAL DE ORNITOLOGIA- A/C JOSÉ AP... SERRANAS DE CRIADORES DE CANÁRIOS

Desse modo, podemos dizer que a significação é dotada tanto de uma sintaxe (relação entre elementos) quanto de uma semântica (carga de sentidos dos elementos e de suas relações).

O facto de ter um campo de vento homogéneo (Figura 5), não influi notoriamente nos resultados simulados, pois a grelha de 0.025 o da região dos Açores foi aninhada com as duas

59 Pedro Augusto Ferraz e Silva Teoria de Representações e Físicas Ronaldo Silva Thibes DCEN Itapetinga 60 Dalton José Santos Sant'Ana. Veículo autônomo não tripulado (VANT) –