Concurso de bloatware: producción de más de 100 ejecutables de MiB [cerrado]

22

Cree un código fuente corto en su idioma compilado favorito que compile en un archivo ejecutable grande (no menor a 104857600 bytes). El programa debe ser ejecutable (suponiendo 1 GB de memoria libre) y puede hacer cualquier cosa (preferiblemente algo simple como un mundo hola).

Se recomienda el uso de trucos no obvios.

Ejemplo aburrido en C:

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

int main(){}

Puntos de bonificación si se puede "explicar" por qué el ejecutable no se puede reducir de tamaño (es decir, toda la hinchazón se usa de alguna manera).

Vi.
fuente
77
¡Enlace estáticamente TODAS las bibliotecas!
marinus
Es por eso que inicialmente pensé en 10+ MiB, pero revisé a 100+ ... ¿O significa todas las bibliotecas del sistema?
Vi.
¿Se puede considerar un archivo HTML como un ejecutable?
xem
Improbable.󠀠󠀠󠀠
Vi.
Esto podría permanecer en el tema si el criterio ganador se cambiara al "archivo de salida más grande" o algo así, pero eso invalidaría las respuestas actuales y haría de esto un duplicado de al menos otro desafío. Ver El estado de la etiqueta del concurso de popularidad
gato

Respuestas:

13

OK, aquí hay otro en C, que va por los puntos de bonificación vagamente definidos:

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

Básicamente, en tiempo de compilación, construye una secuencia ascendente de enteros de 0 a 2 25 - 1. En tiempo de ejecución, verifica que la secuencia realmente contiene los valores esperados y, si no, devuelve un código de error distinto de cero.

PD. Si hice mis cálculos correctamente, el ejecutable debería tener más de 100 MiB. Te dejaré saber el tamaño exacto una vez que haya terminado de compilar ...

Ilmari Karonen
fuente
1
PD. Mis intentos de verificar el tamaño real han sido (esperemos que temporalmente) bloqueado por lo que sospecho que ser un mensaje de error GCC bastante inusual: virtual memory exhausted: Cannot allocate memory. o_O Intentaré ajustar las opciones para ver si puedo hacer que se compile de alguna manera.
Ilmari Karonen
Tampoco se puede construir con clang(ICE) y tcc.
Vi.
1
Desactive toda la optimización ( -O0) para minimizar las demandas del compilador, y habilitar las tuberías ( -pipe) podría o no ayudar.
dmckee
3
Ese problema de compilación recuerda una entrada ganadora de IOCCC que escribe su propio preprocesador para verificar que el programa era correcto: ioccc.org/2004/vik2.hint
Christian Semrau
6

DO#

No estoy seguro si esto califica como corto, porque el código fuente terminó siendo> 30k :)

Es decir, demasiado grande para citarlo. Aquí hay una versión un poco más corta

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

El código que realmente compilé se puede encontrar aquí: http://pastebin.com/R5T3e3J0

Esto creará un archivo .EXE de ~ 45 KB cuando se compila sin optimizaciones. Compílalo de nuevo con Ngen.exe (Native Image Generator) y se convierte en un enorme 104MiB.

Esto funciona debido a cómo funciona el sistema de tipo genérico CLR. Todas y cada una de las listas <> en el código anterior generarán una nueva declaración de tipo (normalmente a través de la compilación JIT, pero Ngen realiza la compilación AOT). Entonces, un tipo para List <int>, otro para List <List <int>>, y así sucesivamente. Entonces, para este código, se creará un total de 5160 listas genéricas diferentes.

Christian Palmstierna
fuente
1
Lo que necesita es un script que escriba su programa.
hildred
Es bastante trivial reducir el tamaño del programa (eliminando los niveles de anidamiento de la Lista). ¿Se puede hacer para que no pueda eliminar fácilmente el código que se repite sin afectar la función del programa?
Vi.
Bueno, por supuesto, puede eliminar la anidación, pero del mismo modo, en el ejemplo de C, podría eliminar algunas #defines y hacer que el programa sea más pequeño. La forma en que interpreté el requisito de que no se puede reducir de tamaño es que no se puede optimizar. Si se le permite modificar el código fuente, no veo el punto. :)
Christian Palmstierna
1
Aunque debe tenerse en cuenta que esto probablemente se puede optimizar, ya que la variable a nunca se usa.
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 poco de conocimiento puede ser algo peligroso.

Puede ser más rápido hacer una comparación grande que muchas comparaciones pequeñas; Enterprise COBOL de IBM (hasta la Versión 4.2) puede tener un ALMACENAMIENTO DE TRABAJO máximo de 128 MB (la Versión 5.0 puede tener 2 GB); ALMACENAMIENTO LOCAL ofrece otros 128 MB si necesita más espacio.

La tarea es confirmar que una pieza de almacenamiento de 11584 bytes tenga el valor "¡HOLA MUNDO!" en algún lugar, y el resto es espacio.

El programador ficticio decide escribir un subprograma para esto (en caso de que sea necesario en otro lugar) e incluir su técnica de alto rendimiento (bonificación).

El programador calcula que 11584 * 11584 es 128 MB, por lo que utiliza WORKING-STORAGE para una tabla enorme y LOCAL-STORAGE para todo lo demás que se necesita.

El programador lo codifica y sonríe conscientemente cuando la compilación está limpia. Tenían razón sobre los 128 MB.

Prueba el código. Funciona. Posiblemente un poco lento, pero hay una gran carga en la máquina. Sonríe de nuevo, pensando lo lento que sería si se codificara sin su nivel de conocimiento experto.

El ALMACENAMIENTO DE TRABAJO viene en 134,189,056 bytes, y también hay unos pocos bytes de otras cosas. Debería ser lo suficientemente grande.

La realidad es que hacer una comparación larga en lugar de una comparación corta, como se implementa aquí, es una forma muy lenta de hacerlo.

Aún más lento, el ALMACENAMIENTO LOCAL, que se inicializa mediante rutinas de tiempo de ejecución cada vez que se llama a un subprograma, hace que se configuren los 128 MB completos para cada LLAMADA.

El programador simplemente estaba equivocado sobre el tamaño de la tabla, hay suficiente espacio sin usar ALMACENAMIENTO LOCAL. Las comparaciones largas pueden superar las comparaciones cortas, pero solo cuando se reduce el número real de comparaciones.

Pensé en cambiar el ALMACENAMIENTO LOCAL y el ALMACENAMIENTO DE TRABAJO, es mucho menos probable que alguien lo codifique de esa manera, así que no lo hice. Poner un ESPACIO DE VALOR en la mesa (si hubiera estado en ALMACENAMIENTO LOCAL) habría inicializado la mesa dos veces en cada LLAMADA, por lo que aún más lento.

La hinchazón no se puede eliminar sin reescribir el programa. La mayor parte del código es malo, aunque hay una técnica útil.

Este no es un ejemplo de la vida real, pero puedo imaginar a alguien haciéndolo, si ese alguien es lo suficientemente inteligente :-)

Compilar no es un problema en absoluto. Ejecutarlo con todas las posibilidades rápidamente demuestra que no vale la pena intentarlo.

Por supuesto, también hay un viejo error simple. Una muy común en tareas de "búsqueda".

Bill Woodger
fuente
0

PowerBASIC

#BLOAT(104857600)
FUNCTION PBMAIN
  PRINT "Hello World"
  BEEP
END FUNCTION
Juan sebastian lozano
fuente
Es comparable al ejemplo de C en la pregunta.
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)
}

La anotación especializada crea una nueva clase para cada tipo con el fin de evitar el boxeo cuando los tipos eventualmente se convierten en objetos. Creará 10 ^ 8 (( Everythingconsta de 10 tipos) ^ (8 parámetros de tipo en la clase)) archivos de clase, cada uno de 300-500 bytes, si no se bloquea primero.


Esto podría explicarse diciendo que el rendimiento es importante, especialmente si la clase realmente hizo más que un método para imprimir. El uso de métodos genéricos especializados en lugar de incluirlo todo en la declaración también dificultaría su atención.

usuario60561
fuente
¿Qué versión de scala necesito para construir esto? 2.9.2 + dfsg-1 no le gusta s "lo que sea" y no sabe acerca de scala. Especializable.
Vi.
Scala 2.10 incluye las cadenas interpoladas con s "", pero puede eliminar esa cadena sin ningún efecto en el tamaño. Scala 2.8 tiene la función de especialización, por lo que si elimina la cadena interpolada, todo debería funcionar bien.
user60561
-2

Javascript

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

Ejecute este código en la consola del navegador en esta página y, cuando haya terminado, guarde la página. debería dar como resultado un tamaño de archivo superior a 100 MB. Sigo probando. Publicará el tamaño real una vez hecho.

actualización:
la página guardada es el resultado ejecutable. El motor v8 de Chrome es el compilador. Y el código que publiqué es el programa. Admito que lleva mucho tiempo compilar. :RE

rahulroy9202
fuente
1
No funciona como se requiere. La tarea es crear un archivo ejecutable que sea demasiado grande, no uno que consuma demasiada memoria cuando se ejecuta. Además, el uso excesivo de jQuery.
John Dvorak
@ JanDvorak creará un archivo HTML con un tamaño superior a 100 MB. Además, la pregunta no especifica ninguna limitación de uso de JQuery. El programa todavía se está ejecutando en mi Chrome y la página está consumiendo 300 MB de memoria, según lo informado por el Administrador de tareas de Chrome.
rahulroy9202
No lo hará. Cada agregado que haces ocurre puramente en la memoria. Solo creará un archivo HTML de 100 MB si el usuario activa una operación de guardar. Lo que quizás no pueda hacer, ni querer hacer. Además, incluso si llama a este proceso de agregar "compilación" y logra almacenar el HTML resultante como un archivo, no creo que pueda escribir su propio compilador.
John Dvorak
@ JanDvorak He señalado en la respuesta que la página debe guardarse. aquí, la página es el resultado ejecutable. El motor v8 de Chrome es el compilador. Y el código que publiqué es el programa.
rahulroy9202
2
V8 es un compilador que produce un pequeño "ejecutable" (que nunca lo lleva al disco duro) y lo ejecuta, que luego genera un gran "archivo fuente" (en un lenguaje que ni siquiera está compilado, ni un lenguaje de programación). Si llama al resultado de su script un ejecutable (no ...) entonces debemos llamar a su script el compilador, no V8. No se llama compilación si su script se ejecuta en el proceso (las macros borran esa línea, pero esto no es una macro)
John Dvorak