Как объяснить, что такое байткод?

295
19 декабря 2016, 19:56

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

Answer 1

А нужно объяснять очень просто. Используя их положение. Для начала показываем этим инженерам программу на Java. Например, классический HelloWorld. И спрашиваем - понятно ли? Скорее всего они скажут нет. Объясняем, что и специальной программе, которая исполняет жава код, тоже не понятно. Для этого нужно "разобрать по косточкам".

Теперь делаем "псевдотрасляцию" - как для машинистки (секретарши). Для HelloWorld'а она будет такая.

  • настроить окружение (в коде этого нет, но это автоматом) - приготовить бумагу, проверить катриджи.
  • взять из памяти строку "привет мир".
  • нижимая кнопки, побуквенно ввести сроку (здесь появился цикл:) ).
  • почистить все за собой и отнести бумагу заказчику.

Формально - это и есть простой байткод. Только это человеческий байткод. А если в нем стандартизировать все операции и занумеровать, то все может быть сведено к набору чисел. Теперь к реальному байткоду перейти просто.

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

Answer 2

@vanyamelikov по-моему вы сами не понимаете что такое байткод Java :)

Байткод Java это машинные инструкции для несуществующей Java машины, которую часто называют Java Virtual Machine.

В чем сила брат? А сила брат в том, что вы пишете для некоей Java машины (когда-нибудь кто-нибудь сделает таки физическую Java машину). Что такое портабельность Java кода: это всего лишь вопрос реализации Java машины на какой-то реальной машине ну и т.д.

Answer 3

Я бы попытался объяснить как-то так:

Компьютеры "думают" простейшими инструкциями, и когда вы пишете программу допустим на С то она преобразуется в набор примитивных машинных инструкций. Например было выражение на языке программирования

a = 42 * spam

Оно грубо говоря преобразуется в последовательность инструкций

достать значение из spam
умножить его с 42
положить результат в a

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

Поэтому придумали прослойку над этими самыми машинными инструкциями - байт код. Ваш код написанный на таких языках как например java и python преобразуется сначала в него а потом уже в машинные инструкции. Зачем это нужно? Один и тот же байт код будет одинакого работать на разных компьютерах. Грубо говоря байт код это "обвёртка" над машинными инструкциями, повышающая переносимость программ.

Буду рад услашать критику по поводу подобного объяснения^_^

Answer 4

Я так понимаю, вопрос в том, как объяснить, что такое байт-код, не прибегая к объяснению остального контекста. Мне кажется, что не получится объяснить, что такое байт-код, не объяснив, что такое машинный язык и язык программирования, потому что он ведь не сам по себе, он прослойка между ними — т.е. чтобы понять, что делает прослойка, нужно понять, между чем она лежит.

Answer 5

Байткод это система команд некоего процессора. Они знают, что у каждого процессора есть система команд? Программу на ассемблере для х86 видели? Если нет, то покажите. Затем, программу в любой системе команд можно исполнить аппаратно, можно программно (интерпретатором), а можно перевести в другую систему команд, и далее исполнить аппаратно, программно, или ... Так сложилось, что java-байткод интерпретируют или переводят, а х86 исполняют аппаратно. Но причины здесь экономические, а не принципиальные. Java-процессоры существуют, но мало распространены. На других планетах, может быть, все наоборот.

Answer 6

Самый лучший способ практический:

  1. покажите основы программирования (примитивные типы, массивы, циклы, ввод/вывод)
  2. пусть каждый напишет эмулятор некоей (виртуальной) ЭВМ: у каждого студента своя система команд, можете дать некий очень краткий обзор классов архитектур: стековая машина, RISC c 8-16 регистрами, CISC а-ля Z80 (команды регистр-аккумулятор и память-аккумулятор), 3хадресная машина типа память-память-память; гарвард/фоннейман (1 или 2 массива под код/данные). Заодно покажете понятия машинного кода, кодирования кода/данных, организацию памяти, ввода/вывода -- это все тоже входит в базовую программу обучения на тех.специальностях. И все это наглядно, можно GUI прикрутить, и даже в минимальном консольном варианте студент может добавить лог выполнения любой команды, или изменения памяти.
  3. "А вот машинный код вашей виртуальной ЭВМ , который у вас хранится в массиве PROM -- и есть байт-код: все его отличие от машинного кода только то, что он выполняется не настоящим процессором, а вашей программой-интерпретатором. Ваша программа-интерпретатор -- виртуальная машина. Если вам интересно, в книге [DragonBook] вы можете найти алгоритмы и методы, как преобразовать ваш байт-код в настоящий машинный код и выполнить его на реальном процессоре -- этим занимается JIT-компилятор Java."
  4. Байт-код также является промежуточным представлением программы [DragonBook] -- между программой на ЯВУ и машинным кодом. Так как при разработке языка Java предполагалось что Java-программы должны исполняться на любом компьютере с заранее неизвестным типом процессора, вместо компиляции (в машинный код) был выбран формат распространения программ в виде файлов с байт-кодом. Формат этого байт-кода, система команд и организация памяти стандартизированы, и описаны в спецификации виртуальной машины JVM. Также были написаны реализации JVM для распространенных компьютеров, например для ПК, и мобильных телефонов -- это программы, которые делают то же что делали вы: интерпретируют байт-код, а некоторые реализации умеют его компилировать в ОЗУ прямо в процессе выполнения байт-кода (JIT), что сильно повышает скорость выполнения программы.
  5. Также было разработано несколько Java-процессоров, которые выполняют байт-код аппаратно, то есть для них он является машинным кодом. Но распространения они не получили, так как дешевле оказалось использовать широкораспространенные дешевые процессоры, JIT-компилятор и 100500 готовых библиотек (в т.ч. операционные системы), написанных на Си и Фортране.
  6. А теперь берем п.2, ставим ANTLR, и пишем компилятор простого языка программирования (и показываете как парсить текстовые данные -- для инженеров штука необходимая, можно ассемблер написать в качестве курсовой)
Answer 7

Зачем придумали байт-код? В начале были интерпретаторы которые просто выполняли код из текста, но так как эффективность в постоянном разборе строк не есть хорошо, придумали работать с байтами, а не как с исходным кодом строк, то есть программа преобразует исходный синтаксис ЯП-а в байт-код где есть инструкции и метки и т.п. почти как в ASM, отсюда и происходит название виртуальная машина, а не интерпретатор, к примеру в Java это JVM. Так что тут всё просто, виртуальная машина при загрузке байт-кода исполняет его. Но это ещё не всё, для большей производительности ввели JIT, то есть компиляции байт-кода в нативный код на ходу исполнения, тем самым не много получаем конкурентоспособность программ к компилируемым ЯП-ам.

READ ALSO
Односвязный список в список

Односвязный список в список

Всем приветОбъясните пожалуйста, как добавить один односвязный список в другой

350
Изъятия текста из диалогового окна (winApi)

Изъятия текста из диалогового окна (winApi)

Почему, когда я считываю текст из BoxEditor диалогового окна, или же вызываю диалог открытия/сохранения файла, то текст у меня сохраняется в элементы...

298
Потери данных при записи аудио потоков (Linux 64bit)

Потери данных при записи аудио потоков (Linux 64bit)

Уважаемые профи! Написал программу записи нескольких потоков аудио данных с АЦП(специальная плата PCI)Программа работает, но при прослушивании...

262
C++ сервер - клиент [закрыто]

C++ сервер - клиент [закрыто]

Подкиньте литературки по поводу общения клиент - сервер - клиентОтправка текстовой информации

278