Конкурс програмного забезпечення: виготовлення 100+ MiB виконуваного файлу [закрито]


22

Створіть короткий вихідний код улюбленою мовою компіляції, яка збирається у великий (не менше 104857600 байт) виконуваний файл. Програма повинна бути запущеною (передбачаючи 1 Гб вільної пам'яті) і вміти робити все, що завгодно (краще щось просте, як привіт світ).

Використання неочевидних хитрощів рекомендується.

Нудний приклад на C:

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

int main(){}

Бонусні бали, якщо їх можна "пояснити", чому виконуваний файл не може бути зменшений у розмірі (т. Е. Все роздуття фактично використовується якось).


7
Статично зв’яжіть ВСІ бібліотеки!
Марина

Ось чому спочатку думали про 10+ MiB, але переглянули на 100 + ... Або це означає всі бібліотеки в системі?
Ві.

Чи можна вважати файл HTML виконуваним?
xem

Навряд чи.󠀠󠀠󠀠
Vi.

Це може залишатися темою, якщо критерій виграшу буде змінено на "найбільший вихідний файл" або щось подібне, але це призведе до скасування поточних відповідей і зробить це дублікатом щонайменше одного іншого виклику. Дивіться стан тегів конкурсу на популярність
кіт

Відповіді:


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. Під час виконання програма перевіряє, що послідовність дійсно містить очікувані значення, а якщо ні, то повертає ненульовий код помилки.

Пс. Якби я правильно зробив математику, виконуваний файл повинен бути понад 100 Мб. Я дам вам знати точний розмір, як тільки він буде складений ...


1
Пс. Мої спроби перевірити , фактичний розмір були (сподіваюся , тимчасово) загнані в те , що я підозрюю, що досить незвичне повідомлення про помилку GCC: virtual memory exhausted: Cannot allocate memory. o_O Спробую налаштувати параметри, щоб побачити, чи зможу я його якось скласти.
Ільмарі Каронен


Також не можна будувати за допомогою clang(ICE) та tcc.
Ві.

1
Вимкніть оптимізацію ( -O0), щоб мінімізувати вимоги до компілятора, а включення труб ( -pipe) може чи не допоможе.
dmckee

3
Ця проблема компіляції нагадує виграшний запис МОККЦ, який пише власного препроцесора, щоб переконатися, що програма була правильною: ioccc.org/2004/vik2.hint
Christian Semrau

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 ~ 45KiB при компіляції без оптимізації. Скомпілюйте його знову з Ngen.exe (Native Image Generator), і він стане колосальним 104MiB!

Це працює завдяки тому, як працює система загального типу CLR. Кожен Список <> у наведеному вище коді генерує нове оголошення типу (як правило, шляхом компіляції JIT, але Ngen виконує компіляцію AOT). Отже, один тип для списку <int>, інший для списку <список <int>> тощо. Отже для цього коду буде створено загалом 5160 різних загальних списків.


1
Вам потрібен сценарій, який буде писати вашу програму.
hildred

Досить тривіально зменшити розмір програми (видаляючи рівні вкладення списку). Чи можна зробити так, що ви не можете легко видалити повторюваний код, не впливаючи на функцію програми?
Ві.

Ну звичайно, ви можете просто видалити вкладення, але так само, в прикладі 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 COBOL Enterprise (до версії 4.2) може мати максимальну РОБОТУ-ЗБЕРІГАННЯ 128 МБ (версія 5.0 може мати 2 ГБ); LOCAL-STORAGE пропонує ще 128 Мб, якщо вам потрібно більше місця.

Завдання полягає в тому, щоб підтвердити, що 11584-байтний накопичувач має значення "ПРАВО МИР! десь, а решта - простір.

Вигаданий програміст вирішує написати для цього підпрограму (на випадок, якщо це потрібно в іншому місці) та включити їх високопродуктивну техніку (бонус).

Програміст обчислює, що 11584 * 11584 - 128 Мб, тому використовує WORKING-STORAGE для величезної таблиці, а LOCAL-STORAGE - для всього іншого, що потрібно.

Програміст кодує це і свідомо посміхається собі, коли компіляція чиста. Вони мали рацію щодо 128 Мб.

Тестує код. Це працює. Можливо, трохи повільно, але на машину сильне навантаження. Знову посміхається, думаючи, як повільно це було б, якщо закодувати без їх рівня знань експерта.

РОБОТА-ЗБЕРІГАННЯ поставляється в 134,189,056 байт, а також є кілька непоганих байтів інших речей. Повинна бути досить великою.

Реальність така, що робити довге порівняння замість короткого порівняння, як це реалізовано тут, це дуже повільний спосіб зробити це.

Ще повільніше LOCAL-STORAGE, який ініціалізується підпрограми під час виконання кожного разу, коли викликається підпрограма, спричиняє встановлення всього 128MB для кожного CALL.

Програміст просто помилявся щодо розміру столу, є достатньо місця, не використовуючи LOCAL-STORAGE. Довгі порівняння можуть перемогти короткі порівняння, але лише тоді, коли фактична кількість порівнянь зменшена.

Я розглядав можливість заміни МІСЬКОГО МАГАЗИНУ та РОБОТИ-ЗБЕРІГАННЯ, просто набагато менше ймовірності, що хтось зашифрує це так, тому я цього не зробив. Якщо поставити на стіл значення "ПРОСТІРНІ ПРОСТІРИ" (якби воно було в "МІСЦЕ-ЗБЕРІГАННЯ"), було б вимкнено таблицю двічі під час кожного CALL, тому ще повільніше.

Не можна видалити Bloat, не переписавши програму. Більшість кодів погані, хоча є одна корисна техніка.

Це не приклад із реального життя, але я можу уявити, що хтось це робить, якщо той хтось досить розумний :-)

Складання - це зовсім не проблема. Запускати його з усіма можливостями швидко виявляється, що не варто намагатися.

Звичайно, є і звичайний старий Буг. Дуже поширений у пошуку «завдань».



0

Скала

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)
}

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


Це можна пояснити, кажучи, що продуктивність важлива, особливо якщо клас насправді робив більше, ніж метод друку. Використання загальних спеціалізованих методів замість того, щоб все це містити в декларації, також було б важче помітити


Яка версія шкали мені потрібна для створення цього? 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 Мб. Досі тестуємо. Опублікує фактичний розмір після завершення.

update
- збережена сторінка є виконаним результатом. V8 двигун хрому - компілятор. І код, який я розмістив, це програма. я визнаю, що потрібно скласти багато часу. : D


1
Не працює як потрібно. Завдання полягає в тому, щоб створити виконуваний файл, який занадто великий, а не той, який витрачає занадто багато пам'яті при запуску. Також, надмірне використання jQuery.
Джон Дворак

@JanDvorak він створить HTML-файл розміром більше 100 МБ. Також у Питання не визначено жодних обмежень щодо використання JQuery. Програма все ще виконується на моєму Chrome, і сторінка споживає 300 Мб пам’яті, як повідомляє менеджер завдань Chrome.
rahulroy9202

Це не стане. Кожне додаток, яке ви робите, відбувається суто в пам'яті. Він створить HTML-файл у форматі 100 МБ лише тоді, коли користувач запустить операцію збереження. Що він, можливо, не зможе зробити, і не захоче. Крім того, навіть якщо ви називаєте цей процес додавання "компіляцією" і вам вдається зберігати отриманий HTML як файл, я не думаю, що вам дозволяється писати власний компілятор.
Іван Дворак

@JanDvorak У відповіді я зазначив, що сторінку потрібно зберегти. тут сторінка виконується результатом. V8 двигун хрому - компілятор. І код, який я розмістив, це програма.
rahulroy9202

2
V8 є компілятор , який виробляє крихітні «виконуваний» (який ніколи не отримує його на жорсткий диск) і запустити його, який потім переходить на генерувати величезний «вихідний файл» (на мові , який навіть не компілюється, ні мова програмування). Якщо ви називаєте результат вашого сценарію виконуваним файлом (nope ...), тоді ми повинні називати ваш сценарій компілятором, а не V8. Компіляція не називається, якщо ваш сценарій буде виконаний у процесі (макроси ніби розмивають цю лінію, але це не макрос)
Джон Дворак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.