Códigos de caracteres ASCII, IS 8859 e Unicode

 

  • Códigos de caracteres
    • Visão geral
      • tabela com mapeamento de caracteres para valor escalar (números inteiros);
      • cada inteiro é denominado ponto de código ou código;
      • espaço de código é o conjunto dos números inteiros que possuem representação em determinada codificação;
    • ASCII e Latin-1
      • o padrão ASCII utiliza 7 bits (espaço de código de 0 até 127) armazenados em 1 byte, já os códigos 128 a 255 não são utilizados;
      • o padrão Latin-1 (IS 646) utiliza 8 bits (0 até 255 ou 256 pontos de código) em que foram adicionadas letras latinas acentuadas;
      • códigos de 0 até 31 são caracteres de controle, sem representação gráfica, a maioria para transmissão de dados (em desuso);
    • IS 8859
      • o padrão IS 8859 definiu a página de código, com 8 bits para cada idioma ou conjunto de idiomas;
      • IS 8859-1 é o próprio Latin-1, IS 8859-5 para russo e sérvio, IS 8859-9 para turco, até IS 8859-16 para romeno e esloveno;
      • o padrão IS 8859 não permite misturar as páginas de código, nem suporta idiomas com ideogramas;
    • Unicode (link)
      • Visão geral
        • Unicode é um padrão de codificação de caracteres projetado de ser universal, eficiente, seguro e não ambíguo;
        • define uma forma consistente de codificação para multi línguas em conformidade com IS 10646:2014;
        • provê capacidade para codificar todos os caracteres (alfabéticos, ideograma e símbolos) usados para escrita no mundo;
        • associa um valor numérico imutável e um nome para cada caractere, além de planos à identidade, comportamento e direção;
        • fornece especificação para manipulação de texto: divisão de palavras, ordenação, formatos de números, datas, horas, direção;
        • permite combinação dinâmica de n-caracteres com representação equivalente ao caractere seguido do acento (e’=é);
        • utiliza 3 formas de codificação: UTF-8, UTF-16 e UTF-32;
      • Planos
        • utiliza 17 planos de 16 bits (0 até 1.114.111), o plano multilíngue básico (plano 0) e 16 planos suplementares (10[16]);
        • 5 bits identificam os planos e 16 bits para cada plano (espaço de código até 10FFFF);
        • o plano multilíngue básico (65.536 pontos de código) possui a maioria dos caracteres comuns as línguas do mundo;
      • Esquemas
        • utiliza 7 esquemas da codificação: UTF-8, UTF-16BE, UTF-16LE, UTF-16, UTF-32BE, UTF-32LE e UTF-32;
        • esquemas de codificação estão relacionados com a ordenação dos bytes (Little ou Big Endian);
        • os esquemas de codificação UTF-16 e UTF-32 utilizam uma marca de ordem de byte (BOM) para identificar a ordem;
        • os esquemas de codificação UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE definem explicitamente a ordem e não usam BOM;
        • o esquema de codificação UTF-8, por ser orientado a byte, é equivalente em Little ou Big Endian, logo não usa BOM;
      • UTF-8
        • o padrão UTF-8 permite identificar 2,14 bilhões pontos de código (2^31 = 2.147.483.648) em um formato orientado a byte;
        • utiliza tamanho variável de 7, 11, 16, 21, 26 ou 31 bits armazenados em 1, 2, 3, 4, 5 ou 6 bytes, respectivamente;
        • código auto sincronizável, pois os bytes não iniciais começam por ’10’, tornando identificável o inicio do próximo caractere;
        • os bits de maior ordem (esquerda para direita) do primeiro byte determinam quantos bytes (1 a 6 bytes) formam o caractere;
        • os bits de dados (d) são utilizados para representar os 17 planos do padrão Unicode (21 bits – 1.114.112 pontos de código);
        • caractere de 1 byte, 7 bits úteis    → 0ddddddd; (compatível com padrão ASCII);
        • caractere de 2 bytes, 11 bits úteis → 110ddddd 10dddddd;
        • caractere de 3 bytes, 16 bits úteis → 1110dddd 10dddddd 10dddddd;
        • caractere de 4 bytes, 21 bits úteis → 11110ddd 10dddddd 10dddddd 10dddddd; (suficiente para suportar o Unicode);
        • caractere de 5 bytes, 26 bits úteis → 111110dd 10dddddd 10dddddd 10dddddd 10dddddd;
        • caractere de 6 bytes, 31 bits úteis → 1111110d 10dddddd 10dddddd 10dddddd 10dddddd 10dddddd;

 

 

 

 

Compilador, montador, ligador e carregador

 

  • Tradução

    • Compiladorproduz linguagem de montagem a partir da tradução do código fonte (relação 1:N);
      • Pré-processamento
        • substitui as macros e anotações (annotations) por código fonte;
        • identifica o posicionamento original das linhas de código para sua referência em mensagens de aviso/erro;
      • Análise → cria uma representação intermediária do código fonte em estruturas de programação (tokens, tabela de símbolos e árvore sintática);
        • Análise léxica (scanner)
          • processamento do código fonte para divisão das instruções em símbolos (tokens);
          • verifica-se a pertinência da entrada em relação ao alfabeto da linguagem;
          • despreza comentários e espaços em branco;
          • produz a tabela de símbolos (tokens) com palavras reservadas, delimitadores e identificadores;
          • os símbolos (tokens) são conversíveis para linguagem de montagem;
        • Análise sintática (parser)
          • a tabela de símbolos (tokens) também pode ser produzida nesta fase;
          • processamento da tabela de símbolos para organização em árvore sintática (árvore hierárquica ou de derivação);
          • a árvore sintática determina a sequência de execução;
        • Análise semântica
          • processamento da árvore sintática para identificação de incoerências semânticas;
          • tipos de variáveis incompatíveis, verifica erros de significado, compatibilidade entre operandos e operadores nas expressões, etc;
      • Síntese (não ocorre em linguagens interpretadas) → prepara as instruções em linguagem de montagem a partir da representação intermediária;
        • Geração de código intermediário
        • Otimização do código
        • Geração do código em linguagem de montagem
    • Montador (assembler)
      • produz código objeto (módulo-objeto ou programa-objeto) a partir da tradução da linguagem de montagem (relação 1:1);
      • converte cada instrução em linguagem de montagem em uma instrução equivalente em linguagem de máquina, sendo dependente da arquitetura;
      • verifica se a sintaxe está correta e resolve as referências simbólicas em endereços reais de memória;
      • substitui o mnemônico pelo código da operação (opcode) em binário, com respectivos operandos;
    • Ligador (link editor)

      • produz código de máquina (código executável, módulo de carga) a partir da ligação de um ou mais códigos objetos (bibliotecas, rotinas);
      • examina o código objeto e substitui as referências externas não resolvidas por código de rotinas ou chamada e passagem de endereços de dados;
      • Ligação estática → incorporado ao executável resultante, o código objeto de rotinas é embutido dentro do executável gerado;
      • Ligação dinâmica → referenciado em execução, o código objeto de rotinas é referenciado, sendo acessado durante a execução;
    • Carregador (loader)
      • tarefa do sistema operacional para carregar o executável em memória, para o espaço de endereçamento de um novo processo, e executá-lo;
      • Carregador absoluto → o executável possui referências a endereços da memória real;
      • Carregador relocável → o executável faz referência a endereços de memória virtual, relativos a zero, sendo realocados pelo carregador para endereços reais;

 

 

 

 

 

Tradução e Interpretação

 

  • Modos de execução de um programa de computador
    • Visão geral

      • ambos os modos executam uma sequencia de instruções equivalentes em código de máquina;
    • Tradução
      • o programa de computador é inteiramente convertido para linguagem de máquina e armazenado;
      • o programa resultante é suficiente para sua execução e estará no controle;
      • a execução do programa resultante é independente do código fonte;
    • Interpretação
      • um interpretador examina e decodifica o código fonte do programa para instruções em linguagem de máquina;
      • cada instrução decodificada é executada imediatamente, conforme é traduzida (programa executado a partir do código fonte);
      • o interpretador está no controle e cada execução depende do acesso ao código fonte;
      • realiza a execução do código subsequente ao processo de análise, a partir do código fonte, sem gerar códigos intermediários;
      • podem ser implementados em hardware, como processador, que é um interpretador por meio de sinais elétricos;
    • Híbrido

      • possui uma fase de compilação (javac/JDK) que traduz o código fonte em código intermediário e uma fase de interpretação (JVM/JRE);
      • a tradução da linguagem-fonte em linguagem-objeto-intermediária contribui para a portabilidade;
      • possui melhor desempenho e portabilidade que linguagens interpretadas;

 

 

 

 

 

Arquitetura multinível

 

  • Visão geral

    • Máquina multinível
      • computador construído em níveis com abstrações de objetos e operações em cada nível para a redução da complexidade;
      • cada nível agrega novas instruções àqueles fornecidas por níveis inferiores que são traduzidas ou interpretadas para o nível N-1;
    • Arquitetura
      • tipos de dados, operações e características de cada nível;
    • Programador de sistema
      • especializado no projeto de níveis de máquina, bem como nos níveis 1, 2 e 3;
    • Programador de aplicações
      • especializado na resolução de problemas do cotidiano, bem como nos níveis 4 e 5;
    • Linguagem numérica
      • linguagem formada por uma série (sequência) de números, voltada para as máquinas, como nos níveis 1, 2 e 3;
    • Linguagem não-numérica
      • linguagem formada por palavras e abreviações, voltada para as pessoas, como nos níveis 4 e 5;
    • Execução de um programa
      • programas escritos na linguagem do nível N são traduzidos ou interpretados para o nível N-1;
  • Máquina multinível
    • Nível 5 → linguagens orientadas a solução de problemas (C, Java, etc);
      • Tradução por compilador;
    • Nível 4 → linguagem de montagem (assembly);
      • Tradução por montador (assembler);
    • Nível 3 → sistema operacional (escalonamento para multitarefa);
      • Interpretação parcial;
    • Nível 2 → arquitetura do conjunto de instruções (ISA) da CPU;
      • Interpretação (microprograma – CISC) ou execução direta (circuitos de execução em hardware – RISC);
    • Nível 1 → microarquitetura (circuitos digitais);
      • Hardware;
    • Nível 0 → lógica digital (portas lógicas implementadas por chips);
  • Arquiteturas da Máquina multinível

    • Nível 5Linguagem de programação
      • modelo afastado do nível de máquina, linguagem de alto nível;
      • estruturadas de forma a melhor refletir os processos humanos de solução de problemas;
      • conjunto de instruções mais conveniente para pessoas usarem;
    • Nível 4Linguagem de montagem ou simbólica (assembly)
      • modelo centrado no computador, dependente da arquitetura da máquina e do processador;
      • associação de um mnemônico (MOV, ADD, …) ao respectivo código da operação (opcode) do processador (arquitetura) alvo;
      • relação de 1 para 1 entre o código programado e as instruções resultantes (linguagem de máquina);
      • os endereços reais em memória (localização dos operandos) são indicados referências simbólicas (nome, label);
      • Diretivas (não são instruções) → orientam o montador quanto a alocação das instruções em segmento de código (.text), de dados (.data), etc;
      • Linguagem de máquina → linguagem de computador primitiva que é diretamente e individualmente executada pelos circuitos do processador;
      • Meta-assembler → uma linguagem para montagem traduzível para distintas arquiteturas (linguagens de máquina);
    • Nível 3Sistema operacional;
      • implementação de memória virtual em que a memória endereçada pelo programa de computador é traduzida para o endereço real de memória;
      • implementação de escalonador para a execução simultânea de programas (multitarefa);
      • Comportamento híbrido
        • instruções recebidas em linguagem de máquina (instruções idênticas ao Nível 2) são repassadas diretamente pelo Nível 2;
        • fornece novas instruções (chamadas do sistema) que são interpretadas para a linguagem de máquina para serem executadas pelo Nível 2;
    • Nível 2Arquitetura do conjunto de instruções (ISA) da CPU;
      • conjunto de instruções embutidas no processador, ou seja, aquelas que ele pode executar, formam a sua linguagem de máquina;
    • Nível 1Microarquitetura (circuitos digitais);
      • a ULA opera os registradores por meio do caminho de dados;
      • o caminho de dados pode ser controlado por um microprograma (interpretador) ou diretamente por hardware;
    • Nível 0Lógica digital (portas lógicas implementadas por chips);
      • as portas podem ser combinadas para formar uma memória de 1 bit;
      • as memórias de 1 bit podem ser combinadas em grupos para formar registradores;

 

 

 

 

Representação numérica e conversão de base numérica

 

  • Representação numérica com sinal (números positivos e negativos)
    • Sinal e magnitude (valor)
      • Sinal → o bit mais à esquerda de um número binário indica se é positivo ou negativo (0: positivo, 1: negativo);
      • Magnitude → valor absoluto do número formado pelos demais bits à direita;
      • o número zero possui duas representações;
    • Complemento de 1
      • inverte-se todos os bits do número;
      • o número zero possui duas representações;
    • Complemento de 2
      • inverte-se todos os bits do número;
      • soma-se 1 ao número invertido;
      • o número zero possui apenas uma representação;
      • 10000010 (-2 em sinal magnitude);
      • 111111110 (-2 em complemento de 2); → inverte-se os bits após o primeiro bit 1 da direita para esquerda, exceto o bit de sinal;
  • Conversão de base numérica

    • Base
      • define cada sistema numérico;
      • indica a quantidade de símbolos existentes;
    • Conversão para base decimal
      • soma da multiplicação cada algarismo pela base elevada a sua potência (posição);
      • 1101[2] = (1*2³)+(1*2²)+(0*2¹)+(1*2^0) = 13[10] → base binária para base decimal;
      • 111[2] = (1*2²)+(1*2¹)+(1*2^0) = 7[10] → base binária para base decimal;
      • 321[8] = (3*8²)+(2*8¹)+(1*8^0) = 209[10] → base octal para base decimal;
      • F71[16] = (15*16²)+(7*16¹)+(1*16^0) = 3.953[10] → base hexadecimal para base decimal;
    • Conversão a partir da base decimal

      • concatenar os restos de forma inversa da divisão do número pela base;
      • 200[10] = 200/2=100 {0}; 100/2=50 {0}; 50/2=25 {0}; 25/2=12 {1}; 12/2=6 {0}; 6/2=3 {0}; 3/2=1 {1}; {1}; = 11001000[2]
      • 230[10] = 230/8=28 {6}; 28/8=3 {4}; {3} = 346[8]
      • 260[10] = 260/16=16 {4}; 16/16=1 {0}; {1} = 104[16]
    • Conversão de base binária para base de potência de 2

      • agrupar sequencias de algarismos da esquerda para direita e substituí-lo pelo seu equivalente;
      • 111101110001[2] = 111 101 110 001 = 7561[8]
      • 111101110001[2] = 1111 0111 0001 = F71[16]

 

 

 

 

 

Representação dos dados em computadores

 

  • Representação dos dados
    • Bit
      • um digito binário, unidade básica de memória, pode assumir o valor 0 ou 1;
      • representado pela distinção de dois valores de uma quantidade física contínua (tensão ou corrente elétrica);
    • Byte
      • grupo ordenado de 8 bits (octeto);
      • representa uma unidade de armazenamento;
    • Palavra
      • valor fixo e constate vinculado ao processador (16, 32 ou 64 bits);
      • representa uma unidade de transferência para processamento de uma instrução e seus operandos (barramento de dados);
      • overflow ocorre quando o resultado de uma operação é maior do que o suportado pela palavra do processador;
    • Posição dos bits em um byte
      • os bits são sempre posicionados a partir da ordem baixa do byte, do bit mais a direita para a esquerda (7[10] = …00000111[2]);
    • Ordenação dos bytes em uma palavra
      • Little Endian (Intel) → palavra com bytes numerados a partir da ordem baixa, do byte mais a direita p/ a esquerda: 3 2 1 0;
        • Número inteiro → 7[10] = …00000111[2]; sempre a direita com byte0=00000111;
        • Cadeia de caracteres → ABCD = 01000100 (D) 01000011 (C) 01000010 (B) 01000001 (A)
      • Big Endian (mainframe) → palavra com bytes numerados a partir da ordem alta, do byte mais a esquerda p/ a direita: 0 1 2 3;
        • Número inteiro → 7[10] = …00000111[2]; sempre a direita com byte3=00000111 (byte3 para palavra de 32 bits);
        • Cadeia de caracteres → ABCD = 01000001 (A) 01000010 (B) 01000011 (C) 01000100 (D)
    • Código de Hamming
      • bits extras que podem ser adicionados a cada palavra para correção de erros, denominada palavra de código;
      • o algoritmo de Hamming adiciona bits extras nas posições que são potência de 2 (palavra de 32bits: 1, 2, 4 ,8, 16, 32);
      • o tamanho da palavra (32bits) somado ao tamanho dos bits extras (6bits) formam o tamanho da palavra de código (38bits);
      • a distância de Hamming é o número de bits diferentes (ou número de erros) entre duas palavras de código (válidas);
      • operação realizada no momento de admissão da palavra com a inclusão de bits extras;
      • processo inverso realizado no acesso a palavra com a remoção de bits extras para obtenção da palavra original;

 

 

 

 

Arquitetura do conjunto de instruções – CISC e RISC

 

  • Arquitetura do conjunto de instruções
    • Arquitetura CISC (Complex Instruction Set Computer)
      • instruções interpretadas por meio de microcódigo interno ao processador;
      • muitas instruções, de tamanho variável e com formato e decodificação complexos (vários ciclos p/ execução de uma instrução);
      • instruções do tipo registrador-memória (resultado armazenado em memória pela instrução);
      • acesso à memória por qualquer instrução e com muitos modos de endereçamento;
      • poucos registradores, com mais acessos à memória e menor eficiência;
      • não utiliza ou faz pouco uso de pipelining;
      • compilador mais simples em que a tradução da linguagem de alto nível resulta em menos código (devido as instruções complexas);
      • hardware mais complexo com frequências mais baixas;
    • Arquitetura RISC (Reduced Instruction Set Computer)
      • instruções executadas diretamente pelo circuito do processador (hardwired), sem interpretação por microcódigo;
      • poucas instruções, de tamanho fixo e com formato e decodificação simples (executa uma instrução por ciclo);
      • instruções do tipo registrador-registrador (resultado em registrador para armazenamento em memória por store);
      • acesso à memória somente por load e store e com endereçamento por registrador;
      • muitos de registradores, inclusive para operandos;
      • projetada para a utilização de pipeline;
      • compilador mais complexo em que a tradução da linguagem de alto nível resulta em mais código (devido as instruções simples);
      • hardware mais simples com frequências mais altas;
    • Arquitetura híbrida
      • instruções comuns são executadas diretamente por hardware (em um único ciclo do caminho de dados);
      • instruções complexas são interpretadas por meio de microcódigo;