# Понедельник 66 твитов
Всем привет! На этой неделе с вами Ваня Углянский (@dbg_nsk). Работаю в славной компании Excelsior, в команде… twitter.com/i/web/status/1…
11:07Вообще, в компиляторостроении свои понятия frontend/backend. У нас frontend - это про парсеры, а backend про саму г… twitter.com/i/web/status/1…
11:10Мой план, что хочу обсудить и про что рассказать:
11:11А еще:
11:11Но это ориентировочный план: есть еще куча разных и захватывающих тем, поэтому если вам интересно что-то конкретное… twitter.com/i/web/status/1…
11:13Перед тем, как начнем, пара дисклеймеров:
1) safe harbour: я говорю от своего имени, все это не будет являться офи… twitter.com/i/web/status/1…
11:163) я сам рантаймщик, поэтому возможен перекос в сторону рассказа про кишки рантайма. Но я буду стараться такого не… twitter.com/i/web/status/1…
11:17Отлично, поехали! Сначала пара слов о том, кто мы, что делаем, и что же это за JVM такая.
11:24Excelsior - российская компания, базируется в Новосибирском Академгородке. У нас много интересных проектов (про нек… twitter.com/i/web/status/1…
11:28“Сертифицированная” означает, что все выпущенные с 2005 года версии прошли JCK - десятки тысяч тестов, которые пров… twitter.com/i/web/status/1…
11:32“Ставка на AOT” означает, что мы стараемся скомпилировать ваши классы заранее, а не во время исполнения приложения… twitter.com/i/web/status/1…
11:34На такой случай у нас есть JIT, поэтому все корректно. Тем не менее основные оптимизации мы делаем именно в AOT ком… twitter.com/i/web/status/1…
11:36Кроме того, у нас своя реализация рантайма: GC, аллокация, синхронизация, загрузка классов, профилировка и т.д.
Пе… twitter.com/i/web/status/1…
11:37Еще важно, что поддерживаем довольно большое количество таргет систем: Windows, Linux, OS X; из архитектур: x86, x8… twitter.com/i/web/status/1…
11:41Пообщался на той неделе с @olegchir и в очередной раз понял, что про нас жутко мало известно людям, только какие-то… twitter.com/i/web/status/1…
Вообще, я недавно делал 1 лайк = 1 факт тред конкретно про JET, чтобы его не дублировать, просто оставлю здесь ссыл… twitter.com/i/web/status/1…
11:43Окей, про нас чуть-чуть рассказал, теперь хочу узнать про вас!
Есть здесь Java программисты? Или вы используете дру… twitter.com/i/web/status/1…
И еще один опрос конкретно для Java разработчиков. Какая у вас сейчас мажорная версия Java?
вариант "Java 8, но уж… twitter.com/i/web/status/1…
11:53@uncle_robot @backendsecret +1 зачем вы вообще это делаете ?
Мы продаем JET а также саппорт для него и на это живем.
Зачем людям нужна Java с AOT (например JET) расскажу чуть… twitter.com/i/web/status/1…
11:59@backendsecret Дополню: помимо JCK в нашем test suite также проверяется больше полусотни третьесторонних приложений… twitter.com/i/web/status/1…12:00
@backendsecret А можно ещё потом для тех, кто не в танке джвм, про то как Ваше с Граалем сравнивается или почек не сравнивается?
Про Graal обязательно обсудим, это сейчас очень горячая тема. twitter.com/lozhn/status/1…
12:02@lyashenkogs @backendsecret У нас на сайте (excelsiorjet.com) есть небольшая панелька "Who is Already Using… twitter.com/i/web/status/1…12:16
@MikePotanin @backendsecret @ExcelsiorJET Т.к. мы работаем напрямую с байткодом, то работает любой JVM-язык (Scala,… twitter.com/i/web/status/1…12:22
@backendsecret Еще интересно как к Вам в компанию попадают. никогда не видел открытых вакансий или хайринга на конф… twitter.com/i/web/status/1…
Да, HR у нас тоже очень необычный, про это обязательно поговорим! Но чуть ближе к концу, сначала хотелось бы обсуди… twitter.com/i/web/status/1…
12:25@xappymah @lyashenkogs @backendsecret Было бы здорово услышать, зачем они используют Excelsior.Про AOT Java нынче… twitter.com/i/web/status/1…
да, это будет нашей главной темой на сегодня, не переключайтесь! twitter.com/qwwdfsad/statu…
12:49Фух, доотлаживали сейчас JET-скомпилированную IDEA с @pjBooms.
Отлаживать JVM - это очень весело! Хотя не всем это… twitter.com/i/web/status/1…
Уточню: речь пойдет про компиляцию байткода в нативный код до исполнения. Понятно, что исходный Java/Kotlin/Scala/…… twitter.com/i/web/status/1…
16:15Вообще, AOT в Java сейчас - очень горячая тема. Кажется, просто каждая JVM делает что-то в эту сторону.
Нам на это… twitter.com/i/web/status/1…
16:17Более того, часто высказывалось мнение, что AOT для Java вообще сделать нельзя чисто технически (и это при том, что… twitter.com/i/web/status/1…
16:23Миф #1: это не сработает из-за динамической загрузки классов (мы же не знаем их заранее, как компилировать?).
Дейс… twitter.com/i/web/status/1…
16:26Миф #2: это не сработает, даже если вы знаете классы до компиляции, из-за пользовательских класслоадеров (а значит… twitter.com/i/web/status/1…
16:27В таком случае классы будут “активироваться” в правильном порядке, получится полное соответствие пользовательской л… twitter.com/i/web/status/1…
16:31@backendsecret Кому интересно не учли в AOT такую подставу от IDEA:private static boolean mustBeLoadedByPlatform(… twitter.com/i/web/status/1…
да, собственно как раз по поводу обучения AOT компилятора логике кастомных класслоадеров twitter.com/pjBooms/status…
16:35Миф #3: а как же reflection?
С рефлексией то вообще никаких проблем нет, всю информацию можно вычислить заранее и… twitter.com/i/web/status/1…
16:36Миф #4: AOT медленнее JIT-а
Давайте разбираться. Классический подход в JVM: компилировать байткод на лету с помощь… twitter.com/i/web/status/1…
16:40При этом JIT-ы часто спекулируют: генерируют код, который явно рассчитывает на тот или иной путь исполнения. Если в… twitter.com/i/web/status/1…
16:44С AOT такой фокус не пройдет: заранее мы не знаем, какой путь наиболее горячий, или какой метод реально вызывается… twitter.com/i/web/status/1…
16:45еще с другой стороны с AOT компилятор не отъедает ресурсы (время и память) во время работы самого приложения, что т… twitter.com/i/web/status/1…
16:48Так что по поводу финальной производительности, все не так однозначно: на каких-то приложениях подход JIT-а сильно… twitter.com/i/web/status/1…
16:49Общая тенденция: плоский профиль => AOT показывает себя хорошо.
Профиль с ярко выраженными спайками (несколько супе… twitter.com/i/web/status/1…
Вообще, у Никиты @pjBooms Липского есть отличный доклад по поводу таких мифов. Ему уже несколько лет, но он все еще… twitter.com/i/web/status/1…
16:52@backendsecret >честно говоря, не понимаю, почему здесь возникают сомнения
Например вы по байткоду поняли, что поле… twitter.com/i/web/status/1…
Но это ведь вопрос корректности оптимизаций, а не реализации рефлексии.
Обычно аргумент у людей в том, что непонятн… twitter.com/i/web/status/1…
@backendsecret Расскажешь подробнее про оптимизацию kotlinc и плоский профиль на сладкое? :)
А почему бы и нет!
История следующая: JET-скомпилированный kotlinc показал хороший стартап (предсказуемо), но пико… twitter.com/i/web/status/1…
17:50Стали разбираться. Разгонять приложение с плоским профилем - дело непростое. Когда у тебя есть горячие методы, в пе… twitter.com/i/web/status/1…
17:57В результате kotlinc (точнее разные его части) стал мотивирующим примером для целого ряда оптимизаций разного масшт… twitter.com/i/web/status/1…
18:05Как вы понимаете, и интерфейсы и стекаллок - они везде, поэтому получился значительный прирост даже на плоском проф… twitter.com/i/web/status/1…
18:11@backendsecret А можно для несведующих, что такое "плоский профиль"?
Простите, когда в этом варишься все время, забываешь, что не все термины сходу понятны.
Плоский профиль - это когд… twitter.com/i/web/status/1…
18:41Т.е. как-то так: pic.twitter.com/5hXfNMGGXD
18:42а вот если на профиле есть ярко выраженные лидеры, то они как раз отличные кандидаты для оптимизаций: pic.twitter.com/gsWhGLSk7t
18:44Окей, а зачем вообще нужен AOT в JVM? И почему все его теперь делают, жили же раньше с джитом, все было хорошо. Давайте разбираться.
20:21Во-первых, в AOT мы все компилируем заранее, а значит нет никакого прогрева => стартап на порядок выше. Возможно эт… twitter.com/i/web/status/1…
20:23Во-вторых, AOT - это хорошо, AOT - это надежно (с). Никаких деоптимизаций (а значит внезапной просадки производител… twitter.com/i/web/status/1…
20:30В-третьих, после AOT компиляции приложение не конкурирует с JIT-ом за ресурсы (память и время). А значит, у вас буд… twitter.com/i/web/status/1…
20:33Отдельно здесь стоит выделить запуск JVM на embedded системах. Там вы как раз максимально ограничены в ресурсах, ва… twitter.com/i/web/status/1…
20:36А еще побочным эффектом от AOT является первоклассная защита ваших сорцов. Компилируем все заранее => не нужно держ… twitter.com/i/web/status/1…
20:43обфускаторы не спасут, например из-за вот этого: javadeobfuscator.com
обратите внимание на список "поддерживаем… twitter.com/i/web/status/1…
20:46C AOT все гораздо лучше: вы, конечно, можете попробовать дизассемблировать получившийся исполняемый файл и попытать… twitter.com/i/web/status/1…
20:48Кроме того мы предоставляем возможность дополнительно зашифровать все строки, а также выкинуть из стектрейсов номер… twitter.com/i/web/status/1…
20:49Может сложиться впечатление, что защита сорцов - это какая-то надуманная проблема, у всех server side же. Но количе… twitter.com/i/web/status/1…
20:52У одного клиента был такой юзкейс: Java приложение, которое производит некую очень важную диагностику сети. Все был… twitter.com/i/web/status/1…
20:54На другой конец планеты или в соседний офис - все равно, инженер ехал туда лично. А потом они скомпилировали прилож… twitter.com/i/web/status/1…
20:57Итого, AOT нужен, если:
1) Вам нужен быстрый стартап,
2) Вам нужно стабильное исполнение,
3) Вам нужен memory foot… twitter.com/i/web/status/1…
@backendsecret Когда-то давно участвовал в обсуждении на тему защиты java сорцов.
Ответ сообщества был такой: это н… twitter.com/i/web/status/1…
все так, когда речь идет про server side, но что делать, если вы хотите поставлять свое приложение клиенту? допусти… twitter.com/i/web/status/1…
21:22@backendsecret А вы не могли б, что галословным не быть, привести типовые значние, чтобы было понятно за что идет б… twitter.com/i/web/status/1…
пожалуй самое актуальное и злободневное измерение - это бенч на стартап Spring Boot приложения. На нем мы сейчас по… twitter.com/i/web/status/1…
21:29из чуть менее актуального у меня под рукой есть измерения стартапа томката (конкретно это приложение JSPWiki) на ар… twitter.com/i/web/status/1…
21:36@backendsecret А что вы там такого наоптимизировали? Можно ли как-то уместить в твит?
мы честно пытались, посмотрели на все мини-примеры, которые нарезали из kotlinc, и поняли, что в твит поместится то… twitter.com/i/web/status/1…
21:40@backendsecret А то кажется, что это настолько стандартные структуры, что по ним-то уже много лет назад должны были… twitter.com/i/web/status/1…
так а кто сказал, что у нас эти самые стандартные структуры :) у нас другие, в которых не все фрукты еще сорваны (п… twitter.com/i/web/status/1…
21:44# Вторник 39 твитов
Окей, про нас чуть-чуть рассказал, теперь хочу узнать про вас!
Есть здесь Java программисты? Или вы используете дру… twitter.com/i/web/status/1…
здорово, что JVM-based языки так высоко! я думал, они еще пока будут ниже, но это отлично же.
ну и лично меня пора… twitter.com/i/web/status/1…
11:37Продолжаем!
Вчера много говорили про нас (в смысле про JET) сегодня давайте начнем с глобальных вопросов про JVM с… twitter.com/i/web/status/1…
11:39Одна из самых крутых черт современного JVM мира - это разнообразие реализаций, соответствующих спеке, но имеющих ун… twitter.com/i/web/status/1…
11:41В предыдущие годы это было неочевидно, многие были уверены, что Java - это Hotspot. Довольно трудно было объяснить,… twitter.com/i/web/status/1…
11:46Почему так происходит? Во-первых, мир меняется, и перед авторами JVM встают принципиально новые задачи. Простой при… twitter.com/i/web/status/1…
11:50Или обратная ситуация: огромные хипы на серверах, где традиционные GC чувствуют себя не очень хорошо.
Разнообразие… twitter.com/i/web/status/1…
11:51Вторая причина довольно свежая. Вы ведь слышали, что с лицензиями у Oracle JDK теперь все не так просто? Раньше вы… twitter.com/i/web/status/1…
11:54Про всю ситуацию с изменением лицензии очень хорошо написано здесь: itnext.io/java-is-still-…
Если коротко, то Oracl… twitter.com/i/web/status/1…
11:58Oracle JDK 11 сразу является платной для коммерческого использования, скачать и попробовать вы ее можете только для… twitter.com/i/web/status/1…
12:00Альтернативно Oracle предлагает переходить на Open JDK и они сами тоже эти билды собирают: jdk.java.net/11/… twitter.com/i/web/status/1…
12:11Но есть и хорошие новости!
Во-первых, другие компании выпускают свои основанные на OpenJDK билды и поддерживают их… twitter.com/i/web/status/1…
Во-вторых, кроме OpenJDK есть большое количество альтернативных реализаций, которые а) дают новые фичи, б) также вы… twitter.com/i/web/status/1…
12:22Наконец, все, ну просто все из перечисленных выше и не только производителей JVM предлагают платный саппорт. Ваш би… twitter.com/i/web/status/1…
12:23Видите, куда это все идет? Разнообразие JVM - это теперь не просто забавная штука, теперь это то, что дает лично ва… twitter.com/i/web/status/1…
12:27Лично я считаю, что разнообразие реализаций JVM - это просто прекрасно.
Во-первых, это создает ситуацию бесконечно… twitter.com/i/web/status/1…
12:33Почему это происходит? Да потому, что конкуренты тоже работают на производительностью, нельзя отставать, иначе тебя… twitter.com/i/web/status/1…
12:34Во-вторых, очень круто осознавать, что во всем мире много людей занимается схожими и очень интересными проблемами.… twitter.com/i/web/status/1…
12:38Есть в этом какое-то удивительное - почти физическое ощущение прогресса человечества что ли, не знаю. Да, конкуриро… twitter.com/i/web/status/1…
12:40Напоследок по этой теме немного наброшу про параллельный мир.
Вот в .NET же нет такой конкуренции? Как у них с прог… twitter.com/i/web/status/1…
Сегодня в качестве опросов давайте посмотрим, какие билды Java вы используете сейчас, а какие будете использовать в… twitter.com/i/web/status/1…
13:00и соответственно, что вы планируете выбрать, начиная с января 2019?
13:01@Imaskar @backendsecret На бенче -- github.com/dsyer/spring-b… ADS не дает очень существенного прироста. Но у нас пока… twitter.com/i/web/status/1…13:02
Продолжая тему различных реализаций JVM, расскажу, у кого еще кроме нас есть AOT, и в чем отличия
15:44во-первых, стоит сказать, что в Хотспоте, начиная с девятки, тоже есть свой AOT. Это реализация JEP-295:… twitter.com/i/web/status/1…
15:48мне очень нравится, как у них предкомпилированные AOT-ом классы встраиваются в общую схему tired компиляции: их мож… twitter.com/i/web/status/1…
15:52т.е. Хотспот остается верен себе: основная ставка именно на JIT, а AOT - средство улучшения стартапа (поэтому сам о… twitter.com/i/web/status/1…
15:53во-вторых, AOT есть в IBM J9. Возможно стоило упомянуть их в первую очередь, т.к. он у них появился намного раньше.… twitter.com/i/web/status/1…
15:57на самом деле про их AOT я слышу обычно в контексте shareclasses для скомпилированных классов, который разгоняет по… twitter.com/i/web/status/1…
16:08в-третьих, стоит сказать про технологию ReadyNow от Азула. Это не AOT, а сохранение информации об оптимизациях, кот… twitter.com/i/web/status/1…
16:14хотя суть здесь и другая, при разработки этой штуки они сталкиваются со многими проблема и задачами очень хорошо зн… twitter.com/i/web/status/1…
16:15Ну и конечно, как вы, наверное, слышали, в проекте GraalVM есть такая штука, как SubstrateVM, позволяющая AOT-компи… twitter.com/i/web/status/1…
16:20Про SVM:
1) Такой подход сильно нарушает многие параграфы спеки, поэтому это уже не совсем Java. Отсюда появляются… twitter.com/i/web/status/1…
16:25Вообще, про нарушение спеки мы еще поговорим, у нас на этот счет было много интересных экспериментов и историй (но… twitter.com/i/web/status/1…
16:27Ну и помянем (не чокаясь) мертвецов в AOT компиляции: GCJ, RoboVM и других. Не все проекты дожили до времени, когда… twitter.com/i/web/status/1…
16:34@backendsecret Опенсорс же не умирает. Кто угодно может взять исходники и, подняв уавшее знамя, дотащить его до уровня джета. Или нет?
Это правда. Кстати, у RoboVM есть приемник (опенсорсный), называется MobiVM. И он вроде вполне себе жив, Java на iO… twitter.com/i/web/status/1…
18:07@backendsecret @trueneu А вы (или кто-то ещё) не рассматривали вариант запускать профилирование и по сгенерированно… twitter.com/i/web/status/1…
Рассматривали и даже вполне успешно делаем это, называется Profile Guided Optimization, зачастую дает просто волшеб… twitter.com/i/web/status/1…
18:10@olegchir @backendsecret Писать на Java в определенных ограничениях? Можно. Будешь все время удивляться, как много… twitter.com/i/web/status/1…19:10
@backendsecret И BugVM тоже, но он уже слабовато трепыхается, последние правки совсем старые19:56
# Среда 34 твита
Продолжаем! Обсудили за понедельник и вторник про серьезные, глобальные темы. Сегодня давайте немного отдохнем и по… twitter.com/i/web/status/1…
12:38В предыдущие дни спрашивали про LoC. Сейчас посчитали (возможно впервые), в основном репозитории у нас 1 163 579 ст… twitter.com/i/web/status/1…
12:41Вообще, все работы и компоненты в JET можно разделить на три основные направления: это компиляторы, рантайм и (не т… twitter.com/i/web/status/1…
12:46Еще нейтральные компоненты, например, линкер ни в одно из этих направлений официально не попадает, он в сторонке.… twitter.com/i/web/status/1…
12:53Компиляторов у нас много, на любой цвет и вкус. Самый основной оптимизируюищий компилятор написан как раз на Scala.… twitter.com/i/web/status/1…
12:58Кроме того, есть компилятор, который мы называем baseline (или вазелин). Он проще, там гораздо меньше оптимизаций,… twitter.com/i/web/status/1…
13:06Еще именно baseline мы используем в качестве JIT-а (помните, нам он нужен в основном для корректности).
Этот компи… twitter.com/i/web/status/1…
13:07Писать компиляторы на managed языках гораздо удобнее и быстрее, чем, скажем, на плюсах. Никаких тебе внезапных сегф… twitter.com/i/web/status/1…
14:55Из того, что наши компиляторы сами являются программами на Java/Scala есть забавное следствие: их самих тоже можно… twitter.com/i/web/status/1…
15:01Более того, у нас есть такой бенч: взять ночной компилятор (jc_1), скомпилировать им новую версию компилятора (jc_2… twitter.com/i/web/status/1…
15:09Есть у нас и легаси код. В том числе есть целый "античный" компилятор. Написан он на языке Oberon-2, слышали о тако… twitter.com/i/web/status/1…
15:37Когда я говорю "античный", я имею в виду, что он сделан в прошлом тысячелетии. Обратите внимание на даты (это ревиз… twitter.com/i/web/status/1…
15:45вообще, у Оберона есть какое-то количество фанатов до сих пор (в свое время это был очень прогрессивный язык).
Но… twitter.com/i/web/status/1…
15:58ладно, давайте вернемся в 21 век.
еще у нас есть свой форк javac для некоторых внутренних целей.
как вы знаете, с… twitter.com/i/web/status/1…
Вообще, кажется, любой, кто со мной говорил на Joker знает, что я хейчу javac, возможно я с этим немного перегибаю.… twitter.com/i/web/status/1…
16:41@backendsecret а ведь был ещё такой jikes, который не только компилял, но и учил уму-разуму...16:47
@backendsecret Самое интересное не написал.16:53
Что недавно в этом коде был найден и пофиксан баг, поэтому взор "молодо… twitter.com/i/web/status/1…
Что еще хорошо в компиляторах на managed языках, так это удобство отладки. Запускаешь в @intellijidea компилятор, и… twitter.com/i/web/status/1…
16:57Чтобы не создавалось впечатление, что мы какие-то динозавры, уточню, что у компиляторов и рантаймов (да и вообще пр… twitter.com/i/web/status/1…
18:02Поэтому да, тут встречается настолько старый код, это нормально.
И так не только у нас. Вот, например, крутая стат… twitter.com/i/web/status/1…
18:03Давайте теперь немного про разработку рантайма.
Здесь интересно то, что часть рантайма тоже написана на Java.
Это… twitter.com/i/web/status/1…
но это, конечно, трудно сделать без AOT, т.к. возникает жесткая проблема бустрапа. Что делать, если понадобится заг… twitter.com/i/web/status/1…
18:19в любом случае, с отладкой рантайма, все не так просто и хорошо.
В идее вы тут ничего не позапускаете, так у ранта… twitter.com/i/web/status/1…
18:26@backendsecret Слушай, а сколько времени у вас проходит от релиза до релиза, версии какой древности поддерживаете?
Последнее время стараемся делать два релиза в год, пока получается.
Поддерживаем каждую версию два года после рели… twitter.com/i/web/status/1…
18:28Еще тонкость: после правок в компиляторе, пусть и на маленьком примере, но можно проверить работоспособность почти… twitter.com/i/web/status/1…
18:33@backendsecret Ну и ещё юнит-тесты и изоляция компонент
Да, кстати, точно. Еще есть юнит-тесты.
Вдумайтесь. Юнит-тесты. На JUnit-е. Покрывающие (хоть и частично) код рант… twitter.com/i/web/status/1…
18:36С отладкой (особенно в рантайме) есть еще один интересный момент: спорадичные баги, которые проявляются очень редко… twitter.com/i/web/status/1…
20:26@backendsecret Повод задуматься над формальной верификацией?
Вы будете смеяться, но да, именно к этому мы и пришли в некоторых частях рантайма. Мы стали использовать вот эту шт… twitter.com/i/web/status/1…
20:57Но все-таки самые классные баги, которые мне пока доводилось раскапывать, были связаны с GC. Однажды я реализовывал… twitter.com/i/web/status/1…
21:04сначала проявились простые баги, при этом разломалось почти все
через пару дней стали вырисовываться проблемы поин… twitter.com/i/web/status/1…
21:13в т.ч. была проблема, проявляющаяся только в случае, если:
1) случилось неявное NPE,
2) при создании исключения пр… twitter.com/i/web/status/1…
В общем, баги в JVM бывает непросто раскопать, но когда наконец получается - это прям кайф-кайф. Всем рекомендую, 10 крешлогов из 10
21:30Вернемся к разработке. Обычно каждый инженер в JET идентифицирует себя, или как компиляторщик, или как рантаймщик,… twitter.com/i/web/status/1…
21:34получаются две такие под-команды, которые суммарно делают одно дело, но при этом у них немного отличаются стиль, ми… twitter.com/i/web/status/1…
21:40# Четверг 33 твита
@backendsecret Не верьте Ване. На самом деле у нас есть распределяющая шляпа, которая решает, чем будет заниматься очередной стажер :)5:10
@backendsecret Справедливости ради, подобного можно поесть и в "детерминированном" компиляторе, хоть и в радикально… twitter.com/i/web/status/1…5:12
@alexanius @backendsecret @intellijidea моя самая весёлая отладка JIT-компилятора была, когда я, забывшись, добавил… twitter.com/i/web/status/1…5:14
@antkorwin @backendsecret Помимо юнит-тестов и JCK, который дает покрытие многих аспектов JVM, у нас также есть бог… twitter.com/i/web/status/1…
тут стоит отметить еще пару моментов
во-первых, во время dev периода мы собираем ночной JET в специальном режиме с… twitter.com/i/web/status/1…
10:47во-вторых, мы часто делаем специальные "nightmare" режимы, которые нацелены на тестирование конкретной функциональн… twitter.com/i/web/status/1…
10:53Компиляторы и рантаймы это очень круто и весело, конечно, но нужно еще чтобы JET-ом могли пользоваться люди.
Для э… twitter.com/i/web/status/1…
11:02например, там реализовали Maven/Gradle плагины для JET-а. Добавляешь небольшой блок в pom.xml и ура, твой проект ко… twitter.com/i/web/status/1…
11:06@backendsecret я как-то опечатался, и бэкенд вместо самых хороших операций (уменьшающих давление на регистры) выбир… twitter.com/i/web/status/1…11:07
Здорово, что есть такой отдел.
Когда закапываешься в компилятор или рантайм, часто забываешь о том, что реально бе… twitter.com/i/web/status/1…
11:17@krems5 @antkorwin @backendsecret Ничто не оскорбляет чувства разработчика, как необходимость что-то массово вручную тестировать :)
Бесценный комментарий от руководителя нашего QA/QE отдела.
Кстати, на самом деле, он - рантайм-инженер. Для тестир… twitter.com/i/web/status/1…
13:26Продолжаем!
Как вы уже поняли, история в случае нашей JVM пошла по альтернативному пути, поэтому иногда появляютс… twitter.com/i/web/status/1…
14:23Когда говорили про плюсы и минусы AOT по сравнению с JIT, могло сложиться впечатление, что на неплоском профиле AOT… twitter.com/i/web/status/1…
14:29Идея простая: давайте скомпилируем первый раз, если будет тормозить, то прогоним приложение на типичном сценарии и… twitter.com/i/web/status/1…
14:32Компилятор получает информацию, которой ему так не хватало на шипастом профиле: какие пути в коде самые горячие.
Эт… twitter.com/i/web/status/1…
Да, мы не сможем заметить изменение характера исполнения и подстроиться под это на лету, как это делает JIT, но это… twitter.com/i/web/status/1…
14:36@backendsecret Android ART (который Dalvik 2.0) делает прям так же под кальку. Ну и кажется другого выхода нету.14:37
Как это влияет на производительность? Впечатляюще.
Для демонстрации прям вау-эффекта мы показываем специальный ми… twitter.com/i/web/status/1…
14:41Но, конечно, не в микробенчах соль, их то можно какие угодно написать.
Реальные приложения показывают рост произво… twitter.com/i/web/status/1…
14:42Мы сейчас используем PGO далеко не на полную мощность, эта фича вообще появилась недавно.
По сути используется тол… twitter.com/i/web/status/1…
14:48еще хороший вопрос, как собрать профиль?
профилировать на safe-points - стремно,
инструментировать код - медленно,… twitter.com/i/web/status/1…
в результате сделали свой профайлер, прям встроенный в JET. Любое скомпилированное приложение можно запустить со сп… twitter.com/i/web/status/1…
15:01Теперь немного интересностей про компилятор: в компиляторе мы используем SSA-форму вплоть до финальной генерации ас… twitter.com/i/web/status/1…
17:02Для распределения регистров мы не делали мучительного выбора между монструозным Чайтином и лёгким, но менее эффекти… twitter.com/i/web/status/1…
17:04А в одной локальной задаче мы удачно применили алгоритм распределения памяти Ершова, сводящий задачу к NP-полной за… twitter.com/i/web/status/1…
17:42Про Ершова еще поговорим обязательно, это особая фигура для нас (да и не только для нас).
Но вообще, как вы видите… twitter.com/i/web/status/1…
17:43Еще в отличие от Хотспота у нас есть не только scalar replacement, но честный stack allocation, т.е. размещение объ… twitter.com/i/web/status/1…
17:45Наличие именно стекаллока для нас важно, т.к. он не обязывает нас инлайнить методы, куда застекаллоченный объект пе… twitter.com/i/web/status/1…
17:49Время компиляции - это вообще очень важный момент в AOT.
Круто, что мы компилируем заранее, а не при каждом запуск… twitter.com/i/web/status/1…
17:51Если у вас на компиляцию реального приложения будет уходить целый день, то никто таким AOT пользоваться не будет.… twitter.com/i/web/status/1…
17:53В любом случае компиляция таких толсятков занимает ощутимое время.
Потратить на компиляцию толстяка больше часа -… twitter.com/i/web/status/1…
Кажется, чего тут делать: просто смотрим, что именно изменилось и только это перекомпилируем.
Но все сильно усложн… twitter.com/i/web/status/1…
17:59Может и наоборот, какие-то глобальные оптимизации стали невалидными. Могла иерархия классов просто поменяться, и из… twitter.com/i/web/status/1…
18:01В общем, нужно держать в голове огромное количество вариантов, так что задача непростая. Но работает, повторные ком… twitter.com/i/web/status/1…
18:03# Пятница 39 твитов
Сегодня хочу порассказывать про наш саппорт, т.к. это отличный источник баек и детективных историй про отладку.
Гл… twitter.com/i/web/status/1…
15:13У нас всегда есть дежурный саппортер (или несколько), главная задача которого - отвечать клиентам и раскапывать слу… twitter.com/i/web/status/1…
15:15Сидеть на саппорте - интересный опыт. Конечно, какое-то количество обращений - это прям базовые вопросы,
но иногда… twitter.com/i/web/status/1…
В любом случае, послушать, что люди думают о продукте, что их беспокоит, чего не хватает - это очень отрезвляет и о… twitter.com/i/web/status/1…
15:24Расскажу пару историй.
Сижу я как-то на саппорте, пишет очень рассерженный клиент: у него ничего скомпилированное… twitter.com/i/web/status/1…
15:27Естественно локально у нас ничего не проявляется (мы бы уж заметили такое во время тестирования).
Клиент все больш… twitter.com/i/web/status/1…
15:32Нашел тред на Микрософтовском форуме с заголовком "Creators Update causing Java crashes" и точно таким же развалом… twitter.com/i/web/status/1…
15:35GodFolder - это такая странная фича в Windows: создаешь папку, называешь ее именем GodMode.{ED7BA470-8E54-465E-825C… twitter.com/i/web/status/1…
15:40Терять было нечего, другого я все равно предложить ничего не мог.
Написал клиенту, спросил нет ли у него случайно… twitter.com/i/web/status/1…
15:43Представляете, в каком мы оба с клиентом были шоке, когда оказалось, что
а) да, папка у него есть
б) ее удаление л… twitter.com/i/web/status/1…
Оказалось, что проблема в нативе sun.awt.shell.Win32ShellFolder2 (мы переиспользуем его версию из JDK).… twitter.com/i/web/status/1…
15:51В нативе на это никто никогда не расcчитывал, просто начинали это значение использовать (передавать в другой систем… twitter.com/i/web/status/1…
15:54в Oracle это тоже заметили (хотя и не с таким эпичным сценарием): bugs.openjdk.java.net/browse/JDK-817… …
они зафиксали натив, а… twitter.com/i/web/status/1…
15:59вообще, у меня сложные отношения с этой историей, т.к. пост про нее в блоге просто натурально уронил наш сайт (тот… twitter.com/i/web/status/1…
16:04но с другой стороны, это весело, чего уж :)
А божья папка теперь стала таким локальным мемом про Windows (и про че… twitter.com/i/web/status/1…
16:08@backendsecret А ещё они иногда благодарят за классный продукт и/или классный саппорт — вот это греет больше всего!17:02
@backendsecret помнится @mraleph если не ошибаюсь рассказывал как в саппорте дебагали по телефону, потому что досту… twitter.com/i/web/status/1…
о, а я этой истории не слышал!
вообще, клиенты в саппорте очень часто предлагают созвониться, чтобы быстрее решить… twitter.com/i/web/status/1…
17:10Теперь давайте не такую веселую историю.
Недавно отлаживал жесткую проблему в саппорте: приложение клиентов креша… twitter.com/i/web/status/1…
17:29Непонятно было просто ни-че-го. Самые бесполезные хипдампы и крешлоги, которые я видел. Что за развал, по какому пр… twitter.com/i/web/status/1…
17:30Я копал это несколько месяцев (с учетом всяких переговоров типа "пришлите нам приложение, иначе мы точно не отладим… twitter.com/i/web/status/1…
17:32Виноватой оказалась мелкая библиотечка из их зависимостей, которая (сюрприз-сюрприз) использовала JNA для определен… twitter.com/i/web/status/1…
17:33В этой библиотеке было два класса, у каждого из которых был метод finalize, в котором освобождалась (одна и та же)… twitter.com/i/web/status/1…
17:37В результате, взорвется приложение или нет, зависело от:
1) Момента, когда приходит GC,
2) Порядка обхода финализи… twitter.com/i/web/status/1…
У нас с Хотспотом порядок обхода разный: для обработки f-reachables у них стек используется, у нас очередь (в спеке… twitter.com/i/web/status/1…
17:42О, слушайте, всегда хотел такой опрос провести.
Вы используете finalize() в своем Java коде? Если да, напишите, по… twitter.com/i/web/status/1…
17:56Вообще, неприятно в саппорте сталкиваться с ситуацией, когда у нас крешается, а на HS работает (хотя не должно, бли… twitter.com/i/web/status/1…
18:06в целом то это хорошо, быстрее получается раскопать проблему в клиентском коде, но вот объяснить это им бывает непр… twitter.com/i/web/status/1…
18:10Была у нас пара забавных историй с клиентами, которые все понимают дословно.
Например, один раз позвонили клиенту,… twitter.com/i/web/status/1…
18:15В другой раз нам самим позвонили из компании клиентов и спросили, когда же им уже доставят Java машину?
После наши… twitter.com/i/web/status/1…
18:19Этому правда способствовала вот такая картинка на сайте. Ну и то, что покупку поручили секретарю. Интересно, цена и… twitter.com/i/web/status/1…
18:22Еще люблю в саппорте чуваков, которые случайно выдают, что используют JET незаконно
Недавно обращался товарищ, кот… twitter.com/i/web/status/1…
18:28Еще в саппорт часто пишут крутые хакеры, которые говорят, что наш code protection - это полная фигня, и сейчас они… twitter.com/i/web/status/1…
18:34ну и конечно, какой тред по баги из саппорта без упоминания sun.misc.Unsafe.
с полгода назад в саппорт начали масс… twitter.com/i/web/status/1…
22:20Стали разбираться, выяснилось, что для сериализации там во всю используется Unsafe (что в целом довольно логично, е… twitter.com/i/web/status/1…
22:22а оффсет этот там получался методом sun.misc.Unsafe.objectFieldOffset().
Но никто ведь не обещал, что этот оффсет… twitter.com/i/web/status/1…
22:24В JET в некоторых случаях так и происходило. Нам нужна была пара битов в оффсетах для своих внутренних целей, мы их… twitter.com/i/web/status/1…
22:25Я что-то так расстроился из-за этого, что пошел и сделал pull request в Kryo (github.com/EsotericSoftwa…) с подробным… twitter.com/i/web/status/1…
22:28Вообще, с Unsafe у нас, конечно, бывают проблемы, но в целом мы вынуждены его полноценно поддерживать.
Даже не сто… twitter.com/i/web/status/1…
22:34Кстати, у @pjBooms и @Mikhvan был крутой совместный доклад про истории из саппорта. Он почти не пересекается с тем,… twitter.com/i/web/status/1…
22:40# Суббота 21 твит
давайте немного исторических баек)
Сейчас мы очень строго соблюдаем JVM спецификацию.
При разработке любой фичи ил… twitter.com/i/web/status/1…
Когда-то давно на заре JET, была такая дополнительная фича - JetPerfect (появилась в 2000 году)
Хотелось:
а) умен… twitter.com/i/web/status/1…
21:06Для этого:
1) Статически смотрим, что явно используется в приложении,
2) Делаем тестовый прогон, чтобы учесть неяв… twitter.com/i/web/status/1…
Закрытый мир - это очень заманчиво, т.к. позволяет делать куда более агрессивные оптимизации
Это такой запретный п… twitter.com/i/web/status/1…
21:12Ну а размер был вообще впечатляющим: SWT приложение (гуевое) после компиляции JetPerfect влезало на дискету (!), т.… twitter.com/i/web/status/1…
21:15Конечно, за это все приходилось платить: далеко не все приложения в таком режиме работали (но мы предупреждали). А… twitter.com/i/web/status/1…
21:18Саппорт пользователей JetPerfect был отдельной песней.
Например, была такая история, которая теперь передается из п… twitter.com/i/web/status/1…
Клиент с десктопным приложением очень хотел использовать JetPerfect.
Он честно отказался от динамической загрузки и… twitter.com/i/web/status/1…
Отправляет он собранное приложение своим клиентам, ему начинает прилетать множество гневных отзывов о том, что каки… twitter.com/i/web/status/1…
21:22Оказалось, что на машине, где он собирал приложение была мышка без колесика (да, это было давно). Поэтому, понятно,… twitter.com/i/web/status/1…
21:24У другого клиента была игра на Java, с несколькими уровнями. Он хотел использовать JetPerfect, сделал тестовый прог… twitter.com/i/web/status/1…
21:28В общем, в таком виде JetPerfect прожил не очень долго, поддерживать его было просто нереально, несмотря на все оче… twitter.com/i/web/status/1…
21:29Зато из этого выросла текущая фича, которая называется Global Optimizer.
Идея где-то такая же, только работает по… twitter.com/i/web/status/1…
А чтобы побороть проблему размера .exe придумали еще одну (работающую по спеке) технологию, которую назвали Java Ru… twitter.com/i/web/status/1…
21:32..а сложить на какой-нибудь web сервер в виде архива. Если вдруг они понадобятся вашему приложению, оно их скачает,… twitter.com/i/web/status/1…
21:34Сейчас размер .exe - это уже не так важно, так что slim-down задепрекейчен и частично выкинут.
Кроме того, для вос… twitter.com/i/web/status/1…
21:36Кроме закрытости мира, конечно, сначала пробовали нарушать спеку в плане клинитов (в смысле static initializer).
В… twitter.com/i/web/status/1…
21:41конкретнее: заранее инициализировали значения статических полей. Вроде мелочь, но этого уже хватало, чтобы не работ… twitter.com/i/web/status/1…
21:46Еще необычные штуки из прошлого: у нас очень долгое время не было такой распространенной штуки, как safe-points. Т.… twitter.com/i/web/status/1…
21:54safe-points мы добавили 4 года назад, а до этого:
21:57это на самом деле очень нетипично, обычно никто даже не знает, какую в сумме просадку производительности дают safe-… twitter.com/i/web/status/1…
21:59# Воскресенье 53 твита
@backendsecret Подробнее про уменьшение размера Java приложений, технические детали про JetPerfect (алгоритм) есть… twitter.com/i/web/status/1…8:41
В последний свой вечер хочу рассказать про не совсем технические темы: как у нас появляются новые сотрудники, немно… twitter.com/i/web/status/1…
19:14Много спрашивали, откуда мы берем новых JVM-инженеров. Действительно, открытых вакансий именно в проект JET нигде н… twitter.com/i/web/status/1…
19:16Каждый год (иногда два раза в год) мы открываем набор на стажировку.
Любой желающий может попробовать свои силы в… twitter.com/i/web/status/1…
19:20На практике чаще всего свои силы пробуют студенты НГУ (хотя бывали случаи, когда пробовались и выпускники)
Этому с… twitter.com/i/web/status/1…
19:24В результате через все этапы отбора проходит 1-2 человека (бывало и больше, но последнее время так). Обычно это сту… twitter.com/i/web/status/1…
19:28Стажировка состоит из нескольких этапов:
Сначала стажер получает какую-нибудь интересную компиляторную/рантаймовск… twitter.com/i/web/status/1…
19:29Стажер все осмысляет, пишет реферат - документ (на русском), в котором объясняет суть проблемы, придуманные на данн… twitter.com/i/web/status/1…
19:31Следующий этап обучения: сделать новую фичу в JET. Необязательно большую, но обязательно приносящую реальную пользу… twitter.com/i/web/status/1…
19:35Третий этап: стажер получает тему для ресерча, которым в основном будет заниматься до конца стажировки. Т.к. стажер… twitter.com/i/web/status/1…
19:39Здесь уточню, что какие-то решения для этой проблемы уже могут существовать (и зачастую так и есть).
Но, как я уже… twitter.com/i/web/status/1…
19:42Далее стажер работает над своей задачей: придумывает алгоритмы, реализовывает прототипы на базе JET, собирает данны… twitter.com/i/web/status/1…
19:46Масштаб здесь уже гораздо больше - это может быть целый класс оптимизаций или, например, новый алгоритм GC.
На ка… twitter.com/i/web/status/1…
19:47Не любой ресерч можно (и нужно) сразу продуктизировать. Если нет, то он консервируется до лучших времен
Но зачасту… twitter.com/i/web/status/1…
19:51Такая стажировка занимает больше года, выдерживают далеко не все.
Но те, кто справился, набирают необходимое количе… twitter.com/i/web/status/1…
@backendsecret Помню свои первые ревью. Десяток итераций по 20-30 замечаний. Но ценность ревью начинаешь понимать т… twitter.com/i/web/status/1…19:55
В стажировку инвестируется очень много времени инженеров из команды, но по-другому никак.
Нельзя просто дать челов… twitter.com/i/web/status/1…
20:04Я помню стажировку, как такое постепенное (и довольно долгое, я вообще не очень быстро соображаю) пробуждение: когд… twitter.com/i/web/status/1…
20:11помню как-то пришел за советом к опытному инженеру, с одним из первых своих серьезных багов в рантайме. К тому врем… twitter.com/i/web/status/1…
20:21на мой удивленный вопрос "как ты это сделал???", он посмеялся и ответил, что 10 лет назад у него тоже были такие же… twitter.com/i/web/status/1…
20:24Такие навыки требуют действительного большого опыта и контекста.
Именно поэтому так круто, что старшие уделяют тако… twitter.com/i/web/status/1…
Вот такой у нас альтернативный подход к рекрутингу: вместо того, чтобы искать сотрудников, мы их "выращиваем из про… twitter.com/i/web/status/1…
20:38что обычно делают компании на стендах конференциях? дают задачки, чтобы люди их порешали, заодно собирают контакты.… twitter.com/i/web/status/1…
20:41в результате люди приходили, слушали про всякую техническую жесть в задачах, вспоминали ассемблер, злились, почему… twitter.com/i/web/status/1…
20:44Кстати, разбор задач тогда опубликовали на хабре (это редкость, наши публикации обычно на английском), поэтому може… twitter.com/i/web/status/1…
20:47Кстати, еще по поводу стажеров и их дипломных работ.
Вот список тем дипломов, только последних лет еще нет.… twitter.com/i/web/status/1…
Теперь немного истории. У вас мог возникнуть вопрос, как так получилось, что наша JVM разрабатывается в Новосибирск… twitter.com/i/web/status/1…
20:59Вы возможно слышали, что в 60-ых годах прошлого века часть всемирно известных советских ученых решили основать нову… twitter.com/i/web/status/1…
21:05Одним из этих великих ученых, был Андрей Петрович Ершов. Про него, кстати, уже довольно подробно писал… twitter.com/i/web/status/1…
21:09Ершов был автором первых в мире статей об оптимизирующих компиляторах, о data-flow анализе и основателем отдельной… twitter.com/i/web/status/1…
21:13Эта компиляторная школа продолжает жить, этим объясняется концентрация в академе соответствующих разработок, в том… twitter.com/i/web/status/1…
21:23При чем эту связь очень легко проследить.
Вот, например, @noinline - наш главный компиляторщик а также научрук… twitter.com/i/web/status/1…
21:35Ну и небольшая предыстория самого проекта JET, чтобы было понятно, откуда взялся легаси Oberon код, например, и воо… twitter.com/i/web/status/1…
21:41Дедушка JET'а - проект Сократ - создавался в конце 80х - начале 90х и имел целью супер-оптимизацию спутникового соф… twitter.com/i/web/status/1…
21:42Отец JET'a - проект XDS - набор средств разработки для языков Oberon-2/Modula-2 (трансляторы в C, статические компи… twitter.com/i/web/status/1…
21:43В этом списке, в частности, можно найти парочку работ @mraleph twitter.com/backendsecret/…21:44
Наконец сам проект JET начался в 97-ом году, когда на базе XDS стали делать статический компилятор для Java (изнача… twitter.com/i/web/status/1…
21:45Первый релиз состоялся в 2000г, а сертификация произошла только в 2005 году. Про всякие незаконные эксперименты со… twitter.com/i/web/status/1…
21:48Про историю JET-а есть такой замечательный, хотя и короткий доклад, аж 2011 года. Качество записи там так себе, кон… twitter.com/i/web/status/1…
22:01кстати, это еще одна особенность Excelsior. CTO у нас - не какой-то абстрактный начальник, но JVM-инженер, при чем… twitter.com/i/web/status/1…
22:15...а еще он отличный научрук (@mraleph, @roaccess, ваш покорный слуга и другие - были именно его студентами) и преп… twitter.com/i/web/status/1…
22:19кстати, глядя на это выступление в далеком 2011 (и будучи как раз стажером), я подумал, как же это круто рассказыва… twitter.com/i/web/status/1…
22:23Так, мое время здесь истекло 30 минут назад, поэтому буду закругляться. Последняя небольшая тема, которую хочу осве… twitter.com/i/web/status/1…
22:30Excelsior - это удивительное место, где вы можете прикоснуться к самому передовому краю JVM науки, реализовать идею… twitter.com/i/web/status/1…
22:39В результате у всех работающих здесь людей есть общие интересы: JVM, компиляторы, рантаймы, языкостроение и т.д. Эт… twitter.com/i/web/status/1…
22:43Но этим все не ограничивается, в результате мы становимся единомышленниками и это распространяется дальше, чем прос… twitter.com/i/web/status/1…
22:46Читали "понедельник начинается в субботу" Стругацких?
Вот у нас где-то такая же атмосфера, только вместо магии у н… twitter.com/i/web/status/1…
22:48...и особенно это становится похоже, когда приходишь поработать на выходных (не потому, что нужно, а потому, что ин… twitter.com/i/web/status/1…
22:57Открытка @pjBooms, @dbg_nsk, @noinline и компании: pic.twitter.com/4kXSBuljfc
о, опять ломатели пришли, я же говорил twitter.com/shipilev/statu…
23:00Пару ссылок напоследок.
Мы время от времени публикуем новые истории про JET в своем техническом блоге (он правда н… twitter.com/i/web/status/1…
23:13в самом Excelsior кроме JET-а есть и другие классные и наукоемкие проекты, прочитать про них можно, например, вот з… twitter.com/i/web/status/1…
23:19ну и если вы студент (желательно из Нск), интересуетесь JVM и компиляторами и думаете, где бы получить опыт и знани… twitter.com/i/web/status/1…
23:26На этом все. Спасибо всем, кто помогал мне на этой неделе, без вас бы не справился.
И спасибо большое всем, кто чи… twitter.com/i/web/status/1…
23:37# Ссылки
other
- http://excelsiorjet.com/
- https://javadeobfuscator.com/
- https://itnext.io/java-is-still-free-c02aef8c9e04
- http://jdk.java.net/11/
- https://github.com/dsyer/spring-boot-startup-bench
- https://github.com/EsotericSoftware/kryo/issues/593
- https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html
- http://sun.awt.shell/
- https://bugs.openjdk.java.net/browse/JDK-8179014