
Arquiteturas, Compiladores e Interpretadores, Linguagens de programação
Arquitetura
A Arquitetura de Computadores é o projeto conceitual e fundamental da estrutura operacional de um sistema computacional. Ela é o estudo dos requisitos necessários para que um computador funcione e de como organizar os diversos componentes para obter melhores desempenhos.
Como computador entendemos qualquer tipo de dispositivo capaz de receber uma entrada e que retorna uma saída após realizar uma série de operações com base nos valores recebidos e armazenados. Existem vários tipos de computadores. Uma das formas de classificá-los é por meio das seguintes categorias:
-
Desktop: Computadores de baixo-custo e com desempenho razoável para um usuário "comum".
-
Servidor: Máquinas projetadas para ter um desempenho considerado bom para uma aplicação muito grande e complexa ou então para um número muito grande de operações mais simples. Alguns servidores são simples computadores de Desktop melhorados. Entretanto, existem também aqueles que possuem arquiteturas muito mais sofisticadas que contam com dezenas ou até mesmo centenas de processadores.
A arquitetura de von Neumann
É uma arquitetura de computador que se caracteriza pela possibilidade de uma máquina digital armazenar seus programas no mesmo espaço de memória que os dados, podendo assim manipular tais programas. Esta arquitetura é um projeto modelo de um computador digital de programa armazenado que utiliza uma unidade de processamento (CPU) e uma de armazenamento ("memória") para comportar, respectivamente, instruções e dados.
A máquina proposta por Von Neumann reúne os seguintes componentes: (I) uma memória, (II) uma unidade aritmética e lógica (ALU), (III) uma unidade central de processamento (CPU), composta por diversos registradores, e (IV) uma Unidade de Controle (CU), cuja função é a mesma da tabela de controle da Máquina de Turing universal: buscar um programa na memória, instrução por instrução, e executá-lo sobre os dados de entrada.
Todos os elementos dessa arquitetura são alinhados da estrutura hardware do CPU, assim o sistema pode realizar todas as suas atividades sem apresentar erros no desempenho. Von Neumann é continuamente influenciado pela evolução tecnológica, tendo peças mais modernas inseridas.
A Arquitetura de Harvard
Baseia-se em um conceito mais recente que a de Von-Neumann, tendo vindo da necessidade de por o microcontrolador para trabalhar mais rápido. É uma arquitetura de computador que se distingue das outras por possuir duas memórias diferentes e independentes em termos de barramento e ligação ao processador.
A principal vantagem desta arquitectura é dada pela dupla ligação às memórias de dados e programa (código), permitindo assim que o processador leia uma instrução ao mesmo tempo que faz um acesso à memória de dados.
A diferença entre a arquitetura Von Neunmann e a Harvard é que a última separa o armazenamento e o comportamento das instruções do CPU e os dados, enquanto a anterior utiliza o mesmo espaço de memória para ambos. Nos CPUs atuais, é mais comum encontrar a arquitetura Von Neunmann, mas algumas coisas da arquitetura Harvard também são vistas.
Processador
O processador, também chamado de Unidade Central de Processamento ou Central Processing Unit (CPU), é o principal componente de um sistema computacional, responsável por realizar todas as operações do computador e controlar sua execução. O processador é capaz de realizar algumas operações primitivas (MONTEIRO, 2007):
Operações aritméticas e lógicas – somar, subtrair, multiplicar, dividir e realizar comparações de números.
Operações de movimentação de dados – mover um dado de um local de armazenamento para outro.
Operações de entrada ou saída – transferir um valor para um dispositivo de saída ou de um dispositivo de entrada para o processador.
O processador é responsável por buscar e executar as instruções existentes na memória, as quais determinam as operações que o computador deve realizar. Essas instruções primitivas são denominadas instruções de máquina e, quando agrupadas, formam os programas.
O processador realiza constantemente as seguintes operações (STALLINGS, 2010):
Buscar instrução – o processador busca na memória a instrução a ser executada.
Interpretar a instrução – a instrução é decodificada para determinar a ação que deve ser executada.
Obter os dados – a execução da instrução pode necessitar a leitura de dados da memória ou dos dispositivos de entrada.
Processar os dados – a execução da instrução pode necessitar de alguma operação aritmética ou lógica com os dados.
Gravar os dados – a execução da instrução pode requerer a gravação dos dados na memória ou em um dispositivo de saída.
Um processador possui basicamente os seguintes componentes:
• Unidade de controle.
• Unidade lógica e aritmética.
• Registradores.
• Barramentos.
Memória
Para a computação, memória são todos os dispositivos que permitem a um computador guardar dados, temporariamente ou permanentemente. O armazenamento de dados nos computadores é divido em dois grandes grupos de dispositivos (TANENBAUM, 2007):
Memória primária ou principal – é onde os processos (programas em estado de execução) e os seus dados são armazenados para serem processados pela CPU. É formada por dispositivos de memória de acesso rápido, com armazenamento de um menor volume de dados, que em geral, não conseguem guardar a informação quando são desligados.
Memória secundária – é onde os arquivos e dados são armazenados. É formada por dispositivos de acesso mais lento, capazes de armazenar permanentemente grandes volumes de dados. A unidade básica de memória é o bit. Um bit pode conter um 0 ou um 1. O agrupamento de 0s e 1s é capaz de representar qualquer tipo de informação. As informações são agrupadas em bytes (8 bits) ou em palavras de 32 ou 64 bits. As memórias constituem-se em uma quantidade de células (endereços) que podem armazenar estas informações.
ROM (Read Only Memory) significa memória somente para leitura. É um tipo de memória que, em uso normal, aceita apenas operações de leitura, não permitindo a realização de escritas. Outra característica da ROM é que seus dados não são perdidos quando ela é desligada (memória não volátil).
RAM é a memória de acesso aleatório. O nome RAM vem da sigla em inglês para Random Access Memory, e ela possui um tempo constante de acesso a qualquer endereço. A memória RAM permite a execução de operações tanto de leitura como de escrita. Outra característica fundamental desse tipo de memória é que ela é volátil (memória volátil), ou seja, os dados nela armazenados são perdidos na ausência de energia elétrica. Com o passar dos anos, as memórias passaram por várias evoluções tecnológicas que fizeram com que estas adquirissem cada vez mais desempenho e capacidade de armazenamento.
Memória Secundária:
A memória secundária é o local de armazenamento permanente do computador. Nela ficam depositados os programas e os arquivos dos usuários. A informação precisa ser carregada na memória principal antes de ser tratada pelo processador. Vários tipos de dispositivos podem compor a memória secundária do computador. Os principais dispositivos são os discos rígidos, discos óticos, discos flexíveis, discos de estado sólido e dispositivos de armazenamento removíveis como pen drives e cartões de memória flash. Os discos rígidos (HD, derivação de HDD – Hard Disk Drive) constituem a principal unidade de memória secundária utilizada nos computadores, devido a sua grande capacidade de armazenamento aliada ao desempenho e baixo custo.
Placas
Mãe:
A placa mãe, também chamada de placa principal ou placa de CPU ou em inglês motherboard ou mainboard, corresponde a um dos componentes mais importantes em um computador. Sua função principal é integrar todos os componentes do computador ao processador, com o melhor desempenho e confiabilidade possível. Em uma placa mãe estão os principais componentes de um computador, como: BIOS (Basic Input/Output System – Sistema Básico de Entrada/Saída), chipset, processador, slots e conectores. Devido a grande quantidade de chips, trilhas, capacitores e encaixes, a placa mãe também é o componente do computador que, de uma forma geral, mais apresenta defeitos. (MORIMOTO, 2007b). Uma placa mãe é constituída por inúmeras camadas de placas de circuito impresso e é justamente a qualidade da placa de circuito impresso que diferencia as boas placas mãe das ruins. Uma placa de circuito impresso é constituída por pequenas trilhas de cobre por onde circula a corrente elétrica. Através delas, são conduzidos sinais de controle e de alimentação dos componentes da placa. Cada placa que compõe a placa mãe possui pontos de contato que fazem a comunicação entre as mesmas e formam a placa mãe (SILVA; DATA; PAULA, 2009).
Placa de Expansão:
As placas de expansão permitem aumentar as possibilidades de um computador, permitindo a inserção de novos componentes como uma placa de vídeo dedicada (offboard), uma placa de som, rede, entre outros.
A placa de vídeo é o dispositivo responsável por enviar as imagens geradas no computador para a tela do monitor. As placas de vídeo atuais são capazes de suportar recursos 3D e possuem processadores dedicados, cuja função principal é processar imagens, realizando estas tarefas com grande rapidez. Desta forma, elas liberam o processador para a execução de outras tarefas do computador.
As placas de som caracterizam-se como dispositivos capazes de emitir áudio produzido por um computador. Nos primeiros computadores o único dispositivo presente era o “PC Speaker”, o qual emitia avisos sonoros da placa mãe. Hoje em dia as placas de som podem ser encontradas basicamente de duas formas: as placas offboard compradas separadamente e adicionadas à placa mãe e as placas on-board integradas na placa mãe do computador.
Placa de Rede:
A placa de rede é um dispositivo que permite que computadores possam se comunicar. Quanto a essa comunicação (meio físico de transmissão), pode ser guiado e não guiado: via cabo (par trançado, por exemplo) wireless (sem fio), fibra ótica, entre outros. A função de uma placa de rede é basicamente: preparar, enviar, receber e controlar os pacotes de dados para a rede. As placas de rede mais comuns em um computador são as do tipo PCI e podem ter taxas de transferência de 10, 100 ou 1000 Mbits por segundo, as quais utilizam o padrão Ethernet Estas, por sua vez, utilizam os cabos de par trançado para comunicação.
Compiladores e Interpretadores
As linguagens de programação podem ser tanto compiladas como interpretadas. Quando se utiliza uma linguagem compilada, após escrever o código fonte (que contém instruções numa linguagem de alto nível), é necessário que o mesmo seja traduzido (compilado) para código binário (executável). Quem faz essa tradução é um software chamado compilador. As linguagens compiladas têm a vantagem de produzir código executável de alta performance (rápido), o qual está ajustado para o funcionamento em um tipo específico de processador ou sistema operacional. Programas compilados, chamados de código binário, só podem rodar no tipo de computador para o qual foram compilados, uma vez que esses programas consistem, na realidade, em instruções em linguagem de máquina, estendidas e executadas pelo microprocessador. Nas linguagens interpretadas, o código fonte é interpretado por um programa chamado interpretador que percorre o código fonte e executa as ações indicadas pelas instruções no arquivo. O interpretador é, na realidade, o único aplicativo que está sendo executado. Um benefício das linguagens interpretadas reside no fato dos programas interpretados poderem rodar em uma variedade de plataformas diferentes, pois estes só existem em código fonte.
A linguagem JAVA por exemplo pode ser tanto compilada quando interpretada. Após escrever um programa JAVA, gerando um arquivo binário, esse arquivo não poder ser executado porque ele não contém instruções que são entendidas diretamente pelos processadores disponíveis no mercado atualmente. Os programas JAVA são compilados em um formato intermediário chamado bytecode, que só podem ser executados em qualquer plataforma ou sistema operacional através de um interpretador JAVA (máquina virtual) especifico de uma plataforma ou sistema operacional.
A característica de multiplataforma da linguagem JAVA indica que um programa desenvolvido nela pode ser executado em plataformas de hardware e sistemas operacionais diferentes. Na maioria das linguagens de programação como C e Pascal, o código fonte de um programa é compilado para uma plataforma de hardware e sistema operacional especifico, isso faz com que o código binário do programa seja executado somente por computadores que tenham esse sistema operacional, ou seja, código fonte compilado para o S.O. Windows irá gerar um código executável que será executado somente pelo sistema operacional Windows, assim serve para o S.O. Linux.
Linguagem de Programação
Um computador pode entender somente linguagem de máquina, a linguagem de máquina consiste geralmente em 0s e 1s que instruem o computador a executar as tarefas mais elementares. A linguagem de máquina depende da máquina, uma determinada linguagem de máquina pode ser usada apenas por um tipo de máquina. Mas com o passar do tempo nota-se que programar em linguagem de máquina é muito inviável principalmente pela lentidão para escrever os códigos quanto pelo fato de estar suscetível a erros. Quando os programadores perceberam isso eles começaram a criar abreviaturas da língua inglesa para representar as operações básicas do computador e essas abreviações montaram a base das linguagens de montagem, e assim surgiram programas tradutores denominados Assemblers.
Embora programar em linguagem de montagem fosse mais rápido, ainda assim as linguagens de montagem ainda demandavam muito tempo para programar pois exigem muitas instruções até mesmo para as tarefas mais simples realizadas pela máquina. Para aumentar a eficiência do programador foram desenvolvidas então as linguagens de alto nível, as linguagens de alto nível cumprem tarefas mais substanciais com um número menor de comandos, porém elas exigem o uso de programas tradutores denominados compiladores para converter programas de linguagem de alto nível para linguagem de maquina. Com a necessidade de entender os códigos de maquinas com mais facilidade e agilidade foram criados também os interpretadores, que lê o código de maquina e converte para linguagens de alto nível, a linguagem de programação java compilam arquivos com formato denominado bytecode que age como um código de maquina para um entidade denominada máquina virtual, um interpretador analisa cada comando e executa o bytecode na máquina física.
Programação Estruturada
Na década de 60 era comum que desenvolvedores atrasassem o cronograma, excedessem custos e o produto final nem sempre saia do jeito correto, não demorou muito para as pessoas entenderem que desenvolvimento de software era uma atividade muito mais complexa do que imaginavam, isso gerou o surgimento de muitas pesquisas dedicadas e isso resultou na evolução da programação estruturada, essas pesquisas levaram a criação da linguagem de programação pascal pelo professor Nicklaus Wirth em 1971, projetada para ensinar a programação estruturada ela logo tomou conta das universidades como a preferida, mas ainda faltava para essa linguagem as características necessárias para que se tornasse útil para aplicações comerciais, industriais e governamentais, e então surgiu a linguagem de programação Ada, desenvolvida pelo departamento de defesa dos Estados Unidos no começo dos anos 80, a Ada foi uma das primeiras linguagens de programação projetada para facilitar a programação concorrente.
Programação orientada a objetos.
Quando os benefícios da programação estruturada foi percebido pelos pesquisadores surgiram então programas de tecnologia aprimorada para estudo de novos métodos revolucionários de programação, porém foi só depois da programação orientada a objetos ter-se estabelecido amplamente nas décadas de 80 e 90 que os desenvolvedores sentoram que tinhas as ferramentas necessárias para melhorar drasticamente o processo de desenvolvimento de software . A tecnologia de objeto é um esquema de empacotamento para criar unidades de software significativas, objeto tem prioridades (também chamados de atributos) como cor, tamanho e peso e executam ações (também conhecidos como métodos ou comportamentos) como mover, dormir, desenhar. As classes são tipos de objetos relacionados, por exemplo: todos os carros pertencem a classe carros, mesmo que carros individuais variem quanto a fabricação cor e modelo. A tecnologia de objeto permite que classes projetadas adequadamente possam ser usadas em vários projetos, ou seja, usar uma biblioteca de classes pode reduzir enormemente o esforço exigido para a implementação de novos sistemas, todavia, algumas organizações dizem que o principal benefício da programação orientada a objetos não é sua capacidade de reutilizar classes e sim a produção de softwares mais inteligíveis pois é mais organizado e mais fácil de manter.