Jun 02, 2023 Pemrograman Sistem

Front End and Back End

Front end dan back and dalam hal ini membahas tentang kompilasi front end dan tahapannya, serta tentang kompilasi back and dan tahapannya.

FRONT END

Front end menganalisis source code untuk membangun representasi internal program, yang disebut intermediate representation atau IR. Itu juga mengelola tabel simbol, struktur data yang memetakan setiap simbol dalam source code ke informasi terkait seperti lokasi, jenis, dan cakupan. Ini dilakukan dalam beberapa tahap, yang meliputi beberapa hal berikut:

  1. Line reconstruction. Bahasa yang menghapus kata kuncinya atau mengizinkan spasi arbitrer dalam pengidentifikasi memerlukan fase sebelum penguraian, yang mengubah urutan karakter input menjadi bentuk kanonik yang siap untuk parser. Top-down, recursive-descent, table-driven parser yang digunakan pada 1960-an biasanya membaca sumber satu karakter pada satu waktu dan tidak memerlukan fase tokenisasi terpisah. Atlas Autocode, dan Imp (dan beberapa implementasi Algol dan Coral66) adalah contoh bahasa yang dikupas yang kompilernya akan memiliki fase Line reconstruction.
  2. Lexical analysis memecah teks kode sumber menjadi potongan-potongan kecil yang disebut token. Setiap token adalah unit atom tunggal bahasa, misalnya kata kunci, pengidentifikasi, atau nama simbol. Sintaks token biasanya adalah bahasa reguler, jadi finite state automaton yang dibuat dari ekspresi reguler dapat digunakan untuk mengenalinya. Fase ini disebut juga lexing atau scanning, dan perangkat lunak yang melakukan analisis leksikal disebut lexical analyzer atau scanner.
  3. Preprocessing. Beberapa bahasa, misalnya C, membutuhkan fase preprocessing yang mendukung substitusi makro dan kompilasi bersyarat. Biasanya fase preprocessing terjadi sebelum analisis sintaksis atau semantik; misalnya dalam kasus C, preprosesor memanipulasi token leksikal daripada bentuk sintaksis. Namun, beberapa bahasa seperti Scheme mendukung substitusi makro berdasarkan bentuk sintaksis.
  4. Semantic analysis adalah fase di mana kompiler menambahkan informasi semantik ke pohon parse dan membangun tabel simbol. Fase ini melakukan pemeriksaan semantik seperti pengecekan tipe (memeriksa kesalahan tipe), atau pengikatan objek (mengasosiasikan referensi variabel dan fungsi dengan definisinya), atau penugasan pasti (mengharuskan semua variabel lokal diinisialisasi sebelum digunakan), menolak program yang salah atau mengeluarkan peringatan. Analisis semantik biasanya memerlukan pohon parse yang lengkap, yang berarti bahwa fase ini secara logis mengikuti fase parsing, dan secara logis melanjutkan fase pembuatan kode, meskipun seringkali dimungkinkan untuk melipat beberapa fase menjadi satu pass over kode dalam implementasi kompiler.

BACK END

Istilah back end kadang-kadang bingung dengan code generator karena fungsi yang tumpang tindih dalam menghasilkan kode rakitan. Beberapa literatur menggunakan middle end untuk membedakan analisis generik dan fase pengoptimalan di back end dari machine-dependent code generators.

Fase utama back end meliputi sebagai berikut:

  1. Analysis: Ini adalah pengumpulan informasi program dari representasi perantara yang berasal dari input. Typical analyses adalah analisis aliran data untuk use-define chains, dependence analysis, alias analysis, pointer analysis, escape analysis, dll. Analisis yang akurat adalah dasar untuk setiap pengoptimalan kompiler. Call graph dan control flow graph biasanya juga dibangun selama fase analisis.
  2. Optimization: representasi bahasa perantara diubah menjadi bentuk yang setara secara fungsional tetapi lebih cepat (atau lebih kecil). Optimalisasi yang populer adalah inline expansion, dead code elimination, constant propagation, loop transformation, register allocation, atau bahkan automatic parallelization.
  3. Code generation: bahasa perantara yang diubah diterjemahkan ke dalam bahasa keluaran, biasanya bahasa mesin asli dari sistem. Ini melibatkan keputusan sumber daya dan penyimpanan, seperti memutuskan variabel mana yang cocok ke dalam register dan memori dan pemilihan dan penjadwalan instruksi mesin yang sesuai bersama dengan mode pengalamatan yang terkait.

Compiler analysis adalah prasyarat untuk pengoptimalan kompiler apa pun, dan mereka bekerja sama dengan erat. Misalnya, dependence analysis sangat penting untuk loop transformation.

Selain itu, cakupan analisis dan optimisasi kompiler sangat bervariasi, mulai dari blok dasar hingga tingkat prosedur/fungsi, atau bahkan keseluruhan program (optimasi antarprosedur). Jelas, kompiler berpotensi melakukan pekerjaan yang lebih baik menggunakan tampilan yang lebih luas. Tetapi pandangan luas itu tidak gratis: analisis dan pengoptimalan lingkup besar sangat mahal dalam hal waktu kompilasi dan ruang memori; ini terutama berlaku untuk analisis dan optimisasi antarprosedur.

Karena waktu dan ruang ekstra yang diperlukan untuk analisis dan pengoptimalan kompiler, beberapa kompiler melewatkannya secara default. Pengguna harus menggunakan opsi kompilasi untuk secara eksplisit memberi tahu kompiler pengoptimalan mana yang harus diaktifkan.

Lexical analysis

Dalam ilmu komputer, analisis leksikal adalah proses mengubah urutan karakter menjadi urutan token. Program yang melakukan analisis leksikal disebut lexical analyzers atau lexer. Sebuah lexer sering diatur sebagai fungsi scanner dan tokenizer yang terpisah, meskipun batasannya mungkin tidak ditentukan dengan jelas.

Lexical grammar

Spesifikasi bahasa pemrograman akan mencakup seperangkat aturan, sering dinyatakan secara sintaksis, menentukan rangkaian urutan karakter yang mungkin dapat membentuk token atau leksem. Karakter spasi sering diabaikan selama analisis leksikal.

Tokens

Token adalah blok teks yang dikategorikan. Blok teks yang sesuai dengan token dikenal sebagai leksem. Seorang penganalisa leksikal memproses leksem untuk mengkategorikan mereka sesuai dengan fungsi, memberi mereka makna. Penetapan makna ini dikenal sebagai tokenisasi. Token bisa terlihat seperti apa saja; itu hanya perlu menjadi bagian yang berguna dari teks terstruktur.

Pertimbangkan ungkapan ini dalam bahasa pemrograman C:

sum=3+2;

Tokenisasi dalam tabel berikut:

LexemeToken Type
sumIDENT
=ASSIGN_OP
3NUMBER
+ADD_OP
2NUMBER
;SEMICOLON

Token sering ditentukan oleh ekspresi reguler, yang dipahami oleh lexical analyzer generator seperti lex. Penganalisis leksikal (baik dihasilkan secara otomatis oleh alat seperti lex, atau hand-crafted) membaca aliran karakter, mengidentifikasi leksem dalam aliran, dan mengkategorikannya ke dalam token. Ini disebut “tokenizing.” Jika lexer menemukan token yang tidak valid, lexer akan melaporkan kesalahan.

Mengikuti tokenizing adalah parsing. Dari sana, data yang diinterpretasikan dapat dimuat ke dalam struktur data, untuk penggunaan umum, interpretasi, atau kompilasi.

Pertimbangkan teks yang menjelaskan perhitungan:

46 – number of (cows);

Lexeme di sini mungkin: “46”, “-“, “number_of”, ” (” , “cows” , “)” dan “;”. Penganalisis leksikal akan menunjukkan leksem “46” sebagai ‘number’, “-” sebagai ‘karakter’ dan “number_of” sebagai token terpisah. Bahkan leksem “;” dalam beberapa bahasa (seperti C) memiliki arti khusus.

The Scanner

Tahap pertama, scanner, biasanya didasarkan pada finite state machine. Itu telah menyandikan di dalamnya informasi tentang kemungkinan urutan karakter yang dapat terkandung dalam token apa pun yang ditanganinya (contoh individu dari urutan karakter ini dikenal sebagai leksem). Misalnya, token bilangan bulat dapat berisi urutan karakter angka numerik. Dalam banyak kasus, karakter non-whitespace character pertama dapat digunakan untuk menyimpulkan jenis token yang mengikuti dan karakter input berikutnya kemudian diproses satu per satu hingga mencapai karakter yang tidak ada dalam kumpulan karakter yang dapat diterima untuk token tersebut (ini dikenal sebagai maximal munch rule). Dalam beberapa bahasa, aturan pembuatan leksem lebih rumit dan mungkin melibatkan penelusuran balik atas karakter yang telah dibaca sebelumnya.

The Tokenizer

Tokenization adalah proses membatasi dan mungkin mengklasifikasikan bagian dari string input karakter. Token yang dihasilkan kemudian diteruskan ke beberapa bentuk pemrosesan lainnya. Prosesnya dapat dianggap sebagai sub-tugas input parsing.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *