# Self-hosting (compiladores)

Self-hosting o autohospedaje es el uso de un programa de computadora como parte de la cadena de herramientas o sistema operativo que produce nuevas versiones de ese mismo programa, por ejemplo, un compilador que puede compilar su propio código fuente. El software self-hosted es común en computadoras personales y sistemas más grandes. Otros programas que suelen ser self-hosted incluyen kernels, ensambladores, intérpretes de línea de comandos y software de control de versiones.
Si un sistema es tan nuevo que no se ha escrito ningún software para él, entonces el software se desarrolla en otro sistema, a menudo con un compilador cruzado, y se coloca en un dispositivo de almacenamiento que el nuevo sistema puede leer. El desarrollo continúa de esta manera hasta que el nuevo sistema pueda albergar de manera confiable su propio desarrollo. Escribir nuevas herramientas de desarrollo de software sin usar otro sistema host es raro.
En el contexto de la administración del sitio web y la publicación en línea, el término self-hosting se utiliza para describir la práctica de ejecutar y mantener un sitio web utilizando un servidor web privado.

## Historia

El primer compilador self-hosted (excluyendo ensambladores) fue escrito para Lisp por Hart y Levin en el MIT en 1962. Escribieron un compilador de Lisp ese mismo lenguaje, probándolo dentro de un intérprete existente de Lisp. Una vez que habían mejorado el compilador hasta el punto en que podía compilar su propio código fuente, se considera self-hosted.
Esta técnica solo es posible cuando ya existe un intérprete para el mismo lenguaje que se va a compilar. Toma prestado directamente de la noción de ejecutar un programa en sí mismo como entrada, que también se usa en varias pruebas en informática teórica, como la prueba de que el problema de detención es indecidible.

## Ejemplos

Ken Thompson comenzó el desarrollo en Unix en 1968 escribiendo y compilando programas en el GE-635 y llevándolos al PDP-7 para su prueba. Después de que se completó el núcleo inicial de Unix, un intérprete de comandos, un editor, un ensamblador y algunas utilidades, el sistema operativo Unix se autohospedaba: los programas se podían escribir y probar en el PDP-7.
El desarrollo del kernel de Linux se alojó inicialmente en un sistema MINIX. Cuando se transfieren paquetes suficientes, como GCC, GNU bash y otras utilidades, los desarrolladores pueden trabajar en nuevas versiones del núcleo Linux basadas en versiones anteriores de sí mismo (como construir el núcleo 3.21 en una máquina que ejecuta el núcleo 3.18). Este procedimiento también se puede utilizar al crear una nueva distribución de Linux desde cero.
Muchos lenguajes de programación tienen implementaciones autohospedadas: compiladores que están en y para el mismo lenguaje. Estos lenguajes incluyen Ada, BASIC, C, C ++, C #, CoffeeScript, Crystal, Dylan, F #, FASM, Forth, Gambas, Go, Haskell, HolyC, Java, Lisp, Modula-2, OCaml, Oberon, Pascal, Python, Rust, Scala, Smalltalk, TypeScript, Vala y Visual Basic.
En algunos de estos casos, la implementación inicial no fue autohospedada, sino más bien escrita en otro lenguaje (o incluso en lenguaje de máquina); en otros casos, la implementación inicial se desarrolló utilizando bootstrapping.