Кіріспе
Қолданбалық виртуалды бағдарламалық қамтамасыз ету – бұл қолданбалық виртуалды машиналар мен оларды іске асыруға жауапты бағдарламалық қамтамасыз етуді қамтиды. Қолданбалық виртуалды машиналар көбінесе әртүрлі компьютерлік архитектуралар мен операциялық жүйелерде қолданбаның байт-кодын портативті түрде іске қосу үшін пайдаланылады. Қолданба әдетте интерпретатор немесе уақытында компиляциялау (JIT) арқылы компьютерде орындалады. Кез келген виртуалды машинаның әр түрлі функцияларды қамтитын бірнеше іске асырылу нұсқалары болуы мүмкін.
Application virtualization software refers to both application virtual machines and software responsible for implementing them. Application virtual machines are typically used to allow application bytecode to run portably on many different computer architectures and operating systems. The application is usually run on the computer using an interpreter or just in time compilation (JIT). There are often several implementations of a given virtual machine, each covering a different set of functions.
Виртуалды машиналарды салыстыру
JavaScript машиналары қосылмаған. Оларды табу үшін ECMAScript қозғалтқыштарының тізімін қараңыз. Бұл кестеде виртуалды машиналардың дизайны тиімді болуы тиіс элементтер жинақталған, кез келген іске асырылған мүмкіндіктердің тізімі емес. Виртуалды машинаМашина моделіЖеке сақтауды басқаруКодты қорғауТәржімешіJITAOБірлескен кітапханаларЖалпы тілдік нысандық модельДинамикалық жазу Android Runtime (ART) автоматты тіркеліміЖалпы тілдік Runtime (CLR) стегі автоматты немесе қолмен Dis (Inferno) автоматты тіркелімі DotGNU портативті. NET стек автоматты немесе қолмен Java виртуалды машинасы (JVM) стек автоматты ✔ JikesRVM стек автоматты LLVM тіркелімі қолмен Mono стек автоматты немесе қолмен Parrot тіркелімі автоматты Dalvik тіркелімі автоматты Squeak стек автоматты BEAM (Erlang) тіркелімі автоматты MoarVM тіркелімі автоматты
Виртуалды машина нұсқаулары есептеудің негізгі моделі арқылы жергілікті айнымалыларда деректерді өңдеу, әдетте стек машинасы, тіркелім машинасы немесе кездейсоқ қолжетімділік машинасы, көбінесе жады машинасы деп аталады. Бұл үш әдісті қолдануды виртуалды машиналар мен физикалық машиналар арасындағы әртүрлі сауда-саттық, мысалы, түсіндірудің, құрастырудың және қауіпсіздікті тексерудің оңайлығы ынталандырады. Бұл портативті виртуалды машиналарда жадты басқару физикалық машиналарға қарағанда абстракцияның жоғары деңгейінде қарастырылады. Кейбір виртуалды машиналар, мысалы танымал Java виртуалды машиналары (JVM), адрестермен айналысады, яғни виртуалды машинаға сілтемелерді іздеуге мүмкіндік беру арқылы қауіпсіз автоматты жад басқаруды талап етеді және машинаның нұсқауларын жадқа сілтемелерді қолмен құрастырудан бас тартады. LLVM сияқты басқа виртуалды машиналар дәстүрлі физикалық машиналарға көбірек ұқсайды, олар сілтемелермен тікелей пайдалану мен манипуляциялауға мүмкіндік береді. Common Intermediate Language (CIL) ортада гибридті ұсынады, бұл жадты бақылауға мүмкіндік береді (JVM сияқты, ол қауіпсіз автоматты жадты басқаруға мүмкіндік береді), сонымен қатар типтік шекараларды және рұқсаттарды бұза алатын тікелей сілтемелерді манипуляциялауға мүмкіндік беретін "қауіпсіз" режимге мүмкіндік береді. Код қауіпсіздігі, әдетте, портативті виртуалды машинаның кодты орындауға қабілеттілігін білдіреді, бірақ оған тек белгіленген мүмкіндіктер жиынтығын ұсынады. Мысалы, виртуалды машина кодқа белгілі бір функцияларға немесе деректерге қол жеткізуге ғана рұқсат беруі мүмкін. Жадты автоматты басқаруды мүмкін ететін және виртуалды машинаға типіне сенімді деректерге қол жеткізуді қамтамасыз етуге мүмкіндік беретін сілтемелердегі бірдей бақылаулар кодтың фрагментінің тек жадтың белгілі бір элементтеріне ғана рұқсат етілуін және виртуалды машинаның өзін айналып өтуін қамтамасыз ету үшін қолданылады. Басқа қауіпсіздік тетіктері кодты тексерушілер, стек тексерушілер және басқа әдістер ретінде үстінен орналасады. Интерпретатор виртуалды нұсқаулардан жасалған бағдарламаларды жүктеуге және жергілікті машина нұсқауларына құнсыз компиляциясыз дереу орындауға мүмкіндік береді. Орындауға болатын кез келген виртуалды машинаны түсіндіруге болады, сондықтан бағанның аталуы мұнда жоба тиімді түсіндіруге арналған ережелерді қамтиды ма дегенді білдіреді (жалпы пайдалану үшін). Тек уақытында компиляция (JIT) - бағдарламаны орындау алдында немесе оның ішінде, мүмкіндігінше соңғы уақытта, жергілікті нұсқауларға компиляциялау әдісі. JIT-тің қиындықтары виртуалды машиналарды жобалауға қарағанда, оны іске асыруда көбірек, алайда қазіргі заманғы жобалар тиімділікке көмектесу үшін қарастыруға бастады. Ең қарапайым JIT әдістері тек офлайн компиляторға ұқсас код фрагментіне компиляцияланады. Алайда, көбінесе күрделі әдістер қолданылады, олар құрастырылған кодты фрагменттерді тек орындалу кезінде белгілі параметрлерге мамандандырады (Адаптивті оптимизацияны қараңыз). Уақыт алдында компиляция (AOT) - бағдарламаны орындау кезінде өзгермейтін жергілікті нұсқаулар жиынтығын жасау үшін прекомпиляторды пайдаланудың классикалық әдісіне қатысты. Агрессивті компиляция мен оптимизациялау уақытты талап ететіндіктен, алдын ала компиляцияланған бағдарлама орындалуы үшін тек JIT-ке сүйенетін бағдарламаға қарағанда жылдам іске қосылуы мүмкін. JVM-ді іске асыру JIT-пен туынды код фрагменттері шығарылғанға дейін іске қосу уақытын жылдамдату үшін бастапқы түсіндіру арқылы осы іске қосу шығынын азайтты. Ортақ кітапханалар - бірнеше орындалып жатқан бағдарламалар арасында жергілікті код сегменттерін қайта пайдалану мүмкіндігі. Қазіргі заманғы операциялық жүйелерде бұл әдетте ортақ кітапхананы қамтитын жад беттерін әртүрлі процестер арасында бөлісуді білдіреді, олар жадты қорғау арқылы бір-бірінен қорғалған. Жылдам JIT әдістері, мысалы адаптивті оптимизация, көбінесе процестер арасында немесе бағдарламаның тізбектелген орындалуларында бөлісуге жарамсыз код фрагменттерін тудырады, сондықтан алдын ала компиляцияланған және бөлісетін кодтың тиімділігі мен адаптивті мамандандырылған кодтың артықшылықтары арасында таңдау жасау қажет. Мысалы, CIL дизайнының бірнеше ережелері тиімді ортақ кітапханаларды қамтамасыз етуге арналған, мүмкін, JIT кодын одан да мамандандыру есебінен. OS X-тегі JVM Java Shared Archive-ты ортақ кітапханалардың кейбір артықшылықтарын ұсыну үшін пайдаланады.
Виртуалды машинаның қолданбалық іске асырылуын салыстыру
Жоғарыда сипатталған портативті виртуалды машиналардан басқа, виртуалды машиналар көбінесе интерпретатор арқылы жеке скрипт тілдерінің орындалу моделі ретінде қолданылады. Бұл кестеде жоғарыда аталған портативті виртуалды машиналардың және скрипт тілдерінің виртуалды машиналарын тізімделеді. Виртуалды машиналар Тілдері Түсініктемелер Интерпретатор JIT Іске асыру тілі SLoC Жалпы тілдің орындалу уақыты (CLR) C#, C++/CLI, F#, VB. NET байт-коды CIL; NET Core Runtime GitHub-та C#, C++ Adobe Flash Player (Tamarin) ActionScript, SWF (файл пішімі) интерактивті веб-авторлық құралы. Байт-коды "ActionScript Byte Code (.abc)" деп аталады. C++ 135к (бастапқыда шығарылды) Dis (Inferno) Limbo Dis Виртуалды машинаның ерекшелігі C 15к + 2850 JIT архитектурасына + 500 хост ОС DotGNU Портативті .NET CLI тілдері: C# Common Language Runtime клоны C, C# Forth Forth мүмкіндіктері оңайлатылған, әдетте құрастырушы, компилятор, мәтін және бинарлық деңгейдегі интерпретаторларды, кейде редактор, жөндеуші және операциялық жүйені қамтиды. Компиляция жылдамдығы >20 SKLOC/с және JIT сияқты жұмыс істейді. Forth, Forth Assembler 2.8к-тан 5.6к-қа дейін; озық, кәсіби іске асырулар кішірек. Glulx Inform 6, Inform 7, басқалары Әртүрлі іске асырулар бар HHVM PHP, Hack Hack және PHP тілінде жазылған бағдарламаларды орындауға арналған ашық кодты виртуалды машина. C++, OCaml Icon Icon Бастапқы код интерпретаторды және C тіліне қолдаусыз компиляцияны ұсынады. Компилятор мен интерпретатор арасында ортақ пайдаланылатын орындалу коды C тілінің RTT деп аталатын нұсқасында жазылған. C, RTT (Icon үшін негізгі кодпен бірге берілген C тіліне арналған интерфейс). ~180к (байткодтың көзі: ~11к, байткод интерпретаторы: ~46к, iconc: ~23к, жалпы/заголовоктар: ~13к, rtt: ~15к) JVM Java, Kotlin, Jython, Groovy, JRuby, C, C++, Clojure, Scala және басқалар; Sun-ның анықтамалық іске асыруы; OpenJDK: GPL лицензиясымен код; IcedTea: GPL лицензиясымен код және құралдар; OpenJDK & IcedTea тұрақты JIT-мен: Java, C, C++, ASM; IcedTea "Zero" JIT-мен: Java, C, C++ JVM шамамен 6500к жол; TCK шамамен 80к тест және шамамен 1000к LLVM жолдар; C, C++, Kotlin, Objective-C, Swift, Ada, Fortran және Rust MSIL, C және C++ шығарулары қолдалады. ActionScript байт-кодын шығаруды Adobe Alchemy қолдайды. Байт-коды "LLVM Bytecode (.bc)" деп аталады. Ассемблер "LLVM Assembly Language (*.ll)" деп аталады. C++ 811к Lua Lua LuaJIT C 13к + 7к LuaJIT MMIX MMIXAL Mono CLI тілдері, соның ішінде: C#, VB.NET, IronPython, IronRuby және басқалар Common Language Runtime клоны C#, C 2332к NekoVM қазіргі уақытта Neko және Haxe x86 ғана C 46к Oz Oz, Alice O код машинасы BCPL p код машинасы Pascal UCSD Pascal, 70-жылдардың соңында, соның ішінде Apple II ассамблерінде кеңінен таралған, Pascal Parrot Perl 5, Raku, NQP rx, PIR, PASM, PBC, BASIC, bc, C99, ECMAScript, Lisp, Lua, m4, Tcl, WMLScript, XML және басқалар C, Perl 111к C, 240к Perl Perl виртуалды машинасы Perl op код ағашы C, Perl 175к C, 9к Perl CPython Python Psyco, Unladen Swallow C 387к C, 368к Python, 10к ASM, 31к Psyco PyPy Python Өзін-өзі орындалатын Python, Psyco-ның келесі буыны Python Rubinius Ruby Ruby үшін тағы бір іске асыру C++, Ruby Silverlight C#, VB.NET Microsoft .NET Framework-тің шағын нұсқасы, бағдарламаларды браузердегі қауіпсіз ортада орындауға мүмкіндік береді C++ 7МБ (бастапқыда шығарылды) ScummVM Scumm Компьютерлік ойын қозғалтқышы SECD ISWIM, Lispkit Lisp Squirrel Squirrel Squirrel JIT C++ 12к Smalltalk Smalltalk SQLite SQLite опкодтары Виртуалды деректер базасы қозғалтқышы Squeak Squeak Smalltalk Squeak виртуалды машинасының өзін-өзі орындалуы. Бай мультимедиалық қолдау. Smalltalk/Slang 110к Smalltalk, ~300к CSWI PrologProlog: SWI Prolog, YAP C, SWI Prolog TraceMonkey JavaScript Tamarin негізінде C++ 173к TrueType TrueType Шрифттерді көрсету қозғалтқышы C (әдетте) Valgrind x86/x86 64 бинарлары Linux жүйесінде жадқа кіруді және ақауларды тексеру C 467к VisualWorks Smalltalk C Vx32 виртуалды машинасы x86 бинарлары Жергілікті код үшін қолданба деңгейіндегі виртуализация Waba кішкентай құрылғылар үшін виртуалды машина, Java-ға ұқсас Yet Another Ruby VM (YARV) Ruby Ruby 1.9 және одан жаңа нұсқалары үшін анықтамалық іске асыру Z машина Z Код Zend Engine PHP C 75к.