Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,095
1

Так зачем все-таки нужен байткод?

25.06.2020, 13:15. Показов 1953. Ответов 13
Метки нет (Все метки)

Перечитал много информации в интернете, но так и не понял зачем нужен байт код. В одной книге написали, что благодя байт-коду достигается платформо-независимость. Но каким образом? Ведь именно JVM и JIT(а не java compiler) переводит байт код в набор инструкций для определенной процессора.

Так же, большинство java компиляторов не делают никаких(или практически никаких) оптимизаций кода. В чем тогда смысл этого промежуточно шага? Почему просто тогда сразу не давать сорцы JIT и он их будет уже для целевой машины компилировать в машинный код?

Единственное что мне приходит в голову это то, что байт-код является своего рода индикацией что исходный код прошел компиляцию и клиенты, которыю запускают нашу программу, даже в теорию не смогут столкнуться с ошибками компиляции.

Добавлено через 4 минуты
А может быть байт-код это вообще легаси решение? Хотели сделать физические джава процессоры, но потом дело не пошло, а байт-код остался.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2020, 13:15
Ответы с готовыми решениями:

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять?
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в...

Зачем нужна конвертация чисел в текст (TO_CHAR) и текст в число (TO_NUMBER). Так же зачем нужен оператор NULLIF?
Описывают как очень удобные функции, только я как видел то что было число 193, так оно и осталось...

Так чем всё-таки отличается класс от конструктора?
Доброго. На курсах Codecademy класс фактически приравнивают к конструктору: и далее постоянно...

Так какие-же все таки характеристики у Электроника 90АС-001?
Здраствуйте.Подскажите знающие люди. Имеються колонки Электроника 90АС-001,но тут нашел информацию...

13
Эксперт Java
3294 / 2356 / 425
Регистрация: 28.04.2012
Сообщений: 7,863
25.06.2020, 13:51 2
Artmal, в википедии всё ж написано. И ссылки на литературу есть. 21-й век не первый год уже.
1
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,095
26.06.2020, 14:50  [ТС] 3
korvin_, читайте дальше названия топика. Я написал какие моменты мне понятны, а какие непонятны. Если нечего ответить, зачем вообще писать?

Добавлено через 3 минуты
Нашел тут:
Byte code, also known as p-code (portable code), is a form of instruction set designed for efficient execution by a software interpreter. Unlike human-readable source code, byte codes are compact numeric codes, constants, and references (normally numeric addresses) which encode the result of parsing and semantic analysis of things like type, scope, and nesting depths of program objects. They therefore allow much better performance than direct interpretation of source code.
0
2051 / 1526 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
26.06.2020, 14:58 4
Artmal, Байткод это промежуточное представление используемое компилятором. Т.е. выхлоп парсера и вход кодогенератора. И нужен он в первую очередь для того чтобы отделить кодогенератор от парсера - т.е. упростить задачу разработки компиляторов c n языков для m платформ с n * m до n парсеров + m кодогенераторов. Как минимум с 70-х все компиляторы всех языков компилят только через тот или иной вид байткода. Разница только в том когда он докомпилируется в машкод. У явы в процессе выполнения, у плюсов обычно в процессе компиляции.
2
Эксперт Java
3294 / 2356 / 425
Регистрация: 28.04.2012
Сообщений: 7,863
26.06.2020, 19:38 5
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Т.е. выхлоп парсера и вход кодогенератора.
Ну, не совсем; выход парсера — AST и его ещё нужно преобразовать в инструкции виртуальной машины.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
У явы в процессе выполнения
Есть и AOT-компиляторы, например в GraalVM, хоть он пока и эксперимент, но была (а может ещё и есть) какая-то реализация JVM с AOT-компиляцией, не помню названия.
0
2051 / 1526 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
26.06.2020, 20:09 6
Цитата Сообщение от korvin_ Посмотреть сообщение
Ну, не совсем; выход парсера — AST и его ещё нужно преобразовать в инструкции виртуальной машины.
НУ это если строго говоря и разделяя понятия парсер ака синтаксический анализатор и следующий шаг семантический анализатор. Ну а если так на пальцах - то стык между тем что распознает сам язык и тем что генерит машкод. При этом форматы хранения самого АСГ могут быть разными. Парсер способен генерить узлы дерева и в порядке их выполнения, в таком случае при табличном хранении уже имеем сразу байткод. Вернее тупо берем id которыми закодировали операции в дереве - вот он и формат байткода. Отсюда он собственно говоря и родился. Все зависит от используемой грамматики и механизма построения дерева.
Цитата Сообщение от korvin_ Посмотреть сообщение
Есть и AOT-компиляторы, например в GraalVM, хоть он пока и эксперимент, но была (а может ещё и есть) какая-то реализация JVM с AOT-компиляцией, не помню названия.
Ну это по сути один из вариантов реализации варианта "при компиляции". Точно так же как и вариант "при развертывании на целевой системе".
При этом особого профиту по сравнению с докомпиляцией сразу они не дадут но огромнейший минус присущий JIT поимеют - енд-юзеру нужен будет оный AOT в отличии от компиляции сразу. Вопрос зоопарка таргетов при этом элементарно решабелен за счет компиляции разрабами на все поддерживаемые таргеты сразу, и скачивание бинарника под требуемый, что сэкономит просто гигантское количество машинного времени и как результат люстричества в общем. Именно поэтому АОТ и не перспективен, хотя проблем с оптимизацией присущих JIT и не имеет. Ну и вообще как во всю молятся мелкомягкие евангелисты - JIT потому не AOT что типа ускоряет запуск приложений.

Добавлено через 5 минут
korvin_, При этом когда технологии виртуализации подрастут до того что браузер будет каждую вкладку запускать не просто в отдельном процессе, а сам этот отдельный процесс в гостевой оси, этот AOT или "при развертывании" может быть весьма полезен для поимения нативного клиентского кода во фронтенде.
0
Эксперт Java
3294 / 2356 / 425
Регистрация: 28.04.2012
Сообщений: 7,863
26.06.2020, 20:34 7
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Вопрос зоопарка таргетов при этом элементарно решабелен за счет компиляции разрабами на все поддерживаемые таргеты сразу, и скачивание бинарника под требуемый, что сэкономит просто гигантское количество машинного времени и как результат люстричества в общем. Именно поэтому АОТ и не перспективен, хотя проблем с оптимизацией присущих JIT и не имеет. Ну и вообще как во всю молятся мелкомягкие евангелисты - JIT потому не AOT что типа ускоряет запуск приложений.
В смысле? AOT — это и есть компиляция сразу, как в C++. Только не из AST, а из байт-кода.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
хотя проблем с оптимизацией присущих JIT и не имеет
Зато имеет свои: у JIT больше информации о реальных потоках данных приложения и исполняемой среде, в отличие от.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
При этом когда технологии виртуализации подрастут до того что браузер будет каждую вкладку запускать не просто в отдельном процессе, а сам этот отдельный процесс в гостевой оси
Запускать по ОС на вкладку браузера? Да вы там совсем рехнулись? Они (браузеры) и так жрут как не в себя, а тут ещё и полноценная ОС. Не, ну Inferno, например, весьма легковесная, но она всё же работает как процесс в хостовой ОС, тут бы и изолированного пространства имён процесса достаточно было б, а ля Plan 9, но всем же насрать, велосипедят костыли ради обратной совместимости.
0
2051 / 1526 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
26.06.2020, 20:38 8
Цитата Сообщение от korvin_ Посмотреть сообщение
AOT — это и есть компиляция сразу, как в C++.
Ahead-of-Time (AOT) - докомпиляция непосредственно перед исполнением. Т.е. при запуске софтинки энд-юзверем на целевой машине. Только всей сразу а не по частям в процессе аки JIT.
0
Эксперт Java
3294 / 2356 / 425
Регистрация: 28.04.2012
Сообщений: 7,863
26.06.2020, 20:43 9
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ahead-of-Time (AOT) - докомпиляция непосредственно перед исполнением. Т.е. при запуске софтинки энд-юзверем на целевой машине. Только всей сразу а не по частям в процессе аки JIT.
In computer science, ahead-of-time compilation (AOT compilation) is the act of compiling a higher-level programming language such as C or C++, or an intermediate representation such as Java bytecode or .NET Framework Common Intermediate Language (CIL) code, into a native (system-dependent) machine code so that the resulting binary file can execute natively.
https://en.wikipedia.org/wiki/... ompilation
0
2051 / 1526 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
26.06.2020, 20:46 10
Цитата Сообщение от korvin_ Посмотреть сообщение
Только не из AST, а из байт-кода.
Можно и ASG хранимый в виде связанного указателями массива узлов исполнять, а можно и в табличном виде хранить. И это по сути ничто иное как байткод. т.е. абстрактное синтаксическое дерево можно хранить и даже генерировать парсером сразу в виде массива пар ID команды-операнд, что и стало в конечном итоге называться байткодом.

Добавлено через 3 минуты
Цитата Сообщение от korvin_ Посмотреть сообщение
https://ru.wikipedia.org/wiki/AOT-компиляция
И кто из них врет непонятно. В любом случае до исполнения - это три варианта - сразу как кнопку компилить нажал на машине разраба, на целевой машине при развертывании, и опять же на целевой машине при запуске. Вторые два в принципе могут быть полезны при сверхбольшом зоопарке таргетов имеющих стандартизированное апи. А чисто технически между ними большой разницы нет.
0
Эксперт Java
3294 / 2356 / 425
Регистрация: 28.04.2012
Сообщений: 7,863
26.06.2020, 20:48 11
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
ASG
G? Graph?
Но
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
абстрактное синтаксическое дерево
Ты уж определись.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Можно и ASG хранимый в виде связанного указателями массива узлов исполнять, а можно и в табличном виде хранить. И это по сути ничто иное как байткод. т.е. абстрактное синтаксическое дерево можно хранить и даже генерировать парсером сразу в виде массива пар ID команды-операнд, что и стало в конечном итоге называться байткодом.
Нельзя, дерево — оно не зря называется деревом. И не зря синтаксическим. Никакой прямой двусторонней связи между AST и байт-кодом нет. Или по-твоему AST С++ — то же самое, что и ассемблер?
0
2051 / 1526 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
26.06.2020, 21:01 12
Цитата Сообщение от korvin_ Посмотреть сообщение
Ты уж определись.
Граф это то же дерево только со связанными идентификаторами - т.е. результат семантического анализу.
Цитата Сообщение от korvin_ Посмотреть сообщение
Нельзя, дерево — оно не зря называется деревом. И не зря синтаксическим.
Еще раз - парсер генерить узлы в порядке обхода может? Может.
Хранить дерево в виде таблицы пар ID команды операнд можно? Можно.
Вот вам и байт код.
Цитата Сообщение от korvin_ Посмотреть сообщение
Никакой прямой двусторонней связи между AST и байт-кодом нет.
Вернее вы хотели сказать что никакой двусторонней связи между AST и исходным кодом нет.
Цитата Сообщение от korvin_ Посмотреть сообщение
Или по-твоему AST С++ — то же самое, что и ассемблер?
Ну вы в курсе что грамматика плюсов распазнает опраторы сразу в порядке приоритетов?
Т.е. связь с исходным кодом теряется и преобразование в асмовский порядок вычисления производится еще при парсинге.
0
Эксперт Java
3294 / 2356 / 425
Регистрация: 28.04.2012
Сообщений: 7,863
26.06.2020, 21:08 13
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Граф это то же дерево только со связанными идентификаторами - т.е. результат семантического анализу.
Но не каждое дерево — граф.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Вот вам и байт код.
Нет.

Напиши байт-код стековой VM для дерева (* (+ a b) (- c d)). А потом байт-код для регистровой VM.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Вернее вы хотели сказать что никакой двусторонней связи между AST и исходным кодом нет.
Нет, не хотел.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Т.е. связь с исходным кодом теряется и преобразование в асмовский порядок вычисления производится еще при парсинге.
Я не про исходный код писал, а про AST.
0
2051 / 1526 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
26.06.2020, 22:30 14
Цитата Сообщение от korvin_ Посмотреть сообщение
Но не каждое дерево — граф.
Вернее вы хотели сказать не каждый граф дерево. Да действительно после связывания идентификаторов граф перестает быть деревом - его цикломатическое число становится больше 0.
Цитата Сообщение от korvin_ Посмотреть сообщение
Напиши байт-код стековой VM для дерева (* (+ a b) (- c d)). А потом байт-код для регистровой VM.
для регистровой
%acc = add %a, %b
%tmp1 = sub %c, %d
%acc = mul %acc, %tmp
для стековой что то в духе
push a
push b
add

push c
push d
sub

mul
т.е. принципиально они абсолютно ничем не отличаются. Мало того - операции добавляются строго в порядке акцепта парсером нетерминалов. Т.е. это просто разные форматы сохранения выхлопа парсера и не более того.

Цитата Сообщение от korvin_ Посмотреть сообщение
Нет, не хотел.
А зря. Ее действительно как таковой нет. Приоритет операций встроен в грамматику и парсер акцептирует нетерминалы операций сразу в порядке приоритетов.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2020, 22:30

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Так какая ОЗУ всё таки нужна для этой материнки
Добрый день. Заказал материнку...

Так что же все таки выбрать - ASP, JSP, Java, PHP, Perl или ColdFusion?
Смотрю я на тему 'JSP против ASP' (http://relib.com/forums/topic.asp?id=728381) и душа не...

Так почему же. всё таки, "деструкторы" не используются с GC
"Деструкторы" я специально взял в кавычки, т.к. в случае с использованием GC они не должны...

Так куда все таки внедрять EF DbContex (или репозитории)? в контроллеры или в модели представления?
Всем привет! Прочитал кучу информации о подходе MVС в разработке пользовательских приложений и так...

Зачем нужен h-файл? Почему нельзя все хранить в cpp?
Помогите новичку! С с++ работаю впервые. Перешел с явы, делфи, рнр. Не понимаю что такое h-файл и...

Зачем python нужен? Работу всё-равно не найти: вот некоторый обзор требований
Ищем Python программиста в связи с расширением штата разработчиков. Проект связан с автоматизацией...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.