Self-hosting
# Self-hosting

Il self-hosting è l'uso di un programma come parte della toolchain o del sistema operativo che produce nuove versioni dello stesso programma—per esempio, un compilatore che può compilare il suo stesso codice sorgente. Il software self-hosting è un luogo comune su personal computers e sistemi più grandi. Altri programmi che sono tipicamente self-hosting includono kernel, assembly, interpreti a riga di comando e software di controllo versione.

Se un sistema è così nuovo che nessun programma è stato scritto per esso, allora il software è sviluppato su un altro sistema self-hosting e messo su un dispositivo di archiviazione che il nuovo sistema può leggere. Lo sviluppo continua in questo modo finché il nuovo sistema può con affidabilità ospitare il suo stesso sviluppo. Scrivere nuovi strumenti di sviluppo software senza usare un altro sistema di host è raro e in molti casi non pratico.

## Storia

Il primo compilatore self-hosting (escludendo gli assembler) fu scritto per Lisp da Hart e Levin al MIT nel 1962. Essi scrissero il compilatore Lisp in Lisp, testandolo in un interprete Lisp. Una volta migliorato il compilatore al punto che potesse compilare il suo stesso codice sorgente, esso era self-hosting.

La tecnica è possibile solo quando esiste già un interprete per lo stesso linguaggio che deve essere compilato. Esso si ispira al concetto di eseguire un programma su se stesso come input, il quale è anch'esso usato in varie prove in informatica teoretica, come la prova che il problema della terminazione è indecidibile.

## Esempi

Ken Thompson iniziò lo sviluppo su Unix nel 1968 scrivendo e compilando programmi sul GE-635 e portandoli al PDP-7 per testarli. Dopo che kernel Unix iniziale, un interprete a linea di comando, un editor, un assemblatore e alcune utility furono completate, il sistema operativo Unix era in self-hosting: i programmi potevano essere scritti e testati sullo stesso PDP-7.

Lo sviluppo del kernel Linux era inizialmente ospitato dal sistema Minix. Una volta che abbastanza pacchetti, come GCC, GNU Bash e altre utility sono state portate, gli sviluppatori possono lavorare su nuove versioni del kernel di Linux usando una versione precedente dello stesso (ad esempio compilare un kernel 3.21 su una macchina con kernel 3.18). Questa procedura può anche essere usata quando si costruisce una nuova distribuzione di Linux da zero.

Molti linguaggi di programmazione hanno avuto implementazioni self-hosting: compilatori che sono in quel linguaggio per quel linguaggio. Questi linguaggi includono Ada, BASIC, C, C++ C#, ClojureScript, CoffeeScript, Dylan, F#, FASM, Forth, Gambas, Go, Haskell, HolyC, Java, Lisp, Modula-2, OCaml, Oberon, Pascal, Python, Rust, Scala, Smalltalk, Vala, e Visual Basic.

In alcuni altri casi, l'implementazione iniziale non era self-hosted, ma piuttosto scritta in un altro linguaggio (o perfino in linguaggio macchina); in altri casi, l'implementazione iniziale era sviluppata usando bootstrapping.

