@inponomarev
Иван Пономарёв, КУРС/МФТИ
![]() |
|
Лекции
Семинарские занятия
Домашние работы
Баллы за сдачу ДЗ определяют финальную оценку
https://bit.ly/java21-join (Telegram MIPT. Java-2021)
![]() | ![]() | ![]() |
Cay S. Horstmann. Core Java vol 1 & 2
Raoul-Gabriel Urma et al. Modern Java in Action
![]() | ![]() |
Joshua Bloch Effective Java
Brian Goetz et al. Java Concurrency in Practice
number of search engine results for queries containing the name of the language
covers searches in Google, Google Blogs, MSN, Yahoo!, Baidu, Wikipedia and YouTube
reflects the number of skilled engineers, courses and jobs worldwide
GitHub & StackOverflow
JDK 1.0 (January 23, 1996) | -- 6-monthly release cadence --
JDK 1.1 (February 19, 1997) | Java SE 10 (March 20, 2018)
J2SE 1.2 (December 8, 1998) | Java SE 11 LTS (September 25, 2018)
J2SE 1.3 (May 8, 2000) | Java SE 12 (March 19, 2019)
J2SE 1.4 (February 6, 2002) | Java SE 13 (September 17, 2019)
J2SE 5.0 (September 30, 2004) | Java SE 14 (March 17, 2020)
Java SE 6 (December 11, 2006) | Java SE 15 (September 15, 2020)
-- Sun acquisition by Oracle-- | Java SE 16 (March 16, 2021)
Java SE 7 (July 28, 2011) | Java SE 17 LTS (September 14, 2021)
Java SE 8 (March 18, 2014) | Java SE 18 (March 22, 2022)
Java SE 9 (September 21, 2017) | Java SE 19 (September 20, 2022)
| Java SE 20 (due to in March 2023)
| Java SE 21 LTS (due to in September 2023)
Cay Horstmann Feature evolution in Java 13 and beyond
![]() |
|
Q&A with James Gosling, June 2020: https://www.youtube.com/watch?v=XThhlihqTXI
Как бы вы реализовали WORA?
Endianness…
Размер регистров…
Апплеты
Built-in security
Но Security сделать оказалось непросто
Апплеты не пошли (победил JavaScript)
Desktop (?)
Embedded Systems
Server-side (backend)
Mobile Devices (Android) — отдельная история (see Google vs. Oracle case)
WORA + Две взаимосвязанные задачи:
Безопасность
Исключение фатальных сбоев на сервере
Генерируем байт-код, верифицируем и исполняем его в безопасной среде
int i = 2;
i = ++i + ++i + ++i;
Java — 12,
C — undefined behaviour
(https://stackoverflow.com/questions/3879176/i-i-i-in-java-vs-c)
NullPointerException
ArrayIndexOutOfBoundsException
Reference implementation: Oracle HotSpot
~ 20 реализаций
Byte code, интерпретация и JIT-компиляция.
Garbage Collection
MultiThreading & Memory Model
Загрузка и исполнение кода в runtime
Рефлексия
Стандартная библиотека
There are no operand stack overflows or underflows.
All local variable uses and stores are valid.
The arguments to all the Java Virtual Machine instructions are of valid types.
Разработчику не нужно заботиться о высвобождении памяти
Ссылок на объект нет? — garbage collection
Достоинства:
Меньше кода
Не бывает некорректных ссылок (на разрушенный объект)
Меньше утечек памяти
Недостатки:
Не контролируем время работы GC
STW-паузы (бывает, в неподходящий момент)
Reference counting — циклы?
Mark & sweep
Гипотеза поколений
Serial (for single-threaded, client environments)
Parallel (default)
CMS (Concurrent mark and Sweep — shorter pauses, share processor resources)
G1 (Garbage First — big heaps)
Shenandoah (submillisecond pauses)
Epsilon (no GC)
Возможность запуска параллельных потоков выполнения встроена в язык с первой версии (Thread
, Runnable
etc)
JDK 1.5: существенные дополнения (executor, semaphore, mutex, barrier, latches, concurrent collections, blocking queues)
JDK 1.7: ForkJoinPool
(work-stealing technique)
JDK 1.8: CompletableFuture
Будущее: Project Loom: lightweight user-mode threads (fibers)
Memory Model: часть спецификации VM: модель того, как работает хранилище данных
Отвечает на вопрос: «какие значения может прочитать конкретный read в программе?»
class DumbWayToFallAsleep implements Runnable {
private boolean asleep;
public void setAsleep(boolean asleep){
this.asleep = asleep;
}
@Override
public void run() {
while (!asleep){
//countSomeSheep
//УСНЁМ ЛИ МЫ?
}
}
}
class NotSoDumbWayToFallAsleep implements Runnable {
private volatile boolean asleep;
public void setAsleep(boolean asleep){
this.asleep = asleep;
}
@Override
public void run() {
while (!asleep){
//countSomeSheep
//...
}
}
}
Скомпилированный байт-код класса может быть доставлен на любую систему в runtime (чаще всего «подкладыванием файла» на файловую систему).
Пересборка/линковка не требуется.
Идея, в начале казавшаяся очень хорошей!
Исследование информации о классах, полях, методах и т. д. во время выполнения
Чтение/модификация полей (в том числе private!) и динамический вызов методов (в том числе private!)
Proxy и AOP
Cay Horstmann Feature evolution in Java 13 and beyond
Независимая от системы часть
Структуры данных
Математика
Зависимая от системы часть
Дата и время
Доступ к файловой системе
Доступ к сети
Пользовательский интерфейс
Любой, как угодно давно скомпилированный .jar-файл может быть запущен на любой современной JVM
Дар или проклятие?
lambdas & functional programming,
modules,
compact strings,
type inference,
switch expressions,
pattern matching,
records…
Project Amber: productivity-oriented features
Project Loom: fibers & continuators
Project Valhalla: value types & generic specialization
Graal, Panama, Kulla, Sumatra…
Алексей Шипилёв, 2015: The Lord of the Strings: Two Scours
Тагир Валеев, 2018: Pattern matching и его воображаемые друзья
Сергей Куксенко, 2020: Valhalla is coming
Сергей Куксенко, 2020: Java threads are losing weight, performance review of Project Loom
Есть виртуальная машина — можно компилировать из любого языка!
20-30 языков
Специально созданные: Groovy, Scala, Kotlin…
Реимплементация для JVM: JRuby, Nashorn/Graal.js…
https://jaxenter.com/wp-content/uploads/2017/03/Pirates-of-the-JVM-JAXenter-768x4245.png
Бибилиотеки и фреймворки (в т. ч. для тестирования)
Среды разработки
Системы сборки
CI
модульное тестирование и автоматизация тестов
DI container and application framework,
|
|
|
XML-конфигурация, Maven project layout, Maven Central
Groovy/Kotlin DSL
JUGs (Москва, Санкт-Петербург, Новосибирск)
Conferences (Joker, JPoint)
Приходите на московский JUG (когда закончится пандемия)
OCA/OCP
Cборка и запуск jar-файла