Programa
• O modelo de von Neumann do computador digital. Arquitectura
de um computador moderno.
• Representação digital de dados. Códigos binários para
representação de inteiros (código de valor absoluto e sinal e código de complementos de 2), reais (vírgula flutuante),
caracteres (ASCII, unicode), imagem (RGB, JPEG) e som (PCM).
• Operações numéricas sobre dados binários. Problemas ligados à
imprecisão da representação dos números reais em vírgula flutuante.
• Processadores. Funcionamento de um CPU. Representação
binária do código executável de um programa.
Programa
• Assembladores, compiladores e interpretadores. Linguagens de
programação de alto nível e de muito alto nível (VHLL). Sistemas operativos.
• Introdução à linguagem de programação Python.
• A instrução de atribuição. Aliasing. Noção de ponteiro.
• Tipos numéricos: inteiros, inteiros longos, números em vírgula
flutuante e complexos.
• Sequências (listas, tuplas e sequências de caracteres). Iteração
sobre sequências e operações de fatiagem (slicing). Dicionários.
• Instruções de controlo de fluxo: if..elif..else,
while..else, for..else.
Programa
• Funções. Espaço dos nomes e regras de alcance. Mecanismo de
passagem de argumentos e devolução de valores.
• Programação funcional e imperativa. Funções puras. As
ferramentas de programação funcional lambda, map, filter e reduce. Abrangências. Exemplos de pequenos programas em estilo funcional.
• Módulos. Ferramentas de introspecção e metaprogramação. • Ficheiros. Formatação. Redirecção dos canais de fluxo de
entrada e saída.
Programa
• Programação orientada por objectos. Noção de classe e
instâncias de classe. Atributos e métodos. Herança,
encapsulamento e polimorfismo. Sobrecarga de operadores. Objectos persistentes: módulos pickle e shelve.
• Excepções. As instruções raise e try..except..finally. • Recursão. Iteradores e geradores.
• Resolução de equações não-lineares: método da bissecção,
iteradores de ponto fixo, Regula-Falsi e Newton-Raphson.
Programa
• Interpolação de Lagrange.
• Ajuste de curvas a dados experimentais pelo método dos
mínimos quadrados.
• Derivação e integração numérica: método do trapézio, regra de
Simpson. Mínimos de curvas de energia potencial intramoleculares, momentos de inércia, etc.
• Resolução de equações diferenciais ordinárias: método de Euler,
Heun (preditor-corrector), Runge-Kutta e Runge-Kutta-Fehlberg (de passo adaptado). Equações do decaimento radioactivo,
osciladores, projécteis, movimento planetário, etc.
• Monte-Carlo.
Avaliac¸˜ao
• A avaliação da disciplina é feita por frequência (opcional) e por
exame. Uma classificação de frequência igual ou superior a 10 valores concede dispensa de exame.
• Os exames e a frequência têm ambos uma parte teórica e uma
parte prática com a cotação de 12 e 8 valores, respectivamente.
• A parte teórica contém uma série de 20 questões de escolha
múltipla e 3 questões de desenvolvimento. A parte prática
consiste na resolução de problemas (algoritmo e codificação do programa frente ao computador).
• A parte prática da frequência desenrola-se em duas sessões (2*3
problemas, 2 * 4 valores). Nos exames a parte prática é uma sessão única com 3 problemas.
Avaliac¸˜ao
• É garantida a nota da parte prática de frequência se for igual ou
superior a 4 valores.
• É garantida a nota da parte teórica de frequência se for igual ou
superior a 6 valores.
• Na parte prática é permitida a consulta a todo o material de
apoio. A parte teórica é sem consulta.
• As datas da frequência e dos exames são:
Prova Data Hora
1a Sessão Prática da Frequência 23/11 14h e 17h
Sessão Teórica da Frequência 16/12 9h
2a Sessão Prática da Frequência 16/12 14h e 17h
O computador digital
• Computador digital
Sistema digital programável que permite armazenar e processar informação em formato digital a velocidades elevadas, realizando operações aritméticas e lógicas elementares.
• Programa
Sequência de instruções que processam os dados.
• Os programas e os dados são armazenados na memória do
computador em formato digital usando um código binário.
O computador de Atanasoff e Berry
• O 1o computador digital (ABC) foi construído em 1939
(Atanasoff/Berry). A memória era formada por condensadores cujo estado de carga representava um número binário. Os
condensadores estavam montados em cilindros de baquelite com uma banda metálica na superfície exterior através da qual era
feita a leitura da memória. Cada cilindro tinha 30 cm de altura e 20 cm de diâmetro e podia guardar 30 números. . . Os dados eram introduzidos com cartões perfurados e o armazenamento dos resultados intermédios era feito queimando pequenos pontos num cartão com uma faísca: a resistência das partes
carbonizadas do cartão era diferente da das partes não queimadas. . .
O Z3 de Konrad Zuse
• Konrad Zuse constrói em 1938, na Alemanha, o Z1, um
computador capaz de efectuar cálculo em vírgula flutuante. Em 1941 Zuse completa um novo modelo, o Z3, destruído por uma bomba em 1944. Todos os modelos de Zuse usavam relés (Zuse não acreditava na fiabilidade das válvulas) e películas de
celulóide (filmes antigos) perfuradas para leitura dos programas e dos dados (o papel era escasso. . . ).
O MARK I
• Howard Aiken constrói em Harvard, em 1944, o IBM ASCC
(Automatic Sequence Controlled Calculator), mais conhecido por MARK I: > 750000 componentes, 15 m de comprimento, 2,40 m de altura, 4,5 toneladas! Velocidade de processamento: 0.00083 MIPS (Milhões de Instruções por Segundo)! (Os números tinham 23 bitse o Mark I conseguia multiplicar dois deles em 4
segundos. . . )
• Em 1947, Aiken previu que não haveria necessidade, nos EUA,
de mais do que 6 computadores. . .
O MARK I em Harvard (Abril de 1948)
O COLOSSUS de Alan Turing
• Em Dezembro de 1943 Alan Turing completa o COLOSSUS, um
dos primeiros computadores digitais electrónicos programável. Mas foi construído para decifrar as cifras dos nazis e não era capaz de efectuar multiplicações decimais. . . O COLOSSUS tinha 1800 válvulas.
O ENIAC
• O primeiro computador electrónico para uso geral foi construído
por John William Mauchly e J. Presper Eckert Jr. entre 1943 e 1946, na Universidade da Pensilvânia: o ENIAC (Electronic
Numerical Integrator And Computer). Ocupava 93 m2, tinha 3 m
de altura e pesava 27 toneladas. Os seus 10000 condensadores, 70000 resistências, 6000 interruptores e 18000 válvulas
necessitavam de 150 kW!
• Um dos problemas principais do ENIAC era a avaria das válvulas:
em média, 50 válvulas eram substituídas por dia!
O ENIAC
O EDVAC
• O ENIAC não possuía memória interna: tinha de ser fisicamente
programado usando interruptores e botões.
• Em 1944 Mauchly e Eckert decidiram construir um computador
com memória interna, para permitir que o programa executasse funções diferentes de acordo com o resultado obtido em cálculos anteriores: o EDVAC (Electronic Discrete Variable Automatic
Computer), que ficou operacional em 1952.
• O primeiro computador comercial, o UNIVAC I (UNIVersal
Automatic Computer), surgiu em 1951 e era baseado no EDVAC.
O EDVAC
Outras datas na hist´oria dos computadores
• 9 de Setembro de 1945: Grace Hopper (que desenvolveu o
primeiro compilador) encontra uma traça num dos relés do MARK II de Harvard e escreve no seu logbook: “First actual case of a bug being found”.
• Maio de 1973: o Micral, o primeiro computador baseado num
micro-processador (o Intel 8008) é lançado em França.
• Janeiro de 1975: é anunciado o Altair 8800, um kit para montar
em casa que se baseava no micro-processador 8080 da Intel e tinha 256 bytes de memória interna. Programava-se usando um painel de interruptores.
• Abril de 1975: Paul Allen e Bill Gates fundam a Microsoft e
lançam, em Julho, um interpretador BASIC para o Altair 8800.
A ´arvore geneal´ogica dos computadores
Outras datas na hist´oria dos computadores
• 1971: Surge a primeira versão do sistema operativo UNIX (Bell
Labs).
• 1 de Abril de 1976: Steve Wozniak e Steve Jobs fundam a Apple
poucas semanas depois de terem construído o Apple I, baseado no microprocessador 6502 da Motorola.
• 1979: É lançada a folha de cálculo VisiCalc para o Apple II. • 1981: A IBM inicia a venda do “IBM Personal Computer”. • 1985: Richard Stallman publica o “GNU Manifesto”.
• Dezembro de 1991: Linus Torvalds lança a versão 0.1 do sistema
operativo Linux.
O modelo de von Neumann
• O matemático Johann von Neumann, consultor do projecto
Manhattan, envolve-se nos projectos do ENIAC e do EDVAC em Junho de 1944. Inspirado por estes, concebe um modelo téorico para um computador, que é o modelo adoptado até hoje.
• O computador é constituído pelas seguintes unidades funcionais: ◦ Memória central
◦ Unidade aritmética e lógica ◦ Unidade de controlo
◦ Unidades de entrada e saída
• Hoje em dia o processador engloba a unidade aritmética e lógica
e a unidade de controlo.
O modelo de von Neumann
Unidade
controlo
de
E/S
de
Unidades
A/L
Unidade
Memoria
Central
C
C
C
I
D
R
D
D
R
R
´
Computadores e Programac¸˜ao – p.23O modelo de von Neumann
• O processador não efectua operações directamente sobre a
memória (à excepção da transferência de dados).
• O processamento é feito em células especiais de memória no
interior da UAL denominadas registos.
• A tranferência de dados entre a memória central e os dipositivos
de entrada e saída pode ser feita passando pelo processador ou através de acesso directo à memória (DMA).
Informac¸˜ao Digital
• Os computadores processam informação digital. • Grandeza analógica
Varia de forma contínua (ex: temperatura lida num termómetro de Hg).
• Grandeza digital
Descontínua (existe apenas um número finito de estados).
• Elemento mínimo de informação: d´ıgito bin´ario (bit). • bit: 2 estados 0 ou 1.
Informac¸˜ao Digital
• Um conjunto de n bits pode tomar 2n configurações distintos,
podendo representar 2n objectos ou informações elementares. • Exemplo com 3 bits:
Configurações possíveis (8 = 23): 000, 001, 010, 011,
100, 101, 110, 111.
• Podemos utilizar estas combinações de bits para representar de
forma unívoca 8 letras do alfabeto:
A 000 E 100 B 001 F 101 C 010 G 110 D 011 H 111
Codificac¸˜ao/descodificac¸˜ao
• Os computadores processam (apenas) informação/dados em
formato digital.
• Todos os dados têm que ser codificados num formato digital para
serem passíveis de tratamento informático.
• Para cada tipo de dado tem de se estabelecer um código que
permita atribuir uma configuração binária única a cada dado
desse tipo → codificação. A operação inversa é a descodificação.
• Vamos passar em revista alguns dos códigos actualmente usados
para representação digital de vários tipos de dados num computador:
◦ Números inteiros, inteiros relativos e reais ◦ Caracteres
◦ Som e imagem
Codificac¸˜ao de inteiros
• A forma mais simples de representar um número inteiro num
formato digital corresponde a utilizar a sua representação binária, isto é, na base 2.
• O número é representado por n bits
an−1an−2 · · · a0
onde ai = 0, 1 e i = 0, ..., n − 1.
• O inteiro correspondente a esta sequência de bits é:
an−12 n −1 + a n−22 n −2. . . + a 0 = nX−1 i=0 ai2 i
• Este código designa-se por código binário ponderado.
Codificac¸˜ao de inteiros
• O maior número inteiro que é possível representar com um
conjunto de n bits é n −1 X i=0 2n = 2n − 1
• n bits → 2n números inteiros, incluindo o zero: 0, 1, . . ., 2n −1.
Convers˜ao decimal/bin´ario
• A conversão de um número inteiro na base 10 em código binário
ponderado é muito fácil.
• Exemplo: Conversão do decimal 203 para a base 2.
Representando o quociente e o resto da divisão inteira pelos operadores div e mod, temos:
203 div 2 =101; 203 mod 2 = 1 = a0; 101 div 2 = 50; 101 mod 2 = 1 = a1; 50 div 2 = 25; 50 mod 2 = 0 = a2; 25 div 2 = 12; 25 mod 2 = 1 = a3; 12 div 2 = 6; 12 mod 2 = 0 = a4;
6 div 2 = 3; 6 mod 2 = 0 = a5; 3 div 2 = 1; 3 mod 2 = 1 = a6; 1 div 2 = 0; 1 mod 2 = 1 = a7; Então 20310 = 110010112.
Convers˜ao decimal/bin´ario
• A conversão inversa (binário → decimal) é trivial.
• Exemplo: 110010112 = 1 × 27 + 1 × 26 + 1 × 23 + 1 × 2 + 1 = 203 10
Notac¸˜ao octal/hexadecimal
• É comum utilizar-se a notação hexadecimal, (base 16) para
exprimir de forma mais compacta números binários. Cada dígito hexadecimal equivale a 4 dígitos binários.
• Noutra notação, denominada octal, o número é representado na
base 8, em que cada dígito octal (0 . . . 7) agrupa 3 bits.
• Em hexadecimal são utilizados os 16 símbolos 0, 1, 2, . . . , 9, A,
B, C, D, E, F. Por exemplo, o número 20010 pode ser escrito como
110010002, C816 ou 3108.
Tabela de convers˜ao entre as bases mais usadas Binário 0000 0001 0010 0011 0100 0101 0110 0111 Decimal 0 1 2 3 4 5 6 7 Hexa. 0 1 2 3 4 5 6 7 Octal 0 1 2 3 4 5 6 7 Binário 1000 1001 1010 1011 1100 1101 1110 1111 Decimal 8 9 10 11 12 13 14 15 Hexa. 8 9 A B C D E F Octal 10 11 12 13 14 15 16 17
• A transcrição de um número inteiro na base 10 para base 2 pode
ser facilitada, sobretudo quando se trata de números grandes, fazendo primeiro a transcrição para hexadecimal, e utilizando a tabela acima para transcrever cada dígito hexadecimal na
correspondente sequência de 4 algarismos binários.
Adic¸˜ao de n´umeros inteiros
• Como é que os computadores fazem operações aritméticas? • Comecemos por um exemplo simples, a adição de números
inteiros.
• Começando pelo bit menos significativo, adicionam-se os 2
primeiros bits, escrevendo por baixo a respectiva soma. Se o resultado exceder a capacidade de um único bit faz-se o
“transporte” de um 1 para a coluna seguinte, e soma-se esse transporte conjuntamente com os bits dessa coluna.
• Por conveniência, vamos representar no bit Ci de um conjunto
auxiliar de n bits o transporte que vai da coluna i para a coluna i + 1 e nos bits Ti de um outro conjunto auxiliar o transporte que
vem da coluna i − 1 para a coluna i.
Adic¸˜ao de n´umeros inteiros
• A operação adição em binário toma então a seguinte forma
simbólica: Tn Tn−1 . . . T1 T0 An An−1 . . . A1 A0 Bn Bn−1 . . . A1 B0 Sn Sn−1 . . . S1 S0 Cn Cn−1 . . . C1 C0 • Nota: T0 = 0 e Ti = Ci −1. Se Cn 6= 0 → ocorreu transbordo (overflow)! Computadores e Programac¸˜ao – p.35
Adic¸˜ao de n´umeros inteiros
• Consideremos um computador que utiliza 8 bits para codificar
inteiros. O maior número inteiro representável nesta codificação é 255 (confirme!).
• A operação de adição em binário efectua-se de forma análoga à
adição em decimal. • Exemplo: 100 + 88 = 188. 10010 = 011001002 8810 = 010110002 T 10000000 A 01100100 = 100 B 01011000 = 88 S 10111100 = 188 C 01000000 C7 = 0 → OK Computadores e Programac¸˜ao – p.36
Adic¸˜ao de n´umeros inteiros
• Exemplo de transbordo em 8 bits: 189 + 88 = 277 > 28 − 1 = 255.
T 11110000 A 10111101 = 189 B 01011000 = 88 S 00010101 6= 277 C 11111000 C8 = 1: resultado inválido Computadores e Programac¸˜ao – p.37
Adic¸˜ao de n´umeros inteiros
• Os dígitos binários S e C são funções (booleanas) de 3 variáveis
— os dois dígitos a adicionar e o transporte anterior: S(A, B, T ); C(A, B, T ).
• Pode-se mostrar que as funções S e C têm a seguinte forma
algébrica,
S(A, B, T ) = ¯A ¯BT + ¯AB ¯T + A ¯B ¯T + ABT C(A, B, T ) = AB + BT + AT
onde a disjunção e conjunção lógicas são representandas pelo soma e produto, e ¯X representa a negação do valor lógico de X.
Adic¸˜ao de n´umeros inteiros
• A tabela de verdade das funções booleanas S e C é a seguinte:
A B T S C 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 Computadores e Programac¸˜ao – p.39
Codificac¸˜ao de n´umeros relativos
• Existem vários códigos que permitem codificar números inteiros
relativos (códigos bipolares).
• O código bipolar mais simples é o código de sinal e valor
absoluto:
◦ o bit mais significativo representa o sinal ◦ os restantes n − 1 bits o valor absoluto.
• Por convenção, o bit de sinal tem o valor 1 quando o número é
negativo e o valor 0 quando é positivo.
• Por exemplo, numa palavra de 8 bits, os números ±19 têm, neste
código, a seguinte representação binária: +1910 = 00010011 −1910 = 10010011
Codificac¸˜ao de n´umeros relativos
• Vantagem deste código: simplicidade. • Desvantagens:
◦ podem-se representar apenas 2n
− 1 números distintos com n bits e não 2n (o zero tem representação dupla)
◦ a adição de números relativos é problemática.
C´odigo de complementos de 2
• No código de complementos de 2 representam-se os números
positivos como no código anterior, e representa-se cada número negativo somando 1 ao complemento do número positivo que lhe corresponde. Um eventual transbordo que ocorra nesta soma é ignorado.
• Vejamos como representar o número −19 numa palavra de 8 bits
usando este código:
+1910 = 00010011
−1910 = 11101100 + 00000001 = 11101101
• Regra prática para converter um número binário no respectivo
complemento de 2: copiam-se os dígitos, a começar pelo bit menos significativo até encontrar o primeiro “1”, que também se copia. A partir daí, substituem-se os “0”s por “1”s e vice-versa.
C´odigo de complementos de 2
• Vantagens da representação de complementos de 2: ◦ O zero tem representação única (verifique!).
◦ O bit mais significativo pode ser interpretado como bit de
sinal: este bit é zero nos números positivos e 1 nos números negativos.
◦ O bit menos significativo determina sempre se um número é
par ou ímpar, o bit é zero nos números pares e 1 nos ímpares.
◦ O número total de números que é possível representar neste
código numa palavra de n bits é 2n, correspondendo ao
intervalo −2(n−1), . . . , 2(n−1) − 1.
Adic¸˜ao de n´umeros relativos
• A implementação da adição de números relativos é muito simples
em complementos de 2. Utiliza-se o mesmo algoritmo da adição de números inteiros, sendo apenas necessário ter atenção a um eventual transbordo, cuja detecção é mais delicada.
• Exemplo: T 00001010 A 00000101 = 5 B 11110101 = −11 S 11111010 = −6 C 00000101 Computadores e Programac¸˜ao – p.44
Adic¸˜ao de n´umeros relativos
• A subtracção é feita de forma semelhante: para subtrair A de B,
soma-se a B o complemento de 2 de A , ou seja B − A = B + (−A).
• A inspecção do bit de transporte Cn já não é suficiente para testar
se ocorreu transbordo! • Exemplo 1: T 11111110 A 00000001 = 1 B 11111111 = −1 S 00000000 = 0 C 11111111
bit de transporte = 1; OK!
Adic¸˜ao de n´umeros relativos • Exemplo 2: T 11111110 A 01111111 = 127 B 00000001 = 1 S 10000000 = −128 C 01111111
bit de transporte = 0; Huum. . .
Adic¸˜ao de n´umeros relativos
• As seguintes regras devem ser aplicadas para verificar se há
transbordo numa soma de números inteiros relativos em complementos de 2:
1. Se A e B têm sinais diferentes, nunca ocorre transbordo na operação A + B e o resultado é sempre válido.
2. Se A e B têm o mesmo sinal e A + B o sinal oposto, então ocorreu transbordo e o resultado é inválido.
• Forma alternativa de detectar um resultado inválido: comparar os
bits Tn e Cn; se não forem iguais ocorreu transbordo e o
resultado da operação é inválido.
Multiplicac¸˜ao e divis˜ao de n´umeros relativos
• Para multiplicar um número por 2, basta deslocar os bits para a
esquerda uma casa, colocando um 0 no bit menos significativo. Para dividir um número por 2, deslocam-se todos os bits para a direita uma casa, mantendo o bit do sinal com o mesmo valor.
• Exemplo:
54 = 00110110
54 ∗ 2 = 54 << 2 = 01101100 54/2 = 54 >> 2 = 00011011
• No caso de números ímpares, o deslocamento para a direita dá
como resultado a divisão por 2 arredondada para −∞, ou seja, 51 deslocado de um bit para a direita dá como resultado 25; a mesma operação efectuada em −51 dá como resultado −26. Verifique!
Multiplicac¸˜ao e divis˜ao de n´umeros relativos
• As operação de deslocamento de bits podem ser implementadas
de forma eficiente nos circuitos de electrónica digital.
• As multiplicações (e divisões) de inteiros por potências de 2
contam-se entre as operações mais rápidas que o processador pode efectuar, bem mais rápidas do que uma multiplicação ou divisão por outros números!
• Combinando as operações de adição e de shift é possível
efectuar todas as operações aritméticas sobre inteiros.
Representac¸˜ao de n´umeros reais • Na base decimal
17.3210 = 1 × 101 + 7 × 100 + 3 × 10−1 + 2 × 10−2 • Do mesmo modo, na base 2 teremos
17.3210 = 1 × 24 + 0 × 23 + 0 × 22 + 0 × 21 + 1 × 20+ + 0 × 2−1 + 1 × 2−2 + 0 × 2−3 + 1 × 2−4 + 0 × 2−5 = + 0 × 2−6 + 0 × 2−7 + 1 × 2−8 + . . . = 10001.01010001 . . . 2 • Mas 10001.010100012 = 17.3164062510 6= 17.3210! • E 10001.01010001111010112 = 17.319992065429687510!
• Parece não haver representação binária finita de 17.3210. . .