KomputerPengaturcaraan

Penerjemah adalah ... Jenis penterjemah. Menukar dan menterjemahkan program

Program, seperti orang, memerlukan penterjemah atau penterjemah untuk menterjemahkan dari satu bahasa ke bahasa lain.

Konsep asas

Program ini merupakan perwakilan linguistik perhitungan: i → P → P (i). Interpreter adalah program yang menerima input P dan beberapa input data x. Ia melakukan P pada x: I (P, x) = P (x). Hakikat bahawa terdapat satu penerjemah yang mampu melakukan semua program yang mungkin (yang boleh diwakili dalam sistem formal) adalah penemuan Turing yang sangat mendalam dan penting.

Pemproses adalah penerjemah program dalam bahasa mesin. Ia biasanya terlalu mahal untuk menulis penterjemah untuk bahasa peringkat tinggi, jadi ia diterjemahkan ke dalam bentuk yang lebih mudah untuk mentafsir.

Beberapa jenis penterjemah mempunyai nama yang sangat pelik:

  • Assembler menerjemahkan program dalam pemasangan kepada bahasa mesin.
  • Pengkomputeran diterjemahkan dari bahasa peringkat tinggi ke bahasa peringkat rendah.

Penerjemah adalah program yang menerima program dalam bahasa S sebagai input dan menghasilkan program dalam T dengan cara yang kedua-duanya mempunyai semantik yang sama: P → X → Q. Iaitu, ∀x. P (x) = Q (x).

Jika anda menerjemahkan keseluruhan program ke dalam sesuatu yang ditafsirkan, maka ini dipanggil kompilasi sebelum pelaksanaan, atau kompilasi AOT. Penyusun AOT boleh digunakan secara berurutan, yang terakhirnya yang sering menjadi penghimpun, contohnya:

Kod sumber → Kompilator (pengkompil) → Kod pemasang → Assembler (penterjemah) → Kod mesin → CPU (penterjemah).

Penyusunan dalam talian atau dinamik berlaku jika sebahagian daripada program diterjemahkan apabila bahagian lain yang disusun dilaksanakan. JIT-penterjemah mengingati apa yang telah mereka lakukan, supaya tidak mengulangi kod sumber lagi dan lagi. Mereka juga boleh menghasilkan kompilasi penyesuaian dan penggubahan semula, berdasarkan tingkah laku persekitaran runtime.

Banyak bahasa membolehkan anda melaksanakan kod semasa terjemahan dan menyusun kod baru semasa runtime.

Peringkat terjemahan

Terjemahan ini terdiri daripada tahap analisis dan sintesis:

Kod sumber → Analyzer → Konsep pandangan → Generator (synthesizer) → Kod sasaran.

Ini disebabkan oleh sebab-sebab berikut:

  • Kaedah lain tidak sesuai. Terjemahan perkataan demi perkataan tidak berfungsi.
  • Penyelesaian kejuruteraan yang baik: jika anda perlu menulis penterjemah untuk bahasa sumber M dan bahasa sasaran N, anda perlu menulis hanya program mudah M + N (kompilator separa), bukan kompleks M × N (penterjemah penuh).

Walau bagaimanapun, dalam praktiknya, perwakilan konseptual sangat jarang cukup ekspresif dan berkuasa untuk menampung semua sumber dan bahasa sasaran yang boleh difikirkan. Walaupun sesetengah daripada mereka boleh mendekatinya.

Pengkomputeran sebenar melalui banyak peringkat. Apabila mencipta pengkompil anda sendiri, anda tidak perlu mengulang semua kerja keras yang telah dilakukan oleh orang apabila membuat pandangan dan penjana. Anda boleh menterjemahkan bahasa anda secara langsung ke dalam JavaScript atau C dan menggunakan enjin JavaScript dan penyusun C sedia ada untuk melakukan yang lain. Anda juga boleh menggunakan pandangan perantaraan dan mesin maya yang sedia ada .

Catat penterjemah

Penerjemah adalah program atau alat teknikal di mana tiga bahasa terlibat: sumber, sasaran dan asas. Mereka boleh ditulis dalam bentuk T, meletakkan sumber di sebelah kiri, sasaran di sebelah kanan, dan asas di bawah.

Terdapat tiga jenis penyusun:

  • Seorang penterjemah adalah pengkomputer diri jika bahasa sumbernya sepadan dengan asasnya.
  • Pengkompil, yang bahasa sasarannya bersamaan dengan bahasa asas, dipanggil pemastautin diri.
  • Seorang penerjemah adalah penyusun silang jika ia mempunyai bahasa target yang berbeza dan bahasa asas.

Mengapa ini penting?

Walaupun anda tidak pernah membuat pengkompil yang sebenar, adalah baik untuk mengetahui tentang teknologi penciptaannya, kerana konsep yang digunakan untuk ini digunakan di mana-mana, contohnya dalam:

  • Pemformatan teks;
  • Bahasa pertanyaan ke pangkalan data;
  • Senibina komputer yang dilanjutkan;
  • Masalah pengoptimuman umum;
  • Antara muka grafik;
  • Bahasa skrip;
  • Pengawal;
  • Mesin maya;
  • Terjemahan mesin.

Di samping itu, jika anda ingin menulis preprocessor, pembina, loader, debugger, atau profiler, anda perlu melalui langkah yang sama seperti ketika menulis compiler.

Anda juga boleh belajar bagaimana menulis program dengan lebih baik, kerana mencipta penerjemah untuk bahasa bermakna pemahaman yang lebih baik tentang kehalalan dan kekaburannya. Belajar prinsip-prinsip am terjemahan juga memungkinkan untuk menjadi pereka bahasa yang baik. Adakah begitu penting, betapa tajamnya bahasa itu, jika ia tidak dapat direalisasikan dengan berkesan?

Teknologi komprehensif

Teknologi pengkompil meliputi banyak bidang sains komputer:

  • Teori bahasa formal: tatabahasa, parsing, computability;
  • Arsitektur komputer: set arahan, RISC atau CISC, pipelining, kernel, kitaran jam, dan sebagainya;
  • Konsep bahasa pengaturcaraan: contohnya, kawalan turutan, pelaksanaan bersyarat, lelaran, rekursi, penguraian fungsional, modulariti, penyegerakan, metaprogramming, skop, pemalar, subtip, templat, jenis output, prototaip, penjelasan, benang, monsun, peti mel, sambungan , Wildcard, ungkapan biasa, ingatan transaksi, warisan, polimorfisme, mod parameter, dan sebagainya;
  • Bahasa abstrak dan mesin maya;
  • Algoritma dan struktur data: ungkapan biasa, algoritma parsing, algoritma grafik, pengaturcaraan dinamik, pembelajaran;
  • Bahasa pengaturcaraan: sintaks, semantik (statik dan dinamik), sokongan untuk paradigma (struktur, OOP, berfungsi, logik, timbunan, kesukaran, metaprogramming);
  • Penciptaan perisian (penyusun, sebagai peraturan, besar dan kompleks): penyetempatan, caching, komponen, API-antara muka, penggunaan semula, penyegerakan.

Merekabentuk pengkompil

Beberapa masalah yang timbul apabila membangunkan penerjemah sebenar:

  • Masalah dengan bahasa sumber. Adakah mudah untuk menyusunnya? Adakah terdapat pemprograman? Bagaimanakah jenis yang dikendalikan? Adakah perpustakaan ada?
  • Kelompok pengkompil pas: tunggal atau berbilang pas?
  • Tahap pengoptimuman yang diingini. Terjemahan bahasa yang cepat dan tidak suci dengan pengoptimuman sedikit atau tidak boleh normal. Pengoptimuman yang berlebihan akan melambatkan pengkompil, tetapi kod terbaik pada runtime mungkin bernilai.
  • Kadar pengesanan ralat yang diperlukan. Bolehkah penterjemah berhenti pada kesilapan pertama? Bilakah dia harus berhenti? Adakah anda mempercayai pengkompil untuk membetulkan kesilapan?
  • Ketersediaan alatan. Jika bahasa sumbernya tidak begitu kecil, penjana pengimbas dan penganalisis adalah wajib. Terdapat juga penjana penjana kod, tetapi mereka tidak begitu biasa.
  • Taip kod sasaran untuk penjanaan. Anda harus memilih kod mesin murni, ditambah, atau maya. Atau tulis hanya input yang mencipta pandangan pertengahan yang popular, seperti LLVM, RTL, atau JVM. Atau buat penterjemahan dari sumber ke kod sumber dalam C atau JavaScript.
  • Format kod sasaran. Anda boleh memilih bahasa pemasangan, kod mesin mudah alih, kod mesin imej ingatan.
  • Perenatselivanie. Dengan banyak penjana ia adalah baik untuk mempunyai bahagian input yang sama. Atas sebab yang sama, adalah lebih baik untuk mempunyai satu penjana untuk banyak bahagian input.

Arkitek Kompilator: Komponen

Ini adalah komponen berfungsi utama penterjemah yang menghasilkan kod mesin (jika program output adalah program C atau mesin maya, maka tidak banyak langkah diperlukan):

  • Program input (aliran tanda) memasuki pengimbas (penganalisis leksikal), yang mengubahnya menjadi aliran token.
  • Parser (parser) membina pokok sintaks abstrak dari mereka.
  • Penganalisis semantik mengurai maklumat semantik dan memeriksa nod pokok untuk kesilapan. Akibatnya, graf semantik dibina - sebuah pokok sintaks abstrak dengan sifat tambahan dan rujukan yang dipasang.
  • Penjana kod perantara membina graf aliran (tupel dikumpulkan ke dalam blok utama).
  • Pengoptimum kod bebas mesin melaksanakan kedua-dua setempat (dalam blok pangkalan) dan global (untuk semua blok) pengoptimuman, pada asasnya tinggal dalam subrutin. Mengurangkan kod berlebihan dan memudahkan pengiraan. Hasilnya adalah graf aliran yang diubahsuai.
  • Penjana kod sasaran menghubungkan blok asas ke kod garis lurus dengan pemindahan kawalan, mewujudkan fail objek dalam assembler dengan daftar maya (mungkin tidak berkesan).
  • Pengoptimum penghubung mesin-bebas memperuntukkan memori antara daftar dan jadual arahan. Menukarkan program dalam pemasangan kepada penyusun sebenar dengan menggunakan saluran paip yang baik.

Di samping itu, subsistem pengesanan ralat dan pengurus jadual simbol digunakan.

Analisis leksikal (pengimbasan)

Pengimbas menukarkan arus watak kod sumber ke dalam aliran token, mengeluarkan ruang, komen dan meluaskan makro.

Pengimbas sering menghadapi masalah seperti menerima atau tidak mengambil kira daftar, inden, suapan line dan ulasan bersarang.

Kesalahan yang mungkin berlaku semasa imbasan dipanggil leksikal dan termasuk:

  • Watak-watak yang tidak dalam abjad;
  • Melebihi bilangan aksara dalam perkataan atau rentetan;
  • Bukan watak tertutup atau rentetan literal;
  • Akhir fail dalam komen.

Analisis sintaks (parsing)

Parser menukar urutan token ke dalam pokok sintaks abstrak. Setiap nod pokok disimpan sebagai objek dengan bidang bernama, kebanyakannya adalah nod pokok. Tidak ada kitaran pada peringkat ini. Apabila membuat parser, anda harus memberi perhatian kepada tahap kerumitan tatabahasa (LL atau LR) dan untuk mengetahui sama ada terdapat sebarang peraturan untuk menghapus kekaburan. Sesetengah bahasa memerlukan analisis semantik.

Kesilapan yang ditemui pada tahap ini dipanggil ralat sintaks. Sebagai contoh:

  • K = 5 * (7 - y;
  • J = / 5;
  • 56 = x * 4.

Analisis semantik

Semasa analisis semantik, adalah perlu untuk memeriksa peraturan kebolehterimaan dan mengikat bahagian-bahagian pokok sintaks (membenarkan rujukan nama, memasukkan operasi untuk jenis pemutus tersirat, dll) untuk membentuk graf semantik.

Jelas, peraturan peraturan yang boleh diterima untuk bahasa yang berbeza adalah berbeza. Jika bahasa seperti bahasa disusun, penterjemah boleh mencari:

  • Pengisytiharan pelbagai pemboleh ubah dalam skopnya;
  • Rujukan kepada pemboleh ubah sebelum deklarasi;
  • Rujukan kepada nama yang tidak diisytiharkan;
  • Pelanggaran peraturan kebolehaksesan;
  • Bilangan argumen terlalu besar atau tidak mencukupi apabila memanggil kaedah;
  • Taip ketidakpadanan.

Generasi

Penjanaan kod perantaraan menghasilkan graf aliran yang terdiri daripada tuple yang dikelompokkan ke dalam blok asas.

Generasi kod menghasilkan kod mesin sebenar. Dalam penyusun tradisional untuk mesin RISC, peringkat pertama mencipta penghimpun dengan nombor pendaftaran maya yang tidak terhingga. Untuk mesin CISC, ini mungkin tidak akan berlaku.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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