Konkurs Bloatware: wyprodukowanie ponad 100 plików wykonywalnych MiB [zamknięte]

22

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).

Vi.
źródło
7
Łącz statycznie WSZYSTKIE biblioteki!
marinus,
Właśnie dlatego początkowo myślałem o 10+ MiB, ale zmieniono na 100+ ... Czy to oznacza wszystkie biblioteki w systemie?
Vi.
Czy plik HTML można uznać za plik wykonywalny?
xem.
Mało prawdopodobne. 󠀠󠀠󠀠
Vi.
To może pozostać na temat, jeśli kryterium zwycięstwa zostanie zmienione na „największy plik wyjściowy” lub coś takiego, ale to unieważni obecne odpowiedzi i uczyni z tego duplikat co najmniej jednego innego wyzwania. Zobacz stan tagu popularności konkursu
kot

Odpowiedzi:

13

OK, oto kolejny w C, szukający niejasnych punktów bonusowych:

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

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 ...

Ilmari Karonen
źródło
1
Ps. Moje próby w celu zweryfikowania rzeczywistego rozmiaru zostały (mam nadzieję chwilowo) napiętnowany przez co podejrzewam być dość nietypowy komunikat GCC: virtual memory exhausted: Cannot allocate memory. o_O Spróbuję ulepszyć opcje, aby zobaczyć, czy uda mi się to jakoś skompilować.
Ilmari Karonen,
12
Aww, właśnie wyobrażałem sobie, jak stoisz na toczącym się krześle i walczysz mieczem z innym deweloperem .
Iszi
Nie można również budować za pomocą clang(ICE) i tcc.
Vi.
1
Wyłącz wszystkie optymalizacje ( -O0), aby zminimalizować wymagania kompilatora, a włączenie potoków ( -pipe) może, ale nie musi, pomóc.
dmckee,
3
Ten problem kompilacji przypomina zwycięski wpis IOCCC, który pisze swój własny preprocesor, aby sprawdzić, czy program jest poprawny: ioccc.org/2004/vik2.hint
Christian Semrau
6

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

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

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.

Christian Palmstierna
źródło
1
Potrzebujesz skryptu, który napisze Twój program.
hildred
Zmniejszenie rozmiaru programu (przez usunięcie poziomów zagnieżdżenia listy) jest raczej trywialne. Czy można to zrobić tak, aby nie można było łatwo usunąć powtarzającego się kodu bez wpływu na funkcję programu?
Vi.
Oczywiście możesz po prostu usunąć zagnieżdżenie, ale również w przykładzie C możesz po prostu usunąć kilka #definii i zmniejszyć program. Sposób, w jaki zinterpretowałem wymóg, że nie można go zmniejszyć, polegał na tym, że nie można go zoptymalizować. Jeśli możesz modyfikować kod źródłowy, nie rozumiem o co chodzi. :)
Christian Palmstierna
1
Chociaż należy zauważyć, że można to prawdopodobnie zoptymalizować, ponieważ zmienna a nigdy nie jest używana.
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 
       . 

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”.

Bill Woodger
źródło
0

PowerBASIC

#BLOAT(104857600)
FUNCTION PBMAIN
  PRINT "Hello World"
  BEEP
END FUNCTION
Juan Sebastian Lozano
źródło
Jest to porównywalne z przykładem C w pytaniu.
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)
}

Specjalna adnotacja tworzy nową klasę dla każdego typu, aby zapobiec boksowaniu, gdy typy ostatecznie zostaną przekształcone w obiekty. Stworzy 10 ^ 8 (( Everythingskł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

użytkownik60561
źródło
Którą wersję Scala potrzebuję, aby to zbudować? 2.9.2 + dfsg-1 nie lubi „cokolwiek” i nie wie o scala.
Vi.
Scala 2.10 zawiera interpolowane ciągi znaków z „”, ale możesz usunąć ten ciąg bez żadnego wpływu na rozmiar. Scala 2.8 ma funkcję specjalizacji, więc jeśli usuniesz interpolowany ciąg znaków, wszystko powinno działać poprawnie.
user60561,
-2

JavaScript

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

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

rahulroy9202
źródło
1
Nie działa zgodnie z wymaganiami. Zadanie polega na utworzeniu pliku wykonywalnego, który jest o wiele za duży, a nie za bardzo zajmujący zbyt dużo pamięci podczas uruchamiania. Nadużywanie jQuery.
John Dvorak
@JanDvorak utworzy plik HTML o rozmiarze większym niż 100 MB. Pytanie również nie określa żadnych ograniczeń użycia JQuery. Program nadal działa na moim Chrome, a strona zużywa 300 MB pamięci, jak zgłosił Menedżer zadań Chrome.
rahulroy9202
Nie będzie. Każdy dodatek, który robisz, dzieje się wyłącznie w pamięci. Utworzy plik HTML 100 MB tylko wtedy, gdy użytkownik uruchomi operację zapisu. Co może nie być w stanie zrobić ani nie chcieć. Ponadto, nawet jeśli nazwiesz ten proces dodawania „kompilacji” i uda ci się zapisać wynikowy kod HTML jako plik, nie sądzę, że możesz pisać własny kompilator.
John Dvorak
@JanDvorak W odpowiedzi wskazałem, że strona musi zostać zapisana. tutaj strona jest wykonywalnym wynikiem. Silnik v8 chrome jest kompilatorem. A kod, który opublikowałem, to program.
rahulroy9202
2
V8 to kompilator, który produkuje mały „plik wykonywalny” (który nigdy nie przenosi go na dysk twardy) i wykonuje go, a następnie generuje ogromny „plik źródłowy” (w języku, który nawet nie jest skompilowany, ani język programowania). Jeśli nazwiesz wynik skryptu plikiem wykonywalnym (nie ...), wówczas musimy nazwać Twój skrypt kompilatorem, a nie V8. Nie jest to nazywane kompilacją, jeśli skrypt zostanie wykonany w trakcie procesu (makra trochę rozmazują tę linię, ale to nie jest makro)
John Dvorak