Escriba un programa que tome un programa brainfuck y lo compile en código máquina ejecutable. Puede apuntar a x86, x86_64, jvm (java bytecode) o armv6, y usar uno de los siguientes formatos ejecutables: ELF, a.out, archivo de clase, exe, com. El ejecutable debería funcionar en Linux o Windows (o Java en cualquiera de los dos).
Ni su programa ni el ejecutable generado pueden ejecutar ningún programa externo (como otro compilador, ensamblador o intérprete).
El código más corto gana.
Respuestas:
C,
866783 bytesDado que mi código genera un ejecutable ELF de 32 bits, no puedo prometer que funcionará en la configuración de todos. Se necesitaron suficientes ajustes para que el ejecutable dejara de segfaularse en mi computadora.
Para cualquiera que intente ejecutar esto:
Se lee un programa Brainfuck de stdin y el ELF compilado se escribe en stdout.
Sin golf
En la versión no codificada del código, puede tener una mejor idea de lo que está sucediendo. La matriz de caracteres al final del código golfizado es una codificación del ELF y el encabezado del programa en el código no golfizado. Este código también muestra cómo cada instrucción Brainfuck se traduce en bytecode.
BrainFuck auto modificable
Para ahorrar en bytes, la cinta para mi compilador no está asignada en una
.bss
sección o algo así de elegante. En cambio, la cinta tiene 30,000 bytes nulos escritos directamente después del código de bytes compilado del programa Brainfuck. Saber esto y saber qué código de byte genera mi compilador significa que puede generar o modificar el código de byte en tiempo de ejecución. Una ilustración simple de esta 'característica' es un programa Brainfuck que establece su propio valor de salida.El programa sale del borde izquierdo de la cinta hacia el código de byte hasta el punto en que el código de salida normalmente se establece en 0. Al aumentar este byte, el código de salida se establece en 1 en lugar de 0 cuando el programa finalmente sale. Con persistencia, esto podría usarse para hacer programación a nivel de sistema en Brainfuck.
fuente
long long int
lugar dechar
. Definitivamente, tengo espacio para jugar golf en algunas de mis declaraciones variables. Veré cuánto puedo llegar allí y actualizaré mi respuesta.Python, 1974 caracteres
Debajo están las traducciones al código de bytes de Java. local 0 es una matriz de bytes que representa la cinta, local 1 es el puntero de datos.
El
xx xx
son compensaciones para alcanzar el soporte correspondiente. # 2 esSystem.in
, # 3 esread()
, # 4 esSystem.out
, # 5 eswrite()
, y # 6 esflush()
.El preámbulo asigna una matriz de 30000 bytes e inicializa la posición de la cinta a 0.
El envoltorio gigante al final se generó compilando un
B.java
archivo ficticio con código para uno de cada código de operación (para inducir la generación de las tablas constantes correctas y otra basura), y luego realizando una cirugía delicada en él.Ejecútalo como
Desmontar con
Estoy seguro de que podría jugar más golf. Estoy feliz de que funcione ...
fuente
Código de ensamblaje x86 de 16 bits, 104 bytes
Este código es de 2014, pero acabo de encontrar la tarea.
fuente