23
Компилятор Java и IDE: взаимовыгодное сотрудничество Чашников Николай программист, JetBrains [email protected]

Java compilers and IDEs

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Java compilers and IDEs

Компилятор Java и IDE:взаимовыгодное сотрудничество

Чашников Николайпрограммист, JetBrains

[email protected]

Page 2: Java compilers and IDEs

Компиляция java-файла – это просто

> javac HelloWorld.java

HelloWorld.class

HelloWorld.java

Page 3: Java compilers and IDEs

Даже если их несколько

> javac *.java

> mvn compile

> ant -f compile.xml

Page 4: Java compilers and IDEs

http://xkcd.ru/303

Page 5: Java compilers and IDEs

I'm working on a big project and am having a really difficult time getting Intellij to build it. Sometimes it finishes after 20 or so minutes, sometimes never.

I know this is an issue for my entire company, but people have become complacent and accept that their IDE will remain locked for hours.

Page 6: Java compilers and IDEs

Build is extremely slow

The compilation takes ~4 seconds to complete

Page 7: Java compilers and IDEs

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

Перекомпилировать изменившиеся файлыи некоторые другие

Page 8: Java compilers and IDEs

Добавление поля в классpublic class Cat {}

public class Cat { protected Tail tail;}

Что надо перекомпилировать, кроме Cat.java?A. ничегоB. классы, в которых

используется CatC. наследников класса CatD. что-то другое

Page 9: Java compilers and IDEs

Добавление поля в класс…Tail tail = new Tail();new Cat() { { tail.pull(); }};…

Page 10: Java compilers and IDEs

Добавление private поля в классpublic class Cat extends Animal {}

public class Cat extends Animal { private Tail tail;}

Что надо перекомпилировать, кроме Cat.java?A. ничегоB. классы, в которых

используется CatC. наследников класса CatD. что-то другое

Page 11: Java compilers and IDEs

Добавление private поля в класс

…Cat cat = new Cat();cat.tail.pull();…

public class Animal { public Tail tail;}

Page 12: Java compilers and IDEs

Изменение значения поляpublic class Answers { public static int ANSWER = 42;}

Что надо перекомпилировать, кроме Answers.java?A. ничегоB. классы, в которых

используется ANSWERC. наследников класса

AnswersD. что-то другоеpublic class Answers {

public static int ANSWER = 43;}

Page 13: Java compilers and IDEs

Изменение значения static final поляpublic class Answers { public static final int ANSWER = 42;}

Что надо перекомпилировать, кроме Answers.java?A. ничегоB. классы, в которых

используется ANSWERC. наследников класса

AnswersD. что-то другоеpublic class Answers {

public static final int ANSWER = 43;}

Page 14: Java compilers and IDEs

Изменение значения static final поля

public class Questions { public int getAnswer() { return Answers.ANSWER; }}

Page 15: Java compilers and IDEs

Компилятор и IDE

Компилятор

IDE

...рефакторингисправление ошибокавтодополнениесинтаксический разборпроверка корректностигенерация байт-кода

Page 16: Java compilers and IDEs

Индексирование в IDE

Подготовительная операция для быстрого выполнения Find Usages и рефакторингов

Page 17: Java compilers and IDEs

Eclipse

● собственный компилятор (ECJ)● запускается прямо в процессе IDE● IDE переиспользует код компилятора● индексирование и компиляция

запускается при сохранении файлов● компилятор сам собирает информацию

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

Page 18: Java compilers and IDEs

NetBeans

● использует javac● запускается прямо в процессе IDE● IDE переиспользует код компилятора● индексирование (компиляция) постоянно

запускается в фоне● для инкрементальной компиляции

используется информация из IDE

Page 19: Java compilers and IDEs

IntelliJ IDEA

● может работать как с javac, так и с ECJ● использует компилятор как чёрный ящик● запускает его в отдельном процессе● собственный парсер и анализатор в IDE● независимое индексирование● для инкрементальной компиляции

анализируются класс-файлы и используется информация из IDE

Page 20: Java compilers and IDEs

Скомпилируется ли этот код?class Root {}class Inc<Z> {}class C0<X> extends Inc<Inc<? super X>> {}class Test { Inc<? super C0<Root>> cast(C0<Inc<? super Root>> c) { return c; }}

Page 21: Java compilers and IDEs

А этот?class Root {}class Inc<Z> {}class C0<X> extends Inc<Inc<? super X>> {}class C1<X> extends C0<C0<X>> { }class Test { Inc<? super C1<Root>> cast(C1<Inc<? super Root>> c) { return c; }}

Page 22: Java compilers and IDEs

Вот этот уже нетclass Root {}class Inc<Z> {}class C0<X> extends Inc<Inc<? super X>> {}class C1<X> extends C0<C0<X>> { }class C2<X> extends C1<C1<X>> { }class C3<X> extends C2<C2<X>> { }class C4<X> extends C3<C3<X>> { }class C5<X> extends C4<C4<X>> { }class C6<X> extends C5<C5<X>> { }class C7<X> extends C6<C6<X>> { }class C8<X> extends C7<C7<X>> { }class C9<X> extends C8<C8<X>> { }class Test { Inc<? super C9<Root>> cast(C9<Inc<? super Root>> c) { return c; }}

Page 23: Java compilers and IDEs

Ссылки

● Eclipse sourcesgit.eclipse.org/c/jdt/

● NetBeans sourcesnetbeans.org/downloads/zip.html

● IntelliJ IDEA sourcesjetbrains.org/display/IJOS/Download