Lewati ke isi
JRG++JRG++ v0.2.0

Di balik layar

Tiga mesin

Interpreter, VM bytecode, dan backend LLVM, serta cara ketiganya dijaga tetap sama.

Ketiga mesin memakai bagian depan yang sama (pemindai dan pengurai), jadi sintaks dan pesan galat sintaksnya identik. Bedanya ada di cara program dijalankan.

InterpreterVMLLVM native
perintahjrgc f.jrgjrgc f.jrg --vmjrgc f.jrg --emit-llvm
cara kerjamenjalankan pohon sintaks langsungmenerjemahkan ke bytecode lalu menjalankannyamenerjemahkan ke LLVM IR, dikompilasi clang jadi kode mesin
bahasaseluruhnyaseluruhnyasemua berkas konformans, belum seluruh pustaka
goroutinethread sistemthread sistemkorutin di satu thread
cocok untukcoba-coba, skripprogram yang perlu lebih cepatprogram jadi, biner mandiri, APK kanvas

Satu program, satu arti

Program yang jalan di dua mesin harus mencetak keluaran yang sama persis, termasuk pesan galatnya, letak kolomnya, dan saat galat itu terjadi. Kalau dua mesin menjawab berbeda, salah satunya rusak dan diperbaiki, tidak dibiarkan sebagai "perbedaan implementasi".

Ini dijaga dengan tabel program yang dijalankan di beberapa mesin sekaligus lalu keluarannya dibandingkan:

TabelIsiJumlah
interpreter = VMprogram yang keluarannya harus identik617
ditolak keduanyaprogram yang harus ditolak dua mesin dengan pesan yang benar365
interpreter = LLVMprogram yang keluarannya harus identik311
belum di LLVMprogram yang ditolak LLVM dengan alasan yang jelas28
konformansberkas uji semantik lengkap11 dari 11 di ketiga mesin

Angka ini dari versi 0.2.0; seluruh rangkaian ujinya berisi 851 tes. Tidak ada satu pun program yang diketahui jalan di dua mesin dan menjawab berbeda.

Interpreter

Mesin bawaan. Paling cepat mulai, dan pesan galatnya membawa jejak pemanggilan. Goroutine di sini adalah thread sistem operasi sungguhan.

VM

Program diterjemahkan dulu jadi instruksi bytecode yang ringkas, lalu dijalankan. Untuk perulangan dan pemanggilan fungsi yang berat, VM jauh lebih cepat daripada interpreter. Galatnya menunjuk baris dan kolom yang sama persis.

LLVM native

--emit-llvm menghasilkan program native yang berdiri sendiri. Untuk kerja angka dan pemanggilan fungsi, kecepatannya setara C (lihat Benchmark).

Yang perlu diketahui:

  • Bilangan bulat di sini 64 bit, bukan 128. Luapan tetap diperiksa, dan angka yang tidak muat ditolak dengan menyebut i128.
  • Konkurensi berjalan sebagai korutin di satu thread: spawn, channel, dan select bekerja, tapi tidak paralel. Kebuntuan dilaporkan, tidak menggantung.
  • Fitur yang belum didukung ditolak saat kompilasi dengan alasannya, tidak pernah menghasilkan program yang salah. Daftarnya di Yang belum jadi.