Kiekviena parašyta kodo eilutė turi būti išversta į kalbą, kurią supranta jūsų kompiuteris. Bet kaip tai atsitinka?

Aukšto lygio programavimo kalbų, tokių kaip PHP, Swift ir JavaScript, šaltinio kodas atrodo kaip natūrali kalba. Tokiame kode matysite angliškus žodžius ir galėsite suprasti kai kurias jo funkcijas, net jei nemokate pačios kalbos. Tačiau toks šaltinio kodas turi būti mašininio skaitomo formato, kad kompiuteris galėtų vykdyti galutinę programą.

Kad tai padarytų, įrenginiui reikia tarpininko, kuris išverstų jūsų kodą į ką nors, ką galėtų apdoroti. Šis tarpininkas gali būti vertėjas, kompiliatorius arba surinkėjas. Jie visi daro panašų dalyką: šaltinio kodą iš žmogaus skaitomos formos verčia į mašininiu būdu skaitomą. Tačiau tai, kaip jie tai daro, visiškai skiriasi.

Kas yra Vertėjas?

Vertėjas skaito kiekvieną kodo eilutę po vieną ir iškart ją vykdo vykdymo metu. Vertėjas nelaukia, kol visas šaltinio kodas bus konvertuotas į mašininį kodą, prieš siųsdamas jį į centrinį procesorių. Vietoj to, ji konvertuoja kiekvieną kodo eilutę į konkretaus vertėjo baitų kodą ir vykdo kiekvieną komandą, kai ji yra išversta. Nors vykdymo užduotis tiesiogiai priklauso nuo vertėjo, procesorius maitina patį vertėją.

instagram viewer

Kadangi jis analizuoja ir paleidžia kiekvieną eilutę vienu metu, procesas dažnai yra palyginti lėtesnis. Turint tai omenyje, interpretuojamų programavimo kalbų klaidas nesunku pastebėti, nes jos suteikia tiesioginį grįžtamąjį ryšį apie kiekvieną kodo eilutę.

Tačiau tokio elgesio trūkumas yra tai, kad vykdymo metu klaida sugenda programą vykdant, todėl vartotojo patirtis blogėja, ypač jei jūsų projektui trūksta tinkamo testavimo.

Kas yra kompiliatorius?

Kompiliatorius nuskaito jūsų šaltinio kodą ir paverčia jį mašininiu būdu nuskaitomu vykdomuoju failu. Skirtingai nei vertėjas, jis vienu ypu nuskaito visą šaltinio kodą, generuodamas mašininį kodą, kurį vėliau apdorotų CPU. Kadangi kompiliatorius šią užduotį atlieka tik vieną kartą, sukompiliuotos programos paprastai yra greitesnės ir taupiau atmintį.

Tačiau kompiliatorius neatsižvelgia į vykdymo laiko klaidas. Vietoj to, jis pažymės tam tikras klaidas kompiliavimo metu, o tai paprastai yra geriau. Tokio tipo klaida pasirodo kūrimo metu, o ne tada, kai programa pradeda veikti. Tačiau atminkite, kad net ir sukompiliuotose programose vis tiek galimos vykdymo laiko klaidos.

Pagrindiniai skirtumai

Vertėjai ir kompiliatoriai yra įprasti, todėl naudinga žinoti pagrindinius jų skirtumus.

Kodo vykdymas: įvesties ir išvesties apdorojimas

Vertėjas gali tik rinkti, išversti ir vykdyti kiekvieną įvestį eilutėje. Ji paleidžia kiekvieną šaltinio kodo eilutę nuosekliai, kai ji ateina, o galutinė išvestis priklauso nuo to, ką kiekviena eilutė išveda vykdymo metu.

Kompiliatorius sujungia visą šaltinio kodą ir išverčia jį tik vieną kartą. Taigi kaip įvestis naudojamas visas šaltinio kodas, kurį jis konvertuoja ir siunčia į centrinį procesorių, kad gautų išvestį.

Derinimas ir klaidų atsekamumas

Interpretuojamo kodo klaidos yra lengviau atsekamos, nes vertėjas gali pranešti apie jas tiesiogiai nurodydamas pirminį šaltinį. Tačiau, kai bet kuriuo vykdymo momentu įvyksta klaida, vertėjas sustoja. Taigi derinimo klaidos gali būti šiek tiek sudėtingos, nes jas reikia atkurti vykdymo metu. Tai gali net pablogėti, jei vykdymo metu registruojama netinkama registracija.

Kita vertus, vykdymo laiko klaidas sudarytoje kalboje gali būti sunkiau atsekti, nes nėra vertėjo, kuris galėtų apie jas pranešti. Tačiau kompiliavimo metu aptiktas klaidas paprastai lengviau išspręsti, nes kompiliatorius nuolat jas identifikuos.

Dauguma kompiliuotų kalbų taip pat turi mechanizmą, leidžiantį aptikti nenaudojamus kintamuosius, tipų nesuderinamumą ir klaidingą sintaksę, užkertantį kelią tokioms klaidoms anksti.

Našumas ir greitis

Kaip ir tikėtasi, kompiliatorius padeda mašinai greičiau paleisti programos kodą, nes CPU kodą apdoroja tik vieną kartą. Tai netinka vertėjams, kurie verčia kiekvieną eilutę vykdymo metu.

Nors yra programavimo principus, kuriuos galite naudoti Norėdami optimizuoti interpretuojamą kodą, vertėjas vis tiek praleis laiką analizuodamas ir vykdydamas kiekvieną eilutę, prieš pereidamas prie kitos. Tačiau yra kompiliatoriaus pagalbinės priemonės, kurios leidžia greičiau išversti kalbas.

Pavyzdžiui, „Chrome“ naršyklė apdoroja „JavaScript“ naudodama V8 variklį; tai veikia Just-In-Time (JIT) kompiliatoriuje. „Pyinstaller“ modulis yra dar vienas pagalbininkas, kuris sujungia ir sukompiliuoja Python scenarijų į vykdomąjį paketą.

Nors šie pagalbininkai yra patogūs sujungiant verčiamą kalbą į kompiliatorių, tai nekeičia fakto, kad pagrindinis vertėjas vis dar yra vertėjas.

Atminties naudojimas

Vertėjo ir kompiliatoriaus atminties naudojimo elgsena yra santykinė ir dažnai priklauso nuo šaltinio kodo ir kitų veiksnių. Nors kai kurie programuotojai teigia, kad kodų suskaidymas vertėjams sumažina atminties naudojimą, vertėjai taip pat įrašo bendrą atminties naudojimą.

Pavyzdžiui, kai nagrinėjate jūsų Python kodo atminties naudojimo profilis, sunaudojamos atminties kiekis gali jus nustebinti.

Tačiau paprastai kalbant, kompiliuotoms programoms reikia mažiau veikimo laiko atminties. Kadangi jie iš anksto konvertuoja visą šaltinio kodą į mašininiu būdu nuskaitomą kodą, jie suteikia CPU mažiau darbo. Tai skiriasi nuo vertėjų, kurie verčia kodą tik vykdymo metu.

Programavimo kalbos palaikymas

Vertėjas ir kompiliatorius turi nemažą dalį programavimo kalbos platinimas. Kai kurios populiarios kompiliuotos kalbos yra C, C#, Rust ir Golang. Taip pat populiarios interpretuojamos kalbos, tarp jų Python, JavaScript ir PHP.

Daugiau programuotojų linkę teikti pirmenybę interpretuotoms kalboms. Nors „JavaScript“ ir „Python“ naudoja vertėjus, jos yra dvi labiausiai pageidaujamos kalbos 2023 m. „Stack Overflow“ kūrėjų apklausa. Rust ir C# atstovauja sudarytoms grupėms penktoje ir šeštoje pozicijose.

Kur spindi interpretuojamos kalbos

Vertėjai šviečia šiose srityse:

  • Jie leidžia lengvai atsekti klaidas, nes vertėjas kiekvieną kodo eilutę vykdo atskirai.
  • Su interpretuotomis kalbomis dažnai greičiau pasiekti minimalų gyvybingą produktą anksčiau, nes jų sintaksė yra ne tokia sudėtinga, palyginti su kompiliuotomis kalbomis.
  • Skirtingai nuo statinio tipo kompiliuotų kalbų, interpretuojamose kalbose naudojamas dinaminis spausdinimas, sumažinant kodo sudėtingumą ir pagerinant skaitomumą.

Kur laimi kompiliuotos kalbos

O kaip su kompiliatoriais? Štai keletas aspektų, kuriais jų kalbos rodo tam tikrą stiprumą:

  • Sukompiliuotos kalbos paprastai vykdomos greičiau, joms reikia mažiau veikimo laiko atminties, nes kodas verčiamas tik vieną kartą iš anksto.
  • Vykdymas po kompiliavimo padeda anksti aptikti klaidas. Kompiliatorius užtikrina, kad įvykus klaidai diegimas nepavyktų. Tai geriau nei klaidų gaudymas vykdymo metu.
  • Nors ir statiškai įvestos, kompiliuotos kalbos aiškiai apibrėžia kintamųjų ir funkcijų paskirtį, todėl jos yra labiau dokumentuotos.

Tinkamo projekto vertėjo pasirinkimas

Kaip matėte, kompiliatorius ir vertėjas turi atitinkamas sritis, kuriose jie išsiskiria. Nors kai kurie programuotojai teigia, kad sudarytos kalbos yra greitesnės ir geresnės, kiti teigia, kad našumas priklauso nuo kodo struktūros ir platformos.

Bet dar svarbiau, kad vertėjo pasirinkimas taip pat turėtų priklausyti nuo kelių kitų veiksnių, be jų techninių mechanizmų. Mokymosi paprastumas, bendruomeniškumas ir projekto tikslas yra vieni iš veiksnių, į kuriuos reikia atsižvelgti renkantis iš vertimo į kalbas ir į sudarytas kalbas.