Конкурс Bloatware: создание 100+ исполняемых файлов MiB [закрыто]

22

Создайте короткий исходный код на вашем любимом скомпилированном языке, который компилируется в большой (не менее 104857600 байт) исполняемый файл. Программа должна быть работоспособна (при условии, что 1 ГБ свободной памяти) и может делать все что угодно (желательно что-то простое, например, привет).

Использование неочевидных трюков приветствуется.

Скучный пример в C:

int a[1024*1024*25] = { 1 };

int main(){}

Бонусные баллы, если можно «объяснить», почему размер исполняемого файла не может быть уменьшен (т. Е. Фактически все используется так или иначе).

Vi.
источник
7
Статически свяжите ВСЕ библиотеки!
Marinus
Именно поэтому изначально задумывался о 10+ МиБ, но пересматривал до 100+ ... Или это значит все библиотеки в системе?
Ви.
Можно ли считать файл HTML исполняемым файлом?
xem
Маловероятно.
Ви.
Это может остаться в теме, если критерий победы был изменен на «самый большой выходной файл» или что-то в этом роде, но это лишит законной силы текущие ответы и сделает это дубликатом по крайней мере еще одной задачи. Смотрите состояние тега конкурса популярности
кошка

Ответы:

13

Хорошо, вот еще один в C, для получения неопределенно определенных бонусных баллов:

#define a(x) x,x|1,x|2,x|3,x|4,x|5,x|6,x|7
#define b(x) a(x),a(x|8),a(x|16),a(x|24)
#define c(x) b(x),b(x|32),b(x|64),b(x|96)
#define d(x) c(x),c(x|128),c(x|256),c(x|384)
#define e(x) d(x),d(x|512),d(x|4<<8),d(x|6<<8)
#define f(x) e(x),e(x|2048),e(x|4096),e(x|6144)
#define g(x) f(x),f(x|8192),f(x|4<<12),f(x|6<<12)
#define h(x) g(x),g(x|2<<14),g(x|4<<14),g(x|6<<14)
#define i(x) h(x),h(x|2<<16),h(x|4<<16),h(x|6<<16)
#define j(x) i(x),i(x|2<<18),i(x|4<<18),i(x|6<<18)
#define k(x) j(x),j(x|2<<20),j(x|4<<20),j(x|6<<20)
int u,v,z[]={k(0),k(2<<22),k(4<<22),k(6<<22)}
int main(){for(u=v=0;u<1<<25;u++)v|=u!=z[u];return v;}

По сути, во время компиляции он строит восходящую последовательность целых чисел от 0 до 2 25 - 1. Во время выполнения он проверяет, действительно ли последовательность содержит ожидаемые значения, и, если нет, возвращает ненулевой код ошибки.

Ps. Если я правильно сделал математику, то исполняемый файл должен быть больше 100 МБ. Я дам вам знать точный размер, как только он закончил компиляцию ...

Илмари Каронен
источник
1
Ps. Мои попытки проверить фактический размер были (надеюсь, временно) заблокированы, как я подозреваю, довольно необычным сообщением об ошибке GCC:virtual memory exhausted: Cannot allocate memory . o_O Попробую настроить параметры, чтобы посмотреть, смогу ли я его как-нибудь скомпилировать.
Ильмари Каронен
Также не может строить с clang(ICE) и tcc.
Ви.
1
Отключите всю оптимизацию ( -O0), чтобы минимизировать требования к компилятору, и включение pipe ( -pipe) может или не может помочь.
dmckee
3
Эта проблема компиляции напоминает о победившей записи IOCCC, которая пишет свой собственный препроцессор для проверки правильности программы: ioccc.org/2004/vik2.hint
Кристиан Семрау
6

C #

Не уверен, если это квалифицируется как короткий, потому что исходный код в конечном итоге> 30k :)

Т.е. - слишком большой, чтобы цитировать. Вот немного сокращенная версия

using System.Collections.Generic;
class Program
{
    static void Main()
    {
        var a = new List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<List<int>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>();
    }
}

Код, который я фактически скомпилировал, можно найти здесь: http://pastebin.com/R5T3e3J0

Это создаст .EXE-файл размером ~ 45 КБ при компиляции без оптимизации. Скомпилируйте его снова с Ngen.exe (Native Image Generator), и он станет колоссальным 104MiB!

Это работает из-за того, как работает система родовых типов CLR. Каждый List <> в приведенном выше коде будет генерировать новое объявление типа (обычно с помощью JIT-компиляции, но Ngen выполняет AOT-компиляцию). Таким образом, один тип для List <int>, другой для List <List <int>> и так далее. Таким образом, для этого кода будет создано в общей сложности 5160 различных общих списков.

Кристиан Пальмсьерна
источник
1
Вам нужен скрипт, который напишет вашу программу.
Hildred
Уменьшить размер программы довольно просто (убрав уровни вложенности List). Можно ли сделать так, чтобы вы не могли легко удалить повторяющийся код, не затрагивая функции программы?
Ви.
Ну, конечно, вы можете просто удалить вложение, но аналогично, в примере на C вы можете просто удалить несколько #defines и сделать программу меньше. То, как я интерпретировал требование, что его нельзя уменьшить по размеру, заключалось в том, что его нельзя было оптимизировать. Если вам разрешено просто изменить исходный код, я не вижу смысла. :)
Кристиан Пальмсьерна
1
Хотя следует отметить, что это, вероятно, можно оптимизировать, так как переменная a никогда не используется.
Кристиан Пальмсьерна
4

Кобол

   ID DIVISION. 
   PROGRAM-ID. BLOAT. 
   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  THE-TEST-STRINGS. 
       05  FILLER OCCURS 11584 TIMES. 
           10  TEST-STRING          PIC X(11584). 
   LOCAL-STORAGE SECTION. 
   01  FIRST-TIME-FLAG              PIC X VALUE "Y". 
   01  DISP-BEFORE-STRING     COMP  PIC 9(8). 
   01  LOOP-COUNTER           COMP  PIC 9(8). 
   01  START-STRING. 
       05  FILLER OCCURS 0 TO 11584 TIMES 
           DEPENDING ON DISP-BEFORE-STRING. 
           10  FILLER               PIC X. 
       05  THE-SUBSTRING            PIC X(12). 
   01  INITIAL-STRING               PIC X(12) 
                                     VALUE "HELLO WORLD!".
   LINKAGE SECTION. 
   01  STRING-PARAMETER             PIC X(11584). 
   01  THE-RESULT                   PIC X. 
   PROCEDURE DIVISION USING 
                                    STRING-PARAMETER 
                                    THE-RESULT 
                                    . 

       IF FIRST-TIME-FLAG = "Y" 
           PERFORM                  SET-UP-STRINGS 
       END-IF 
       PERFORM 
         VARYING                    LOOP-COUNTER 
         FROM                       1 
           BY                       1 
         UNTIL                      LOOP-COUNTER 
           GREATER THAN 11584 
         OR STRING-PARAMETER 
             EQUAL TO               TEST-STRING 
                                        ( LOOP-COUNTER ) 
       END-PERFORM 
       IF STRING-PARAMETER 
         EQUAL TO TEST-STRING ( LOOP-COUNTER ) 
           MOVE "Y"                TO THE-RESULT 
       ELSE 
           MOVE "N"                TO THE-RESULT 
       END-IF 
       GOBACK 
       . 
   SET-UP-STRINGS. 
       PERFORM 
         VARYING                    LOOP-COUNTER 
         FROM                       0 
           BY                       1 
         UNTIL                      LOOP-COUNTER 
           EQUAL TO 11584 
           MOVE 11584               TO DISP-BEFORE-STRING 
           MOVE SPACE               TO START-STRING 
           MOVE LOOP-COUNTER        TO DISP-BEFORE-STRING 
           MOVE INITIAL-STRING      TO THE-SUBSTRING 
           MOVE START-STRING        TO TEST-STRING 
                                        ( LOOP-COUNTER + 1 )
       END-PERFORM 
       MOVE "N"                     TO FIRST-TIME-FLAG 
       . 

Немного знаний может быть опасной вещью.

Это может быть быстрее сделать одно большое сравнение, чем много маленьких сравнений; Максимальный объем рабочего хранилища 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) дважды инициализировало бы стол при каждом ВЫЗОВЕ, поэтому даже медленнее.

Раздувать нельзя, без переписывания программы. Большая часть кода плохая, хотя есть одна полезная техника.

Это не реальный пример, но я могу представить, что кто-то делает это, если этот человек достаточно умен :-)

Компиляция не проблема вообще. Запускать его при любой возможности быстро не стоит.

Конечно, есть и старая ошибка. Очень часто встречается в «поисковых» заданиях.

Билл Вуджер
источник
0

PowerBASIC

#BLOAT(104857600)
FUNCTION PBMAIN
  PRINT "Hello World"
  BEEP
END FUNCTION
Хуан Себастьян Лосано
источник
Это сопоставимо с примером C в вопросе.
Ви.
0

Scala

import scala.{specialized=>s}
import scala.Specializable.{Everything=>E}
class Printer[@s(E) A, @s(E) B, @s(E) C, @s(E) D, @s(E) E, @s(E) F, @s(E) G, @s(E) H]{
    def print(a:A,b:B,c:C)=println(s"$a, $b, $c")
}

object Main extends App{ 
    (new Printer[Int,Int,Int,Int,Int,Int,Int,Int]).print(1,2,3)
}

Специализированная аннотация создает новый класс для каждого типа, чтобы предотвратить упаковку, когда все типы со временем превращаются в объекты. Он создаст Everythingфайлы классов 10 ^ 8 (( состоит из 10 типов) ^ (8 параметров типа в классе)), каждый по 300-500 байт, если сначала не произойдет сбой.


Это можно объяснить, сказав, что производительность важна, особенно если у класса действительно больше, чем есть метод для печати. Использование специализированных специализированных методов вместо того, чтобы помещать все это в объявление, также затруднит

user60561
источник
Какая версия Scala мне нужна, чтобы построить это? 2.9.2 + dfsg-1 не любит s "что угодно" и не знает о scala.Specializable.
Ви.
Scala 2.10 включает интерполированные строки с s "", но вы можете удалить эту строку без какого-либо влияния на размер. В Scala 2.8 есть функция специализации, поэтому, если вы удалите интерполированную строку, все должно работать нормально.
user60561
-2

Javascript

function bigenough(){
        var kbytes = $('html').html().length;
        return (kbytes>1024*100);
}
while(!bigenough()){
$('html').append('<p>WASSUP</p>');}

Запустите этот код в консоли браузера на этой странице и по завершении сохраните страницу. это должно привести к размеру файла больше, чем 100 МБ. Все еще тестирую. Опубликуем фактический размер после того

обновить
- сохраненная страница является исполняемым файлом результата. V8 двигатель Chrome является компилятором. И код, который я разместил, является программой. Я признаю, что для компиляции требуется много времени. : D

rahulroy9202
источник
1
Не работает как требуется. Задача состоит в том, чтобы создать исполняемый файл, который слишком велик, а не тот, который потребляет слишком много памяти при запуске. Кроме того, чрезмерное использование jQuery.
Джон Дворак
@JanDvorak создаст HTML-файл размером более 100 МБ. Также в Вопросе не указаны какие-либо ограничения на использование JQuery. Программа все еще выполняется на моем Chrome, и страница занимает 300 МБ памяти, как сообщает диспетчер задач Chrome.
rahulroy9202
Не будет Каждое добавление, которое вы делаете, происходит исключительно в памяти. Он создаст HTML-файл размером 100 МБ, только если пользователь запустит операцию сохранения. Что он, возможно, не сможет или не захочет. Кроме того, даже если вы называете этот процесс добавления «компиляции» и вам удается сохранить полученный HTML-файл как файл, я не думаю, что вы можете написать свой собственный компилятор.
Джон Дворак
@JanDvorak Я указал в ответе, что страница должна быть сохранена. здесь страница является исполняемым файлом результата. V8 двигатель Chrome является компилятором. И код, который я разместил, является программой.
rahulroy9202
2
V8 - это компилятор, который создает крошечный «исполняемый файл» (который никогда не получает его на жесткий диск) и выполняет его, а затем переходит к генерации огромного «исходного файла» (на языке, который даже не компилируется, и не язык программирования). Если вы называете результат вашего скрипта исполняемым (нет ...), тогда мы должны вызвать ваш скрипт компилятором, а не V8. Это не называется компиляцией, если ваш скрипт выполняется в процессе (макросы как бы размывают эту строку, но это не макрос)
Джон Дворжак