Esto se basa en una charla sobre compiladores que escuché hace un tiempo, pero, desafortunadamente, no recuerdo cuándo ni dónde.
Cree el compilador más corto en cualquier idioma que pueda compilarse. Dirigirse a cualquier ISA razonable (68 K, X 86, MIPS, ARM, SPARC, IBM BAL, etc.) que no tiene una instrucción "de compilación del programa" (esto puede excluir algunas versiones de VAX). Leer los programas de código de stdin
e imprimir el código generado a stdout
. Es posible usar la biblioteca C estándar para I / O y el procesamiento de cadenas (por ejemplo, _printf
). No es necesario para compilar todo el lenguaje, cualquier subconjunto que contiene el compilador (es decir, justo la impresión de una quine lenguaje ensamblador, aunque impresionantes, no cuenta como una solución.)
#!/usr/local/bin/tcc -run
en la primera línea de su fuente C y ejecútelo directamente desde la línea de comandos". Eso es muy bonito.Respuestas:
Haskell subconjunto → C - 18926 caracteres
Esto compila un pequeño subconjunto de Haskell a C. Características que admite:
Las principales características que faltan son las variables anidadas (es decir, no lambda / let / where / case), la verificación de tipos y las clases de tipos. Los programas resultantes pierden memoria y la autocompilación toma alrededor de 200 megabytes en mi sistema (el recolector de basura Boehm ayuda mucho, pero solo si el compilador optimiza bien la recursión de la cola).
Para iniciar, descomente las primeras tres líneas (no contadas en el puntaje) y compile con GHC. El compilador toma el código del subconjunto Haskell en stdin y produce código C en stdout.
Es largo no porque el lenguaje sea complejo, sino porque soy flojo.
Sin embargo, actualmente es la soluciónmáscorta. Ya no. Supongo que no me aburriré este fin de semana.fuente
Lenguaje personalizado → C - (7979)
Como la pregunta no impide crear mi propio idioma, pensé en intentarlo.
El entorno
El idioma tiene acceso a dos pilas, The Call Stack y The Data Stack. La pila de llamadas se usa para las instrucciones de salto
{
y}
, mientras que la pila de datos se usa en la mayoría de las otras instrucciones. Call Stack es opaco a las aplicaciones.La pila de datos puede contener tres tipos diferentes de valores: entero, texto y vacío. Los enteros son de tipo intptr_t, mientras que el texto se almacena como cadenas de estilo C.
La
^
instrucción tiene acceso a The Array. La matriz es una matriz constante de longitud 17 de elementos de texto. Probablemente debería ver la fuente del esquema de indexación, ya que es un poco inestable.El idioma
El compilador
Este es el compilador. No se juega al golf, y espero que pueda reducirse considerablemente. Debería ser posible usar el código de máquina directamente y generar un archivo COM dos, pero aún no lo he logrado. Sé que esto parece un programa en C, pero la implementación real del compilador está inactiva al final.
Actualmente, el compilador genera mucha información de depuración en stderr.
Para compilar el código C generado:
El conjunto de caracteres es necesario porque el compilador escapa de caracteres especiales al agregar 128.
El Bootstrap
Para compilar el primer compilador, escribí un intérprete de Python para el lenguaje.
Poniendolo todo junto
Suponiendo que ha guardado el compilador como
compiler.cmp
y el bootstrap comobootstrap.py
, aquí le mostramos cómo construir el compilador y luego usarlo para compilarse:Por lo tanto, no soy un gran programador en C, ni tampoco soy un gran diseñador de lenguaje, por lo que cualquier sugerencia para mejorar esto es muy bienvenida.
Programas de ejemplo
¡Hola Mundo!
fuente
Brainfuck extendido v0.9: 618 bytes (sin contar los avances de línea innecesarios)
Esta es una versión de golf de mi primera versión de EBF con soporte eliminado para comentarios y código muerto para admitir la eliminación de variables.
Entonces, básicamente es BrainFuck con variables.
:x
crea variables x. El compilador sabe dónde está, por$y
lo que producirá <'sy>' para llegar a esa posición. A veces necesitas bucles asimétricos y luego debes decirle al compilador dónde estás@x
. Como EBF actual se compila a Brainfuck.Esta primera versión tenía solo un nombre de variable char, pero he usado esta versión para compilar la siguiente versión y así sucesivamente hasta la versión actual que tiene un conjunto de características impresionante. Al compilar desde la fuente de github, en realidad descarga el binario compilado a mano en bootstrap 6 versiones intermedias de ebf para crear la versión actual.
Para iniciarlo, puede usar este primer y único binario en el repositorio git de EBF que se compiló a mano con éxito después de un par de intentos.
Brainfuck tiene algunas implementaciones de hardware, por ejemplo. esto , esto y esto por mencionar algunos. Pero sobre todo es tan fácil de implementar que prácticamente puede implementar un intérprete en cualquier sistema. Bromeo diciendo que Zozotez LISP , que está escrito en EBF, es probablemente el LISP más portátil que existe.
fuente
Hex, 550 bytes
Esto apunta específicamente a sistemas x86_64 que ejecutan Linux.
En este lenguaje, código fuente consta de bytes representados como dos dígitos hexadecimales en minúscula,
[0-9a-f][0-9a-f]
. Estos bytes pueden tener cualquier cantidad de espacio en blanco circundante, pero no puede ocurrir nada entre los dígitos que forman un solo byte. Además,'!'
es un carácter de comentario de línea: se ignora, así como todo lo que hay entre él y el siguiente'\n'
carácter.Si comprende el ensamblado x86, aquí hay una versión mucho más legible del código fuente:
Si extrae el lenguaje ensamblador de los comentarios a continuación
! Program Code
, puede ensamblar y ejecutar el compilador Hex. La entrada y la salida usan stdin y stdout.fuente
Hex
No es un idioma.Subconjunto Javascript -> Java, 504 bytes
fuente
05AB1E , 2 bytes (posiblemente no compitiendo)
Pruébalo en línea!
Código en la primera línea de entrada, entradas en líneas posteriores.
fuente
Madera , 0 bytes
Lumber es un completo lenguaje de programación esotérico inventado por Unrelated String escrito en solo 10 líneas de código Prolog.
No lo puedo creer? Estos programas eliminaron comentarios y hacen que la fuente del intérprete sea más concisa.
lumber_corefuncs.pl:
lumber_types.pl
lumber_corefuncs.pl toma en la biblioteca lumber_types; y a su vez, esta biblioteca define un módulo que no contiene nada. Por lo tanto, Lumber no hace nada en entradas arbitrarias, que a su vez es un autocompilador.
fuente
Cero , 0 bytes
fuente