Pythonile on pakkuda JIT-kompilaator, mis kasutab copy-and-patch tehnikat.

Microsofti Brandt Bucher, kes on CPythoni põhikeerajate seas, ning töötab meeskonnas, mis tegeleb CPythoni tõlgendi jõudluse parandamisega, avaldas JIT-kompilaatori rakenduse Pythonile, mis kasutab Copy-and-Patch tehnikat. JIT avaldamine on ajastatud jõuludeks ja teade on kirjutatud luuletusena.

Pakutud JIT paistab silma äärmiselt kiire koodi genereerimise, lihtsa hoolduse ja täieliku integreerituse poolest tõlgendajaga. Pakutud meetod võimaldab automaatselt muuta C keeles kirjutatud tõlgendi JIT-kompilaatoriks, ilma eraldi koodi genereerimise loogika loomise ja käsitsi assambleeri esitluste koostamiseta. Selle lähenemise puhul põhjustab tõlgendis oleva vea parandamine automaatselt sama probleemi lahendamise JIT-is, kuna kasutatakse ühist koodi generaatorit.

Copy-and-Patch meetodi toimimine põhineb sellel, et koodi ümberpaigutamine mälu sisse objekti failide sidumise ajal ja masina instruktsioonide asendamine baidikoodiga JIT-is, on sarnased ülesanded. JIT-i töö ajal, programmis käivitamise protsessis, käib juba loodud baidikoodi instruktsioonide järjestamine ja iga juhise jaoks kopeeritakse eelnevalt kompileeritud masina kood mälu ala, kus asub täidetav kood, ning samuti muudetakse juhiseid koheselt, et asendada nendes töödeldavad andmed (JIT kopeerib valmis mallid juba kompileeritud funktsioonidest ja asendab neis vajalikud väärtused, nagu argumendid ja konstantid). Objektifailide laadimise ajal toimub samuti masina koodi kopeerimine mällu ja välist sümbolite asendamine.

Copy-and-Patch JIT loob objektifaili ELF formaadis, mis sisaldab bytekoodi instruktsioonide andmeid ja vajalikku teavet andmete asendamiseks. JIT asendab tõlgendamisel loodud bytekoodi instruktsioonid masinkoodi esitustega, lisades vajalikud arvutuste andmed. JIT teostamine nõuab koostamise ajal sõltuvusena LLVM-i, kuid runtime-komponendid ei ole seotud välist sõltuvustega ja koosnevad umbes 300 käsitsi kirjutatud reast C-keeles ja 3000 genereeritud reast C-koodis.

Traditsioonilise JIT-tööriista (LLVM -O0) kõrval pakub eelnev JIT 100 korda kiiremat koodi genereerimist ja 15% kiiremat lõppkoodi. Kui võrrelda WebAssembly kompileerimisega (Liftoff), genereerib uus JIT koodi 5 korda kiiremini ning lõppkood töötab 50% kiiremini. Uut JIT-d võrreldes optimeeriva JIT-iga (LuaJIT), mis kasutab käsitsi kirjutatud assemblerkoodi, näitas eelnev variant kiiremat tulemust 13-st 44 testist, samas kui keskmiselt jäi see 35% võrra maha, ent selle eelised seisnevad oluliselt lihtsustatud hoolduses ja madalamates rakenduskeerukustes.

Vaata videot


Allikas: opennet.ru
Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster