JetBrains о создателе Флибусты
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. Публичной автономной версии не было, но Стайвер отправил ее в частном порядке нескольким бета-тестерам. После выпуска Стайвер внес многочисленные улучшения и исправил множество ошибок благодаря ранним последователям.
После 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 без исходников.
Спасибо, Стайвер! Мы глубоко опечалены потерей такого блестящего первопроходца, чья работа и преданность делу оказали столь долгосрочное и глубокое влияние.
Подробнее
^ Pi i 11111 i 1 i ^ Pi iiiiii •JFAQ. ^JTontact Deutsch SjS English PVCCKIIH Fernflower is the world's first analytical decompiler for Java. I will give here a proper description, as soon as I have some spare time. For now just feel free to use it:) Some bugfixes, including but not limited to: • empty and obfuscated finally clause 27.05.2009 • classes with single-letter name • synthetic access methods Thanks to everyone who sent me bug reports. Keep it up! Accepted file types: *.class, *.jar, *.zip Choose File | No file chosen max. 7 files, 5 MB, 7 minutes D decompile inner classes □ D decompile enumerations □ □ decompile generic signatures □ D hide bridge methods □ □ hide synthetic methods □ D hide empty super invocation □ D hide empty default constructor collapse 1.4 class references assume return not throwing exceptions remove getClassQ invocation in a qualified new statement interpret int 1 as boolean true (compiler bug) allow for not set synthetic attribute (compiler bug) consider nameless types as Object (compiler bug) Decompile
0 = I Q demo v Version c... v (ï5 Deco... v DO QQ : Q fo? - □ X □ guava- 33.3.1-jre.jar > com > google > common > collect > © ImmutableMap (c) ImmutableMap.class x O Decompiled .class file, bytecode version: 52.0 (Java 8) Download... Choose Sources... 83 return RegularImmutableMap.frowEntries(new Map.Entry[]{entry0/(kl, vl), entrgü 84 } 85 @ public static <K, V> ImmutableMapcK, V> of(K kl, V vl, K k2, V v2, K k3, V v3) { n 7] return RegularlmmutableMap.fromEntriesinew Map.Entry[]{entry0/(kl, vl), entrgO 88 } 89 90 @ public static <K, V> ImmutableMapcK, V> of(K kl, V vl, K k2, V v2, K k3, V v3, K Debug EÎ DecompilerTest x : — (S □ DO D ùi à. O 0 : Threads & Variables 0Console (B s/ "main"@1 in group "main": RUNNING V v Evaluate expression (Ent.. 4- ^ OO i of:152, I mmutableMap (com.google.common.collect) > © static members of ImmutableMap main:5,1 jecompilerTest > ® k1 = "a" > ® v1 = {lnteger@1063} 1 > ® k2 = "b" > ® v2 = {lnteger@1065} 2 > ® k3 = "c" > ® v3 = {lnteger@1067} 3 Switch frames from anywhere in the IDE with Ctrl+Alt+Up and Ctrl+Alt+Down X L 87:1 O m CRLF UTF-8 4 spaces O 3446 of 8200M J
Флибуста
потому что оп молодец и поправил
RIP
За Флибусту охренительное спасибо!
Всё остальное :
Блин, я даже не знал что такой крутой чел был. Респект F!
Как и флибуста, не?
Хотя тут уж под каким углом смотреть. Закрытые исходники тоже не светлая сторона. Защита интеллектуального права и всё такое, но внутри может быть такой пиздец, что хоть сразу к стенке.
Прикрываясь той же защитой интеллектуальных прав, можно ведь и проверять, не спиздили ли твой код. А то вдруг, ты бесплатно и для всех, а они спиздили, закрыли и продают с сомнительным соусом внутри.
Собственно, декомпилятор джавы настолько хорош, что даже если либа - это твой же проект в соседней папке, но ты не подключил его как сорс ибо впадлу, для отладки этого более чем достаточно.
Земля пухом.
Ого, не знал что он автор fernflower'а.