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

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

  • Upload
    -

  • View
    370

  • Download
    0

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