Создайте короткий исходный код на вашем любимом скомпилированном языке, который компилируется в большой (не менее 104857600 байт) исполняемый файл. Программа должна быть работоспособна (при условии, что 1 ГБ свободной памяти) и может делать все что угодно (желательно что-то простое, например, привет).
Использование неочевидных трюков приветствуется.
Скучный пример в C:
int a[1024*1024*25] = { 1 };
int main(){}
Бонусные баллы, если можно «объяснить», почему размер исполняемого файла не может быть уменьшен (т. Е. Фактически все используется так или иначе).
Ответы:
Хорошо, вот еще один в C, для получения неопределенно определенных бонусных баллов:
По сути, во время компиляции он строит восходящую последовательность целых чисел от 0 до 2 25 - 1. Во время выполнения он проверяет, действительно ли последовательность содержит ожидаемые значения, и, если нет, возвращает ненулевой код ошибки.
Ps. Если я правильно сделал математику, то исполняемый файл должен быть больше 100 МБ. Я дам вам знать точный размер, как только он закончил компиляцию ...
источник
virtual memory exhausted: Cannot allocate memory
. o_O Попробую настроить параметры, чтобы посмотреть, смогу ли я его как-нибудь скомпилировать.clang
(ICE) иtcc
.-O0
), чтобы минимизировать требования к компилятору, и включение pipe (-pipe
) может или не может помочь.C #
Не уверен, если это квалифицируется как короткий, потому что исходный код в конечном итоге> 30k :)
Т.е. - слишком большой, чтобы цитировать. Вот немного сокращенная версия
Код, который я фактически скомпилировал, можно найти здесь: http://pastebin.com/R5T3e3J0
Это создаст .EXE-файл размером ~ 45 КБ при компиляции без оптимизации. Скомпилируйте его снова с Ngen.exe (Native Image Generator), и он станет колоссальным 104MiB!
Это работает из-за того, как работает система родовых типов CLR. Каждый List <> в приведенном выше коде будет генерировать новое объявление типа (обычно с помощью JIT-компиляции, но Ngen выполняет AOT-компиляцию). Таким образом, один тип для List <int>, другой для List <List <int>> и так далее. Таким образом, для этого кода будет создано в общей сложности 5160 различных общих списков.
источник
Кобол
Немного знаний может быть опасной вещью.
Это может быть быстрее сделать одно большое сравнение, чем много маленьких сравнений; Максимальный объем рабочего хранилища IBM Enterprise COBOL (до версии 4.2) составляет 128 МБ (в версии 5.0 может быть 2 ГБ); LOCAL-STORAGE предлагает дополнительные 128 МБ, если вам нужно больше места.
Задача состоит в том, чтобы подтвердить, что 11584-байтовый фрагмент памяти имеет значение "HELLO WORLD!" где-то, а остальное пространство.
Вымышленный программист решает написать подпрограмму для этого (на случай, если она понадобится где-то еще) и включить свою высокопроизводительную технику (бонус).
Программист рассчитывает, что 11584 * 11584 - это 128 МБ, поэтому он использует WORKING-STORAGE для огромной таблицы и LOCAL-STORAGE для всего остального, что необходимо.
Программист кодирует это и сознательно улыбается себе, когда компиляция чиста. Они были правы насчет 128МБ.
Проверяет код. Оно работает. Возможно, немного медленно, но на машине есть большая нагрузка. Снова улыбается, думая, как медленно это будет, если кодируется без их уровня экспертных знаний.
РАБОЧЕЕ ХРАНЕНИЕ имеет размер 134 189 056 байт, и есть еще несколько байтов других вещей. Должно быть достаточно большим.
Реальность такова, что выполнять длинное сравнение вместо короткого, как это реализовано здесь, - очень медленный способ сделать это.
Еще медленнее, LOCAL-STORAGE, который инициализируется подпрограммами времени выполнения каждый раз, когда вызывается подпрограмма, заставляет все 128 МБ быть настроенными для каждого CALL.
Программист был просто не прав насчет размера таблицы, там достаточно места без использования LOCAL-STORAGE. Длинные сравнения могут превзойти короткие, но только когда фактическое количество сравнений уменьшается.
Я подумал об обмене МЕСТНЫМ ХРАНИЛИЩОМ и РАБОЧИМ ХРАНИЛИЩОМ, гораздо менее вероятно, что кто-то закодирует его таким образом, поэтому я этого не сделал. Помещение VALUE SPACE на стол (если бы оно было в LOCAL-STORAGE) дважды инициализировало бы стол при каждом ВЫЗОВЕ, поэтому даже медленнее.
Раздувать нельзя, без переписывания программы. Большая часть кода плохая, хотя есть одна полезная техника.
Это не реальный пример, но я могу представить, что кто-то делает это, если этот человек достаточно умен :-)
Компиляция не проблема вообще. Запускать его при любой возможности быстро не стоит.
Конечно, есть и старая ошибка. Очень часто встречается в «поисковых» заданиях.
источник
PowerBASIC
источник
Scala
Специализированная аннотация создает новый класс для каждого типа, чтобы предотвратить упаковку, когда все типы со временем превращаются в объекты. Он создаст
Everything
файлы классов 10 ^ 8 (( состоит из 10 типов) ^ (8 параметров типа в классе)), каждый по 300-500 байт, если сначала не произойдет сбой.Это можно объяснить, сказав, что производительность важна, особенно если у класса действительно больше, чем есть метод для печати. Использование специализированных специализированных методов вместо того, чтобы помещать все это в объявление, также затруднит
источник
Javascript
Запустите этот код в консоли браузера на этой странице и по завершении сохраните страницу. это должно привести к размеру файла больше, чем 100 МБ. Все еще тестирую. Опубликуем фактический размер после того
обновить
- сохраненная страница является исполняемым файлом результата. V8 двигатель Chrome является компилятором. И код, который я разместил, является программой. Я признаю, что для компиляции требуется много времени. : D
источник