Komputer, Programming
Penyiar - nyaéta ... Tipe compilers. Ngarobah jeung program siaran
Program, kitu ogé jalma pikeun narjamahkeun tina hiji basa ka sejen kudu hiji juru atanapi penerjemah.
konsep dasar
program nu geus ngagambarkeun linguistik itungan: i → P → P (i). Hiji juru mangrupakeun program anu disadiakeun pikeun program input P jeung sababaraha input x. Eta ngalaksanakeun di P x: I (P, x) = P (x). Kanyataan yén aya ngan hiji penerjemah sanggup ngajalankeun sagala program mungkin (anu bisa digambarkeun dina Sistim formal) nyaéta kapanggihna Turing pisan profound jeung signifikan.
processor mangrupa juru sahiji program dina basa mesin. Umumna teuing mahal nulis juru keur basa-tingkat tinggi, ngarah narjamahkeun kana wangun anu leuwih gampang pikeun napsirkeun.
Sababaraha jinis Diréktori boga ngaran aneh pisan:
- assembler nu ditarjamahkeun program rakitan basa kana basa mesin.
- compiler anu ditarjamahkeun basa-tingkat tinggi ka basa handap.
Penyiar - mangrupakeun program anu diperlukeun salaku data input program dina sababaraha basa S tur ngahasilkeun program T dina cara sapertos nu maranéhna duanana boga semantik sarua: P → X → Q. Hartina, ∀x. P (x) = Q (x).
Mun disiarkeun sakabéh program kana hal interpretable, mangka disebut hiji kompilasi saméméh kompilasi palaksanaan, atawa AOT. AOT kompiler bisa dipaké dina séri, kiwari dimungkinkeun tina nu sering di assembler, contona:
Kodeu sumber kompiler → (penerjemah) → → assembly kode assembler (kompiler) kode → → mesin CPU (juru).
kompilasi operasional atawa dinamis lumangsung lamun program ieu disiarkeun, nalika dieksekusi ku bagian samemehna disusun lianna. JIT-compilers apal naon maranéhna geus dipigawé ku kituna teu ngulang kode sumber deui jeung deui. Aranjeunna malah bisa ngahasilkeun kompilasi adaptif sarta recompilation dumasar paripolah tina lingkungan éksekusi program.
Loba basa ngawenangkeun sangkan ngaéksekusi kode dina waktos compile na compile kodeu nu anyar di runtime.
tahap tarjamah
Siaran ngandung léngkah tina analisa na sintésis:
Kodeu sumber analyzer → → → konseptual ngagambarkeun generator (Ki Hajar Dewantara) → kode Target.
Ieu alatan alesan ieu:
- Sagala metoda sejenna henteu merenah. panarjamahan Vérsi Kecap saukur teu jalan.
- Alus rékayasa solusi: lamun hayang nulis penerjemah pikeun basa M sarta N sumber sasaran kedah nulis ukur M + N program basajan (polukompilyatorov) tinimbang M × N kompleks (total Diréktori).
Sanajan kitu, di prakna, tempoan konseptual anu kacida kadang cukup ekspresif jeung cukup kuat pikeun nutupan unggal sumber na target conceivable basa. Bari sababaraha éta bisa datangna deukeut ieu.
compilers nyata nembus loba tahap. Nalika nyieun kompiler sorangan teu kudu ngulang sagala gawé teuas éta jalma geus dipigawé pikeun nyieun Répréséntasi na Generators. Anjeun tiasa nerjemahkeun basa langsung di JavaScript atanapi C jeung ngamangpaatkeun JavaScript-mesin aya jeung C kompiler mun ngalakukeun sésana. Anjeun oge tiasa make ngagambarkeun panengah aya na mesin virtual.
catetan penerjemah
Penyiar - mangrupakeun program atawa hardware, nu aub tilu basa: sumber, tujuan sarta dasarna. Éta bisa ditulis dina T-bentuk, nempatkeun éta kénca aslina, katuhu jeung udagan dasar handap.
Aya tilu tipe compilers:
- Penyiar - nyaeta samokompilyator lamun eta pakait jeung basa sumber dasar.
- Compiler anu sasaran basa teh dasar, disebut samorezidentnym.
- Penyiar - a cross-compiler, upami anjeunna sasaran na dasar ragam basa.
Naha ieu nu penting?
Malah lamun pernah ngadamel kompiler nyata, pangaweruh alus tina téhnologi ciptaan anak, kusabab konsép dipaké pikeun tujuan ieu dipaké uluk salam, contona:
- téks pormat;
- queries basa keur basis data;
- arsitéktur komputer canggih;
- masalah optimasi generalized;
- GUIs;
- basa scripting;
- Controllers;
- mesin virtual;
- Mesin tarjamah.
Sajaba ti éta, lamun rék nulis preprocessors, linkers, loaders, debuggers na profilers, anjeun kudu ngaliwatan léngkah anu sarua sakumaha nalika nulis kompiler a.
Anjeun oge bisa diajar kumaha nulis program hadé, saprak kreasi tina penerjemah pikeun basa Sunda hartina pamahaman hadé tina intricacies sarta ambiguities. Ulikan ngeunaan prinsip umum tina siaran ogé ngidinan Anjeun pikeun jadi basa desainer alus. Jadi teu eta masalah kumaha lungkawing bahasa lamun eta teu bisa dilaksanakeun sacara efektif?
téhnologi komprehensif
téhnologi kompiler nyertakeun loba wewengkon béda tina elmu komputer:
- Téori formal basa: grammar, FITML, computability;
- arsitéktur komputer:. instruksi susunan, RISC atanapi CISC, siklus jam processing core pipelined, jsb;
- konsep basa programming, contona, ngajalankeun hiji kontrol runtuyan, palaksanaan kondisional, Iteration, recursion, dékomposisi hanca, modularity, sinkronisasi, meta-programming, lingkup, angger sub-jenis, témplat, tipe output, purwa, annotations, aliran, monads, mailboxes, neruskeun , wildcards, ekspresi nu biasa, memori transactional, pusaka, polymorphism, setelan modeu, jeung saterusna jsb..;
- basa abstrak sarta mesin virtual;
- algoritma jeung data struktur: ungkapan biasa, algoritma FITML, algoritma grafik, programming dinamis, latihan;
- basa programming: sintaksis, semantik (statik sarta dinamis), paradigms rojongan (struktural, OOP, fungsi, logis, tumpukan, parallelism, meta-programming);
- nyiptakeun software (compilers, biasana badag tur kompléks): lokalisasi, cache, componentize, API-interfaces, ulang pamakéan, sinkronisasi.
desain kompiler
Sababaraha masalah encountered dina ngembangkeun tina penerjemah nyata:
- Masalah bahasa sumber. Éta gampang pikeun compile deui? Aya preprocessor a? Kumaha jenis? Aya a library?
- Ngagolongkeun pas kompiler: tunggal atawa multi-jalan?
- Darajat optimasi dipikahoyong. Saum sareng najis program siaran kalawan saeutik atawa euweuh optimasi tiasa normal. Leuwih-optimasi kompiler bakal ngalambatkeun, tapi kode hadé dina runtime bisa jadi patut eta.
- gelar dina diperlukeun tina beungeut kasalahan. Tiasa penerjemah nu ngan eureun di kasalahan mimitina? Nalika eta kudu eureun? Naha mun percanten kana koreksi kasalahan kompiler?
- Ketersediaan parabot. Lamun bahasa aslina teu pisan leutik, anu scanner na generator analyzers anu diperlukeun. Aya ogé Generators, Generators kode, tapi maranéhna teu jadi umum.
- Tipe kode target bisa dihasilkeun. Dipilih ti kode mesin supplemented atanapi virtual murni. Atawa ngan nulis hiji bagian Éntri nu nyiptakeun ngagambarkeun panengah populér kayaning LLVM, RTL, atawa JVM. Atawa nyieun tarjamahan tina aslina dina kode sumber di C atanapi JavaScript.
- Format kodeu target. Anjeun tiasa milih hiji basa assembly, kode mesin dibabawa, gambar kode mesin memori.
- Retargeting. Lamun susunan Generators téh alus pikeun boga bagian inlet umum. Ku sabab kitu éta pangalusna mun boga salah generator keur input ti réa patempatan.
kompiler Arsitéktur: komponén
Di handap ieu mangrupakeun komponén fungsi utama hiji compiler anu dibangkitkeun kode pituin (lamun program kaluaran mangrupakeun program dina C atawa mesin virtual, Anjeun kudu teu jadi loba hambalan):
- Program input (tanda aliran) anu fed kana scanner (leksikal analyzer), nu ngarobah kana aliran tina tokens.
- Parser (parser) diwangun hiji tangkal rumpaka abstrak.
- analyzer semantis decomposes informasi semantis na cek tempat ngumpulna tangkal pikeun kasalahan. Hasilna, diwangun semantis grafik - tangkal rumpaka abstrak mibanda sipat tambahan jeung Tumbu ngadegkeun.
- generator kode panengah ngawangun grafik aliran (tuples anu dikelompokkeun kana blok utama).
- Mesin-bebas kode optimizer konduktor duanana lokal (dina Unit dasar) jeung global (ka sadaya blok) optimasi dasarna sésana dina Kabiasaan. Ngurangan kode kaleuleuwihan sarta simplifies itungan. hasilna nyaeta titik grafik aliran dirobah.
- Generator ngiket kode target blok dasar kana kode kontrol transmisi rectilinear, nyieun hiji file obyék assembler maya registers (jigana teu epektip).
- Mesin-gumantung optimizer, linker allocates memori antara registers jeung ngajadikeun tim perencanaan. Eta ngalaksanakeun program konversi dina rakitan basa di assembly ieu ku pamakéan hade pipelining.
Sajaba ti éta, pamakéan deteksi kasalahan manajer subsistem na tabel simbol.
Analisis leksikal (scanning)
scanner nu ngarobah karakter sumber stream kana aliran tina tokens, nyoplokkeun whitespace, koméntar sarta ngembangna macros.
Scanner mindeng sapatemon masalah, kayaning naha atawa henteu tumut kana akun hal, margins, garis ngarecah na study komentar.
Kasalahan anu bisa lumangsung salila scanning, disebutna leksikal tur ngawengku:
- karakter nu teu di abjad;
- kaleuwihan jumlah karakter dina kecap atanapi garis;
- teu tanda tutup atawa string literal;
- tungtung tina file di comment.
FITML (FITML)
parser nu ngarobah urutan tokens kana hiji tangkal rumpaka abstrak. Unggal titik dina tangkal disimpen salaku hiji obyék kalayan ngaranna sawah, seueur nu sorangan tempat ngumpulna tangkal. Dina tahap ieu aya moal siklus. Lamun anjeun nyieun parser a perlu nengetan tingkat pajeulitna grammar (LL atanapi LR) jeung manggihan naha aya naon aturan disambiguasi. Sababaraha basa ulah merlukeun analisa semantik.
Kasalahan kapanggih dina tahap ieu disebut rumpaka. Contona:
- k = 5 * (7 - y;
- j = / 5;
- 56 = x * 4.
analisis semantis
Salila analisis semantis mariksa permissibility aturan jeung bagian gaul tina tangkal parse (sahingga ngaran rujukan inserting operasi pikeun conversions tipe implisit, jeung saterusna. D.) Pikeun ngabentuk grafik semantik.
Jelas, susunan admissibility aturan dina basa béda béda. Lamun compile basa Java-kawas, compilers bisa manggihan:
- variabel sababaraha deklarasi dina wengkuan na;
- a rujukan kana variabel saméméh deklarasi na;
- rujukan kana ngaran undeclared;
- ngalanggar hak patén;
- Jumlah digedekeun atawa cukup tina alesan dina panggero metoda;
- tipe mismatch.
turunan
Generasi kode panengah ngahasilkeun grafik aliran diwangun ku tuples, digolongkeun kana blok dasar.
Generasi kode ngahasilkeun kode mesin nyata. Dina compilers tradisional pikeun RISC-mesin dina hambalan kahiji, anjeun nyieun hiji assembler kalawan jumlah tanpa wates of registers maya. Pikeun CISC-mesin sigana moal kajadian.
Similar articles
Trending Now