Андрей Акиньшин
TRANSCRIPT
Подружили CLR и JVM в Project Rider
АндрейАкиньшин
SoftwareDeveloper
JetBrains
Время перемен
2006 год
ReSharper
• Тысячи анализов и инспекций• Сотни рефакторингов• Крутые навигация и поиск• Форматирование и чистка кода• Кодогенерация на все случаи• C#, VB.NET, ASP.NET, JS• Сотни тысяч пользователей
IntelliJ IDEA
Project Rider = +
WindowsMac OS
Linux
Первые 90% продукта было готово до официального начала разработки.И вообще, мы уже 15 лет этот продукт пишем.
Kotlin
• Java interoperability• Null safety• Unchecked exceptions• Extension functions• Operator overloading• String interpolation• Zero-overhead lambdas• Pattern matching• Smart casts Можно писать в старом Java-стиле
Можно писать в новом функциональном стилеМожно легко делать DSL
Архитектурная схема
© eyezmaze.com
Волшебный протокол
Buzzwords:• Less• DRY• Async• Reactive
C# Model Kotlin Model
Как это работает
*И не забыть про порядок
Пользователь Frontend (IDEA) Backend (R#)
Alt+Enter Запускаем “Alt+Enter” ActionГотовим список действий
Создаём ViewModel
Отправка Alt+Enter
Показываем Popup
Inline VariableОтправка
Inline Variable Запускаем “Inline” ActionМеняем документ
Формируем ChangesПоказываем
новый документ
Но вот только всё это работает в 10 потоков, а порядок иногда лучше бы сохранять.
Дедупликация строк
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
КешированиеОбычная C# IDE Rider
R# на Mono: Проблемы, Часть 1
• COM & WPF Хозяйке на заметкуCOM и WPF как-то не очень работают на Linux и MacOS.
Их нужно выпилить,но при этом не сломать R#.
R# на Mono: Проблемы, Часть 2
• Unmanaged code Хозяйке на заметкуЕсли структура не blittable,то MS.NET и Mono могут создавать разныйmemory layout
R# на Mono: Проблемы, Часть 3
• \r\n vs \n Хозяйке на заметкуR# использует \r\n, а IDEA — \n
А ещё, был у нас Python-скрипт, в конце строк которого оказывались \r,а в строках были пути,вот и собирай после этого под Windows…
R# на Mono: Проблемы, Часть 4
• XBuild ≠ MSBuild Хозяйке на заметкуXBuild при чтении csproj любит заменять обратные слеши на прямые.Остерегайтесь регулярных выражений прямо в csproj!
R# на Mono: Очень много проблем
• ParseFloatLiteral и неожиданный вызов внутриOleAut32Dll.VarR8FromStr
• Ограничение на длину имени файла в UnzipFileInfonew StringBuilder(128) → new StringBuilder(1024)
• Пустой AppDomainSetup.ConfigurationFile"Could not allocate -6 bytes"
• Guid.NewGuid внутри финалайзеровRNGCryptoServiceProvider из-за которого вешался AppDomain
Поэтому у нас своё Mono с блекджеком и шлюхами
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
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
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
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
Как будем тестировать?
А ещё у нас есть своя рекордилка тестов =)
Rider — отличная .NET IDE
www.jetbrains.com/rider@jetbrainsrider
@andrey_akinshin
АндрейАкиньшин
SoftwareDeveloper
JetBrains
Вопросы?
http://aakinshin.net/