El código más corto para aflojar legítimamente

146

Soy desarrollador y no tengo ganas de hacer mi trabajo. Sé por XKCD que la mejor excusa para aflojar es que su código está compilando . ¡Debido a esto, creo que necesito un código que se compilará para siempre! Y debido a que soy flojo y no quiero tener que escribir mucho, esto tiene que hacerse con el código más corto posible.

Entonces, su tarea es escribir un programa que sea sintácticamente válido, pero hará que el compilador ingrese un bucle infinito.

Especificaciones

  • Debe usar un lenguaje que tenga un compilador, obviamente.
  • Especifique la implementación utilizada en cada solución.
  • Este es el , por lo que gana la solución válida más corta (en bytes).
  • El compilador puede terminar por quedarse sin memoria o espacio de pila.
Fruta Esolanging
fuente
1
@obarakon No estoy de acuerdo. El código del otro desafío no se puede transferir a este desafío con facilidad. Los desafíos, mientras que ambos implican bucles infinitos, son fundamentalmente diferentes.
Sriotchilism O'Zaic
1
@obarakon Tampoco soy un tonto de esta pregunta , ya que no es un código de golf.
Esolanging Fruit
2
Relacionado
Sriotchilism O'Zaic
1
No estoy seguro de que se ajuste a este desafío (e incluso si lo hiciera, obtendría un puntaje terrible), pero para aquellos interesados, así es como lo haría Java: definir un procesador de anotaciones (fragmento de ideona) que usará al invocar javaccon su -processoropción. Hace que la compilación de cualquier clase se cuelgue para siempre.
Aaron
66
Para las respuestas que provocan el bloqueo del compilador: con el fin de aflojar, creo que todavía quieres que demore tanto como sea posible.
GuitarPicker

Respuestas:

16

Japt , 2 bytes

`ÿ

Puede probar esto en línea aquí , pero no lo recomendaría, ya que congelará su navegador.

Explicación

Japt usa la biblioteca shoco para comprimir cadenas. Un backtick le dice al compilador que descomprima todo hasta el siguiente backtick o al final del archivo. Cada byte hace lo siguiente:

  • 00-7F se dejan intactos
  • 80-BFcada transforman en un par de dos letras minúsculas común ( at, oo, th, etc.).
  • C0-DFcada uno consume el siguiente byte y se transforma en una cadena común de cuatro letras .
  • E0-EFcada uno consume los siguientes tres bytes y se transforma en una cadena de ocho letras "común" (que comienza Whererery desciende desde allí).
  • F0-F7 rompa el descompresor, aunque todavía devuelve todo al byte de ruptura.
  • F8-FFhacer que el descompresor entre en un bucle infinito. No estoy seguro de por qué es así, ya que no estoy muy familiarizado con el funcionamiento interno de la biblioteca shoco (y el código JavaScript es completamente ilegible ), pero es bastante útil en este caso.

No creo que haya otra forma de meterse con el compilador de Japt, pero nunca se sabe ...

ETHproducciones
fuente
10
¿Qué quieres decir con que es ilegible? Claramente, no estás intentando lo suficiente.
fəˈnɛtɪk
Me gustaría que hubiera una decompilador emscripten ...
tbodt
58

TikZ (pdfTeX 3.14159265-2.6-1.40.17), 85 79 74 24 22 21 bytes

Un montón de bytes guardados gracias a wchargin

Un byte guardado gracias a Chris H

\input tikz
\tikz\pic

En realidad me encontré con este por accidente cuando estaba trabajando en la tarea. Pasé bastante tiempo esperando que se compilara antes de darme cuenta de lo que estaba sucediendo.

Esto tiene dos partes:

\input tikz

Esto carga el paquete TikZ

y:

\tikz\pic

Esto inicia un \tikzentorno y un comando de dibujo.

Que esta pasando

El compilador pdflatex tiene problemas \tikz\picy entra en modo interactivo, lo que hace que se detenga indefinidamente.

Sriotchilism O'Zaic
fuente
(1/2) No puedo reproducir esto. Aparece el mensaje "¡¿Fugitivo argumento?! El \draw l\end {document}archivo finalizó al escanear el uso de \tikz@next." pdflatex 3.1415926-2.5-1.40.14 (TeX Live 2013 / Debian). tikz 13/10/2010 v2.10. Esto es estándar apt install texlive-fullen Ubuntu 14.04.
wchargin
1
@wchargin Estoy usando la misma versión pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016) y, de hecho, se repite indefinidamente. Gracias por los consejos.
Sriotchilism O'Zaic
1
Puede guardar un byte usando en \piclugar de \ draw` - exactamente el mismo comportamiento (probado usando tikz 1.142)
Chris H
3
No puedo creer que realmente esté abogando por no usar TikZ, pero seguramente el uso de este es excesivo aquí. ¿Qué tiene de malo el viejo \def\a{\a}\a(12 bytes)? O, como este es el código de golf y ~está activo por defecto, \def~{~}~(9 bytes)
Loop Space
2
@LoopSpace No hay nada malo con ellos. Simplemente no sabía que existía. Si desea dar su propia respuesta, siéntase libre.
Sriotchilism O'Zaic
40

C, 18 bytes

#include __FILE__

Los compiladores generalmente se rendirán después de recurrir unas 200 veces.

¿La construcción DOM cuenta como un paso de compilación? Si es así, entonces x.htm:

<iframe src=x.htm>
Neil
fuente
14
Recuerdo que los conjuntos de marcos recursivos solían bloquear IE4 con tanta fuerza que a veces eliminaban componentes importantes del sistema operativo. Entonces el HTML allí probablemente cuenta.
10
@ ais523, eso es porque, en los días IE4, Internet Explorer era un "componente importante del sistema operativo".
Mark
2
Un poco de ajuste y es válida PHP: <?include __FILE__;.
Ismael Miguel
66
No puedo publicar esta respuesta porque mi representante no es lo suficientemente alto, pero dos alternativas son: #include "/ dev / zero" y #include "/ dev / stdin" - ¡ten cuidado al ejecutar la primera!
rrauenza
2
Cuando lo probé, el uso de memoria de gcc comenzó a crecer rápidamente sin límite, el sistema dejó de responder y mi perro guardián finalmente se activó y se reinició. Fue bastante divertido :)
rrauenza
38

Java, 102 95 89 88 78 bytes

class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>a=new B<>();}

Esto termina con lo StackOverflowErrorque sucede porque el sistema de resolución genérico no puede decidir una raíz contra la cual resolver los otros genéricos.

Créditos donde vencen .

¿Qué pasa aquí?

  1. A<T>está ahí para tener un padre de 1 letra. Es genérico Podría haberlo usado List, pero las importaciones y la repetición de 4 letras son demasiado largas.
  2. B<T> declara un genérico básico.
  3. B extends Ase requiere tener una jerarquía entre By A.
  4. extends A<A>crea una auto referencia en A<T>.
  5. A<? super B> desencadena la búsqueda de genéricos en A<T>
  6. B<B<T>>crea una autorreferencia en B<T>.
  7. A<...> a=new B<>()fuerza el uso de los genéricos, en lugar de simplemente la definición de los mismos, forzando la resolución al compilar B, y no después.
  8. A<?super Bcrea una no referencia propia, por lo que tenemos una referencia a un tipo y a otro en los genéricos de A.
  9. B<A>crea una no referencia propia, por lo que tenemos una referencia a un tipo y a otro en los genéricos de B.

Ahora, el tipo Atiene tipo genérico Ay B, pero ¿cuál se debe elegir? Olvídate de ti mismo, tratemos de resolverlo B. Silbido.

De acuerdo, ¿ Btiene tipo genérico Ay B, pero cuál elegir? Olvídate de ti mismo, tratemos de resolverlo A. Apestar.

Este tipo de recursividad en realidad no puede ser evitado porque hay casos legítimos como A<B<A<B<A<B<Object>>>>>>: por ejemplo, un objeto JSON: List<Map<String,Map<String,List<Map<String,List<String>>>>>>.

Resultado de compilación

$ javac NoCompile.java


The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
        at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2587)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
        at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
        at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2592)
        at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
        at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)

En mi sistema, el seguimiento de la pila se detiene después de mostrar 1024 líneas, que en realidad son las 4 mismas líneas repetidas 256 veces, lo que demuestra una recursión infinita. Te ahorraré todo ese rastro.

Ahorros

  1. 102 → 95 bytes: reemplazado interface+ implementscon class+ extends.
  2. 95 → 89 bytes: reemplazado Longcon A(dos veces).
  3. 89 → 88 bytes: operador de diamante usado ( new B<A>()new B<>()).
  4. 88 → 78 bytes: movió la declaración de la variable a un miembro de la clase, gracias a VoteToClose .
Olivier Grégoire
fuente
1
¿Qué estoy mirando
Addison Crump
Puede acortar esto a 78 bytes con:class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
Addison Crump
@VoteToClose Estás viendo un excelente ejemplo de indecidibilidad en los genéricos de Java. Se supone que cada genérico se resuelve con una raíz común a la que luego se valida. Lo que sucede aquí es que el genérico de Bcontiene una referencia indecidible al genérico, Aque a su vez contiene una referencia indecidible al genérico de B. Cuando el resolutor no puede decidir, verifica las referencias incluidas, pero aquí ambos genéricos se refieren entre sí de una manera indecidible (principalmente gracias a las auto-referencias y la superpalabra clave. Por lo tanto, el solucionador realmente hace ping-pong entre los dos genéricos.
Olivier Grégoire
Estaba pensando en crear un problema en tiempo de compilación con anotaciones cíclicas: public @interface X {@X(x=X.class)Class<? extends X> x();}... Pero rápidamente me di cuenta de por qué eso no funcionaría jajaja.
Magic Octopus Urn
34

GNU Makefile, 8 7 bytes

Un byte guardado gracias a KonradRudolph

Guardado como Makefilee invocado por make:

x:;make

Esto producirá una recursión de construcción infinita en el primer objetivo encontrado "x".

No hace falta decir que realmente no desea ejecutar esta bomba tenedor en su servidor de producción. :-)

make
make[1]: Entering directory `/path/to/my/dir'
make
make[2]: Entering directory `/path/to/my/dir'
make
make[3]: Entering directory `/path/to/my/dir'
make
make[4]: Entering directory `/path/to/my/dir'
make
make[5]: Entering directory `/path/to/my/dir'
make
make[6]: Entering directory `/path/to/my/dir'
make
make[7]: Entering directory `/path/to/my/dir'
make
...

Versión alternativa, 5 bytes.

Sugerido por KonradRudolph:

x:;$_

$_es una referencia al último argumento del comando anterior. Más específicamente, se resuelve aquí como la ruta absoluta al comando que se está ejecutando, que es en makesí mismo.

Esto debería funcionar bien en un entorno Bash genuino, pero no en Windows + MinGW.

Arnauld
fuente
2
Hmm, no creo makeque realmente compile el Makefile (solo lo interpreta).
zepelín
3
@zeppelin Tienes razón, esta es probablemente una respuesta límite. Dicho esto, las presentaciones que involucraron macro recursividad en el nivel de preprocesador nunca comenzarán a compilar ningún código real tampoco.
Arnauld
11
Se ajusta al objetivo previsto: tener un proceso de construcción infinito. +1!
YSC
23

C ++, 60 58

template<class T>class a{a<T*>operator->();};a<int>i=i->b;

Esto crea instancias recursivamente class acon diferentes parámetros de plantilla. GCC 7.0 se detiene después de 900 niveles de recursión con toneladas de errores sobre operator->ser privado pero, por ejemplo, ICC 17 y Microsoft (R) C / C ++ Optimizing Compiler 19 se agotan en Godbolt .

El problema con eso es que probablemente todos los compiladores se quedarán sin memoria en algún momento, por lo que incluso sin límites de recursión, esto se detendrá. Lo mismo probablemente se aplica a la respuesta Clojure, también.

Editar: 2 bytes guardados por bolov - Gracias

Christoph
fuente
1
más corto:a<int>i=i->b;
bolov
1
@Bolsillos como dije en mi respuesta, eso se debe a que el valor operator->predeterminado es privado dentro de una clase. Dentro de una estructura es pública y, por i->blo tanto, puede acceder a ella.
Christoph
1
gcc 4.4.7 parece colgar indefinidamente aquí. Esperando al infinito o para que muestre la salida, lo que ocurra primero. Se actualizará
osuka_
1
@osuka_ ¿sigue funcionando?
Christoph
1
@ Christoph no, se estrelló con un SIGSEGV después de dejarlo funcionando durante un par de días. Sin embargo, olvidé actualizar, ¡gracias por el recordatorio!
osuka_
23

Perl , 15 13 bytes

BEGIN{{redo}}

Pruébalo en línea!

Ahora con 2 bytes guardados: @Zaid me recordó una forma terser de hacer un bucle en Perl.

Esto es bastante simple: simplemente instala un gancho de analizador con un bucle infinito, lo que hace que el código tarde infinitamente en analizar. (Perl es bueno porque le permite ejecutar código arbitrario en el medio del análisis; los ganchos del analizador se especifican en el propio Perl y se usan con frecuencia para hacer cosas como importar bibliotecas o cambiar las reglas de análisis para un identificador que desee tratar como una palabra clave.) ¡Pruébelo en línea! el enlace de arriba ofrece la -copción (compilar el código para verificar la sintaxis de la corrección, pero no ejecutarlo), para probar que el bucle infinito ocurre en tiempo de compilación.

En caso de que se esté preguntando acerca del "tiempo de compilación" en un lenguaje de scripting: Perl realmente compila en bytecode y luego ejecuta el bytecode, pero este es un detalle que rara vez es relevante al programarlo. La -MO=familia de opciones de línea de comando se puede usar para hacer cosas con el código de bytes además de ejecutarlo (aunque no con este programa, ya que el bucle infinito ocurre antes de que se pueda generar el código de bytes).


fuente
1
a:goto atambién se ve bien (tristemente el mismo bytecount).
Dada
3
BEGIN{{redo}}te ahorrará algunos bytes
Zaid
20

C ++, 37 30 29 bytes

int f(auto p){f(&p);},a=f(0);

Utiliza el futuro parámetro de función automática. Se propuso en C ++ 17, pero no creo que lo haya logrado. gccSin embargo, lo admite como una extensión.

Básicamente

void foo(auto p);

es equivalente a

template <class T>
void foo(T p);

El código intenta crear instancias frecursivamente con diferentes argumentos de plantilla. gccfalla con

error fatal: la profundidad de creación de instancias de plantilla supera el máximo de 900 (use -ftemplate-depth = para aumentar el máximo)

Con -ftemplate-depth=10000eso lo escupí "Asesinado: tiempo de procesamiento excedido" en godbolt.

Compruébalo en godbolt


1 byte guardado por Quentin. Gracias.

bolov
fuente
1
Se puede guardar un byte utilizando intcomo tipo de retorno :)
Quentin
De hecho, los autoparámetros de la función no llegaron a C ++ 17; y tampoco int f() { ... }, a;es una declaración legal la última vez que lo revisé. (No puede mezclar declaraciones de funciones con declaraciones de variables como esa). Lo que tiene aquí es un dialecto de C ++ extremadamente específico de GCC. No es que haya nada malo con eso en este contexto. :)
Quuxplusone
19

Lisp común, 8 bytes

#.(loop)

El compilador intentará leer un formulario y se encontrará con la macro del lector de puntos de sharpsign , que evalúa el código en el momento de la lectura y utiliza su resultado como el formulario para compilar. Aquí, el código que se ejecuta es un bucle infinito.

volcado de memoria
fuente
17

TeX, 9 bytes

\def~{~}~

TeX funciona expandiendo macros. La mayoría de las veces, las macros de TeX (también llamadas secuencias de control ) tienen la forma \namepero también es posible definir ciertos caracteres como macros, estos se llaman caracteres activos . El carácter ~está activo de forma predeterminada en TeX simple y, por lo tanto, se puede utilizar como un nombre de macro sin más declaraciones. El \def~{~}en lo anterior define ~para que se expanda a ~. Es decir, cada vez que TeX se encuentra ~, lo reemplaza por ~y luego vuelve a examinar el reemplazo, lo que significa que encuentra una ocurrencia completamente nueva ~y lo reemplaza por ~. Esto define el bucle infinito. Todo lo que se necesita es comenzar el ciclo y eso es lo que hace el final ~.


Agregado en editar

Para hacer esto correctamente compilado , invoque como:

pdftex -ini "&pdftex \def~{~}~"

La -inibandera dice que pdftexdebería compilar un nuevo archivo de formato. Este es un conjunto de definiciones precompiladas que se pueden cargar cuando se invoca TeX más tarde para acelerar el procesamiento de un documento (LaTeX2e es un ejemplo de esto). Supongo que &pdftexagrega algunos bytes, llevando el total a 17.

Espacio de bucle
fuente
¿Esto sucede en tiempo de compilación? La pregunta requiere que ocurra el bucle infinito durante la compilación, no cuando se ejecuta.
@ ais523 No había pensado completamente en eso. Estaba hablando de la respuesta TikZ. He agregado una alternativa que definitivamente se compila, a expensas de unos pocos bytes más.
Loop Space
2
@ ais523: Como siempre, "compilar" y "correr" son dos caras de la misma moneda. Personalmente, pienso en el código fuente de TeX como "compilación" en documentos PDF (que luego se "ejecutan" visualizando), de la misma manera que el código fuente de C ++ se "compila" en archivos .exe (que luego son "ejecutados" por corriendo). Pero también podría pensar en el pdftexprograma como "interpretando" la entrada de TeX para producir un PDF como "salida", de la misma manera que el g++programa "interpreta" la entrada de C ++ para producir un archivo .exe como "salida". ;)
Quuxplusone
13

Haskell, 25 + 17 = 42 bytes

a= $(let a='a':a in[|a|])

Un metaprograma simple de Haskell que define un valor infinito e intenta calcular ese valor en tiempo de compilación.

Invoque con ghc -XTemplateHaskell <file.hs>(+17 para el parámetro al compilador)

usuario2407038
fuente
¿ $(let a=a in a)No funciona (para 32 bytes)?
Ry-
1
¡No! GHC es demasiado inteligente. Cualquier bucle infinito del formulario let a = a in ase reescribe en una excepción, lo que simplemente provoca un error del compilador en lugar de un bucle infinito. (aunque tal vez esto funcionaría con un compilador Haskell diferente, pero no tengo uno para probar)
user2407038
Funciona con runghc para mí, por lo que diría que es válido. (En realidad, también funciona con ghc. 8.0.1 aquí.)
Ry-
De Verdad? También estoy en ghc 8.0.1, para mí Exception when trying to run compile-time code: <<loop>>, tanto en el intérprete como al compilar ... técnicamente, el código anterior también muere con una excepción, pero un desbordamiento de pila, que está explícitamente permitido por la especificación: y si tuvieras memoria infinita, realmente se repetiría para siempre. La <<loop>>excepción se dispara mucho antes de que mi máquina se quede sin memoria.
user2407038
12

gradle, 10 9 bytes

for(;;){}

con el código anterior colocado en un build.gradlearchivo. Gradle usa groovy como su lenguaje base, por lo que realmente estamos hablando de groovy aquí, pero como la pregunta era sobre el tiempo de construcción, pensé que gradle sería más apropiado.

La ejecución de cualquier comando de compilación de Gradle con el código anterior imprime la línea de estado de compilación compatible con el jefe puntiagudo:

$ gradle tasks
> Configuring > 0/1 projects > root project

Si está buscando un aumento, agregue el -dindicador de depuración para:

$ gradle -d tasks
14:56:25.522 [INFO] [org.gradle.internal.nativeintegration.services.NativeServices] Initialized native services in: .gradle/native
14:56:25.757 [DEBUG] [org.gradle.launcher.daemon.client.DaemonClient] Executing build 84908c0d-f28d-4c57-be61-40eaf0025e16.1 in daemon client {pid=27884}
14:56:25.761 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface tun0
14:56:25.762 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? false
14:56:25.762 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a multicast interface? false
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x:x:x:x:x:x:%tun0
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x.x.x.x
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface eth1
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? false
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a multicast interface? true
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x:x:x:x:x:x:%eth1
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /x.x.x.x
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote multicast interface eth1
14:56:25.764 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface lo
<snip>
14:57:07.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
14:57:07.056 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
14:57:07.056 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
14:57:07.056 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
> Configuring > 0/1 projects > root project

que además de verse impresionantemente complicado también se actualiza con un nuevo conjunto de:

15:07:57.054 [DEBUG] [org.gradle.launcher.daemon.server.Daemon] DaemonExpirationPeriodicCheck running
15:07:57.054 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
15:07:57.054 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
15:07:57.055 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.

líneas de estado cada 10 segundos, lo que hace que parezca que la compilación está ocupada haciendo importantes cosas técnicas ...

Matias Bjarland
fuente
8

SWI-Prolog, 34 bytes

term_expansion(_,_):-repeat,1=0.

Explicación

term_expansion/2 es algo que el compilador llama automáticamente antes de compilar el código para transformar algunos términos del código fuente en otros.

A continuación, se introduce una nueva regla para term_expansion/2: repeat,1=0..

repeat/0 es un predicado que siempre tiene éxito y proporciona un número infinito de puntos de elección.

1=0está tratando de unificar 1con 0, que siempre es false. Esto hará que el compilador retroceda repeat(ya que siempre proporciona un punto de elección) e intente 1=0nuevamente, etc.

Fatalizar
fuente
No funciona en GNU Prolog, por lo que supongo que esto es específico de la implementación. Es posible que desee poner el nombre de un compilador en el encabezado. (
@ ais523 Gracias, no comprobé otras distribuciones, pero como el material del compilador suele ser bastante específico, debería haberlo sabido mejor ...
Fatalize
@ ais523 Sin embargo, de acuerdo con esto , es posible que pueda usar expand_termen su lugar (como se dice term_expansion, no se puede usar como aquí en GNU Prolog). Sin embargo, no funciona con expand_termSWI.
Fatalize
7

GNU Make, 44

.PHONY:x
$(MAKEFILE_LIST):x;sleep 1;touch $@

No puedo reclamar crédito por esto. Se deriva del libro de Robert Mecklenburg Gestión de proyectos con GNU Make: El poder de GNU Make para construir cualquier cosa .

Cuando make ejecuta este archivo MAKE, ve que el archivo MAKE está desactualizado (porque el objetivo .PHONY está desactualizado, por lo que ejecuta el comando táctil, que actualiza la marca de tiempo del archivo MAKE. Luego, make vuelve a leer el archivo y descubre el makefile está desactualizado ... Bueno, ya tienes la idea.

Prefiero esto a la otra respuesta de respuesta porque no utiliza la recursividad. En mi VM, la otra respuesta Make continúa los procesos de bifurcación y en algún lugar alrededor de 7,000 de profundidad, la VM se detiene por completo. Sin embargo, con esta respuesta puede continuar indefinidamente sin consumir recursos del sistema. Realmente podrás relajarte con esta construcción. He pasado más de 1,000,000 iteraciones sin degradación aparente del sistema.

Tenga en cuenta que tuve que agregar el sleep 1para que la marca de tiempo del archivo MAKE se actualice realmente cada vez. Puede cambiar esto sleep 0.01si desea que se queme a través de iteraciones un poco más rápido.

5 revoluciones
fuente
6

GNU Forth, 15 bytes

Golfed

: : [do] [loop]

Vuelve a definir (vuelve a compilar) la palabra :e invoca un bucle infinito inmediato [do] [loop]dentro de la nueva definición (justo en el momento de la compilación).

Una categoría de palabras no se compila. Estas llamadas palabras inmediatas se ejecutan (se realizan ahora) independientemente de si el intérprete de texto está interpretando o compilando.

¡Pruébelo en línea!

zepelín
fuente
5

Clojure, 21 bytes

(defmacro a[]`(a))(a)

Vincula el compilador definiendo una macro que emite repetidamente llamadas para sí mismo.

En mi teléfono, esto hace que REPL se cuelgue y retrase el dispositivo. En mi computadora portátil, esto falla por completo con un StackOverflow.

Desafortunadamente, el StackOverflow ocurre instantáneamente, pero sigue siendo válido según las reglas.

Carcigenicate
fuente
5

MSBuild, 130 bytes

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="X">
        <Exec Command="msbuild"/>
    </Target>
</Project>

Guarde esto como un archivo con .projextensión y ejecútelo msbuilddesde el símbolo del sistema. MSBuild ejecutará su único objetivo que simplemente genera otro msbuildproceso.

Danko Durbić
fuente
¿Se requiere la sangría para que esto funcione? ¿Qué pasa con las nuevas líneas? Normalmente es posible jugar golf en espacios en blanco.
No, es más fácil de leer. El recuento de caracteres no incluye espacios en blanco.
Danko Durbić
1
Ah bien. En ese caso, probablemente deberías mencionar eso en el cuerpo de la publicación.
5

C, 31 bytes

main[-1llu]={1};

Inspirado en el trauma digital . Compilar con la -mcmodel=mediumbandera.

Buena suerte compilando esto, necesitará 1.8 yottabytes de RAM y espacio en disco.

MD XF
fuente
4

Mathematica 33 Bytes

Compile[{},Evaluate@While[True,]]

El código intentará evaluar simbólicamente el argumento antes de la compilación, y el argumento en sí mismo es un bucle infinito. La función While tiene un segundo argumento nulo ya que no es importante.

Kelly Lowder
fuente
"antes de la compilación" Sí ... no.
CalculatorFeline
Proporcione un argumento válido. reference.wolfram.com/language/tutorial/…
Kelly Lowder
La pregunta es, ¿ocurre el bucle durante la Compilellamada o antes?
CalculatorFeline
3

Haskell (GHC, sin Template Haskell o reglas de reescritura personalizadas) , 138

{-#LANGUAGE FlexibleContexts,UndecidableInstances#-}
data A x=A
class C y where y::y
instance C(A(A x))=>C(A x)where y=A
main|A<-y=pure()

Teóricamente, esto entra en un bucle infinito de la misma manera que lo hace el enfoque de C ++ : el método polimórfico yse instancia a tipos cada vez más intrincados. En la práctica, el tamaño de pila asignado predeterminado se desborda rápidamente:

$ ghc-7.10 wtmpf-file14146.hs 
[1 of 1] Compiling Main             ( wtmpf-file14146.hs, wtmpf-file14146.o )

wtmpf-file14146.hs:5:9:
    Context reduction stack overflow; size = 101
    Use -fcontext-stack=N to increase stack size to N
      C (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A (A t0))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
    In a stmt of a pattern guard for
                   an equation for ‘main’:
      A <- y
    In an equation for ‘main’: main | A <- y = pure ()

Créditos a Luke Palmer .

dejó de girar en sentido antihorario
fuente
1

Haskell (ghc), 32 + 2 = 34 bytes

{-#RULES""main=main#-}
main=main

correr con ghc -O <file>. Activa una regla de reescritura para la función principal que reescribe en la misma cosa. La única característica desafortunada es que ghc es lo suficientemente inteligente como para detectar esto y detenerse después de 100 iteraciones. No sé de una manera fácil de deshabilitar este comportamiento.

Programa hombre
fuente
1

Boo, 25 bytes

macro l:
 x=0 while 1>0
l

Esto define una macro, que se ejecuta en tiempo de compilación, que ejecuta un bucle infinito, y luego invoca la macro.

Mason Wheeler
fuente
1

Óxido, 18 bytes

include!(file!());

Clásico autoincluido. Sin embargo, Rustc es molestamente cuerdo, y por defecto se rescatará después de 128 recursiones, y se expande primero en profundidad, por lo que el crecimiento exponencial tampoco funciona. Sin embargo, lo mismo se aplica a las soluciones C y C ++.

Nombre de usuario censurado
fuente
0

Factor , 29 16

<< [ t ] loop >>

La parte entre << >> se ejecuta en tiempo de análisis.

En cuanto a que [ t ] loop hace, te dejaré adivinar ...

Puede poner eso en el Listener tal cual, o agregarlo a cualquier vocabulario o archivo de script con el correspondiente material repetitivo.

fede s.
fuente
0

PHP, 19 bytes

<?include __FILE__;
MD XF
fuente