Utwórz krótki kod źródłowy w swoim ulubionym skompilowanym języku, który skompiluje się w duży plik wykonywalny (nie mniej niż 104857600 bajtów). Program musi być uruchamialny (przy założeniu 1 GB wolnej pamięci) i może robić wszystko (najlepiej coś prostego, jak na przykład hello world).
Zalecane jest stosowanie nieoczywistych sztuczek.
Nudny przykład w C:
int a[1024*1024*25] = { 1 };
int main(){}
Punkty bonusowe, jeśli można je „wyjaśnić”, dlaczego rozmiar pliku wykonywalnego nie może zostać zmniejszony (tzn. Wszystkie wzdęcia są w jakiś sposób wykorzystywane).
Odpowiedzi:
OK, oto kolejny w C, szukający niejasnych punktów bonusowych:
Zasadniczo w czasie kompilacji buduje rosnącą sekwencję liczb całkowitych od 0 do 2 25 - 1. W czasie wykonywania sprawdza, czy sekwencja rzeczywiście zawiera oczekiwane wartości, a jeśli nie, zwraca niezerowy kod błędu.
Ps. Jeśli poprawnie wykonałem matematykę, plik wykonywalny powinien mieć ponad 100 MB. Dam ci znać dokładny rozmiar po zakończeniu kompilacji ...
źródło
virtual memory exhausted: Cannot allocate memory
. o_O Spróbuję ulepszyć opcje, aby zobaczyć, czy uda mi się to jakoś skompilować.clang
(ICE) itcc
.-O0
), aby zminimalizować wymagania kompilatora, a włączenie potoków (-pipe
) może, ale nie musi, pomóc.DO#
Nie jestem pewien, czy to się kwalifikuje jako krótkie, ponieważ kod źródłowy skończył się na> 30k :)
Tj. - za duży, by go zacytować. Oto nieco skrócona wersja
Kod, który faktycznie skompilowałem, można znaleźć tutaj: http://pastebin.com/R5T3e3J0
Spowoduje to utworzenie pliku .EXE o wielkości ~ 45 KB po skompilowaniu bez optymalizacji. Skompiluj go ponownie za pomocą Ngen.exe (Native Image Generator) i stanie się niesamowitą 104MiB!
Działa to ze względu na sposób działania systemu ogólnego typu CLR. Każda lista <> w powyższym kodzie wygeneruje nową deklarację typu (zwykle poprzez kompilację JIT, ale Ngen wykonuje kompilację AOT). Więc jeden typ dla Listy <int>, inny dla Listy <List <int>> i tak dalej. Tak więc dla tego kodu utworzonych zostanie łącznie 5160 różnych list ogólnych.
źródło
COBOL
Trochę wiedzy może być niebezpieczną rzeczą.
Szybsze może być wykonanie jednego dużego porównania niż wielu małych porównań; IBM COBOL dla przedsiębiorstw (do wersji 4.2) może mieć maksymalny czas przechowywania 128 MB (wersja 5.0 może mieć 2 GB); LOKALNE PRZECHOWYWANIE oferuje dodatkowe 128 MB, jeśli potrzebujesz więcej miejsca.
Zadanie polega na potwierdzeniu, że 11584-bajtowy element pamięci ma wartość „CZEŚĆ ŚWIATA!”. gdzieś, a reszta to przestrzeń.
Fikcyjny programista postanawia napisać w tym celu podprogram (na wypadek, gdyby był potrzebny gdzie indziej) i uwzględnić jego wysokowydajną technikę (premia).
Programista oblicza, że 11584 * 11584 ma 128 MB, więc używa WORKING-STORAGE dla ogromnego stołu i LOCAL-STORAGE dla wszystkiego, co jest potrzebne.
Programista koduje to i uśmiecha się do siebie świadomie, gdy kompilacja jest czysta. Mieli rację co do 128 MB.
Testuje kod. To działa. Być może trochę powolny, ale maszyna ma duże obciążenie. Uśmiecha się ponownie, myśląc, jak powolny byłby kod, gdyby nie posiadał poziomu wiedzy eksperckiej.
WORKING-STORAGE ma 134 189 056 bajtów, a także sporo innych bajtów. Powinien być wystarczająco duży.
Rzeczywistość jest taka, że wykonanie długiego porównania zamiast krótkiego porównania, tak jak tu zaimplementowano, jest bardzo powolnym sposobem.
Nawet wolniej, LOKALNE PRZECHOWYWANIE, które jest inicjowane przez procedury wykonawcze przy każdym wywołaniu podprogramu, powoduje skonfigurowanie całego 128 MB dla każdego POŁĄCZENIA.
Programista po prostu pomylił się co do wielkości stołu, jest wystarczająco dużo miejsca bez użycia LOCAL-STORAGE. Długie porównania mogą pokonać krótkie porównania, ale tylko wtedy, gdy faktyczna liczba porównań jest zmniejszona.
Zastanawiałem się nad zamianą LOKALNEGO PRZECHOWYWANIA i PRACY-PAMIĘCI, jest o wiele mniej prawdopodobne, że ktoś by to kodował w ten sposób, więc nie zrobiłem tego. Umieszczenie WARTOŚCIOWEJ MIEJSCA na stole (gdyby było to LOKALNE PRZECHOWYWANIE) zainicjowałoby tabelę dwa razy przy każdym POŁĄCZENIU, więc nawet wolniej.
Wzdęcia nie można usunąć bez przepisania programu. Większość kodu jest zła, choć istnieje jedna przydatna technika.
To nie jest prawdziwy przykład, ale mogę sobie wyobrazić, że ktoś to robi, jeśli jest wystarczająco sprytny :-)
Kompilacja nie stanowi żadnego problemu. Uruchamianie go z każdą możliwością szybko okazuje się nie warto próbować.
Oczywiście jest też zwykły stary Bug. Bardzo powszechny w zadaniach „wyszukiwania”.
źródło
PowerBASIC
źródło
Scala
Specjalna adnotacja tworzy nową klasę dla każdego typu, aby zapobiec boksowaniu, gdy typy ostatecznie zostaną przekształcone w obiekty. Stworzy 10 ^ 8 ((
Everything
składa się z 10 typów) ^ (8 parametrów typu w klasie)) plików klas, każdy 300-500 bajtów, jeśli nie ulegnie awarii.Można to wytłumaczyć stwierdzeniem, że wydajność jest ważna, zwłaszcza jeśli klasa rzeczywiście zrobiła więcej niż tylko metodę drukowania. Zastosowanie ogólnych specjalistycznych metod zamiast umieszczania tego wszystkiego w deklaracji utrudniłoby również zauważenie
źródło
JavaScript
Uruchom ten kod w konsoli przeglądarki na tej stronie, a po zakończeniu zapisz stronę. powinien mieć rozmiar pliku większy niż 100 MB. Wciąż testuję. Po zakończeniu opublikuje rzeczywisty rozmiar.
update
zapisana strona jest wykonywalny wynik. Silnik v8 chrome jest kompilatorem. A kod, który opublikowałem, to program. Przyznaję, że skompilowanie zajmuje dużo czasu. :RE
źródło