[Перевод] Стиверу, с благодарностью от Java

94420352163207c16c80302a70aedd3f.png

20 октября после продолжительной борьбы с глиобластомой скончался первоначальный автор декомпилятора Java Fernflower Стивер.

Стивер был немецким программистом русского происхождения, в основном разрабатывавшим программное обеспечение для медицинского оборудования. Двадцать лет назад у него появился глубокий профессиональный интерес к внутренним устройствам виртуальной машины Java. Вы можете помнить его исследовательские записи в блоге, например,  эту (на русском) от 2006 года о том, как настроить иерархию классов Java с помощью Unsafe, когда Java 1.5 только вышла. Примерно в 2008 году Стивер увлекся декомпиляцией Java.

В то время ландшафт декомпиляции Java был очень беден. Время первого поколения декомпиляторов, таких как JAD или JODE,  подходило к концу. В то время как Java как язык развивался, существующие декомпиляторы в основном не поддерживались, что затрудняло работу с новыми языковыми конструкциями, такие как операторы утверждений, аннотации и универсальные типы. Более того, прекращение поддержки инструкций JSR/RET в байт-коде Java привело к существенной разнице в том, как компилируются блоки try-finally. Декомпиляторы не смогли обрабатывать новый байт-код.

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

Стивер решил написать свой собственный декомпилятор в качестве побочного проекта. Чтобы преодолеть недостатки существующих альтернатив, он применил другой подход. После прочтения байт-кода он построил граф потока управления в статической форме с одним присваиванием, которая намного лучше выражает семантику программы, абстрагируясь от конкретной формы байт-кода. В начале этого проекта Стивер мало что знал о статическом анализе и проектировании компиляторов и должен был многому научиться, но усилия того стоили. Полученный декомпилятор давал гораздо лучшие результаты, чем все, что было доступно в то время. Он даже мог декомпилировать байт-код, созданный некоторыми обфускаторами без какой-либо явной поддержки.

Стивер сам занимался основной разработкой в ​​период с 2008 по 2010 год. Первая публичная версия стала доступна в мае 2009 года в качестве веб-сервиса. Пользователь мог загрузить отдельный файл CLASS или целый файл JAR и получить декомпилированный результат. Декомпилятор быстро набрал популярность: в течение первых четырех месяцев пользователи декомпилировали более полумиллиона классов Java. Публичной автономной версии не было, но Стивер отправил ее в частном порядке нескольким бета-тестерам. После выпуска Стивер внес многочисленные улучшения и исправил множество ошибок благодаря ранним последователям.

9033872cc79e92e4f2fa71f0ce4a1c34.png

После 2010 года активная разработка декомпилятора прекратилась, так как Стивер стал больше занят своей основной работой. Несколько сторонних поставщиков программного обеспечения попросили Стивера предоставить декомпилятор для своих проектов. В частности, он был использован в Mod Coder Pack, который представляет собой набор инструментов для создания модов для игры Minecraft. Тем не менее, обычному пользователю Java стало сложно найти рабочую версию Fernflower.

В 2013 году JetBrains обратилась к Стиверу с предложением включить Fernflower в IntelliJ IDEA. Частью сделки было сделать Fernflower открытым исходным кодом. Все прошло хорошо, и контракт был подписан. 11 июля 2014 года была выпущена ранняя версия IntelliJ IDEA 14, впервые включающая декомпилятор. Вы все еще можете увидеть первоначальный импорт исходного кода Fernflower в истории IntelliJ IDEA Git 4 марта 2014 года.

Хотя Стивер никогда не был сотрудником JetBrains, он помогал улучшать декомпилятор в течение года после первоначального импорта. Поскольку Java 8 только что вышла, необходимо было поддерживать новые языковые конструкции, такие как лямбды. Еще одной большой проблемой была интеграция декомпилятора с отладчиком IntelliJ IDEA. Номера строк в декомпилированном коде отличаются от номеров строк в исходном коде и Стивер помог обеспечить понятное сопоставление между ними, чтобы вы могли легко отлаживать декомпилированный код.

Когда Fernflower стал открытым исходным кодом, многие другие инструменты в мире Java стали его использовать: вы можете найти несколько форков на GitHub. Команда Java в JetBrains постоянно совершенствует Fernflower, но в основном это все еще код Стивера.

Если бы Fernflower не существовал, нам, вероятно, пришлось бы вложить значительные ресурсы в разработку собственного декомпилятора. Это могло бы привести к тому, что у IntelliJ IDEA не было бы декомпилятора или был бы тот, который был бы значительно менее эффективен. Работа Стивера стала настоящим переломным моментом для разработчиков Java за последние 10 лет. Поскольку не было лучшей альтернативы для декомпиляции байт-кода Java, его вклад сэкономил разработчикам бесчисленное количество часов при отладке кода Java без исходников. 

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

Оригинал статьи

Habrahabr.ru прочитано 7207 раз