[itProger] Уроки Java с нуля #4 – Переменные в Джава. Типы данных
Байт-код Java: назначение, структура и использование
Источник: Nuances of Programming Введение Байт-код Java — это промежуточное представление Java-кода, которое выполняется виртуальной машиной Java (JVM). При компиляции Java-программы компилятор Java (javac) преобразует ее в байт-код, представляющий собой набор инструкций, которые JVM может понять и выполнить. Этот байт-код является платформонезависимым, то есть одна и та же Java-программа может выполняться на различных устройствах и в различных операционных системах, следуя принципу “пиши один раз, выполняй везде” (WORA)...
🖥Перестаём бояться генерировать байт-код Многие, возможно, думают, что работа с байт-кодом Java (будь то чтение или, тем более, генерация) — это какая-то особенная магия, доступная только продвинутым разработчикам с особенно крутым опытом. На самом деле, я считаю такую точку зрения ошибочной. JVM устроена гораздо проще, чем CPU; она оперирует такими высокоуровневыми понятиями как классы, интерфейсы, методы, а не просто лопатит байты в памяти. В отличие от CPU, который легко уронить криво сгенерированным машинным кодом, JVM заботливо отверифицирует любой байт-код и в общем не даст выстрелить в ногу. Но с чего начать погружение в байт-кодную магию? В сети есть некоторое количество туториалов по этому вопросу. Как мне кажется, они либо показывают слишком простые случаи, от которых непонятно, как перейти к чему-то более интересному, либо очень основательные и требуют вникать в теорию, собирать целиком картину в голове по кусочкам. Я хотел бы попробовать внести свой вклад в эту тему — надеюсь, у меня получится показать, как можно побороть первый страх и написать что-то похожее на реалистичный сценарий без особого вникания в теорию на первом этапе. Весь приведённый код доступен в репозитории. Задача Я вдохновился книгой Бьёрна Страуструпа, по которой лет 20 назад изучал C++. В одной из первых глав в качестве задачи для введения в язык предлагается написать калькулятор выражений. Я же предлагаю не вычислять выражения, а генерировать байт-код, который вычисляет выражения. Итак, формулировка: необходимо написать метод, которые принимает на вход строку с математическими выражениями и выдаёт на выходе экземпляр такого интерфейса: public interface Expression { double evaluate(Function<String, Double> inputs); } Выражения в списке разделены точкой с запятой (;), метод evaluate возвращает результат вычисления последнего из выражений. Выражения определим так: Число (например, 2, 42, 3.14) — это выражение. Идентификатор (например, foo, pi, myVar_1) — это выражение. Значение по-умолчанию для переменной вычисляется с помощью вызова inputs.apply(id). Если A и B — выражения, то A + B, A - B, A * B, A / B, -A, (A) — так же выражения Если A — это идентификатор, и B — это выражение, то A = B — так же выражение Генерируем класс Для начала напишем генератор класса, реализующего интерфейс Expression. ▪Читать дальше ▪Github @javarush