Bagaimana Cara Kerja Kompiler? [Tutup]

17

Catatan: Saya terkejut bahwa ini belum pernah ditanyakan sebelumnya, dan jika sudah, saya tidak dapat menemukannya dalam pencarian.

Saya telah mengunjungi banyak situs web, saya telah membaca banyak artikel, dan saya telah mendengar banyak penjelasan. Sebagian besar dari mereka bagus, tetapi semuanya terlalu luas atau terlalu rumit atau buruk. Jadi pertanyaan saya adalah, bagaimana cara kerja kompiler?

Jika ini adalah pertanyaan yang sulit dan luas, tolong beri tahu saya. Tetapi jika tidak, harap jawab pertanyaannya.

Dinamis
sumber
4
Terlalu luas, setidaknya bagian "Bagaimana cara kerjanya". Ada banyak buku yang ditulis tentang topik itu.
Oded
1
en.wikipedia.org/wiki/Compiler akan menjadi tautan Wikipedia yang sepele untuk ditemukan, apa yang khusus Anda tanyakan? Pertanyaannya cukup luas sehingga saya akan tergoda untuk memberikan jawaban yang cerdas, "Kompiler menerjemahkan kode dari satu bahasa ke bahasa lain," karena itu adalah gagasan umum yang memiliki banyak nuansa di dalam ketika seseorang mulai melihat apa yang benar-benar melibatkan.
JB King
1
Ya dan saya pikir itu sudah dijawab dengan cukup baik.
Jeremy
1
Penjelasan tentang cara kerja kompiler akan terlalu luas atau terlalu rumit. Ini adalah topik yang rumit, dan kelas kompiler adalah kursus terkait komputer yang paling sulit yang pernah saya ikuti.
David Thornley
1
@ David Tentu saja kompiler rumit, dan Anda tidak dapat menjelaskan semua detail tentang bagaimana mereka bekerja di sini. Namun, saya yakin Anda memiliki pemahaman tingkat tinggi dasar tentang apa itu kompiler atau cara kerjanya sebelum Anda mengambil kursus kompiler Anda.
Dima

Jawaban:

24

Compiler adalah program yang menerjemahkan kode sumber untuk program lain dari bahasa pemrograman menjadi kode yang dapat dieksekusi.

Kode sumber biasanya dalam bahasa pemrograman tingkat tinggi (misalnya Pascal, C, C ++, Java, Perl, C #, dll.). Kode yang dapat dieksekusi dapat berupa urutan instruksi mesin yang dapat dieksekusi oleh CPU secara langsung, atau mungkin merupakan representasi perantara yang ditafsirkan oleh mesin virtual (misalnya kode byte Java).

Singkatnya, kompiler mengubah program dari format yang bisa dibaca manusia menjadi format yang bisa dibaca mesin.

Mengenai cara kerja kompiler, itu memang rumit. Ada buku-buku dan kursus universitas tentang masalah ini. Saya akan mencoba untuk menguraikan secara singkat tahapan utama dari proses, tetapi ini akan menjadi gambaran yang sangat sepintas lalu.

  1. Lexing - memecah teks program menjadi "token". Token adalah "kata" dari bahasa pemrograman, seperti pengidentifikasi (kata kunci, nama variabel, nama fungsi, dll.) Atau operator (=, *, &, dll.).
  2. Parsing - mengonversi urutan token menjadi pohon parse, yang merupakan struktur data yang mewakili berbagai konstruksi bahasa: deklarasi tipe, deklarasi variabel, definisi fungsi, loop, conditional, ekspresi, dll.
  3. Optimasi - mengevaluasi ekspresi konstan, mengoptimalkan variabel yang tidak digunakan atau kode yang tidak dapat dijangkau, membuka gulungan jika memungkinkan, dll.
  4. Terjemahkan pohon parse ke dalam instruksi mesin (atau kode byte JVM).

Sekali lagi, saya menekankan bahwa ini adalah deskripsi yang sangat singkat. Kompiler modern sangat cerdas, dan akibatnya sangat rumit.

Dima
sumber
2
Sebenarnya, itu mengubah bahasa menjadi yang lain. Kompiler C ++ awal melakukan kompilasi ke C. Hal yang sama berlaku untuk kompiler Vala. Kompiler Java mengkompilasi menjadi bytecode yang tidak dapat dieksekusi tanpa kompiler JIT JVM.
deadalnix
1
@deadalnix IMHO, intinya adalah Anda beralih dari kode yang tidak dapat dieksekusi ke kode yang dapat dieksekusi. Saya berpendapat bahwa C-front bukan kompiler tetapi front-end ke kompiler C. Atau tahap dalam proses kompilasi, jika Anda mau. Mesin virtual mengaburkan batas antara "executable" dan "non-executable", tentu saja. Di sini saya hanya akan mempertimbangkan kode yang dapat dieksekusi sebagai apa pun yang masuk ke dalam mesin virtual, seperti kode byte, dan memisahkan apa pun yang terjadi di dalam VM, seperti JIT.
Dima
1
@ Dima, tidak harus dari kode yang tidak dapat dieksekusi ke kode yang dapat dieksekusi. Misalnya Anda tidak dapat menjalankan kode byte JVM secara langsung pada mesin Windows.
1
@ Thorbjørn Ravn Andersen: tetapi kode byte dapat dieksekusi oleh JVM. Bukankah seluruh titik dari "mesin virtual" terlihat seperti mesin nyata bagi programmer?
Dima
2
Saya berpendapat bahwa secara tradisional kompiler mengubah program dari format yang dapat dibaca manusia menjadi format yang dapat dibaca mesin, seperti yang dikatakan Dima. Variasi seperti Cfront mengkonversi C ++ ke C atau javac mengkonversi Java menjadi bytecode adalah topik yang lebih maju yang mungkin harus dibiarkan sampai setelah menjelaskan konsep dasar, tradisional kepada seseorang yang tidak terbiasa dengannya.
Carson63000
5

Compiler adalah program komputer (atau serangkaian instruksi) yang mengubah kode sumber yang ditulis dalam bahasa pemrograman (bahasa sumber) menjadi bahasa komputer lain (bahasa target, sering memiliki bentuk biner yang dikenal sebagai kode objek). Alasan paling umum untuk ingin mengubah kode sumber adalah untuk membuat program yang dapat dieksekusi.

Compiler menjembatani program sumber dalam bahasa tingkat tinggi dengan perangkat keras yang mendasarinya. Kompiler membutuhkan:

  1. Menentukan kebenaran sintaks program
  2. Menghasilkan kode objek yang benar dan efisien
  3. Organisasi run-time
  4. Memformat output menurut konvensi assembler dan / atau linker.
Mario Stylianou
sumber