Компилируйте и декомпилируйте, пусть говорит байт-код

Принцип составления

компилировать

Что такое компиляция?

Когда дело доходит до компиляции, мы должны упомянуть наш компьютерный язык. Компьютерный язык относится к языку, используемому для общения между людьми и компьютерами, и является средством передачи информации между людьми и компьютерами. Он включает в себя следующие три типа:

машинный язык:

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

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

Язык ассемблера :

Язык ассемблера — это начальная абстракция машинного языка, которая использует мнемонику для замены и представления некоторых конкретных низкоуровневых операций машинного языка. Среди них мнемоника — это символ, который удобно запомнить людям и который может описать функцию инструкции и операнд инструкции.Обычно он состоит из английских слов или сокращений, обозначающих функцию инструкции, например ADD для сложение, MOV для передачи и SUB для передачи, вычитание и т. д.

Язык ассемблера просто упрощает запоминание и использование пользователями, то есть программистами, и не распознается компьютером. Следовательно, чтобы компьютер мог выполнить ассемблерный код, необходимо сначала преобразовать ассемблерную программу в соответствующий код машинного языка. Этот процесс называется процессом сборки.

Языки высокого уровня:

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

Язык высокого уровня — это язык программирования, основанный на повседневном языке человека.Он представлен словами, которые легко воспринимаются обычными людьми (такими как китайские иероглифы, неправильный английский или другие иностранные языки), что упрощает программирование программ и имеет более высокий уровень производительности, читаемости.

Итак, как преобразовать язык высокого уровня, написанный программистом, в язык низкого уровня, понятный компьютеру, а затем позволить компьютеру выполнить их? Этот процесс преобразования является нашей компиляцией!

Как работает компиляция?

Возьмем в качестве примера язык Java.Как язык высокого уровня, Java необходимо преобразовать в машинный язык посредством компиляции, если он хочет выполняться. Это преобразование требует в общей сложности двух шагов:

  • Интерфейсный компилятор компилирует файлы Java в промежуточный код, а именно файлы .class, также известные как файлы байт-кода.
  • Бэкенд-компилятором файл байт-кода компилируется в машинный язык

Среди них внешние компиляторы — это в основном javac и т. д., а внутренние компиляторы в основном реализуются крупными виртуальными машинами, такими как JIT-компилятор в HotSpot.

декомпилировать

Что такое декомпиляция?

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

Хотя декомпиляция машинного языка непосредственно в исходный код является очень сложным процессом, это намного проще, если вы ориентируетесь на промежуточный код. Точно так же, хотя мы не можем декомпилировать машинный язык, скомпилированный виртуальной машиной, все же возможно декомпилировать файл .class, полученный javac.

И этот процесс преобразования файлов байт-кода в файлы Java мы часто называем декомпиляцией Java.

Как заставить байт-код говорить на человеческом языке?

Хе-хе, приходите с инструментом декомпилятора, и теперь .class будет говорить на Java. Например, у нас есть простая демонстрация:

package demo;

public class Demo {
    public static void main(String[] args) {
        Integer a = 1;
        System.out.println(a);
    }
}

использоватьjavacПосле его компиляции и получения соответствующего файла байт-кода наступает очередь наших часто используемых инструментов декомпиляции:

явап:

Инструмент декомпилятора, поставляемый с jdk, может декомпилировать код или просматривать байт-код, сгенерированный компилятором Java. Но следует отметить, что javap генерирует не файл .java, а файл байт-кода, понятный программистам.

Как правило, для декомпиляции используется -c, и результаты следующие:

Джад:

отздесьЗагрузите сжатый пакет соответствующей системы, добавьте распакованный файл jad в каталог bin jdk, введите jad и вытащите следующий файл справки, это означает, что его можно использовать.

Преимущество jad в том, что с ним легко работать, и он может напрямую декомпилировать файлы классов в файлы Java, что очень удобно для пользователя. Например, по сравнению с javap, при декомпиляции через него хорошо виден процесс упаковки из int в Integer, и этот процесс может помочь нам лучше понять некоторые промежуточные операции компилятора.

см.:

Хотя jad прост в использовании и удобен, жаль, что он давно не обновлялся. Иногда возникают неподдерживаемые проблемы при декомпиляции байт-кодов, сгенерированных Java7, и полный сбой при декомпиляции лямбда-выражений Java8 (это означает, что файлы .jad не создаются).

И в качестве альтернативы cfr был бы хорошим выбором. отздесьЗагрузите пакет jar соответствующей системы, и вы можете использовать его.При декомпиляции вам нужно поместить файл .class и пакет jar в одну директорию.

Его преимущество заключается в поддержке многих новых синтаксических функций Java, включая лямбда-выражения, и он все еще обновляется. Вообще говоря, при использовании его для декомпиляции необходимо принимать параметры.Информацию о конкретных параметрах можно найти в справочном документе:

Вообще говоря, функции довольно полные, но использование QAQ кажется слишком хлопотным.

Плагин cfr по идее:

Идея плагина cfr иногда творит чудеса!

Нет необходимости вручную компилировать и создавать файлы .class, напрямую выбирать файл .java, а затем щелкать правой кнопкой мыши, чтобы выбратьShow Bytecode outline, окончательный эффект декомпиляции выглядит следующим образом:

Как и cfr, он также поддерживает такой синтаксис, как лямбда, например:

Написано в последних сломанных мыслях

Изначально я собирался только компилировать и декомпилировать.Написав вчера,я вдруг почувствовал,что будет чуть меньше,если это единственное.Почему бы не добавить еще анализ байткода? Потом немного слизала и пошла обратно, думая написать сегодня остальное... В итоге сегодня писала и научилась писать все больше и больше! Слишком долго собирать вот так, черт возьми.

тогда! Часть байт-кода вынимается и помещается сюда:Анализ файловой структуры класса класса — понять язык байт-кода


Справочная статья:nuggets.capable/post/684490…