Concours Bloatware: production de plus de 100 exécutables MiB [fermé]

22

Créez un code source court dans votre langue compilée préférée qui se compile en un gros fichier exécutable (pas moins de 104857600 octets). Le programme doit être exécutable (en supposant 1 Go de mémoire libre) et peut tout faire (de préférence quelque chose de simple comme un bonjour).

L'utilisation d'astuces non évidentes est encouragée.

Exemple ennuyeux en C:

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

int main(){}

Points bonus s'il peut être "expliqué" pourquoi la taille de l'exécutable ne peut pas être réduite (c'est-à-dire que tous les ballonnements sont en fait utilisés d'une manière ou d'une autre).

Vi.
la source
7
Liez statiquement TOUTES les bibliothèques!
marinus
C'est pourquoi initialement pensé à 10+ Mio, mais révisé à 100+ ... Ou cela signifie-t-il toutes les bibliothèques du système?
Vi.
Un fichier HTML peut-il être considéré comme un exécutable?
xem
Peu probable.󠀠󠀠󠀠
Vi.
Cela pourrait rester d'actualité si le critère gagnant était changé en "plus grand fichier de sortie" ou quelque chose, mais cela invaliderait les réponses actuelles et en ferait un doublon d'au moins un autre défi. Voir l'état du tag de concours de popularité
chat

Réponses:

13

OK, voici un autre en C, pour les points bonus vaguement définis:

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

Fondamentalement, au moment de la compilation, il crée une séquence ascendante d'entiers de 0 à 2 25 - 1. Au moment de l'exécution, il vérifie que la séquence contient bien les valeurs attendues, et sinon, renvoie un code d'erreur non nul.

Ps. Si j'ai bien fait mes calculs, l'exécutable devrait dépasser 100 Mo. Je vous ferai connaître la taille exacte une fois la compilation terminée ...

Ilmari Karonen
la source
1
Ps. Mes tentatives pour vérifier la taille réelle ont été (si tout va temporairement) contrecarrés par ce que je soupçonne d'être un message d'erreur GCC plutôt inhabituelle: virtual memory exhausted: Cannot allocate memory. o_O va essayer de modifier les options pour voir si je peux le faire compiler d'une manière ou d'une autre.
Ilmari Karonen
Ne peut pas non plus construire avec clang(ICE) et tcc.
Vi.
1
Désactivez toutes les optimisations ( -O0) pour minimiser les demandes du compilateur, et l'activation de pipes ( -pipe) peut ou peut ne pas aider.
dmckee
3
Ce problème de compilation rappelle une entrée gagnante d'IOCCC qui écrit son propre préprocesseur pour vérifier que le programme était correct: ioccc.org/2004/vik2.hint
Christian Semrau
6

C #

Je ne sais pas si cela peut être considéré comme court, car le code source a fini par être> 30k :)

C'est à dire - trop gros pour citer. En voici une version légèrement raccourcie

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

Le code que j'ai compilé se trouve ici: http://pastebin.com/R5T3e3J0

Cela créera un fichier .EXE de ~ 45 Ko lorsqu'il est compilé sans optimisation. Compilez-le à nouveau avec Ngen.exe (Native Image Generator) et cela devient un énorme 104 Mo!

Cela fonctionne en raison du fonctionnement du système de type générique CLR. Chaque liste <> dans le code ci-dessus générera une nouvelle déclaration de type (normalement via la compilation JIT, mais Ngen effectue la compilation AOT). Donc, un type pour List <int>, un autre pour List <List <int>>, etc. Ainsi, pour ce code, un total de 5160 listes génériques différentes seront créées.

Christian Palmstierna
la source
1
Vous avez besoin d'un script pour écrire votre programme.
hildred
Il est assez trivial de réduire la taille du programme (en supprimant les niveaux d'imbrication de List). Peut-il être fait pour que vous ne puissiez pas facilement supprimer le code répétitif sans affecter la fonction du programme?
Vi.
Bien sûr, vous pouvez simplement supprimer l'imbrication, mais de même, dans l'exemple C, vous pouvez simplement supprimer quelques # définitions et rendre le programme plus petit. La façon dont j'ai interprété l'exigence selon laquelle il ne peut pas être réduit en taille, c'est qu'il ne peut pas être optimisé. Si vous êtes autorisé à simplement modifier le code source, je ne vois pas vraiment le point. :)
Christian Palmstierna
1
Bien qu'il convient de noter que cela peut probablement être optimisé, car la variable a n'est jamais utilisée.
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 
       . 

Un peu de connaissances peut être dangereux.

Il peut être plus rapide de faire une grande comparaison que de nombreuses petites comparaisons; Enterprise COBOL d'IBM (jusqu'à la version 4.2) peut avoir un STOCKAGE DE TRAVAIL maximum de 128 Mo (la version 5.0 peut avoir 2 Go); LOCAL-STORAGE offre 128 Mo supplémentaires si vous avez besoin de plus d'espace.

La tâche consiste à confirmer qu'un élément de stockage de 1 584 octets a la valeur "BONJOUR MONDE!" quelque part, et le reste est l'espace.

Le programmeur fictif décide d'écrire un sous-programme pour cela (juste au cas où cela serait nécessaire ailleurs) et d'inclure sa technique performante (bonus).

Le programmeur calcule que 11584 * 11584 est de 128 Mo. Il utilise donc WORKING-STORAGE pour une énorme table et LOCAL-STORAGE pour tout le reste.

Le programmeur le code et se sourit sciemment lorsque la compilation est propre. Ils avaient raison sur les 128 Mo.

Teste le code. Ça marche. Peut-être un peu lent, mais il y a une lourde charge sur la machine. Sourit à nouveau, pensant à quel point ce serait lent s'il était codé sans leur niveau de connaissance experte.

Le WORKING-STORAGE est de 134 189 056 octets, et il y a aussi quelques octets d'autres choses. Devrait être assez grand.

La réalité est que faire une comparaison longue au lieu d'une comparaison courte, comme mis en œuvre ici, est un moyen très lent de le faire.

Encore plus lent, le LOCAL-STORAGE, qui est initialisé par des routines d'exécution à chaque appel d'un sous-programme, entraîne la configuration de 128 Mo pour chaque CALL.

Le programmeur avait tout simplement tort sur la taille de la table, il y a assez de place sans utiliser LOCAL-STORAGE. Les comparaisons longues peuvent battre les comparaisons courtes, mais uniquement lorsque le nombre réel de comparaisons est réduit.

J'ai envisagé d'échanger LOCAL-STORAGE et WORKING-STORAGE, il est beaucoup moins probable que quelqu'un le coderait de cette façon, donc je ne l'ai pas fait. Mettre un ESPACE DE VALEUR sur la table (s'il avait été en LOCAL-STORAGE) aurait initié la table deux fois à chaque APPEL, donc encore plus lentement.

Le Bloat ne peut pas être supprimé sans réécrire le programme. La plupart du code est mauvais, bien qu'il existe une technique utile.

Ce n'est pas un exemple réel, mais je peux imaginer quelqu'un le faire, si cette personne est assez intelligente :-)

La compilation n'est pas un problème du tout. L'exécuter avec toutes les possibilités s'avère rapidement inutile.

Bien sûr, il y a aussi un vieux bug. Très courant dans les tâches de "recherche".

Bill Woodger
la source
0

PowerBASIC

#BLOAT(104857600)
FUNCTION PBMAIN
  PRINT "Hello World"
  BEEP
END FUNCTION
Juan Sebastian Lozano
la source
C'est comparable à l'exemple C de la question.
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'annotation spécialisée crée une nouvelle classe pour chaque type afin d'empêcher la boxe lorsque les types finissent tous par être transformés en objets. Il créera 10 ^ 8 ((se Everythingcompose de 10 types) ^ (8 paramètres de type sur la classe)) des fichiers de classe, chacun 300-500 octets, s'il ne plante pas en premier.


Cela pourrait s'expliquer en disant que les performances sont importantes, surtout si la classe a fait plus que d'avoir une méthode à imprimer. L'utilisation de méthodes génériques spécialisées au lieu de tout mettre dans la déclaration rendrait également plus difficile de remarquer

user60561
la source
De quelle version de scala ai-je besoin pour le construire? 2.9.2 + dfsg-1 n'aime pas "quoi que ce soit" et ne connaît pas scala.Specializable.
Vi.
Scala 2.10 inclut les chaînes interpolées avec s "", mais vous pouvez supprimer cette chaîne sans aucun effet sur la taille. Scala 2.8 a la fonctionnalité de spécialisation, donc si vous supprimez la chaîne interpolée, tout devrait fonctionner correctement.
user60561
-2

Javascript

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

Exécutez ce code dans la console du navigateur sur cette page et, une fois terminé, enregistrez la page. cela devrait entraîner une taille de fichier supérieure à 100 Mo. Toujours en test. Publiera la taille réelle une fois terminée.

update-
la page enregistrée est le résultat exécutable. Le moteur v8 de chrome est le compilateur. Et le code que j'ai affiché est le programme. j'avoue que cela prend un peu de temps à compiler. :RÉ

rahulroy9202
la source
1
Ne fonctionne pas comme requis. La tâche consiste à créer un fichier exécutable qui est beaucoup trop volumineux, pas un fichier qui consomme beaucoup trop de mémoire lors de l'exécution. Aussi, surutilisation de jQuery.
John Dvorak
@JanDvorak crée un fichier HTML d'une taille supérieure à 100 Mo. De plus, la question ne spécifie aucune limitation d'utilisation de JQuery. Le programme est toujours en cours d'exécution sur mon Chrome et la page consomme 300 Mo de mémoire, comme indiqué par le Gestionnaire des tâches de Chrome.
rahulroy9202
Ce ne sera pas le cas. Chaque ajout que vous faites se produit uniquement en mémoire. Il ne crée un fichier HTML de 100 Mo que si l'utilisateur déclenche une opération de sauvegarde. Ce qu'il pourrait ne pas être capable de faire, ni vouloir. De plus, même si vous appelez ce processus d'ajout de "compilation" et que vous parvenez à stocker le code HTML résultant sous forme de fichier, je ne pense pas que vous soyez autorisé à écrire votre propre compilateur.
John Dvorak
@JanDvorak J'ai indiqué dans la réponse que la page doit être enregistrée. ici, la page est le résultat exécutable. Le moteur v8 de chrome est le compilateur. Et le code que j'ai affiché est le programme.
rahulroy9202
2
V8 est un compilateur qui produit un minuscule "exécutable" (qui ne le met jamais sur le disque dur) et l'exécute, qui procède ensuite à la génération d'un énorme "fichier source" (dans un langage qui n'est même pas compilé, ni langage de programmation). Si vous appelez le résultat de votre script un exécutable (non ...) alors nous devons appeler votre script le compilateur, pas V8. Ce n'est pas appelé compilation si votre script est exécuté dans le processus (les macros brouillent un peu cette ligne, mais ce n'est pas une macro)
John Dvorak