Cara Kerja Compiler dan Penggunaan Dalam Bahasa Pemograman Ruby

Vincentiusmickey
5 min readMay 4, 2023

--

Apa Itu Compiler?

Compiler adalah sebuah program yang digunakan untuk mengonversi kode yang ditulis dalam natural language processing agar dapat dipahami oleh komputer.

Technopedia menyebut bahwa proses konversi ini sebagai compilating. Pada proses ini, compiler mengeksekusi kode yang menunjukkan kapan sinyal tinggi dan rendah biner diperlukan dalam unit logika aritmatika prosesor.

Terdapat dua jenis compiler yang umum digunakan oleh web developer.

Cross compiler yang berjalan pada mesin ‘A’ dan menghasilkan kode untuk mesin lain ‘B’. Compiler ini mampu membuat kode untuk platform berbeda selain platform yang dijalankan.

Source-to-source compiler atau disebut juga transcompiler, yaitu compiler yang menerjemahkan kode sumber yang ditulis dalam satu bahasa pemograman menjadi kode sumber bahasa pemrograman lain.

Meskipun tugas utama compiler adalah mengonversi kode, ada beberapa tugas lain yang juga dijalankan. Berikut di antaranya.

Memecah program sumber menjadi beberapa bagian dan menerapkan struktur tata bahasa padanya.

Membangun program target yang diinginkan dari representasi perantara dan membuat tabel simbol.

Mengompilasi kode sumber dan mendeteksi kesalahan di dalamnya.

Mengelola ruang penyimpanan semua variabel dan kode.

Melakukan dukungan untuk kompilasi terpisah.

Membaca dan menganalisis seluruh program untuk kemudian diterjemahkan ke dalam padanan semantik.

Menerjemahkan kode sumber ke dalam kode objek sesuai dengan jenis mesin yang digunakan.

Fase-Fase dalam Compiler

Berikut adalah dua fase utama yang dilalui dalam proses compiler.

1. Fase analisis

Pada fase representasi, perantara dibuat dari kode sumber berikut.

  • Lexical analyzer yang membagi program dalam bentuk “token”.
  • Syntax analyzer, berfungsi mengenali “kalimat” dalam program menggunakan sintaks bahasa
  • Semantic analyzer, bertugas memeriksa semantik statis dari setiap konstruksi.
  • Intermediate code generator, yaitu generator menghasilkan kode “abstrak”.

2. Fase sintesis

Ketika memasuki fase sintesis, program target yang setara dibuat dari representasi perantara. Terdapat dua bagian dalam fase ini.

  • Code optimizer, bertugas mengoptimasi kode abstrak yang dihasilkan intermediate code generator.
  • Code generator, yang menerjemahkan kode dari intermediate code generator menjadi instruksi mesin yang spesifik.

Manfaat Menggunakan Compiler

Compiler adalah sebuah perangkat yang bermanfaat untuk menerjemahkan kode sehingga program dapat berjalan dengan baik.

Selain itu, kamu bisa mendapatkan keuntungan-keuntungan berikut ketika menggunakan compiler.

  • Compiler memverifikasi seluruh program, jadi tidak ada kesalahan sintaks atau semantik.
  • File yang dapat dieksekusi dioptimalkan oleh compiler, sehingga dieksekusi lebih cepat.
  • Memungkinkanmu membuat struktur internal dalam memori.
  • Kamu tidak perlu menjalankan program pada mesin yang sama dengan yang dibangunnya.
  • Kamu bisa menerjemahkan seluruh program dalam bahasa lain.
  • Dapat membuat file ke dalam disk.
  • Menautkan file ke dalam format yang dapat dieksekusi.
  • Memeriksa kesalahan sintaks dan tipe data.
  • Membantumu meningkatkan pemahamanmu tentang bahasa semantik.
  • Membantu menangani masalah kinerja bahasa.
  • Teknik yang digunakan untuk membuat compiler dapat digunakan untuk program lain.

Compiler Dalam Bahasa Ruby

Performa Ruby telah banyak meningkat, versi demi versi… dan tim pengembangan Ruby berupaya keras untuk membuat Ruby lebih cepat lagi!

Salah satu upaya tersebut adalah proyek 3×3.

Bagian dari proyek ini adalah kompiler MJIT baru

MJIT Dijelaskan

MJIT adalah singkatan dari "Method Based Just-in-Time Compiler".

Maksudnya itu apa?

Ruby mengkompilasi kode Anda ke dalam instruksi YARV , instruksi ini dijalankan oleh Mesin Virtual Ruby .

JIT menambahkan lapisan lain untuk ini.

Ini akan mengkompilasi instruksi yang sering digunakan ke dalam kode biner.

Hasilnya adalah biner yang dioptimalkan yang menjalankan kode Anda lebih cepat.

Bagaimana itu bekerja

Anda dapat mengaktifkan JIT dengan Ruby 2.6 & opsinya --jit.

Seperti ini :

ruby --jit app.rb

Ruby hadir dengan serangkaian opsi khusus JIT yang akan membantu kita menemukan dengan tepat cara kerjanya. Anda dapat melihat opsi ini dengan menjalankan ruby --help.

Berikut daftar opsinya

  • –jit-tunggu
  • –jit-verbose
  • –jit-save-temps
  • –jit-max-cache
  • –jit-min-panggilan

Opsi verbose ini terlihat seperti titik awal yang bagus!

Kita juga akan menggunakan --jit-wait, ini membuat Ruby menunggu sampai kompilasi kode JIT selesai sebelum menjalankannya.

Selama operasi normal, JIT mengkompilasi kode di utas pekerja & tidak menunggu sampai selesai.

Inilah perintah yang dapat Anda jalankan untuk menguji ini:



ruby --disable-gems --jit --jit-verbose= 1 --jit-wait -e "4.times { 123 }"

Ini mencetak :

Selesai MJIT sukses

JIT tidak melakukan apa-apa.

Mengapa?

Karena secara default, JIT hanya beraksi ketika sebuah metode dipanggil 5 kali ( jit-min-calls) atau lebih.

Jika kita menjalankan ini:


ruby --disable-gems --jit --jit-verbose= 1 --jit-wait -e "5.times { 123 }"

Sekarang kita mendapatkan sesuatu yang menarik :

Sukses JIT ( 32 . 1ms ) : blokir di < main > @-e :1 - > /tmp/_ruby_mjit_p13921u0 . C    

Apa artinya ini?

JIT mengkompilasi blok karena kita memanggilnya 5 kali , ini memberi tahu Anda:

  • Berapa lama untuk mengkompilasi ( 32.1ms),
  • Persis apa yang dikompilasi ( block in <main>)
  • File yang dihasilkan ( /tmp/_ruby_mjit_p13921u0.c) sebagai sumber kompilasi ini

File ini adalah kode sumber C yang dikompilasi menjadi file objek ( .o) & kemudian menjadi file pustaka bersama ( .so).

Anda bisa mendapatkan akses ke file-file ini jika Anda menambahkan --jit-save-tempsopsi.

Berikut contohnya :

Ini adalah pemahaman saya saat ini tentang cara kerja JIT :

  1. Hitung panggilan metode
  2. Ketika satu metode dipanggil 5 kali (default untuk jit-min-calls) memicu JIT
  3. File AC yang berisi instruksi untuk metode ini dibuat (ini adalah instruksi YARV , tetapi sebaris)
  4. Kompilasi terjadi di latar belakang (kecuali --jit-wait) menggunakan kompiler C biasa seperti GCC
  5. Saat kompilasi selesai, file pustaka bersama yang dihasilkan digunakan saat metode ini dipanggil

MJIT sangat menyukai loop !

Tapi bagaimana tarifnya dengan aplikasi yang lebih kompleks?

Mari kita coba dengan aplikasi Sinatra sederhana :

membutuhkan ' sinatra ' <font> < /font>
<font> </font>
dapatkan '/' lakukan < font >< /font>
"apel, jeruk & pisang"<font></font >
akhir < font >< / font >

Ini mungkin tidak terlihat banyak, tetapi sedikit kode ini menjalankan lebih dari 500 metode berbeda. Cukup untuk memberikan JIT beberapa pekerjaan yang harus dilakukan!

Untuk lebih spesifik, ini adalah Sinatra 2.0.4 dengan Thin 1.7.2.

Sumber :

https://glints.com/id/lowongan/compiler-adalah/#.ZFPhO3alYQZ

https://blog.heroku.com/ruby-mjit#register-oriented-virtual-machine-architecture

https://blog.appsignal.com/2022/09/07/jit-compilers-for-ruby-and-rails-an-overview.html

--

--