KomputerPemrograman

Penyiar - adalah ... Jenis kompiler. Mengkonversi dan program siaran

Program, serta orang-orang untuk menerjemahkan dari satu bahasa ke bahasa lain memerlukan juru atau penerjemah.

konsep dasar

Program ini merupakan representasi linguistik dari perhitungan: i → P → P (i). Seorang penerjemah adalah sebuah program yang dipasok ke program masukan P dan beberapa masukan x. Ia melakukan di P x: I (P, x) = P (x). Fakta bahwa hanya ada satu penerjemah mampu melakukan semua program yang mungkin (yang dapat direpresentasikan dalam sistem formal) adalah penemuan Turing sangat mendalam dan signifikan.

Prosesor adalah juru program dalam bahasa mesin. Umumnya terlalu mahal untuk menulis interpreter untuk bahasa tingkat tinggi, sehingga mereka diterjemahkan ke dalam bentuk yang lebih mudah untuk menafsirkan.

Beberapa jenis penerjemah memiliki nama yang sangat aneh:

  • assembler menerjemahkan program bahasa assembly ke bahasa mesin.
  • Compiler menerjemahkan bahasa tingkat tinggi ke bahasa lebih rendah.

Penyiar - adalah sebuah program yang mengambil sebagai input data program dalam beberapa bahasa S dan menghasilkan program yang T sedemikian rupa bahwa mereka berdua memiliki semantik yang sama: P → X → T. Artinya, ∀x. P (x) = Q (x).

Jika disiarkan seluruh program menjadi sesuatu yang ditafsirkan, hal itu disebut kompilasi sebelum kompilasi eksekusi, atau AOT. AOT compiler dapat digunakan dalam seri, yang terakhir yang sering assembler, misalnya:

Kode sumber kompilator → (penerjemah) → → perakitan kode assembler (compiler) kode → → mesin CPU (interpreter).

kompilasi operasional atau dinamis terjadi jika program ini disiarkan, ketika dijalankan oleh bagian sebelumnya disusun lainnya. JIT compiler-ingat apa yang telah mereka lakukan agar tidak mengulangi kode sumber lagi dan lagi. Mereka bahkan dapat menghasilkan kompilasi adaptif dan kompilasi ulang berdasarkan perilaku lingkungan eksekusi program.

Banyak bahasa memungkinkan untuk mengeksekusi kode pada waktu kompilasi dan mengkompilasi kode baru saat runtime.

tahap penerjemahan

Broadcast terdiri dari langkah-langkah menganalisis dan mensintesis:

Kode sumber analyzer → → → konseptual representasi Generator (synthesizer) → kode Target.

Hal ini disebabkan alasan ini:

  • Metode lainnya tidak cocok. terjemahan kata hanya tidak bekerja.
  • Baik rekayasa solusi: jika Anda ingin menulis penerjemah untuk bahasa M dan N sumber ditargetkan perlu menulis hanya M + N program sederhana (polukompilyatorov) daripada M × N kompleks (total penerjemah).

Namun, dalam praktiknya, pandangan konseptual sangat jarang cukup ekspresif dan cukup kuat untuk menutupi setiap sumber dan target dibayangkan bahasa. Sementara beberapa mampu datang dekat ini.

kompiler nyata melewati banyak tahapan. Ketika membuat compiler Anda sendiri tidak perlu mengulang semua kerja keras yang telah dilakukan orang untuk membuat representasi dan generator. Anda dapat menerjemahkan bahasa Anda langsung di JavaScript atau C dan mengambil keuntungan dari JavaScript-mesin yang ada dan C compiler untuk melakukan sisanya. Anda juga dapat menggunakan representasi antara ada dan mesin virtual.

catatan penerjemah

Penyiar - adalah sebuah program atau perangkat keras, yang melibatkan tiga bahasa: sumber, tujuan dan dasar. Mereka dapat ditulis dalam T-bentuk, menempatkan kiri asli, kanan dan sasaran dasar bawah.

Ada tiga jenis compiler:

  • Penyiar - adalah samokompilyator jika itu sesuai dengan bahasa sumber dasar.
  • Compiler yang menargetkan bahasa adalah dasar, yang disebut samorezidentnym.
  • Penyiar - cross-compiler, jika ia ditargetkan dan dasar berbagai bahasa.

Mengapa hal ini penting?

Bahkan jika Anda tidak pernah membuat compiler nyata, pengetahuan yang baik dari teknologi penciptaannya, karena konsep yang digunakan untuk tujuan ini digunakan secara luas, misalnya:

  • teks format;
  • query bahasa ke database;
  • arsitektur komputer canggih;
  • masalah optimasi umum;
  • GUI;
  • bahasa scripting;
  • controller;
  • mesin virtual;
  • Terjemahan mesin.

Selain itu, jika Anda ingin menulis preprosesor, linker, loader, debugger dan profiler, Anda harus pergi melalui langkah-langkah yang sama seperti ketika menulis kompilator.

Anda juga dapat belajar bagaimana menulis program yang lebih baik, sejak penciptaan penerjemah untuk bahasa berarti pemahaman yang lebih baik dari kerumitan dan ambiguitas. Studi tentang prinsip-prinsip umum penyiaran juga memungkinkan Anda untuk menjadi bahasa desainer yang baik. Jadi bedanya bagaimana curam bahasa jika tidak dapat dilaksanakan secara efektif?

teknologi yang komprehensif

teknologi compiler mencakup berbagai bidang ilmu komputer:

  • teori formal bahasa: tata bahasa, parsing, komputabilitas;
  • arsitektur komputer. set instruksi, RISC atau CISC, siklus clock core processing pipelined, dll;
  • konsep bahasa pemrograman, misalnya, melakukan kontrol urutan, eksekusi kondisional, iterasi, rekursi, dekomposisi fungsional, modularitas, sinkronisasi, meta-pemrograman, ruang lingkup, konstan sub-jenis, template, jenis output, prototipe, penjelasan, aliran, monad, kotak surat, lanjutkan , wildcard, ekspresi reguler, memori transaksional, inheritance, polymorphism, pengaturan modus, dan sebagainya dll..;
  • bahasa abstrak dan mesin virtual;
  • algoritma dan struktur data: ekspresi reguler, algoritma parsing, algoritma grafis, pemrograman dinamis, pelatihan;
  • bahasa pemrograman: sintaks, semantik (statis dan dinamis), paradigma dukungan (struktural, OOP, fungsional, logis, stack, paralelisme, meta-programming);
  • pembuatan software (compiler, biasanya besar dan kompleks): lokalisasi, caching, componentize, API-interface, menggunakan kembali, sinkronisasi.

desain compiler

Beberapa masalah yang dihadapi dalam pengembangan penerjemah nyata:

  • Masalah dengan bahasa sumber. Apakah mudah untuk kompilasi? Apakah ada preprocessor? Bagaimana jenis? Apakah ada perpustakaan?
  • Pengelompokan melewati compiler: tunggal atau multi-arah?
  • Tingkat optimasi yang diinginkan. Cepat dan najis program siaran dengan sedikit atau tanpa optimasi bisa normal. Over-optimasi compiler akan memperlambat, tapi kode yang lebih baik pada saat runtime mungkin worth it.
  • Tingkat diperlukan deteksi kesalahan. Dapat penerjemah hanya berhenti pada kesalahan pertama? Ketika harus berhenti? Apakah akan mempercayai koreksi kesalahan compiler?
  • Ketersediaan alat. Jika bahasa asli tidak sangat kecil, scanner dan generator analisis yang diperlukan. Ada juga generator, generator kode, tetapi mereka tidak begitu umum.
  • Jenis kode target yang akan dihasilkan. Dipilih dari kode mesin ditambah atau virtual murni. Atau hanya menulis bagian entri yang menciptakan representasi menengah populer seperti LLVM, RTL, atau JVM. Atau membuat terjemahan asli dalam kode sumber dalam C atau JavaScript.
  • Format kode sasaran. Anda dapat memilih bahasa assembly, kode mesin portabel, gambar kode mesin memori.
  • Penargetan ulang. Ketika set generator adalah baik untuk memiliki porsi inlet umum. Untuk alasan ini yang terbaik adalah untuk memiliki satu generator untuk masukan dari banyak bagian.

compiler Arsitektur: komponen

Ini adalah komponen fungsional utama dari compiler yang menghasilkan kode asli (jika output program adalah program di C atau mesin virtual, Anda tidak perlu begitu banyak tahap):

  • Program input (tanda aliran) dimasukkan ke dalam scanner (leksikal analyzer), yang mengubahnya menjadi aliran token.
  • Parser (parser) membangun satu pohon sintaks abstrak.
  • analyzer semantik terurai informasi semantik dan memeriksa node pohon untuk kesalahan. Akibatnya, dibangun semantik grafik - pohon sintaks abstrak dengan sifat tambahan dan link didirikan.
  • Generator kode menengah membangun grafik aliran (tupel dikelompokkan ke dalam blok utama).
  • Mesin-independen kode optimizer melakukan baik lokal (dalam unit dasar) dan global (untuk semua blok) optimasi pada dasarnya tersisa dalam rutinitas. Mengurangi kode berlebihan dan menyederhanakan perhitungan. Hasilnya adalah grafik aliran modifikasi.
  • Generator mengikat target kode blok dasar menjadi kode kontrol transmisi bujursangkar, menciptakan file objek assembler maya register (mungkin tidak efektif).
  • Mesin-dependent optimizer, linker mengalokasikan memori antara register dan membuat tim perencanaan. Ia melakukan program konversi dalam bahasa assembly di majelis ini dengan baik penggunaan pipelining.

Selain itu, penggunaan deteksi kesalahan manajer subsistem dan tabel simbol.

Analisis leksikal (scanning)

Pemindai mengubah karakter sumber aliran ke dalam aliran token, menghapus spasi, komentar dan memperluas macro.

Scanner sering menghadapi masalah, seperti apakah atau tidak untuk memperhitungkan kasus, margin, jeda baris dan tertanam komentar.

Kesalahan yang mungkin terjadi selama pemindaian, disebut leksikal dan meliputi:

  • karakter yang tidak dalam alfabet;
  • kelebihan jumlah karakter dalam sebuah kata atau baris;
  • bukan pertanda tertutup atau string literal;
  • akhir file dalam komentar.

Parsing (parsing)

parser mengubah urutan token menjadi pohon sintaks abstrak. Setiap node di pohon disimpan sebagai objek dengan nama bidang, banyak yang sendiri node pohon. Pada tahap ini tidak ada siklus. Bila Anda membuat parser perlu memperhatikan tingkat kompleksitas tata bahasa (LL atau LR) dan mencari tahu apakah ada aturan disambiguasi. Beberapa bahasa memang membutuhkan analisis semantik.

Kesalahan ditemukan pada tahap ini disebut sintaks. Sebagai contoh:

  • k = 5 * (7 - y;
  • j = / 5;
  • 56 = x * 4.

analisis semantik

Selama analisis semantik untuk memeriksa kebolehan aturan dan bagian asosiasi dari pohon parsing (yang memungkinkan nama referensi memasukkan operasi untuk konversi tipe implisit, dan sebagainya. D.) Untuk membentuk grafik semantik.

Jelas, set diterimanya aturan dalam bahasa yang berbeda berbeda. Jika Anda mengkompilasi bahasa Jawa-seperti, kompiler dapat menemukan:

  • variabel beberapa deklarasi dalam ruang lingkup;
  • referensi ke variabel sebelum deklarasi;
  • referensi untuk nama dideklarasikan;
  • pelanggaran hak paten;
  • jumlah yang berlebihan atau tidak cukup argumen dalam panggilan metode;
  • type mismatch.

generasi

generasi kode menengah menghasilkan grafik aliran terdiri dari tupel, dikelompokkan ke dalam blok dasar.

generasi kode menghasilkan kode mesin nyata. Dalam compiler tradisional untuk RISC-mesin pada langkah pertama, Anda membuat assembler dengan jumlah tak terbatas register virtual. Untuk CISC-mesin mungkin tidak akan terjadi.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 delachieve.com. Theme powered by WordPress.