Concorso Bloatware: produzione di oltre 100 eseguibili MiB [chiuso]


22

Crea un codice sorgente breve nel tuo linguaggio compilato preferito che si compila in un file eseguibile grande (non inferiore a 104857600 byte). Il programma deve essere eseguibile (presupponendo 1 GB di memoria libera) e può fare qualsiasi cosa (preferibile qualcosa di semplice come un ciao mondo).

L'uso di trucchi non ovvi è incoraggiato.

Esempio noioso in C:

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

int main(){}

Punti bonus se può essere "spiegato" perché l'eseguibile non può essere ridotto di dimensioni (cioè in qualche modo tutto il gonfio viene effettivamente utilizzato).


7
Collega staticamente TUTTE le librerie!
Marin

Ecco perché inizialmente pensato a 10+ MiB, ma rivisto a 100+ ... O significa tutte le librerie nel sistema?
Vi.

Un file HTML può essere considerato un eseguibile?
XX

Improbabile
. 󠀠󠀠󠀠

Ciò potrebbe rimanere in discussione se il criterio vincente fosse cambiato in "file di output più grande" o qualcosa del genere, ma ciò invaliderebbe le risposte correnti e renderebbe questo un duplicato di almeno un'altra sfida. Guarda lo stato del tag del concorso di popolarità
cat

Risposte:


13

OK, eccone un altro in C, per i punti bonus vagamente definiti:

#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;}

Fondamentalmente, al momento della compilazione, crea una sequenza crescente di numeri interi da 0 a 2 25 - 1. In fase di esecuzione, verifica che la sequenza contenga effettivamente i valori previsti e, in caso contrario, restituisce un codice di errore diverso da zero.

Ps. Se ho fatto bene la mia matematica, l'eseguibile dovrebbe essere oltre 100 MiB. Ti farò sapere la dimensione esatta una volta terminata la compilazione ...


1
Ps. I miei tentativi di verificare le dimensioni reali sono stati (si spera temporaneamente) ostacolato da quello che ho il sospetto di essere un messaggio di errore GCC piuttosto insolito: virtual memory exhausted: Cannot allocate memory. o_O Proverò a modificare le opzioni per vedere se riesco a farlo compilare in qualche modo.
Ilmari Karonen,

12
Aww, ti stavo solo immaginando in piedi su una sedia a rotelle e stavi litigando con un altro sviluppatore .
Iszi,

Inoltre, non è possibile compilare con clang(ICE) e tcc.
Vi.

1
Disattiva tutta l'ottimizzazione ( -O0) per ridurre al minimo le esigenze del compilatore e abilitare pipe ( -pipe) potrebbe o non potrebbe essere d'aiuto.
dmckee,

3
Questo problema di compilazione ricorda una voce vincente di IOCCC che scrive il proprio preprocessore per verificare che il programma fosse corretto: ioccc.org/2004/vik2.hint
Christian Semrau,

6

C #

Non sono sicuro se questo si qualifica come breve, perché il codice sorgente ha finito per essere> 30k :)

Vale a dire - troppo grande per essere citato. Ecco una versione leggermente abbreviata di esso

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

Il codice che ho effettivamente compilato può essere trovato qui: http://pastebin.com/R5T3e3J0

Questo creerà un file .EXE di ~ 45 KiB quando compilato senza ottimizzazioni. Compilalo di nuovo con Ngen.exe (Native Image Generator) e diventa un enorme 104 MiB!

Questo funziona a causa del funzionamento del sistema di tipo generico CLR. Ciascuna Lista <> nel codice sopra genererà una nuova dichiarazione di tipo (normalmente attraverso la compilazione JIT, ma Ngen esegue la compilazione AOT). Quindi un tipo per Elenco <int>, un altro per Elenco <Elenco <int>> e così via. Quindi, per questo codice, verranno creati un totale di 5160 elenchi generici diversi.


1
Ciò di cui hai bisogno è uno script che scriverà il tuo programma.
hildred

È piuttosto banale ridurre la dimensione del programma (rimuovendo i livelli di annidamento di Elenco). Può essere fatto in modo da non poter rimuovere facilmente il codice ripetuto senza influire sulla funzione del programma?
Vi.

Ovviamente puoi semplicemente rimuovere l'annidamento, ma allo stesso modo, nell'esempio C potresti semplicemente rimuovere alcune #define e ridurre il programma. Il modo in cui ho interpretato il requisito che non può essere ridotto in termini di dimensioni è che non può essere ottimizzato. Se ti è permesso solo modificare il codice sorgente non capisco bene il punto. :)
Christian Palmstierna il

1
Anche se va notato che questo può probabilmente essere ottimizzato, poiché la variabile a non viene mai utilizzata.
Christian Palmstierna,

4

COBOL

   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 
       . 

Una piccola conoscenza può essere pericolosa.

Può essere più veloce fare un grande confronto rispetto a molti piccoli confronti; Enterprise COBOL di IBM (fino alla versione 4.2) può avere un WORKING-STORAGE massimo di 128 MB (la versione 5.0 può avere 2GB); LOCAL-STORAGE offre ulteriori 128 MB se hai bisogno di più spazio.

Il compito è confermare che un archivio di 11584 byte ha il valore "HELLO WORLD!" da qualche parte, e il resto è spazio.

Il programmatore fittizio decide di scrivere un sottoprogramma per questo (nel caso fosse necessario altrove) e di includere la loro tecnica ad alte prestazioni (bonus).

Il programmatore calcola che 11584 * 11584 è 128 MB, quindi utilizza WORKING-STORAGE per una tabella enorme e LOCAL-STORAGE per tutto il necessario.

Il programmatore lo codifica e sorride consapevolmente a se stesso quando la compilazione è pulita. Avevano ragione circa i 128 MB.

Verifica il codice. Funziona. Forse un po 'lento, ma c'è un carico pesante sulla macchina. Sorride di nuovo, pensando a quanto sarebbe lento se codificato senza il loro livello di conoscenza degli esperti.

Il WORKING-STORAGE arriva a 134.189.056 byte e ci sono anche alcuni byte di altre cose. Dovrebbe essere abbastanza grande.

La realtà è che fare un confronto lungo invece di un confronto breve, come implementato qui, è un modo molto lento per farlo.

Ancora più lento, il LOCAL-STORAGE, che viene inizializzato dalle routine di runtime ogni volta che viene chiamato un sottoprogramma, causa la configurazione dell'intero 128 MB per ogni CHIAMATA.

Il programmatore aveva semplicemente torto sulla dimensione del tavolo, c'è abbastanza spazio senza usare LOCAL-STORAGE. I confronti lunghi possono battere i confronti brevi, ma solo quando viene ridotto il numero effettivo di confronti.

Ho pensato di scambiare LOCAL-STORAGE e WORKING-STORAGE, è molto meno probabile che qualcuno lo codifichi in questo modo, quindi non l'ho fatto. Mettere uno SPAZIO VALORE sulla tabella (se fosse stato in LOCAL-STORAGE) avrebbe inizializzato la tabella due volte su ogni CHIAMATA, quindi anche più lentamente.

Il bloat non può essere rimosso, senza riscrivere il programma. Gran parte del codice è errato, anche se esiste una tecnica utile.

Questo non è un esempio di vita reale, ma posso immaginare qualcuno che lo faccia, se qualcuno è abbastanza intelligente :-)

La compilazione non è affatto un problema. Eseguirlo con ogni possibilità si rivela rapidamente non vale la pena tentare.

Certo, c'è anche un semplice vecchio bug. Molto comune nelle attività di "ricerca".


0

PowerBASIC

#BLOAT(104857600)
FUNCTION PBMAIN
  PRINT "Hello World"
  BEEP
END FUNCTION

È paragonabile all'esempio C nella domanda.
Vi.

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

L'annotazione specializzata crea una nuova classe per ogni tipo al fine di prevenire il boxing quando alla fine tutti i tipi vengono trasformati in oggetti. EverythingCreerà file di classe 10 ^ 8 (( composto da 10 tipi) ^ (8 parametri di tipo sulla classe)), ciascuno da 300 a 500 byte, se non si blocca per primo.


Questo potrebbe essere spiegato dicendo che le prestazioni sono importanti, specialmente se la classe ha effettivamente fatto molto di più che avere un metodo per stampare. L'uso di metodi specializzati generici invece di inserire tutto nella dichiarazione renderebbe anche più difficile notarlo


Di quale versione scala ho bisogno per costruirlo? 2.9.2 + a dfsg-1 non piace "qualunque cosa" e non si conosce scala.Specializable.
Vi.

Scala 2.10 include le stringhe interpolate con s "", ma puoi rimuovere quella stringa senza alcun effetto sulla dimensione. Scala 2.8 ha la funzione di specializzazione, quindi se rimuovi la stringa interpolata, tutto dovrebbe funzionare bene.
user60561

-2

Javascript

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

Esegui questo codice nella Console del browser in questa pagina e, una volta completato, salva la pagina. dovrebbe comportare una dimensione del file superiore a 100 MB. Ancora in fase di test. Pubblicherà le dimensioni effettive una volta fatto.

aggiornamento:
la pagina salvata è il risultato eseguibile. Il motore v8 di Chrome è il compilatore. E il codice che ho pubblicato è il programma. ammetto che la compilazione richiede molto tempo. : D


1
Non funziona come richiesto. Il compito è quello di creare un file eseguibile troppo grande, non uno che consuma troppa memoria durante l'esecuzione. Inoltre, uso eccessivo di jQuery.
John Dvorak,

@JanDvorak creerà un file HTML con dimensioni superiori a 100 MB. Inoltre, la domanda non specifica alcuna limitazione di utilizzo di JQuery. Il programma è ancora in esecuzione sul mio Chrome e la pagina sta consumando 300 MB di memoria, come riportato dal Task Manager di Chrome.
rahulroy9202,

Non lo farà. Ogni appendice che fai succede puramente nella memoria. Creerà un file HTML da 100 MB solo se l'utente avvia un'operazione di salvataggio. Cosa che potrebbe non essere in grado di fare, né che vorrebbe. Inoltre, anche se chiami questo processo di aggiunta "compilation" e riesci a memorizzare l'HTML risultante come file, non penso che ti sia permesso scrivere il tuo compilatore.
John Dvorak,

@JanDvorak Ho sottolineato nella risposta che la pagina deve essere salvata. qui, la pagina è il risultato eseguibile. Il motore v8 di Chrome è il compilatore. E il codice che ho pubblicato è il programma.
rahulroy9202,

2
V8 è un compilatore che produce un piccolo "eseguibile" (che non lo porta mai sul disco rigido) e lo esegue, che procede quindi a generare un enorme "file sorgente" (in un linguaggio che non è nemmeno compilato, né un linguaggio di programmazione). Se chiami il risultato del tuo script un eseguibile (no ...), allora dobbiamo chiamare il tuo script il compilatore, non V8. Non si chiama compilazione se lo script viene eseguito nel processo (le macro in qualche modo sfocano quella linea, ma questa non è una macro)
John Dvorak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.