Умный компилятор в java 9: насколько он умён? Сергей...

31
УМНЫЙ КОМПИЛЯТОР В JAVA 9: НАСКОЛЬКО ОН УМЁН? Сергей Петунин

Upload: it-people

Post on 20-Feb-2017

109 views

Category:

Internet


1 download

TRANSCRIPT

Page 1: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

УМНЫЙКОМПИЛЯТОРВJAVA9:

НАСКОЛЬКООНУМЁН?

СергейПетунин

Page 2: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

«Глупый» javac:чтоснимнетак?

• КаждыйразстартуетJVM

• Каждыйразначинаетсчистоголиста

• Неособоиспользуетмногоядерность

Page 3: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

«Умный»sjavac:чтоонумеет?

• Держитjavac впамяти

• Инкрементальный

• Многопоточный

Page 4: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

Новедьужеесть…

maven-compiler-plugin3.1+:

• useIncrementalCompilation=true

• …илиfalse?J

• Параллельнаясборкамодулей

Page 5: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

import dao.Dao;

public class Service {

private Dao dao = new Dao();

}

package dao;

public class Dao {

public Dao {}

}

Новедьужеесть…

maven-compiler-plugin3.1+:

• useIncrementalCompilation=true

Page 6: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

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();

}

Page 7: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

Gradle 2.1+:options.incremental = true

• Кромевременныхметокибайткода,

анализируетисходники

• Досихпорвстатусе«incubating»

public class Constants {

public static final int ANSWER = 42;

}

Новедьужеесть…

Page 8: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

ECJ— EclipseCompilerforJava

• Изначальноинкрементальный

• ИспользуетсявApacheTomcat,Liferay,IntelliJIDEA

• ДляинкрементальностинужнаобвязкаввидеIDE

илисистемысборки

• Java8—март2014,ECJ4.4— июнь2014

Новедьужеесть…

Page 9: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

• НезаменяютJavaSpecificationRequests(JSR)

• РазвитиеинфраструктурыJDK

• ОбкаткаидейпередвключениемвJSR

JDKEnhancementProposals

Page 10: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

JEP-139

• Обёртканадjavac

• Использованиесерверногопроцесса

• Использованиемножестваядер

• Отслеживаниеизмененийвпакетах

изависимостях

• Инкрементальнаякомпиляция

Page 11: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

JEP-139

Page 12: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

JEP-199:sjavac,phasetwo

Page 13: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

sjavac:начало

8004658:AddinternalsmartjavacwrappertosolveJEP193 ohrstrom 18.01.2013

Page 14: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

FredrikÖhrström'sblog

Page 15: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

• Клиент— стартуеткаждыйразпривызовеsjavac

• Сервер— стартуетодинразивиситвпамятидо

определённогопериодабездействия

• Клиентисервернаходятдругдругачерезпорт-файл

• Клиентисервердолжныбытьнаодноймашине

Клиент-сервернаяархитектура

Page 16: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

5-d dest-sourcepathsrc-implicit:none

SjavacClient

STDOUT:CompilingSTDOUT:InvokingSTDERR:Error…RC:-1

SjavacServer

Протоколобмена

Page 17: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

socket javacIdleResetSjavac PooledSjavac SjavacImpl

Архитектурасервера

Page 18: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

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

Page 19: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

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

Page 20: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

Корректнообрабатываетситуации:

Инкрементальнаякомпиляция

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;

}

Page 21: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

• Неболее3параллельныхзадачкомпиляции• 8800классоввJDK• 1.5ГБдля 64-bitJDK ->175кб/класс• 1ГБдля32-bitJDK ->119кб/класс• Еслинеуместились— запускаемкомпиляциюводномпотоке• Разбиваемкодначанки почислупараллельныхкомпиляций• Сортируемчанки почислузависимостей• -implicit=none

Распараллеливаниеиэвристика

Page 22: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

Компиляция: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

Page 23: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

src

out

javac_statejavac_server

sjavac

SjavacClient SjavacServer

Ресурсыумногокомпилятора

Page 24: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

-tr .properties=com.centreit.demo.PropertiesTransformer,debug=true

ключ расширение класс-трансформер extra

Трансформеры

Page 25: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

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);

}

Трансформеры

Page 26: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

Javac:$ find src -name "*.java" > sources.txt$ javac @sources.txt

Sjavac:$ sjavac -d out src

Рекурсивныйобходпапок

Page 27: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

• Держитjavacвпамяти,но:• нерассчитаннаработувкачествеполноценного

сервера• Инкреметальный,но:• берётнасебязадачисистемысборки— необходима

интеграция• Многопоточный,но:• эвристикапостроенанаисходникахJDK• покаещёмного«двойнойработы»

«Умный»sjavac:итоги

Page 28: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

Компилятор 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

Page 29: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

Когдауже?

Page 30: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

• 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

Ссылки

Page 31: Умный компилятор в Java 9: насколько он умён? Сергей Петунин, Центр ИТ

Спасибозавнимание!

СергейПетунинруководительотделапрототипирования

[email protected]@forketyforkforketyfork