Arquitetura de computadores - Endianness Há diversos sistemas computacionais existentes no mercado. É de extrema importância destacar um ponto de diferenciação entre eles, que são as plataformas e arquiteturas. Plataforma: É um conjunto de elementos físicos e lógicos que constroem um sistema computacional, esses elementos são hardware, sistema operacional e biblioteca de tempo de execução (aplicação). Exemplo: Plataforma RISC IBM PPC (IBM PowerPC), Plataforma Intel Itanium, Plataforma CISC Intel X86, etc. Arquitetura: É uma característica de uma determinada plataforma que descreve a arquitetura de uma CPU e ULA baseadas em registradores e barramentos de dados, ou seja, isso refere-se no poder de endereçamento entre processador x memória principal. Exemplo: 32 Bits e 64 Bits Plataforma x Arquitetura: É a característica do sistema computacional como um todo, esse casamento ditará o funcionamento do computador em relação a software e hardware. Exemplo: IBM PPC PowerPC 64 bits, Intel X86 32 bits, Oracle SPARC M-Series 64 bits, etc. O que é Endianness? É uma convenção usada por uma plataforma computacional, cujo objetivo é interpretar um conjunto de bytes que formam um "data word", que por sua vez é armazenado de forma temporária na memória principal e de forma permanente em disco. Os dados são temporariamente armazenados em memória principal em forma de dados binários organizado em unidades de 8 bits, chamado de bytes. Ao ler ou escrever um "data word", a ordem dos bytes armazenados em memoria principal determina a interpretação de um "data word", ou seja, é neste cenário que nos deparamos com incompatibilidade entre plataformas. Por exemplo, um banco de dados que está instalado em Linux com Intel 64 bits e deve migrar para um AIX PowerPC 64 bits. A ideia de um sistema computacional é semelhante a uma função matemática, implicando várias situações de entrada e saída de resultados, para atingir um determinado objetivo, dois tipos de entrada e saída são primordiais quando falamos de “Endianness” são eles: Entrada e Saída de dados entre Registradores de CPU e Memoria principal Denomina-se Load/Store: O registrador é destino no Load e a memória principal é origem. O registrador é origem no Store e a memória principal é destino. Entrada e Saída entre memoria principal e disco Denomina-se Disk Read/Write (I/O): A memória principal é destino no Read (input) e o disco é origem. A memória principal é origem no Write (output) e o disco é destino. Neste cenário, a forma de ordenar e organizar os dados é crucial para o processamento de entrada e saída. Podemos presumir então, que uma conversão de plataforma implica em uma nova forma de ordenação e organização dos bytes. Assim conversões de plataformas sem o devido tratamento implica inevitavelmente na corrupção dos dados ou na ininteligência na interpretação dos “data word” a serem processados. Como funciona a ordenação e organização dos bytes nos “data word”? Cada local de armazenamento na memória está associado com um índice, chamado seu endereço, que indica a sua posição. Uma “data word” hexadecimal "A1B2" são armazenados em endereços de memória consecutivos da seguinte forma "0A 01 0B 02", esse "data word" forma um conjunto de 4 bytes, que resulta em 32 bits. O posicionamento do "data word" em memória principal determina-se a ordenação e organização dos bytes, ha 2 possível convenções de organização, são elas: Big-endian: Armazena o byte mais significativo de um "data word" no endereço menor. 0A010B02 = 0A010B02 Os bytes são guardados por ordem decrescente do seu "peso numérico" em endereços sucessivos da memória. Significa que o byte de ordem mais elevada do número está armazenado no endereço de memória mais baixo e de ordem mais baixa, no endereço mais elevado. Little-endian: Armazena o byte menos significativo de um "data word" no endereço menor. 0A010B02 = 020B010A Os bytes são guardados por ordem crescente do seu "peso numérico" em endereços sucessivos da memória. Significa que o byte de ordem mais baixa do número está armazenado no endereço de memória mais baixo e de ordem mais elevada, no endereço mais elevado. Faremos uma analogia com números decimais: “A B C” em Big-endian significa “C B A” em Little-endian. “1 2 3” em Little-endian significa “3 2 1” em Big-endian. Isso mostra que é necessário um tratamento de conversão se quisermos fazer migrações entre plataformas. Quando o Endianness interfere em migração entre plataformas? Com base nos conteúdos anteriores, chegamos à conclusão que a forma de ordenação dos “data word” é a causa de incompatibilidade de programas (software) entre plataformas computacionais, ou seja, o tratamento de baixo nível do sistema computacional provoca essa situação, uma vez que as plataformas tratam a entrada e saída dos dados de forma não similares. A solução para esse problema muitas vezes é a re-compilação do programa computacional, ou seja, a reinstalação do software, assim o código escrito em uma determinada linguagem de programação em alto nível é compilado respeitando a sintaxe do compilador e é gerado o executável em linguagem de máquina para a plataforma. Assim um código em linguagem de alto nível pode ser compilado para qualquer plataforma, desde que o compilador suporte à geração do executável para esta determinada plataforma. Se o mesmo código em linguagem C (código escrito em uma arquivo TXT) for compilado respeitando a sintaxe de cada compilador em suas plataformas o resultado do programa será o mesmo, pois programas iguais geram resultados iguais. Neste caso o Endiannes não interfere, uma vez que programas iguais (código) geram resultados iguais (programa em execução). Em caso de não existência do passo 1, ou seja, a compilação em alto nível, o Endianess é extremamente relevante, pois como dito anteriormente, essa convenção orquestra o tratamento de baixo nível do sistema computacional, o que pode tornar a execução do programa ininteligível para o sistema computacional.