Андрей Акиньшин

24
Подружили CLR и JVM в Project Rider Андрей Акиньшин Software Developer JetBrains

Upload: codefest

Post on 13-Apr-2017

371 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Андрей Акиньшин

Подружили CLR и JVM в Project Rider

АндрейАкиньшин

SoftwareDeveloper

JetBrains

Page 2: Андрей Акиньшин

Время перемен

Page 3: Андрей Акиньшин

2006 год

Page 4: Андрей Акиньшин

ReSharper

• Тысячи анализов и инспекций• Сотни рефакторингов• Крутые навигация и поиск• Форматирование и чистка кода• Кодогенерация на все случаи• C#, VB.NET, ASP.NET, JS• Сотни тысяч пользователей

Page 5: Андрей Акиньшин

IntelliJ IDEA

Page 6: Андрей Акиньшин

Project Rider = +

WindowsMac OS

Linux

Первые 90% продукта было готово до официального начала разработки.И вообще, мы уже 15 лет этот продукт пишем.

Page 7: Андрей Акиньшин

Kotlin

• Java interoperability• Null safety• Unchecked exceptions• Extension functions• Operator overloading• String interpolation• Zero-overhead lambdas• Pattern matching• Smart casts Можно писать в старом Java-стиле

Можно писать в новом функциональном стилеМожно легко делать DSL

Page 8: Андрей Акиньшин

Архитектурная схема

© eyezmaze.com

Andrey Akinshin
Page 9: Андрей Акиньшин

Волшебный протокол

Buzzwords:• Less• DRY• Async• Reactive

C# Model Kotlin Model

Andrey Akinshin
Page 10: Андрей Акиньшин

Как это работает

*И не забыть про порядок

Пользователь Frontend (IDEA) Backend (R#)

Alt+Enter Запускаем “Alt+Enter” ActionГотовим список действий

Создаём ViewModel

Отправка Alt+Enter

Показываем Popup

Inline VariableОтправка

Inline Variable Запускаем “Inline” ActionМеняем документ

Формируем ChangesПоказываем

новый документ

Но вот только всё это работает в 10 потоков, а порядок иногда лучше бы сохранять.

Page 11: Андрей Акиньшин

Дедупликация строк

Flag=0 Len=5 H E L L O

Flag=1 ID=#1 Len=5 R I D E R

Flag=2 ID=#1

Len=5 H E L L OБыло:

Стало:

Проблема:По протоколу летает много строк

Решение:Дедупликация

Обыкновенная строчка (95%)

Дедуплицируем строчку (5%)

(Вероятностная)

Пересылаем только ID

Page 12: Андрей Акиньшин

КешированиеОбычная C# IDE Rider

Page 13: Андрей Акиньшин

R# на Mono: Проблемы, Часть 1

• COM & WPF Хозяйке на заметкуCOM и WPF как-то не очень работают на Linux и MacOS.

Их нужно выпилить,но при этом не сломать R#.

Page 14: Андрей Акиньшин

R# на Mono: Проблемы, Часть 2

• Unmanaged code Хозяйке на заметкуЕсли структура не blittable,то MS.NET и Mono могут создавать разныйmemory layout

Page 15: Андрей Акиньшин

R# на Mono: Проблемы, Часть 3

• \r\n vs \n Хозяйке на заметкуR# использует \r\n, а IDEA — \n

А ещё, был у нас Python-скрипт, в конце строк которого оказывались \r,а в строках были пути,вот и собирай после этого под Windows…

Page 16: Андрей Акиньшин

R# на Mono: Проблемы, Часть 4

• XBuild ≠ MSBuild Хозяйке на заметкуXBuild при чтении csproj любит заменять обратные слеши на прямые.Остерегайтесь регулярных выражений прямо в csproj!

Page 17: Андрей Акиньшин

R# на Mono: Очень много проблем

• ParseFloatLiteral и неожиданный вызов внутриOleAut32Dll.VarR8FromStr

• Ограничение на длину имени файла в UnzipFileInfonew StringBuilder(128) → new StringBuilder(1024)

• Пустой AppDomainSetup.ConfigurationFile"Could not allocate -6 bytes"

• Guid.NewGuid внутри финалайзеровRNGCryptoServiceProvider из-за которого вешался AppDomain

Поэтому у нас своё Mono с блекджеком и шлюхами

Page 18: Андрей Акиньшин

CLR vs JVM: Примитивные типыТип CLR JVMGuid MS GUID Structure RFC 4122

Int Short Short

Byte Byte Byte Byte Byte Byte Byte Byte

Byte Byte Byte Byte Byte Byte Byte Byte

Byte Byte Byte Byte Byte Byte Byte Byte

Page 19: Андрей Акиньшин

CLR vs JVM: Примитивные типыТип CLR JVMGuid MS GUID Structure RFC 4122

Date 00:00:00 January 1, 0001 A.D.1 tick = 100ns

00:00:00 January 1, 1970 A.D.1 tick = 1ms

Int Short Short

Byte Byte Byte Byte Byte Byte Byte Byte

Byte Byte Byte Byte Byte Byte Byte Byte

Byte Byte Byte Byte Byte Byte Byte Byte

Page 20: Андрей Акиньшин

CLR vs JVM: Примитивные типыТип CLR JVMGuid MS GUID Structure RFC 4122

Date 00:00:00 January 1, 0001 A.D.1 tick = 100ns

00:00:00 January 1, 1970 A.D.1 tick = 1ms

Byte [0..255] [-128..127]

Int Short Short

Byte Byte Byte Byte Byte Byte Byte Byte

Byte Byte Byte Byte Byte Byte Byte Byte

Byte Byte Byte Byte Byte Byte Byte Byte

Page 21: Андрей Акиньшин

CLR vs JVM: Примитивные типыТип CLR JVMGuid MS GUID Structure RFC 4122

Date 00:00:00 January 1, 0001 A.D.1 tick = 100ns

00:00:00 January 1, 1970 A.D.1 tick = 1ms

Byte [0..255] [-128..127]Uri > new Uri("http://code/ fest")

http://code/ fest> URI("http://code/ fest")java.net.URISyntaxException: Illegal character

Int Short Short

Byte Byte Byte Byte Byte Byte Byte Byte

Byte Byte Byte Byte Byte Byte Byte Byte

Byte Byte Byte Byte Byte Byte Byte Byte

Page 22: Андрей Акиньшин

Как будем тестировать?

А ещё у нас есть своя рекордилка тестов =)

Page 23: Андрей Акиньшин

Rider — отличная .NET IDE

www.jetbrains.com/rider@jetbrainsrider

Page 24: Андрей Акиньшин

@andrey_akinshin

АндрейАкиньшин

SoftwareDeveloper

JetBrains

Вопросы?

http://aakinshin.net/

[email protected]