Skip to main content

Cara Kerja Proses Kompilasi dalam Bahasa Pemrograman

Bahasa pemrograman dapat diimplementasikan dengan salah satu dari tiga metode yang dikenal secara umum, yaitu compile (kompilasi), interpret, dan hybrid. Salah satu teknik (yang ekstrim), adalah bahwa program/kode dapat diterjemahkan ke dalam bahasa mesin, yang kemudian dapat dieksekusi langsung di komputer. Metode ini disebut dengan implementasi compiler dan memiliki keuntungan bahwa eksekusi program tersebut sangat cepat, setelah proses penerjemahan selesai. Sebagian besar implementasi bahasa, seperti C, COBOL, C ++, dan Ada, dilakukan oleh compiler.

Bahasa pemrograman yang diterjemahkan oleh compiler disebut sebagai bahasa sumber (source language / source code). Proses kompilasi dan eksekusi program berlangsung dalam beberapa fase, yang paling penting ditunjukkan pada gambar di bawah ini.
Proses Kompilasi
Suatu piranti yang disebut dengan lexical analyzer (berfungsi untuk analisa leksikal) akan mengumpulkan karakter-karakter dari program sumber ke dalam unit-unit leksikal. Unit-unit leksikal dari suatu program adalah identifiers, special words (keywords & reserved words), operator, dan berbagai simbol tanda baca. Lexical analyzer akan mengabaikan komentar dalam program sumber karena compiler tidak menggunakannya.

Suatu piranti lain yang disebut syntax analyzer (berfungsi untuk menganalisa sintaks) akan mengambil unit-unit leksikal dari lexical analyzer dan menggunakannya untuk membangun struktur hierarki yang disebut dengan parse trees (struktur seperti pohon). Parse trees ini mewakili struktur sintaksis program. Dalam banyak kasus, tidak benar-benar ada struktur parse trees yang dibangun; melainkan, menghasilkan informasi yang diperlukan untuk membuat suatu tree (struktur pohon) dan untuk digunakan secara langsung.

Intermediate code generator (suatu piranti untuk membuat kode perantara) menghasilkan program dalam bahasa yang berbeda, pada tingkat perantara yang menjadi perantara program sumber dan hasil akhir dari compiler: yaitu program bahasa mesin. Bahasa perantara tersebut terkadang sangat mirip dengan bahasa assembly, dan terkadang memang bahasa assembly. Dalam kasus lain, kode perantara berada pada level yang agak lebih tinggi daripada bahasa assembly. Piranti lain yang disebut semantic analyzer (untuk menganalisa semantik) adalah bagian integral dari intermediate code generator. Semantic analyzer memeriksa errors (kesalahan), seperti kesalahan tipe data, yang sulit, untuk dideteksi selama analisa sintaks.

Optimasi, yang berfungsi untuk meningkatkan program (biasanya dalam bentuk versi kode perantara) dengan cara membuatnya lebih kecil atau lebih cepat atau keduanya sekaligus, seringkali merupakan bagian opsional dari teknik kompilasi. Bahkan, beberapa compiler tidak mampu melakukan optimasi yang signifikan. Jenis compiler ini akan digunakan dalam situasi di mana kecepatan eksekusi program yang diterjemahkan jauh lebih penting daripada kecepatan kompilasi. Contoh dari situasi seperti ini adalah laboratorium komputasi untuk para programmer pemula. Dalam kebanyakan dunia komersial dan industri, kecepatan eksekusi lebih penting daripada kecepatan kompilasi, sehingga optimasi adalah sesuatu yang diinginkan secara rutin. Karena banyak jenis optimasi sulit dilakukan pada bahasa mesin, kebanyakan optimasi dilakukan pada kode perantara.

Piranti yang disebut code generator berfungsi untuk menerjemahkan versi kode perantara yang sudah dioptimasi dari suatu program ke dalam program bahasa mesin.

Suat tabel simbol akan berfungsi sebagai basis data untuk proses kompilasi. Konten utama dari tabel simbol adalah informasi jenis dan atribut dari setiap nama yang ditentukan pengguna dalam program. Informasi ini ditempatkan di tabel simbol oleh lexical analyzer dan syntax analyzer dan digunakan oleh semantic analyzer dan code generator.

Seperti yang dinyatakan sebelumnya, meskipun bahasa mesin yang dihasilkan oleh compiler dapat dieksekusi langsung pada perangkat keras, hal ini hampir selalu harus dijalankan bersama dengan beberapa kode lainnya. Sebagian besar program tersebut juga memerlukan program-program dari sistem operasi. Yang paling umum misalnya adalah program untuk input dan output. Compiler membuat suatu panggilan ke program sistem (operasi) saat dibutuhkan oleh program yang dibuat programmer. Sebelum program bahasa mesin yang dihasilkan oleh compiler bisa dieksekusi, program-program yang diperlukan dari sistem operasi harus ditemukan dan ditautkan ke program yang dibuat programmer. Operasi penautan ini menghubungkan program yang dibuat programmer ke program-program sistem dengan menempatkan berbagai alamat titik masuk dari program sistem supaya bisa dipanggil ke dalam program yang dibuat programmer. Kode yang dibuat programmer dan sistem tersebut secara bersama-sama kadang-kadang disebut dengan load module, atau executable image. Proses mengumpulkan program-program sistem dan menghubungkannya dengan program yang dibuat programmer disebut dengan linking dan loading, atau kadang-kadang hanya linking. Proses ini dilakukan oleh program sistem yang disebut linker.

Selain program sistem, program dari programmer harus sering dikaitkan dengan program lain (yang dibuatt oleh programmer juga) yang sudah dikompilasi sebelumnya yang berada di library. Jadi linker tidak hanya menghubungkan program yang diberikan ke program sistem, tetapi juga menghubungkannya dengan program pengguna yang lain.

Kecepatan koneksi antara memori komputer dan prosesornya biasanya menentukan kecepatan komputer, karena instruksi seringkali dapat dieksekusi lebih cepat didandingkan dengan ketika instruksi dapat dipindahkan ke prosesor untuk dieksekusi. Koneksi ini disebut bottleneck von Neumann; hal ini adalah faktor kelemahan dalam aspek kecepatan komputer arsitektur von Neumann. Bottleneck von Neumann telah menjadi salah satu motivasi utama untuk penelitian dan pengembangan komputer paralel.

--o0o--

Artikel terkait:

Comments

Popular posts from this blog

Pengertian Binding dalam Bahasa Pemrograman dan Kapan Terjadinya

Binding dimaksudkan sebagai pengikatan (association) antara suatu entity dengan atributnya, misalnya binding/pengikatan antara suatu variable dengan tipe datanya atau dengan nilainya, atau dapat juga antara suatu operasi dengan simbol, misalnya simbol + dikenali sebagai operasi penjumlahan atau simbol ^ dikenali sebagai operasi pangkat, dll.  Peristiwa binding dan kapan terjadinya binding (biasanya disebut dengan binding time ) berperan penting dalam membicarakan semantics suatu bahasa pemrograman. Beberapa kemungkinan binding time adalah:

Latihan Soal Jawab Matematika Diskrit

Berikut di bawah ini adalah latihan soal jawab untuk matematika diskrit dengan topik-topik: Pernyataan Logika Circuits dan Ekspresi Boolean Argumen (valid/tidak valid) Teori Himpunan Permutasi Fungsi --o0o-- Pernyataan Logika 1. Buatlah tabel kebenaran untuk menentukan yang mana tautology dan yang mana contradiction dalam pernyataan logika (a) dan (b) di bawah ini: a. (p ∧ q) ∨ (∼p ∨ (p ∧ ∼q)) b.  (p ∧ ∼q) ∧ (∼p ∨ q)

Contoh proses normalisasi relasi dari UNF – 1NF – 2NF – dan 3NF

Dalam posting tulisan tentang: “Tujuan dan Manfaat Normalisasi dalam Perancangan Database” , kita sudah mempelajari tentang: “Apa itu normalisasi” dan “Mengapa kita perlu melakukan normalisasi”. Kedua pertanyaan itu sudah terjawab dalam tulisan tersebut.  Kemudian dalam posting tulisan tentang: “Konsep Ketergantungan Fungsional, Normalisasi, dan Identifikasi Primary Key dalam Perancangan Sistem Database” , kita sudah mempelajari suatu konsep penting yang digunakan untuk melakukan normalisasi, yaitu konsep ketergantungan fungsional yang terdiri dari ketergantungan penuh, ketergantungan parsial atau sebagian, dan ketergantungan transitif. Proses normalisasi pertama-tama dilakukan dengan mengidentifikasi adanya ketergantungan-ketergantungan tersebut dalam relasi-relasi dan kemudian menghilangkannya. Cara melakukan normalisasi, mengidentifikasi berbagai macam ketergantungan, dan menghilangkan ketergantungan pada relasi-relasi bisa dipelajari ulang dalam postingan tulisan di at