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).
Respuestas:
OK, aquí hay otro en C, que va por los puntos de bonificación vagamente definidos:
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 ...
fuente
virtual memory exhausted: Cannot allocate memory
. o_O Intentaré ajustar las opciones para ver si puedo hacer que se compile de alguna manera.clang
(ICE) ytcc
.-O0
) para minimizar las demandas del compilador, y habilitar las tuberías (-pipe
) podría o no ayudar.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
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.
fuente
COBOL
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".
fuente
PowerBASIC
fuente
Scala
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 ((
Everything
consta 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.
fuente
Javascript
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
fuente