byte, address e dispositivos
Suponha que você tem uma variante de C++0x onde existem apenas os tipos: byte, address e size. byte é uma sequência de oito bits, address é uma posição na memória e size é a distância entre duas posições na memória.
Com bytes você pode fazer bit shifting e outras operações próprias de sequências de bits; com address você pode navegar pela memória, obtendo sucessores e predecessores; com size você pode navegar pela memória a passos largos.
Suponha, além disso, que o programa tem à disposição um allocator que obtém pedaços de memória com tamanho fixo, e acesso a dispositivos por uma API razoável.
Que tipos de programa você poderia escrever?
Você poderia copiar dados de um dispositivo para outro:
void copy (device& in, device& out)
{
const size length = allocator.page_size();
address buffer = allocator.allocate_page();
size n;
while ((n = in.read(buffer, length)) > 0) out.write(buffer, n);
}
Você poderia copiar dados, criptografando com XOR:
void copy_and_encrypt (device& in, device& out, byte key)
{
const size length = allocator.page_size();
address buffer = allocator.allocate_page();
size n;
while ((n = in.read(buffer, length)) > 0)
{
for (address i = buffer; i != buffer + length; ++i) *i ^= key;
out.write(buffer, n);
}
}
Acredito que você poderia realizar praticamente todo tipo de criptografia apenas com operações binárias.
De onde um programa obteria a chave? De outro dispositivo de entrada, talvez.
Meu ponto é que nada disso está relacionado com aritmética em domínios numéricos; mesmo com a existência de size no programa, que é claramente uma "quantidade". Ainda é possível escrever programas interessantes mesmo sem a possibilidade de realizar aritmética com valores do tipo size.

0 comentários:
Postar um comentário