Papan Peringkat - JIT Dikompilasi (Lebih Rendah Lebih Baik)
- es1024 - 81.2 poin (termasuk kompiler yang berfungsi!)
- Kieth Randall - 116 poin
- Ell - 121 poin
Papan - Ditafsirkan (Lebih rendah lebih baik)
- Martin Büttner - 706654 poin (sekitar 2 jam).
- criptych - 30379 poin (97 detik)
Misi Anda, jika Anda memilih untuk menerimanya, adalah untuk menulis bytecode interpreter / VM terkecil. VM / interpreter menggunakan arsitektur CISC kecil (ukuran operasi dapat bervariasi), dengan bahasa yang ditentukan di bawah ini. Setelah selesai, Anda harus mencetak nilai 3 register CPU untuk membuktikan bahwa output yang benar dicetak (3.126.900.366).
Penyusun
Jika Anda ingin membuat tes sendiri, kompiler diposting di bawah ini. Jangan ragu untuk memposting tes Anda dengan jawaban Anda.
Spesifikasi "VM"
VM memiliki 3 register integral 32 32 bit yang tidak ditandai: R0, R1, R2. Mereka direpresentasikan dalam hex sebagai 0x00, 0x01, dan 0x02.
Operasi berikut harus didukung:
Formatnya adalah [nama] [... operan ...], [kode-heksadesimal] [... operan diulang ...]
- LOAD [daftar] [nilai 4 byte], 0x00 [daftar] [nilai 4 byte]
- PUSH [daftar], 0x02 [daftar]
- POP [daftar], 0x03 [daftar]
- TAMBAH [daftar, 1 byte] [daftar, 1 byte], 0x04 [daftar] [daftar]
- SUB [daftar, 1 byte] [daftar, 1 byte], 0x05 [daftar] [daftar]
- MULI [daftar, 1 byte] [daftar, 1 byte], 0x06 [daftar] [daftar]
- DIV [daftar, 1 byte] [daftar, 1 byte], 0x07 [daftar] [daftar]
- JMP [baris kode, 4 byte], 0x08 [nomor baris kode 4 byte]
- CMP [daftar, 1 byte] [daftar, 1 byte], 0x09 [daftar] [daftar]
- BRANCHLT [baris kode, 4 byte], 0x0a [nomor baris kode 4 byte]
Beberapa catatan:
- Operasi matematika di atas menambahkan nilai 2 register bersama-sama, menempatkan output di register pertama.
- CMP, operator pembanding, harus membandingkan nilai 2 register dan menyimpan output dalam beberapa flag internal (ini bisa khusus implementasi) untuk digunakan di masa depan pada instruksi cabang.
- Jika BRANCH dipanggil sebelum CMP, kecuali BRANCHEQ dipanggil, "VM" seharusnya tidak bercabang.
- PUSH / POP secara tak terduga mendorong atau mengeluarkan nomor dari tumpukan.
- Lompat dan Cabang operator melompat ke operasi tertentu (baris kode), bukan alamat biner.
- Operasi cabang tidak melakukan perbandingan. Sebaliknya, mereka mengambil output dari perbandingan terakhir untuk dieksekusi.
- Operator Branch and Jump menggunakan sistem pengindeksan angka garis berbasis nol. (Misalnya JMP 0 melompat ke baris pertama)
- Semua operasi harus dilakukan pada angka yang tidak ditandatangani yang melimpah ke nol dan tidak membuang pengecualian pada bilangan bulat bilangan bulat.
- Pembagian dengan nol tidak diperbolehkan dan dengan demikian, perilaku program tidak didefinisikan. Anda dapat (misalnya) ...
- Hancurkan program.
- Akhiri pelaksanaan VM dan kembalikan ke kondisi saat ini.
- Tampilkan pesan "ERR: Division by 0".
- Pengakhiran program didefinisikan sebagai ketika penunjuk instruksi mencapai akhir program (program yang tidak kosong dapat diasumsikan).
Output Keluaran harus persis seperti ini (termasuk baris baru)
R0 3126900366
R1 0
R2 10000
Poin
Poin dihitung berdasarkan rumus berikut:Number Of Characters * (Seconds Needed To Run / 2)
Untuk menghindari perbedaan perangkat keras yang menyebabkan waktu yang berbeda, setiap tes akan dijalankan di komputer saya (i5-4210u, ram 8GB) di server ubuntu atau Windows 8, jadi cobalah untuk tidak menggunakan beberapa runtime gila-eksotik yang hanya dikompilasi pada Dual G5 Mac Pro dengan tepat 762,66 mb RAM gratis.
Jika Anda menggunakan runtime / bahasa khusus, silakan kirim tautannya.
- Untuk pihak yang berkepentingan, saya telah memposting kode pengujian (ditulis dalam C #) di sini: http://pastebin.com/WYCG5Uqu
Program Tes
Ide itu datang dari sini , jadi kami akan menggunakan versi program mereka yang agak dimodifikasi.
Output yang benar untuk program ini adalah: 3.126.900.366
Dalam C:
int s, i, j;
for (s = 0, i = 0; i < 10000; i++) {
for (j = 0; j < 10000; j++)
s += (i * j) / 3;
}
Dalam kode: [R0 mewakili s, R1 j, R2 i]
LOAD R0 0
LOAD R2 0 <--outer loop value
LOAD R1 0 <--inner loop value
--Begin inner loop--
PUSH R1 <--push inner loop value to the stack
MUL R1 R2 <--(i*j)
PUSH R2
LOAD R2 3
DIV R1 R2 <-- / 3
POP R2
ADD R0 R1 <-- s+=
POP R1
PUSH R2
LOAD R2 1
ADD R1 R2 <--j++
POP R2
PUSH R2
LOAD R2 10000
CMP R1 R2 <-- j < 10000
POP R2
BRANCHLT 3 <--Go back to beginning inner loop
--Drop To outer loop--
LOAD R1 1
ADD R2 R1 <--i++
LOAD R1 10000
CMP R2 R1 <-- i < 10000
LOAD R1 0 <--Reset inner loop
BRANCHLT 2
Dalam biner / hex:
0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x02 0x00 0x00 0x00 0x00
0x00 0x01 0x00 0x00 0x00 0x00
0x02 0x01
0x06 0x01 0x02
0x02 0x02
0x00 0x02 0x00 0x00 0x00 0x03
0x07 0x01 0x02
0x03 0x02
0x04 0x00 0x01
0x03 0x01
0x02 0x02
0x00 0x02 0x00 0x00 0x00 0x01
0x04 0x01 0x02
0x03 0x02
0x02 0x02
0x00 0x02 0x00 0x00 0x27 0x10
0x09 0x01 0x02
0x03 0x02
0x0a 0x00 0x00 0x00 0x03
0x00 0x01 0x00 0x00 0x00 0x01
0x04 0x02 0x01
0x00 0x01 0x00 0x00 0x27 0x10
0x09 0x02 0x01
0x00 0x01 0x00 0x00 0x00 0x00
0x0a 0x00 0x00 0x00 0x02
Poin Bonus (Efek diterapkan multiplikasi) Misalnya jika Anda memenuhi syarat untuk ketiganya, itu akan menjadi ((karakter * 0,50) * 0,75) * 0,90
- 50% berkurang jika penerjemah sebenarnya adalah kompiler JIT
- Penurunan 25% jika menerapkan segala bentuk pengulangan membuka gulungan / optimasi yang berarti.
- Penurunan 10% jika Anda memperpanjang VM dengan
- BRANCHEQ [baris kode, 4 byte] (Cabang jika sama - opcode 0x0b)
- BRANCHGT [kode baris, 4 byte] (Cabang jika lebih besar dari - opcode 0x0c)
- BRANCHNE [kode baris, 4 byte] (Cabang jika tidak sama - opcode 0x0d)
- RLOAD [register 1] [register 2] (pindahkan nilai register 2 ke register 1 - opcode 0x01).
Tidak diizinkan
- Mengompilasi kasus uji ke dalam program dilarang. Anda harus menerima bytecode dari STDIN atau dari file (Tidak masalah yang mana).
- Mengembalikan output tanpa menjalankan program.
- Cara lain yang dapat Anda pikirkan untuk menipu persyaratan VM.
CMP
memeriksa kurang dari atau setara? Dan apa yang terjadi pada hasilnya?
MUL
dan DIV
juga tidak ditentukan. Haruskah mereka ditandatangani atau tidak ditandatangani? Apa yang terjadi pada multiplication overflow?