Ich bin Entwickler und habe keine Lust, meine Arbeit zu erledigen. Ich weiß von XKCD, dass die beste Entschuldigung dafür ist, dass Ihr Code kompiliert wird . Aus diesem Grund brauche ich wahrscheinlich Code, der für immer kompiliert werden kann! Und weil ich faul bin und nicht viel tippen möchte, muss dies mit dem kürzestmöglichen Code geschehen.
Ihre Aufgabe ist es also, ein Programm zu schreiben, das syntaktisch gültig ist, aber den Compiler dazu veranlasst, in eine Endlosschleife zu gelangen.
Spezifikationen
- Sie müssen natürlich eine Sprache verwenden, die einen Compiler hat.
- Geben Sie die in jeder Lösung verwendete Implementierung an.
- Das ist Code-Golf , also gewinnt die kürzeste gültige Lösung (in Bytes).
- Dem Compiler kann der Arbeitsspeicher oder der Stapelspeicherplatz ausgehen.
code-golf
compile-time
Esolanging Fruit
quelle
quelle
Java
: Definieren Sie einen Annotation-Prozessor (Ideone-Snippet), den Sie beim Aufrufenjavac
mit its verwenden-processor
Möglichkeit. Dadurch bleibt die Zusammenstellung einer Klasse für immer hängen.Antworten:
Japt , 2 Bytes
Sie können dies hier online testen , aber ich würde es nicht empfehlen, da es Ihren Browser einfrieren wird.
Erläuterung
Japt verwendet die Shoco-Bibliothek zum Komprimieren von Strings. Ein Backtick weist den Compiler an, alles bis zum nächsten Backtick oder bis zum Ende der Datei zu dekomprimieren. Jedes Byte hat folgende Funktionen:
00-7F
sind intakt gelassen.80-BF
jede Transformation in ein gemeinsamen aus zwei Kleinbuchstabenpaaren (at
,oo
,th
, etc.).C0-DF
Jedes verbraucht das nächste Byte und wandelt sich in eine gemeinsame Zeichenfolge mit vier Buchstaben um .E0-EF
Jedes davon verbraucht die nächsten drei Bytes und wandelt sich in eine "gemeinsame" Zeichenfolge mit acht Buchstaben um (beginnend beiWhererer
und abwärts von dort).F0-F7
Brechen Sie den Dekomprimierer, obwohl er immer noch alles bis zum Breaking-Byte zurückgibt.F8-FF
Lassen Sie den Dekomprimierer in eine Endlosschleife eintreten. Ich bin mir nicht sicher, warum das so ist, da ich mit dem inneren Ablauf der shoco-Bibliothek nicht sehr vertraut bin (und der JavaScript-Code ist völlig unlesbar ), aber in diesem Fall ist es recht praktisch.Ich glaube nicht, dass es eine andere Möglichkeit gibt, sich mit dem Japt-Compiler herumzuschlagen, aber man weiß nie ...
quelle
TikZ (pdfTeX 3.14159265-2.6-1.40.17),
857974242221 BytesDank wchargin wird eine Menge Bytes gespart
Ein Byte gespart dank Chris H.
Ich bin auf diese zufällig gestoßen, als ich an Hausaufgaben arbeitete. Ich habe eine ganze Weile darauf gewartet, dass es kompiliert wird, bevor mir klar wurde, was passierte.
Dies hat zwei Teile:
Dies lädt das TikZ-Paket
und:
Dies startet eine
\tikz
Umgebung und einen Zeichenbefehl.Was ist los
Der pdflatex-Compiler hat Probleme
\tikz\pic
und wechselt in den interaktiven Modus, wodurch er auf unbestimmte Zeit blockiert.quelle
\draw l\end {document}
Datei wurde beim Scannen mit\tikz@next.
" pdflatex 3.1415926-2.5-1.40.14 (TeX Live 2013 / Debian) beendet. tikz 13.10.2010 v2.10. Dies ist Standardapt install texlive-full
unter Ubuntu 14.04.pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016)
und es wird in der Tat auf unbestimmte Zeit wiederholt. Danke für die Tipps.\pic
anstelle von \ draw` verwenden - genau dasselbe Verhalten (getestet mit tikz 1.142)\def\a{\a}\a
(12 Bytes)? Oder, da dies Codegolf ist und~
standardmäßig aktiviert ist\def~{~}~
(9 Byte)?C 18 Bytes
Compiler geben in der Regel nach etwa 200-maliger Wiederholung auf.
Zählt die DOM-Konstruktion als Kompilierungsschritt? Wenn ja, dann
x.htm
:quelle
<?include __FILE__;
.Java,
10295898878 BytesDies endet mit einem,
StackOverflowError
was passiert, weil das generische Auflösungssystem keinen Stamm bestimmen kann, gegen den die anderen Generika aufgelöst werden sollen.Credits sind fällig .
was geschieht hier?
A<T>
ist nur da, um einen 1-Buchstaben-Elternteil zu haben. Es ist generisch. Ich hätte es gebrauchen könnenList
, aber der Import und die Wiederholung von 4 Buchstaben sind zu lang.B<T>
deklariert ein grundlegendes Generikum.B extends A
muss eine Hierarchie zwischenB
und habenA
.extends A<A>
Erstellt eine Selbstreferenz aufA<T>
.A<? super B>
Löst die Suche nach Generika ausA<T>
B<B<T>>
erstellt eine Selbstreferenz aufB<T>
.A<...> a=new B<>()
erzwingt die Verwendung der Generika, anstatt nur deren Definition, und erzwingt die Auflösung beim KompilierenB
und nicht danach.A<?super B
erstellt eine Nicht-Selbstreferenz, so dass wir in den Generika von sowohl eine Referenz auf einen Typ als auch auf einen anderen habenA
.B<A>
erstellt eine Nicht-Selbstreferenz, so dass wir in den Generika von sowohl eine Referenz auf einen Typ als auch auf einen anderen habenB
.Nun, der Typ
A
hat generischen TypA
undB
, aber welcher ist zu wählen? Vergessen Sie sich selbst, versuchen wir es zu lösenB
. Klingeln.Okay,
B
hat Generika TypA
undB
, aber welches ist zu wählen? Vergessen Sie sich selbst, versuchen wir es zu lösenA
. Pong.Diese Art von Rekursion kann nicht wirklich vermieden werden , weil es berechtigte Fälle wie
A<B<A<B<A<B<Object>>>>>>
: zum Beispiel eines JSON - Objekt:List<Map<String,Map<String,List<Map<String,List<String>>>>>>
.Kompilierungsergebnis
Auf meinem System stoppt der Stack-Trace, nachdem 1024 Zeilen angezeigt wurden. Dies sind tatsächlich die 4 gleichen Zeilen, die 256 Mal wiederholt wurden, was eine unendliche Rekursion beweist. Ich werde dir die ganze Spur ersparen.
Ersparnisse
interface
+implements
durchclass
+ ersetztextends
.Long
durchA
(zweimal).new B<A>()
→new B<>()
).quelle
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
B
einen unentscheidbaren Verweis auf das Generikum vonA
enthält, der wiederum einen unentscheidbaren Verweis auf das Generikum von B enthält. Wenn der Resolver nicht entscheiden kann, prüft er eingeschlossene Verweise, aber hier verweisen beide Generika aufeinander auf eine unentschlossene Art und Weise (hauptsächlich dank Selbstreferenzen und demsuper
Schlüsselwort. Der Resolver ping-pongs also tatsächlich zwischen den beiden Generika.public @interface X {@X(x=X.class)Class<? extends X> x();}
... Aber ich habe schnell gemerkt, warum das nicht funktioniert, lol.GNU Makefile,
87 BytesEin Byte gespart dank KonradRudolph
Gespeichert als
Makefile
und aufgerufen vonmake
:Dies erzeugt eine unendliche Build-Rekursion für das erste gefundene Ziel
"x"
.Unnötig zu erwähnen, dass Sie diese Gabelbombe nicht wirklich auf Ihrem Produktionsserver ausführen möchten. :-)
Alternative Version, 5 Bytes
Vorgeschlagen von KonradRudolph:
$_
ist ein Verweis auf das letzte Argument des vorherigen Befehls. Insbesondere wird es hier als absoluter Pfad zum auszuführenden Befehl aufgelöst - dermake
selbst ist.Dies sollte in einer echten Bash-Umgebung funktionieren, jedoch nicht unter Windows + MinGW.
quelle
make
wirklich kompiliert wird (es interpretiert es nur).C ++,
6058Dadurch werden rekursiv Instanzen von
class a
mit verschiedenen Vorlagenparametern erstellt. GCC 7.0 stoppt nach 900 Rekursionsstufen mit tonnenweise Fehlern,operator->
weil es nicht mehr privat ist, aber beispielsweise bei ICC 17 und Microsoft (R) C / C ++ Optimizing Compiler 19 tritt eine Zeitüberschreitung bei Godbolt auf .Das Problem dabei ist, dass wahrscheinlich allen Compilern irgendwann der Speicher ausgeht, sodass dies auch ohne Rekursionsbeschränkungen zum Erliegen kommt. Gleiches gilt wahrscheinlich auch für die Antwort von Clojure.
Edit: 2 Bytes von bolov gespeichert - Danke
quelle
a<int>i=i->b;
operator->
in einer Klasse standardmäßig privat ist. Innerhalb einer Struktur ist sie öffentlich undi->b
kann daher darauf zugreifen.Perl ,
1513 BytesProbieren Sie es online!
Jetzt mit 2 Bytes gespart: @Zaid erinnerte mich an eine schnellere Möglichkeit, eine Schleife in Perl zu machen.
Das ist ganz einfach: Es wird nur ein Parser-Hook mit einer Endlosschleife installiert, sodass das Parsen des Codes unendlich lange dauert. (Perl hat den Vorteil, dass Sie mitten in der Analyse beliebigen Code ausführen können. Die Parser-Hooks sind in Perl selbst angegeben und werden häufig verwendet, um beispielsweise Bibliotheken zu importieren oder die Analyseregeln für einen Bezeichner zu ändern, den Sie behandeln möchten ein Stichwort.) Das Online ausprobieren! Der obige Link gibt die
-c
Option (den Code zu kompilieren, um die Syntax auf Richtigkeit zu überprüfen, aber nicht auszuführen), um zu beweisen, dass die Endlosschleife beim Kompilieren auftritt.Für den Fall, dass Sie sich über "Kompilierungszeit" in einer Skriptsprache wundern: Perl kompiliert tatsächlich in Bytecode und führt dann den Bytecode aus. Dies ist jedoch ein Detail, das bei der Programmierung selten relevant ist. Die
-MO=
Befehlszeilenoptionsfamilie kann verwendet werden, um andere Aufgaben mit dem Bytecode auszuführen als ihn auszuführen (obwohl dies bei diesem Programm nicht der Fall ist, da die Endlosschleife erfolgt, bevor der Bytecode generiert werden kann).quelle
a:goto a
sieht auch gut aus (selbe bytecount leider).BEGIN{{redo}}
Sparen Sie ein paar BytesC ++,
373029 BytesEs wird der zukünftige Auto-Funktionsparameter verwendet. Es wurde in C ++ 17 vorgeschlagen, aber ich glaube nicht, dass es es geschafft hat.
gcc
unterstützt es jedoch als erweiterung.Grundsätzlich gilt
ist äquivalent zu
Der Code versucht,
f
mit verschiedenen Vorlagenargumenten rekursiv zu instanziieren .gcc
scheitert mitMit
-ftemplate-depth=10000
bekam ich es auf Godbolt zu spucken "Killed - Bearbeitungszeit überschritten".Überprüfen Sie es auf Godbolt
1 Byte von Quentin gespeichert. Danke.
quelle
int
als Rückgabetyp gespeichert werden :)auto
Funktionsparameter nicht in C ++ 17 geschafft. undint f() { ... }, a;
ist auch keine rechtliche Erklärung, als ich sie das letzte Mal überprüft habe. (Sie können Funktionsdeklarationen nicht mit Variablendeklarationen wie diesen mischen.) Was Sie hier haben, ist ein extrem GCC-spezifischer Dialekt von C ++. Nicht, dass daran in diesem Zusammenhang etwas auszusetzen wäre. :)Common Lisp, 8 Bytes
Der Compiler versucht, ein Formular zu lesen, und trifft auf das Sharpsign-Dot- Reader-Makro, das den Code zum Zeitpunkt des Lesens auswertet und dessen Ergebnis als Formular zum Kompilieren verwendet. Hier ist der ausgeführte Code eine Endlosschleife.
quelle
TeX, 9 Bytes
TeX funktioniert durch das Erweitern von Makros. Meistens haben die Makros von TeX (auch Steuersequenzen genannt ) die Form,
\name
aber es ist auch möglich, bestimmte Zeichen als Makros zu definieren, die als aktive Zeichen bezeichnet werden . Das Zeichen~
ist in TeX standardmäßig aktiv und kann daher ohne weitere Deklaration als Makroname verwendet werden. Das\def~{~}
oben definierte wird~
so definiert , dass es sich zu erweitert~
. Das heißt, wann immer TeX darauf stößt~
, ersetzt es es durch~
und überprüft es dann erneut, was bedeutet, dass es auf ein völlig neues Vorkommen stößt~
und dieses durch ersetzt~
. Dies definiert die Endlosschleife. Alles was dann benötigt wird, ist die Schleife zu starten und das ist, was das Finale~
tut.In Bearbeitung hinzugefügt
Um dies korrekt zu kompilieren , rufen Sie Folgendes auf:
Die
-ini
Flagge sagt,pdftex
soll kompiliert eine neue Formatdatei. Dies ist ein vorkompilierter Satz von Definitionen, der geladen werden kann, wenn TeX später aufgerufen wird, um die Verarbeitung eines Dokuments zu beschleunigen (LaTeX2e ist ein Beispiel dafür). Ich vermute, dass das&pdftex
ein paar Bytes hinzufügt und die Summe auf 17 erhöht.quelle
pdftex
Programm aber auch als TeX-Eingabe "interpretieren", um eine PDF-Datei als "Ausgabe" zu erzeugen - genauso wie dasg++
Programm C ++ -Eingaben "interpretiert", um eine EXE-Datei als "Ausgabe" zu erzeugen. ;)Haskell, 25 + 17 = 42 Bytes
Ein einfaches Haskell-Metaprogramm, das einen unendlichen Wert definiert und versucht, diesen Wert zur Kompilierungszeit zu berechnen.
Aufruf mit
ghc -XTemplateHaskell <file.hs>
(+17 für den Parameter an den Compiler)quelle
$(let a=a in a)
nicht (für 32 Bytes)?let a = a in a
wird in eine Ausnahme umgeschrieben, die im Gegensatz zu einer Endlosschleife lediglich einen Compilerfehler verursacht. (obwohl dies vielleicht mit einem anderen Haskell-Compiler funktionieren würde, aber ich habe keinen zur Hand, um es zu versuchen)Exception when trying to run compile-time code: <<loop>>
sowohl im Interpreter als auch beim Kompilieren ... technisch gesehen stirbt der obige Code mit einer Ausnahme, aber einem Stapelüberlauf, der von der Spezifikation ausdrücklich erlaubt wird - und wenn Sie unendlich viel Gedächtnis hätten, würde es sich wirklich für immer wiederholen. Die<<loop>>
Ausnahme wird lange vor dem Ende des Arbeitsspeichers meines Computers ausgelöst.Gradle,
109 Bytesmit dem obigen Code in einer
build.gradle
Datei platziert. Gradle verwendet Groovy als Basissprache, also sprechen wir hier wirklich über Groovy, aber da die Frage nach der Build-Zeit lautete, hielt ich Gradle für angemessener.Wenn Sie Gradle-Build-Befehle mit dem oben genannten Code ausführen, wird die spitze, bosskompatible Build-Statuszeile ausgegeben:
Wenn Sie eine Erhöhung anstreben, fügen Sie das Debug-
-d
Flag für Folgendes hinzu :das sieht nicht nur beeindruckend kompliziert aus, sondern aktualisiert sich auch mit einem neuen Satz von:
Statuszeilen alle 10 Sekunden lassen es so aussehen, als wäre der Build mit wichtigen technischen ... Dingen beschäftigt.
quelle
SWI-Prolog, 34 Bytes
Erläuterung
term_expansion/2
wird vom Compiler automatisch aufgerufen, bevor der Code kompiliert wird, um einige Begriffe im Quellcode in andere umzuwandeln.Hier stellen wir eine neue Regel für
term_expansion/2
:repeat,1=0.
.repeat/0
ist ein Prädikat, das immer erfolgreich ist und unendlich viele Auswahlpunkte bietet.1=0
versucht zu vereinen1
mit0
, was immer istfalse
. Dies führt dazu, dass der Compiler zurückverfolgtrepeat
(da er immer einen Auswahlpunkt bereitstellt) und es1=0
erneut versucht , usw.quelle
expand_term
anstatt (wie sie sagt ,term_expansion
kann nicht wie hier in GNU Prolog verwendet werden). Beiexpand_term
SWI funktioniert das allerdings nicht .GNU Make, 44
Das kann ich nicht gutschreiben. Es ist aus Robert Mecklenburgs Buch Managing Projects with GNU Make: Die Kraft von GNU Make zum Bauen von Gegenständen abgeleitet .
Ich ziehe dies der anderen Antwort vor, da es keine Rekursion verwendet. Auf meiner VM gabelt die andere Antwort weiter Prozesse und bei einer Tiefe von etwa 7.000 kommt die VM nicht mehr zum Stillstand. Mit dieser Antwort ist es jedoch möglich, unbegrenzt fortzufahren, ohne Systemressourcen zu verbrauchen. Sie werden wirklich in der Lage sein, mit diesem Build nachzulassen. Ich habe über 1.000.000 Iterationen ohne erkennbare Systemverschlechterung durchgeführt.
Hinweis Ich musste das hinzufügen,
sleep 1
damit der Makefile-Zeitstempel tatsächlich jedes Mal aktualisiert wird. Sie können dies ändern,sleep 0.01
wenn Sie möchten, dass Iterationen etwas schneller durchgebrannt werden.quelle
GNU Forth, 15 Bytes
Golf gespielt
Definiert das Wort neu (kompiliert es neu)
:
und ruft eine sofortige Endlosschleife[do] [loop]
innerhalb der neuen Definition auf (direkt zur Kompilierungszeit).Probieren Sie es online!
quelle
Clojure, 21 Bytes
Bindet den Compiler, indem ein Makro definiert wird, das wiederholt Aufrufe an sich selbst ausgibt.
Auf meinem Telefon führt dies dazu, dass die REPL aufhängt und das Gerät verzögert. Auf meinem Laptop schlägt dies mit einem StackOverflow völlig fehl.
Leider passiert der StackOverflow sofort, ist aber nach den Regeln immer noch gültig.
quelle
MSBuild, 130 Bytes
Speichern Sie diese Datei als Datei mit der
.proj
Erweiterung und führen Sie siemsbuild
an der Eingabeaufforderung aus. MSBuild führt das einzige Ziel aus, das einfach einen anderenmsbuild
Prozess erzeugt.quelle
C 31 Bytes
Inspiriert von Digital Trauma . Kompilieren Sie mit der
-mcmodel=medium
Flagge.Viel Glück beim Kompilieren, Sie benötigen 1,8 Yottabyte RAM und Festplattenspeicher.
quelle
Mathematica 33 Bytes
Der Code versucht, das Argument vor dem Kompilieren symbolisch auszuwerten, und das Argument selbst ist eine Endlosschleife. Die While-Funktion hat ein Null-Sekunden-Argument, da es nicht wichtig ist.
quelle
Compile
Anrufs oder davor stattfindet.Haskell (GHC, ohne Template-Haskell oder benutzerdefinierte Umschreibregeln) , 138
Theoretisch tritt dies in eine Endlosschleife ein, ähnlich wie dies beim C ++ - Ansatz der Fall ist : Die polymorphe Methode
y
wird für immer mehr verschachtelte Typen instanziiert. In der Praxis läuft die standardmäßig zugewiesene Stapelgröße schnell über:Dank an Luke Palmer .
quelle
Haskell (ghc), 32 + 2 = 34 Bytes
renn mit
ghc -O <file>
. Löst eine Umschreiberegel für die Hauptfunktion aus, die auf dieselbe Sache umschreibt. Die einzige unglückliche Eigenschaft ist, dass ghc klug genug ist, dies zu erkennen und nach 100 Iterationen anzuhalten. Ich kenne keine einfache Möglichkeit, dieses Verhalten zu deaktivieren.quelle
Boo, 25 Bytes
Dies definiert ein Makro, das zur Kompilierungszeit ausgeführt wird, eine Endlosschleife ausführt und dann das Makro aufruft.
quelle
Rust, 18 Bytes
Klassisches Self-Include. Rustc ist jedoch ärgerlich vernünftig und wird standardmäßig nach 128 Rekursionen aussteigen, und es erweitert sich zuerst in der Tiefe, so dass auch das exponentielle Wachstum nicht funktioniert. Gleiches gilt jedoch für die C- und C ++ - Lösungen.
quelle
Factor ,
2916Der Teil zwischen
<<
>>
wird zur Analysezeit ausgeführt.Was das
[ t ] loop
angeht, lass ich dich raten ...Sie können das in den Listener einfügen, wie es ist, oder es zu einem beliebigen Vokabular oder einer Skriptdatei mit den entsprechenden Boilerplate-Inhalten hinzufügen.
quelle
PHP, 19 Bytes
quelle