Elke regel code die u schrijft, moet worden vertaald in een taal die uw computer begrijpt. Maar hoe gebeurt dat?
De broncode van geavanceerde programmeertalen zoals PHP, Swift en JavaScript lijkt een beetje op natuurlijke taal. U zult Engelse woorden in dergelijke code zien en u zult een deel van de functionaliteit ervan kunnen begrijpen, zelfs als u de taal zelf niet kent. Maar dergelijke broncode moet een machineleesbaar formaat hebben, wil de computer het uiteindelijke programma kunnen uitvoeren.
Om dit te doen, heeft de machine een tussenpersoon nodig die uw code vertaalt naar iets dat kan worden verwerkt. Deze tussenpersoon kan een interpreter, een compiler of een assembler zijn. Ze doen allemaal hetzelfde: ze vertalen de broncode van een voor mensen leesbare vorm naar een machineleesbare vorm. Maar hoe ze dat doen is heel anders.
Wat is een tolk?
Een interpreter leest elke coderegel één voor één en voert deze onmiddellijk uit tijdens runtime. Een tolk wacht niet tot de volledige broncode is omgezet in machinecode voordat deze naar de CPU wordt gestuurd. In plaats daarvan converteert het elke coderegel naar de tolkspecifieke bytecode en voert het elke instructie uit terwijl deze wordt vertaald. Terwijl de uitvoeringstaak rechtstreeks afhankelijk is van de tolk, voedt de CPU de tolk zelf.
Omdat het elke regel tegelijk analyseert en uitvoert, is het proces vaak relatief langzamer. Met dat in gedachten zijn fouten in geïnterpreteerde programmeertalen gemakkelijk te herkennen, omdat ze directe feedback geven voor elke coderegel.
Een nadeel van dit gedrag is echter dat een runtimefout het programma tijdens de uitvoering laat crashen, wat resulteert in een slechte gebruikerservaring, vooral als uw project niet voldoende is getest.
Wat is een compiler?
Een compiler leest uw broncode en vertaalt deze naar een machineleesbaar uitvoerbaar bestand. In tegenstelling tot een tolk leest het de volledige broncode in één keer en genereert het machinecode voor latere verwerking door de CPU. Aangezien de compiler deze taak maar één keer uitvoert, zijn gecompileerde programma's doorgaans sneller en geheugenefficiënter.
De compiler houdt echter geen rekening met runtime-fouten. In plaats daarvan zal het tijdens het compileren bepaalde fouten markeren, wat meestal beter is. Dit type fout verschijnt tijdens de ontwikkeling, niet wanneer het programma begint te draaien. Houd er echter rekening mee dat runtime-fouten nog steeds mogelijk zijn, zelfs in gecompileerde programma's.
De belangrijkste verschillen
Tolken en compilers komen beide vaak voor, dus het is handig om de belangrijkste verschillen tussen beide te kennen.
Code-uitvoering: invoer- en uitvoerverwerking
Een tolk kan alleen elke invoer per regel verzamelen, vertalen en uitvoeren. Het voert elke regel van de broncode sequentieel uit zoals deze komt, en de uiteindelijke uitvoer hangt af van wat elke regel uitvoert tijdens de uitvoering.
Een compiler bundelt de volledige broncode en vertaalt deze eenmalig. Dus het neemt je hele broncode als input, die het converteert en naar de CPU stuurt om een output te krijgen.
Foutopsporing en traceerbaarheid van fouten
Voor geïnterpreteerde code zijn fouten beter traceerbaar omdat de tolk ze kan rapporteren door rechtstreeks naar de oorspronkelijke bron te verwijzen. Zodra er echter op enig moment tijdens de uitvoering een fout optreedt, stopt de interpreter. Dus het debuggen van fouten kan een beetje uitdagend zijn, omdat je ze tijdens runtime moet reproduceren. Het kan zelfs erger worden als er onvoldoende runtime-logging is.
Aan de andere kant kunnen de runtime-fouten in een gecompileerde taal moeilijker te traceren zijn, omdat er geen tolk is om erover te rapporteren. Maar fouten die u tijdens het compileren ontdekt, zijn meestal gemakkelijker te verhelpen, omdat de compiler ze consequent zal identificeren.
De meeste gecompileerde talen hebben ook een mechanisme voor het detecteren van ongebruikte variabelen, type-incompatibiliteit en foutieve syntaxis, waardoor dit soort fouten in een vroeg stadium worden voorkomen.
Prestaties en snelheid
Zoals verwacht helpt een compiler de machine de programmacode sneller uit te voeren, aangezien de CPU de code maar één keer verwerkt. Dit is niet het geval voor tolken, die elke regel tijdens runtime vertalen.
Desondanks zijn er programmeerprincipes die u kunt gebruiken om geïnterpreteerde code te optimaliseren, zal de tolk nog steeds tijd besteden aan het ontleden en uitvoeren van elke regel voordat hij naar de volgende gaat. Er zijn echter compiler-helpers beschikbaar om geïnterpreteerde talen sneller te maken.
De Chrome-browser verwerkt bijvoorbeeld JavaScript met behulp van de V8-engine; dit draait op de Just-In-Time (JIT) -compiler. De Pyinstaller-module is een andere helper die een Python-script bundelt en compileert tot een uitvoerbaar pakket.
Hoewel deze helpers handig zijn om een geïnterpreteerde taal in een compiler te bundelen, verandert dit niets aan het feit dat de basisvertaler nog steeds een tolk is.
Geheugengebruik
Het gedrag van het geheugengebruik van de tolk en de compiler is relatief en hangt vaak af van de broncode en andere factoren. Hoewel sommige programmeurs beweren dat code chunking in tolken het geheugengebruik vermindert, registreren tolken ook het totale geheugengebruik.
Bijvoorbeeld bij het onderzoeken van de geheugengebruiksprofiel van uw Python-code, zal de hoeveelheid geheugen die het verbruikt u misschien verbazen.
Over het algemeen hebben gecompileerde programma's echter minder runtime-geheugen nodig. Omdat ze de volledige broncode vooraf omzetten in machineleesbare code, geven ze de CPU minder werk. Dit in tegenstelling tot tolken, die code alleen tijdens runtime vertalen.
Ondersteuning voor programmeertalen
De tolk en de compiler hebben een behoorlijk aandeel distributie van programmeertalen. Enkele populaire gecompileerde talen zijn C, C#, Rust en Golang. Geïnterpreteerde talen zijn ook populair, waaronder Python, JavaScript en PHP.
Meer programmeurs geven de voorkeur aan geïnterpreteerde talen. Hoewel JavaScript en Python tolken gebruiken, zijn dit de twee over het algemeen meest gewenste talen, volgens de 2023 Stack Overflow-ontwikkelaarsenquête. Rust en C# vertegenwoordigen de samengestelde groepen op de vijfde en zesde positie.
Waar geïnterpreteerde talen schitteren
Tolken schitteren op deze gebieden:
- Ze maken het eenvoudig opsporen van fouten mogelijk, aangezien de interpreter elke coderegel afzonderlijk uitvoert.
- Het is vaak sneller om eerder een minimaal levensvatbaar product te bereiken met geïnterpreteerde talen, omdat deze minder complexe syntaxis hebben in vergelijking met gecompileerde talen.
- In tegenstelling tot statisch getypte gecompileerde talen, gebruiken geïnterpreteerde talen dynamisch typen, waardoor de complexiteit van de code wordt verminderd en de leesbaarheid wordt verbeterd.
Waar gecompileerde talen winnen
Hoe zit het met compilers? Hier zijn enkele aspecten waarin hun talen enige kracht tonen:
- Gecompileerde talen zijn doorgaans sneller in uitvoering en vereisen minder runtime-geheugen, aangezien codevertaling slechts één keer van tevoren plaatsvindt.
- Uitvoering na compilatie helpt bij het vroegtijdig opsporen van bugs. De compiler zorgt ervoor dat de implementatie mislukt zodra er een fout optreedt. Dit is beter dan het opvangen van fouten tijdens runtime.
- Hoewel statisch getypeerde, definiëren gecompileerde talen duidelijk de intenties van variabelen en functies, waardoor ze meer gedocumenteerd worden.
De juiste vertaler kiezen voor uw project
Zoals je hebt gezien, hebben de compiler en de interpreter hun respectieve gebieden waarin ze uitblinken. Terwijl sommige programmeurs beweren dat gecompileerde talen over het algemeen sneller en beter zijn, beweren anderen dat de prestaties afhangen van de codestructuur en het platform.
Maar wat nog belangrijker is, uw keuze van vertaler moet naast hun technische mechanismen ook afhangen van verschillende andere factoren. Het gemak van leren, de gemeenschap en de intentie van het project zijn enkele van de factoren waarmee rekening moet worden gehouden bij het kiezen tussen geïnterpreteerde en gecompileerde talen.