Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
УМНЫЙ	КОМПИЛЯТОР	
В	JAVA	9:
НАСКОЛЬКО	ОН	УМЁН?
Сергей	Петунин
«Глупый» javac:	что	с	ним	не	так?
• Каждый	раз	стартует	JVM
• Каждый	раз	начинает	с	чистого	листа
• Не	особо	использует	мн...
«Умный»	sjavac:	что	он	умеет?
• Держит	javac в	памяти
• Инкрементальный
• Многопоточный
Но	ведь	уже	есть…
maven-compiler-plugin	3.1+:	
• useIncrementalCompilation=true
• …или	false?	J
• Параллельная	сборка	моду...
import dao.Dao;
public class Service {
private Dao dao = new Dao();
}
package dao;
public class Dao {
public Dao {}
}
Но	в...
package dao;
public class Dao {
public Dao
throws Exception{}
}
Но	ведь	уже	есть…
maven-compiler-plugin	3.1+:	
• useIncrem...
Gradle 2.1+:	options.incremental = true
• Кроме	временных	меток	и	байткода,	
анализирует	исходники
• До	сих	пор	в	статусе	...
ECJ	— Eclipse	Compiler	for	Java
• Изначально	инкрементальный
• Используется	в	Apache	Tomcat,	Liferay,	IntelliJ	IDEA
• Для	...
• Не	заменяют	Java	Specification	Requests	(JSR)
• Развитие	инфраструктуры	JDK
• Обкатка	идей	перед	включением	в	JSR
JDK	En...
JEP-139
• Обёртка	над	javac
• Использование	серверного	процесса
• Использование	множества	ядер
• Отслеживание	изменений	в	...
JEP-139
JEP-199:	sjavac,	phase	two
sjavac:	начало
8004658:	Add	internal	smart	javac	wrapper	to	solve	JEP	193 ohrstrom 18.01.2013
Fredrik	Öhrström's	blog
• Клиент	— стартует	каждый	раз	при	вызове	sjavac
• Сервер	— стартует	один	раз	и	висит	в	памяти	до	
определённого	периода	б...
5
-d
dest
-sourcepath
src
-implicit:none
SjavacClient
STDOUT:Compiling
STDOUT:Invoking
STDERR:Error…
RC:-1
SjavacServer
Пр...
socket javacIdleResetSjavac PooledSjavac SjavacImpl
Архитектура	сервера
package demo;
import demo.dao.Dao;
public class Service {
private Dao dao = new Dao();
}
package demo.dao;
public class Da...
M :demo
P :demo
S C src/demo/Service.java 1457184790000
D S demo.Service -> demo.Service
D S demo.Service -> demo.dao.Dao
...
Корректно	обрабатывает	ситуации:
Инкрементальная	компиляция
package dao;
public class Dao {
public Dao
throws Exception{}
...
• Не	более	3	параллельных	задач	компиляции
• 8800	классов	в	JDK
• 1.5	ГБ	для 64-bit	JDK ->	175	кб/класс
• 1	ГБ	для	32-bit	...
Компиляция:
Dao.java
Service.java
Компиляция:
Dao.java
Компиляция:
Utils.java
Запись:
Service.class
Запись:
Dao.class
Запи...
src
out
javac_statejavac_server
sjavac
SjavacClient SjavacServer
Ресурсы	умного	компилятора
-tr .properties=com.centreit.demo.PropertiesTransformer,debug=true
ключ расширение класс-трансформер extra
Трансформеры
public interface Transformer {
boolean transform(CompilationService sjavac,
Map<String,Set<URI>> pkgSrcs,
Set<URI> visible...
Javac:
$ find src -name "*.java" > sources.txt
$ javac @sources.txt
Sjavac:
$ sjavac -d out src
Рекурсивный	обход	папок
• Держит	javac	в	памяти,	но:
• не	рассчитан	на	работу	в	качестве	полноценного	
сервера
• Инкреметальный,	но:
• берёт	на	се...
Компилятор real user sys
javac 10.701 44.394 1.670
Sjavac,	с	нуля,
не «прогретый»
10.866 0.433 0.072
Sjavac,	без изменений...
Когда	уже?
• http://openjdk.java.net/projects/jdk9/ — проект	OpenJDK 9
• http://openjdk.java.net/jeps/139 — JEP	139:	Enhance	javac to...
Спасибо	за	внимание!
Сергей	Петунин
руководитель	отдела	прототипирования
Sergey.Petunin@centre-it.com
@forketyfork
forkety...
Upcoming SlideShare
Loading in …5
×

Умный компилятор в Java 9: насколько он умён?

502 views

Published on

Доклад на конференции DUMP 8 апреля 2016 г.

Published in: Software
  • Be the first to comment

Умный компилятор в Java 9: насколько он умён?

  1. 1. УМНЫЙ КОМПИЛЯТОР В JAVA 9: НАСКОЛЬКО ОН УМЁН? Сергей Петунин
  2. 2. «Глупый» javac: что с ним не так? • Каждый раз стартует JVM • Каждый раз начинает с чистого листа • Не особо использует многоядерность
  3. 3. «Умный» sjavac: что он умеет? • Держит javac в памяти • Инкрементальный • Многопоточный
  4. 4. Но ведь уже есть… maven-compiler-plugin 3.1+: • useIncrementalCompilation=true • …или false? J • Параллельная сборка модулей
  5. 5. import dao.Dao; public class Service { private Dao dao = new Dao(); } package dao; public class Dao { public Dao {} } Но ведь уже есть… maven-compiler-plugin 3.1+: • useIncrementalCompilation=true
  6. 6. package dao; public class Dao { public Dao throws Exception{} } Но ведь уже есть… maven-compiler-plugin 3.1+: • useIncrementalCompilation=true import dao.Dao; public class Service { private Dao dao = new Dao(); }
  7. 7. Gradle 2.1+: options.incremental = true • Кроме временных меток и байткода, анализирует исходники • До сих пор в статусе «incubating» public class Constants { public static final int ANSWER = 42; } Но ведь уже есть…
  8. 8. ECJ — Eclipse Compiler for Java • Изначально инкрементальный • Используется в Apache Tomcat, Liferay, IntelliJ IDEA • Для инкрементальности нужна обвязка в виде IDE или системы сборки • Java 8 —март 2014, ECJ 4.4 — июнь 2014 Но ведь уже есть…
  9. 9. • Не заменяют Java Specification Requests (JSR) • Развитие инфраструктуры JDK • Обкатка идей перед включением в JSR JDK Enhancement Proposals
  10. 10. JEP-139 • Обёртка над javac • Использование серверного процесса • Использование множества ядер • Отслеживание изменений в пакетах и зависимостях • Инкрементальная компиляция
  11. 11. JEP-139
  12. 12. JEP-199: sjavac, phase two
  13. 13. sjavac: начало 8004658: Add internal smart javac wrapper to solve JEP 193 ohrstrom 18.01.2013
  14. 14. Fredrik Öhrström's blog
  15. 15. • Клиент — стартует каждый раз при вызове sjavac • Сервер — стартует один раз и висит в памяти до определённого периода бездействия • Клиент и сервер находят друг друга через порт-файл • Клиент и сервер должны быть на одной машине Клиент-серверная архитектура
  16. 16. 5 -d dest -sourcepath src -implicit:none SjavacClient STDOUT:Compiling STDOUT:Invoking STDERR:Error… RC:-1 SjavacServer Протокол обмена
  17. 17. socket javacIdleResetSjavac PooledSjavac SjavacImpl Архитектура сервера
  18. 18. package demo; import demo.dao.Dao; public class Service { private Dao dao = new Dao(); } package demo.dao; public class Dao {} package demo.utils; public class Utils {} Зависимости и публичный API
  19. 19. M :demo P :demo S C src/demo/Service.java 1457184790000 D S demo.Service -> demo.Service D S demo.Service -> demo.dao.Dao I TYPE public demo.Service I METHOD public void <init>() A sjavac_dest/demo/Service.class 1457184791000 Timestamp класса Публичный API Зависимости Timestamp исходника Модуль Пакет База данных компилятора javac_state
  20. 20. Корректно обрабатывает ситуации: Инкрементальная компиляция package dao; public class Dao { public Dao throws Exception{} } import dao.Dao; public class Service { private Dao dao = new Dao(); } public class Constants { public static final int ANSWER = 42; }
  21. 21. • Не более 3 параллельных задач компиляции • 8800 классов в JDK • 1.5 ГБ для 64-bit JDK -> 175 кб/класс • 1 ГБ для 32-bit JDK -> 119 кб/класс • Если не уместились — запускаем компиляцию в одном потоке • Разбиваем код на чанки по числу параллельных компиляций • Сортируем чанки по числу зависимостей • -implicit=none Распараллеливание и эвристика
  22. 22. Компиляция: Dao.java Service.java Компиляция: Dao.java Компиляция: Utils.java Запись: Service.class Запись: Dao.class Запись: Utils.class Chunk 3 Utils.java Chunk 2 Dao.java Chunk 1 Service.java -implicit:none
  23. 23. src out javac_statejavac_server sjavac SjavacClient SjavacServer Ресурсы умного компилятора
  24. 24. -tr .properties=com.centreit.demo.PropertiesTransformer,debug=true ключ расширение класс-трансформер extra Трансформеры
  25. 25. public interface Transformer { boolean transform(CompilationService sjavac, Map<String,Set<URI>> pkgSrcs, Set<URI> visibleSources, Map<String,Set<String>> oldPackageDependencies, URI destRoot, Map<String,Set<URI>> packageArtifacts, Map<String, Map<String, Set<String>>> packageDependencies, Map<String, Map<String, Set<String>>> packageCpDependencies, Map<String, PubApi> packagePublicApis, Map<String, PubApi> dependencyApis, int debugLevel, boolean incremental, int numCores); void setExtra(String e); void setExtra(Options args); } Трансформеры
  26. 26. Javac: $ find src -name "*.java" > sources.txt $ javac @sources.txt Sjavac: $ sjavac -d out src Рекурсивный обход папок
  27. 27. • Держит javac в памяти, но: • не рассчитан на работу в качестве полноценного сервера • Инкреметальный, но: • берёт на себя задачи системы сборки — необходима интеграция • Многопоточный, но: • эвристика построена на исходниках JDK • пока ещё много «двойной работы» «Умный» sjavac: итоги
  28. 28. Компилятор real user sys javac 10.701 44.394 1.670 Sjavac, с нуля, не «прогретый» 10.866 0.433 0.072 Sjavac, без изменений 0.709 0.205 0,042 Sjavac, с нуля, «прогретый» 6.564 0.471 0.067 Цифры: компиляция langtools
  29. 29. Когда уже?
  30. 30. • http://openjdk.java.net/projects/jdk9/ — проект OpenJDK 9 • http://openjdk.java.net/jeps/139 — JEP 139: Enhance javac to Improve Build Speed • http://openjdk.java.net/jeps/199 — JEP 199: Smart Java Compilation, Phase Two • http://fredrikohrstrom.blogspot.com — Fredrik Öhrström's blog Ссылки
  31. 31. Спасибо за внимание! Сергей Петунин руководитель отдела прототипирования Sergey.Petunin@centre-it.com @forketyfork forketyfork

×