quinta-feira, 12 de fevereiro de 2015

0.0.0.2.5 - O que é compilar e executar?

A resposta curta:
  • Executar significa "entregar' o programa ao computador para que ele o execute.
  • Programas que traduzem arquivos contendo código-fonte em arquivos contendo código de máquina são compiladores.
  • (bônus) Programas que traduzem arquivos contendo código-fonte nas ações correspondentes  são interpretadores.
Caso você tenha se contentado com a resposta curta, mesmo sem entendê-la direito, TALVEZ você não goste realmente do que está aprendendo.

Os detalhes:

A questão pode ser colocada em termos de linguagens e interpretações.

Computadores são máquinas elétricas digitais. Máquinas que chaveiam eletricidade de forma que passe ou não corrente em condutores, ou haja (ou não) tensão elétrica sobre componentes. Por facilidade de implementação, apenas dois símbolos são "permitidos".

O ser humano dá a esses símbolos uma "interpretação", por exemplo passa corrente corresponde a "1", não passa corresponde a "0". Também concatena esses símbolos, por exemplo "10100111". Esta invenção tem muitos desdobramentos, o que explorarei agora é que uma linguagem composta por sequências de uns e zeros é bem diferente de qualquer linguagem que usamos (português, inglês, russo, japonês,...).

É possível treinar pessoas para ler e escrever nesta linguagem, e era o que se fazia nas décadas de 40 e 50, em que os programadores sabiam montar os circuitos que faziam o chaveamento que correspondia ao programa e o aplicava às sequências de entrada (dado), lendo e interpretando as sequências de saída (resultado). Há duas consequências que quero explorar:
  1. ao menos uma parte do programa estava nos circuitos;
  2. era parte da tarefa dos programadores configurar os circuitos;
Na época já existiam circuitos de memória e a idéia de armazenar programas em memória era explorada no campo da teoria da computação (a máquina de Turing universal é o modelo teórico de computador que explorava essa característica e foi proposta em 1936). Há disputas sobre qual seria a primeira implementação de uma máquina com programa armazenado, mas a época certamente é final da década de 40. Com isto programadores precisariam lidar "apenas" com as sequências de zeros e uns que poderiam, para facilitar, ser convertidas em números. Por convenção esta é a chamada linguagem de máquina (machine code).

Mesmo com a melhoria de não precisar recabear a máquina, programar continuava trabalhoso para todos (inclusive programadores) e massante para a maioria das pessoas pois  exigia que se lidasse com os números (em outras palavras usar a linguagem da máquina).

Pessoas são criativas e logo nos grupos de programadores surgiram formas de se escrever programas que eram mais tratáveis para seres humanos: os comandos (números) da linguagem de máquina recebiam mnemônicos que equivaliam à interpretação do que a máquina fazia quando executava o comando, por exemplo LD (load), ST (store), ADD, SUB, MUL, JMP (jump). Posições de memória que armazenavam dados recebiam rótulos. Desta forma surgiu a linguagem de montagem (assembly language).

Numa outra iniciativa, programadores começaram a codificar caracteres como números (ASCII, EBCDIC), à semelhança do que era feito em teletipos. Isso permitiu usar caracteres.

A idéia de "arquivo" já existia como hoje, embora a mídia poderia ser diferente da moderna, por exemplo fitas e cartões perfurados e discos magnéticos poderiam armazenar arquivos. (Que por sua vez poderiam ser fisicamente armazenadas em pastas :-)

A união dessas iniciativas permitiu o desenvolvimento do seguinte processo:
  1. Programa "P1" é executado no computador;
  2. Ele lê programas em assembly armazenados em arquivos, "P2" e
  3. Escreve programas em linguagem de máquina "P3".
Por sua vez o programa "P3" poderia ser executado no computador (esta é a intenção).

Por esse processo era possível escrever "P2" em uma linguagem que fosse fácil para humanos e por uma ou mais traduções, transformá-la em linguagem de máquina "P3" que poderia ser executado.

"P1" é o compilador, "P2" é o código-fonte (source code) e "P3" é o código em linguagem de máquina (machine code).

"P3" pode ser chamado "arquivo executável", ou simplesmente "executável".

Nota: À medida que computadores e programas tornaram-se mais complexos, outros passos foram acrescentados aos apresentados por exemplo não mencionou-se a existência de um sistema operacional, nem que ele "carrega" o programa armazenado em arquivo para a memória antes da execução, que é o que ocorre em computadores modernos. Os antecessores dos sistemas operacionais eram mais parecidos com o BIOS do seu computador que com UNIX ou com Windows.

Nenhum comentário:

Postar um comentário