Кратчайший код, чтобы законно ослабить

146

Я разработчик, и мне не хочется делать свою работу. Я знаю из XKCD, что лучшим оправданием для замедления является компиляция вашего кода . Из-за этого, я думаю, мне нужен код, который будет компилироваться вечно! И потому что я ленивый и не хочу много печатать, это должно быть сделано с максимально коротким кодом.

Итак, ваша задача - написать программу, которая синтаксически верна, но заставит компилятор войти в бесконечный цикл.

Характеристики

  • Вы должны использовать язык, который имеет компилятор, очевидно.
  • Укажите реализацию, используемую в каждом решении.
  • Это , поэтому выигрывает самое короткое действительное решение (в байтах).
  • Компилятор может прекратить нехватку памяти или места в стеке.
Esolanging Fruit
источник
1
@obarakon Я не согласен. Код из другой задачи не может быть легко перенесен на эту задачу. Проблемы, связанные с бесконечным циклом, принципиально различны.
Sriotchilism О'Зайк
1
@obarakon Не дурак в этом вопросе , так как это не код-гольф.
Esolanging Fruit
2
Связанный
Sriotchilism O'Zaic
1
Я не уверен, что это соответствует этой задаче (и даже если это произойдет, это будет ужасно), но для тех, кто интересуется, вот как я это сделаю Java: определить процессор аннотаций (фрагмент кода ideone), который вы будете использовать при вызове javacс его -processorвариант. Это заставляет компиляцию любого класса зависать навсегда.
Аарон
6
Ответы, которые приводят к сбою компилятора: Я бы подумал, что вы все равно хотите, чтобы он потерпел крах до тех пор, пока не произойдет сбой.
GuitarPicker

Ответы:

16

Japt , 2 байта

`ÿ

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

объяснение

Japt использует библиотеку shoco для сжатия строк. Обратный удар говорит компилятору распаковать все до следующего обратного удара или до конца файла. Каждый байт выполняет следующие действия:

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

Я не верю, что есть другой способ связываться с компилятором Japt, но вы никогда не знаете ...

ETHproductions
источник
10
Что вы имеете в виду, что это нечитаемо. Очевидно, вы просто не пытаетесь достаточно сильно.
fənɛtɪk
Я хотел бы, чтобы был emscripten декомпилятор ...
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). тикз 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) и она действительно работает бесконечно долго. Спасибо за советы.
Sriotchilism O'Zaic
1
Вы можете сохранить байт, используя \picвместо \ draw` - точно такое же поведение (протестировано с использованием tikz 1.142)
Chris H
3
Я не могу поверить, что на самом деле выступаю за то, чтобы не использовать TikZ, но, конечно, его использование здесь излишне. Что не так со старым \def\a{\a}\a(12 байт)? Или, так как это код гольф и ~активен по умолчанию \def~{~}~(9 байт)?
Loop Space
2
@ LoopSpace Ничего плохого в них нет, я просто не знал о существовании. Если вы хотите сделать свой ответ, не стесняйтесь.
Sriotchilism O'Zaic
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имеет тип generics Aи B, но какой выбрать? Забудьте о себе, давайте попробуем решить B. Пинг.

Хорошо, Bесть тип дженериков Aи B, но какой выбрать? Забудьте о себе, давайте попробуем решить A. Pong.

Этот вид рекурсии не может на самом деле следует избегать , потому что есть законные случаи , как 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<>();}
Аддисон Крамп
@VoteToClose Вы смотрите на яркий пример неразрешимости в дженериках Java. Предполагается, что каждый общий тип сопоставляется с общим корнем, который затем проверяется на соответствие. Дело в том, что универсальный Bобъект содержит неразрешимую ссылку на универсальный Aобъект, который, в свою очередь, содержит неразрешимую ссылку на универсальный объект B. Когда распознаватель не может принять решение, он проверяет включенные ссылки, но здесь оба универсальных элемента ссылаются друг на друга неразрешимым образом (в основном благодаря собственным ссылкам и superключевому слову. Таким образом, распознаватель на самом деле пинг-понг между двумя генериками.
Оливье Грегуар
Я думал о создании проблемы времени компиляции с циклическими аннотациями: public @interface X {@X(x=X.class)Class<? extends X> x();}... Но я быстро понял, почему это не сработает, смеется.
Волшебная урна осьминога
34

Makefile GNU, 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 байт

Предложено КонрадРудольфом:

x:;$_

$_является ссылкой на последний аргумент предыдущей команды. Более конкретно, здесь он разрешается как абсолютный путь к выполняемой команде, которая является makeсамой.

Это должно хорошо работать в подлинной среде Bash, но не в Windows + MinGW.

Arnauld
источник
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 ++ Оптимизирующий компилятор 19 истекают на Godbolt .

Проблема в том, что, вероятно, в какой-то момент времени всем компиляторам не хватит памяти, поэтому даже без ограничений рекурсии это остановится. То же самое, вероятно, относится и к ответу Clojure.

Редактировать: 2 байта, сохраненные Болов - Спасибо

Christoph
источник
1
короче:a<int>i=i->b;
болов
1
@ Пакеты, которые я указывал в своем ответе, объясняются тем, что в классе operator->по умолчанию используется значение private. Внутри структуры она общедоступна и поэтому i->bможет получить к ней доступ.
Кристоф
1
gcc 4.4.7 вроде бы висит здесь бесконечно. В ожидании бесконечности или покажется вывод, в зависимости от того, что наступит раньше. Будет обновление
osuka_
1
@osuka_ это все еще работает?
Кристоф
1
@Christoph Нет, он сломался с SIGSEGV после того, как я оставил его работать на пару дней. Забыл обновить, хотя - спасибо за напоминание!
osuka_
23

Perl , 15 13 байт

BEGIN{{redo}}

Попробуйте онлайн!

Теперь с сохраненными 2 байтами: @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-deep = для увеличения максимума)

С этим -ftemplate-depth=10000я плюнул "Убит - время обработки превышено" на Годболт.

Проверьте это на Godbolt


1 байт сохранен Квентином. Спасибо.

Болов
источник
1
Один байт можно сохранить, используя intв качестве типа возврата :)
Квентин,
Действительно, autoпараметры функции не попали в C ++ 17; и также int f() { ... }, a;не является юридическим заявлением в прошлый раз, когда я проверил. (Вы не можете смешивать объявления функций с объявлениями переменных подобным образом.) То, что вы получили здесь, является исключительно специфичным для GCC диалектом C ++. Не то чтобы в этом контексте было что-то не так. :)
Quuxplusone
19

Common Lisp, 8 байт

#.(loop)

Компилятор попытается прочитать форму и встретится с макросом читателя sharpsign-dot , который оценивает код во время чтения и использует его результат в качестве формы для компиляции. Здесь выполняемый код представляет собой бесконечный цикл.

CoreDump
источник
17

TeX, 9 байт

\def~{~}~

TeX работает за счет расширения макросов. В большинстве случаев макросы TeX (также называемые управляющими последовательностями ) имеют форму, \nameно также можно определить определенные символы как макросы, которые называются активными символами . Символ ~активен по умолчанию в простом TeX и поэтому может использоваться в качестве имени макроса без дальнейшего объявления. \def~{~}В приведенных выше Определяет ~так , что она расширяется ~. То есть всякий раз, когда TeX встречает, ~он заменяет его, ~а затем повторно исследует замену, что означает, что он встречает совершенно новое вхождение ~и заменяет его на ~. Это определяет бесконечный цикл. Все, что тогда нужно, это запустить цикл, и это то, что ~делает финал .


Добавлено в правку

Чтобы сделать это правильно скомпилированным , вызовите как:

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

-iniФлаг говорит , что pdftexнеобходимо составить новый формат файла. Это предварительно скомпилированный набор определений, который может быть загружен при последующем вызове TeX для ускорения обработки документа (например, LaTeX2e). Я думаю, что &pdftexдобавляет несколько байтов, в результате чего общее количество до 17.

Loop Space
источник
Это происходит во время компиляции? Вопрос требует, чтобы бесконечный цикл происходил во время компиляции, а не во время работы.
@ 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 для параметра к компилятору)

user2407038
источник
Не $(let a=a in a)работает (на 32 байта)?
Ry-
1
Нет! GHC слишком умный. Любой бесконечный цикл формы let a = a in aпереписывается в исключение, которое просто вызывает ошибку компилятора, а не бесконечный цикл. (хотя, возможно, это будет работать с другим компилятором на Haskell, но у меня его нет под рукой)
user2407038
Это работает с runghc для меня, поэтому я бы сказал, что это действительно. (На самом деле, это работает и с ghc. 8.0.1 здесь.)
Ry-
В самом деле? Я тоже на 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 с указанным выше кодом выводит строку состояния сборки, совместимую с pointy-haired-boss:

$ 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-Пролог, 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снова и т. Д.

Fatalize
источник
Не работает в GNU Prolog, поэтому я предполагаю, что это зависит от реализации. Возможно, вы захотите указать название компилятора в заголовке. (Я предполагаю, что SWI Пролог.)
@ ais523 Спасибо, не проверял другие дистрибутивы, но так как компилятор обычно довольно специфичен, мне следовало бы знать лучше ...
Fatalize
@ ais523 Однако, в соответствии с этим , вы можете использовать expand_termвместо этого (как сказано, term_expansionне может использоваться, как здесь, в GNU Prolog). Это не работает с expand_termSWI, хотя.
Роковая
7

GNU Make, 44

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

Я не могу претендовать на кредит за это. Он взят из книги Роберта Мекленбурга « Управление проектами с помощью GNU Make: Сила GNU Make для создания чего-либо» .

Когда make выполняет этот make-файл, он видит, что make-файл устарел (потому что цель .PHONY устарела, поэтому он выполняет команду touch, которая обновляет временную метку make-файла. Затем make перечитывает файл и обнаруживает Makefile устарел .... Ну, вы поняли.

Я предпочитаю это другому Make answer, потому что он не использует рекурсию. На моей виртуальной машине другой ответ Make продолжает разветвлять процессы, и где-то на глубине около 7000 виртуальная машина перестает отвечать на запросы. Однако с этим ответом он может продолжаться бесконечно, не поглощая системные ресурсы. Вы действительно сможете расслабиться с этой сборкой. Я прошел более 1 000 000 итераций без видимой деградации системы.

Обратите внимание, что мне пришлось добавить sleep 1так, чтобы временная метка make-файла фактически обновлялась каждый раз. Вы можете изменить это на, sleep 0.01если хотите, чтобы он проходил через итерации немного быстрее.

Цифровая травма
источник
6

GNU Forth, 15 байтов

Golfed

: : [do] [loop]

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

Одна категория слов не компилируется. Эти так называемые непосредственные слова исполняются (выполняются сейчас) независимо от того, интерпретирует или компилирует текстовый интерпретатор.

Попробуйте онлайн!

дирижабль
источник
5

Clojure, 21 байт

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

Связывает компилятор, определяя макрос, который периодически отправляет вызовы самому себе.

На моем телефоне это вызывает зависание REPL и отставание устройства. На моем ноутбуке это не получается с помощью StackOverflow.

К сожалению, StackOverflow происходит мгновенно, но все же действует в соответствии с правилами.

Carcigenicate
источник
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,]]

Код будет пытаться символически оценить аргумент до компиляции, а сам аргумент представляет собой бесконечный цикл. Функция While имеет второй нулевой аргумент, поскольку это не важно.

Келли Лоудер
источник
"до компиляции" Да ... нет.
CalculatorFeline
Пожалуйста, предоставьте действительный аргумент. reference.wolfram.com/language/tutorial/…
Келли Лоудер
Вопрос в том, происходит ли цикл во время Compileвызова или до него?
CalculatorFeline
3

Haskell (GHC, без Template 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()

Теоретически, это входит в бесконечный цикл во многом так же, как это делает подход C ++ : полиморфный метод 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 ++.

CensoredUsername
источник
0

Фактор , 29 16

<< [ t ] loop >>

Часть между << >>выполняется во время разбора.

Что касается того [ t ] loop, что я позволю вам догадаться ...

Вы можете поместить это в Listener как есть, или добавить его в любой словарь или файл сценария с соответствующим шаблоном.

Федерация с.
источник