Динамикалық және ұIncrementalды компиляция: Ерекшеліктері мен тиімділігі
Dynamic compilation
Динамикалық компиляция: Java сияқты тілдерде бағдарлама орындалғанда жылдамдық арттыру үшін қолданылатын техника. Алғашқы уақытта баяу, кейін өнімділік артады.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Кіріспе
Динамикалық компиляция – кейбір бағдарламалау тілдерінің бағдарлама орындалу кезінде өнімділікті арттыру үшін пайдаланатын процесі. Бұл техника Smalltalk-тен бастау алғанмен, оны ең кеңінен қолданатын тіл – Java. Динамикалық компилятордың машиналық коды бағдарлама орындалғанда құрастырылып, оңтайландырылатындықтан, динамикалық компиляция статикалық компиляцияланған бағдарламаларға (яғни, төменде сипатталғандай "жинапқы компилятор" арқылы компиляцияланған бағдарламаларға) қолжетімсіз тиімділік бойынша оңтайландырулар жасауға мүмкіндік береді, бұл тек кодты көшіру немесе метапрограммалау арқылы ғана мүмкін. Динамикалық компиляцияны қолданатын орталарда бағдарламалар алғашқы бірнеше минут бойы баяу жұмыс істейді, содан кейін көп бөлігі компиляцияланып, қайта компиляцияланады және жылдамдыққа ие болады. Осындай бастапқы өнімділік төмендеуінің салдарынан, кейбір жағдайларда динамикалық компиляция тиімсіз болуы мүмкін. Динамикалық компиляцияның көптеген іске асырылуында, бастапқы компиляция кезінде жасалуға болатын оңтайландырулар орындалу кезіндегі келесі компиляцияға дейін ықпалдастырылады, бұл артық баяулауға себеп болады. Just-in-time компиляциясы – динамикалық компиляцияның бір түрі.
Dynamic compilation is a process used by some programming language implementations to gain performance during program execution. Although the technique originated in Smalltalk, the best known language that uses this technique is Java. Since the machine code emitted by a dynamic compiler is constructed and optimized at program runtime, the use of dynamic compilation enables optimizations for efficiency not available to statically compiled programs (i. e. those compiled by a so called "batch compiler", as written below) except through code duplication or metaprogramming. Runtime environments using dynamic compilation typically have programs run slowly for the first few minutes, and then after that, most of the compilation and recompilation is done and it runs quickly. Due to this initial performance lag, dynamic compilation is undesirable in certain cases. In most implementations of dynamic compilation, some optimizations that could be done at the initial compile time are delayed until further compilation at run time, causing further unnecessary slowdowns. Just in time compilation is a form of dynamic compilation.
Өсімді жинақтау
Жақын байланысты әдіс – инкременттік компиляция. Инкременттік компилятор POP 2, POP 11, Forth, Lisp-тің кейбір нұсқаларында, мысалы Maclisp және ML-нің кем дегенде бір нұсқасында (Poplog ML) қолданылады. Бұл бағдарламалау тілінің компиляторының орындалу уақыты жүйесінің бір бөлігі болуын талап етеді. Осының салдарынан бастапқы кодты кез келген уақытта терминалдан, файлдан немесе мүмкін, жұмыс істеп жатқан бағдарлама құрастырған дерек құрылымынан оқуға болады және машиналық код блогына немесе функцияға аударылады (ол бұрынғы функцияның орнын баса алады), ол бағдарламамен пайдалану үшін дереу қолжетімді болады. Интерактивті әзірлеу және сынау кезінде компиляция жылдамдығының қажеттілігіне байланысты, компиляцияланған код стандартты «топтық компилятор» шығарған код сияқты толық оңтайландырылмаған болуы мүмкін, ол бастапқы кодты оқып, кейін байланыстырылып, орындалатын объект файлдарын шығарады. Дегенмен, инкременттік түрде құрастырылған бағдарлама әдетте сол бағдарламаның интерпретацияланған нұсқасынан әлдеқайда жылдам жұмыс істейді. Инкременттік компиляция интерпретацияланған және құрастырылған тілдердің артықшылықтарын біріктіреді. Портативтілікті арттыру үшін инкременттік компилятордың екі сатыда жұмыс істеуі қажет, атап айтқанда, алдымен платформаға тәуелсіз аралық тілге компиляциялау, содан кейін хост машина үшін машиналық кодқа компиляциялау. Бұл жағдайда, порттау үшін тек «back end» компиляторын өзгерту жеткілікті. Жоғарыда анықталған динамикалық компиляциядан айырмашылығы, инкременттік компиляция бағдарлама алғаш рет орындалғаннан кейін қосымша оңтайландыруды қажет етпейді.
A closely related technique is incremental compilation. An incremental compiler is used in POP 2, POP 11, Forth, some versions of Lisp, e. g. Maclisp and at least one version of ML (Poplog ML). This requires the compiler for the programming language to be part of the runtime system. In consequence, source code can be read in at any time, from the terminal, from a file, or possibly from a data structure constructed by the running program, and translated into a machine code block or function (which may replace a previous function of the same name), which is then immediately available for use by the program. Because of the need for speed of compilation during interactive development and testing, the compiled code is likely not to be as heavily optimised as code produced by a standard 'batch compiler', which reads in source code and produces object files that can subsequently be linked and run. However an incrementally compiled program will typically run much faster than an interpreted version of the same program. Incremental compilation thus provides a mixture of the benefits of interpreted and compiled languages. To aid portability it is generally desirable for the incremental compiler to operate in two stages, namely first compiling to some intermediate platform independent language, and then compiling from that to machine code for the host machine. In this case porting requires only changing the 'back end' compiler. Unlike dynamic compilation, as defined above, incremental compilation does not involve further optimisations after the program is first run.