Kompilator: Perbedaan antara revisi

Konten dihapus Konten ditambahkan
DamenaKo (bicara | kontrib)
Menambahkan tahap pengoptimalan dalam analisis semantik dan penghasilan kode target
Tag: kemungkinan menambah konten tanpa referensi atau referensi keliru VisualEditor
DamenaKo (bicara | kontrib)
k memperbaiki kata dan menambah referensi,
Baris 16:
Profesor [[Niklaus Wirth]] dalam bukunya ''Compiler Construction'' <ref name="cbe">[https://web.archive.org/web/20110805035946/http://www.inf.ethz.ch/personal/wirth/books/CompilerConstruction/CBE.pdf Compiler Construction], (''update'' Juni 2011)</ref> menyatakan bahwa penggunaan ''assembler'' sebagai bahasa perantara sering kali tidak memberikan keuntungan yang signifikan, sehingga dia menyarankan agar kompilator langsung menghasilkan bahasa mesin. Kompilator dengan arsitektur seperti ini dapat berjalan dengan sangat cepat, seperti yang ditunjukkan pada kompilator orisinil [[Pascal]], [[Modula-2]] dan [[Oberon]] yang dibuat oleh sang profesor.
 
== FaseTahap-fasetahap dalam kompilasi ==
Suatu ''kompilator'' harus menganalisis kode asal terlebih dahulu untuk memahami seluruh kode tersebut. Hasil dari analisis itu berbentuk representasi dari kode asal, yang nanti akan diterjemahkan oleh ''kompilator'' ke dalam bahasa target. Oleh karena itu, ''kompilator'' terdiri dari beberapa fasetahap. Setiap fasetahap memiliki tugas masing-masing dalam proses kompilasi.<ref name=":0">{{Cite journal|last=Bornat|first=Richard|date=1979|title=Understanding and Writing Compilers|url=http://dx.doi.org/10.1007/978-1-349-16178-2|doi=10.1007/978-1-349-16178-2}}</ref>
 
=== Analisis leksikal ===
{{Main|Analisis leksikal}}
 
Analisis leksikal adalah fasetahap di mana ''kompilator'' menganalisamenganalisis setiap karakter (seperti huruf, tanda kurung, dsb.) dalam kode asal dan menghasilkan deretan simbol yang masing-masing dinamakan ''token.<ref name=":0" />'' Biasanya simbol-simbol tadi disimpan dalam bentuk [[larik]].<ref>{{Cite web|date=2023-06-18|title=Scanning · Crafting Interpreters|url=https://web.archive.org/web/20230618023650/https://craftinginterpreters.com/scanning.html|website=web.archive.org|access-date=2023-07-15}}</ref>
 
=== Analisis sintaks ===
{{Main|Parsing}}
 
Analisis sintaks atau ''parsing'' adalah fasetahap di mana ''kompilator'' menganalisis ''token-token'' yang dihasilkan dalam proses analisis leksikal dan mengelompokkan mereka menjadi suatu [[pohon uraian]] berdasarkan struktur bahasa asal.<ref name=":0" />
 
=== Analisis semantik ===
{{Main|Analisis semantik}}
Analisis semantik adalah fasetahap atau proses yang menggunakan pohon uraian hasil dari analisis sintaks tadi untuk memastikan konsistensi semantik dari program, dan juga mengoptimalkan struktur dari program. Proses ini juga mengumpulkan dan menganalisis informasi mengenai [[tipe data]] dari [[Variabel (ilmu komputer)|variabel-variabel]] yang ada di dalam program. Informasi tentang tipe data ini disimpan dalam [[Symbol Table|tabel simbol]] atau langsung di dalam pohon uraian ''parsing,'' yang nanti akan dimanfaatkan dalam penghasilan kode ''target''. <ref name=":1">{{Cite book|last=Aho|first=Alfred V.|last2=Sethi|first2=Ravi|last3=Ullman|first3=Jeffrey D.|date=2002|title=Compilers: principles, techniques, and tools|location=Reading, Mass.|publisher=Addison-Wesley|isbn=978-0-201-10088-4|edition=Reprinted, with corr., [36. Druck]|series=Addison-Wesley series in computer science}}</ref>
 
=== Penghasilan kode target ===
{{Main|Code generation}}
 
Pada fasetahap ini, kompilator menggunakan semua informasi mengenai kode asal yang telah dikumpulkan dalam fasetahap-fasetahap sebelumnya, untuk menghasilkan kode target<ref name=":1" />. Kode target dapat berupa [[Intermediate representation|representasi perantara]], yang nanti dapat diproses oleh komponen lain (seperti assembler, LLVM, Java, dsb.), atau bisa jadi langsung berupa kode mesin. Dalam proses ini, kompilator juga melakukan pengoptimalan kode ''target'' agar kinerja program menjadi lebih baik.<ref name="cbe" />
 
== Kompilator ''single pass'' dan kompilator ''multi-pass'' ==
Metode yang digunakan kompilator dalam menggunakan fasetahap-fasenyatahapnya terbagi menjadi dua. Kompilator dapat memproses kode asal secara keseluruhan dalam suatu fasetahap lalu mengopor hasil dari proses tersebut ke fasetahap berikutnya, di mana fasetahap berikutnya kembali memproses kode asal secara keseluruhan, inilah yang dinamakan kompilator ''multi-pass,'' yaitu kompilator tersebut memproses kode asal dalam dua kali jalan atau lebih.
 
Sedangkan, kompilator ''single pass'' memproses hanya sebagian dari kode asal dalam setiapsuatu fasetahap lalu mengopor hasil dari proses tersebut kepada fasetahap berikutnya, jika semua tahap sudah dilalui, maka kompilator lanjut kepada bagian berikutnya dari kode asal. Dengan begini, kompilator ''single pass'' memproses kode asal hanya dalam satu kali jalan.<ref name=":0" />
 
Sering diinterpretasikan melalui definisi ini, bahwa kompilator ''single-pass'' lebih cepat daripada kompilator ''multi-pass''. Interpretasi ini tidaklah benar.<ref name=":0" /> Selama fasetahap-fasetahap dalam kedua jenis kompilator itu sama, dan kode asal yang diproses juga sama, maka kedua jenis kompilator tersebut tetap saja mengerjakan jumlah pekerjaan yang sama. Sehingga kecepatan dari keduanya juga sama.
 
== Lihat pula ==