Почему файл.class не читается человеком?

Когда файл Java компилируется, он генерирует файл.class. Теперь этот файл.class имеет байт-код, который интерпретирует JVM. когда мы открываем файл.class в текстовом редакторе, он не читается человеком. Теперь для просмотра байт-кода можно использовать дизассемблер, такой как javap.

Мой вопрос: зачем нам разбирать байт-код, чтобы просмотреть сам байт-код?

Что на самом деле делает дизассемблер, чтобы преобразовать файл.class в читаемый человеком формат?

5 ответов

Решение

Виртуальная машина Java имитирует машину. Вот почему он называется машиной, несмотря на то, что он виртуальный, который не существует в аппаратном обеспечении. Таким образом, думая о разнице между Javap Outout и фактическим байтовым кодом Java, подумайте о разнице между сборкой и машинным кодом:

Ассемблерный код использует так называемую мнемонику, чтобы сделать код читабельным. Такие мнемонические имена, однако, ничего не могут связать с машиной, потому что машина знает только, как читать и манипулировать двоичными данными. Таким образом, мы должны собрать мнемонику (и ее потенциальные аргументы), используя ассемблер, где каждая такая мнемоника переводится в ее двоичный эквивалент. Например, для загрузки значения из определенного регистра мы напишем что-то вроде load 0xFF в сборке вместо использования фактического двоичного кода операции для этой инструкции, которая может быть что-то вроде 1001 1011 1111 1111, Точно так же с Java-байтовым кодом, мнемоникой которого является то, что производит javap, нам нужно представить двоичные данные (виртуальной) машине, которую она затем сможет обработать. Только если мы хотим прочитать байт-код, мы скорее разберем его в код ассемблера, который представляет javap.

Помните: единственная причина, по которой существует язык ассемблера и вывод javap, заключается в том, что такие люди, как вы и я, не любят читать двоичный код. Мы обучены различать то, что мы видим по формам, например, по буквам и именам. Напротив, машина интерпретирует данные последовательно, читая поток битов. Как уже упоминалось, эти биты нам трудно прочитать, поэтому мы скорее представляем их в шестнадцатеричном формате: вместо 1111 1111 мы скорее пишем 0xFF, Но это все еще довольно трудно читать, поскольку такое числовое значение не раскрывает его контекстуального значения. 0xFF все еще может значить обо всем. Вот почему мы скорее используем упомянутую мнемонику, где это значение неявно.

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

Когда дело доходит до сохранения данных, доступные форматы делятся на две большие категории:

  • Текстовые форматы (такие как простые текстовые файлы, файлы исходного кода, XML и т. Д.), Которые имеют преимущества, заключающиеся в том, что они читаются человеком и редактируются с помощью простых инструментов, но их можно анализировать только в сложных программах (чем сложнее язык, тем больше Сложная программа должна быть на самом деле, чтобы понять это).
  • Двоичные форматы (такие как большинство графических форматов, звуковые сигналы, исполняемые файлы, файлы байт-кода), которые имеют преимущества в том, что они имеют меньший размер для того же объема информации, и им не требуется сложный синтаксический анализатор для понимания машиной (часто данные хранятся в виде фрагментов фиксированного размера, что упрощает их анализ).

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

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

Файл класса содержит набор команд / опкодов / данных, предназначенных для чтения JVM, которые при просмотре людьми представляют собой просто огромную группу чисел и встроенный бессмысленный текст.

Причина, по которой вам нужно разобрать, чтобы прочитать это, заключается в том, что дизассемблер организует его так, чтобы это имело смысл для людей, и подставляет числа для их текстовых команд (например, текстовые версии кодов операций, такие как aload вместо \19 или же goto вместо \A7), которые имеют больше смысла для людей.

Компилятор java интерпретирует синтаксис Java и преобразует его в операторы, понятные виртуальной машине. Эта виртуальная машина написана в сочетании C и Java. Виртуальная машина преобразует инструкции байт-кода в собственные вызовы для вашей операционной системы. (именно поэтому JVM для Windows отличается от системы на основе Unix)

Как уже говорилось в комментарии, интерпретация читаемого человеком кода медленнее, чем интерпретация инструкций, которые уже частично являются родными.

Другие вопросы по тегам