Saya seorang pengembang, dan saya tidak ingin melakukan pekerjaan saya. Saya tahu dari XKCD bahwa alasan terbaik untuk bersantai adalah bahwa kode Anda dikompilasi . Karena itu, saya pikir saya memerlukan beberapa kode yang akan dikompilasi selamanya! Dan karena saya malas dan tidak mau harus mengetik banyak, ini harus dilakukan dengan kode sesingkat mungkin.
Jadi, tugas Anda adalah menulis sebuah program yang secara sintaksis valid, tetapi akan menyebabkan kompiler memasuki infinite loop.
Spesifikasi
- Anda harus menggunakan bahasa yang memiliki kompiler, jelas.
- Tentukan implementasi yang digunakan dalam setiap solusi.
- Ini adalah kode-golf , sehingga solusi terpendek yang valid (dalam byte) menang.
- Kompilator dapat berhenti kehabisan memori atau menumpuk ruang.
code-golf
compile-time
Buah Esolanging
sumber
sumber
Java
: mendefinisikan prosesor anotasi (potongan ideone) yang akan Anda gunakan ketika menjalankanjavac
dengan-processor
pilihan. Itu membuat kompilasi kelas mana pun menggantung selamanya.Jawaban:
Japt , 2 byte
Anda dapat menguji ini secara online di sini , tetapi saya tidak akan merekomendasikannya karena ini akan membekukan browser Anda.
Penjelasan
Japt menggunakan perpustakaan shoco untuk mengompresi string. Sebuah backtick memberitahu compiler untuk mendekompres semuanya sampai backtick berikutnya atau akhir file. Setiap byte melakukan hal berikut:
00-7F
dibiarkan utuh.80-BF
masing-masing berubah menjadi huruf kecil pasangan dua huruf yang umum (at
,oo
,th
, dll).C0-DF
masing-masing mengkonsumsi byte berikutnya dan mengubahnya menjadi string empat huruf yang umum .E0-EF
masing-masing mengonsumsi tiga byte berikutnya dan mengubahnya menjadi string delapan huruf "umum" (mulai dariWhererer
dan menurun dari sana).F0-F7
hancurkan decompressor, meskipun masih mengembalikan semuanya hingga byte yang putusF8-FF
menyebabkan decompressor masuk ke loop infinite. Saya tidak yakin mengapa ini terjadi, karena saya tidak terlalu terbiasa dengan cara kerja bagian dalam perpustakaan shoco (dan kode JavaScript benar-benar tidak dapat dibaca ), tetapi cukup berguna dalam kasus ini.Saya tidak percaya ada cara lain untuk mengacaukan kompiler Japt, tetapi Anda tidak pernah tahu ...
sumber
TikZ (pdfTeX 3.14159265-2.6-1.40.17),
857974242221 byteBanyak byte yang disimpan berkat wchargin
Satu byte disimpan berkat Chris H
Saya benar-benar menemukan ini secara tidak sengaja ketika saya sedang mengerjakan pekerjaan rumah. Saya menghabiskan waktu cukup lama menunggu untuk dikompilasi sebelum saya menyadari apa yang terjadi.
Ini memiliki dua bagian:
Ini memuat paket TikZ
dan:
Ini memulai
\tikz
lingkungan dan perintah undian.Apa yang sedang terjadi
Compiler pdflatex memiliki masalah dengan
\tikz\pic
, dan memasuki mode interaktif yang menyebabkannya berhenti tanpa batas.sumber
\draw l\end {document}
?! File berakhir saat memindai penggunaan\tikz@next.
" pdflatex 3.1415926-2.5-1.40.14 (TeX Live 2013 / Debian). tikz 2010/10/13 v2.10. Ini standarapt install texlive-full
pada Ubuntu 14.04.pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016)
dan itu memang loop tanpa batas. Terima kasih atas tipsnya.\pic
alih-alih \ draw` - perilaku yang persis sama (diuji menggunakan tikz 1.142)\def\a{\a}\a
(12 byte)? Atau, karena ini kode golf dan~
aktif secara default,\def~{~}~
(9 byte)?C, 18 byte
Kompiler biasanya akan menyerah setelah berulang sekitar 200 kali.
Apakah konstruksi DOM dianggap sebagai langkah kompilasi? Jika demikian, maka
x.htm
:sumber
<?include __FILE__;
.Java,
10295898878 byteIni berakhir dengan
StackOverflowError
yang terjadi karena sistem resolusi generik tidak dapat memutuskan root untuk menyelesaikan generik lainnya.Kredit yang jatuh tempo .
Apa yang terjadi di sini?
A<T>
hanya ada untuk memiliki 1 huruf induk. Itu generik. Saya bisa saja menggunakannyaList
, tetapi impor dan pengulangan 4 huruf terlalu panjang.B<T>
mendeklarasikan generik dasar.B extends A
diperlukan untuk memiliki hierarki antaraB
danA
.extends A<A>
membuat referensi diri padaA<T>
.A<? super B>
memicu pencarian untuk obat aktifA<T>
B<B<T>>
membuat referensi diri padaB<T>
.A<...> a=new B<>()
memaksa penggunaan obat generik, bukan hanya definisi dari mereka, memaksa resolusi saat kompilasiB
, dan tidak sesudahnya.A<?super B
menciptakan referensi-sendiri, jadi kami memiliki referensi untuk satu jenis dan yang lain dalam generikA
.B<A>
menciptakan referensi-sendiri, jadi kami memiliki referensi untuk satu jenis dan yang lain dalam generikB
.Sekarang, tipe
A
memiliki tipe generikA
danB
, tetapi mana yang harus dipilih? Lupakan tentang diri, mari kita coba untuk menyelesaikannyaB
. Ping.Oke,
B
punya tipe obat generikA
danB
, tapi mana yang harus dipilih? Lupakan tentang diri, mari kita coba untuk menyelesaikannyaA
. Pong.Semacam ini rekursi dapat benar-benar dihindari karena ada kasus-kasus yang sah seperti
A<B<A<B<A<B<Object>>>>>>
: misalnya objek JSON:List<Map<String,Map<String,List<Map<String,List<String>>>>>>
.Hasil kompilasi
Pada sistem saya, jejak stack berhenti setelah menunjukkan 1024 baris, yang sebenarnya adalah 4 baris yang sama diulang 256 kali, sehingga membuktikan rekursi tak terbatas. Saya akan menghindarkan Anda dari seluruh jejak itu.
Tabungan
interface
+implements
denganclass
+extends
.Long
denganA
(dua kali).new B<A>()
→new B<>()
).sumber
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>b=new B<>();}
B
berisi referensi yang tidak dapat diputuskan untuk generikA
yang pada gilirannya berisi referensi yang tidak dapat diputuskan untuk generik B. Ketika resolver tidak dapat memutuskan, ia memeriksa referensi yang disertakan, tetapi di sini kedua generik merujuk satu sama lain dengan cara yang tidak dapat ditentukan (sebagian besar berkat referensi diri dansuper
kata kunci. Jadi resolver sebenarnya melakukan ping-pong antara dua obat generik.public @interface X {@X(x=X.class)Class<? extends X> x();}
... Tapi saya segera menyadari mengapa itu tidak berhasil lol.GNU Makefile,
87 byteSatu byte disimpan berkat KonradRudolph
Disimpan sebagai
Makefile
dan dipanggil olehmake
:Ini akan menghasilkan rekursi build tak terbatas pada target pertama yang ditemukan
"x"
.Tidak perlu dikatakan bahwa Anda tidak benar - benar ingin menjalankan bom fork ini di server produksi Anda. :-)
Versi alternatif, 5 byte
Disarankan oleh KonradRudolph:
$_
adalah referensi ke argumen terakhir dari perintah sebelumnya. Lebih khusus, itu diselesaikan di sini sebagai jalur absolut ke perintah yang dieksekusi - yang itumake
sendiri.Ini seharusnya bekerja dengan baik di lingkungan Bash asli, tetapi tidak pada Windows + MinGW.
sumber
make
tidak benar-benar mengkompilasi Makefile (hanya menafsirkannya).C ++,
6058Secara berulang ini membuat instance
class a
dengan parameter templat yang berbeda. GCC 7.0 berhenti setelah 900 tingkat rekursi dengan banyak kesalahan tentangoperator->
menjadi pribadi tetapi misalnya ICC 17 dan Microsoft (R) C / C ++ Pengoptimal Pengoptimal 19 waktu habis di godbolt .Masalah dengan itu adalah bahwa mungkin semua kompiler akan kehabisan memori di beberapa titik waktu sehingga bahkan tanpa batas rekursi ini akan berhenti. Hal yang sama mungkin berlaku untuk jawaban Clojure juga.
Sunting: 2 byte disimpan oleh bolov - Terima kasih
sumber
a<int>i=i->b;
operator->
default adalah pribadi dalam kelas. Dalam sebuah struct itu publik dan karenanyai->b
dapat mengaksesnya.Perl ,
1513 byteCobalah online!
Sekarang dengan 2 byte yang disimpan: @Zaid mengingatkan saya pada cara terser untuk melakukan loop di Perl.
Ini cukup sederhana: itu hanya menginstal parser hook dengan loop tak terbatas, membuat kode membutuhkan waktu yang sangat lama untuk diuraikan. (Perl bagus karena memungkinkan Anda untuk menjalankan kode arbitrer di tengah parse; kait parser ditentukan dalam Perl itu sendiri, dan sering digunakan untuk melakukan hal-hal seperti mengimpor perpustakaan atau mengubah aturan parsing untuk pengidentifikasi yang ingin Anda perlakukan seperti kata kunci.) Coba online! tautan di atas memberikan
-c
opsi (untuk mengkompilasi kode untuk memverifikasi sintaksis untuk kebenaran, tetapi tidak menjalankannya), untuk membuktikan bahwa loop tak terbatas terjadi pada waktu kompilasi.Jika Anda bertanya-tanya tentang "waktu kompilasi" dalam bahasa scripting: Perl sebenarnya mengkompilasi ke bytecode dan kemudian menjalankan bytecode, tetapi ini adalah detail yang jarang relevan ketika memprogramnya. Keluarga
-MO=
opsi baris perintah dapat digunakan untuk melakukan hal-hal dengan bytecode selain menjalankannya (meskipun tidak dengan program ini, karena loop infinite terjadi sebelum bytecode dapat dihasilkan).sumber
a:goto a
terlihat bagus juga (bytecount sedih).BEGIN{{redo}}
akan menghemat beberapa byteC ++,
373029 byteIni menggunakan parameter fungsi otomatis masa depan. Itu diusulkan ke C ++ 17, tapi saya tidak berpikir itu berhasil.
gcc
Namun mendukungnya sebagai ekstensi.Pada dasarnya
setara dengan
Kode mencoba untuk instantiate
f
secara rekursif dengan argumen templat yang berbeda.gcc
gagal denganDengan
-ftemplate-depth=10000
saya mendapatkannya meludah "Dibunuh - waktu pemrosesan melebihi" pada godbolt.Periksa di godbolt
1 byte disimpan oleh Quentin. Terima kasih.
sumber
int
sebagai tipe pengembalian :)auto
parameter fungsi tidak membuatnya menjadi C ++ 17; dan jugaint f() { ... }, a;
bukan deklarasi hukum terakhir kali aku memeriksa. (Anda tidak dapat mencampur deklarasi fungsi dengan deklarasi variabel seperti itu.) Apa yang Anda dapatkan di sini adalah dialek CCC yang sangat spesifik untuk G ++. Bukan berarti ada yang salah dengan itu dalam konteks ini. :)Gangguan Umum, 8 byte
Kompiler akan mencoba membaca formulir dan akan menemukan makro sharpsign-dot reader, yang mengevaluasi kode pada waktu baca dan menggunakan hasilnya sebagai formulir untuk dikompilasi. Di sini, kode yang dieksekusi adalah infinite loop.
sumber
TeX, 9 byte
TeX bekerja dengan memperluas makro. Sebagian besar waktu, makro TeX (juga disebut urutan kontrol ) berbentuk
\name
tetapi juga dimungkinkan untuk mendefinisikan karakter tertentu sebagai makro, ini disebut karakter aktif . Karakter~
aktif secara default di TeX polos dan dapat digunakan sebagai nama makro tanpa deklarasi lebih lanjut. The\def~{~}
di atas mendefinisikan~
sehingga mengembang~
. Yaitu, setiap kali TeX bertemu~
maka ia menggantikannya~
dan kemudian memeriksa kembali penggantian, yang berarti bahwa ia menemukan kejadian yang sepenuhnya baru~
dan menggantikannya dengan~
. Ini mendefinisikan infinite loop. Yang diperlukan hanyalah memulai loop dan itulah yang dilakukan oleh final~
.Ditambahkan di edit
Untuk membuatnya dikompilasi dengan benar , aktifkan sebagai:
The
-ini
flag mengatakan bahwapdftex
harus mengkompilasi file format baru. Ini adalah sekumpulan definisi yang dikompilasi yang dapat dimuat ketika TeX kemudian dipanggil untuk mempercepat pemrosesan dokumen (LaTeX2e adalah contohnya). Saya kira itu&pdftex
menambahkan beberapa byte, sehingga total menjadi 17.sumber
pdftex
program sebagai "menafsirkan" input TeX untuk menghasilkan PDF sebagai "output" - dengan cara yang sama sepertig++
program "menafsirkan" input C ++ untuk menghasilkan file .exe sebagai "output". ;)Haskell, 25 + 17 = 42 byte
Metaprogram Haskell sederhana yang mendefinisikan nilai tak terbatas dan berupaya menghitung nilai itu pada waktu kompilasi.
Diminta dengan
ghc -XTemplateHaskell <file.hs>
(+17 untuk parameter ke kompiler)sumber
$(let a=a in a)
berfungsi (untuk 32 byte)?let a = a in a
akan ditulis ulang menjadi pengecualian, yang hanya menyebabkan kesalahan kompiler sebagai lawan dari loop infinite. (walaupun mungkin ini akan bekerja dengan kompiler Haskell yang berbeda, tapi saya tidak punya satu di tangan untuk mencoba)Exception when trying to run compile-time code: <<loop>>
, baik dalam penerjemah dan ketika mengkompilasi ... secara teknis kode di atas mati dengan pengecualian juga, tetapi stack overflow, yang secara eksplisit diizinkan oleh spesifikasi - dan jika Anda memiliki memori tak terbatas, itu akan benar-benar berulang selamanya. The<<loop>>
pengecualian kebakaran jauh sebelum komputer saya kehabisan memori.gradle,
109 bytedengan kode di atas ditempatkan di
build.gradle
file. Gradle menggunakan groovy sebagai bahasa dasarnya sehingga kami benar-benar berbicara tentang groovy di sini, tetapi karena pertanyaannya adalah tentang waktu pembuatan, saya pikir gradle akan lebih sesuai.Menjalankan perintah gradle build apa pun dengan kode di atas mencetak baris status build yang kompatibel dengan ratu-berambut:
jika Anda bertujuan untuk kenaikan gaji, tambahkan
-d
bendera debug untuk:yang selain tampak rumit rumit juga diperbarui dengan perangkat baru:
baris status setiap 10 detik membuatnya terlihat seperti build sibuk melakukan hal-hal teknis penting.
sumber
SWI-Prolog, 34 byte
Penjelasan
term_expansion/2
adalah sesuatu yang dipanggil secara otomatis oleh kompiler sebelum benar-benar mengkompilasi kode untuk mengubah beberapa istilah dalam kode sumber menjadi istilah lain.Di sini, kami memperkenalkan aturan baru untuk
term_expansion/2
:repeat,1=0.
.repeat/0
adalah predikat yang selalu berhasil, dan memberikan jumlah poin pilihan yang tidak terbatas.1=0
sedang mencoba untuk menyatukan1
dengan0
, yang selalufalse
. Ini akan menyebabkan compiler mundurrepeat
(karena selalu memberikan titik pilihan) dan coba1=0
lagi, dll.sumber
expand_term
sebagai gantinya (seperti yang dikatakanterm_expansion
tidak dapat digunakan seperti di sini di GNU Prolog). Itu tidak bekerja denganexpand_term
pada SWI sekalipun.GNU Make, 44
Saya tidak dapat mengklaim kredit untuk ini. Ini berasal dari buku Robert Mecklenburg, Managing Projects with GNU Make: The Power of GNU Make untuk Membangun Apa Pun .
Saya lebih suka ini daripada yang lain. Buat jawaban karena tidak menggunakan rekursi. Pada VM saya, jawaban Make lainnya melanjutkan proses forking dan pada kedalaman sekitar 7.000, VM terhenti dengan tidak responsif. Namun, dengan jawaban ini dapat terus tanpa batas tanpa memakan sumber daya sistem. Anda benar-benar dapat mengendur dengan bangunan ini. Saya telah melakukan lebih dari 1.000.000 iterasi tanpa degradasi sistem yang jelas.
Catatan saya harus menambahkan
sleep 1
agar cap waktu makefile benar-benar diperbarui setiap waktu. Anda dapat mengubah ini menjadisleep 0.01
jika Anda ingin membakar melalui iterasi sedikit lebih cepat.sumber
GNU Forth, 15 byte
Golf
Mendefinisikan ulang (mengkompilasi ulang) kata
:
dan memanggil loop tak terbatas langsung[do] [loop]
di dalam definisi baru (tepat pada waktu kompilasi).Cobalah secara Online!
sumber
Clojure, 21 byte
Mengikat kompiler dengan mendefinisikan makro yang berulang kali memancarkan panggilan untuk dirinya sendiri.
Di ponsel saya, ini menyebabkan REPL untuk menggantung dan tertinggal perangkat. Di laptop saya, ini gagal dengan StackOverflow.
Sayangnya StackOverflow terjadi secara instan, tetapi masih berlaku sesuai aturan.
sumber
MSBuild, 130 byte
Simpan ini sebagai file dengan
.proj
ekstensi, dan jalankan denganmsbuild
dari command prompt. MSBuild akan menjalankan satu-satunya target yang hanya memunculkanmsbuild
proses lain .sumber
C, 31 byte
Terinspirasi oleh Digital Trauma . Kompilasi dengan
-mcmodel=medium
bendera.Semoga berhasil mengompilasi ini, Anda akan membutuhkan 1,8 yottabytes RAM dan ruang disk.
sumber
Mathematica 33 Bytes
Kode akan berusaha mengevaluasi argumen secara simbolis sebelum kompilasi, dan argumen itu sendiri adalah loop tak terbatas. Fungsi While memiliki argumen nol detik karena tidak penting.
sumber
Compile
panggilan atau sebelum itu?Haskell (GHC, tanpa templat Haskell atau aturan penulisan ulang kustom) , 138
Secara teoritis, ini memasuki loop tak terbatas dengan cara yang hampir sama dengan pendekatan C ++ : metode polimorfik
y
dipakai untuk tipe yang lebih berbelit-belit. Dalam praktiknya, ukuran tumpukan yang dialokasikan sebenarnya meluap dengan cepat:Penghargaan untuk Luke Palmer .
sumber
Haskell (ghc), 32 + 2 = 34 byte
jalankan bersama
ghc -O <file>
. Memicu aturan penulisan ulang untuk fungsi utama yang menulis ulang untuk hal yang sama. Satu-satunya fitur malang adalah bahwa ghc cukup pintar untuk mendeteksi ini dan berhenti setelah 100 iterasi. Saya tidak tahu cara mudah untuk menonaktifkan perilaku ini.sumber
Boo, 25 byte
Ini mendefinisikan makro, yang mengeksekusi pada waktu kompilasi, yang mengeksekusi loop tak terbatas, dan kemudian memanggil makro.
sumber
Karat, 18 byte
Klasik termasuk diri. Rustc adalah waras yang mengganggu, dan secara default akan menyelamatkan setelah 128 rekursi, dan itu memperluas kedalaman-pertama sehingga pertumbuhan eksponensial tidak bekerja baik. Hal yang sama berlaku untuk solusi C dan C ++.
sumber
Faktor ,
2916Bagian di antara
<<
>>
dieksekusi pada waktu parse.Adapun apa yang
[ t ] loop
terjadi, saya akan membiarkan Anda menebak ...Anda dapat meletakkannya di Listener apa adanya, atau menambahkannya ke file kosakata atau skrip apa pun dengan hal-hal boilerplate yang sesuai.
sumber
PHP, 19 byte
sumber