SlideShare a Scribd company logo
Подружили CLR и JVM в
Project Rider
Андрей
Акиньшин
Software
Developer
JetBrains
Время перемен
2006 год
ReSharper
• Тысячи анализов и инспекций
• Сотни рефакторингов
• Крутые навигация и поиск
• Форматирование и чистка кода
• Кодогенерация на все случаи
• C#, VB.NET, ASP.NET, JS
• Сотни тысяч пользователей
IntelliJ IDEA
Project Rider = +
Windows
Mac 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
• rn vs n
Хозяйке на заметку
R# использует rn, а IDEA — n
А ещё, был у нас Python-скрипт,
в конце строк которого оказывались r,
а в строках были пути,
вот и собирай после этого под
Windows…
R# на Mono: Проблемы, Часть 4
• XBuild ≠ MSBuild
Хозяйке на заметку
XBuild при чтении csproj любит
заменять обратные слеши на
прямые.
Остерегайтесь регулярных
выражений прямо в csproj!
R# на Mono: Очень много проблем
• ParseFloatLiteral и неожиданный вызов внутри
OleAut32Dll.VarR8FromStr
• Ограничение на длину имени файла в UnzipFileInfo
new StringBuilder(128) → new StringBuilder(1024)
• Пустой AppDomainSetup.ConfigurationFile
"Could not allocate -6 bytes"
• Guid.NewGuid внутри финалайзеров
RNGCryptoServiceProvider из-за которого вешался AppDomain
Поэтому у нас своё Mono с блекджеком и шлю
CLR vs JVM: Примитивные типы
Тип CLR JVM
Guid 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 JVM
Guid 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 JVM
Guid 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 JVM
Guid 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
Андрей
Акиньшин
Software
Developer
JetBrains
Вопросы?
http://aakinshin.net/
andrey.akinshin@gmail.com

More Related Content

What's hot

Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Fuenteovejuna
 
Как собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикКак собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффик
Andrew Minkin
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
SQALab
 
Марат Абдуллин "Хроники серверного Жаваскрипта"
Марат Абдуллин "Хроники серверного Жаваскрипта"Марат Абдуллин "Хроники серверного Жаваскрипта"
Марат Абдуллин "Хроники серверного Жаваскрипта"
Yandex
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
Roman Grebennikov
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
Roman Grebennikov
 
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт АндрейDUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
it-people
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
CodeFest
 
Coro - реальные потоки в Perl
Coro - реальные потоки в PerlCoro - реальные потоки в Perl
Coro - реальные потоки в Perl
Ilya Zelenchuk
 
Макс Лапшин - "EventMachine и evented архитектура"
Макс Лапшин - "EventMachine и evented архитектура"Макс Лапшин - "EventMachine и evented архитектура"
Макс Лапшин - "EventMachine и evented архитектура"
railsclub
 
Cборка мусора в Java без пауз (HighLoad++ 2013)
Cборка мусора в Java без пауз  (HighLoad++ 2013)Cборка мусора в Java без пауз  (HighLoad++ 2013)
Cборка мусора в Java без пауз (HighLoad++ 2013)
aragozin
 
IronRuby: внутренности и примеры использования
IronRuby: внутренности и примеры использованияIronRuby: внутренности и примеры использования
IronRuby: внутренности и примеры использования
Alexander Byndyu
 
Erlang, который мы потеряли
Erlang, который мы потерялиErlang, который мы потеряли
Erlang, который мы потеряли
Ivan Grishaev
 
Erlang мгновенное просветление
Erlang  мгновенное просветлениеErlang  мгновенное просветление
Erlang мгновенное просветление
Maxim Sokhatsky
 
"Кроссплатформенный .NET и как там дела с Mono и CoreCLR" Акиньшин Андрей, Je...
"Кроссплатформенный .NET и как там дела с Mono и CoreCLR" Акиньшин Андрей, Je..."Кроссплатформенный .NET и как там дела с Mono и CoreCLR" Акиньшин Андрей, Je...
"Кроссплатформенный .NET и как там дела с Mono и CoreCLR" Акиньшин Андрей, Je...
it-people
 
PythonGuI+PyQT
PythonGuI+PyQTPythonGuI+PyQT
PythonGuI+PyQT
kostaNew
 
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
Alex Chistyakov
 

What's hot (19)

Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
 
Как собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикКак собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффик
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
 
Марат Абдуллин "Хроники серверного Жаваскрипта"
Марат Абдуллин "Хроники серверного Жаваскрипта"Марат Абдуллин "Хроники серверного Жаваскрипта"
Марат Абдуллин "Хроники серверного Жаваскрипта"
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
 
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт АндрейDUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Coro - реальные потоки в Perl
Coro - реальные потоки в PerlCoro - реальные потоки в Perl
Coro - реальные потоки в Perl
 
Макс Лапшин - "EventMachine и evented архитектура"
Макс Лапшин - "EventMachine и evented архитектура"Макс Лапшин - "EventMachine и evented архитектура"
Макс Лапшин - "EventMachine и evented архитектура"
 
Cборка мусора в Java без пауз (HighLoad++ 2013)
Cборка мусора в Java без пауз  (HighLoad++ 2013)Cборка мусора в Java без пауз  (HighLoad++ 2013)
Cборка мусора в Java без пауз (HighLoad++ 2013)
 
IronRuby: внутренности и примеры использования
IronRuby: внутренности и примеры использованияIronRuby: внутренности и примеры использования
IronRuby: внутренности и примеры использования
 
Erlang, который мы потеряли
Erlang, который мы потерялиErlang, который мы потеряли
Erlang, который мы потеряли
 
Erlang мгновенное просветление
Erlang  мгновенное просветлениеErlang  мгновенное просветление
Erlang мгновенное просветление
 
"Кроссплатформенный .NET и как там дела с Mono и CoreCLR" Акиньшин Андрей, Je...
"Кроссплатформенный .NET и как там дела с Mono и CoreCLR" Акиньшин Андрей, Je..."Кроссплатформенный .NET и как там дела с Mono и CoreCLR" Акиньшин Андрей, Je...
"Кроссплатформенный .NET и как там дела с Mono и CoreCLR" Акиньшин Андрей, Je...
 
PythonGuI+PyQT
PythonGuI+PyQTPythonGuI+PyQT
PythonGuI+PyQT
 
Rails for dummies
Rails for dummiesRails for dummies
Rails for dummies
 
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
 

Viewers also liked

Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметику
Andrey Akinshin
 
.NET 2015: Будущее рядом
.NET 2015: Будущее рядом.NET 2015: Будущее рядом
.NET 2015: Будущее рядом
Andrey Akinshin
 
Низкоуровневые оптимизации .NET-приложений
Низкоуровневые оптимизации .NET-приложенийНизкоуровневые оптимизации .NET-приложений
Низкоуровневые оптимизации .NET-приложений
Andrey Akinshin
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NET
Andrey Akinshin
 
Сборка мусора в .NET
Сборка мусора в .NETСборка мусора в .NET
Сборка мусора в .NET
Andrey Akinshin
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
Andrey Akinshin
 
Поговорим о различных версиях .NET
Поговорим о различных версиях .NETПоговорим о различных версиях .NET
Поговорим о различных версиях .NET
Andrey Akinshin
 
Phd presentation
Phd presentationPhd presentation
Phd presentation
Andrey Akinshin
 
Практические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложенийПрактические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложений
Andrey Akinshin
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
Andrey Akinshin
 
Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?
Andrey Akinshin
 
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Andrey Akinshin
 
Let’s talk about microbenchmarking
Let’s talk about microbenchmarkingLet’s talk about microbenchmarking
Let’s talk about microbenchmarking
Andrey Akinshin
 
Основы работы с Git
Основы работы с GitОсновы работы с Git
Основы работы с Git
Andrey Akinshin
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложений
Andrey Akinshin
 
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
 Теория и практика .NET-бенчмаркинга (25.01.2017, Москва) Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
Andrey Akinshin
 
Поговорим про арифметику
Поговорим про арифметикуПоговорим про арифметику
Поговорим про арифметику
Andrey Akinshin
 
Evaluation question 3 – what have you learnt
Evaluation question 3 – what have you learntEvaluation question 3 – what have you learnt
Evaluation question 3 – what have you learnt
Tomcull18
 
Institutional Net Lease Fund, Summary Information
Institutional Net Lease Fund, Summary InformationInstitutional Net Lease Fund, Summary Information
Institutional Net Lease Fund, Summary Information
David Wrubel
 
sherif cv E
sherif cv Esherif cv E
sherif cv E
Sherif Elmozy
 

Viewers also liked (20)

Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметику
 
.NET 2015: Будущее рядом
.NET 2015: Будущее рядом.NET 2015: Будущее рядом
.NET 2015: Будущее рядом
 
Низкоуровневые оптимизации .NET-приложений
Низкоуровневые оптимизации .NET-приложенийНизкоуровневые оптимизации .NET-приложений
Низкоуровневые оптимизации .NET-приложений
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NET
 
Сборка мусора в .NET
Сборка мусора в .NETСборка мусора в .NET
Сборка мусора в .NET
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Поговорим о различных версиях .NET
Поговорим о различных версиях .NETПоговорим о различных версиях .NET
Поговорим о различных версиях .NET
 
Phd presentation
Phd presentationPhd presentation
Phd presentation
 
Практические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложенийПрактические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложений
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?
 
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
 
Let’s talk about microbenchmarking
Let’s talk about microbenchmarkingLet’s talk about microbenchmarking
Let’s talk about microbenchmarking
 
Основы работы с Git
Основы работы с GitОсновы работы с Git
Основы работы с Git
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложений
 
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
 Теория и практика .NET-бенчмаркинга (25.01.2017, Москва) Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
 
Поговорим про арифметику
Поговорим про арифметикуПоговорим про арифметику
Поговорим про арифметику
 
Evaluation question 3 – what have you learnt
Evaluation question 3 – what have you learntEvaluation question 3 – what have you learnt
Evaluation question 3 – what have you learnt
 
Institutional Net Lease Fund, Summary Information
Institutional Net Lease Fund, Summary InformationInstitutional Net Lease Fund, Summary Information
Institutional Net Lease Fund, Summary Information
 
sherif cv E
sherif cv Esherif cv E
sherif cv E
 

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

SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NET
lugnsk
 
доклад про Llvm
доклад про Llvmдоклад про Llvm
доклад про Llvm
Vadim Evard
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
Alexander Syrotenko
 
Server Side Javascript (ru)
Server Side Javascript (ru)Server Side Javascript (ru)
Server Side Javascript (ru)
Bakyt Niyazov
 
Реклама со скоростью света (DMP-платформа), Сергей Жемжицкий (Clever Data)
Реклама со скоростью света (DMP-платформа), Сергей Жемжицкий (Clever Data)Реклама со скоростью света (DMP-платформа), Сергей Жемжицкий (Clever Data)
Реклама со скоростью света (DMP-платформа), Сергей Жемжицкий (Clever Data)
Ontico
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Sergey Platonov
 
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
AvitoTech
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Ontico
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
Alexander Syrotenko
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
SQALab
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentation
sef2009
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
Andrey Karpov
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
Pavel Tsukanov
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
Alex Tutubalin
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
Alex Tutubalin
 
JavaScript завтра
JavaScript завтраJavaScript завтра
JavaScript завтра
Sergey Rubanov
 
JavaScript завтра / Сергей Рубанов (Exante Limited)
JavaScript завтра / Сергей Рубанов  (Exante Limited)JavaScript завтра / Сергей Рубанов  (Exante Limited)
JavaScript завтра / Сергей Рубанов (Exante Limited)
Ontico
 

Similar to Подружили CLR и JVM в Project Rider (20)

SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NET
 
доклад про Llvm
доклад про Llvmдоклад про Llvm
доклад про Llvm
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 
Server Side Javascript (ru)
Server Side Javascript (ru)Server Side Javascript (ru)
Server Side Javascript (ru)
 
Реклама со скоростью света (DMP-платформа), Сергей Жемжицкий (Clever Data)
Реклама со скоростью света (DMP-платформа), Сергей Жемжицкий (Clever Data)Реклама со скоростью света (DMP-платформа), Сергей Жемжицкий (Clever Data)
Реклама со скоростью света (DMP-платформа), Сергей Жемжицкий (Clever Data)
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentation
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
 
Async Python
Async PythonAsync Python
Async Python
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
 
JavaScript завтра
JavaScript завтраJavaScript завтра
JavaScript завтра
 
JavaScript завтра / Сергей Рубанов (Exante Limited)
JavaScript завтра / Сергей Рубанов  (Exante Limited)JavaScript завтра / Сергей Рубанов  (Exante Limited)
JavaScript завтра / Сергей Рубанов (Exante Limited)
 

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

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