Upload
it-people
View
113
Download
1
Embed Size (px)
Citation preview
УМНЫЙКОМПИЛЯТОРВJAVA9:
НАСКОЛЬКООНУМЁН?
СергейПетунин
«Глупый» javac:чтоснимнетак?
• КаждыйразстартуетJVM
• Каждыйразначинаетсчистоголиста
• Неособоиспользуетмногоядерность
«Умный»sjavac:чтоонумеет?
• Держитjavac впамяти
• Инкрементальный
• Многопоточный
Новедьужеесть…
maven-compiler-plugin3.1+:
• useIncrementalCompilation=true
• …илиfalse?J
• Параллельнаясборкамодулей
import dao.Dao;
public class Service {
private Dao dao = new Dao();
}
package dao;
public class Dao {
public Dao {}
}
Новедьужеесть…
maven-compiler-plugin3.1+:
• useIncrementalCompilation=true
package dao;
public class Dao {
public Dao throws Exception{}
}
Новедьужеесть…
maven-compiler-plugin3.1+:
• useIncrementalCompilation=true
import dao.Dao;
public class Service {
private Dao dao = new Dao();
}
Gradle 2.1+:options.incremental = true
• Кромевременныхметокибайткода,
анализируетисходники
• Досихпорвстатусе«incubating»
public class Constants {
public static final int ANSWER = 42;
}
Новедьужеесть…
ECJ— EclipseCompilerforJava
• Изначальноинкрементальный
• ИспользуетсявApacheTomcat,Liferay,IntelliJIDEA
• ДляинкрементальностинужнаобвязкаввидеIDE
илисистемысборки
• Java8—март2014,ECJ4.4— июнь2014
Новедьужеесть…
• НезаменяютJavaSpecificationRequests(JSR)
• РазвитиеинфраструктурыJDK
• ОбкаткаидейпередвключениемвJSR
JDKEnhancementProposals
JEP-139
• Обёртканадjavac
• Использованиесерверногопроцесса
• Использованиемножестваядер
• Отслеживаниеизмененийвпакетах
изависимостях
• Инкрементальнаякомпиляция
JEP-139
JEP-199:sjavac,phasetwo
sjavac:начало
8004658:AddinternalsmartjavacwrappertosolveJEP193 ohrstrom 18.01.2013
FredrikÖhrström'sblog
• Клиент— стартуеткаждыйразпривызовеsjavac
• Сервер— стартуетодинразивиситвпамятидо
определённогопериодабездействия
• Клиентисервернаходятдругдругачерезпорт-файл
• Клиентисервердолжныбытьнаодноймашине
Клиент-сервернаяархитектура
5-d dest-sourcepathsrc-implicit:none
SjavacClient
STDOUT:CompilingSTDOUT:InvokingSTDERR: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 Dao {}
package demo.utils;
public class Utils {}
ЗависимостиипубличныйAPI
M :demoP :demoS C src/demo/Service.java 1457184790000D S demo.Service -> demo.ServiceD S demo.Service -> demo.dao.DaoI TYPE public demo.ServiceI METHOD public void <init>()A sjavac_dest/demo/Service.class 1457184791000
Timestampкласса
ПубличныйAPI
Зависимости
Timestampисходника
МодульПакет
Базаданныхкомпилятора
javac_state
Корректнообрабатываетситуации:
Инкрементальнаякомпиляция
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;
}
• Неболее3параллельныхзадачкомпиляции• 8800классоввJDK• 1.5ГБдля 64-bitJDK ->175кб/класс• 1ГБдля32-bitJDK ->119кб/класс• Еслинеуместились— запускаемкомпиляциюводномпотоке• Разбиваемкодначанки почислупараллельныхкомпиляций• Сортируемчанки почислузависимостей• -implicit=none
Распараллеливаниеиэвристика
Компиляция:Dao.java
Service.java
Компиляция:Dao.java
Компиляция:Utils.java
Запись:Service.class
Запись:Dao.class
Запись:Utils.class
Chunk3
Utils.java
Chunk2
Dao.java
Chunk1
Service.java
-implicit:none
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> 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);
}
Трансформеры
Javac:$ find src -name "*.java" > sources.txt$ javac @sources.txt
Sjavac:$ sjavac -d out src
Рекурсивныйобходпапок
• Держитjavacвпамяти,но:• нерассчитаннаработувкачествеполноценного
сервера• Инкреметальный,но:• берётнасебязадачисистемысборки— необходима
интеграция• Многопоточный,но:• эвристикапостроенанаисходникахJDK• покаещёмного«двойнойработы»
«Умный»sjavac:итоги
Компилятор 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
Когдауже?
• http://openjdk.java.net/projects/jdk9/— проектOpenJDK 9• http://openjdk.java.net/jeps/139— JEP139:Enhancejavac toImproveBuildSpeed• http://openjdk.java.net/jeps/199— JEP199:SmartJavaCompilation,PhaseTwo• http://fredrikohrstrom.blogspot.com— FredrikÖhrström's blog
Ссылки
Спасибозавнимание!
СергейПетунинруководительотделапрототипирования
[email protected]@forketyforkforketyfork