dbg_nsk

29 октября 2018, Новосибирск, Россия

# Понедельник 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:16

3) я сам рантаймщик, поэтому возможен перекос в сторону рассказа про кишки рантайма. Но я буду стараться такого не… twitter.com/i/web/status/1…

11:17

Отлично, поехали! Сначала пара слов о том, кто мы, что делаем, и что же это за JVM такая.

11:24

Excelsior - российская компания, базируется в Новосибирском Академгородке. У нас много интересных проектов (про нек… 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…

11:49

И еще один опрос конкретно для 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…

16:14

Уточню: речь пойдет про компиляцию байткода в нативный код до исполнения. Понятно, что исходный 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…

16:50

Вообще, у Никиты @pjBooms Липского есть отличный доклад по поводу таких мифов. Ему уже несколько лет, но он все еще… twitter.com/i/web/status/1…

16:52
@backendsecret >честно говоря, не понимаю, почему здесь возникают сомнения
Например вы по байткоду поняли, что поле… twitter.com/i/web/status/1…

Но это ведь вопрос корректности оптимизаций, а не реализации рефлексии.
Обычно аргумент у людей в том, что непонятн… twitter.com/i/web/status/1…

16:56
@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:46

C 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…

21:00
@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:58

Oracle 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…

12:18

Во-вторых, кроме 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…

12:48

Сегодня в качестве опросов давайте посмотрим, какие билды 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…

16:34

Вообще, кажется, любой, кто со мной говорил на Joker знает, что я хейчу javac, возможно я с этим немного перегибаю.… twitter.com/i/web/status/1…

16:41
@backendsecret а ведь был ещё такой jikes, который не только компилял, но и учил уму-разуму...
16:47
@backendsecret Самое интересное не написал.
Что недавно в этом коде был найден и пофиксан баг, поэтому взор "молодо… twitter.com/i/web/status/1…
16:53

Что еще хорошо в компиляторах на 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…

18:13

но это, конечно, трудно сделать без 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…

21:22

В общем, баги в 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…

14:34

Да, мы не сможем заметить изменение характера исполнения и подстроиться под это на лету, как это делает 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…

14:54

в результате сделали свой профайлер, прям встроенный в 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…

17:57

Кажется, чего тут делать: просто смотрим, что именно изменилось и только это перекомпилируем.

Но все сильно усложн… 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…

15:17

В любом случае, послушать, что люди думают о продукте, что их беспокоит, чего не хватает - это очень отрезвляет и о… 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:35

GodFolder - это такая странная фича в 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…

15:45

Оказалось, что проблема в нативе 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…

17:40

У нас с Хотспотом порядок обхода разный: для обработки 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…

21:02

Когда-то давно на заре JET, была такая дополнительная фича - JetPerfect (появилась в 2000 году)

Хотелось:

а) умен… twitter.com/i/web/status/1…

21:06

Для этого:

1) Статически смотрим, что явно используется в приложении,
2) Делаем тестовый прогон, чтобы учесть неяв… twitter.com/i/web/status/1…

21:09

Закрытый мир - это очень заманчиво, т.к. позволяет делать куда более агрессивные оптимизации

Это такой запретный п… 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…

21:19

Клиент с десктопным приложением очень хотел использовать JetPerfect.
Он честно отказался от динамической загрузки и… twitter.com/i/web/status/1…

21:21

Отправляет он собранное приложение своим клиентам, ему начинает прилетать множество гневных отзывов о том, что каки… 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…

21:31

А чтобы побороть проблему размера .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:54

safe-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…

19:55
@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…

20:30

Вот такой у нас альтернативный подход к рекрутингу: вместо того, чтобы искать сотрудников, мы их "выращиваем из про… 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…

20:50

Теперь немного истории. У вас мог возникнуть вопрос, как так получилось, что наша 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:30

Excelsior - это удивительное место, где вы можете прикоснуться к самому передовому краю 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