Katra jūsu rakstītā koda rindiņa ir jātulko jūsu datoram saprotamā valodā. Bet kā tas notiek?

Augsta līmeņa programmēšanas valodu, piemēram, PHP, Swift un JavaScript avota kods izskatās pēc dabiskās valodas. Šādā kodā redzēsit angļu valodas vārdus un varēsit saprast daļu no tā funkcijām, pat ja nezināt pašu valodu. Bet šādam pirmkodam jābūt mašīnlasāmā formātā, lai dators varētu palaist galīgo programmu.

Lai to izdarītu, iekārtai ir nepieciešams starpnieks, lai pārvērstu jūsu kodu tādā veidā, ko tā var apstrādāt. Šis starpnieks var būt tulks, kompilators vai montētājs. Viņi visi dara līdzīgu darbību: viņi pārvērš pirmkodu no cilvēkiem lasāmas formas mašīnlasāmā. Bet tas, kā viņi to dara, ir pavisam savādāk.

Kas ir tulks?

Tulks nolasa katru koda rindiņu pa vienam un izpilda to nekavējoties izpildes laikā. Tulks negaida, līdz viss avota kods tiks pārveidots mašīnkodā, pirms to nosūta centrālajam procesoram. Tā vietā tas pārvērš katru koda rindiņu par tulka specifisko baitu kodu un izpilda katru instrukciju, tiklīdz tā tiek tulkota. Kamēr izpildes uzdevums ir tieši atkarīgs no tulka, CPU darbina pašu tulku.

Tā kā tas parsē un izpilda katru rindiņu vienlaikus, process bieži ir salīdzinoši lēnāks. Paturot to prātā, kļūdas interpretētajās programmēšanas valodās ir viegli pamanāmas, jo tās nodrošina tūlītēju atgriezenisko saiti par katru koda rindiņu.

Tomēr šīs darbības trūkums ir tāds, ka izpildlaika kļūdas dēļ programma tiek avarēta izpildes laikā, radot sliktu lietotāja pieredzi, it īpaši, ja jūsu projektam nav atbilstošas ​​pārbaudes.

Kas ir kompilators?

Kompilators nolasa jūsu avota kodu un pārvērš to mašīnlasāmā izpildāmā failā. Atšķirībā no tulka, tas nolasa visu avota kodu vienā piegājienā, ģenerējot mašīnkodu vēlākai apstrādei CPU. Tā kā kompilators šo uzdevumu veic tikai vienu reizi, kompilētās programmas parasti ir ātrākas un efektīvāk atmiņu.

Tomēr kompilators neņem vērā izpildlaika kļūdas. Tā vietā tas atzīmēs noteiktas kļūdas kompilēšanas laikā, kas parasti ir labāk. Šāda veida kļūda parādās izstrādes laikā, nevis tad, kad programma sāk darboties. Tomēr ņemiet vērā, ka izpildlaika kļūdas joprojām ir iespējamas pat kompilētās programmās.

Galvenās atšķirības

Tulki un kompilatori ir plaši izplatīti, tāpēc ir noderīgi zināt galvenās atšķirības starp tiem.

Koda izpilde: ievades un izvades apstrāde

Tulks var tikai apkopot, tulkot un izpildīt katru ievadi vienā rindā. Tas palaiž katru avota koda rindiņu secīgi, kad tas tiek saņemts, un galīgā izvade ir atkarīga no tā, ko katra rindiņa izpildes laikā izvada.

Kompilators apvieno visu avota kodu un pārtulko to tikai vienu reizi. Tātad tas izmanto visu jūsu avota kodu kā ievadi, ko tas pārveido un nosūta uz centrālo procesoru, lai iegūtu izvadi.

Atkļūdošana un kļūdu izsekojamība

Interpretētajam kodam kļūdas ir vieglāk izsekojamas, jo tulks var ziņot par tām, tieši atsaucoties uz sākotnējo avotu. Tomēr, ja izpildes laikā rodas kļūda, tulks apstājas. Tāpēc atkļūdošanas kļūdas var būt nedaudz sarežģītas, jo tās ir jāatveido izpildes laikā. Tas var pat pasliktināties, ja izpildlaika reģistrēšana nav piemērota.

No otras puses, izpildlaika kļūdas kompilētā valodā var būt grūtāk izsekot, jo nav tulka, kas par tām ziņotu. Taču kompilēšanas laikā atklātās kļūdas parasti ir vieglāk novērst, jo kompilators tās konsekventi identificēs.

Lielākajai daļai kompilēto valodu ir arī mehānisms neizmantotu mainīgo, tipu nesaderības un kļūdainas sintakses noteikšanai, novēršot šāda veida kļūdas agrīnā stadijā.

Veiktspēja un ātrums

Kā paredzēts, kompilators palīdz mašīnai ātrāk palaist programmas kodu, jo centrālais procesors apstrādā kodu tikai vienu reizi. Tas neattiecas uz tulkiem, kuri izpildes laikā tulko katru rindiņu.

Lai gan tādas ir programmēšanas principi, kurus varat izmantot lai optimizētu interpretēto kodu, tulks joprojām pavadīs laiku, analizējot un izpildot katru rindiņu, pirms pāriet uz nākamo. Tomēr ir pieejami kompilatoru palīgi, lai tulkotās valodas padarītu ātrākas.

Piemēram, pārlūkprogramma Chrome apstrādā JavaScript, izmantojot V8 dzinēju; tas darbojas Just-In-Time (JIT) kompilatorā. Pyinstaller modulis ir vēl viens palīgs, kas apvieno un apkopo Python skriptu izpildāmā pakotnē.

Lai gan šie palīgi ir ērti, lai tulkotu valodu apvienotu kompilatorā, tas nemaina faktu, ka pamata tulkotājs joprojām ir tulks.

Atmiņas lietojums

Tulka un kompilatora atmiņas izmantošanas uzvedība ir relatīva un bieži ir atkarīga no pirmkoda un citiem faktoriem. Lai gan daži programmētāji apgalvo, ka koda sadalīšana tulkos samazina atmiņas izmantošanu, tulki reģistrē arī kopējo atmiņas lietojumu.

Piemēram, pārbaudot jūsu Python koda atmiņas lietošanas profils, tā patērētais atmiņas apjoms var jūs pārsteigt.

Tomēr vispārīgi runājot, kompilētām programmām ir nepieciešams mazāk izpildlaika atmiņas. Tā kā tie jau iepriekš pārvērš visu avota kodu mašīnlasāmā kodā, tie nodrošina CPU mazāk darba. Tas ir pretstatā tulkiem, kas tulko kodu tikai izpildes laikā.

Programmēšanas valodas atbalsts

Tulkam un kompilatoram ir godīga daļa programmēšanas valodu izplatīšana. Dažas populāras apkopotās valodas ir C, C#, Rust un Golang. Populāras ir arī tulkotās valodas, tostarp Python, JavaScript un PHP.

Vairāk programmētāju dod priekšroku tulkotām valodām. Lai gan JavaScript un Python izmanto tulkus, tās ir divas vispiemērotākās valodas saskaņā ar 2023. gada Stack Overflow izstrādātāju aptauja. Rust un C# pārstāv apkopotās grupas piektajā un sestajā pozīcijā.

Kur mirdz interpretētās valodas

Tulki spīd šajās jomās:

  • Tie ļauj viegli izsekot kļūdas, jo tulks izpilda katru koda rindiņu atsevišķi.
  • Bieži vien ir ātrāk sasniegt minimālo dzīvotspējīgo produktu agrāk, izmantojot tulkotās valodas, jo tām ir mazāk sarežģītas sintakses salīdzinājumā ar kompilētajām valodām.
  • Atšķirībā no statiski drukātām kompilētām valodām, interpretētās valodas izmanto dinamisko rakstīšanu, samazinot koda sarežģītību un uzlabojot lasāmību.

Kur uzvar kompilētās valodas

Kā ar kompilatoriem? Šeit ir daži aspekti, kas viņu valodās parāda zināmu spēku:

  • Kompilētās valodas parasti izpilda ātrāk, un tām ir nepieciešama mazāka izpildlaika atmiņa, jo koda tulkošana notiek tikai vienu reizi iepriekš.
  • Izpilde pēc kompilācijas palīdz agrīni atklāt kļūdas. Kompilators nodrošina, ka izvietošana neizdodas, tiklīdz ir radusies kļūda. Tas ir labāk nekā kļūdu uztveršana izpildes laikā.
  • Lai gan tās ir statiski drukātas, kompilētās valodas skaidri definē mainīgo un funkciju nolūkus, padarot tos vairāk dokumentētus.

Īstā tulkotāja izvēle savam projektam

Kā jūs redzējāt, kompilatoram un tulkam ir savas jomas, kurās tie izceļas. Lai gan daži programmētāji apgalvo, ka apkopotās valodas kopumā ir ātrākas un labākas, citi apgalvo, ka veiktspēja ir atkarīga no koda struktūras un platformas.

Bet vēl svarīgāk ir tas, ka tulka izvēlei jābūt atkarīgai arī no vairākiem citiem faktoriem, ne tikai to tehniskajiem mehānismiem. Mācīšanās vieglums, kopiena un projekta nolūks ir viens no faktoriem, kas jāņem vērā, izvēloties starp tulkotajām un apkopotajām valodām.