Найкоротший код, який легітимно втрачається


146

Я розробник, і мені не хочеться робити свою роботу. Я знаю з XKCD, що найкращим приводом для розшарування є те, що ваш код складається . Через це, я думаю, мені потрібен якийсь код, який буде зібраний назавжди! А оскільки я лінивий і не хочу вводити багато, це потрібно робити з найкоротшим можливим кодом.

Отже, ваше завдання - написати програму, яка є синтаксично дійсною, але змусить компілятор ввести нескінченний цикл.

Технічні умови

  • Ви повинні використовувати мову, яка має компілятор, очевидно.
  • Вкажіть реалізацію, яка використовується у кожному рішенні.
  • Це , тому найкоротше діюче рішення (у байтах) виграє.
  • Компілятор може припинити втрату пам'яті або місця у стеку.

1
@obarakon Я не згоден. Код з іншого виклику не можна легко перенести на цей виклик. Проблеми, в той час як обидва пов'язані з нескінченним циклом, принципово відрізняються.
Сріотчілізм О'Заїк

1
@obarakon Не є справжнім питанням , оскільки це не код-гольф.
Esolanging Fruit


1
Я не впевнений, що він відповідає цьому виклику (і навіть якщо це зробить, він отримав би жахливий результат), але для тих, хто цікавиться ось як я це зробив би Java: визначте процесор анотацій (фрагмент ідеону), який ви будете використовувати при виклику javacз його -processorваріант. Це змушує складання будь-якого класу повісити назавжди.
Аарон

6
Що стосується відповідей, які призводять до збоїв компілятора: Я б подумав, що ви все ще хочете, щоб це зайняло стільки часу, скільки зможете вийти з ладу.
GuitarPicker

Відповіді:


16

Japt , 2 байти

`ÿ

Ви можете протестувати це в Інтернеті тут , але я б не рекомендував його, оскільки він застигне ваш браузер.

Пояснення

Japt використовує бібліотеку шоко для стискання струн. Зворотний зв'язок повідомляє компілятору розпакувати все до наступного зворотного вибору або до кінця файлу. Кожен байт виконує наступні дії:

  • 00-7F залишаються недоторканими.
  • 80-BFкожне перетворення в загальні рядкові дволітерні пари ( at, oo, thі т.д.).
  • C0-DFкожен споживає наступний байт і перетворюється на загальний чотирибуковий рядок .
  • E0-EFкожен споживає наступні три байти і перетворюється на "загальну" восьмибуквену рядок (починаючи Wherererзвідти і спускаючись вниз).
  • F0-F7 розбити декомпресор, хоча він все одно повертає все до байта, що розбивається.
  • F8-FFвикликати потрапляння декомпресора в нескінченну петлю. Я не впевнений, чому це так, оскільки я не дуже добре знайомий з внутрішньою роботою бібліотеки shoco (а код JavaScript абсолютно нечитабельний ), але в цьому випадку це досить зручно.

Я не вірю, що є інший спосіб зіпсувати компілятор Japt, але ви ніколи не знаєте ...


10
Що ти маєш на увазі, що це не читається. Очевидно, що ви просто не дуже стараєтесь.
fəˈnɛtɪk

Я хотів би, щоб був емскріпний декомпілятор ...
tbodt

58

TikZ (pdfTeX 3.14159265-2.6-1.40.17), 85 79 74 24 22 21 байт

Купа байтів збережена завдяки wchargin

Один байт збережено завдяки Крісу Н

\input tikz
\tikz\pic

Я справді стикався з цим випадково, коли працював над домашніми завданнями. Я витратив досить довгий час, чекаючи, коли він складеться, перш ніж зрозумів, що відбувається.

Це дві частини:

\input tikz

Це завантажує пакет TikZ

і:

\tikz\pic

Тут запускається \tikzсередовище та команда малювання.

Що відбувається

Компілятор pdflatex має проблеми \tikz\picі входить в інтерактивний режим, через що він затримується на невизначений термін.


(1/2) Я не можу це відтворити. Я отримую "Аргумент втікача ? \draw l\end {document}! Файл закінчився під час сканування використання \tikz@next." pdflatex 3.1415926-2.5-1.40.14 (TeX Live 2013 / Debian). tikz 2010/10/13 v2.10. Це є стандартним apt install texlive-fullдля Ubuntu 14.04.
wchargin

1
@wchargin Я використовую ту саму версію, pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016) і вона справді циклічно невизначена. Дякую за поради.
Сріотчілізм О'Заїк

1
Ви можете зберегти байт, використовуючи \picзамість \ draw` - точно таку саму поведінку (протестовано за допомогою tikz 1.142)
Кріс Х

3
Я не можу повірити, що я фактично виступаю за те, щоб не використовувати TikZ, але, безумовно, використання цього є надмірним. Що старого зі старим \def\a{\a}\a(12 байт)? Або, оскільки це код гольфу і ~він активний за замовчуванням \def~{~}~(9 байт)?
Loop Space

2
@LoopSpace З ними нічого поганого, я просто не знав, що існує. Якщо ви хочете зробити власну відповідь, тоді не соромтеся.
Сріотчілізм О'Заїк

40

C, 18 байт

#include __FILE__

Зазвичай компілятори відмовляться після рецидивів приблизно в 200 разів.

Чи вважає побудова DOM етапом компіляції? Якщо так, то x.htm:

<iframe src=x.htm>

14
Я пам’ятаю, що рекурсивні набори кадрів використовували для того, щоб зруйнувати IE4 настільки сильно, що іноді він знімав із себе важливі компоненти ОС. Тож HTML, мабуть, нараховується.

10
@ ais523, це тому, що за дні IE4 Internet Explorer був "важливим компонентом ОС".
Марк

2
Трохи тонкої настройки і дійсно PHP: <?include __FILE__;.
Ісмаель Мігель

6
Не можу опублікувати цю відповідь, оскільки мій представник недостатньо високий, але два варіанти: #include "/ dev / zero" та #include "/ dev / stdin" - будьте обережні, запускаючи першу !!
rrauenza

2
Коли я спробував це, використання пам'яті gcc почало швидко зростати без обмежень, система стала не реагувати, і мій сторожовий кінець зрештою запустив і перезавантажив. Це було досить кумедно :)
rrauenza

38

Java, 102 95 89 88 78 байт

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

Це закінчується тим, StackOverflowErrorщо відбувається, тому що загальна система роздільної здатності не може вирішити корінь, на основі якого можна вирішити інші дженерики.

Кредити, де належні .

Що тут відбувається?

  1. A<T>якраз там, щоб мати батьків з 1 літер. Це загальне. Я міг би використати List, але імпорт та повторення 4 листів занадто довгі.
  2. B<T> оголошує основний родовий.
  3. B extends AПотрібно мати ієрархію між Bта A.
  4. extends A<A>створює самовідвід на A<T>.
  5. A<? super B> запускає пошук для генеричних даних на A<T>
  6. B<B<T>>створює самонавіювання на B<T>.
  7. A<...> a=new B<>()змушує використовувати генеричні засоби, а не просто їх визначення, примушуючи роздільну здатність при компілюванні B, а не після цього.
  8. A<?super Bстворює несанкціоновану посилання, тому ми маємо як посилання на один тип, так і на інший у генеріках A.
  9. B<A>створює несанкціоновану посилання, тому ми маємо як посилання на один тип, так і на інший у генеріках B.

Тепер, тип Aмає тип дженериків Aі B, але який повинен бути обраний? Забудь про себе, спробуймо вирішити B. Пінг.

Добре, Bмає тип дженериків Aі B, але який повинен бути обраний? Забудь про себе, спробуймо вирішити A. Понг.

Такого роду рекурсії реально не уникнути, оскільки існують законні випадки, наприклад A<B<A<B<A<B<Object>>>>>>: наприклад, об'єкт JSON : List<Map<String,Map<String,List<Map<String,List<String>>>>>>.

Результат компіляції

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

У моїй системі слід стека зупиняється після показу 1024 рядків, які насправді є 4-ма такими ж рядками, повтореними 256 разів, тим самим доводячи нескінченну рекурсію. Я пошкодую тебе цілий слід.

Економія

  1. 102 → 95 байт: замінено interface+ implementsна class+ extends.
  2. 95 → 89 байт: замінено Longна A(двічі).
  3. 89 → 88 байт: використовуваний алмазний оператор ( new B<A>()new B<>()).
  4. 88 → 78 байт: перемістив декларацію змінної до класу, завдяки VoteToClose .

1
На що я дивлюся
Аддісон Кримп

Ви можете скоротити це до 78 байтів за допомогою:class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
Addison Crump

@VoteToClose Ви дивитесь на головний приклад нерозбірливості в дженеріках Java. Кожен родовий розділ повинен вирішуватися проти загального кореня, до якого потім підтверджується. Тут річ у тому, що загальне Bмістить містить невизначене посилання на загальне, Aяке, у свою чергу, містить нерозбірливе посилання на загальне В. Коли резолютор не може прийняти рішення, він перевіряє включені посилання, але тут обидва дженерики посилаються один на одного не визначимо (здебільшого завдяки власним посиланням та superключовим словом. Отже, резолюція насправді пінг-понг між двома дженериками.
Олів'є Грегоар

Я думав над тим, щоб створити проблему з компіляцією в часі з циклічними анотаціями: public @interface X {@X(x=X.class)Class<? extends X> x();}... Але я швидко зрозумів, чому це не вийде, хаха.
Чарівна урва восьминога

34

GNU Makefile, 8 7 байт

Один байт збережено завдяки KonradRudolph

Збережено як Makefileі на нього посилається make:

x:;make

Це призведе до нескінченної рекурсії побудови на першій знайденій цілі "x".

Зайве говорити, що ви не дуже хочете запускати цю форк-бомбу на своєму виробничому сервері. :-)

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

Альтернативна версія, 5 байт

Запропоновано KonradRudolph:

x:;$_

$_є посиланням на останній аргумент попередньої команди. Більш конкретно, це вирішується тут як абсолютний шлях до виконуваної команди - що саме makeпо собі.

Це повинно працювати добре в справжньому середовищі Bash, але не в Windows + MinGW.


2
Хм, я не думаю, makeщо насправді компілює Makefile (він просто інтерпретує його).
зеппелін

3
@zeppelin Ви маєте рацію, це, мабуть, відповідь на кордоні. Однак, матеріали, що передбачають макрорекурсію на рівні препроцесора, також ніколи не почнуть збирати будь-який фактичний код.
Арнольд

11
Він відповідає наміченій меті: мати нескінченний процес нарощування. +1!
ВАТ

23

C ++, 60 58

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

Це рекурсивно створює екземпляри class aз різними параметрами шаблону. GCC 7.0 зупиняється після 900 рекурсійних рівнів із великою кількістю помилок щодо operator->приватності, але, наприклад, ICC 17 та Microsoft (R) C / C ++ Optimization Compiler 19 вимикаються на godbolt .

Проблема з цим полягає в тому, що, ймовірно, у всіх компіляторів у якийсь момент часу не вистачить пам'яті, тому навіть без обмежень рекурсії це зупиниться. Те саме, мабуть, стосується і відповіді Clojure.

Редагувати: 2 байти, збережені bolov - Спасибі


1
коротше:a<int>i=i->b;
болов

1
@ Кишені, як я зазначив у своїй відповіді, це тому, що за operator->умовчанням у класі є дефолт. У структурі вона є загальнодоступною і тому i->bможе отримати доступ до неї.
Крістоф

1
gcc 4.4.7, здається, висить тут нескінченно. Чекаючи нескінченності або для того, щоб він показав результат, що б не сталося першим. Буде чи оновлення
osuka_

1
@osuka_ все ще працює?
Крістоф

1
@Christoph nope, він зазнав аварії з SIGSEGV після того, як я залишив його працювати пару днів. Однак забули оновити - дякую за нагадування!
osuka_

23

Perl , 15 13 байт

BEGIN{{redo}}

Спробуйте в Інтернеті!

Тепер з двома збереженими байтами: @Zaid нагадав мені про те, як зробити цикл у Perl.

Це досить просто: він просто встановлює гачок аналізатора з нескінченною петлею, завдяки чому код потребує нескінченно довгого розбору. (Приємний Perl тим, що він дозволяє запускати довільний код посеред розбору; гачки аналізатора вказані в самому Perl і часто використовуються для виконання таких речей, як імпорт бібліотек або зміни правил розбору для ідентифікатора, до якого ви хочете звертатися як ключове слово.) Спробуйте в Інтернеті! Посилання вище дає -cможливість (скомпілювати код, щоб перевірити синтаксис на правильність, але не запустити його), довести, що нескінченний цикл відбувається під час компіляції.

У випадку, якщо вам цікаво "час компіляції" мовою сценаріїв: Perl насправді компілюється в байт-код і потім запускає байт-код, але це деталь, яка рідко є актуальною при її програмуванні. -MO=Параметр командного рядка сім'я може бути використана , щоб робити речі з байткод, крім роботи його (хоча і ні з цією програмою, так як нескінченний цикл відбувається до того , як байткод може бути згенерований).


1
a:goto aвиглядає також приємно (той же самий сумний рахунок).
Дада

3
BEGIN{{redo}}заощадить вам кілька байтів
Заїд

20

C ++, 37 30 29 байт

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

Він використовує майбутній параметр автоматичної функції. Він був запропонований на C ++ 17, але я не думаю, що він встиг. gccпроте підтримує його як розширення.

В основному

void foo(auto p);

еквівалентно

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

Код намагається fрекурсивно створювати різні аргументи шаблону. gccне вдається з

фатальна помилка: глибина інстанції шаблону перевищує максимум 900 (використовуйте -ftemplate-глубина = для збільшення максимуму)

З -ftemplate-depth=10000моїм плювом "Вбито - час переробки перевищено" на Godbolt.

Перевірте це на godbolt


1 байт, збережений Квентіном. Дякую.


1
Один байт можна зберегти, використовуючи intяк тип повернення :)
Квентін

Дійсно, autoпараметри функції не перетворили його на C ++ 17; а також int f() { ... }, a;не є юридичною декларацією востаннє, коли я перевіряв. (Ви не можете змішувати декларації функцій із змінними деклараціями, як це.) У вас тут є надзвичайно специфічний для GCC діалект C ++. Не те, щоб у цьому контексті було щось погано. :)
Quuxplusone

19

Лист звичайний, 8 байт

#.(loop)

Компілятор спробує прочитати форму і зіткнеться з макросом читача з чіткою ознакою , який оцінює код у час читання і використовує його результат як форму для компіляції. Тут виконуваний код - це нескінченний цикл.


17

TeX, 9 байт

\def~{~}~

TeX працює за допомогою розширення макросів. Здебільшого макроси TeX (їх також називають контрольними послідовностями ) мають форму, \nameале також можна визначити певні символи як макроси, вони називаються активними символами . Символ ~за замовчуванням активний у звичайному TeX і тому може використовуватися як ім'я макросу без додаткового оголошення. \def~{~}У наведених вище Визначає ~так , що вона розширюється ~. Тобто, кожного разу, коли TeX стикається, ~він замінює його на, ~а потім переглядає заміну, це означає, що він стикається з абсолютно новим виникненням ~та замінює його на ~. Це визначає нескінченну петлю. Все, що тоді потрібно - це запустити цикл і ось що ~робить фінал .


Додано в редагування

Щоб зробити це правильно складеним , посилайтеся на:

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

У -iniпрапорі написано, що pdftexслід скласти файл нового формату. Це заздалегідь складений набір визначень, який може бути завантажений, коли TeX пізніше буде викликано для прискорення обробки документа (LaTeX2e - приклад цього). Я здогадуюсь, що &pdftexдодає кілька байтів, беручи загальну кількість до 17.


Чи відбувається це під час компіляції? Питання вимагає, щоб нескінченний цикл відбувався під час компіляції, а не під час запуску.

@ ais523 Не повністю подумав про цей біт. Я відганяв відповідь TikZ. Я додав альтернативу, яка, безумовно, складена за рахунок ще кількох байтів.
Loop Space

2
@ ais523: Як завжди, "збирання" та "біг" - це дві сторони однієї монети. Особисто я вважаю, що вихідний код TeX є "компілюванням" у PDF-документи (які потім "виконуються" переглядом) так само, як вихідний код C ++ "компілюється" у файли .exe (які потім "виконуються" біг). Але ви також можете подумати про pdftexпрограму як "інтерпретацію" входу TeX для отримання PDF як "виводу" - так само, як g++програма "інтерпретує" вхід C ++, щоб створити .exe файл як "вихід". ;)
Quuxplusone

13

Haskell, 25 + 17 = 42 байти

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

Проста метапрограма Haskell, яка визначає нескінченне значення і намагається обчислити це значення під час компіляції.

Викликати з ghc -XTemplateHaskell <file.hs>(+17 для параметра компілятору)


Хто $(let a=a in a)не працює (на 32 байт)?
Ри-

1
Ні! GHC занадто розумний. Будь-який нескінченний цикл форми let a = a in aпереписується на виняток, що просто викликає помилку компілятора на відміну від нескінченного циклу. (хоча можливо це буде працювати з іншим компілятором Haskell, але я не маю під рукою, щоб спробувати)
user2407038

Для мене це працює runghc, тому я б сказав, що це дійсно. (Насправді, він також працює з ghc. 8.0.1 тут.)
Ри-

Дійсно? Я також на ghc 8.0.1 - для мене це дає Exception when trying to run compile-time code: <<loop>>, як в інтерпретаторі, так і при компілюванні ... технічно код вище вмирає і за винятком, але переповнення стека, що явно дозволено специфікацією - і якби у вас була нескінченна пам’ять, вона б справді цикла назавжди. У <<loop>>виняткових пожежах задовго до того, моя машина біжить з пам'яті.
user2407038

12

gradle, 10 9 байт

for(;;){}

з наведеним вище кодом, розміщеним у build.gradleфайлі. Gradle використовує groovy в якості основної мови, тому ми дійсно говоримо про groovy тут, але оскільки питання стосувалося часу побудови, я вважав, що gradle буде більш підходящим.

Запуск будь-яких команд збірки gradle з вищевказаним кодом друкує рядок стану збірки, сумісний із точковим волоссям-босом:

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

якщо ви прагнете підвищити, додайте -dпрапор налагодження для:

$ 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

який, крім того, що виглядає вражаюче складно, також оновлює новий набір:

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.

рядки статусу кожні 10 секунд, завдяки чому збірка зайнята важливими технічними речами.


8

SWI-Prolog, 34 байти

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

Пояснення

term_expansion/2 це те, що автоматично викликається компілятором перед фактичним складанням коду для перетворення деяких термінів у вихідному коді в інші терміни.

Тут ми вводимо нове правило term_expansion/2: repeat,1=0..

repeat/0 - це предикат, який завжди домагається успіху, і забезпечує нескінченну кількість точок вибору.

1=0намагається об'єднати 1з 0, який завжди false. Це призведе до того, що компілятор буде відслідковуватись repeat(оскільки він завжди забезпечує точку вибору) і повторити 1=0спробу і т.д.


Не працює в GNU Prolog, тому я припускаю, що це стосується конкретної реалізації. Можливо, ви хочете ввести заголовок імені компілятора. (Я припускаю, що SWI Prolog.)

@ ais523 Спасибі, не перевіряли інші distribs, але оскільки компілятор зазвичай досить специфічний, я повинен був знати краще ...
Fatalize

@ ais523 Однак, відповідно до цього , ви можете використовувати це expand_termзамість цього (як там сказано, term_expansionне можна використовувати, як тут, у GNU Prolog). expand_termОднак він не працює на SWI.
Фаталізувати

7

GNU Make, 44

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

Я не можу вимагати кредиту за це. Він походить із книги Роберта Мекленбурга « Керування проектами за допомогою GNU Make: The Power of GNU Make for Building Anything» .

Коли make виконує цей makefile, він бачить, що makefile застарів (оскільки ціль .PHONY застаріла, тому вона виконує сенсорну команду, яка оновлює часову позначку makefile. Потім зробити повторне зчитування файлу та виявлення makefile застарілий .... Ну, ви зрозуміли,

Я віддаю перевагу цьому іншому Зробіть відповідь, оскільки він не використовує рекурсії. На моїй ВМ, інша відповідь продовжує роздрібнювати процеси, і десь близько 7000 глибин, ВМ перемелюється до невідповідної зупинки. Однак з цією відповіддю він може продовжуватись нескінченно, не харчуючись системними ресурсами. Ви справді зможете відхилитися від цієї збірки. Я пройшов понад 1 000 000 ітерацій без явної деградації системи.

Зауважте, мені довелося додати sleep 1так, щоб часова марка makefile фактично оновлювалася щоразу. Ви можете змінити це, sleep 0.01якщо хочете, щоб він повторювався через ітерації трохи швидше.


6

GNU Forth, 15 байт

Гольф

: : [do] [loop]

Повторно визначає (перекомпілює) слово :і викликає негайну нескінченну петлю [do] [loop]всередині нового визначення (право на час компіляції).

Одну категорію слів не складають. Ці так звані негайні слова виконуються (виконуються зараз) незалежно від того, чи інтерпретатор тексту інтерпретує чи компілює.

Спробуйте в Інтернеті!


5

Clojure, 21 байт

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

Зв’язує компілятор, визначаючи макрос, який багаторазово висилає дзвінки до себе.

На моєму телефоні це призводить до того, що REPL повісить і затримує пристрій. На моєму ноутбуці це виходить з ладу за допомогою StackOverflow.

На жаль, StackOverflow відбувається миттєво, але він все ще діє згідно з правилами.


5

MSBuild, 130 байт

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

Збережіть це як файл із .projрозширенням та запустіть із msbuildкомандного рядка. MSBuild виконає свою єдину ціль, яка просто породжує інший msbuildпроцес.


Чи потрібні відступи для цього? Що з новинками? Зазвичай можна пограти в поле для пробілу.

Ні, читати це просто простіше. Кількість символів не включає пробіл.
Данько Дурбич

1
Ага правильно. У такому випадку вам, мабуть, слід згадати це в тілі посади.


4

Mathematica 33 байт

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

Код буде намагатися символічно оцінити аргумент перед компіляцією, а сам аргумент - нескінченний цикл. Функція "Хоча" має нульовий другий аргумент, оскільки це не важливо.


"до складання" Так ... ні.
CalculatorFeline

Будь ласка, надайте дійсний аргумент. reference.wolfram.com/language/tutorial/…
Келлі Лоудер

Питання в тому, чи відбувається цикл під час Compileдзвінка або перед ним?
КалькуляторFeline

3

Haskell (GHC, без шаблону Haskell або спеціальних правил перезапису) , 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()

Теоретично це входить у нескінченний цикл приблизно так само, як і у підходу С ++ : поліморфний метод yпризначається до все більш заплутаних типів. На практиці розміщений за замовчуванням розмір стека фактично швидко переповнює:

$ 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 ()

Подяки Луку Палмеру .


1

Haskell (ghc), 32 + 2 = 34 байти

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

бігати з ghc -O <file>. Запускає правило перезапису для основної функції, яка переписує те саме. Єдина прикрою особливістю є те, що ghc досить розумний, щоб виявити це і зупинитися після 100 ітерацій. Я не знаю простий спосіб відключити цю поведінку.


1

Бу, 25 байт

macro l:
 x=0 while 1>0
l

Це визначає макрос, який виконується під час компіляції, який виконує нескінченний цикл, а потім викликає макрос.


1

Іржа, 18 байт

include!(file!());

Класичний самовключення. Хоча Rustc прикро розумний, і за замовчуванням він спасеться після 128 рекурсій, і він розширюється спочатку глибиною, тому експоненціальне зростання також не працює. Це ж стосується і рішень C і C ++.


0

Фактор , 29 16

<< [ t ] loop >>

Частина між << >>виконується в час розбору.

Щодо того, що [ t ] loopробить, я дозволю вам здогадатися ...

Ви можете помістити це в Слухач таким, яким він є, або додати його до будь-якого словника чи файлу сценарію з відповідними матеріалами котла.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.