Sou desenvolvedor e não tenho vontade de fazer meu trabalho. Sei do XKCD que a melhor desculpa para relaxar é que seu código está compilando . Por isso, acho que preciso de um código que seja compilado para sempre! E como sou preguiçoso e não quero digitar muito, isso deve ser feito com o menor código possível.
Portanto, sua tarefa é escrever um programa que seja sintaticamente válido, mas fará com que o compilador insira um loop infinito.
Especificações
- Você deve usar uma linguagem que tenha um compilador, obviamente.
- Especifique a implementação usada em cada solução.
- Isso é código-golfe , então a solução válida mais curta (em bytes) vence.
- O compilador pode terminar de ficar sem memória ou espaço na pilha.
code-golf
compile-time
Esolanging Fruit
fonte
fonte
Java
: defina um processador de anotações (trecho de ideone) que você usará quando invocarjavac
com seu-processor
opção. Faz a compilação de qualquer classe travar para sempre.Respostas:
Japonês , 2 bytes
Você pode testar isso on-line aqui , mas eu não o recomendaria, pois congelará seu navegador.
Explicação
Japt usa a biblioteca shoco para compactar seqüências de caracteres. Um backtick diz ao compilador para descompactar tudo até o próximo backtick ou o final do arquivo. Cada byte faz o seguinte:
00-7F
são deixados intactos.80-BF
cada transformar em um par de duas letras minúsculas comum (at
,oo
,th
, etc.).C0-DF
cada um consome o próximo byte e se transforma em uma sequência comum de quatro letras .E0-EF
cada um consome os próximos três bytes e se transforma em uma sequência de oito letras "comum" (iniciandoWhererer
e descendo a partir daí).F0-F7
quebre o descompactador, embora ele ainda retorne tudo até o byte de quebra.F8-FF
faça com que o descompressor entre em um loop infinito. Não sei por que, pois não estou muito familiarizado com o funcionamento interno da biblioteca shoco (e o código JavaScript é completamente ilegível ), mas é bastante útil nesse caso.Eu não acredito que haja outra maneira de mexer com o compilador Japt, mas você nunca sabe ...
fonte
TikZ (pdfTeX 3.14159265-2.6-1.40.17),
857974242221 bytesVários bytes salvos graças ao wchargin
Um byte economizado graças a Chris H
Na verdade, eu encontrei esse por acidente quando estava trabalhando na lição de casa. Passei um bom tempo esperando compilar antes de perceber o que estava acontecendo.
Isso tem duas partes:
Isso carrega o pacote TikZ
e:
Isso inicia um
\tikz
ambiente e um comando de desenho.O que está acontecendo
O compilador pdflatex tem problemas
\tikz\pic
e entra no modo interativo, causando a interrupção indefinidamente.fonte
\draw l\end {document}
arquivo foi finalizado durante a verificação de uso de\tikz@next.
" pdflatex 3.1415926-2.5-1.40.14 (TeX Live 2013 / Debian). tikz 13/10/2010 v2.10. Isso é padrãoapt install texlive-full
no Ubuntu 14.04.pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016)
e efetivamente faz um loop indefinidamente. Obrigado pelas dicas.\pic
em vez de \ draw` - exatamente o mesmo comportamento (testado usando TikZ 1.142)\def\a{\a}\a
(12 bytes)? Ou, como esse é o código golf e~
está ativo por padrão\def~{~}~
(9 bytes)?C, 18 bytes
Os compiladores geralmente desistem após repetir cerca de 200 vezes.
A construção do DOM conta como uma etapa de compilação? Se sim, então
x.htm
:fonte
<?include __FILE__;
.Java,
10295898878 bytesIsso termina com o
StackOverflowError
que acontece porque o sistema de resolução genérico não pode decidir uma raiz na qual resolver os outros genéricos.Créditos quando vencidos .
o que acontece aqui?
A<T>
está lá apenas para ter um pai de uma letra. É genérico. Eu poderia ter usadoList
, mas as importações e a repetição de 4 letras são muito longas.B<T>
declara um genérico básico.B extends A
é necessário ter uma hierarquia entreB
eA
.extends A<A>
cria uma auto-referência emA<T>
.A<? super B>
aciona a pesquisa de genéricos emA<T>
B<B<T>>
cria uma auto-referência emB<T>
.A<...> a=new B<>()
força o uso dos genéricos, em vez de simplesmente defini-los, forçando a resolução ao compilarB
e não posteriormente.A<?super B
cria uma não referência própria, portanto, temos uma referência a um tipo e a outro nos genéricos deA
.B<A>
cria uma não referência própria, portanto, temos uma referência a um tipo e a outro nos genéricos deB
.Agora, o tipo
A
tem o tipo genéricoA
eB
, mas qual deve ser escolhido? Esqueça a si mesmo, vamos tentar resolverB
. Ping.Ok,
B
tem o tipo de genéricosA
eB
, mas qual deve ser escolhido? Esqueça a si mesmo, vamos tentar resolverA
. Pong.Este tipo de recursão não pode realmente ser evitada porque há casos legítimos como
A<B<A<B<A<B<Object>>>>>>
: por exemplo, um objeto JSON:List<Map<String,Map<String,List<Map<String,List<String>>>>>>
.Resultado da compilação
No meu sistema, o rastreamento da pilha para depois de mostrar 1024 linhas, que são na verdade as 4 mesmas linhas repetidas 256 vezes, provando uma recursão infinita. Vou poupar todo esse vestígio.
Poupança
interface
+implements
porclass
+extends
.Long
porA
(duas vezes).new B<A>()
→new B<>()
).fonte
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
B
contém uma referência indecidível ao genérico, oA
qual, por sua vez, contém uma referência indecidível ao genérico de B. Quando o resolvedor não pode decidir, ele verifica as referências incluídas, mas aqui os dois genéricos se referem um ao outro de forma undecidable (principalmente graças às referências auto easuper
palavra-chave para o resolvedor realmente ping-pongs entre os dois genéricos..public @interface X {@X(x=X.class)Class<? extends X> x();}
... Mas rapidamente percebi por que isso não funcionaria lol.Makefile GNU,
87 bytesUm byte salvo graças ao KonradRudolph
Salvo como
Makefile
e invocado pormake
:Isso produzirá uma recursão infinita de compilação no primeiro destino encontrado
"x"
.Escusado será dizer que você realmente não deseja executar esta bomba de fork no seu servidor de produção. :-)
Versão alternativa, 5 bytes
Sugerida por KonradRudolph:
$_
é uma referência ao último argumento do comando anterior. Mais especificamente, é resolvido aqui como o caminho absoluto para o comando que está sendo executado - que é omake
próprio.Isso deve funcionar bem em um ambiente Bash genuíno, mas não no Windows + MinGW.
fonte
make
não compila realmente o Makefile (apenas o interpreta).C ++,
6058Isso cria recursivamente instâncias
class a
com diferentes parâmetros de modelo. O GCC 7.0 para após 900 níveis de recursão com muitos erros sobreoperator->
ser privado, mas, por exemplo, o ICC 17 e o Microsoft (R) C / C ++ Optimizing Compiler 19 atingem o limite de tempo .O problema é que provavelmente todos os compiladores ficarão sem memória em algum momento, portanto, mesmo sem limites de recursão, isso será interrompido. O mesmo provavelmente se aplica à resposta Clojure também.
Edit: 2 bytes salvos por bolov - Obrigado
fonte
a<int>i=i->b;
operator->
padrão é privado dentro de uma classe. Dentro de uma estrutura é público e, portanto,i->b
pode acessá-lo.Perl ,
1513 bytesExperimente online!
Agora, com 2 bytes salvos: @Zaid me lembrou de uma maneira terser de fazer um loop no Perl.
Isso é bem simples: ele instala apenas um gancho do analisador com um loop infinito, tornando o código demorado infinitamente para analisar. (O Perl é bom, pois permite executar código arbitrário no meio da análise; os ganchos do analisador são especificados no próprio Perl e costumam ser usados para fazer coisas como importar bibliotecas ou alterar as regras de análise para um identificador que você deseja tratar como uma palavra-chave.) O Experimente online! O link acima fornece a
-c
opção (compilar o código para verificar se a sintaxe está correta, mas não executá-lo), para provar que o loop infinito acontece no momento da compilação.Caso você esteja se perguntando sobre o "tempo de compilação" em uma linguagem de script: o Perl realmente compila no bytecode e depois executa o bytecode, mas esse é um detalhe que raramente é relevante na programação. A
-MO=
família de opções da linha de comando pode ser usada para executar outras ações com o bytecode (exceto com este programa, pois o loop infinito ocorre antes que o bytecode possa ser gerado).fonte
a:goto a
parece bom também (mesmo bytecount infelizmente).BEGIN{{redo}}
irá economizar alguns bytesC ++,
37.3029 bytesEle usa o futuro parâmetro de função automática. Foi proposto no C ++ 17, mas acho que não foi possível.
gcc
no entanto, suporta isso como uma extensão.Basicamente
é equivalente a
O código tenta instanciar
f
recursivamente com diferentes argumentos de modelo.gcc
falha comCom
-ftemplate-depth=10000
isso, cuspi "Tempo morto de processamento excedido" no godbolt.Confira no godbolt
1 byte salvo por Quentin. Obrigado.
fonte
int
como o tipo de retorno :)auto
parâmetros de função não chegaram ao C ++ 17; e tambémint f() { ... }, a;
não é uma declaração legal da última vez que verifiquei. (Você não pode misturar declarações de função com declarações de variáveis como essa.) O que você tem aqui é um dialeto C ++ extremamente específico para o GCC. Não que haja algo errado com isso neste contexto. :)Lisp comum, 8 bytes
O compilador tentará ler um formulário e encontrará a macro do leitor de ponto sharpsign , que avalia o código no tempo de leitura e usa seu resultado como o formulário para compilar. Aqui, o código que está sendo executado é um loop infinito.
fonte
TeX, 9 bytes
O TeX funciona expandindo macros. Na maioria das vezes, as macros do TeX (também chamadas de seqüências de controle ) são da forma,
\name
mas também é possível definir certos caracteres como macros, chamados de caracteres ativos . O caractere~
está ativo por padrão no TeX comum e, portanto, pode ser usado como um nome de macro sem declaração adicional. O\def~{~}
descrito acima define~
para que ele se expanda para~
. Ou seja, sempre que o TeX o encontra~
, o substitui~
e reexamina a substituição, o que significa que encontra uma ocorrência totalmente nova~
e a substitui por~
. Isso define o loop infinito. Tudo o que é necessário é iniciar o loop e é isso que a final~
faz.Adicionado na edição
Para fazer isso adequadamente compilado , chame como:
A
-ini
bandeira diz quepdftex
deve compilar um novo arquivo de formato. Este é um conjunto de definições pré-compiladas que podem ser carregadas quando o TeX é posteriormente chamado para acelerar o processamento de um documento (o LaTeX2e é um exemplo disso). Eu acho que o&pdftex
adiciona alguns bytes, levando o total para 17.fonte
pdftex
programa como "interpretar" a entrada TeX para produzir um PDF como "saída" - da mesma maneira que og++
programa "interpreta" a entrada C ++ para produzir um arquivo .exe como "saída". ;)Haskell, 25 + 17 = 42 bytes
Um metaprograma simples de Haskell que define um valor infinito e tenta calcular esse valor no tempo de compilação.
Chamar com
ghc -XTemplateHaskell <file.hs>
(+17 para o parâmetro para o compilador)fonte
$(let a=a in a)
funciona (para 32 bytes)?let a = a in a
é reescrito para uma exceção, que simplesmente causa um erro do compilador em oposição a um loop infinito. (embora talvez isso iria funcionar com um compilador Haskell diferente, mas eu não tenho um na mão para tentar)Exception when trying to run compile-time code: <<loop>>
, tanto no intérprete quanto na compilação ... tecnicamente, o código acima também morre com uma exceção, mas um estouro de pilha, o que é explicitamente permitido pela especificação - e se você tivesse memória infinita, ela realmente funcionaria para sempre. A<<loop>>
exceção é acionada muito antes de minha máquina ficar sem memória.gradle,
109 bytescom o código acima colocado em um
build.gradle
arquivo. Gradle usa o groovy como idioma de base, então estamos realmente falando sobre o groovy aqui, mas como a pergunta era sobre o tempo de construção, imaginei que o gradle seria mais apropriado.A execução de qualquer comando gradle build com o código acima imprime a linha de status da compilação compatível com o chefe pontudo:
se você está buscando um aumento, adicione o
-d
sinalizador de depuração para:que, além de parecer impressionantemente complicado, também é atualizado com um novo conjunto de:
linhas de status a cada 10 segundos, fazendo com que pareça que a compilação está ocupada fazendo coisas importantes ... técnicas.
fonte
SWI-Prolog, 34 bytes
Explicação
term_expansion/2
é algo que é chamado automaticamente pelo compilador antes de realmente compilar o código para transformar alguns termos no código-fonte em outros termos.Aqui, introduzimos uma nova regra para
term_expansion/2
:repeat,1=0.
.repeat/0
é um predicado que sempre tem êxito e fornece um número infinito de pontos de escolha.1=0
está tentando unificar1
com0
, que é semprefalse
. Isso fará com que o compilador retornerepeat
(já que sempre fornece um ponto de opção) e tente1=0
novamente, etc.fonte
expand_term
(como dizterm_expansion
não pode ser usado como aqui no GNU Prolog).expand_term
Porém, ele não funciona no SWI.GNU Make, 44
Não posso reivindicar crédito por isso. É derivado do livro de Robert Mecklenburg, Gerenciando Projetos com o GNU Make: O Poder do GNU Make for Building Anything .
Prefiro isso ao outro Faça a resposta porque não usa recursão. Na minha VM, a outra resposta do Make continua a bifurcar os processos e, com cerca de 7.000 de profundidade, a VM é interrompida sem resposta. No entanto, com esta resposta, é possível continuar indefinidamente sem consumir os recursos do sistema. Você realmente será capaz de relaxar com essa compilação. Eu já fiz mais de 1.000.000 de iterações sem degradação aparente do sistema.
Observe que eu precisei adicionar o
sleep 1
para que o timestamp do makefile seja realmente atualizado sempre. Você pode alterar isso parasleep 0.01
se desejar gravar as iterações um pouco mais rápido.fonte
GNU adiante, 15 bytes
Golfe
Redefine (recompila) a palavra
:
e chama um loop infinito imediato[do] [loop]
dentro da nova definição (logo no momento da compilação).Experimente Online!
fonte
Clojure, 21 bytes
Vincula o compilador, definindo uma macro que emite repetidamente chamadas para si mesma.
No meu telefone, isso faz com que o REPL desligue e atrase o dispositivo. No meu laptop, isso falha totalmente com um StackOverflow.
Infelizmente, o StackOverflow acontece instantaneamente, mas ainda é válido de acordo com as regras.
fonte
MSBuild, 130 bytes
Salve isso como um arquivo com
.proj
extensão e executemsbuild
no prompt de comando. O MSBuild executará seu único destino, o que simplesmente gera outromsbuild
processo.fonte
C, 31 bytes
Inspirado pelo Trauma Digital . Compile com a
-mcmodel=medium
bandeira.Boa sorte ao compilar isso, você precisará de 1,8 yottabytes de RAM e espaço em disco.
fonte
Mathematica 33 Bytes
O código tentará avaliar simbolicamente o argumento antes da compilação, e o próprio argumento é um loop infinito. A função While possui um segundo argumento nulo, pois não é importante.
fonte
Compile
chamada ou antes dela?Haskell (GHC, sem Template Haskell ou regras de reescrita personalizadas) , 138
Teoricamente, isso entra em um loop infinito da mesma maneira que a abordagem C ++ : o método polimórfico
y
é instanciado para tipos cada vez mais complicados. Na prática, o tamanho padrão da pilha alocada transborda rapidamente:Créditos a Luke Palmer .
fonte
Haskell (ghc), 32 + 2 = 34 bytes
corra com
ghc -O <file>
. Dispara uma regra de reescrita para a função principal que reescreve para a mesma coisa. O único recurso lamentável é que o ghc é inteligente o suficiente para detectar isso e parar após 100 iterações. Não conheço uma maneira fácil de desativar esse comportamento.fonte
Boo, 25 bytes
Isso define uma macro, que é executada em tempo de compilação, que executa um loop infinito e, em seguida, chama a macro.
fonte
Ferrugem, 18 bytes
Auto-inclusão clássica. A Rustc é irritantemente sã e, por padrão, será resgatada após 128 recursões, e se expandirá primeiro para que o crescimento exponencial também não funcione. O mesmo se aplica às soluções C e C ++.
fonte
Fator ,
2916A parte entre
<<
>>
é executada no momento da análise.Quanto ao que
[ t ] loop
faz, eu vou deixar você adivinhar ...Você pode colocá-lo no Listener como está ou adicioná-lo a qualquer arquivo de vocabulário ou script com as informações correspondentes.
fonte
PHP, 19 bytes
fonte