Я разработчик, и мне не хочется делать свою работу. Я знаю из XKCD, что лучшим оправданием для замедления является компиляция вашего кода . Из-за этого, я думаю, мне нужен код, который будет компилироваться вечно! И потому что я ленивый и не хочу много печатать, это должно быть сделано с максимально коротким кодом.
Итак, ваша задача - написать программу, которая синтаксически верна, но заставит компилятор войти в бесконечный цикл.
Характеристики
- Вы должны использовать язык, который имеет компилятор, очевидно.
- Укажите реализацию, используемую в каждом решении.
- Это код-гольф , поэтому выигрывает самое короткое действительное решение (в байтах).
- Компилятор может прекратить нехватку памяти или места в стеке.
code-golf
compile-time
Esolanging Fruit
источник
источник
Java
: определить процессор аннотаций (фрагмент кода ideone), который вы будете использовать при вызовеjavac
с его-processor
вариант. Это заставляет компиляцию любого класса зависать навсегда.Ответы:
Japt , 2 байта
Вы можете проверить это онлайн здесь , но я бы не стал его рекомендовать, так как он заблокирует ваш браузер.
объяснение
Japt использует библиотеку shoco для сжатия строк. Обратный удар говорит компилятору распаковать все до следующего обратного удара или до конца файла. Каждый байт выполняет следующие действия:
00-7F
остаются нетронутыми.80-BF
каждое преобразование в общие строчные двухбуквенные пары (at
,oo
,th
и т.д.).C0-DF
каждый использует следующий байт и преобразуется в общую четырехбуквенную строку .E0-EF
каждый из них потребляет следующие три байта и преобразуется в «общую» восьмибуквенную строку (начинаяWhererer
с нее и спускаясь вниз).F0-F7
разбить декомпрессор, хотя он все равно возвращает все до бита разрыва.F8-FF
заставить декомпрессор войти в бесконечный цикл. Я не уверен, почему это так, поскольку я не очень хорошо знаком с внутренней работой библиотеки shoco (а код JavaScript совершенно не читается ), но в этом случае он весьма удобен.Я не верю, что есть другой способ связываться с компилятором Japt, но вы никогда не знаете ...
источник
TikZ (pdfTeX 3.14159265-2.6-1.40.17),
857974242221 байтКуча байтов сохранена благодаря wchargin
Один байт спасен благодаря Крису Н
Я действительно столкнулся с этим случайно, когда я работал над домашней работой. Я провел довольно много времени, ожидая, пока он скомпилируется, прежде чем я понял, что происходит.
Это состоит из двух частей:
Это загружает пакет TikZ
а также:
Это запускает
\tikz
среду и команду рисования.Что происходит
С компилятором pdflatex возникают проблемы
\tikz\pic
, и он входит в интерактивный режим, вызывая его остановку на неопределенный срок.источник
\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.pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016)
и она действительно работает бесконечно долго. Спасибо за советы.\pic
вместо \ draw` - точно такое же поведение (протестировано с использованием tikz 1.142)\def\a{\a}\a
(12 байт)? Или, так как это код гольф и~
активен по умолчанию\def~{~}~
(9 байт)?C, 18 байтов
Компиляторы обычно сдаются после повторения около 200 раз.
Считается ли построение DOM этапом компиляции? Если так, то
x.htm
:источник
<?include __FILE__;
.Java,
10295898878 байтЭто заканчивается тем,
StackOverflowError
что происходит, потому что универсальная система разрешения не может определить корень, для которого нужно разрешить другие обобщенные элементы.Кредиты, причитающиеся .
Что здесь происходит?
A<T>
просто там, чтобы иметь 1-буквенный родитель. Это универсально. Я мог бы использоватьList
, но импорт и повторение 4 букв слишком длинные.B<T>
объявляет базовый общий.B extends A
требуется иметь иерархию междуB
иA
.extends A<A>
создает собственную ссылку наA<T>
.A<? super B>
запускает поиск дженериков наA<T>
B<B<T>>
создает самореференцию наB<T>
.A<...> a=new B<>()
форсирует использование обобщений, а не просто их определение, форсирует разрешение при компиляцииB
, а не после.A<?super B
создает несамостоятельную ссылку, поэтому мы имеем ссылку как на один тип, так и на другой в обобщенияхA
.B<A>
создает несамостоятельную ссылку, поэтому мы имеем ссылку как на один тип, так и на другой в обобщенияхB
.Теперь тип
A
имеет тип genericsA
и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>>>>>>
.Результат компиляции
В моей системе трассировка стека останавливается после отображения 1024 строк, которые на самом деле являются 4 одинаковыми строками, повторенными 256 раз, что доказывает бесконечную рекурсию. Я избавлю тебя от всего этого следа.
экономия
interface
+implements
наclass
+extends
.Long
наA
(дважды).new B<A>()
→new B<>()
).источник
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
B
объект содержит неразрешимую ссылку на универсальныйA
объект, который, в свою очередь, содержит неразрешимую ссылку на универсальный объект B. Когда распознаватель не может принять решение, он проверяет включенные ссылки, но здесь оба универсальных элемента ссылаются друг на друга неразрешимым образом (в основном благодаря собственным ссылкам иsuper
ключевому слову. Таким образом, распознаватель на самом деле пинг-понг между двумя генериками.public @interface X {@X(x=X.class)Class<? extends X> x();}
... Но я быстро понял, почему это не сработает, смеется.Makefile GNU,
87 байтОдин байт сохранен благодаря KonradRudolph
Сохраняется как
Makefile
и вызываетсяmake
:Это создаст бесконечную рекурсию сборки для первой найденной цели
"x"
.Само собой разумеется, что вы на самом деле не хотите запускать эту бомбу на своем рабочем сервере. :-)
Альтернативная версия, 5 байт
Предложено КонрадРудольфом:
$_
является ссылкой на последний аргумент предыдущей команды. Более конкретно, здесь он разрешается как абсолютный путь к выполняемой команде, которая являетсяmake
самой.Это должно хорошо работать в подлинной среде Bash, но не в Windows + MinGW.
источник
make
что действительно компилирует Makefile (он просто интерпретирует его).C ++,
6058Это рекурсивно создает экземпляры
class a
с различными параметрами шаблона. GCC 7.0 останавливается после 900 уровней рекурсии с кучей ошибок оoperator->
частной жизни, но, например, ICC 17 и Microsoft (R) C / C ++ Оптимизирующий компилятор 19 истекают на Godbolt .Проблема в том, что, вероятно, в какой-то момент времени всем компиляторам не хватит памяти, поэтому даже без ограничений рекурсии это остановится. То же самое, вероятно, относится и к ответу Clojure.
Редактировать: 2 байта, сохраненные Болов - Спасибо
источник
a<int>i=i->b;
operator->
по умолчанию используется значение private. Внутри структуры она общедоступна и поэтомуi->b
может получить к ней доступ.Perl ,
1513 байтПопробуйте онлайн!
Теперь с сохраненными 2 байтами: @Zaid напомнил мне более краткий способ сделать цикл в Perl.
Это довольно просто: он просто устанавливает ловушку синтаксического анализатора с бесконечным циклом, в результате чего код анализируется бесконечно долго. (Приятно, что Perl позволяет запускать произвольный код в середине анализа; перехватчики синтаксического анализа задаются в самом Perl и часто используются для таких вещей, как импорт библиотек или изменение правил синтаксического анализа для идентификатора, который вы хотите обрабатывать как ключевое слово.) Попробуйте онлайн! ссылка выше дает
-c
возможность (скомпилировать код для проверки правильности синтаксиса, но не запускать его), чтобы доказать, что бесконечный цикл происходит во время компиляции.В случае, если вы задаетесь вопросом о «времени компиляции» на языке сценариев: Perl фактически компилирует в байт-код, а затем запускает байт-код, но эта деталь редко бывает релевантной при его программировании. Семейство
-MO=
опций командной строки можно использовать для работы с байт-кодом, отличным от его запуска (хотя и не с этой программой, поскольку бесконечный цикл происходит до того, как байт-код может быть сгенерирован).источник
a:goto a
выглядит тоже красиво (так же, как грустно).BEGIN{{redo}}
сэкономит вам несколько байтовC ++,
373029 байтОн использует будущий автоматический параметр функции. Это было предложено в C ++ 17, но я не думаю, что это было сделано.
gcc
однако поддерживает его как расширение.В основном
эквивалентно
Код пытается
f
рекурсивно создать экземпляр с различными аргументами шаблона.gcc
не удается сС этим
-ftemplate-depth=10000
я плюнул "Убит - время обработки превышено" на Годболт.Проверьте это на Godbolt
1 байт сохранен Квентином. Спасибо.
источник
int
в качестве типа возврата :)auto
параметры функции не попали в C ++ 17; и такжеint f() { ... }, a;
не является юридическим заявлением в прошлый раз, когда я проверил. (Вы не можете смешивать объявления функций с объявлениями переменных подобным образом.) То, что вы получили здесь, является исключительно специфичным для GCC диалектом C ++. Не то чтобы в этом контексте было что-то не так. :)Common Lisp, 8 байт
Компилятор попытается прочитать форму и встретится с макросом читателя sharpsign-dot , который оценивает код во время чтения и использует его результат в качестве формы для компиляции. Здесь выполняемый код представляет собой бесконечный цикл.
источник
TeX, 9 байт
TeX работает за счет расширения макросов. В большинстве случаев макросы TeX (также называемые управляющими последовательностями ) имеют форму,
\name
но также можно определить определенные символы как макросы, которые называются активными символами . Символ~
активен по умолчанию в простом TeX и поэтому может использоваться в качестве имени макроса без дальнейшего объявления.\def~{~}
В приведенных выше Определяет~
так , что она расширяется~
. То есть всякий раз, когда TeX встречает,~
он заменяет его,~
а затем повторно исследует замену, что означает, что он встречает совершенно новое вхождение~
и заменяет его на~
. Это определяет бесконечный цикл. Все, что тогда нужно, это запустить цикл, и это то, что~
делает финал .Добавлено в правку
Чтобы сделать это правильно скомпилированным , вызовите как:
-ini
Флаг говорит , чтоpdftex
необходимо составить новый формат файла. Это предварительно скомпилированный набор определений, который может быть загружен при последующем вызове TeX для ускорения обработки документа (например, LaTeX2e). Я думаю, что&pdftex
добавляет несколько байтов, в результате чего общее количество до 17.источник
pdftex
программе как о «интерпретации» ввода TeX для создания PDF как «вывода» - так же, какg++
программа «интерпретирует» ввод C ++ для получения файла .exe как «вывода». ;)Haskell, 25 + 17 = 42 байта
Простая метапрограмма на Haskell, которая определяет бесконечное значение и пытается вычислить это значение во время компиляции.
Вызвать с
ghc -XTemplateHaskell <file.hs>
(+17 для параметра к компилятору)источник
$(let a=a in a)
работает (на 32 байта)?let a = a in a
переписывается в исключение, которое просто вызывает ошибку компилятора, а не бесконечный цикл. (хотя, возможно, это будет работать с другим компилятором на Haskell, но у меня его нет под рукой)Exception when trying to run compile-time code: <<loop>>
как в интерпретаторе, так и при компиляции ... технически вышеприведенный код тоже умирает с исключением, но переполнение стека, что явно разрешено спецификацией - и если бы у вас было бесконечное количество памяти, оно действительно зациклилось бы навсегда. В<<loop>>
исключительных пожарах задолго до того, моя машина бежит из памяти.gradle,
109 байтс вышеуказанным кодом, помещенным в
build.gradle
файл. Gradle использует groovy в качестве базового языка, поэтому мы действительно говорим о groovy здесь, но поскольку вопрос был о времени сборки, я подумал, что gradle будет более подходящим.Выполнение любых команд сборки gradle с указанным выше кодом выводит строку состояния сборки, совместимую с pointy-haired-boss:
если вы стремитесь к рейзу, добавьте
-d
флаг отладки для:который в дополнение к впечатляюще сложному внешнему виду также обновляется новым набором:
статусные строки каждые 10 секунд, создавая впечатление, что сборка занята выполнением важных технических ... вещей.
источник
SWI-Пролог, 34 байта
объяснение
term_expansion/2
это то, что автоматически вызывается компилятором перед фактической компиляцией кода для преобразования некоторых терминов в исходном коде в другие.Здесь мы вводим новое правило
term_expansion/2
:repeat,1=0.
.repeat/0
предикат, который всегда успешен и обеспечивает бесконечное количество точек выбора.1=0
пытается объединиться1
с0
, что всегда естьfalse
. Это заставит компилятор вернутьсяrepeat
(так как он всегда предоставляет точку выбора) и попытаться1=0
снова и т. Д.источник
expand_term
вместо этого (как сказано,term_expansion
не может использоваться, как здесь, в GNU Prolog). Это не работает сexpand_term
SWI, хотя.GNU Make, 44
Я не могу претендовать на кредит за это. Он взят из книги Роберта Мекленбурга « Управление проектами с помощью GNU Make: Сила GNU Make для создания чего-либо» .
Я предпочитаю это другому Make answer, потому что он не использует рекурсию. На моей виртуальной машине другой ответ Make продолжает разветвлять процессы, и где-то на глубине около 7000 виртуальная машина перестает отвечать на запросы. Однако с этим ответом он может продолжаться бесконечно, не поглощая системные ресурсы. Вы действительно сможете расслабиться с этой сборкой. Я прошел более 1 000 000 итераций без видимой деградации системы.
Обратите внимание, что мне пришлось добавить
sleep 1
так, чтобы временная метка make-файла фактически обновлялась каждый раз. Вы можете изменить это на,sleep 0.01
если хотите, чтобы он проходил через итерации немного быстрее.источник
GNU Forth, 15 байтов
Golfed
Повторно определяет (перекомпилирует) слово
:
и запускает бесконечный цикл[do] [loop]
внутри нового определения (прямо во время компиляции).Попробуйте онлайн!
источник
Clojure, 21 байт
Связывает компилятор, определяя макрос, который периодически отправляет вызовы самому себе.
На моем телефоне это вызывает зависание REPL и отставание устройства. На моем ноутбуке это не получается с помощью StackOverflow.
К сожалению, StackOverflow происходит мгновенно, но все же действует в соответствии с правилами.
источник
MSBuild, 130 байт
Сохраните это как файл с
.proj
расширением и запустите егоmsbuild
из командной строки. MSBuild будет запускать свою единственную цель, которая просто порождает другойmsbuild
процесс.источник
C, 31 байт
Вдохновленный Цифровой Травмой . Скомпилируйте с
-mcmodel=medium
флагом.Удачи вам в компиляции, вам понадобится 1,8 yottabytes оперативной памяти и дискового пространства.
источник
Mathematica 33 байта
Код будет пытаться символически оценить аргумент до компиляции, а сам аргумент представляет собой бесконечный цикл. Функция While имеет второй нулевой аргумент, поскольку это не важно.
источник
Compile
вызова или до него?Haskell (GHC, без Template Haskell или пользовательских правил перезаписи) , 138
Теоретически, это входит в бесконечный цикл во многом так же, как это делает подход C ++ : полиморфный метод
y
создается для еще более запутанных типов. На практике размер выделенного стека по умолчанию быстро переполняется:Кредиты Люку Палмеру .
источник
Haskell (ghc), 32 + 2 = 34 байта
беги с
ghc -O <file>
. Запускает правило перезаписи для основной функции, которое переписывает в ту же самую вещь. Единственная неприятная особенность в том, что ghc достаточно умен, чтобы обнаружить это и остановиться после 100 итераций. Я не знаю простого способа отключить это поведение.источник
Бу, 25 байт
Это определяет макрос, который выполняется во время компиляции, который выполняет бесконечный цикл, а затем вызывает макрос.
источник
Ржавчина, 18 байт
Классический самообслуживание. Rustc, однако, раздражающе вменяемый, и по умолчанию выручает после 128 рекурсий и расширяется в первую очередь, так что экспоненциальный рост также не работает. То же самое относится и к решениям C и C ++.
источник
Фактор ,
2916Часть между
<<
>>
выполняется во время разбора.Что касается того
[ t ] loop
, что я позволю вам догадаться ...Вы можете поместить это в Listener как есть, или добавить его в любой словарь или файл сценария с соответствующим шаблоном.
источник
PHP, 19 байт
источник