Concurso Bloatware: produzindo mais de 100 executáveis ​​MiB [fechado]


22

Crie um código-fonte curto no seu idioma compilado favorito, compilado em um arquivo executável grande (não inferior a 104857600 bytes). O programa deve ser executável (assumindo 1 GB de memória livre) e pode fazer qualquer coisa (de preferência algo simples como um olá mundo).

O uso de truques não óbvios é incentivado.

Exemplo chato em C:

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

int main(){}

Pontos de bônus se puder ser "explicado" por que o executável não pode ser reduzido em tamanho (ou seja, todo o inchaço é realmente usado de alguma forma).


7
Vincular estaticamente TODAS as bibliotecas!
Marinus

É por isso que inicialmente pensei em 10+ MiB, mas revisado para 100 + ... Ou significa todas as bibliotecas do sistema?
Vi.

Um arquivo HTML pode ser considerado como um executável?
xem

Improvável.󠀠󠀠󠀠
Vi.

Isso poderia permanecer no tópico se o critério vencedor fosse alterado para "maior arquivo de saída" ou algo assim, mas isso invalidaria as respostas atuais e tornaria isso uma duplicata de pelo menos um outro desafio. Veja o estado da tag do concurso de popularidade
cat

Respostas:


13

OK, aqui está outro em C, buscando os pontos de bônus 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;}

Basicamente, no tempo de compilação, ele cria uma sequência crescente de números inteiros de 0 a 2 25 - 1. No tempo de execução, verifica se a sequência realmente contém os valores esperados e, se não, retorna um código de erro diferente de zero.

Ps. Se eu fiz minhas contas corretamente, o executável deve ter mais de 100 MiB. Avisarei o tamanho exato assim que terminar de compilar ...


1
Ps. Minhas tentativas para verificar o tamanho real ter sido (espero temporariamente) frustrados pelo que eu suspeito ser uma mensagem de erro GCC bastante incomum: virtual memory exhausted: Cannot allocate memory. o_O Tentarei ajustar as opções para ver se consigo compilar de alguma forma.
Ilmari Karonen


Também não pode construir com clang(ICE) e tcc.
Vi.

1
Desative toda a otimização ( -O0) para minimizar as demandas do compilador, e habilitar pipes ( -pipe) pode ou não ajudar.
dmckee

3
Esse problema compilando lembra de um vencedor de IOCCC que escrever o seu próprio pré-processador para verificar que o programa estava correta: ioccc.org/2004/vik2.hint
Christian Semrau

6

C #

Não tenho certeza se isso é qualificado como curto, porque o código-fonte acabou sendo> 30k :)

Ou seja, grande demais para citar. Aqui está uma versão ligeiramente reduzida

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

O código que eu realmente compilei pode ser encontrado aqui: http://pastebin.com/R5T3e3J0

Isso criará um arquivo .EXE de ~ 45KiB quando compilado sem otimizações. Compile-o novamente com o Ngen.exe (Native Image Generator) e ele se tornará um 104MiB!

Isso funciona devido ao funcionamento do sistema de tipo genérico CLR. Cada lista <> no código acima irá gerar uma nova declaração de tipo (normalmente através da compilação JIT, mas o Ngen executa a compilação AOT). Portanto, um tipo para Lista <int>, outro para Lista <Lista <int>> e assim por diante. Portanto, para esse código, um total de 5160 listas genéricas diferentes será criado.


1
O que você precisa é de um script que escreva seu programa.
Hildred

É bastante trivial reduzir o tamanho do programa (removendo os níveis de aninhamento da Lista). Isso pode ser feito para que você não possa remover facilmente o código repetido sem afetar a função do programa?
Vi.

Bem, é claro que você pode remover o aninhamento, mas da mesma forma, no exemplo C, você pode remover alguns #defines e diminuir o programa. A maneira como interpretei o requisito de que não pode ser reduzido em tamanho é que não pode ser otimizada. Se você tem permissão para modificar apenas o código-fonte, não entendo bem o ponto. :)
Christian Palmstierna

1
Embora se deva notar que isso provavelmente pode ser otimizado, uma vez que a variável a nunca é usada.
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 
       . 

Um pouco de conhecimento pode ser uma coisa perigosa.

Pode ser mais rápido fazer uma comparação grande do que muitas pequenas comparações; O Enterprise COBOL da IBM (até a versão 4.2) pode ter um ARMAZENAMENTO DE TRABALHO máximo de 128 MB (a versão 5.0 pode ter 2 GB); O ARMAZENAMENTO LOCAL oferece mais 128 MB se você precisar de mais espaço.

A tarefa é confirmar que um pedaço de armazenamento de 11584 bytes tenha o valor "OLÁ! MUNDO!" em algum lugar, e o resto é espaço.

O programador, fictício, decide escrever um subprograma para isso (apenas no caso de ser necessário em outro lugar) e incluir sua técnica de alto desempenho (bônus).

O programador calcula que 11584 * 11584 tem 128 MB, portanto usa WORKING-STORAGE para uma tabela enorme e LOCAL-STORAGE para tudo o que for necessário.

O programador codifica e sorri conscientemente para si mesmo quando a compilação está limpa. Eles estavam certos quanto aos 128MB.

Testa o código. Funciona. Possivelmente um pouco lento, mas há uma carga pesada na máquina. Sorri novamente, pensando em quão lento seria se codificado sem o nível de conhecimento especializado deles.

O ARMAZENAMENTO DE TRABALHO chega a 134.189.056 bytes, e também existem alguns bytes de outras coisas. Deve ser grande o suficiente.

A realidade é que fazer uma comparação longa em vez de uma comparação curta, conforme implementado aqui, é uma maneira muito lenta de fazê-lo.

Ainda mais lento, o LOCAL-STORAGE, que é inicializado por rotinas de tempo de execução toda vez que um subprograma é chamado, faz com que todos os 128MB sejam configurados para cada CHAMADA.

O programador estava completamente errado sobre o tamanho da tabela, há espaço suficiente sem usar LOCAL-STORAGE. As comparações longas podem superar as comparações curtas, mas apenas quando o número real de comparações é reduzido.

Eu considerei trocar o LOCAL-STORAGE e o WORKING-STORAGE, é muito menos provável que alguém o codifique dessa maneira, então não o fiz. Colocar um VALUE SPACE na mesa (se estivesse em LOCAL-STORAGE) teria iniciado a tabela duas vezes em cada CHAMADA, de forma ainda mais lenta.

O Bloat não pode ser removido sem reescrever o programa. A maior parte do código é ruim, embora exista uma técnica útil.

Este não é um exemplo da vida real, mas posso imaginar alguém fazendo isso, se alguém for inteligente o suficiente :-)

Compilar não é problema. Executá-lo com todas as possibilidades rapidamente prova que não vale a pena tentar.

Obviamente, também existe um velho bug comum. Muito comum em tarefas de "pesquisa".


0

PowerBASIC

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

É comparável ao exemplo C da pergunta.
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)
}

A anotação especializada cria uma nova classe para cada tipo, a fim de impedir o encaixotamento quando todos os tipos acabarem sendo transformados em objetos. Ele criará 10 ^ 8 (( Everythingconsiste em 10 tipos) ^ (8 parâmetros de tipo na classe)) arquivos de classe, cada 300-500 bytes, se não travar primeiro.


Isso pode ser explicado dizendo que o desempenho é importante, especialmente se a classe realmente fez mais do que ter um método para imprimir. Usar métodos especializados genéricos em vez de colocar tudo na declaração também tornaria mais difícil perceber


Qual versão do scala eu preciso para criar isso? 2.9.2 + O dfsg-1 não gosta de s "tanto faz" e não sabe sobre scala.Specializable.
Vi.

O Scala 2.10 inclui as seqüências interpoladas com s "", mas você pode remover essa sequência sem afetar o tamanho. O Scala 2.8 possui o recurso de especialização, portanto, se você remover a sequência interpolada, tudo deverá funcionar bem.
user60561

-2

Javascript

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

Execute esse código no Console do navegador nesta página e, quando concluído, salve a página. deve resultar em um tamanho de arquivo maior que 100 MB. Ainda testando. Será publicado o tamanho real, uma vez feito.

update-
a página salva é o resultado executável. O mecanismo v8 do chrome é o compilador. E o código que publiquei é o programa. admito que demora muito para compilar. : D


1
Não funciona conforme necessário. A tarefa é criar um arquivo executável muito grande, não um que consuma muita memória quando executado. Além disso, uso excessivo de jQuery.
John Dvorak

O @JanDvorak criará um arquivo HTML com tamanho superior a 100 MB. Além disso, a pergunta não especifica nenhuma limitação de uso do JQuery. O programa ainda está em execução no meu Chrome e a página está consumindo 300mb de memória, conforme relatado pelo Gerenciador de Tarefas do Chrome.
rahulroy9202

Não vai. Cada anexo que você faz acontece puramente na memória. Ele criará apenas um arquivo HTML de 100 MB se o usuário acionar uma operação de salvamento. O que ele pode não ser capaz de fazer, nem querer. Além disso, mesmo se você chamar esse processo de anexar "compilação" e conseguir armazenar o HTML resultante como um arquivo, acho que você não poderá escrever seu próprio compilador.
John Dvorak

@JanDvorak Apontei na resposta que a página deve ser salva. aqui, a página é o resultado executável. O mecanismo v8 do chrome é o compilador. E o código que publiquei é o programa.
rahulroy9202

2
O V8 é um compilador que produz um pequeno "executável" (que nunca o leva ao disco rígido) e o executa, o que prossegue para gerar um enorme "arquivo de origem" (em um idioma que nem é compilado nem um linguagem de programação). Se você chamar o resultado de seu script de executável (não ...), devemos chamar seu script de compilador, não de V8. Não é chamado de compilação se o seu script for executado no processo (as macros meio que desfocam essa linha, mas isso não é uma macro)
John Dvorak
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.