Напишите программу, которая использует программу для мозгового срыва и компилирует ее в исполняемый машинный код. Вы можете использовать x86, x86_64, jvm (байт-код java) или armv6 и использовать один из следующих исполняемых форматов: ELF, a.out, файл класса, exe, com. Исполняемый файл должен работать в Linux или Windows (или Java на любом из них).
Ни ваша программа, ни сгенерированный исполняемый файл не могут запускать какие-либо внешние программы (такие как другой компилятор, ассемблер или интерпретатор).
Самый короткий код выигрывает.
Ответы:
C
866783 байтаПоскольку мой код выводит 32-битный исполняемый файл ELF, я не могу обещать, что он будет работать при любой настройке. Потребовалось достаточно доработки, чтобы получить исполняемый файл, чтобы остановить segfaulting на моем компьютере.
Для тех, кто пытается запустить это:
Программа Brainfuck читается из стандартного ввода, а скомпилированный ELF записывается в стандартный вывод.
Ungolfed
В незакрашенной версии кода вы можете лучше понять, что происходит. Массив символов в конце кода для игры в гольф является кодировкой ELF и заголовка программы в негольфированном коде. Этот код также показывает, как каждая инструкция Brainfuck переводится в байт-код.
Self Модификация BrainFuck
Чтобы сэкономить на байтах, лента для моего компилятора не выделяется в
.bss
разделе или чем-то подобном. Вместо этого лента содержит 30 000 нулевых байтов, записанных непосредственно после скомпилированного байтового кода программы Brainfuck. Знание этого и знание того, какой байт-код генерируется моим компилятором, означает, что вы можете генерировать или изменять байт-код во время выполнения. Простой иллюстрацией этой «функции» является программа Brainfuck, которая устанавливает свое собственное значение выхода.Программа уходит от левого края ленты в байт-код до точки, в которой код выхода обычно установлен на 0. При увеличении этого байта код выхода устанавливается на 1 вместо 0, когда программа в конечном итоге завершается. При постоянстве это можно использовать для программирования на уровне системы в Brainfuck.
источник
long long int
вместоchar
. У меня определенно есть место, чтобы сыграть в некоторые из моих переменных объявлений. Я посмотрю, сколько я смогу туда добраться и обновлю свой ответ.Python, 1974 год
Ниже приведены переводы в байт-код Java. local 0 - это байтовый массив, представляющий ленту, local 1 - указатель данных.
xx xx
Являются смещениями , чтобы достичь соответствия кронштейна. № 2System.in
, № 3read()
, № 4System.out
, № 5write()
, и № 6flush()
.Преамбула выделяет массив из 30000 байтов и инициализирует позицию ленты на 0.
Гигантская оболочка в конце была сгенерирована путем компиляции фиктивного
B.java
файла с кодом для каждого из каждого кода операции (чтобы вызвать генерацию правильных таблиц констант и другого барахла), а затем выполняя деликатную операцию над ним.Запустите это как
Разбирать с
Я уверен, что это может быть в гольфе еще немного. Я просто счастлив, что это работает ...
источник
16-битный код сборки x86, 104 байта
Этот код с 2014 года, но я только что нашел задачу.
источник