Hoje, parece uma verdade incontestável da natureza que computadores sejam máquinas destinadas a executar programas. Compramos um pedaço de hardware, instalamos diferentes softwares e, como mágica, a mesma máquina se transforma em um editor de texto, um videogame, um servidor web ou um simulador de dinâmica molecular. O hardware permanece essencialmente o mesmo, o que muda é apenas um arquivo, mas nem sempre foi assim.
O ENIAC, um dos primeiros computadores eletrônicos programáveis de propósito geral, era operado por meio da conexão de cabos e do posicionamento de chaves em imensos painéis. Para alterar o programa, era necessário, literalmente, mudar a configuração física da máquina, um processo exaustivo que podia consumir dias. Naquela época, o algoritmo não era apenas executado pelo hardware, mas estava materializado na topologia momentânea do próprio equipamento. Programar significava fazer a eletricidade tomar os caminhos certos, em um trabalho que quase se assemelhava a fazer debugging com um alicate.
Curiosamente, a grande ruptura conceitual que mudaria esse cenário havia acontecido anos antes, sem o envolvimento de computador algum. Em 1936, Alan Turing demonstrou que era possível conceber uma única máquina capaz de simular qualquer outra máquina computacional, desde que recebesse tanto os dados quanto uma descrição da máquina a ser simulada. Com isso, a função deixava de ser determinada pela construção física e passava a ser especificada por símbolos.
