Материалы:In Memory of Stiver

Материал из in.wiki
Перейти к навигации Перейти к поиску

русский перевод статьи In Memory of Stiver автор Тагир Валеев 2 ноября 2024 г. https://blog.jetbrains.com/idea/2024/11/in-memory-of-stiver/ — в память о Стивере (Stiver), организаторе библиотеки Флибуста

автоперевод яндекс-переводчиком в яндекс-браузере (под линуксом)


В память о Стивере

Тагир Валеев

2 ноября 2024 г.

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

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

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

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

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

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

иллюстрация

После 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 не было бы декомпилятора или он был бы значительно менее эффективным. Работа Стивера за последние 10 лет стала настоящим прорывом для разработчиков Java. Поскольку не было лучшей альтернативы декомпиляции байт-кода Java, его вклад сэкономил разработчикам бесчисленное количество часов при отладке кода Java без исходных текстов.

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