En programación informática , el autoalojamiento consiste en utilizar un programa como parte del conjunto de herramientas o del sistema operativo que genera nuevas versiones del mismo programa; por ejemplo, un compilador que puede compilar su propio código fuente . El software autoalojado es habitual en ordenadores personales y sistemas de mayor tamaño. Otros programas que suelen ser autoalojados incluyen núcleos , ensambladores , intérpretes de línea de comandos y software de control de versiones .
Sistemas operativos
Un sistema operativo es autoalojado cuando el conjunto de herramientas para compilarlo se ejecuta en ese mismo sistema operativo. Por ejemplo, Windows se puede compilar en un ordenador que ya tenga instalado Windows.
Antes de que un sistema pueda ser autoalojado, se necesita otro sistema para desarrollarlo hasta que alcance la etapa en la que el autoaloje sea posible. Al desarrollar para una nueva computadora o sistema operativo, se necesita un sistema para ejecutar el software de desarrollo, pero también es necesario el software de desarrollo utilizado para escribir y compilar el sistema operativo. Esto se conoce como problema de arranque o, de forma más genérica, el dilema del huevo o la gallina .
Una solución a este problema es el compilador cruzado (o ensamblador cruzado cuando se trabaja con lenguaje ensamblador). Un compilador cruzado permite compilar código fuente de una plataforma para una máquina o sistema operativo diferente, lo que posibilita la creación de un sistema operativo para una máquina para la que aún no existe un compilador autoalojado. Una vez escrito, el software se puede implementar en el sistema de destino mediante medios como una EPROM , un disquete , una memoria flash (como una unidad USB) o un dispositivo JTAG . Esto es similar al método utilizado para escribir software para consolas de videojuegos o para dispositivos portátiles como teléfonos móviles o tabletas, que no incluyen sus propias herramientas de desarrollo.
Una vez que el sistema alcanza la madurez suficiente para compilar su propio código, finaliza la dependencia entre sistemas de desarrollo. En ese momento, se dice que un sistema operativo es autoalojado.
Compiladores
El desarrollo de software mediante compiladores o intérpretes también puede ser autoalojado cuando el compilador es capaz de compilarse a sí mismo. [ 1 ]
Dado que los compiladores autoalojados sufren los mismos problemas de arranque que los sistemas operativos, un compilador para un nuevo lenguaje de programación debe escribirse en un lenguaje existente. Por lo tanto, el desarrollador puede usar lenguaje ensamblador, C / C++ o incluso un lenguaje de scripting como Python o Lua para crear la primera versión del compilador. Una vez que el lenguaje esté suficientemente maduro, el desarrollo del compilador puede pasar al lenguaje nativo del compilador, lo que permite que este se compile a sí mismo.
Ventajas
El autoalojamiento de un compilador tiene las siguientes ventajas: [ 2 ]
- Se trata de una prueba no trivial del lenguaje que se está compilando y, como tal, es una forma de "dogfooding" (prueba interna del lenguaje ).
- Los desarrolladores de compiladores y los encargados de reportar errores solo necesitan conocer el lenguaje que se está compilando.
- El desarrollo del compilador puede realizarse en el lenguaje de alto nivel que se está compilando.
- Las mejoras en la parte interna del compilador no solo mejoran los programas de propósito general, sino también el propio compilador.
- Se trata de una comprobación de coherencia exhaustiva, ya que debería ser capaz de reproducir su propio código objeto.
Tenga en cuenta que algunos de estos puntos presuponen que el entorno de ejecución del lenguaje también está escrito en el mismo lenguaje.
Historia
El primer compilador autoalojado (excluyendo los ensambladores) fue escrito para Lisp por Hart y Levin en el MIT en 1962. Escribieron un compilador de Lisp en Lisp, probándolo dentro de un intérprete de Lisp existente . Una vez que mejoraron el compilador hasta el punto en que podía compilar su propio código fuente, se convirtió en autoalojado. [ 3 ]
El compilador, tal como aparece en la cinta de compilación estándar, es un programa en lenguaje máquina que se obtuvo al hacer que la definición de la expresión S del compilador funcionara sobre sí misma a través del intérprete.
— Memorando de IA 39 [ 3 ]
Esta técnica suele ser practicable únicamente cuando ya existe un intérprete para el mismo lenguaje que se va a compilar; aunque posible, es extremadamente raro que un humano compile un compilador consigo mismo. [ 4 ] El concepto toma prestado directamente de y es un ejemplo de la noción más amplia de ejecutar un programa sobre sí mismo como entrada, utilizada también en varias demostraciones en ciencias de la computación teórica , como la demostración de que el problema de la parada es indecidible.
Ejemplos
Ken Thompson comenzó el desarrollo de Unix en 1968 escribiendo y compilando programas en el GE-635 y llevándolos al PDP-7 para probarlos. Después de que se completaron el núcleo inicial de Unix, un intérprete de comandos , un editor, un ensamblador y algunas utilidades, el sistema operativo Unix se volvió autoalojado : los programas podían escribirse y probarse en el propio PDP-7. [ 5 ]
Douglas McIlroy escribió TMG (un compilador-compilador ) en TMG en un trozo de papel y "decidió darle su trozo de papel a su trozo de papel", haciendo él mismo el cálculo, compilando así un compilador TMG en lenguaje ensamblador , que luego mecanografió y ensambló en el PDP-7 de Ken Thompson. [ 4 ]
El desarrollo del sistema GNU se basa en gran medida en GCC (la Colección de Compiladores GNU) y GNU Emacs (un editor popular), lo que posibilita el desarrollo autónomo, mantenido y sostenido de software libre para el Proyecto GNU .
Muchos lenguajes de programación tienen implementaciones autoalojadas: compiladores que están escritos y escritos para el mismo lenguaje. Un enfoque es el arranque , donde una versión básica del lenguaje se implementa inicialmente usando otro lenguaje de alto nivel, ensamblador o incluso lenguaje máquina ; el compilador resultante se usa luego para comenzar a construir versiones extendidas sucesivas de sí mismo.
Lista de lenguajes que cuentan con compiladores autoalojados
Los siguientes lenguajes de programación cuentan con compiladores autoalojados:
- Ada
- ALGOL ( Burroughs B5000 )
- BÁSICO [ 6 ]
- BCPL
- do
- C++ ( Visual C++ , clang , gcc 4.8)
- C# ( Microsoft Roslyn , Mono )
- ClojureScript [ 7 ]
- CoffeeScript
- Cristal
- Curry
- D
- Dardo
- Delfos
- Dylan
- Eiffel
- Elixir
- F#
- FASM [ 8 ]
- Factor
- Adelante
- Gambas
- Ir
- Haskell [ 9 ]
- Idris
- Java
- Kotlin
- Lisp ( Lisp común )
- LiveScript
- Mercurio
- Nemerle
- Nim
- Oberón
- Object Pascal ( Pascal libre )
- OCaml
- Pascal ( Pascal libre )
- Piret [ 10 ]
- Python ( PyPy )
- Raku ( Rakudo )
- Óxido
- Scala
- Esquema
- Charla informal
- ML estándar ( MLton )
- Tcl [ 11 ]
- TMG
- Mecanografiado
- V (Vlang) [ 12 ]
- Vala
- Virgilio [ 13 ]
- Visual Basic .NET ( Microsoft Roslyn , Mono )
- Zig
Véase también
Referencias
- ↑ Heaton, Robert. "¿Qué es un compilador autoalojado?" . robertheaton.com/ .
- ↑ Patrick D. Terry (1997). "3. Construcción y arranque del compilador" . Compiladores y generadores de compiladores: Una introducción con C++ . International Thomson Computer Press. ISBN 1-85032-298-8Archivado del original el 23 de noviembre de 2009.
- 1 2 Hart, Tim; Levin, Mike. "AI Memo 39-The new compiler" (PDF) . publications.ai.mit.edu ( FTP ) . Consultado el 23-05-2008 .(Para ver los documentos, consulte Ayuda:FTP )
- 1 2 Thompson, Ken (6 de mayo de 2019). "VCF East 2019: Brian Kernighan entrevista a Ken Thompson" . YouTube . Recuperado el 28 de octubre de 2019 .
- ↑ Dennis M. Ritchie. "El desarrollo del lenguaje C" . 1993.
- ↑ Ejemplo de arranque del compilador BASICO
- ↑ ClojureScript Siguiente
- ↑ "flat assembler" . Consultado el 7 de enero de 2022.
El flat assembler es autoalojado y se incluye el código fuente completo.
- ↑ "Informe sobre las comunidades y actividades de Haskell" .
- ↑ https://www.pyret.org Archivado el 10 de abril de 2018 en Wayback Machine
- ↑ "Implementar TCL en TCL" . Archivado del original el 4 de junio de 2017. Consultado el 19 de septiembre de 2017 .
- ↑ "V FAQ" . GitHub .
- ↑ "Virgilio" . GitHub .
- Programación informática
- Software de autoalojamiento