Язык ассемблера является самым низкоуровневым языком программирования. Т.е. он ближе любых других приближен к архитектуре ЭВМ и ее аппаратным возможностям, позволяя получить к ним полный доступ. В отличие от языков высокого уровня (ЯВУ) ассемблерная программа содержит только тот код, который ввёл программист. Никаких дополнительных «обвязок». Вся ответственность за «логичность» кода полностью лежит на узких плечах программиста.
Эти особенности приводят к тому, что ассемблерные программы часто «подвешивают» компьютер, особенно у начинающих программистов.
Выделим три разновидности «зависания» по способу борьбы с ним:
1) Простое — для выхода из него достаточно нажать Ctrl+Break или Ctrl+C (сначала нажимается клавиша Ctrl и, не отпуская ее, нажимается вторая клавиша — C или Break; отпускаются в обратном порядке). Программа при этом аварийно завершается выходом в DOS.
2) Мягкое — машина не реагирует на Ctrl+Break, но клавиатура «дышит». Т.е. при нажатии на клавиши, типа NumLock, моргают соответствующие светодиоды. В этом случае машину нужно будет перегрузить, нажав Ctrl+Alt+Del. В среде Windows нужно просто «убить» сеанс, закрыв окно.
Стоит ли учить ассемблер новичку. #SimpleCode
3) Жесткое — машина никак не реагирует на клавиатуру и не воспринимает комбинацию Ctrl+Alt+Del. В этом случае поможет аппаратный сброс при помощи кнопки «Reset», расположенной на передней панели системного блока. Не нужно выключать и включать ЭВМ. Вы как будущие разработчики аппаратуры должны знать, что она выходит из строя в основном при включении и выключении.
Из-за своей специфики, а также по традиции, для программирования на языке ассемблера нет никаких сред-оболочек типа Turbo C, Turbo Pascal и т.д. Весь процесс технического создания ассемблерной программы можно разбить на 4 шага (исключены этапы создания алгоритма и т.п.):
1) Набор программы в текстовом редакторе и сохранение ее в отдельном файле. Каждый файл имеет имя и тип, называемый иногда расширением. Тип в основном используется для определения назначения файла. Например, программа на C имеет тип C, на Pascal — PAS, на языке ассемблера — ASM.
2) Обработка текста программы транслятором. На этом этапе текст превращается в машинный код, называемый объектным. Кроме того, есть возможность получить листинг программы, содержащий кроме текста программы различную дополнительную информацию и таблицы, созданные транслятором. Тип объектного файла — OBJ, файла листинга — LST. Этот этап называется трансляцией.
3) Обработка полученного объектного кода компоновщиком. Тут программа «привязывается» к конкретным условиям выполнения на ЭВМ. Полученный машинный код называется выполняемым. Кроме того, обычно получается карта загрузки программы в ОЗУ. Выполняемый файл имеет тип EXE, карта загрузки — MAP.
Этот этап называется компоновкой или линковкой.
4) Запуск программы. Если программа работает не совсем корректно, перед этим может присутствовать этап отладки программы при помощи специальной программы — отладчика. При нахождении ошибки приходится проводить коррекцию программы, возвращаясь к шагу 1. Таким образом, процесс создания ассемблерной программы можно изобразить в виде следующей схемы. Конечной целью, напомним, является работоспособный выполняемый файл HELLO.EXE.
Язык ассемблера: инструкции процессора, машинный код, паттерны проектирования и библиотеки
Процесс создания ассемблерной программы приведён схематично на рисунке 9.
Рисунок 9 – Процесс создания ассемблерной программы
Все задания по программированию на ассемблере вы будете выполнять в эмуляторе emu8086. Этот программный продукт содержит все необходимое для создания программы на языке Assembler.
Пакет Emu8086 сочетает в себе продвинутый текстовый редактор, assembler, disassembler, эмулятор программного обеспечения (Виртуальную машину) с пошаговым отладчиком, примеры.
Встроенная виртуальная машина полностью блокирует обращение программы к реальным аппаратным средствам ЭВМ, накопителям памяти, это делает процесс отладки намного легче.
При наборе программ на языке ассемблера придерживайтесь следующих правил:
1) директивы набирайте большими буквами, инструкции — малыми;
2) пишите текст широко — не жадничайте;
3) не выходите за край экрана, т.е. не делайте текст шире 80 знаков — его не удобно будет редактировать и печатать;
4) для отступов пользуйтесь табуляцией (клавиша TAB);
5) блоки комментариев задавайте с одинаковым отступом.
По мере знакомства с синтаксисом языка будут приводиться дополнительные правила.
Чтобы программа выполнилась любой ОС, она должна быть скомпилирована в исполнимый файл. Основные два формата исполнимых файлов в DOS — СОМ и ЕХЕ.
Файлы типа СОМ содержат только скомпилированный код без какой-либо дополнительной информации о программе. Весь код, данные и стек располагаются в одном сегменте и не могут превышать 64 Кб.
mov dx,offset message
message db «Привет», 0dh, 0ah, ‘$’
Рассмотрим исходный текст программы, чтобы понять, как она работает.
Первая строка определяет модель памяти TINY, в которой сегменты кода, данных и стека объединены. Эта модель предназначена для создания файлов типа СОМ.
В DOS для формирования адреса используется сегмент и смещение. Для формирования адреса строки » ПРИВЕТ » используется пара регистров DS (сегмент) и DX (смещение). При загрузке *.com-программы в память, все сегментные регистры принимают значение равное тому сегменту, в который загрузилась наша программа (в т.ч. и DS). Поэтому нет необходимости загружать в DS сегмент строки (он уже загружен).
Директива.code начинает сегмент кода, который в нашем случае также должен содержать и данные.
org 100h устанавливает значение программного счетчика (IP) в 100h (происходит смещение).
Метка begin: располагается перед первой командой в программе и будет использоваться в директиве end(Begin – англ. начало; end – конец), чтобы указать, с какой команды начинается программа.
Вообще вместо слова begin можно было бы использовать что-нибудь другое. Например, start:. В таком случае, нам пришлось бы и завершать программу end start.
mov dx,offset message
выводят на экран сообщение “ПРИВЕТ”.
Регистр процессора – это специально отведенная память для хранения какого-нибудь числа.
Для присвоения регистру какого-нибудь значения, в Ассемблере существует оператор mov (от англ. move – загрузить). Команда mov ah, 9 помещает число 9 в регистр ah — номер функции DOS «вывод строки».
Команда mov dx,offset message помещает в регистр DX смещение метки message относительно начала сегмента данных (команда mov – смещение), который в нашем случае совпадает с сегментом кода.
Offset (по-английски — это смещение). Когда, при ассемблировании, Ассемблер дойдет до этой строки, он заменит offset message на адрес (смещение) этой строки в памяти. Если мы запишем offset message (хотя, правильнее будет mov dx,word offset message), то в dx загрузится не адрес (смещение), а первые два символа нашей строки (в данном случае «Пр»). Так как dx — шестнадцатиразрядный регистр, в него можно загрузить только два байта (один символ всегда один байт).
Прерывание MS-DOS – это своего рода подпрограмма (часть MS-DOS), которая находится постоянно в памяти и может вызываться в любое время из любой программы.
Эта команда – основное средство взаимодействия программ с операционной системой. В примере вызывается функция DOS номер 9 — вывести строку на экран. Эта функция выводит строку от начала, адрес которого задается в регистрах ds: dx, до первого встречного символа $. При запуске СОМ-файла регистр ds автоматически загружается сегментным адресом программы, а регистр dx был подготовлен предыдущей командой.
Команда ADD (Addition – сложение (гл. to add – сложить)) осуществляет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется.
В качестве первого операнда команды ADD можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго — регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команду ADD можно использовать для сложения как обычных целых чисел, так и двоично-десятичных (с использованием регистра АХ для хранения результата).
Команда SUB (Subtraction – вычитание) вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде
SUB операнд1, операнд2
то ее действие можно условно изобразить следующим образом: операнд1 — операнд2 = операнд1
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго — регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.
Команда INC (Increment – инкремент) прибавляет 1 к операнду, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака.
Команда INC увеличивает на единицу регистр или значение операнда в памяти.
Она эквивалентна команде ADD источник, 1 только выполняется гораздо быстрее.
Команда DEC (Decrement – декремент) вычитает 1 из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.
Она эквивалентна команде SUB источник, 1 только выполняется гораздо быстрее.
Для того, чтобы ассемблер мог выполнять вычисления в различных системах счисления, существуют специальные обозначения, которые ставятся сразу после числа. Запомнить их необходимо, так как встречаются они в различных программах довольно часто. Разберем указания систем счисления на примере функции сложения чисел.
Add al, 7 в данной функции нет указателя, а значит число будет воспринято как десятичное.
Add al, 101b после числа стоит символ b (от англ. Binary – двойной), так обозначаются двоичные числа (запись эквивалентна 1012).
Add al, 101hпосле числа стоит символ h (от англ. hexadeсimal– шестнадцатеричный), так обозначаются числа в шестнадцатеричной системе счисления(запись эквивалентна 10116).
Пример 1. Напишите программу, выполняющую следующие арифметические действия: 5+1-2.
Решение:
Для того, чтобы составить данную программу, для начала необходимо запустить эмулятор emu8086, удалить заготовку и вписать свою. Заготовка под программу может выглядеть приблизительно так:
CSEG segment; Обозначение сегмента
Org 100h; Смещение сегмента
…; Место для будущего тела программы (действия).
Int 20h; Прерывание
CSEG ends; Конец сегмента
End begin; Конец программы
После того, как заготовка имеется, остаётся лишь добавить в неё необходимые действия. Для этого в тело программы (строка 4) вписываем следующее:
Mov al, 5; Записать в al значение 5 (исходя из задания)
Add al,1; Прибавить 1
Sub al, 2; Отнять 2
Это же самое тело программы можно переписать по-другому, для более быстрого выполнения. Тогда тело программы будет выглядеть так:
Mov al, 5; Записать в al значение 5 (исходя из задания)
inc al; Прибавить 1
dec al; Отнять 1
dec al; Отнять 1
Можно запускать программу (‘Run’). Оба решения будут верны.
Пример 2. Напишите программу, выполняющую следующие арифметические действия: 2510+1012-1216.
Решение:
Для того, чтобы составить данную программу, для начала необходимо запустить эмулятор emu8086, удалить заготовку и вписать свою. Заготовка под программу может выглядеть приблизительно так:
CSEG segment; Обозначение сегмента
Org 100h; Смещение сегмента
…; Место для будущего тела программы (действия).
Int 20h; Прерывание
CSEG ends; Конец сегмента
End begin; Конец программы
После того, как заготовка имеется, остаётся лишь добавить в неё необходимые действия. Для этого в тело программы (строка 4) вписываем следующее:
Mov al, 25; Записать в al значение 5 в десятичной СС.
Add al,101b; Прибавить 101 в двоичной СС.
Sub al, 12h; Отнять 12 в шестнадцатеричной СС.
Можно запускать программу (‘Run’).
Воспользуйтесь поиском по сайту:
studopedia.org — Студопедия.Орг — 2014-2023 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.012 с) .
Источник: studopedia.org
Основные возможности эмулятора EMU8086.
Системное программное обеспечение – комплекс программ, которые обеспечивают управление компонентами компьютерной системы, такими как процессор, оперативная память, устройства ввода-вывода, сетевое оборудование, выступая как «межслойный интерфейс», с одной стороны которого аппаратура, а с другой — приложения пользователя.
Целью СПО является, в отличие от прикладного ПО, не решать конкретные практические задачи, а лишь обеспечивать работу других программ, предоставляя им сервисные функции.
Операционная система – комплекс системных программ, расширяющий возможности вычислительной системы.
Функции ОС:
· загрузка приложений в оперативную память и их выполнение;
· стандартизированный доступ к периферийным устройствам (устройствам ввода-вывода);
· распределение оперативной памяти между процессами;
· управление доступом к данным на носителях;
· сетевые операции, поддержка стека протоколов.
Состав СПО:
· драйверы – программы предназначенные, для управления портами периферийных устройств, загружающиеся при запуске компьютера;
· утилиты – вспомогательные или служебные программы с дополнительными услугами.
Основные понятия и определения СПО.
Перечислить этапы подготовки программы. Дать основные определения.
Этапы подготовки программы:
· обработка процессором;
· трансляция – это процесс преобразования программы, представленной на языке высокого уровня в программу на язык низкого уровня;
· компоновка – соединение всех объектных модулей в загрузочный модуль .exe;
· выполнение.
Каковы отличия ассемблерных программ от ЯВУ?
Язык ассемблера – это машинно-ориентированный язык программирования низкого уровня. Его команды прямо соответствуют отдельным командам машины или их последовательностям.
Языки программирования низкого уровня – это языка, близкие к программированию непосредственно на машинных кодах с различием, что команды в машинных кодах выражаются наборами чисел, а в ЯПНУ в виде слов или буквенных сокращений.
Языки программирования высокого уровня – это языки, разработанные для быстроты и удобства их использования разработчиками. Они не зависят от внутренних машинных кодов любого типа, поэтому программы, написанные на языках высокого уровня, требуют перевода в машинные коды программами транслятора.
Транслятор (интерпретатор, компилятор) – программа, преобразующая программу на одном языке программирования в другой, чаще всего из высокоуровневого или низкоуровневого в машинный.
Какова структура ассемблерной программы?
Ассемблерная программа представляет собой совокупность блоков памяти, называемых сегментами памяти. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы.
Предложения ассемблера бывают четырех типов:
· команды или инструкции – символические аналоги машинных команд;
· макрокоманды – предложения, которые во время трансляции замещаются другими предложениями;
· директивы – указания транслятору ассемблера на выполнение некоторых действий. У директив нет аналогов в машинном представлении;
· строки комментариев – игнорируются транслятором.
В чем отличие инструкции от директивы?
(Подробнее в вопросе 5.)
Директивы выполняются в процессе превращения программы в машинный код. Инструкции составляют машинных код программы.
Каковы правила оформления программ на языке ассемблера?
· директивы производится большими буквами, инструкции – малыми;
· нельзя выходить за край экрана, текст одной строки не должен превышать 80 символов;
· для отступов возможно использование клавиши Tab;
· блоки компонентов необходимо задавать с одинаковым отступом;
· каждая новая инструкция пишется с новой строки;
· комментарии пишутся после «;» (символ точки с запятой).
История процессоров х86.
Архитектура x86 – самая распространенная архитектура для персональных компьютеров. Она берет свое начало с процессора Intel 8086. Название образовано от двух цифр, которыми заканчивались названия процессоров Intel ранних моделей — 8086, 80186, 80286 (i286), 80386 (i386), 80486 (i486).
Регистры процессора.
Регистр процессора – блок ячеек памяти, образующий сверхбыструю оперативную память внутри процессора.
Пользовательские регистры называются так потому, что программист может использовать их при написании своих программ. К этим регистрам относятся:
· восемь 32-битных регистров
o eax/ax/ah/al – аккумулятор, применяется для хранения промежуточных данных;
o ebx/bx/bh/bl – базовый регистр, применяется для хранения базового адреса некоторого объекта в памяти;
o edx/dx/dh/dl – счетчик, применяется в командах, производящих повторяющиеся действия;
o ecx/cx/ch/cl – регистр данных, он хранит промежуточные значения;
Типы данных, представленных в ПК.
Основные возможности эмулятора EMU8086.
· Программа EMU8086 сочетает в себе редактор исходного кода, ассемблер, дизассемблер, программный эмулятор с отладчиком.
· Эта программа позволяет наблюдать за регистрами, флагами и памятью во время исполнения программ.
· Программа выполняет программы на эмулированном ПК.
· Emu8086 имеет более легкий синтаксис, чем любые другие ассемблеры, но будет генерировать программу, которая сможет быть выполнена на любом компьютере, поддерживающем машинный код 8086.
Источник: megaobuchalka.ru
Какие принципиальные отличия языка Ассемблера от высокоуровневых языков программирования? Что такое байткод? В чём разница между языком Ассемблера и байткодом?
Язык ассемблера — язык программирования «низкого уровня». В отличие от языка машинных кодов позволяет использовать более удобные для человека мнемонические (символьные) обозначения команд. При этом для перевода с языка ассемблера в понимаемый процессором машинный код требуется специальная программа, также называемая ассемблером.
Ассемблер — родной язык компьютера. Можно сказать, что компьютер «думает» на ассемблере. Поэтому программы, написанные на других языках, таких как Си, нужно сначала перевести на ассемблер, чтобы компьютер их понял и смог исполнить.
Когда мы говорим о компьютере, выполняющем программы, то прежде всего имеем в виду его сердце — процессор — специальную микросхему, которая исполняет команды, часто называемые инструкциями, и хранит результаты их работы в специальных регистрах. Так, например, выполнение инструкций процессора
приводит к тому, что в регистре еах оказывается число 5. Первая инструкция mov eax, 2 посылает в регистр еах число 2. Вторая инструкция add eax, 3, выполняемая вслед за первой, прибавляет к содержимому регистра еах число 3.
Байт-код или байтко́д (англ. byte-code), иногда также используется термин псевдоко́д — машинно-независимый код низкого уровня, генерируемый транслятором и исполняемый интерпретатором. Большинство инструкций байт-кода эквивалентны одной или нескольким командам ассемблера. Трансляция в байт-код занимает промежуточное положение между компиляцией в машинный код и интерпретацией.
Байт-код называется так, потому что длина каждого кода операции — один байт, но длина кода команды различна. Каждая инструкция представляет собой однобайтовый код операции от 0 до 255, за которым следуют такие параметры, как регистры или адреса памяти. Это в типичном случае, но спецификация байт-кода значительно различается в разных языках.
Программа на байт-коде обычно выполняется интерпретатором байт-кода (обычно он называется виртуальной машиной, поскольку подобен компьютеру). Преимущество — в портируемости, т. е. один и тот же байт-код может исполняться на разных платформах и архитектурах. То же самое преимущество дают интерпретируемые языки.
Однако, поскольку байт-код обычно менее абстрактный, более компактный и более «компьютерный», чем исходный код, эффективность байт-кода обычно выше, чем чистая интерпретация исходного кода, предназначенного для правки человеком. По этой причине многие современные интерпретируемые языки на самом деле транслируют в байт-код и запускают интерпретатор байт-кода. К таким языкам относятся Perl, PHP, Ruby (начиная с версии 1.9) и Python. Программы на Java обычно передаются на целевую машину в виде байт-кода, который перед исполнением транслируется в машинный код «на лету» — с помощью JIT-компиляции. В стандарте открытых загрузчиков Open Firmware фирмы Sun Microsystems байт-код представляет операторы языка Forth.
В то же время возможно создание процессоров, для которых данный байт-код является непосредственно машинным кодом (такие процессоры существуют, например, для Java и Forth).
4. Приведите примеры форматов исполняемых файлов и кратко охарактеризуйте их. Подробно формат ELF.
форматы исполняемых файлов:
·. COM.
Расширение файла.COM (англ. command) использовалось в некоторых компьютерных операционных системах в различных целях.В системах DOS и в 8-битной CP/M, файл COM — простой тип исполняемого файла, размер которого не может превышать 64 Кбайт-256 байт (65280 = 216 − 28 байт).
· .EXE
.EXE (сокр. англ. executable — программа) — расширение исполнимого файла, применяемое в системах DOS, Microsoft Windows, Symbian, OS/2, и в некоторых других. Кроме объектного кода, может содержать различные метаданные (значок, цифровую подпись).
· A.out
a.out (от англ. assembler output) — формат запускаемых файлов в некоторых (старых) версиях UNIX. Формат исполняемого файла a.out преимущественно используется в Linux. Раcширенная версия этого формата a.outb используется группой BSD-совместимых операционных систем (NetBSD, FreeBSD и OpenBSD). Компилятор NASM может генерировать файлы обоих форматов, если указать ключ -f aout для Linux или -f aoutb для BSD. Компилятор GCC по умолчанию выдаёт файл a.out, если не используется опция -o.
· Executable and Linkable Format
ELF (англ. Executable and Linkable Format — формат исполняемых и компонуемых файлов) — формат файлов, используемый во многих UNIX-подобных операционных системах, например, в GNU/Linux и Solaris, а также, после некоторой модификации ПО, — в некоторых мобильных телефонах компаний Siemens, Sony Ericsson, Motorola (платформа P2K) и во многих цифровых фотовидеокамерах (Olympus, Rekam и проч.). Каждый файл формата ELF имеет специальный заголовок, в котором, в частности, указан адрес точки входа (стартовый адрес) программы. Поля этого заголовка использует загрузчик (ELF interpreter) для загрузки программы в оперативную память перед исполнением. Каждый ELF файл состоит из одного заголовка ELF, за которым следуют данные. Файлы могут включать в себя
o Таблицу Program Header, описывающую ноль или более сегментов
o Таблицу Section Header, описывающую ноль или более секций
o Данные, упомянутые в записях названных таблиц
Сегменты содержат данные, необходимые для исполнения файла, а секции содержат информацию для линковки и обработку relocation. Каждый байт в файле может относится не более чем к одной секции.
· MZ (формат)
MZ — стандартный формат 16-битных исполняемых файлов с расширением.EXE для DOS. Файлы.EXE и.DLL для Windows начинаются с заглушки в формате MZ, которая при попытке запустить файл в DOS выводит сообщение This program cannot be run in DOS mode. («Эту программу невозможно запустить в режиме DOS»).
· Portable Executable
Portable Executable — (PE) — формат исполняемых файлов, объектного кода и динамических библиотек, используемый в 32- и 64-битных версиях операционной системы Microsoft Windows. Формат PE представляет собой структуру данных, содержащую всю информацию, необходимую PE загрузчику для проецирования файла в память.
5. Из каких этапов состоит создание исполняемой программы из исходного кода? Опишите их суть. Для языков C++, Java и Python перечислите этапы создания программы, которые имеют место в реальности и укажите, в какое время они происходят. Для каких сред исполнения может создаваться программа?
Первый этап — который модифицирует исходный код программы перед компиляцией в соответствии с командами препроцессора, содержащимися в программе. В соответствии с этими командами выполняются простые подстановки текста. Второй — собственно компилятор, который обрабатывает исходный код и преобразует его в код на языке ассемблера. Третий этап — ассемблер, который генерирует объектный код. И, наконец, четвертый этап — компоновщик, который собирает исполняемый файл из файлов объектного кода.
Исходная программа, подготовленная на СИ в виде текстового файла, проходит 3 этапа обработки:
1) препроцессорное преобразование текста;
3) компоновка (редактирование связей или сборка).
Программы на Java транслируются в байт-код, выполняемый виртуальной машиной Java (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор. Трансляция в байтовый код увеличивает скорость выполнения и уменьшает размер Java программ.
Достоинство подобного способа выполнения программ — в полной независимости байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание.
Часто к недостаткам концепции виртуальной машины относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. Данное утверждение было справедливо для первых версий виртуальной машины Java, однако в последнее время оно практически потеряло актуальность. Этому способствовал ряд усовершенствований:
§ применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,
§ широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,
§ аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).
Источник: infopedia.su