Промежуточный код
Байт-код или байтко́д (англ. byte-code ), иногда также используется термин псевдоко́д — машинно-независимый код низкого уровня, генерируемый транслятором и исполняемый интерпретатором. Большинство инструкций байт-кода эквивалентны одной или нескольким командам ассемблера. Трансляция в байт-код занимает промежуточное положение между компиляцией в машинный код и интерпретацией.
Байт-код называется так, потому что длина каждого кода операции — один байт, но длина кода команды различна. Каждая инструкция представляет собой однобайтовый код операции от 0 до 255, за которым следуют такие параметры, как регистры или адреса памяти. Это в типичном случае, но спецификация байт-кода значительно различается в языке.
Программа на байт-коде обычно выполняется интерпретатором байт-кода (обычно он называется виртуальной машиной, поскольку подобен компьютеру). Преимущество — в портируемости, т. е. один и тот же байт-код может исполняться на разных платформах и архитектурах. То же самое преимущество дают интерпретируемые языки. Однако, поскольку байт-код обычно менее абстрактный, более компактный и более «компьютерный», чем исходный код, эффективность байт-кода обычно выше, чем чистая интерпретация исходного кода, предназначенного для правки человеком. По этой причине многие современные интерпретируемые языки на самом деле транслируют в байт-код и запускают интерпретатор байт-кода. К таким языкам относятся PHP и JIT-компиляции. В стандарте открытых загрузчиков Open Firmware фирмы Sun Microsystems байт код представляет операторы языка Forth.
В то же время возможно создание процессоров, для которых данный байт-код является непосредственно машинным кодом (такие процессоры существуют, например, для Forth).
Также некоторый интерес представляет p-код (p-code), который похож на байт-код, но физически может быть менее лаконичным и сильно варьироваться по длине инструкции. Он работает на очень высоком уровне, например «напечатать строку» или «очистить экран». P-код повсеместно используется в СУБД и некоторых реализациях Паскаля.
Языки и среды программирования, использующие байткод
- Байткод виртуальной машиной Java (англ.Java Virtual Machine ).
- Lua
- Parrot
- Платформа Microsoft .NET использует Intermediate Language (IL), исполняемый с помощью Common Language Runtime (CLR). См. Управляемый код.
- Forth
Wikimedia Foundation . 2010 .
- Промежуточный заряд
- Промежуточный нейрон
Разница между байткодом и двоичным кодом

Не каждая платформа для разработки программного обеспечения производит исполняемый машинный код, который запускается непосредственно на процессоре. Те платформы, которые не производят исполняемый машинный код, генерируют некое промежуточное представление программы, или байткод. Этот байткод затем считывается специальной программой на машине пользователя, которая выполняет программу на локальном процессоре. Эта программа называется виртуальной машиной. Двоичный код полностью отличается от байт-кода и является непосредственно машинно-понятным. Однако за последние несколько лет разница между байт-кодом и двоичным кодом несколько размылась.
А какой вариант выбираете вы?

Разбираемся в отличиях
Проголосовать
Проголосовать
Что такое байткод?
Байткод — это промежуточный код между исходным кодом и двоичным кодом, скомпилированный для запуска на виртуальной машине (VM) вместо центрального процессора (CPU). По сути, это код низкого уровня, который подобен языку ассемблера аппаратного процессора (например, языку ассемблера IA-32). Самое интересное в виртуальных машинах то, что они почти всегда имеют свой собственный формат байткода. Разница заключается в том, как выполняется такой двоичный код.
Bytcode — это высоко оптимизированный набор инструкций, предназначенный для эффективного выполнения программным интерпретатором. В реальном мире ни один аппаратный процессор не выполняет эти инструкции. Байткоды обычно распространяются в однофайловом пакете, который может потребоваться распаковать, чтобы получить отдельные файлы байткодов для декомпиляции в исходный код. Байткоды — это компактные цифровые коды, константы, шестнадцатеричные и числовые адреса.
Что такое двоичный код?
Двоичный код представляет собой букву, цифру или другой символ в компьютере. По сути, это система кодирования, которую большинство компьютеров и компьютеризированных устройств используют для отправки, получения и хранения информации. Двоичный код представляет собой схему нумерации, в которой используются только два значения: 0 и 1. Она представляет собой инструкции компьютерного процессора или любые другие данные, в которых используются только эти два значения. Это наиболее упрощенная форма данных, полностью представленная двоичной системой цифр, состоящей из последовательных 0 и 1.
Машинный код использует наборы двоичных цифр для создания инструкций. Двоичный код также используется для представления наименьшего количества данных, проходящих через почти все сложные программные и аппаратные системы, которые используются для обработки большинства современных информационных ресурсов и активов. Фактически, природа двоичного кода и данных играет важную роль в фундаментальном мире информационных технологий. Большинство современных компьютеров используют двоичное кодирование для инструкций и данных.

Разница между байткодом и двоичным кодом
Основы
В отличие от обычных двоичных программ, в которых каждая инструкция декодируется и выполняется аппаратным обеспечением, виртуальные машины выполняют собственное декодирование двоичных файлов программ. Двоичный код, как следует из названия, имеет двоичный формат (0 и 1), что полностью отличается от байткода, который рассматривается как код промежуточного уровня, скомпилированный для выполнения на виртуальной машине вместо процессора. Он был скомпилирован из исходного кода в низкоуровневый код, предназначенный для программного интерпретатора.
Формат
Байткоды — это компактные цифровые коды, константы, шестнадцатеричные и числовые адреса. Это промежуточный код между исходным кодом и двоичным кодом, скомпилированным для запуска на виртуальной машине (VM) вместо центрального процессора (CPU). Двоичный код — это наиболее упрощенная форма данных, полностью представленная двоичной системой цифр, состоящей из последовательных 0 и 1. Двоичный код считается низкоуровневым кодом.
Платформенная зависимость
Байтовый код является платформонезависимым, потому что он компилируется для запуска на виртуальной машине, а система с виртуальной машиной может выполняться независимо от платформы. Бинарный код, напротив, является платформозависимым, поскольку объектный код одной платформы не может быть запущен на одной и той же ОС. Разные виртуальные машины предназначены для разных ОС, а байткод может выполняться на разных ОС. Байткод запускается только тогда, когда доступен интерпретатор.
Вывод
Bytecode — это высоко оптимизированный набор инструкций, предназначенный для эффективного выполнения программным интерпретатором. В реальном мире ни один аппаратный процессор не выполняет эти инструкции. Двоичный код представляет собой инструкции компьютерного процессора или любые другие данные, которые используют только эти два значения. Машинный код использует наборы двоичных цифр для создания инструкций. Машинный код состоит из инструкций из набора команд процессора, который является встроенным набором команд компьютера. Скомпилированная программа, состоящая из машинного кода, называется бинарным кодом.
Часто задаваемые вопросы
Что такое байткод?
Популярным примером байткода является байткод Jaagainst, который компилируется из исходного кода Jaagainst и может быть запущен на виртуальной машине Jaagainst (JVM).
В чем разница между байткодом и объектным кодом?
Байткод — это искусственный машинный код для виртуальной машины (VM), такой как Jaagainst Virtual Machine (JVM), в то время как объектный код — это код, создаваемый компилятором или ассемблером.
Почему он называется байткодом?
Название ‘байткод’ происходит от наборов инструкций, в которых за однобайтовыми опкодами следуют необязательные параметры.
Что такое байткод и чем он отличается от машинного кода?
Байткод Jaagainst — это набор инструкций для виртуальной машины Jaagainst (JVM). Это код промежуточного уровня между исходным кодом и машинным кодом, выполняемым виртуальной машиной. Машинный код, с другой стороны, это код низкого уровня, который может быть непосредственно понят компьютером.
Как называется промежуточный исполняемый код который выполняется виртуальной машиной



Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2023. Stepik
Наши условия использования и конфиденциальности

Public user contributions licensed under cc-wiki license with attribution required
Основные конструкции языков Java и C#
Аннотация: Рассматриваются базовые элементы технологий Java и .NET и основные конструкции языков Java и С#. Рассказывается о лексике, базовых типах, выражениях и инструкциях обоих языков, а также о правилах описания пользовательских типов.
Платформы Java и .NET
На данный момент наиболее активно развиваются две конкурирующие линии технологий создания ПО на основе компонентов — технологии Java и .NET . В этой и следующих лекциях мы рассмотрим несколько элементов этих технологий, являющихся ключевыми в создании широко востребованного в настоящее время и достаточно сложного вида приложений. Это Web -приложения, т.е. распределенное программное обеспечение , использующее базовую инфраструктуру Интернета для связи между различными своими компонентами, а стандартные инструменты для навигации по Web — браузеры — как основу для своего пользовательского интерфейса .
Технологии Java представляют собой набор стандартов, инструментов и библиотек, предназначенных для разработки приложений разных типов и связанных друг с другом использованием языка программирования Java . Торговая марка Java принадлежит компании Sun Microsystems, и эта компания во многом определяет развитие технологий Java , но в нем активно участвуют и другие игроки — IBM , Intel, Oracle , Hewlett-Packard, SAP , Bea и пр.
В этот набор входят следующие основные элементы:
- Платформа Java Platform Standard Edition (J2SE ) [1]. Предназначена для разработки обычных, в основном, однопользовательских приложений.
C некоторыми оговорками можно считать, что J2ME является подмножеством J2SE , а та, в свою очередь , подмножеством J2EE . Java Card представляет собой, по существу, особый набор средств разработки, связанный с остальными платформами только поддержкой (в сильно урезанном виде) языка Java .
Язык Java — это объектно-ориентированный язык программирования , который транслируется не непосредственно в машинно-зависимый код, а в так называемый байт-код, исполняемый специальным интерпретатором, виртуальной Java — машиной ( Java Virtual Machine, JVM). Такая организация работы Java -программ позволяет им быть переносимыми без изменений и одинаково работать на разных платформах, если на этих платформах есть реализация JVM , соответствующая опубликованным спецификациям виртуальной машины.
Кроме того, интерпретация кода позволяет реализовывать различные политики безопасности для одних и тех же приложений, выполняемых в разных средах, — к каким ресурсам (файлам, устройствам и пр.) приложение может иметь доступ , а к каким нет, можно определять при запуске виртуальной машины. Таким способом можно обеспечить запускаемое пользователем вручную приложение (за вред, причиненный которым, будет отвечать этот пользователь ) большими правами, чем аплет , загруженный автоматически с какого-то сайта в Интернете.
Режим интерпретации приводит обычно к более низкой производительности программ по сравнению с программами, оттранслированными в машинно-специфический код. Для преодоления этой проблемы JVM может работать в режиме динамической компиляции (just-in-time-compilation, JIT), в котором байт-код на лету компилируется в машинно-зависимый, а часто исполняемые участки кода подвергаются дополнительной оптимизации.
В настоящем курсе мы рассмотрим ряд элементов платформ J2EE и J2SE , имеющих большое значение для разработки Web -приложений. Читателей, интересующихся деталями устройства и использования J2ME и Java Card, мы отсылаем к документации по этим платформам ([3] и [4]).
.NET [5] представляет собой похожий набор стандартов, инструментов и библиотек, но разработка приложений в рамках .NET возможна с использованием различных языков программирования. Основой .NET являются виртуальная машина для промежуточного языка ( Intermediate Language, IL, иногда встречается сокращение MSIL , Microsoft IL), в который транслируются все .NET программы, также называемая общей средой выполнения (Common Language Runtime, CLR), и общая библиотека классов ( .NET Framework class library ), доступная из всех .NET приложений.
Промежуточный язык является полноценным языком программирования, но он не предназначен для использования людьми. Разработка в рамках .NET ведется на одном из языков, для которых имеется транслятор в промежуточный язык — Visual Basic . NET , С++, C# , Java ( транслятор Java в .NET называется J#, и он не обеспечивает одинаковой работы программ на Java , оттранслированных в .NET и выполняемых на JVM ) и пр. Однако разные языки достаточно сильно отличаются друг от друга, и чтобы гарантировать возможность из одного языка работать с компонентами, написанными на другом языке, необходимо при разработке этих компонентов придерживаться общих правил (Common Language Specifications, CLS), определяющих, какими конструкциями можно пользоваться во всех .NET языках без потери возможности взаимодействия между результатами. Наиболее близок к промежуточному языку C# — этот язык был специально разработан вместе с платформой .NET .
Некоторым отличием от Java является то, что код на промежуточном языке в .NET не интерпретируется, а всегда выполняется в режиме динамической компиляции ( JIT ).
Компания Microsoft инициировала разработку платформы .NET и принятие стандартов, описывающих ее отдельные элементы (к сожалению, пока не все), и она же является основным поставщиком реализаций этой платформы и инструментов разработки. Благодаря наличию стандартов возможна независимая реализация .NET (например, такая реализация разработана в рамках проекта Mono [6]), но, в силу молодости платформы и опасений по поводу монопольного влияния Microsoft на ее дальнейшее развитие, реализации .NET не от Microsoft используются достаточно редко.
Прежде чем перейти к более детальному рассмотрению компонентных технологий Java и .NET , ознакомимся с языками, на которых создаются компоненты в их рамках.
Для Java -технологий базовым языком является Java , а при изучении правил построения компонентов для .NET мы будем использовать язык C# . Он наиболее удобен при работе в этой среде и наиболее похож на Java .
Оба этих языка сейчас активно развиваются — в сентябре 2004 года вышла версия 1.5, она же была объявлена версией 5 платформы J2SE и языка Java . При переходе между версиями 1.4 и 1.5 Java претерпела наиболее серьезные изменения за всю свою историю (достаточно полное описание этих изменений стало доступно только в середине 2005 года). Во время написания данной лекции готовится выход J2EE 1.5, пока доступной только в виде предварительных спецификаций.
Существенное обновление C# также должно произойти в версии 2.0, выходящей в ноябре 2005 года. Поэтому мы сопоставляем характеристики уже имеющейся на момент написания версии Java 5 с готовящейся к выходу версией C# 2.0. Это представляется обоснованным еще и потому, что эти версии двух языков достаточно близки по набору поддерживаемых ими конструкций.
Данная лекция дает лишь базовую информацию о языках Java и C# , которая достаточна для понимания приводимого далее кода компонентов и общих правил, регламентирующих их разработку, и может служить основой для дальнейшего их изучения. Оба языка достаточно сложны, и всем их деталям просто невозможно уделить внимание в рамках двух лекций. Для более глубокого изучения этих языков (особенно необходимого при разработке инструментов для работы с ними) рекомендуется обратиться к соответствующим стандартам [7] и [8] (ссылки приведены на последние версии стандартов на момент написания этой лекции, кроме того, некоторые элементы C# 2.0 не вошли в [8], они описываются согласно [9]).
Оба языка имеют мощные выразительные возможности объектно-ориентированных языков последнего поколения, поддерживающих автоматическое управление памятью и работу в многопоточном режиме. Они весьма похожи, но имеют большое число мелких отличий в деталях. Наиболее существенны для построения программ различия, касающиеся наличия в C# невиртуальных методов, возможности объявления и использования пользовательских типов значений и делегатных типов в C# и возможности передачи значений параметров в C# по ссылке. Обсуждение и одновременно сравнение характеристик языков мы будем проводить по следующему плану:
- Лексика.
- Общая структура программ.
- Базовые типы и операции над ними.
- Инструкции и выражения .
- Пользовательские типы.
- Средства создания многопоточных программ.
Общие черты Java и C# описываются далее обычным текстом, а особенности — в колонках.
В левой колонке будут описываться особенности Java . В правой колонке будут описываться особенности C# .
