Un post non so quanto serio ma ci tengo. Racconta di me, dell'evoluzione dei linguaggi di programmazione (uno solo in realtà, il Fortran). Roba che oggi non si usa più, come il latino, per cui lo dico subito: caveat emptor (archeo-cit.).
Questa è l'ennesima riscrittura, grazie anche alle osservazioni di AP, ex collega (non vuole che lo si ricordi come boss), peccato non foglia comparire ontehtoobz.
L'idea iniziale era completamente diversa, partita da Compiler Explorer. Una piccola modifica al codice produce variazioni anche grandi nell'assembly; se poi si cambia linguaggio... Ecco, il Fortran, antichissimo, cambiato, evoluto nei suoi quasi 70 anni (proprio come cambia un umano) ma sempre vivo (forse, ancora qualcuno che lo usa?) o almeno compilabile.
Provo a scrivere --come sono capace, portate comprensione-- un programma banalissimissimo, la somma dei numeri naturali da 1 a 10 compreso. Roba che in Python si può scrivere così:
#!/usr/bin/python3
j = 0
for i in range(1, 11):
j += i
print(j)
Eseguendo si ottiene:
$ python3 -q sum.py
55
(in realtà ho l'alias py3='python3 -q' ma non l'ho usato per chiarezza, spero verrà apprezzato come segno di buona volontà.)
Quando io ho iniziato a interagire con il computer, c'era già una storia, c'erano già dei vecchi. I vecchi, non tutti ma qualcuno, rifiutavano le cose troppo nuove, per esempio per fare il ciclo non usavano l'istruzione DO (in Fortran il for si chiama così) ma l'IF aritmetico, lo trovate qui a p.21. Sì, come leggere le tavolette d'argilla dei babilonesi; ma si può fare! (cit.)
Allora il contenuto delle schede perforate sarebbe stato qualcosa come questo:
C 34567
I = 0
J = 0
10 CONTINUE
I = I + 1
J = J + I
IF(I-10) 10, 20, 20
20 CONTINUE
WRITE(*, 90) J
90 FORMAT(41HLA SOMMA DEI NUMERI NATURALI DA 1 A 10 È, I4)
END
Come si usava allora scrivo (con un certo ribrezzo) tutto maiuscolo. Anzi no, ho fatto come al solito poi per la bella (questo post) ho convertito usando tr:
cat $* | tr [:lower:] [:upper:]
La prima riga è un commento (C in colonna 1) per agevolarmi a visualizzare i campi: commento in colonna 1, etichette (numeriche) nelle colonne [1:5], flag di continuazione in colonna 6 e codice nelle colonne [7:72].
Le variabili il cui nome inizia con [I:N] sono intere, float tutte le altre; è tuttavia possibile dochiararle di tipo diverso, ma i vecchi non avrebbero approvato.
L'istruzione WRITE scrive sull'unità predefinita (ahemmm... dipendeva dalla macchina, qui * è il terminale. Notare il formato Hollerith così chiamato in suo onore: dopo il carattere H ho il numero prima indicato di caratteri; oggi il compilatore accetta anche le lettere accentate!
Il ciclo è compreso tra le due istruzioni CONTINUE, gestito dalla (deprecata da prima che iniziassi) IF aritmetica che calcola l'espressione tra parentesi e salta alla label corrispondente a valore negativo, zero e positivo rispettivamente.
CONTINUE, usatissima allora è un segnaposto, non fa niente di suo ma serve per l'etichetta.
Semplice vero? Compilo ed eseguo:
$ gfortran -o f0 F0.f
$ ./f0
LA SOMMA DEI NUMERI NATURALI DA 1 A 10 È 55
$
Quando ho iniziato a mettere le mani sul 'puter (il PR1ME 550-II) si usava il Fortran IV, 1966. Anzi no: seguendo IBM ognuno si riteneva libero di apportare aggiornamenti allo standard vecchio ormai di di 15 anni; per il mio esempio non ne servono, ecco il Fortran IV:
J = 0
DO 10, I = 1, 10
J = J + I
10 CONTINUE
PRINT *, J
END
Notare il ciclo DO identificato dall'etichetta 10. I vecchi avrebbero avuto da ridire per l'indentazione del blocco (qui una sola riga) ma penso che 1) il codice è più chiaro; e 2) oggi non mi diranno più niente.
Non sono sicurissimo se PRINT fosse standard, potrei andare a controllare, ma per edasso la uso.
Ottengo
$ gfortran -o f1 F1.f
$ ./f1
55
$
OK. Nel '78 era uscito il nuovo standard, il Fortran 77 con parecchie nuove possibilità. Da me arrivò a inizio '80 ed era visto male perché esoso di risorse e poi if it's works don't fix it (cit.). Eccolo, sì in minuscolo:
program sum10
implicit none
integer i, j
j = 0
do 10, i = 1, 10
j = j + i
10 end do
print *, j
end
Dovrei controllare se implicit none era già standard o lo sarebbe diventato in seguito; raccomandato dai non-vecchi. program era un'istruzione solo estetica, il blocco del do conveniva chiuderlo con end do. Ah! dimenticavo: gli spazi non sono significativi per cui si possono mettere e togliere a piacimento, è valida enddo, come lo sarebbero altre in altri casi come goto e go to, da sempre. Ci sarebbe anche la cosa che zero è blank ma non voglio infierire.
Compilazione ed esecuzione lasciate come esercizio; passo alla versione '90.
Parecchie cose nuove, qui non le uso tranne una: il free format visto che le schede non le ricordava più nessuno. Una cosa sul do che credo valesse già nel '77 (o era un'estensione?): l'etichetta è opzionale e viene usata solo se condivisa da più cicli:
program sum10
implicit none
integer i, j
j = 0
do i = 1, 10
j = j + i
end do
print *, j
end
Poi ho smesso, cioè no è il mondo che è cambiato. E continua a cambiare.
per esempio il codice Python usato all'inizio si potrebbe scrivere:
$ py3
>>> sum(range(1, 11))
55
>>>
dove uso la funzione predefinita sum(). Ma posso fare anche senza, per esempio, usando reduce():
>>> from functools import reduce
>>> reduce((lambda x, y: x + y), range(1, 11))
55
>>>
Uh! sono di nuovo finito là; e mi sa che continua 🧐
🔴
Nessun commento:
Posta un commento