Porque é que a linguagem de montagem depende da máquina?
No nível mais profundo, isso significa que os conjuntos de instruções são diferentes. Colocando uma seqüência particular de bits através de um processador x86 você terá resultados completamente diferentes do que se você colocar o mesmo conjunto de bits através, digamos, de um processador ARM.
Linguagens de nível mais alto "superam" isso porque os computadores fazem praticamente as mesmas coisas, apenas de maneiras diferentes. O ARM tem formas de adicionar dois números juntos como o x86 tem formas de carregar dados da RAM em registros (e vice-versa) como o x86 faz, etc..
Todas as construções de alto nível podem eventualmente ser reduzidas a um conjunto fundamental de operações que podem ser realizadas por todas as máquinas de propósito geral (embora algumas construções possam sair mais eficientes em algumas CPUs do que em outras).
É isso que os compiladores fazem. Eles analisam a linguagem de alto nível e, de uma forma ou de outra, reduzem-na à linguagem da máquina do sistema de destino. Muitas vezes apenas alguns bits do compilador precisam ser escritos de novo para uma nova CPU. Alguns compiladores (GCC é um excelente exemplo) são construídos em camadas que simplificam enormemente este trabalho. Um único desenvolvedor altamente capacitado familiarizado com compiladores e a plataforma alvo poderia produzir uma porta rudimentar com bastante facilidade.
Acima do nível de simplesmente reduzir construções para a linguagem nativa da máquina, há, é claro, questões como entrada/saída, acesso ao sistema de arquivos, etc... Estes também são normalmente tratados em camadas, frequentemente com apenas os níveis mais baixos -- drivers -- sendo reescritos para uma nova plataforma, mantendo uma interface consistente para os níveis superiores.
E até mesmo os drivers podem ser compartilhados, no todo ou em parte, entre tipos de máquinas! As plataformas x86 são't as únicas que tiveram, por exemplo, um barramento PCI. E mesmo onde o barramento é diferente, os dispositivos conectados a eles muitas vezes acabam sendo os mesmos. O Linux compartilha vários drivers de dispositivos em vários tipos de máquinas com pouca ou nenhuma mudança. O compilador lida com os detalhes da tradução para código de máquina e as camadas mais internas do kernel tentam abstrair as outras diferenças comportamentais que podem, o escritor de drivers apenas tem que se ater às interfaces estabelecidas.
Passar isto, você chega a questões sobre se, dentro de uma dada plataforma, algum sistema em particular tem dispositivos (ou categorias de dispositivos) opcionais particulares. Por exemplo, seria tolice para a maioria dos servidores ter aceleradores 3D. Alguns sistemas podem ter um gerador de números aleatórios de hardware, outros podem não ter. Alguns podem não ter armazenamento fixo. No entanto, a "dependência da máquina" é't geralmente não aborda este nível de dependência.
Artigos semelhantes
- Qual é a diferença entre linguagem de máquina, linguagem de montagem e linguagem de alto nível em computadores?
- Porque é que a linguagem de montagem é melhor do que a linguagem de nível da máquina?
- Quais são as vantagens de uma linguagem de montagem na programação sobre uma linguagem de máquina?
- Quão difícil é a linguagem de montagem e é muito mais difícil do que a linguagem C?