Escreva um programa que pegue um programa de foda cerebral e o compile no código de máquina executável. Você pode segmentar x86, x86_64, jvm (java bytecode) ou armv6 e usar um dos seguintes formatos executáveis: ELF, a.out, arquivo de classe, exe, com. O executável deve funcionar no Linux ou Windows (ou Java em qualquer um).
Nem seu programa nem o executável gerado podem executar nenhum programa externo (como outro compilador, montador ou intérprete).
O menor código vence.
Respostas:
C,
866783 bytesComo meu código gera um executável ELF de 32 bits, não posso prometer que funcionará na configuração de todos. Foram necessários ajustes suficientes para que o executável parasse de segfault no meu computador.
Para quem está tentando executar isso:
Um programa Brainfuck é lido no stdin e o ELF compilado é gravado no stdout.
Ungolfed
Na versão ungolfed do código, você pode ter uma idéia melhor do que está acontecendo. A matriz de caracteres no final do código golfado é uma codificação do ELF e do cabeçalho do programa no código não-golfado. Este código também mostra como cada instrução Brainfuck é traduzida em bytecode.
BrainFuck com modificação automática
Para economizar em bytes, a fita do meu compilador não está alocada em uma
.bss
seção ou em algo sofisticado como esse. Em vez disso, a fita possui 30.000 bytes nulos gravados diretamente após o código de bytes compilado do programa Brainfuck. Saber isso e estar ciente de qual código de bytes é gerado pelo meu compilador significa que você pode gerar ou modificar o código de bytes em tempo de execução. Uma ilustração simples desse 'recurso' é um programa Brainfuck que define seu próprio valor de saída.O programa sai da borda esquerda da fita para o código de bytes, até o ponto em que o código de saída está normalmente definido como 0. O incremento desse byte faz com que o código de saída seja definido como 1 em vez de 0 quando o programa finalmente sair. Com persistência, isso pode ser usado para fazer a programação no nível do sistema no Brainfuck.
fonte
long long int
vez dechar
. Definitivamente, há espaço para eu jogar fora algumas das minhas declarações de variáveis. Vou ver o quanto consigo chegar lá e atualizar minha resposta.Python, caracteres de 1974
Abaixo estão as traduções para java bytecode. local 0 é uma matriz de bytes que representa a fita, local 1 é o ponteiro de dados.
O
xx xx
são compensações para alcançar o suporte correspondente. # 2 éSystem.in
, # 3 éread()
, # 4 éSystem.out
, # 5 éwrite()
e # 6 éflush()
.O preâmbulo aloca uma matriz de 30000 bytes e inicializa a posição da fita para 0.
O invólucro gigante no final foi gerado pela compilação de um
B.java
arquivo fictício com código para um de cada opcode (para induzir a geração das tabelas constantes corretas e de outros itens indesejados) e, em seguida, realizando uma cirurgia delicada.Execute como
Desmonte com
Tenho certeza de que poderia ser jogado um pouco mais. Estou feliz que funcione ...
fonte
Código de montagem x86 de 16 bits, 104 bytes
Este código é de 2014, mas acabei de encontrar a tarefa.
fonte