Промежуточный код
Стиль этой статьи неэнциклопедичен или нарушает нормы литературного русского языка. |
Байт-код (байтко́д; англ. bytecode, также иногда p-код, p-code от portable code) — стандартное промежуточное представление, в которое может быть переведена компьютерная программа автоматическими средствами. По сравнению с исходным кодом, удобным для создания и чтения человеком, байт-код — это компактное представление программы, уже прошедшей синтаксический и семантический анализ. В нём в явном виде закодированы типы, области видимости и другие конструкции. С технической точки зрения байт-код представляет собой машинно-независимый код низкого уровня, генерируемый транслятором из исходного кода.
Многие современные языки программирования, особенно интерпретируемые, используют байт-код для облегчения и ускорения работы интерпретатора. Трансляция в байт-код является методом, промежуточным по эффективности между прямой интерпретацией и компиляцией в машинный код.
По форме байт-код похож на машинный код, но предназначен для исполнения не реальным процессором, а виртуальной машиной. В качестве виртуальной машины обычно выступает интерпретатор соответствующего языка программирования (иногда дополненный JIT- или AOT-компилятором). Спецификации байт-кода и исполняющих его виртуальных машин могут сильно различаться для разных языков: часто байт-код состоит из инструкций для [англ.] виртуальной машины, однако могут использоваться и регистровые машины. Тем не менее, большинство инструкций байт-кода обычно эквивалентны одной или нескольким командам ассемблера.
Байт-код называется так, потому что длина каждого кода операции традиционно составляет один байт. Каждая инструкция обычно представляет собой однобайтовый код операции (от 0 до 255), за которым могут следовать различные параметры, например, номер регистра или адрес в памяти.
Исполнение
Программа на байт-коде обычно выполняется интерпретатором байт-кода. Преимущество байт-кода в большей эффективности и портируемости, то есть один и тот же байт-код может исполняться на разных архитектурах, для которых реализован интерпретатор. То же самое преимущество дают непосредственно интерпретируемые языки, однако, поскольку байт-код обычно менее абстрактен и более компактен, чем исходный код, эффективность интерпретации байт-кода обычно выше, чем чистая интерпретация исходного кода или интерпретация АСД. Кроме того, интерпретатор байт-кода зачастую проще интерпретатора исходного кода и его проще перенести (портировать) на другую аппаратную платформу.
В высокопроизводительных реализациях виртуальных машин может применяться комбинация интерпретатора и JIT-компилятора, который во время исполнения программы транслирует часто используемые фрагменты байт-кода в машинный код, применяя при этом различные оптимизации. Вместо JIT-компиляции может применяться AOT-компилятор, транслирующий байт-код в машинный код предварительно, до исполнения.
В то же время возможно создание процессоров, для которых данный байт-код является непосредственно машинным кодом (такие экспериментальные процессоры создавались, например, для языков Java и Форт).
История
Среди первых систем, использовавших байт-код, были O-code для BCPL (1960-е), Smalltalk (1976), SIL (System Implementation Language) для языка Snobol-4 (1967), p-код (p-code, 1970-е, при участии Никлауса Вирта) для переносимых компиляторов языка программирования Pascal.
Варианты p-кода широко использовались в различных реализациях языка Pascal, например, в UCSD p-System (UCSD Pascal).
Применение
К интерпретируемым языкам, использующим байт-код, относятся Perl, PHP (например Zend Engine), Ruby (начиная с версии 1.9), Python, Erlang и многие другие.
Широко распространённые платформы, использующие байт-код:
- Байт-код Java (стековая виртуальная машина), исполняемый различными виртуальными машинами Java. Платформа была создана компанией Sun для языка Java, но стала использоваться и для других языков; существуют десятки высокопроизводительных реализаций JVM, использующих JIT-компиляторы;
- Существуют варианты трансляции Java в байт-код регистровых машин, например, в виртуальной машине Dalvik (с JIT-компиляцией) или при AOT-компиляции в ART;
- Платформа Microsoft .NET использует стековый байт-код Intermediate Language (CIL, MSIL), исполняемый с помощью Common Language Runtime (CLR), создана Microsoft для C# и некоторых других языков;
- Сценарный язык JavaScript выполняется различными высокопроизводительными «движками», в основном, встроенными в веб-браузеры, часто с возможностью JIT-оптимизации. Многие интерпретаторы построены с применением байт-кода, однако программы на JavaScript распространяются в виде исходных кодов;
- Сценарный язык ActionScript транслируется в стековый байт-код, распространяется в составе swf- и pdf-файлов, и выполняется виртуальными машинами в Adobe Flash и Adobe Acrobat.
Компилятор Clipper создает исполняемый файл, в который включен байт-код, транслированный из исходного текста программы, и виртуальная машина, исполняющая этот байт-код.
Программы на Java обычно компилируются в [англ.], содержащие байт-код Java. Эти универсальные файлы передаются на различные целевые машины.
В ранних реализациях Visual Basic (до версии 6) использовался высокоуровневый Microsoft p-code.
Высокоуровневые p-коды и байт коды применялись в СУБД, некоторых реализациях Бейсика и Паскаля.
В стандарте открытых загрузчиков Open Firmware фирмы Sun Microsystems байт-код представляет операторы языка Форт.
Примеры
Python
Код:
>>> print("Hello, World!") Hello, World! Байт-код:
>>> import dis #импортируем модуль "dis" - Disassembler of Python byte code into mnemonics. >>> dis.dis('print("Hello, World!")') 1 0 LOAD_NAME 0 (print) 2 LOAD_CONST 0 ('Hello, World!') 4 CALL_FUNCTION 1 6 RETURN_VALUE Java
Код:
outer: for (int i = 2; i < 1000; i++) { for (int j = 2; j < i; j++) { if (i % j == 0) continue outer; } System.out.println(i); } Байт-код:
0: iconst_2 1: istore_1 2: iload_1 3: sipush 1000 6: if_icmpge 44 9: iconst_2 10: istore_2 11: iload_2 12: iload_1 13: if_icmpge 31 16: iload_1 17: iload_2 18: irem 19: ifne 25 22: goto 38 25: iinc 2, 1 28: goto 11 31: getstatic #84; //Field java/lang/System.out:Ljava/io/PrintStream; 34: iload_1 35: invokevirtual #85; //Method java/io/PrintStream.println:(I)V 38: iinc 1, 1 41: goto 2 44: return Критика
Традиционно байт-код проектируется в стиле стековых виртуальных машин, что упрощает генерацию из AST, позволяет использовать более простую и компактную кодировку байт-кода, упростить интерпретатор и уменьшить количество машинного кода, требуемого для исполнения одной инструкции байт-кода. С другой стороны, такие варианты байт-кода для заданной программы содержат большее количество инструкций, чем байт-коды регистровых виртуальных машин, из-за чего интерпретатор должен совершить больше непрямых переходов, для которых плохо работает предсказание переходов. Байт-код для регистровых виртуальных машин имеет немного больший размер машинных кодов, однако количество инструкций по сравнению со стековым байт-кодом примерно в два раза меньше, а интерпретатор — быстрее на десятки процентов. Также байт-код стековых машин сложнее для проведения оптимизаций (выражения становятся неявными, связанные инструкции не сгруппированы, выражения распределены по нескольким базовым блокам) и требует верификации корректности использования стека.
Ошибки верификации байт-кода стековых машин приводили к появлению множества экстремально опасных уязвимостей, в частности десятков в виртуальной машине AVM2, используемой в Adobe Flash для исполнения скриптов ActionScript и нескольких в ранних популярных системах исполнения Java (JVM).
В конце 2000-х — начале 2010-х авторы компиляторов V8 (для языка JavaScript, часто реализуемого через байт-код) и Dart усомнились в том, что промежуточные байт-коды обязательны для быстрых и эффективных виртуальных машин. В этих проектах была реализована непосредственная JIT-компиляция (компиляция во время исполнения) из исходных кодов сразу в машинный код.
Примечания
- Terence Parr. Language Implementation Patterns — Pragmatic Bookshelf, December 2009, ISBN 978-1-934356-45-6 «Part 3: Building Interpreters. Pattern 27 Stack-Based Bytecode Interpreter» Архивная копия от 26 июня 2015 на Wayback Machine
- Terence Parr. Language Implementation Patterns — Pragmatic Bookshelf, December 2009, ISBN 978-1-934356-45-6 «Part 3: Building Interpreters. Pattern 28 Register-Based Bytecode Interpreter» Архивная копия от 26 июня 2015 на Wayback Machine
- Yunhe Shi, David Gregg, Andrew Beatty, M. Anton Ertl. Virtual Machine Showdown: Stack Versus Registers (англ.) // VEE '05: Proceedings of the 1st ACM/USENIX international conference on Virtual execution environments. — Chicago, Illinois, USA: ACM, 2005. — P. 153 - 163. — ISBN 1-59593-047-7. — doi:10.1145/1064979.1065001.
- Bringing Performanceand Scalability toDynamic Languages (недоступная ссылка) // Mario Wolczko, Oracle 2012 слайд 7
- Руслан Богатырев. Летопись языков Паскаль Архивная копия от 30 мая 2015 на Wayback Machine, Мир ПК, № 04/2001
- Компиляторы: принципы, технологии и инструментарий Архивная копия от 4 марта 2016 на Wayback Machine — Вильямс, ISBN 9785845901897, стр 517 «12.2 Компиляторы Pascal»
- THE UCSD P-SYSTEM MUSEUM Архивная копия от 17 февраля 2015 на Wayback Machine, 2004
- Understanding .NET: A Tutorial and Analysis Архивная копия от 6 марта 2016 на Wayback Machine, David Chappell, David Wayne Chappell, 2002, ISBN 9780201741629 page 92
- C# Versus Java Архивная копия от 6 апреля 2016 на Wayback Machine / Dr. Dobb’s Journal February 2001
- http://www.javaworld.com/article/2077233/core-java/bytecode-basics.html Архивная копия от 19 мая 2015 на Wayback Machine 1996
- Алан Джок. Компиляторы, интерпретаторы и байт-код. «Computerworld Россия», № 06, 2001. Дата обращения: 18 мая 2015. Архивировано 28 октября 2010 года.
- Ando Saabas, Tarmo Uustalu. Type systems for optimizing stack-based code // Electronic Notes in Theoretical Computer Science. — 2007. — Вып. 190.1. — С. 103-119.. — doi:10.1016/j.entcs.2007.02.063. Архивировано 26 мая 2016 года.: «virtual stack or virtual register VMs can be executed more efficiently using an interpreter. Virtual register machines can be an attractive alternative to stack architectures because they allow the number of executed VM instructions to be substantially reduced.»
- Gerwin Klein and Martin Wildmoser, Verified Bytecode Subroutines Архивная копия от 10 августа 2017 на Wayback Machine // Journal of Automated Reasoning 30.3-4 (2003): 363—398. «Bytecode verification is a static check for bytecode safety. Its purpose is to ensure that the JVM only executes safe code: no operand stack over- or underflows, no ill-formed instructions, no type errors»
- Mark Dowd (X-Force Researcher IBM Internet Security Systems), Leveraging the ActionScript Virtual Machine (недоступная ссылка), IBM 2008 «if there was a way to execute AS3 instructions that had never been verified, it would be quite dangerous. Unverified instructions would be able to manipulate the native runtime stack … The attack works by manipulating a data structure used by the AVM2 verifier such that it doesn’t correctly verify the ActionScript instructions for a given method»
- Haifei Li, Understanding and Exploiting Flash ActionScript Vulnerabilities Архивировано 26 ноября 2013 года., 2011 «Bytecode -> Verification process … ActionScript Vulnerabilities are due to various program flow calculating errors in the Verification/Generation Process (the Verification Flow and the Execution Flow are not the same)»
- Haifei Li (Microsoft), Inside AVM Архивная копия от 21 ноября 2014 на Wayback Machine // REcon 2012, Montreal «Most Flash vulnerabilities are ActionScript-related … Faults on verification cause highly-dangerous JIT type confusion vulnerabilities. • highly-dangerous means perfect exploitation: bypassing ASLR+DEP, with %100 reliability, no heapSpray, no JITSpray. • JIT type confusion bugs are due to faults in the verification of AVM!»
- The last stage of delirium research group, Java and Java Virtual Machine security vulnerabilities and their exploitation techniques Архивная копия от 12 марта 2016 на Wayback Machine, BlackHat 2002: «The flaw stemmed from the fact that Bytecode Verifier did not properly perform the bytecode flow analysis»
- Verification of Bytecode in a Virtual machine Архивировано 30 апреля 2013 года. // International Journal of Advanced Research in Computer Science and Software Engineering Vol.3 Issue 3 March 2013, ISSN 2277-128X: «Java byte code verification has been studied extensively from a correctness perspective, and several vulnerabilities have been found and eliminated in this process»
- Dynamic Machine Code Generation. Google. Дата обращения: 18 мая 2015. Архивировано 17 сентября 2013 года.
- Loitsch, Florian. Why Not a Bytecode VM? Google. Дата обращения: 18 мая 2015. Архивировано 12 мая 2013 года.
- Dr. Axel Rauschmayer. JavaScript myth: JavaScript needs a standard bytecode (англ.). Дата обращения: 18 мая 2015. Архивировано 19 мая 2015 года.
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Промежуточный код, Что такое Промежуточный код? Что означает Промежуточный код?
Stil etoj stati neenciklopedichen ili narushaet normy literaturnogo russkogo yazyka Statyu sleduet ispravit soglasno stilisticheskim pravilam Vikipedii 8 yanvarya 2023 Bajt kod bajtko d angl bytecode takzhe inogda p kod p code ot portable code standartnoe promezhutochnoe predstavlenie v kotoroe mozhet byt perevedena kompyuternaya programma avtomaticheskimi sredstvami Po sravneniyu s ishodnym kodom udobnym dlya sozdaniya i chteniya chelovekom bajt kod eto kompaktnoe predstavlenie programmy uzhe proshedshej sintaksicheskij i semanticheskij analiz V nyom v yavnom vide zakodirovany tipy oblasti vidimosti i drugie konstrukcii S tehnicheskoj tochki zreniya bajt kod predstavlyaet soboj mashinno nezavisimyj kod nizkogo urovnya generiruemyj translyatorom iz ishodnogo koda Mnogie sovremennye yazyki programmirovaniya osobenno interpretiruemye ispolzuyut bajt kod dlya oblegcheniya i uskoreniya raboty interpretatora Translyaciya v bajt kod yavlyaetsya metodom promezhutochnym po effektivnosti mezhdu pryamoj interpretaciej i kompilyaciej v mashinnyj kod Po forme bajt kod pohozh na mashinnyj kod no prednaznachen dlya ispolneniya ne realnym processorom a virtualnoj mashinoj V kachestve virtualnoj mashiny obychno vystupaet interpretator sootvetstvuyushego yazyka programmirovaniya inogda dopolnennyj JIT ili AOT kompilyatorom Specifikacii bajt koda i ispolnyayushih ego virtualnyh mashin mogut silno razlichatsya dlya raznyh yazykov chasto bajt kod sostoit iz instrukcij dlya angl virtualnoj mashiny odnako mogut ispolzovatsya i registrovye mashiny Tem ne menee bolshinstvo instrukcij bajt koda obychno ekvivalentny odnoj ili neskolkim komandam assemblera Bajt kod nazyvaetsya tak potomu chto dlina kazhdogo koda operacii tradicionno sostavlyaet odin bajt Kazhdaya instrukciya obychno predstavlyaet soboj odnobajtovyj kod operacii ot 0 do 255 za kotorym mogut sledovat razlichnye parametry naprimer nomer registra ili adres v pamyati IspolnenieProgramma na bajt kode obychno vypolnyaetsya interpretatorom bajt koda Preimushestvo bajt koda v bolshej effektivnosti i portiruemosti to est odin i tot zhe bajt kod mozhet ispolnyatsya na raznyh arhitekturah dlya kotoryh realizovan interpretator To zhe samoe preimushestvo dayut neposredstvenno interpretiruemye yazyki odnako poskolku bajt kod obychno menee abstrakten i bolee kompakten chem ishodnyj kod effektivnost interpretacii bajt koda obychno vyshe chem chistaya interpretaciya ishodnogo koda ili interpretaciya ASD Krome togo interpretator bajt koda zachastuyu proshe interpretatora ishodnogo koda i ego proshe perenesti portirovat na druguyu apparatnuyu platformu V vysokoproizvoditelnyh realizaciyah virtualnyh mashin mozhet primenyatsya kombinaciya interpretatora i JIT kompilyatora kotoryj vo vremya ispolneniya programmy transliruet chasto ispolzuemye fragmenty bajt koda v mashinnyj kod primenyaya pri etom razlichnye optimizacii Vmesto JIT kompilyacii mozhet primenyatsya AOT kompilyator transliruyushij bajt kod v mashinnyj kod predvaritelno do ispolneniya V to zhe vremya vozmozhno sozdanie processorov dlya kotoryh dannyj bajt kod yavlyaetsya neposredstvenno mashinnym kodom takie eksperimentalnye processory sozdavalis naprimer dlya yazykov Java i Fort IstoriyaSredi pervyh sistem ispolzovavshih bajt kod byli O code dlya BCPL 1960 e Smalltalk 1976 SIL System Implementation Language dlya yazyka Snobol 4 1967 p kod p code 1970 e pri uchastii Niklausa Virta dlya perenosimyh kompilyatorov yazyka programmirovaniya Pascal Varianty p koda shiroko ispolzovalis v razlichnyh realizaciyah yazyka Pascal naprimer v UCSD p System UCSD Pascal PrimenenieK interpretiruemym yazykam ispolzuyushim bajt kod otnosyatsya Perl PHP naprimer Zend Engine Ruby nachinaya s versii 1 9 Python Erlang i mnogie drugie Shiroko rasprostranyonnye platformy ispolzuyushie bajt kod Bajt kod Java stekovaya virtualnaya mashina ispolnyaemyj razlichnymi virtualnymi mashinami Java Platforma byla sozdana kompaniej Sun dlya yazyka Java no stala ispolzovatsya i dlya drugih yazykov sushestvuyut desyatki vysokoproizvoditelnyh realizacij JVM ispolzuyushih JIT kompilyatory Sushestvuyut varianty translyacii Java v bajt kod registrovyh mashin naprimer v virtualnoj mashine Dalvik s JIT kompilyaciej ili pri AOT kompilyacii v ART Platforma Microsoft NET ispolzuet stekovyj bajt kod Intermediate Language CIL MSIL ispolnyaemyj s pomoshyu Common Language Runtime CLR sozdana Microsoft dlya C i nekotoryh drugih yazykov Scenarnyj yazyk JavaScript vypolnyaetsya razlichnymi vysokoproizvoditelnymi dvizhkami v osnovnom vstroennymi v veb brauzery chasto s vozmozhnostyu JIT optimizacii Mnogie interpretatory postroeny s primeneniem bajt koda odnako programmy na JavaScript rasprostranyayutsya v vide ishodnyh kodov Scenarnyj yazyk ActionScript transliruetsya v stekovyj bajt kod rasprostranyaetsya v sostave swf i pdf fajlov i vypolnyaetsya virtualnymi mashinami v Adobe Flash i Adobe Acrobat Kompilyator Clipper sozdaet ispolnyaemyj fajl v kotoryj vklyuchen bajt kod translirovannyj iz ishodnogo teksta programmy i virtualnaya mashina ispolnyayushaya etot bajt kod Programmy na Java obychno kompiliruyutsya v angl soderzhashie bajt kod Java Eti universalnye fajly peredayutsya na razlichnye celevye mashiny V rannih realizaciyah Visual Basic do versii 6 ispolzovalsya vysokourovnevyj Microsoft p code Vysokourovnevye p kody i bajt kody primenyalis v SUBD nekotoryh realizaciyah Bejsika i Paskalya V standarte otkrytyh zagruzchikov Open Firmware firmy Sun Microsystems bajt kod predstavlyaet operatory yazyka Fort PrimeryPython Kod gt gt gt print Hello World Hello World Bajt kod gt gt gt import dis importiruem modul dis Disassembler of Python byte code into mnemonics gt gt gt dis dis print Hello World 1 0 LOAD NAME 0 print 2 LOAD CONST 0 Hello World 4 CALL FUNCTION 1 6 RETURN VALUE Java Kod outer for int i 2 i lt 1000 i for int j 2 j lt i j if i j 0 continue outer System out println i Bajt kod 0 iconst 2 1 istore 1 2 iload 1 3 sipush 1000 6 if icmpge 44 9 iconst 2 10 istore 2 11 iload 2 12 iload 1 13 if icmpge 31 16 iload 1 17 iload 2 18 irem 19 ifne 25 22 goto 38 25 iinc 2 1 28 goto 11 31 getstatic 84 Field java lang System out Ljava io PrintStream 34 iload 1 35 invokevirtual 85 Method java io PrintStream println I V 38 iinc 1 1 41 goto 2 44 returnKritikaTradicionno bajt kod proektiruetsya v stile stekovyh virtualnyh mashin chto uproshaet generaciyu iz AST pozvolyaet ispolzovat bolee prostuyu i kompaktnuyu kodirovku bajt koda uprostit interpretator i umenshit kolichestvo mashinnogo koda trebuemogo dlya ispolneniya odnoj instrukcii bajt koda S drugoj storony takie varianty bajt koda dlya zadannoj programmy soderzhat bolshee kolichestvo instrukcij chem bajt kody registrovyh virtualnyh mashin iz za chego interpretator dolzhen sovershit bolshe nepryamyh perehodov dlya kotoryh ploho rabotaet predskazanie perehodov Bajt kod dlya registrovyh virtualnyh mashin imeet nemnogo bolshij razmer mashinnyh kodov odnako kolichestvo instrukcij po sravneniyu so stekovym bajt kodom primerno v dva raza menshe a interpretator bystree na desyatki procentov Takzhe bajt kod stekovyh mashin slozhnee dlya provedeniya optimizacij vyrazheniya stanovyatsya neyavnymi svyazannye instrukcii ne sgruppirovany vyrazheniya raspredeleny po neskolkim bazovym blokam i trebuet verifikacii korrektnosti ispolzovaniya steka Oshibki verifikacii bajt koda stekovyh mashin privodili k poyavleniyu mnozhestva ekstremalno opasnyh uyazvimostej v chastnosti desyatkov v virtualnoj mashine AVM2 ispolzuemoj v Adobe Flash dlya ispolneniya skriptov ActionScript i neskolkih v rannih populyarnyh sistemah ispolneniya Java JVM V konce 2000 h nachale 2010 h avtory kompilyatorov V8 dlya yazyka JavaScript chasto realizuemogo cherez bajt kod i Dart usomnilis v tom chto promezhutochnye bajt kody obyazatelny dlya bystryh i effektivnyh virtualnyh mashin V etih proektah byla realizovana neposredstvennaya JIT kompilyaciya kompilyaciya vo vremya ispolneniya iz ishodnyh kodov srazu v mashinnyj kod PrimechaniyaTerence Parr Language Implementation Patterns Pragmatic Bookshelf December 2009 ISBN 978 1 934356 45 6 Part 3 Building Interpreters Pattern 27 Stack Based Bytecode Interpreter Arhivnaya kopiya ot 26 iyunya 2015 na Wayback Machine Terence Parr Language Implementation Patterns Pragmatic Bookshelf December 2009 ISBN 978 1 934356 45 6 Part 3 Building Interpreters Pattern 28 Register Based Bytecode Interpreter Arhivnaya kopiya ot 26 iyunya 2015 na Wayback Machine Yunhe Shi David Gregg Andrew Beatty M Anton Ertl Virtual Machine Showdown Stack Versus Registers angl VEE 05 Proceedings of the 1st ACM USENIX international conference on Virtual execution environments Chicago Illinois USA ACM 2005 P 153 163 ISBN 1 59593 047 7 doi 10 1145 1064979 1065001 Bringing Performanceand Scalability toDynamic Languages nedostupnaya ssylka Mario Wolczko Oracle 2012 slajd 7 Ruslan Bogatyrev Letopis yazykov Paskal Arhivnaya kopiya ot 30 maya 2015 na Wayback Machine Mir PK 04 2001 Kompilyatory principy tehnologii i instrumentarij Arhivnaya kopiya ot 4 marta 2016 na Wayback Machine Vilyams ISBN 9785845901897 str 517 12 2 Kompilyatory Pascal THE UCSD P SYSTEM MUSEUM Arhivnaya kopiya ot 17 fevralya 2015 na Wayback Machine 2004 Understanding NET A Tutorial and Analysis Arhivnaya kopiya ot 6 marta 2016 na Wayback Machine David Chappell David Wayne Chappell 2002 ISBN 9780201741629 page 92 C Versus Java Arhivnaya kopiya ot 6 aprelya 2016 na Wayback Machine Dr Dobb s Journal February 2001 http www javaworld com article 2077233 core java bytecode basics html Arhivnaya kopiya ot 19 maya 2015 na Wayback Machine 1996 Alan Dzhok Kompilyatory interpretatory i bajt kod neopr Computerworld Rossiya 06 2001 Data obrasheniya 18 maya 2015 Arhivirovano 28 oktyabrya 2010 goda Ando Saabas Tarmo Uustalu Type systems for optimizing stack based code Electronic Notes in Theoretical Computer Science 2007 Vyp 190 1 S 103 119 doi 10 1016 j entcs 2007 02 063 Arhivirovano 26 maya 2016 goda virtual stack or virtual register VMs can be executed more efficiently using an interpreter Virtual register machines can be an attractive alternative to stack architectures because they allow the number of executed VM instructions to be substantially reduced Gerwin Klein and Martin Wildmoser Verified Bytecode Subroutines Arhivnaya kopiya ot 10 avgusta 2017 na Wayback Machine Journal of Automated Reasoning 30 3 4 2003 363 398 Bytecode verification is a static check for bytecode safety Its purpose is to ensure that the JVM only executes safe code no operand stack over or underflows no ill formed instructions no type errors Mark Dowd X Force Researcher IBM Internet Security Systems Leveraging the ActionScript Virtual Machine nedostupnaya ssylka IBM 2008 if there was a way to execute AS3 instructions that had never been verified it would be quite dangerous Unverified instructions would be able to manipulate the native runtime stack The attack works by manipulating a data structure used by the AVM2 verifier such that it doesn t correctly verify the ActionScript instructions for a given method Haifei Li Understanding and Exploiting Flash ActionScript Vulnerabilities Arhivirovano 26 noyabrya 2013 goda 2011 Bytecode gt Verification process ActionScript Vulnerabilities are due to various program flow calculating errors in the Verification Generation Process the Verification Flow and the Execution Flow are not the same Haifei Li Microsoft Inside AVM Arhivnaya kopiya ot 21 noyabrya 2014 na Wayback Machine REcon 2012 Montreal Most Flash vulnerabilities are ActionScript related Faults on verification cause highly dangerous JIT type confusion vulnerabilities highly dangerous means perfect exploitation bypassing ASLR DEP with 100 reliability no heapSpray no JITSpray JIT type confusion bugs are due to faults in the verification of AVM The last stage of delirium research group Java and Java Virtual Machine security vulnerabilities and their exploitation techniques Arhivnaya kopiya ot 12 marta 2016 na Wayback Machine BlackHat 2002 The flaw stemmed from the fact that Bytecode Verifier did not properly perform the bytecode flow analysis Verification of Bytecode in a Virtual machine Arhivirovano 30 aprelya 2013 goda International Journal of Advanced Research in Computer Science and Software Engineering Vol 3 Issue 3 March 2013 ISSN 2277 128X Java byte code verification has been studied extensively from a correctness perspective and several vulnerabilities have been found and eliminated in this process Dynamic Machine Code Generation neopr Google Data obrasheniya 18 maya 2015 Arhivirovano 17 sentyabrya 2013 goda Loitsch Florian Why Not a Bytecode VM neopr Google Data obrasheniya 18 maya 2015 Arhivirovano 12 maya 2013 goda Dr Axel Rauschmayer JavaScript myth JavaScript needs a standard bytecode angl Data obrasheniya 18 maya 2015 Arhivirovano 19 maya 2015 goda
