Ogni programma è compilato con un apposito linguaggio di programmazione. Ma il primo programma messo al mondo come è stato creato ?

Non è facile stabilire quale sia stato il
“primo programma messo al mondo” e non è facile decidere
quale sia stato il primo vero computer dato che a partire dal decennio
1940-1950 furono costruite macchine da calcolo programmabili, prima
elettromeccaniche
ed in seguito elettroniche con caratteristiche diverse.
Ma supponiamo di restringere le considerazioni agli elaboratori
con architettura analoga all’attuale, cioè costituiti da
una unità di elaborazione, una memoria ad accesso casuale e da
opportune periferiche per l’interazione con l’esterno.

Ogni elaboratore è in grado di eseguire esclusivamente programmi scritti
nel suo “linguaggio macchina”. Il linguaggio macchina è costituito da
istruzioni ed operandi, rappresentati da valori numerici,
che devono trovarsi in opportuna
sequenza nella memoria centrale dell’elaboratore.

Quindi il primo programma scritto
per un elaboratore è costituito da una sequenza di numeri
che devono essere trasferiti nella memoria. Per fare questo venivano utilizzati
sequenze di interruttori sul pannello dell’elaboratore che consentivano di
scrivere un numero (binario)
in alcuni registri (particolare locazione di memoria).

La programmazione di un sistema di questo tipo consisteva, essenzialmente,
nello scrivere su un foglio la sequenza di istruzioni in forma binaria
(tipicamente con numeri a 16, 20, 32 cifre a seconda dell’elaboratore)
e poi, alla console dell’elaboratore, ripetere le seguenti operazioni:

  • impostare l’indirizzo nel registro degli indirizzi di memoria
  • impostare il valore del contenuto della cella
  • trasferire il valore all’indirizzo impostato

Normalmente gli elaboratori erano predisposti in modo da facilitare
l’introduzione di valori in locazioni successive ovvero, una volta
impostato il primo indirizzo, ad ogni trasferimento di valore il registro
degli indirizzi veniva automaticamente incrementato in modo che il valore
successivo finiva automaticamente nella locazione successiva.

Dato che questo doveva essere ripetuto per ogni diverso programma, un primo
miglioramento consistette nel trovare supporti che potessero memorizzare
permanentemente i programmi e che potessero essere letti in modo automatico.
Iniziarono ad essere utilizzati a tale scopo nastri o schede di carta
perforati, che avevano anche il vantaggio che il lungo lavoro di
preparazione del programma poteva essere fatto ad una macchina
perforatrice senza tenere impegnato il costosissimo elaboratore.

Il tipico modo di uso degli elaboratori consisteva quindi nell’impostare
manualmente un piccolo numero di istruzioni1
necessarie per far funzionare
il lettore di banda perforata e poi caricare i programmi successivi
dalla banda perforata.


Il primo passo successivo è consistito nell’usare lo stesso elaboratore
per tradurre programmi scritti in forma un po’ più “leggibile”,
ovvero in linguaggio Assembler2.
La sequenza di istruzioni scritte in Assembler sulla banda perforata
veniva tradotta
nei relativi codici dal programma Assemblatore.
Ovviamente il primo assemblatore fu scritto in codice binario, ma da quel momento
in poi fu possibile scrivere programmi un po’ più complessi.
Usando il primo programma assemblatore furono poi possibili due passi
successivi: scrivere programmi di traduzione più complessi
(i compilatori3) e scrivere programmi
assemblatori e compilatori che generassero codice per le nuove macchine
costruite.

In sostanza siamo arrivati alle attuali pratiche di sviluppo del software
per passi successivi sviluppando strumenti (programmi) che consentivano di
scrivere efficientemente programmi sempre più complessi.


  1. Un tipico minielaboratore negli anni 1970
    (Hewlett Packard 2100)
    aveva ad esempio
    una memoria di 4000 parole a 16 bit e richiedeva l’impostazione
    manuale di un programma di 16 parole per poter attivare il lettore
    di banda perforata. Fortunatamente la memoria (a nuclei di ferrite)
    era di tipo permanente e non era necessario ripetere l’introduzione
    del programma ad ogni accensione.

    Vedi: http://www.decodesystems.com/hp2000/index.html.


  2. Il linguaggio Assembler è una semplice rappresentazione

    del linguaggio macchina in cui al posto dei valori numerici delle istruzioni
    si utilizzano codici simbolici (ad esempio se l’istruzione per sommare due
    numeri ha il valore 0011001101 si può utilizzare invece
    il codice ADD più facile da scrivere e da memorizzare). Analogamente si possono utilizzare nomi, anzichè numeri, per identificare le
    locazioni di memoria.

    Vedi: http://www.vialattea.net/esperti/php/risposta.php?numero=706

  3. Vedi: http://www.vialattea.net/esperti/php/risposta.php?num=1903