Вступ
Напевно, ви знайомі з zip-бомбами , XML-бомбами тощо. Простіше кажучи, це (відносно) невеликі файли, які дають величезний вихід при інтерпретації наївного програмного забезпечення. Завдання тут полягає в зловживанні компілятором таким же чином.
Виклик
Напишіть деякий вихідний код, який займає 512 байт або менше і який компілюється у файл, який займає максимально можливий простір. Виграє найбільший вихідний файл!
Правила
Гаразд, тому є кілька важливих роз’яснень, визначень та обмежень;
- Вихід компіляції повинен бути файлом ELF , портативним виконавчим файлом Windows (.exe) або віртуальним байт-кодом для JVM або CLR .Net (інші типи віртуальних байтових кодів також, ймовірно, будуть у порядку, якщо запитають). Оновлення: висновок .pyc / .pyo Python також враховується .
- Якщо ваш вибір мови не може бути скомпільований безпосередньо в один із цих форматів, також дозволяється транспіляція, що супроводжується компіляцією ( Оновлення: ви зможете транспілювати кілька разів, до тих пір, поки ви ніколи не використовуєте одну й ту ж мову більше одного разу ).
- Ваш вихідний код може складатися з декількох файлів і навіть файлів ресурсів, але підсумований розмір усіх цих файлів не повинен перевищувати 512 байт.
- Ви не можете використовувати будь-який інший вхід, крім вихідних файлів і стандартної бібліотеки на ваш вибір мови. Статичне з'єднання стандартних бібліотек у порядку, коли воно підтримується. Зокрема, немає сторонніх бібліотек або бібліотек ОС.
- Потрібно мати можливість викликати вашу компіляцію за допомогою команди або серії команд. Якщо під час компіляції вам потрібні конкретні прапори, вони зараховуються до вашого байтового ліміту (наприклад, якщо ваша лінія компіляції
gcc bomb.c -o bomb -O3 -lm
,-O3 -lm
частина (7 байт) буде зарахована (врахуйте, що початковий провідний простір не враховується). - Попередні процесори дозволені, лише якщо вони є стандартним варіантом компіляції для вашої мови.
- Навколишнє середовище залежить від вас, але, щоб зробити це перевіреним, дотримуйтесь останніх (тобто доступних) версій компілятора та операційних систем (і, очевидно, вкажіть, яку ви використовуєте).
- Він повинен компілюватися без помилок (попередження в порядку), а збій компілятора не рахується ні за що.
- Те, що ваша програма насправді робить, не має значення, хоча це не може бути нічого шкідливого. Це навіть не повинно бути в старті.
Приклад 1
Програма С
main(){return 1;}
Скомпільовано Apple LLVM version 7.0.2 (clang-700.1.81)
в ОС X 10.11 (64-розрядна):
clang bomb.c -o bomb -pg
Створює файл з 9228 байтів. Загальний розмір джерела становить 17 + 3 (для -pg
) = 20 байт, що легко в межах граничного розміру.
Приклад 2
Програма Brainfuck:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Транспільовано з wiib на c:
./awib < bomb.bf > bomb.c
Потім компілюється з Apple LLVM version 7.0.2 (clang-700.1.81)
ОС X 10.11 (64-розрядна):
clang bomb.c
Створює файл з 8464 байтів. Загальний вхід тут становить 143 байти (оскільки @lang_c
це типово для awib, його не потрібно було додавати у вихідний файл, і жодної команди немає спеціальних прапорів).
Також зауважте, що в цьому випадку тимчасовий файл bomb.c становить 802 байти, але це не враховує ні розмір джерела, ні розмір виводу.
Заключна примітка
Якщо буде досягнуто вихід більше 4 Гб (можливо, якщо хтось знайде цілісного препроцесора), конкуренція буде за найменший джерело, який створює файл принаймні такого розміру (це просто не практично для тестування матеріалів, які стають занадто великими) .