Je suis développeur et je n'ai pas envie de faire mon travail. D'après XKCD, je sais que la meilleure excuse pour relâcher l'attention est la compilation de votre code . Pour cette raison, je pense avoir besoin d'un code qui compilera pour toujours! Et parce que je suis paresseux et ne veux pas avoir à taper beaucoup, ceci doit être fait avec le code le plus court possible.
Votre tâche consiste donc à écrire un programme dont la syntaxe est correcte, mais qui oblige le compilateur à entrer dans une boucle infinie.
Caractéristiques
- Vous devez évidemment utiliser un langage avec un compilateur.
- Spécifiez l'implémentation utilisée dans chaque solution.
- C'est du code-golf , donc la solution valide la plus courte (en octets) est gagnante.
- Le compilateur peut cesser de manquer de mémoire ou d’espace de pile.
code-golf
compile-time
Fruit d'esolanging
la source
la source
Java
: définir un processeur d’annotation (idéone snippet) que vous utiliserez pour invoquerjavac
avec son-processor
option. Cela fait que la compilation de n'importe quelle classe est suspendue pour toujours.Réponses:
Japt , 2 octets
Vous pouvez le tester en ligne ici , mais je ne le recommanderais pas car cela gèlera votre navigateur.
Explication
Japt utilise la bibliothèque shoco pour la compression de chaînes. Un backtick demande au compilateur de tout décompresser jusqu'au prochain backtick ou à la fin du fichier. Chaque octet fait ce qui suit:
00-7F
sont laissés intacts.80-BF
chaque transformée en une paire commune à deux lettres en minuscule (at
,oo
,th
, etc.).C0-DF
chacun utilise l'octet suivant et se transforme en une chaîne commune de quatre lettres .E0-EF
chacun utilise les trois octets suivants et se transforme en une chaîne "commune" de huit lettres (commençant àWhererer
et descendant à partir de là).F0-F7
casser le décompresseur, bien qu'il renvoie toujours tout jusqu'à l'octet de rupture.F8-FF
amener le décompresseur à entrer dans une boucle infinie. Je ne sais pas pourquoi, car je ne connais pas très bien le fonctionnement interne de la bibliothèque shoco (et le code JavaScript est complètement illisible ), mais c'est très pratique dans ce cas.Je ne crois pas qu'il y ait un autre moyen de jouer avec le compilateur Japt, mais on ne sait jamais ...
la source
TikZ (pdfTeX 3.14159265-2.6-1.40.17),
857974242221 octetsUn tas d'octets sauvés grâce à wchargin
Un octet enregistré grâce à Chris H
En fait, j'ai rencontré celui-ci par accident lorsque je travaillais à faire mes devoirs. J'ai passé un bon bout de temps à attendre qu'il soit compilé avant de réaliser ce qui se passait.
Cela a deux parties:
Cela charge le paquet TikZ
et:
Cela démarre un
\tikz
environnement et une commande draw.Que se passe-t-il
Le compilateur pdflatex a des problèmes avec le
\tikz\pic
mode interactif et passe en mode interactif, ce qui le bloque indéfiniment.la source
\draw l\end {document}
?! Le fichier s'est terminé lors de l'analyse en utilisant\tikz@next.
" pdflatex 3.1415926-2.5-1.40.14 (TeX Live 2013 / Debian). tikz 2010/10/13 v2.10. Ceci est standardapt install texlive-full
sur Ubuntu 14.04.pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016)
et il boucle en effet indéfiniment. Merci pour les conseils.\pic
place de \ draw` - exactement le même comportement (testé avec tikz 1.142)\def\a{\a}\a
(12 octets)? Ou, comme il s'agit du code golf et qu'il~
est actif par défaut,\def~{~}~
(9 octets)?C, 18 octets
Les compilateurs abandonnent généralement après avoir été récursifs environ 200 fois.
La construction de DOM compte-t-elle comme une étape de compilation? Si oui, alors
x.htm
:la source
<?include __FILE__;
.Java,
10295898878 octetsCela se termine par un
StackOverflowError
qui se produit car le système de résolution générique ne peut pas décider d'une racine contre laquelle résoudre les autres génériques.Crédits dus .
Que se passe t-il ici?
A<T>
est juste là pour avoir un parent d'une lettre. C'est générique. J'aurais pu l'utiliserList
, mais l'importation et la répétition de 4 lettres sont trop longues.B<T>
déclare un générique de base.B extends A
est nécessaire d'avoir une hiérarchie entreB
etA
.extends A<A>
crée une auto référence surA<T>
.A<? super B>
déclenche la recherche de génériques surA<T>
B<B<T>>
crée une auto-référence surB<T>
.A<...> a=new B<>()
force l'utilisation des génériques, au lieu de simplement la définition de ceux-ci, forçant la résolution lors de la compilationB
, et non après.A<?super B
crée une non-référence de soi, nous avons donc à la fois une référence à un type et à un autre dans les génériques deA
.B<A>
crée une non-référence de soi, nous avons donc à la fois une référence à un type et à un autre dans les génériques deB
.Maintenant, le type
A
a le type génériqueA
etB
, mais lequel doit être choisi? Oubliez vous-même, essayons de résoudreB
. PingD'accord, les
B
génériques sont-ils de typeA
etB
, mais lequel doit être choisi? Oubliez vous-même, essayons de résoudreA
. PongCe genre de récursion ne peut pas vraiment être évité car il y a des cas légitimes comme
A<B<A<B<A<B<Object>>>>>>
: par exemple un objet JSON:List<Map<String,Map<String,List<Map<String,List<String>>>>>>
.Résultat de la compilation
Sur mon système, la trace de la pile s’arrête après avoir affiché 1024 lignes, qui sont en fait les 4 mêmes lignes répétées 256 fois, ce qui prouve une récursion infinie. Je vous épargne toute cette trace.
Des économies
interface
+implements
parclass
+extends
.Long
parA
(deux fois).new B<A>()
→new B<>()
).la source
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
B
contient une référence indécidable au génériqueA
qui contient à son tour une référence indécidable au générique de B. Lorsque le résolveur ne peut pas décider, il vérifie les références incluses, mais ici les deux génériques se réfèrent l'un à l'autre de manière indécidable (principalement grâce aux références personnelles et ausuper
mot clé. Le résolveur est donc un ping-pong entre les deux génériques.public @interface X {@X(x=X.class)Class<? extends X> x();}
... Mais j'ai vite compris pourquoi cela ne marcherait pas lol.GNU Makefile,
87 octetsUn octet enregistré grâce à KonradRudolph
Enregistré sous
Makefile
et invoqué parmake
:Cela produira une récursion de construction infinie sur la première cible trouvée
"x"
.Inutile de dire que vous ne voulez pas vraiment utiliser cette bombe fourchue sur votre serveur de production. :-)
Version alternative, 5 octets
Proposé par KonradRudolph:
$_
est une référence au dernier argument de la commande précédente. Plus précisément, il est résolu ici comme le chemin absolu de la commande en cours d'exécution - qui estmake
lui - même.Cela devrait fonctionner correctement dans un environnement Bash authentique, mais pas sous Windows + MinGW.
la source
make
vraiment compilé (il l'interprète simplement).C ++,
6058Cela crée de manière récursive des instances
class a
avec différents paramètres de modèle. GCC 7.0 s’arrête après 900 niveaux de récursivité avec des tonnes d’erreurs concernant laoperator->
confidentialité, mais par exemple, ICC 17 et le compilateur d’optimisation Microsoft (R) C / C ++ 19 sur Time-God .Le problème avec cela est que probablement tous les compilateurs vont manquer de mémoire à un moment donné, donc même sans limite de récursivité, cela va s'arrêter. La même chose s'applique probablement à la réponse de Clojure.
Edit: 2 octets enregistrés par bolov - Merci
la source
a<int>i=i->b;
operator->
classe est privée par défaut. Dans une structure, il est public eti->b
peut donc y accéder.Perl ,
15 à13 octetsEssayez-le en ligne!
Maintenant, avec 2 octets sauvés: @Zaid m'a rappelé un moyen de faire une boucle en Perl.
C’est assez simple: il n’installe qu’un crochet d’analyse avec une boucle infinie, ce qui rend le code très long à analyser. Perl a l'avantage de permettre l'exécution de code arbitraire au milieu de l'analyse; les points d'ancrage de l'analyseur sont spécifiés dans Perl lui-même et sont fréquemment utilisés pour importer des bibliothèques ou modifier les règles d'analyse d'un identifiant que vous souhaitez traiter. un mot clé.) Le Essayez-le en ligne! Le lien ci-dessus donne l'
-c
option (pour compiler le code afin de vérifier l'exactitude de la syntaxe, mais pas pour l'exécuter), pour prouver que la boucle infinie se produit au moment de la compilation.Au cas où vous vous interrogeriez sur le "temps de compilation" dans un langage de script: Perl compile réellement en bytecode puis exécute le bytecode, mais il s'agit d'un détail qui est rarement pertinent lors de sa programmation. La
-MO=
famille d’options en ligne de commande peut être utilisée pour faire des choses avec le bytecode autre que l’exécuter (mais pas avec ce programme, car la boucle infinie se produit avant que le bytecode puisse être généré).la source
a:goto a
a l'air bien aussi (même nombre malheureusement malheureusement).BEGIN{{redo}}
vous épargnera quelques octetsC ++,
373029 octetsIl utilise le futur paramètre de fonction automatique. Il a été proposé dans C ++ 17, mais je ne pense pas que cela ait réussi.
gcc
cependant le supporte comme une extension.Fondamentalement
est équivalent à
Le code tente d'instancier
f
récursivement avec différents arguments de modèle.gcc
échoue avecAvec
-ftemplate-depth=10000
j'ai réussi à cracher "tués - le temps de traitement dépassé" sur godbolt.Vérifiez-le sur godbolt
1 octet enregistré par Quentin. Je vous remercie.
la source
int
comme type de retour :)auto
les paramètres de fonction n’ont pas été intégrés à C ++ 17; etint f() { ... }, a;
n'est pas non plus une déclaration légale la dernière fois que j'ai vérifié. (Vous ne pouvez pas mélanger des déclarations de fonction avec des déclarations de variable comme celle-ci.) Vous avez ici un dialecte extrêmement spécifique à GCC de C ++. Non pas qu'il y ait quelque chose qui cloche dans ce contexte. :)Common Lisp, 8 octets
Le compilateur essaiera de lire un formulaire et rencontrera la macro sharpsign-dot reader, qui évalue le code au moment de la lecture et utilise son résultat comme formulaire à compiler. Ici, le code en cours d'exécution est une boucle infinie.
la source
TeX, 9 octets
TeX fonctionne en développant des macros. La plupart du temps, les macros de TeX (également appelées séquences de contrôle ) sont de la forme,
\name
mais il est également possible de définir certains caractères en tant que macros. Ce sont les caractères actifs . Le caractère~
est actif par défaut en clair TeX et peut donc être utilisé comme nom de macro sans déclaration supplémentaire. Le\def~{~}
dans ce qui précède définit~
pour qu'il se développe~
. C'est-à-dire que chaque fois que TeX rencontre,~
il le remplace par~
, puis réexamine le remplacement, ce qui signifie qu'il rencontre une occurrence entièrement nouvelle de~
et le remplace par~
. Ceci définit la boucle infinie. Il suffit ensuite de commencer la boucle et c'est ce que fait la finale~
.Ajouté en édition
Pour que cela soit correctement compilé , appelez-le en tant que:
Le
-ini
drapeau indique quepdftex
devrait compiler un nouveau fichier de format. Il s'agit d'un ensemble précompilé de définitions qui peuvent être chargées lorsque TeX est appelé ultérieurement pour accélérer le traitement d'un document (LaTeX2e en est un exemple). Je suppose que cela&pdftex
ajoute quelques octets, ce qui porte le total à 17.la source
pdftex
programme "interprète" l'entrée TeX pour produire un PDF en tant que "sortie" - de la même manière que leg++
programme "interprète" l'entrée C ++ pour produire un fichier .exe en tant que "sortie". ;)Haskell, 25 + 17 = 42 octets
Un métaprogramme Haskell simple qui définit une valeur infinie et tente de la calculer au moment de la compilation.
Invoke with
ghc -XTemplateHaskell <file.hs>
(+17 pour le paramètre du compilateur)la source
$(let a=a in a)
fonctionne pas (pour 32 octets)?let a = a in a
est réécrite en une exception, ce qui provoque simplement une erreur du compilateur, par opposition à une boucle infinie. (Bien que cela fonctionne peut-être avec un compilateur Haskell différent, mais je n'en ai pas sous la main pour essayer)Exception when trying to run compile-time code: <<loop>>
, à la fois dans l'interpréteur et lors de la compilation ... techniquement, le code ci-dessus meurt avec une exception également, mais un débordement de pile, explicitement autorisé par la spécification - et si vous aviez une mémoire infinie, elle bouclerait vraiment pour toujours. L'<<loop>>
exception se déclenche bien avant que ma machine ne manque de mémoire.gradle,
10 à9 octetsavec le code ci-dessus placé dans un
build.gradle
fichier. Gradle utilise groovy comme langage de base, donc nous parlons vraiment de groovy ici, mais comme la question portait sur le temps de construction, je pensais que gradle serait plus approprié.L'exécution de toutes les commandes de génération de niveaux avec le code ci-dessus imprime la ligne d'état de la génération compatible pointy-haired-boss:
si vous visez une augmentation, ajoutez le
-d
drapeau de débogage pour:qui, en plus de paraître impressionnant et compliqué, met également à jour un nouvel ensemble de:
toutes les 10 secondes, les lignes d'état donnent l'impression que la compilation est occupée à effectuer d'importantes tâches techniques.
la source
SWI-Prolog, 34 octets
Explication
term_expansion/2
est quelque chose qui est appelé automatiquement par le compilateur avant de compiler le code pour transformer certains termes du code source en d'autres termes.Nous présentons ici une nouvelle règle pour
term_expansion/2
:repeat,1=0.
.repeat/0
est un prédicat qui réussit toujours et fournit un nombre infini de points de choix.1=0
essaie de s'unifier1
avec0
, ce qui est toujoursfalse
. Cela fera revenir le compilateurrepeat
(puisqu'il fournit toujours un point de choix) et1=0
recommence, etc.la source
expand_term
(car il est dit que celaterm_expansion
ne peut pas être utilisé comme ici dans GNU Prolog). Cela ne fonctionne pas avecexpand_term
SWI cependant.GNU Make, 44
Je ne peux pas demander de crédit pour cela. Il est dérivé de l'ouvrage de Robert Mecklenburg, Gestion de projets avec GNU Make: La puissance de GNU: Construire n'importe quoi .
Je préfère cela à l’autre Make answer car il n’utilise pas de récursivité. Sur ma machine virtuelle, l’autre réponse est toujours en train de traiter les processus et, à une profondeur d’environ 7 000 personnes, la machine virtuelle s’arrête de ne plus répondre. Cependant, avec cette réponse, il est possible de continuer indéfiniment sans consommer les ressources du système. Vous pourrez vraiment vous détendre avec cette version. J'ai parcouru plus de 1 000 000 itérations sans dégradation apparente du système.
Notez que je devais ajouter le
sleep 1
pour que l'horodatage du fichier Make soit réellement mis à jour à chaque fois. Vous pouvez le changersleep 0.01
si vous voulez que les itérations soient un peu plus rapides.la source
GNU Forth, 15 octets
Golfé
Redéfinit (recompile) le mot
:
et appelle une boucle infinie immédiate[do] [loop]
dans la nouvelle définition (juste au moment de la compilation).Essayez-le en ligne!
la source
Clojure, 21 octets
Attache le compilateur en définissant une macro qui émet à plusieurs reprises des appels à elle-même.
Sur mon téléphone, le REPL se bloque et retarde le périphérique. Sur mon ordinateur portable, cela échoue carrément avec un StackOverflow.
Malheureusement, le StackOverflow se produit instantanément, mais il reste valide conformément aux règles.
la source
MSBuild, 130 octets
Enregistrez-le dans un fichier avec
.proj
extension et exécutez-le àmsbuild
partir de l'invite de commande. MSBuild exécutera sa seule cible qui génère simplement un autremsbuild
processus.la source
C, 31 octets
Inspiré par le traumatisme numérique . Compiler avec le
-mcmodel=medium
drapeau.Bonne chance en compilant cela, vous aurez besoin de 1,8 Go de RAM et d'espace disque.
la source
Mathematica 33 octets
Le code tentera d'évaluer symboliquement l'argument avant la compilation et l'argument lui-même est une boucle infinie. La fonction While a un second argument nul car ce n'est pas important.
la source
Compile
ou avant l' appel?Haskell (GHC, sans modèle Haskell ni règles de réécriture personnalisées) , 138
Théoriquement, cela entre dans une boucle infinie de la même manière que l'approche C ++ : la méthode polymorphe
y
est instanciée pour des types de plus en plus convolutés. En pratique, la taille de pile allouée par défaut déborde rapidement:Crédits à Luke Palmer .
la source
Haskell (ghc), 32 + 2 = 34 octets
courir avec
ghc -O <file>
. Déclenche une règle de réécriture pour la fonction principale qui réécrit dans la même chose. La seule caractéristique malheureuse est que ghc est suffisamment intelligent pour le détecter et s’arrêter après 100 itérations. Je ne sais pas d'un moyen facile de désactiver ce comportement.la source
Boo, 25 octets
Cela définit une macro, qui s'exécute au moment de la compilation, qui exécute une boucle infinie, puis appelle la macro.
la source
Rouille, 18 octets
Auto-inclure classique. Rustc est ennuyeusement sain cependant, et par défaut, il renflouera après 128 récurrences, et il étend la profondeur en premier afin que la croissance exponentielle ne fonctionne pas non plus. La même chose s'applique aux solutions C et C ++.
la source
Facteur ,
2916La partie entre
<<
>>
est exécutée au moment de l'analyse.Pour ce qui
[ t ] loop
est, je vous laisse deviner ...Vous pouvez mettre cela dans le Listener tel quel, ou l'ajouter à un vocabulaire ou à un fichier de script avec le contenu passe-partout correspondant.
la source
PHP, 19 octets
la source