Esse post fala sobre o capítulo 1.3 do livro "Organização e Projeto de Computadores: Interface Hardware/Software"
-
O começo desse capítulo deixa explícito que o computador só pode executar instruções de baixo nível e há várias camadas que interpretam ou traduzem as operações de alto nível para baixo nível. Esse é um grande exemplo de abstração.
Essas camadas demonstram a organização de maneira hierárquica. software de sistemas
seria serviços como: sistemas operacionais, compiladores, carregadores e montadores.
Software de aplicações
é o que nós, devs, normalmente codamos muito: apps de web, desktop e afins.
Há muitos software de sistemas
, mas os mais fundamentais são: sistemas operacionais e compiladores.
Um ponto interessante é que, no contexto desse livro, C/C++ é considerado linguagem de alto nível. Já vi algumas pessoas falando isso também, e faz sentido, mas quando comparado com Python por exemplo, eu também acho que faz sentido chamar C/C++ de baixo nível. Será que cabe perspectiva nessa "discussão"? Honestamente não ligo muito para essa terminologia 😅.
Continuando, sistema operacional é importante por conta da manipulação de operações básicas de entradas e saídas, alocamento de memória, além de ser o caminho de comunicação amigável entre o usuário e o hardware. Já o compilador é responsável por traduzir linguagens de alto nível para instruções de máquina.
Sobre instruções de máquina:
Nossas instruções são grupos de bits que o computador entende e obecede. Nada mais são que sinais elétricos resumidos em 0's e 1's.
Gostaria de fazer uma menção honrosa ao excelente jogo "Turing Complete" isso é bastante demonstrado lá.
Sobre montador (assembler):
Um assembler traduz a versão simbólica de uma instrução para binário.
add A,B
seria traduzido para:
1000110010100000
Essa instrução diz para o computador somar dois números A
e B
. E essa linguagem simbólica foi denominada como assembly
.
Também existem linguagens que ignoram essa etapa intermediária já traduzindo diretamente para linguagem de máquina. Um exemplo é o GoLang, que após utilizamos o go build
, é gerado um executável binário.
Então, por que não codamos em binário e assembly?
Utilizar linguagens de alto nível:
- Permite que o programador pense em uma linguagem mais natural, e também há linguagens projetadas para fins específicos.
- Aumento de produtividade.
- Permite que os programas sejam independentes do computador no qual estão sendo desenvolvidos. Compiladores e Montadores traduzem o programa para instruções binárias de qualquer máquina.