Ini didasarkan pada pembicaraan tentang kompiler yang saya dengarkan beberapa waktu lalu, tapi saya, sayangnya, tidak dapat mengingat kapan atau di mana.
Buat kompilator terpendek dalam bahasa apa pun yang dapat dikompilasi sendiri. Targetkan setiap ISA yang wajar (68K, x86, MIPS, ARM, SPARC, IBM BAL, dll.) Yang tidak memiliki instruksi "program-kompilasi" (ini mungkin mengecualikan beberapa versi VAX). Baca program sumber dari stdin
dan cetak kode yang dihasilkan ke stdout
. Anda dapat menggunakan pustaka C standar untuk I / O dan pemrosesan string (misalnya, _printf
). Anda tidak perlu mengkompilasi seluruh bahasa, sembarang subset yang berisi kompiler (yaitu, hanya mencetak quine bahasa assembly, meskipun mengesankan, tidak dihitung sebagai solusi.)
#!/usr/local/bin/tcc -run
di baris pertama sumber C Anda, dan jalankan langsung dari baris perintah." Itu keren sekali.Jawaban:
Subset Haskell → C - 18926 karakter
Ini mengkompilasi sebagian kecil Haskell ke C. Fitur yang didukungnya:
Fitur yang hilang terbesar adalah variabel bersarang (artinya tidak ada lambda / let / where / case), pengecekan tipe, dan kelas tipe. Program yang dihasilkan membocorkan memori, dan kompilasi sendiri membutuhkan sekitar 200 megabita pada sistem saya ( pengumpul sampah Boehm banyak membantu, tetapi hanya jika kompiler mengoptimalkan rekursi ekor dengan baik).
Untuk bootstrap, batalkan komentar pada tiga baris pertama (tidak dihitung dalam skor) dan kompilasi dengan GHC. Compiler mengambil kode subset Haskell pada stdin dan menghasilkan kode C pada stdout.
Sudah lama bukan karena bahasanya kompleks, tetapi karena saya malas.
Namun, saat ini solusi terpendekTidak lagi. Kira saya tidak akan bosan akhir pekan ini.sumber
Bahasa Khusus → C - (7979)
Karena pertanyaannya tidak menghalangi pembuatan bahasa saya sendiri, saya pikir saya akan mencobanya.
Lingkungan
Bahasa ini memiliki akses ke dua tumpukan, The Call Stack, dan The Data Stack. Tumpukan panggilan digunakan untuk instruksi melompat
{
dan}
, sedangkan tumpukan data digunakan oleh sebagian besar instruksi lainnya. Stack Panggilan buram untuk aplikasi.Stack Data dapat menampung tiga jenis nilai: integer, teks, dan kosong. Integer bertipe intptr_t, sementara teks disimpan sebagai string gaya-C.
The
^
instruksi memiliki akses ke Array The. Array adalah array konstan dengan panjang 17 dari item teks. Anda mungkin harus melihat sumber untuk skema pengindeksan karena itu sedikit miring.Bahasa
Kompiler
Ini adalah kompiler. Ini bukan golf, dan saya berharap ini bisa dikurangi. Seharusnya dimungkinkan untuk menggunakan kode mesin secara langsung dan mengeluarkan file COM dos, tapi saya belum sempat melakukannya. Saya tahu ini terlihat seperti program C, tetapi implementasi kompiler yang sebenarnya turun pada akhirnya.
Saat ini kompiler menghasilkan banyak informasi debug pada stderr.
Untuk mengkompilasi kode C yang dihasilkan:
Charset diperlukan karena kompiler lolos dari karakter khusus dengan menambahkan 128.
Bootstrap
Untuk mengkompilasi kompiler pertama, saya menulis sebuah interpreter python untuk bahasa tersebut.
Menyatukan Semuanya
Dengan anggapan Anda telah menyimpan kompiler sebagai
compiler.cmp
dan bootstrap sebagaibootstrap.py
, inilah cara membuat kompiler, dan kemudian menggunakannya untuk mengkompilasi sendiri:Jadi saya bukan programmer C, saya juga bukan desainer bahasa, jadi saran untuk meningkatkan ini sangat disambut baik!
Contoh Program
Halo Dunia!
sumber
Extended Brainfuck v0.9: 618 bytes (tidak termasuk linefeeds yang tidak sempurna)
Ini adalah versi golf dari versi pertama EBF saya dengan dukungan yang dihapus untuk komentar dan kode mati untuk mendukung penghapusan variabel.
Jadi pada dasarnya BrainFuck dengan variabel.
:x
menciptakan variabel x. Kompiler tahu di mana Anda berada sehingga$y
akan menghasilkan <'s dan> untuk sampai ke posisi itu. Terkadang Anda membutuhkan loop asimetris dan kemudian Anda harus memberi tahu kompiler di mana Anda berada@x
. Sebagai EBF saat ini dikompilasi ke Brainfuck.Versi pertama ini hanya memiliki satu nama variabel char, tetapi saya telah menggunakan versi ini untuk mengkompilasi versi berikutnya dan seterusnya hingga versi saat ini yang memiliki set fitur yang mengesankan. Ketika mengkompilasi dari sumber github, ia benar-benar mengunduh binary handcompiled untuk bootstrap 6 versi ebf menengah untuk membuat versi saat ini.
Untuk mem-bootstrapnya, Anda dapat menggunakan binary ini pertama dan satu-satunya di repositori git EBF yang berhasil dikompilasi dengan tangan setelah beberapa kali mencoba.
Brainfuck memiliki beberapa implementasi perangkat keras, misalnya. ini , ini dan ini untuk menyebutkan beberapa. Tetapi sebagian besar sangat mudah untuk diterapkan, Anda bisa menerapkan juru bahasa pada sistem apa pun. Saya sering bercanda bahwa Zozotez LISP , yang ditulis dalam EBF, mungkin adalah LISP paling portabel yang pernah ada.
sumber
Hex, 550 byte
Ini secara khusus menargetkan sistem x86_64 yang menjalankan Linux.
Dalam bahasa ini, kode sumber terdiri dari byte yang direpresentasikan sebagai dua digit heksadesimal huruf kecil
[0-9a-f][0-9a-f]
,. Bytes ini mungkin memiliki jumlah spasi putih di sekitarnya, tetapi tidak ada yang dapat terjadi di antara digit yang membentuk satu byte. Selanjutnya,'!'
adalah karakter baris-komentar: diabaikan, serta segala sesuatu di antara itu dan'\n'
karakter berikutnya .Jika Anda memahami rakitan x86, inilah versi kode sumber yang lebih mudah dibaca:
Jika Anda mengekstrak bahasa rakitan dari komentar di bawah
! Program Code
, Anda dapat merakit dan menjalankan kompiler Hex. Input dan output menggunakan stdin dan stdout.sumber
Hex
bukan bahasa.Subset Javascript -> Java, 504 byte
sumber
05AB1E , 2 byte (mungkin tidak bersaing)
Cobalah online!
Kode pada baris input pertama, input pada baris berikutnya.
sumber
Kayu , 0 byte
Lumber adalah bahasa pemrograman esoterik lengkap yang ditemukan oleh Unrelated String yang ditulis hanya dalam 10 baris kode Prolog.
Tidak bisa percaya? Program-program ini memiliki komentar yang dihapus dan membuat sumber juru bahasa lebih ringkas.
lumber_corefuncs.pl:
lumber_types.pl
lumber_corefuncs.pl mengambil lumber_types di perpustakaan; dan pada gilirannya, perpustakaan ini mendefinisikan sebuah modul tanpa apa pun di dalamnya. Oleh karena itu, Kayu tidak melakukan apa pun pada input arbiter, yang pada gilirannya adalah self-compiler.
sumber
Nihil , 0 byte
sumber