Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
1 LINGUAGEM E TÉCNICA DE PROGRAMAÇÃO I Profa. Gisele Busichia Baioco gisele@ft.unicamp.br Conhecimentos Básicos Gerais 1 Estrutura e Funcionamento dos Computadores Um sistema de computador é formado por: • Hardware: é o conjunto de componentes físicos de um computador. Ex: placa de memória, teclado, etc; • Software: é o conjunto de programas necessários ao funcionamento do hardware e que são escritos para realizar os diversos tipos de serviços aos usuários do sistema. Ex: editores de texto, planilhas eletrônicas, etc. 1.1 Hardware de um Computador Memória Dispositivo de Entrada Dispositivo de Saída Unidade de Controle Unidade de Aritmética e Lógica Unidade Central de Processamento sinais de controle fluxo de dados Figura 1: Componentes físicos de um computador 1.1.1 Memória A memória é o local onde são armazenados os programas e os dados. Pode ser de dois tipos: • Principal (ou Interna): contém os programas em execução juntamente com os dados necessários. É volátil, ou seja, toda informação desnecessária é retirada da memória principal; • Auxiliar (ou Externa): são os discos magnéticos (winchester), disquetes, fitas magnéticas, CDs e DVDs. A informação pode ser armazenada na memória auxiliar 2 por quanto tempo quanto o usuário julgar necessário, pois o custo de armazenamento externo é relativamente baixo. A capacidade de armazenamento externo pode ser considerada ilimitada enquanto que a memória principal é sempre mais escassa. Em compensação, o tempo de recuperação de informações armazenadas em um dispositivo de memória auxiliar é relativamente maior do que na memória principal. Quando a memória é apenas para leitura de informação recebe o nome de ROM (Read Only Memory). Quando é utilizada tanto para leitura como para gravação de informação é conhecida como RAM (Randomic Acess Memory). A informação é armazenada na memória por meio de dígitos binários. Um dígito binário ou bit é a menor unidade de informação e assume os valores 0 ou 1. No sistema binário: 1 Byte = 8 Bits 1 KByte = 1024 Bytes 1 MByte = 1024 * 1024 Bytes = 1.048.576 Bytes 1 GByte = 1024 * 1024 * 1024 Bytes Para converter um número binário em decimal faz-se: 01011011 ⇒ 0 × 27 + 1 × 26 + 0 × 25 + 1 × 24 + 1 × 23 + 0 × 22 + 1 × 21 + 1 × 20 ⇒ 0 + 64 + 0 + 16 + 8 + 0 + 2 + 1 = 91 01101110 ⇒ 0 × 27 + 1 × 26 + 1 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 1 × 21 + 0 × 20 ⇒ 0 + 64 + 32 + 0 + 8 + 4 + 2 + 0 = 110 Para converter um número decimal em binário faz-se divisões sucessivas por 2: 91 / 2 11 45 / 2 1 05 22 / 2 1 02 11 / 2 0 1 5 / 2 1 2 / 2 0 1 De baixo p/ cima tem-se: 1011011 O maior valor decimal que se pode representar com n bits é dado por 2n - 1. Zeros à esquerda não são significativos. 0 1 2 0 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 Palavra de 8 bits Endereços Valores em binário Valores decimais equivalentes 91 110 Figura 2: Armazenamento da informação na memória principal de um computador 3 A memória principal de um computador é dividida em unidades de mesmo tamanho chamadas de palavras, sendo que cada uma tem um único endereço, como mostrado na figura 2. Cada palavra é capaz de armazenar uma informação (representada em dígitos binários) como, por exemplo, o resultado de uma operação numérica. Os tamanhos de palavra mais comuns são 8, 16, 32 e 64 bits. A representação de informações não-numéricas é feita por meio de um esquema de codificação onde, por convenção, certos conjuntos de bits representam certos caracteres. Dois métodos de codificação são os mais utilizados: • EBCDIC (Extended Binary Coded Decimal Interchange): utiliza 8 bits permitindo a codificação de 256 (28) caracteres diferentes; • ASCII (American Standard Code for Information Interchange): utiliza 7 bits permitindo 128 (27) representações diferentes de caracteres. O oitavo bit do byte é usado como bit de paridade (não codifica informação mas detecta erros durante a transmissão de dados). 1.1.2 Unidade Central de Processamento (UCP ou CPU) A UCP é o local de onde partem todas as decisões e onde são executadas todas as tarefas. Como mostrado na figura 1, a UCP é composta por: • Unidade de Aritmética e Lógica: responsável pela realização de todos os cálculos aritméticos (adição, subtração, multiplicação e divisão) e lógicos (comparação de valores); • Unidade de Controle: controla as ações de todos os outros componentes. Opera de acordo com as instruções do programador (programa) que estão armazenadas na memória principal. Controla a transferência de dados da memória para a unidade de aritmética e lógica (onde os cálculos são executados) e vice-versa, do dispositivo de entrada para a memória e da memória para o dispositivo de saída. 1.1.3 Dispositivos de Entrada e Saída (Periféricos) Os dispositivos de entrada fornecem o meio pelo qual os dados e as instruções são transmitidos ao computador. São dispositivos de entrada: teclado, mouse, unidades de disco, microfone, scanner, etc. Os dispositivos de saída são necessários à apresentação de resultados. São dispositivos de saída: vídeo, impressora, unidades de disco, alto falante, etc. 1.2 Software de um Computador Programas Aplicativos Sistema Operacional Hardware Softwares Editores de Texto Vídeo-games Compiladores Interpretadores etc Figura 3: Acesso ao hardware de um computador 4 Como pode ser observado na figura 3, o acesso ao hardware de um computador é feito em camadas, ou seja, um programa aplicativo não acessa diretamente o hardware, mas sim através do sistema operacional. Tanto os programas aplicativos como os sistemas operacionais são softwares, entretanto os sistemas operacionais têm características específicas sendo considerados um tipo especial de software. 2 Sistemas Operacionais Os sistemas operacionais são programas responsáveis por supervisionar o funcionamento do computador, criando um ambiente onde os usuários (programadores) podem preparar seus programas e executá-los sem se preocuparem primordialmente com detalhes do hardware. A característica fundamental é a de que um sistema operacional é um software sobreposto funcionalmente ao hardware. Os sistemas operacionais possuem múltiplas funções: • apresentar ao usuário uma máquina mais flexível e adequada para programar do que aquela que o hardware apresenta, tornando a comunicação do usuário com a máquina mais fácil e natural; • possibilitar o uso eficiente e controlado dos vários componentes do hardware: processador (UCP), memória (principal e auxiliar), dispositivos de Entrada/Saída, etc; • gerenciar o processamento de programas: um sistema operacional pode permitir a execução de dois ou mais programas simultaneamente, ou de maneira geral, permitir a execução de duas ou mais tarefas simultaneamente (editar um texto e imprimir um arquivo ao mesmo tempo). Nesse caso, o sistema operacional tem a característica de ser multitarefa; • possibilitar a diversos usuários o uso compartilhado e protegido dos diversos componentes de hardware e de software do sistema de computação, de modo que o mesmo seja utilizado de maneira mais eficiente: nesse caso, o sistema operacional tem a característica de ser multiusuário, onde se tem vários usuários interligados ao sistema de computação por meio de terminais, compostos apenas de vídeo e teclado, ou por meio de uma rede de computadores. No primeiro caso, existe um único sistema de computador ao qual todos os usuários estão interligados por meio dos terminais e no qual executam suas tarefas. No caso de uma rede de computadores, existe um conjunto de sistemas de computadores interligados que podem estar geograficamente muito distanciados entre si, sendo que os usuários podem ter suas tarefas executadas em qualquer outro sistema de computador da mesma rede, além daquele que estiver utilizando diretamente. Exemplos de sistemas operacionais: DOS (Disk Operating Systems), Windows, UNIX, etc. 3 Linguagens de Programação As linguagens de programação surgiram da necessidade de livrar o programador de detalhes específicos da máquina em que programava. Qualquer linguagem consiste de um conjunto de regras que especificam como as coisas devem ser expressas para serem compreendidas. De maneira geral, os passos para se escrever um programa são: 1- Especificação 2- Codificação 3- Testes 5 4- Manutenção As linguagens de programação influem nos passos 2 e 4, ou seja, na codificação onde o programa é escrito e na manutenção onde o programa é alterado. São propriedades desejáveis em uma linguagem de programação: 1- Legibilidade (principal propriedade) 2- Documentação (possibilidade de colocação de comentários no decorrer do código do programa) 3- Facilidade de escrita 4- Confiabilidade (uma linguagem não deve induzir o programador a erros) Geralmente, legibilidade e facilidade de escrita são propriedades opostas, ou seja, a linguagem pode ser legível (fácil de ler e entender), mas pode não ser fácil de escrever, pois para ser legível necessita de muitos símbolos que detalham o código. 3.1 Níveis de Linguagens As primeiras linguagens de programação foram classificadas como de baixo nível (nível mais próximo das características do hardware) ou linguagens de montagem (assembly languages). Nessas linguagens as características de um sistema de computador estão representadas diretamente, fazendo com que o programador deva conhecer as características da máquina como: memória, instruções reais da máquina (especificadas por mnemônicos, por exemplo, ADD para somar, MVI para mover, etc) e, possivelmente, a velocidade das instruções. Um programador, utilizando uma linguagem de montagem, manipula os elementos básicos da arquitetura do computador por meio da UCP. Um passo decisivo para a programação foi a introdução, na segunda metade da década de 1950, de linguagens de alto nível (nível mais distante das características do hardware), a fim de facilitar a programação e a depuração de erros. As primeiras linguagens de alto nível a surgirem foram FORTRAN (FORmula TRANslation system) e ALGOL (ALGOrithmic Language). Na década de 1970, surgiu a linguagem C, que foi classificada como sendo uma linguagem de nível médio, pois combina o que há de melhor nas linguagens de baixo e de alto nível (combina as características de uma linguagem de alto nível com a funcionalidade das linguagens de montagem). Comparação entre as linguagens de baixo e alto nível: Linguagens de Baixo Nível Linguagens de Alto Nível Velocidade de execução Fácil comunicação (fácil de ler, compreender e escrever) Economia de memória Possibilita a documentação do código através de comentários É portável Vantagens Aproveitamento dos recursos do hardware Redução no tamanho do programa Difícil compreensão e aprendizado Desvantagens Falta de portabilidade (os programas são específicos para máquinas com as mesmas características de hardware) Tempo gasto na tradução 6 Alguns exemplos de linguagens de programação: Usuário Alto Nível Ada Modula-2 Pascal COBOL FORTRAN ALGOL BASIC Nível Médio C Baixo Nível Macroassembler Assembler Máquina Uma característica de algumas linguagens de médio/alto nível é de serem estruturadas. Uma linguagem estruturada tem como característica a possibilidade de se compartimentalizar o código e os dados, isto é, permite que tarefas distintas tenham suas informações e instruções separadas em blocos e escondidas do restante do programa. Esses blocos de informações e instruções são chamados de subrotinas ou subprogramas. As linguagens estruturadas tornam a programação e a manutenção de programas mais fáceis de serem realizadas. Essas linguagens tendem a ser mais modernas, enquanto que as não-estruturadas são mais antigas. Por exemplo: Linguagens Não-estruturadas Linguagens Estruturadas FORTRAN Pascal BASIC Ada COBOL C Modula-2 3.2 Campos de Aplicação Para cada campo de aplicação deve-se utilizar linguagens de programação apropriadas. Por exemplo: • Aplicações científicas: BASIC, Pascal, C, C++ • Aplicações comerciais: COBOL, DBase, Clipper • Aplicações de inteligência artificial: PROLOG, LISP • Aplicações para internet: JAVA Desse modo, antes de começar a desenvolver um programa deve-se analisar o campo da aplicação e, então, escolher a linguagem de programação mais apropriada. 3.3 Compilação e Interpretação Com a introdução das linguagens de programação surgiu a necessidade de programas tradutores, isto é, softwares que traduzem programas escritos em uma linguagem de programação para programas em linguagem de máquina (código binário). Os tradutores para linguagens de montagem são chamados de montadores (assemblers) e os para linguagens de alto nível, de compiladores. Outra opção para a tradução de linguagens de alto nível é o uso de interpretadores. 7 O processo de compilação para uma determinada linguagem de programação consiste na tradução de programas escritos nessa linguagem, chamados de programas-fonte, para programas escritos na linguagem da máquina onde serão executados, chamados de programas-objeto. Esquematicamente tem-se: Programa Fonte Compilação Programa Objeto Execução Saída do Programa Tempo de compilação Tempo de execução O tempo de compilação se refere aos eventos que ocorrem durante o processo de compilação e o tempo de execução, aos eventos que ocorrem enquanto o programa está sendo executado. Assim, erros em tempo de compilação são os erros ocorridos durante o processo de compilação do programa-fonte e erros em tempo de execução são aqueles ocorridos durante a execução do programa. O processo de interpretação para uma determinada linguagem de programação consiste em traduzir cada instrução ou comando do programa-fonte e executá-la imediatamente. Portanto, não existe a geração de um programa-objeto. Esquematicamente tem-se: Programa Fonte Interpretação e Execução Saída do Programa Tempo de interpretação + Tempo de execução Comparação entre compiladores e interpretadores: Interpretador Compilador Mais lento; alguns passos são repetidos cada vez que uma instrução deve ser interpretada Mais rápido; é possível adaptar o código gerado para um comando de acordo com o seu contexto, visando a otimização É possível detectar erros que não são visíveis ao compilador (erros em tempo de execução) Erros em tempo de execução são detectados posteriormente à compilação É usado por linguagens com estruturas simples. Por exemplo: LISP, APL, SNOBOL, PROLOG É usado, por exemplo, pelas linguagens: Pascal, C, FORTRAN, COBOL Usuários distintos visualizam a máquina de formas também distintas devido aos softwares que utilizam. Essa visualização é chamada de máquina virtual. Por exemplo: Máquina Virtual C: Sistema Operacional + Compilador C Teoricamente, a implementação da máquina virtual é transparente ao usuário. Na prática, os efeitos da implementação são sentidos, por exemplo, pelo tempo de execução, pelas mensagens de erro, etc.