A meta' viaggio verso la Luna, l'equipaggio di Artemis 2 si volta e scatta una foto intera della terra, Hello, World.

Gli Stati Uniti sono quel paese che elegge per due volte Donald Trump come suo presidente e contemporaneamente manda gente in orbita sulla luna.

Il ritorno dell'homo sapiens sulla roccia grigia avviene dopo piu' di 50 anni, lo stesso progetto Artemis arriva con 20 anni di ritardo sulla tabella di marcia.

Voto procrastinazione: 8.5. foto della terra Hello, World! e' anche il programma che per tradizione viene utilizzato come introduzione al lessico e alla grammatica di un linguaggio di programmazione. Qui ne elenco un po', in ordine sparso e mischiando linguaggi interpretati e compilati.

"hello, world" (senza maiuscole e punto esclamativo) compare per la prima volta come esempio nel linaguaggio C. Suona come un Haiku dal sapore nostalgico e rassicurante (soprattutto quel return 0), ma anche contemporaneo:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}   

Fortran 77 ha delle regole molto stringenti sulla composizione della riga. Il codice viene scritto dalla colonna 7 alla 72 e tutto in CAPS LOCK!!!:

C      THIS IS A COMMENT
       PROGRAM HELLO
       PRINT *, 'HELLO, WORLD!'
       STOP
       END

Se Shakespeare fosse stato un programmatore avrebbe scritto in Cobol, il linguaggio piu' prosaico della lista:

IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO-WORLD.
       
       PROCEDURE DIVISION.
           DISPLAY 'Hello, World!'.
           STOP RUN.

Il common-lisp e' solo uno dei dialetti di una famiglia molto larga. In Lisp (abbreviazione di "list processing") tutto e' una lista e quindi chiuso tra parentesi. format indica una funzione, t e' il corrispettivo di printf in C, i caratteri ~% indicano una nuova linea ("\n" in C). Hello World! entra in una riga di codice:

(format t "Hello, World!~%")

Il mio primo videogioco lo sviluppai a 10 anni, circa. In realta' era un guess the number in cli, non proprio videogioco, e copiai il codice da una rivista de l'epoca (TGM?). Comunque lo digitai in BASIC. In BASIC per Commodore64 i numeri sono obbligatori perche' all'epoca gli editor non avevano la possibilita' di muoversi su tutto lo schermo e per modificare il codice era necessario specificare la riga:

10 PRINT "Hello, World!"
20 END

Nel 1980 arriva il qbasic, i numeri di riga diventano opzionali:

PRINT "Hello, World!"

Dieci anni dopo Microsoft rende la programmazione piu' accessibile inventando il Visual Basic. Hello, World! pero' diventa piu' prolisso:

Module HelloWorld
    Sub Main()
        Console.WriteLine("Hello, World!")
    End Sub
End Module

Pascal, torniamo agli anni 70. Notevole il punto dopo end, indica la fine del codice sorgente:

program HelloWorld;
begin
  writeln('Hello, World!');
end.

Ada e' nipote di Pascal e utilizzato nella ISS, per rimanere in tema di esplorazione spaziale:

with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
begin
Put_Line ("Hello, world!");
end;

Larry Wall, personaggio molto cinematografico, e' linguista prima di essere pogrammatore. Non stupisce che la sua creazione, Perl, abbia come motto: "There's more than one way to do it" (TMTOWTDI):

use IO::Handle;
STDOUT->print("Hello, World!\n");

o:

use v5.10;
say "Hello, World!";

o:

system("echo Hello, World!");

o:

print pack("H*", "48656c6c6f2c20576f726c64210a");

In opposizione al TMTOWTDI c'e' il tredicesimo aforisma de The Zen of Python, che dice "There should be one—and preferably only one—obvious way to do it."

print("Hello, World!")

Tornando alla procrastinazione, tema centrale di questo blog, Non oggi dedichero' del serio tempo allo studio di Haskell, linguaggio puramente funzionale che negli anni '90 ha tamponato l'ascesa straripante della programmazione a oggetti. Questo codice, apparentemente semplice, nasconde un importante cambio di paradigma:

main :: IO ()
main = putStrLn "Hello, World!"

A proposito di programmazione a oggetti, non posso non citare l'ubiquo C++, qui molto simile a suo nonno C:

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

E quell'abominio boilerplate di Java:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

Secondo il sondaggio 2025 di StackOverflow, i linguaggi piu' utilizzati e quelli che si vorrebbero imparare:

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
fun main() {
    println("Hello, World!")
}
const std = @import("std");

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();
    try stdout.print("Hello, World!\n", .{});
}
fn main() {
    println!("Hello, World!");
}

Oltre ad astrarre problemi piu' complessi di Hello, World!, la spinta a creare nuovi linguaggi viene dala necessita' di rendere leggibile il codice che in ultima iterazione viene trasformato in codice binario. Leggibile sia da chi il codice non l'ha scritto, sia da chi l'ha scritto ma deve tornarci molto dopo, ovvero discostarsi il piu' possibile da Assembly, qui nella version x86 in tutto il suo ermetico splendore:

.section  .data
msg:
    .asciz "Hello, World!\n"
msg_len = . - msg

.section .text
.globl _start
_start:
    movl $4, %eax
    movl $1, %ebx
    movl $msg, %ecx
    movl $msg_len, %edx
    int $0x80

    movl $1, %eax
    xorl %ebx, %ebx
    int $0x80