Métodos de Programação I Ano Lectivo 2005/2006 APONTAMENTOS Ana Maria de Almeida Departamento de Matemática da FCTUC Universidade de Coimbra “Programming is the most difficult part of applied mathematics.” – Edsger W. Dijkstra “It has often been said that a person does not really understand something until he teachs it to someone else. Actually a person does not really understand something until he can teach it to a computer, i.e., express it as an algorithm.” - Donald E.Knuth Métodos de Programação I Departamento de Matemática, FCTUC 2005/06 CAPÍTULO 1 – INTRODUÇÃO BREVE AO COMPUTADOR 1.1 Pequena história da evolução do computador 1.2 A Informática e suas principais utilizações 1.3 Descrição básica de um Computador Digital Funções Básicas de um Computador Modelo de Organização de um Computador Digital - Modelo de Von Neumann 1.4 Hardware versus Software Funções gerais de um sistema operativo Linguagens de Programação 1.5 Representação digital: noções básicas Representação de números inteiros Representação de números reais Representação de caracteres 1 Métodos de Programação I Departamento de Matemática, FCTUC 2 2005/06 Capítulo 1 1.1. Pequena História da Evolução do Computador ... - Com a necessidade de efectuar contagens o homem primitivo, para além da invenção de um sistema numérico (decimal baseado nos dez dedos de uma mão humana), sentiu a necessidade de guardar e alterar a informação numérica. É assumido pelos historiadores que, mesmo antes do desenvolvimento da linguagem escrita, o homem já conhecia o conceito de inventariação de objectos ou animais que possuía, gravando sulcos em varas de madeira ou nas paredes de cavernas. Para além disso, com as trocas comerciais e o assumir da propriedade (como terras para cultivo ou pastorícia e bens acumulados), os paus, as pedras ou as conchas deixam de ser eficientes pois há cada vez mais informação a manipular. Surgem os primeiros dispositivos mecânicos de cálculo: os ábacos. Figura 1: Imagens de ábacos (sendo a segunda uma reconstrução de um ábaco romano). Foi com o uso do ábaco que o cálculo sofreu a sua primeira sistematização, reflectindo o funcionamento de uma hierarquia de valores conforme a coluna onde se efectue os cálculos (sistema decimal). Cada conta na parte inferior do ábaco representa uma unidade e cada conta da parte superior representa 5 unidades. 1623 - Baseado nos bastões de Napier (1614), documentados pelo inventor dos logaritmos, John Napier (matemático e astrónomo), Wilhelm Schickard, em Tuebigen (Alemanha), cria o seu “RelógioCalculadora”: uma máquina capaz de somar e subtrair números com 6 dígitos, e que indica ultrapassagem de capacidade com o som de uma campainha. Figura 2: Calculadora de Schickard. 1633 – Ainda com base nos bastões de Napier, nasce a primeira versão de uma régua de cálculo, que permitia ainda multiplicações e cálculo de alguns logaritmos. Esta última foi, ao longo dos tempos, melhorada e aumentada e, era de tal modo completa, que foi muito popular até cerca da década de 70, onde foi, finalmente, substituída pelas calculadoras automáticas. Figura 3: Régua de cálculo. Métodos de Programação I Departamento de Matemática, FCTUC 3 2005/06 1642 - Com a idade de dezanove anos, o matemático francês Blaise Pascal projecta uma calculadora mecânica que permitiu demonstrar as vantagens práticas do cálculo mecanizado. Para operar a Máquina de Pascal, fazia-se girar uma série de rodas que tinham gravadas, ao longo da sua circunferência, os dígitos de zero a nove. Assim que uma das rodas efectuasse uma volta completa em torno do seu eixo, um mecanismo de rodas dentadas fazia rodar o dígito da roda à sua esquerda de uma unidade. Os resultados (quer finais quer intermédios) eram visualizados nas próprias rodas através do uso de indicadores. Figura 4: Blaise Pascal. e a sua Máquina Calculadora. 1804 - Com o advento da revolução industrial e a possibilidade de mecanização do trabalho repetitivo, Joseph Marie Jackard desenvolve (fisicamente) uma ideia que se começou a formar na primeira metade do século XVII: a automatização de sequências de instruções repetitivas, que são codificadas em cartões perfurados e permitem a construção de um objecto - Tear de Jackard. 1812 - Charles Babbage constrói a sua primeira máquina diferencial, Máquina das diferenças, capaz de gerar tabelas logarítmicas com uma precisão de seis casas decimais. Babbage pretendia mecanizar o cálculo logarítmico e as tabelas de astronomia. Figura 5: Charles Babbage e a Máquina das Diferenças. 1813 - Babbage projecta uma máquina que conseguiria realizar qualquer operação matemática automaticamente. Movida a vapor e baptizada de Máquina Analítica, seria capaz de trabalhar baseada num conjunto de instruções de operação, armazenadas em cartões perfurados, tal como nos teares de Jackard. Pela primeira vez, aparecem princípios e conceitos que só no século XX serão, efectivamente, implementados: a máquina analítica deveria ser constituída por uma unidade aritmética, uma unidade para entrada de dados e instruções, uma unidade para imprimir resultados e seria capaz de realizar operações lógicas (que, como veremos seguidamente, são os constituintes principais de um computador). As ideias de Babbage foram documentadas e ampliadas por Augusta Ada Byron, condessa de Lovelace (filha do conhecido poeta inglês Lord Byron), actualmente reconhecida como a primeira programadora da história. Dotada de uma mente extremamente arguta para a resolução de problemas matemáticos, deixounos uma herança que, talvez somente nos nossos dias, se esteja a apreciar devidamente. Figura 6: Augusta Ada Byron, Condessa de Lovelace. Métodos de Programação I Departamento de Matemática, FCTUC 4 2005/06 1890 - Herman Hollerith, do serviço de censos dos Estados Unidos, foi a primeira pessoa a usar equipamento de cálculo eléctrico para análise estatística de informação, engendrando um processo de codificar o nome, sexo, endereço e outros dados estatísticos em cartões perfurados. Este código era posteriormente contado electricamente quando o cartão passava numa unidade de leitura. É este processo que permite ao governo dos EUA, em 1890, realizar todas as contagens em menos de metade do tempo que tinha demorado a realizar o censo anterior (1880) ainda que, relativamente a este último, a população tenha sofrido um aumento de 25%. 1896 - Hollerith funda a Tabulating Machine Company que, mais tarde, se passa a chamar International Business Machines Corporation - IBM. Máquinas construídas com base na máquina de Hollerith são melhoradas e tornam-se mais rápidas permitindo o processamento de vencimentos, facturação, análise de vendas, cálculo científico, etc. Figura 7: Herman Hollerith e a “Punching Machine”. 1937 a 1944 - Principalmente com o eclodir da segunda guerra mundial e os problemas associados à invenção e melhoramento do armamento e da bomba atómica, há uma aceleração no desenvolvimento de sistemas informáticos, nascendo a primeira geração de calculadores digitais automáticos de grande escala MARK I (sucessivamente MARK II,III e IV). Desenvolvido(s) pela IBM para a Universidade de Harvard, segundo um projecto de um elemento desta universidade, Howard H. Aiken, o MARK I pesava 5 toneladas e era constituído por 78 dispositivos interligados por cerca de 800Km de cabos. Trabalhou durante 15 anos e foi retirado de funcionamento em 1959. Realizava operações com números com 23 dígitos (subtracções e adições em 3 décimos de segundo e multiplicações em 6 segundos). Era programável com fita perfurada e capaz de controlar automaticamente máquinas de escrever eléctricas. Uma vez começado um programa tinha que ser levado até ao fim sem hipótese de (inter)acções humanas ou alterações de qualquer ordem. A história do software como peça fundamental no funcionamento de um computador começa, portanto, na década de 40 e, particularmente, com a contratação, por parte da marinha dos EUA, duma jovem matemática, Grace M. Hopper, que tem como missão trabalhar com Howard Aiken em Harvard. Figura 8: Grace Hopper. 1945 - Seria contudo necessário um outro avanço particular para atingirmos o conceito actual de computador: o conceito de armazenamento de informação. O armazenar das instruções e dados num dispositivo físico que funcionaria como uma memória e que pudesse ser alterado pelo próprio computador nasceu com Von Neumann e foi rapidamente aproveitado para a construção de novas máquinas, como: 1946 – o ENIAC (Electronic Numerical Integrator And Calculator), que constitui o primeiro computador electrónico digital. Nasceu na Universidade da Pensilvânia, através dos esforços de J. Presper Eckert e John W. Mauchly, e foi desenvolvido para o exército dos EUA, usando já válvulas (ao invés de relés eléctricos e dispositivos mecânicos) e flip-flops para a memória; 1949 – o EDSAC (Electronic Delay Storage Automatic Computer ), britânico, construído no Laboratório Matemático da Universidade de Cambridge por Maurice Wilkes, constituí-se como o primeiro Métodos de Programação I Departamento de Matemática, FCTUC 5 2005/06 computador electrónico digital com memória para programas completamente operacional. (Pelo que discute com o ENIAC o título de verdadeiro primeiro computador!) A partir deste ponto, o desenvolvimento, quer físico quer lógico, dos computadores disparou até aos nossos dias. O primeiro computador disponível comercialmente foi o UNIVAC, em 1950, ainda bastante oneroso, logo, só usado por empresas com algum porte, e aparecem também os primeiros dispositivos periféricos. Em 1951, Grace Hopper regista um problema com o UNIVAC I, devido a uma borboleta (traça - bug) que se introduziu no equipamento produzindo resultados errados. Desde aí, “BUG” continua a ser usado para significar erro ou defeito de um programa, e testar um programa para verificar se não existem erros de execução diz-se : fazer o “debug” ou “debuging” do programa (isto é, retirar os “bugs”). Na década de cinquenta aparecem os primeiros compiladores e desenvolvem-se as primeiras linguagens. No início da década de 60, surge a 2ª geração de computadores com a introdução dos transístores em substituição das válvulas electrónicas. Em 1967, com a introdução generalizada de circuitos integrados em vez de transístores, inicia-se a 3ª geração de computadores. Surgem novas linguagens de programação e os sistemas operativos tornam-se independentes da arquitectura dos computadores. Em 1968, Edsger W. Dijkstra, com um artigo na revista ACM (Association for Computer Machinery) observa que a qualidade da programação é função inversamente proporcional ao uso de instruções go to. Despoleta assim um movimento que culminará com o aparecimento e definição da Programação Estruturada. Figura 9: Edsger W. Dijkstra. Durante a década de 70 há um aumento progressivo da capacidade de memória, velocidade de operação e diminuição do tamanho dos computadores. Fala-se pela primeira vez na possibilidade de ligar mais do que um computador em rede de comunicação. Na década de oitenta, com o aparecimento dos circuitos de integração em larga escala (VLSI - Very Large Scale Integration) surgem os primeiros computadores pessoais e a ideia de uma rede de computadores interligados toma forma: dá-se nascimento do correio electrónico (e outro tipo de comunicações entre computadores) que culmina, já na década de noventa pela ligação geral de computadores de qualquer tipo através do uso de linhas telefónicas: Multimédia/Internet - acesso a computadores remotos, comunicação inter-computador, transmissão directa de som/imagem/texto (WWW, World Wide Web). 1.2. A Informática e suas Principais utilizações A informática é a ciência do tratamento automático da informação e o computador um sistema electrónico que permite armazenar grandes quantidades de informação e, sobre ela, realizar, a velocidades muito elevadas, manipulações e operações aritméticas e lógicas elementares. Comecemos por ver quais são os principais campos de aplicação da informática e do uso de computadores. Os computadores podem ser primariamente divididos em duas grandes áreas, consoante o tipo de aplicação pretendido: Aplicação Específica Aplicação Geral (ou generalistas) Destinados a realizar um tipo pré-determinado e limitado de tarefas Programáveis consoante a necessidade do momento Aparecem também campos de aplicação principais, agrupados do modo seguinte: Métodos de Programação I Departamento de Matemática, FCTUC 6 2005/06 • ÁREA COMERCIAL - GESTÃO - CONTROLO DE PROCESSO A aplicação mais comum dos computadores e uma das grandes responsáveis pelo desenvolvimento da informática, tem a ver com o processamento de informação através do uso de bases de dados - agrupamento de informação inter-relacionada em entidades independentes, de modo a poder ser obtida de um modo eficiente, uma consulta pertinente para servir determinado objectivo. Usualmente, o volume de dados é grande e o cálculo é diminuto, sendo a rapidez do computador aproveitada para manusear rapidamente um volume muito grande de informação. Desde a administração às linhas de montagem, há um lugar francamente rentável e positivo para os computadores em todas as empresas, de qualquer dimensão. Apenas alguns exemplos: Facturação Contabilidade Controlo de Produção Análise Financeira Gestão de Recursos ... • ÁREA CIENTÍFICA A principal característica nesta área é o grande volume de cálculo a executar em qualquer altura, muitas vezes acompanhado de um volume enorme de dados. Milhares de aplicações científicas são executadas diariamente em computadores em todas as áreas científicas. Exemplos: Meteorologia Engenharia Civil Engenharia Química Robótica Astrofísica Astronáutica Arquitectura ... • SERVIÇOS PÚBLICOS E SAÚDE São inúmeras as aplicações dos computadores na área pública. Sobretudo na projecção e planificação de cenários possíveis para problemas tão diversos como o da poluição, um processo de gestão pública ou o recenseamento, seria extremamente difícil e moroso realizar estudos correctos e profundos sem o auxílio de um computador. Avaliar sistemas de transportes e propor alterações, estudar estatisticamente o funcionamento dos sinais luminosos de tráfego, realizar estudos sobre o sistema e percurso de recolha do lixo, enfim, um sem número de actividades possíveis. Por outro lado, a manutenção de ficheiros completos e actualizados sobre pacientes, programas de diagnóstico, bases de dados sobre produtos farmacêuticos permanentemente actualizadas, podem significar uma diferença notável na qualidade do serviço e, consequentemente, no conforto e, até mesmo, na vida dos pacientes. Actualmente, a ligação via Internet permite a realização de vários actos médicos, desde (tele) consultas a intervenções cirúrgicas (orientadas) à distância. • EDUCAÇÃO - HUMANÍSTICAS Uma das vantagens fundamentais trazidas pelos computadores actuais é a da disponibilidade de informação 24 horas por dia. Para além disso, podem ser uma ajuda notável ao processo de raciocínio lógico, através da formulação de processos de solução de problemas (algoritmos). Existem mesmo disciplinas onde apenas a simulação usando um computador pode aproximar Métodos de Programação I Departamento de Matemática, FCTUC 7 2005/06 o estudante da vida real e da implementação prática dos processos teóricos, como é, por exemplo, o caso das ciências políticas. Para além das vantagens de aprendizagem óbvias, todos nós temos necessidade de produzir texto, sendo o computador um auxiliar único no género. As possibilidades oferecidas por um bom processador de texto, não só através da possibilidade de correcção de erros, mas também através das bases de dados e outras combinações possíveis, tornam o ofício (jornalistas), a arte (escritores) ou a necessidade de escrever (todos nós) em algo bem mais criativo. Como nota final, merecem destaque certas aplicações especiais ou especializadas de processadores/programas especializados como sejam, por exemplo, o ensino por computador (CAI Computer Assisted Instruction), o desenho de computadores assistido por computador (CACD - Computer Aided Computer Design), o controlo de rotas e, principalmente, a aterragem de aviões. 1.3. Descrição básica de um Computador Digital Num sistema informático, dados são o material básico da informação e só podem ser considerados (eles mesmos) como informação num sentido limitado do termo. Dados são símbolos que, agrupados e manipulados convenientemente, podem construir informação. Apesar de usarmos ambos os termos de um modo bastante livre ao falar, só é considerado informação um conjunto de símbolos dispostos segundo determinada ordem e forma, útil ao fim a que se destina. O processamento é a manipulação dos símbolos (ou dados) de modo a criar, modificar ou consultar informação. O processamento de informação consiste, então, nas seguintes funções elementares: • introdução dos dados necessários • manipulação e transformação (classificação, cálculo, ordenamento, resumo) • comunicação de resultados (armazenamento, recuperação, reprodução Assim, podemos descrever a actividade de um computador através da descrição das suas funções mais gerais: Funções Básicas de um Computador • Entrada de informação - Dados • Processamento • Controlo de funções • Armazenamento de informação - Memória • Saída de Resultados Estas funções básicas são agrupadas num modelo, dito Modelo de Von Neumann, que, apesar de ter sido concebido em 1944, ainda hoje representa a organização interna de qualquer computador digital não paralelo: