overleaf compability + finished docker

This commit is contained in:
Ivan I. Ovchinnikov 2022-08-23 23:56:37 +03:00
parent 794a9bd60a
commit 3e1f0389cd
10 changed files with 1089 additions and 1139 deletions

Binary file not shown.

View File

@ -1,14 +1,13 @@
\immediate\write18{texcount -sum -1 j-spec.tex > /tmp/wordcount.tex} \immediate\write18{texcount -sum -1 -inc j-spec.tex > /tmp/wordcount.tex}
%\immediate\write18{texcount -sum -1 scenarios/jc-1-c.tex > /tmp/wordcount.tex}
\documentclass[12pt, a4paper]{report}
\usepackage[english,russian]{babel} % локализация и переносы
\input{main-style-preamble} \documentclass[a4paper,12pt]{article}
\input{fancy-listings-preamble} \usepackage[english,russian]{babel}
\input{settings/main-style-preamble}
\input{settings/fancy-listings-preamble}
\graphicspath{{./pics/}} \graphicspath{{./pics/}}
\title{Техническая специализация Java\\\small{(1. Java Core)}}
\title{Специализация Java}
\author{Иван Игоревич Овчинников} \author{Иван Игоревич Овчинников}
\date{\today{} (\DTMcurrenttime)} \date{\today{} (\DTMcurrenttime)}
@ -19,411 +18,9 @@
\tableofcontents \tableofcontents
\pagestyle{plain} \pagestyle{plain}
\chapter{Java Core} \newpage
%\chapter{Java Core}
\section{Платформа: история и окружение} \subfile{jtc1-1a}
\subsection{В этом разделе}
Краткая история (причины возникновения); инструментарий, выбор версии; CLI; структура проекта; документирование; некоторые интересные способы сборки проектов.
В этом разделе происходит первое знакомство со внутреннем устройством языка Java и фреймворком разработки приложений с его использованием. Рассматривается примитивный инструментарий и базовые возможности платформы для разработки приложений на языке Java. Разбирается структура проекта, а также происходит ознакомление с базовым инструментарием для разработки на Java.
\begin{itemize}
\item \nom{JDK}{(от англ. Java Development Kit) — комплект разработчика приложений на языке Java, включающий в себя компилятор, стандартные библиотеки классов, примеры, документацию, различные утилиты и исполнительную систему. В состав JDK не входит интегрированная среда разработки на Java, поэтому разработчик, использующий только JDK, вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки.}
\item \nom{JRE}{(от англ. Java Runtime Environment) — минимальная (без компилятора и других средств разработки) реализация виртуальной машины, необходимая для исполнения Java-приложений. Состоит из виртуальной машины Java Virtual Machine и библиотеки Java-классов.}
\item \nom{JVM}{(от англ. Java Virtual Machine) — виртуальная машина Java, основная часть исполняющей системы Java. Виртуальная машина Java исполняет байт-код, предварительно созданный из исходного текста Java-программы компилятором. JVM может также использоваться для выполнения программ, написанных на других языках программирования.}
\item \nom{JIT}{(англ. Just-in-Time, компиляция «точно в нужное время»), динамическая компиляция — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы. Таким образом достигается высокая скорость выполнения по сравнению с интерпретируемым байт-кодом за счёт увеличения потребления памяти (для хранения результатов компиляции) и затрат времени на компиляцию. Технология JIT базируется на двух более ранних идеях, касающихся среды выполнения: компиляции байт-кода и динамической компиляции.}
\item \nom{CLI}{(англ. Command line interface, Интерфейс командной строки) — разновидность текстового интерфейса между человеком и компьютером, в котором инструкции компьютеру даются в основном путём ввода с клавиатуры текстовых строк (команд). Также известен под названиями «консоль» и «терминал».}
\item \nom{Docker}{программное обеспечение для автоматизации развёртывания и управления приложениями, контейнеризатор приложений. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть развёрнут почти на любой системе.}
\end{itemize}
\nomenclature{GPL}{GNU General Public License (чаще всего переводят как Открытое лицензионное соглашение GNU) — лицензия на свободное программное обеспечение, созданная в рамках проекта GNU, по которой автор передаёт программное обеспечение в общественную собственность. Её также сокращённо называют GNU GPL или даже просто GPL, если из контекста понятно, что речь идёт именно о данной лицензии. GNU Lesser General Public License (LGPL) — это ослабленная версия GPL, предназначенная для некоторых библиотек ПО.}
\subsection{Краткая история (причины возникновения)}
\begin{itemize}
\item Язык создавали для разработки встраиваемых систем, сетевых приложений и прикладного \nom{ПО}{программное обеспечение};
\item Популярен из-за скорости исполнения и полного абстрагирования от исполнителя кода;
\item Часто используется для программирования бэк-энда веб-приложений из-за изначальной нацеленности на сетевые приложения.
\end{itemize}
\begin{figure}[H]
\centering
\includegraphics[width=17cm]{jc-01-tiobe.png}
\caption{График популярности языков программирования TIOBE}
\label{pic:java-in-tiobe}
\end{figure}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Как Вы думаете, почему язык программирования Java стал популярен в такие короткие сроки?
\begin{itemize}
\item существовавшие на тот момент Pascal и C++ были слишком сложными;
\item Java быстрее C++;
\item Однажды написанная на Java программа работает везде.
\end{itemize}
\end{enumerate}
\subsection{Базовый инструментарий, который понадобится (выбор IDE)}
\begin{itemize}
\item NetBeans - хороший, добротный инструмент с лёгким ностальгическим оттенком;
\item Eclipse - для поклонников Eclipse Foundation и швейцарских ножей с полусотней лезвий;
\item IntelliJ IDEA - стандарт де-факто, используется на курсе и в большинстве современных компаний;
\item Android Studio - если заниматься мобильной разработкой.
\end{itemize}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Как Вы думаете, почему среда разработки IntelliJ IDEA стала стандартом де-факто в коммерческой разработке приложений на Java?
\begin{itemize}
\item NetBeans перестали поддерживать;
\item Eclipse слишком медленный и тяжеловесный;
\item IDEA оказалась самой дружелюбной к начинающему программисту;
\item Все варианты верны.
\end{itemize}
\end{enumerate}
\subsection{Что нужно скачать, откуда (как выбрать вендора, версии)}
Для разработки понадобится среда разработки (\nom{IDE}{(от англ. Integrated Development Environment) это интегрированная, единая среда разработки, которая используется разработчиками для создания различного программного обеспечения. IDE представляет собой комплекс из нескольких инструментов, а именно: текстового редактора, компилятора или интерпретатора, средств автоматизации сборки и отладчика.}) и инструментарий разработчика (JDK). JDK выпускается несколькими поставщиками, большинство из них бесплатны и полнофункциональны, то есть поддерживают весь функционал языка и платформы.
В последнее время, с развитием контейнеризации приложений, часто устанавливают инструментарий в Docker-контейнер и ведут разработку прямо в контейнере, это позволяет не захламлять компьютер разработчика разными версиями инструментария и быстро разворачивать свои приложения в \nom{CI}{(англ. Continious Integration) практика разработки программного обеспечения, которая заключается в постоянном слиянии рабочих копий в общую основную ветвь разработки и выполнении частых автоматизированных сборок проекта для скорейшего выявления потенциальных дефектов и решения интеграционных проблем.} или на целевом сервере.
\begin{frm}
В общем случае, для разработки на любом языке программирования нужны так называемые \nom{SDK}{(от англ. software development kit, комплект для разработки программного обеспечения) — это набор инструментов для разработки программного обеспечения в одном устанавливаемом пакете. Они облегчают создание приложений, имея компилятор, отладчик и иногда программную среду. В основном они зависят от комбинации аппаратной платформы компьютера и операционной системы.} (Software Development Kit, англ. - инструментарий разработчика приложений или инструментарий для разработки приложений). Частный случай такого SDK - инструментарий разработчика на языке Java - Java Development Kit.
\end{frm}
На курсе будет использоваться BellSoft Liberica JDK 11, но возможно использовать и других производителей, например, самую распространённую Oracle JDK. Производителя следует выбирать из требований по лицензированию, так, например, Oracle JDK можно использовать бесплатно только в личных целях, за коммерческую разработку с использованием этого инструментария придётся заплатить.
\begin{frm}
Для корректной работы самого инструментария и сторонних приложений, использующих инструментарий, проследите, пожалуйста, что установлены следующие переменные среды ОС:
\begin{itemize}
\item в системную \code{PATH} добавить путь до исполняемых файлов JDK, например, для UNIX-подобных систем: \verb|PATH=$PATH:/usr/lib/jvm/jdk1.8.0_221/bin|
\item \code{JAVA_HOME} путь до корня JDK, например, для UNIX-подобных систем: \code{JAVA_HOME=/usr/lib/jvm/jdk1.8.0_221/}
\item \code{JRE_HOME} путь до файлов JRE из состава установленной JDK, например, для UNIX-подобных систем: \code{JRE_HOME=/usr/lib/jvm/jdk1.8.0_221/jre/}
\item \code{J2SDKDIR} устаревшая переменная для JDK, используется некоторыми старыми приложениями, например, для UNIX-подобных систем: \code{J2SDKDIR=/usr/lib/jvm/jdk1.8.0_221/}
\item \code{J2REDIR} устаревшая переменная для JRE, используется некоторыми старыми приложениями, например, для UNIX-подобных систем: \code{J2REDIR=/usr/lib/jvm/jdk1.8.0_221/jre/}
\end{itemize}
\end{frm}
Также возможно использовать и другие версии, но не старше 1.8. Это обосновано тем, что основные разработки на данный момент только начинают обновлять инструментарий до более новых версий (часто 11 или 13) или вовсе переходят на другие JVM-языки, такие как Scala, Groovy или Kotlin.
Иногда для решения вопроса менеджмента версий прибегают к стороннему инструментарию, такому как SDKMan.
Для решения некоторых несложных задач курса мы будем писать простые приложения, не содержащие ООП, сложных взаимосвязей и проверок, в этом случае нам понадобится Jupyter notebook с установленным ядром (kernel) IJava.
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Чем отличается SDK от JDK?
\item Какая версия языка (к сожалению) остаётся самой популярной в разработке на Java?
\item Какие ещё JVM языки существуют?
\end{enumerate}
\subsection{Из чего всё состоит (JDK, JRE, JVM и их друзья)}
TL;DR:
\begin{itemize}
\item JDK = JRE + инструменты разработчика;
\item JRE = JVM + библиотеки классов;
\item JVM = Native API + механизм исполнения + управление памятью.
\end{itemize}
Как именно всё работает? Если коротко, то слой за слоем накладывая абстракции. Программы на любом языке программирования исполняются на компьютере, то есть, так или иначе, задействуют процессор, оперативную память и прочие аппаратурные компоненты. Эти аппаратурные компоненты предоставляют для доступа к себе низкоуровневые интерфейсы, которые задействует операционная система, предоставляя в свою очередь интерфейс чуть проще программам, взаимодействующим с ней. Этот интерфейс взаимодействия с \nom{ОС}{(операционная система) — комплекс управляющих и обрабатывающих программ, которые, с одной стороны, выступают как интерфейс между устройствами вычислительной системы и прикладными программами, а с другой стороны — предназначены для управления устройствами, управления вычислительными процессами, эффективного распределения вычислительных ресурсов между вычислительными процессами и организации надёжных вычислений.} мы для простоты будем называть Native API.
С ОС взаимодействует JVM (\href{https://ru.m.wikipedia.org/wiki/Список_виртуальных_машин_Java}{Wikipedia: Список виртуальных машин Java}), то есть, используя Native API, нам становится всё равно, какая именно ОС установлена на компьютере, главное уметь выполняться на JVM. Это открывает простор для создания целой группы языков, они носят общее бытовое название JVM-языки, к ним относят Scala, Groovy, Kotlin и другие. Внутри JVM осуществляется управление памятью, существует механизм исполнения программ, специальный JIT\footnote{JIT, just-in-time - англ. в\'{о}время, прямо сейчас}-компилятор, генерирующий платформенно-зависимый код.
JVM для своей работы запрашивает у ОС некоторый сегмент оперативной памяти, в котором хранит данные программы. Это хранение происходит «слоями»:
\begin{enumerate}
\item Eden Space (heap) в этой области выделяется память под все создаваемые из программы объекты. Большая часть объектов живёт недолго (итераторы, временные объекты, используемые внутри методов и т.п.), и удаляются при выполнении сборок мусора это области памяти, не перемещаются в другие области памяти. Когда данная область заполняется (т.е. количество выделенной памяти в этой области превышает некоторый заданный процент), сборщик мусора выполняет быструю (minor collection) сборку. По сравнению с полной сборкой, она занимает мало времени, и затрагивает только эту область памяти, а именно, очищает от устаревших объектов Eden Space и перемещает выжившие объекты в следующую область.
\item Survivor Space (heap) сюда перемещаются объекты из предыдущей области после того, как они пережили хотя бы одну сборку мусора. Время от времени долгоживущие объекты из этой области перемещаются в Tenured Space.
\item Tenured (Old) Generation (heap) — Здесь скапливаются долгоживущие объекты (крупные высокоуровневые объекты, синглтоны, менеджеры ресурсов и прочие). Когда заполняется эта область, выполняется полная сборка мусора (full, major collection), которая обрабатывает все созданные JVM объекты.
\item Permanent Generation (non-heap) Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.).
\item Code Cache (non-heap) — эта область используется JVM, когда включена JIT-компиляция, в ней кешируется скомпилированный платформенно-зависимый код.
\end{enumerate}
JVM самостоятельно осуществляет сборку так называемого мусора, что значительно облегчает работу программиста по отслеживанию утечек памяти, но важно помнить, что в Java утечки памяти всё равно существуют, особенно при программировании многопоточных приложений.
\begin{figure}[H]
\centering
\def\svgwidth{150mm}
\input{pics/jc-01-jvm-struct.pdf_tex}
\label{jvm:structure}
\caption{принцип работы JVM}
\end{figure}
На пользовательском уровне важно не только исполнять базовые инструкции программы, но чтобы эти базовые инструкции умели как-то взаимодействовать со внешним миром, в том числе другими программами, поэтому JVM интегрирована в JRE - Java Runtime Environment. JRE - это набор из классов и интерфейсов, реализующих
\begin{itemize}
\item возможности сетевого взаимодействия;
\item рисование графики и графический пользовательский интерфейс;
\item мультимедиа;
\item математический аппарат;
\item наследование и полиморфизм;
\item рефлексию;
\item ... многое другое.
\end{itemize}
Java Development Kit является изрядно дополненным специальными Java приложениями SDK. JDK дополняет JRE не только утилитами для компиляции, но и утилитами для создания документации, отладки, развёртывания приложений и многими другими. В таблице \ref{table:jdk-contents} на странице \pageref{table:jdk-contents}, приведена примерная структура и состав JDK и JRE, а также указаны их основные и наиболее часто используемые компоненты из состава Java Standard Edition. Помимо стандартной редакции существует и Enterprise Edition, содержащий компоненты для создания веб-приложений, но JEE активно вытесняется фреймворками Spring и Spring Boot.
\begin{table}[H]
\centering
\begin{adjustbox}{angle=90}
\begin{tabular}{|l|ll|llllllll|}
\cline{1-1} \cline{4-11}
\multirow{15}{*}{\rotatebox[origin=c]{270}{Java Development Kit }} & & & \multicolumn{8}{l|}{Language} \\ \cline{4-11}
& & & \multicolumn{1}{l|}{\multirow{3}{23mm}{tools + tools api}} & \multicolumn{1}{l|}{javac} & \multicolumn{1}{l|}{java} & \multicolumn{1}{l|}{javadoc} & \multicolumn{1}{l|}{javap} & \multicolumn{1}{l|}{jar} & \multicolumn{2}{l|}{JPDA} \\ \cline{5-11}
& & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{JConsole} & \multicolumn{1}{p{23mm}|}{JavaVisualVM} & \multicolumn{1}{l|}{JMC} & \multicolumn{1}{l|}{JFR} & \multicolumn{1}{l|}{Java DB} & \multicolumn{1}{l|}{Int'l} & JVM TI \\ \cline{5-11}
& & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{IDL} & \multicolumn{1}{l|}{Troubleshoot} & \multicolumn{1}{l|}{Security} & \multicolumn{1}{l|}{RMI} & \multicolumn{1}{l|}{Scripting} & \multicolumn{1}{l|}{Web services} & Deploy \\ \cline{2-2} \cline{4-11}
& \multicolumn{1}{l|}{\multirow{11}{*}{\rotatebox[origin=c]{270}{Java Runtime Environment }}} & & \multicolumn{1}{l|}{deployment} & \multicolumn{4}{l|}{Java Web} & \multicolumn{3}{l|}{Applet/Java plug-in} \\ \cline{3-11}
& \multicolumn{1}{l|}{} & \multirow{10}{*}{\rotatebox[origin=c]{270}{Java Standard Edition }} & \multicolumn{1}{l|}{\multirow{2}{*}{UI toolkit}} & \multicolumn{2}{l|}{Swing} & \multicolumn{2}{l|}{Java 2D} & \multicolumn{1}{l|}{AWT} & \multicolumn{2}{l|}{Accessibility} \\ \cline{5-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{2}{l|}{Drag'n'Drop} & \multicolumn{2}{l|}{Input Methods} & \multicolumn{1}{l|}{Image I/O} & \multicolumn{1}{l|}{Print Service} & Sound \\ \cline{4-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{p{23mm}|}{Integration libraries} & \multicolumn{1}{l|}{IDL} & \multicolumn{1}{l|}{JDBC} & \multicolumn{1}{l|}{JNDI} & \multicolumn{1}{l|}{RMI} & \multicolumn{1}{l|}{RMI-IIOP} & \multicolumn{2}{l|}{Scripting} \\ \cline{4-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{\multirow{3}{23mm}{Other base libraries}} & \multicolumn{2}{l|}{Override Mechanism} & \multicolumn{2}{l|}{Intl Support} & \multicolumn{2}{l|}{Input/Output} & JMX \\ \cline{5-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{2}{l|}{XML JAXP} & \multicolumn{2}{l|}{Math} & \multicolumn{2}{l|}{Networking} & Beans \\ \cline{5-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{2}{l|}{Security} & \multicolumn{2}{l|}{Serialization} & \multicolumn{2}{l|}{Extension Mechanism} & JNI \\ \cline{4-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{\multirow{3}{23mm}{Java lang and util base libs}} & \multicolumn{1}{l|}{JAR} & \multicolumn{1}{l|}{Lang and util} & \multicolumn{2}{l|}{Ref Objects} & \multicolumn{2}{l|}{Preference API} & Reflection \\ \cline{5-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{Zip} & \multicolumn{1}{l|}{Management} & \multicolumn{2}{l|}{Instrumentation} & \multicolumn{2}{l|}{Stream API} & Collections \\ \cline{5-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{Logging} & \multicolumn{1}{p{23mm}|}{Regular Expressions} & \multicolumn{2}{p{23mm}|}{Concurrency Utilities} & \multicolumn{2}{l|}{Datetime} & Versioning \\ \cline{4-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{JVM} & \multicolumn{7}{l|}{Java Hot Spot VM (JIT)} \\ \hline
\end{tabular}
\end{adjustbox}
\label{table:jdk-contents}
\caption{Общее представление состава JDK}
\end{table}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item JVM и JRE - это одно и тоже?
\item Что входит в состав JDK, но не входят в состав JRE?
\item Утечки памяти
\begin{itemize}
\item Невозможны, поскольку работает сборщик мусора;
\item Возможны;
\item Существуют только в С++ и других языках с открытым менеджментом памяти.
\end{itemize}
\end{enumerate}
\subsection{Структура проекта (пакеты, классы, метод main, комментарии)}
Проекты могут быть любой сложности. Часто структуру проекта задаёт сборщик проекта, предписывая в каких папках будут храниться исходные коды, исполняемые файлы, ресурсы и документация. Без их использования необходимо задать структуру самостоятельно.
\textbf{Простейший проект} чаще всего состоит из одного файла исходного кода, который возможно скомпилировать и запустить как самостоятельный объект. Отличительная особенность в том, что чаще всего это один или несколько статических методов в одном классе.
Файл \code{Main.java} в этом случае может иметь следующий, минималистичный вид
\begin{lstlisting}[language=Java,style=JCodeStyle]
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
\end{lstlisting}
\textbf{Скриптовый проект} это достаточно новый тип проектов, он получил развитие благодаря растущей популярности Jupyter Notebook. Скриптовые проекты удобны, когда нужно отработать какую-то небольшую функциональность или пошагово пояснить работу какого-то алгоритма.
\begin{figure}[H]
\centering
\includegraphics[width=12cm]{jc-01-jupyter-example.png}
\caption{Пример простого Java проекта в Jupyter Notebook}
\label{pic:jupyter-sample}
\end{figure}
\textbf{Обычный проект} состоит из пакетов, которые содержат классы, которые в свою очередь как-то связаны между собой и содержат код, который исполняется.
\begin{itemize}
\item Пакеты. Пакеты объединяют классы по смыслу. Классы, находящиеся в одном пакете доступны друг другу даже если находятся в разных проектах. У пакетов есть правила именования: обычно это обратное доменное имя (например, для gb.ru это будет ru.gb), название проекта, и далее уже внутренняя структура. Пакеты именуют строчными латинскими буквами. Чтобы явно отнести класс к пакету, нужно прописать в классе название пакета после оператора \code{package}.
\item Классы. Основная единица исходного кода программы. Одному файлу следует сопоставлять один класс. Название класса - это имя существительное в именительном падеже, написанное с заглавной буквы. Если требуется назвать класс в несколько слов, применяют UpperCamelCase.
\item \code{public static void main(String[] args)}. Метод, который является точкой входа в программу. Должен находиться в публичном классе. При создании этого метода важно полностью повторить его сигнатуру и обязательно написать его с название со строчной буквы.
\item Комментарии. Это часть кода, которую игнорирует компилятор при преобразовании исходного кода. Комментарии бывают:
\begin{itemize}
\item \code{// comment} - до конца строки. Самый простой и самый часто используемый комментарий.
\item \code{/* comment */} - внутристрочный или многострочный. Никогда не используйте его внутри строк, несмотря на то, что это возможно.
\item \code{/** comment */} - комментарий-документация. Многострочный. Из него утилитой Javadoc создаётся веб-страница с комментарием.
\end{itemize}
\end{itemize}
Для примера был создан проект, содержащий два класса, находящихся в разных пакетах. Дерево проекта представлено на рис. \hrf{pic:simple-tree}, где папка с выходными (скомпилированными) бинарными файлами пуста, а файл README.md создан для лучшей демонстрации корня проекта.
\begin{figure}[H]
\begin{forest}
for tree={
font=\ttfamily, grow'=0, child anchor=west,
parent anchor=south, anchor=west, calign=first,
edge path={
\noexpand\path [draw, \forestoption{edge}]
(!u.south west) +(7.5pt,0) |- node[fill,inner sep=1.25pt]
{} (.child anchor)\forestoption{edge label};
}, before typesetting nodes={
if n=1 {insert before={[,phantom]}} {} },
fit=band, before computing xy={l=15pt},
}
[Sample
[src
[ru
[gb
[jcore
[regular
[OtherClass.java]
]
[sample
[Main.java]
]
]
]
]
]
[out
]
[README.md]
]
\end{forest}
\label{pic:simple-tree}
\caption{Структура простого проекта}
\end{figure}
Содержимое файлов исходного кода представлено ниже.
\begin{lstlisting}[language=Java,style=JCodeStyle]
package ru.gb.jcore.sample;
import ru.gb.jcore.regular.OtherClass;
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!"); // greetings
int result = OtherClass.sum(2, 2); // using a class from other package
System.out.println(OtherClass.decorate(result));
}
}
\end{lstlisting}
\begin{lstlisting}[language=Java,style=JCodeStyle]
package ru.gb.jcore.regular;
public class OtherClass {
public static int sum(int a, int b) {
return a + b; // return without overflow check
}
public static String decorate(int a) {
return String.format("Here is your number: %d.", a);
}
}
\end{lstlisting}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Зачем складывать классы в пакеты?
\item Может ли существовать класс вне пакета?
\item Комментирование кода
\begin{itemize}
\item Нужно только если пишется большая подключаемая библиотека;
\item Хорошая привычка;
\item Захламляет исходники.
\end{itemize}
\end{enumerate}
\subsection{Отложим мышки в сторону (CLI: сборка, пакеты, запуск)}
\label{subsec:cli}
Простейший проект возможно скомпилировать и запустить без использования тяжеловесных сред разработки, введя в командной строке ОС две команды:
\begin{itemize}
\item javac <Name.java> скомпилирует файл исходников и создаст в этой же папке файл с байт-кодом;
\item java Name запустит скомпилированный класс (из файла с расширением \code{.class}).
\end{itemize}
\begin{lstlisting}[style=ASMStyle]
ivan-igorevich@gb sources % ls
Main.java
ivan-igorevich@gb sources % javac Main.java
ivan-igorevich@gb sources % ls
Main.class Main.java
ivan-igorevich@gb sources % java Main
Hello, world!
\end{lstlisting}
\begin{frm}
Скомпилированные классы всегда содержат одинаковые первые четыре байта, которые в шестнадцатиричном представлении формируют надпись «кофе, крошка».
\begin{figure}[H]
\centering
\includegraphics[width=14cm]{jc-01-cafe-babe.png}
\end{figure}
\end{frm}
Для компиляции более сложных проектов, необходимо указать компилятору, откуда забирать файлы исходников и куда складывать готовые файлы классов, а интерпретатору, откуда забирать файлы скомпилированных классов. Для этого существуют следующие ключи:
\begin{itemize}
\item javac:
\begin{itemize}
\item \code{-d} выходная папка (директория) назначения;
\item \code{-sourcepath} папка с исходниками проекта;
\end{itemize}
\item java:
\begin{itemize}
\item \code{-classpath} папка с классами проекта;
\end{itemize}
\end{itemize}
Классы проекта компилируются в выходную папку с сохранением иерархии пакетов.
\begin{lstlisting}[style=ASMStyle]
ivan-igorevich@gb Sample % javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
ivan-igorevich@gb Sample % java -classpath ./out ru.gb.jcore.sample.Main
Hello, world!
Here is your number: 4.
\end{lstlisting}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Что такое javac?
\item Кофе, крошка?
\item Где находится класс в папке назначения работы компилятора?
\begin{itemize}
\item В подпапках, повторяющих структуру пакетов в исходниках
\item В корне плоским списком;
\item Зависит от ключей компиляции.
\end{itemize}
\end{enumerate}
\subsection{Документирование (Javadoc)}
Документирование конкретных методов и классов всегда ложится на плечи программиста, потому что никто не знает программу и алгоритмы в ней лучше, чем программист. Утилита Javadoc избавляет программиста от необходимости осваивать инструменты создания веб-страниц и записывать туда свою документацию. Достаточно писать хорошо отформатированные комментарии, а остальное Javadoc возьмёт на себя.
\begin{figure}[H]
\centering
\includegraphics[width=12cm]{jc-01-javadoc.png}
\caption{Часть cтраницы автосгенерированной документации}
\label{pic:}
\end{figure}
Чтобы просто создать документацию надо вызвать утилиту javadoc с набором ключей.
\begin{itemize}
\item \code{ru} пакет, для которого нужно создать документацию;
\item \code{-d} папка (или директория) назначения;
\item \code{-sourcepath} папка с исходниками проекта;
\item \code{-cp} путь до скомпилированных классов;
\item \code{-subpackages} нужно ли заглядывать в пакеты-с-пакетами;
\end{itemize}
Часто необходимо указать, в какой кодировке записан файл исходных кодов, и в какой кодировке должна быть выполнена документация (например, файлы исходников на языке Java всегда сохраняются в кодировке \nom{UTF-8}{(от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-бит») — распространённый стандарт кодирования символов, позволяющий более компактно хранить и передавать символы Юникода, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой ASCII. Кодировка UTF-8 сейчас является доминирующей в веб-пространстве. Она также нашла широкое применение в UNIX-подобных операционных системах.}, а основная кодировка для ОС Windows - \nom{cp1251}{набор символов и кодировка, являющаяся стандартной 8-битной кодировкой для русских версий Microsoft Windows до 10-й версии. Была создана на базе кодировок, использовавшихся в ранних русификаторах Windows.})
\begin{itemize}
\item \code{-locale ru_RU} язык документации (для правильной расстановки переносов и разделяющих знаков);
\item \code{-encoding} кодировка исходных текстов программы;
\item \code{-docencoding} кодировка конечной сгенерированной документации.
\end{itemize}
Чаще всего в комментариях используются следующие ключевые слова:
\begin{itemize}
\item \code{@param} описание входящих параметров
\item \code{@throws} выбрасываемые исключения
\item \code{@return} описание возвращаемого значения
\item \code{@see} где ещё можно почитать по теме
\item \code{@since} с какой версии продукта доступен метод
\item \code{{@code "public"}} вставка кода в описание
\end{itemize}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Javadoc находится в JDK или JRE?
\item Что делает утилита Javadoc?
\begin{itemize}
\item Создаёт комментарии в коде;
\item Создаёт программную документацию;
\item Создаёт веб-страницу с документацией из комментариев.
\end{itemize}
\end{enumerate}
\subsection{Собери его, если сможешь (Makefile, Docker)}
В подразделе \hrf{subsec:cli} мы проговорили о сборке проектов вручную.
\begin{frm}
Внимание поклонникам войны за пробелы против табов в тексте программы: в Makefile для отступов при описании таргетов нельзя использовать пробелы. Только табы. Иначе make обнаруживает ошибку синтаксиса.
\end{frm}
\subsection*{Домашнее задание}
\begin{itemize}
\item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю;
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам;
\item Создать Makefile с задачами сборки, очистки и создания документации на весь проект.
\end{itemize}
\section{Управление проектом: сборщики проектов} \section{Управление проектом: сборщики проектов}
Управление проектом: Jar-файлы; Gradle/Maven: зависимости, выгрузка артефакта, публичные репозитории, свойства проекта, приватные репозитории (хостинг); Bazel Управление проектом: Jar-файлы; Gradle/Maven: зависимости, выгрузка артефакта, публичные репозитории, свойства проекта, приватные репозитории (хостинг); Bazel
@ -435,9 +32,9 @@ Here is your number: 4.
\section{Специализация: данные и функции} \section{Специализация: данные и функции}
Базовые функции языка: математические операторы, условия, циклы, бинарные операторы; Данные: типы, преобразование типов, константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными); Функции: параметры, возвращаемые значения, перегрузка функций; Базовые функции языка: математические операторы, условия, циклы, бинарные операторы; Данные: типы, преобразование типов, константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными); Функции: параметры, возвращаемые значения, перегрузка функций;
\subsection{Данные} \subsection{Данные}
Хранение данных в Java осуществляется привычным для программиста образом: в переменных и константах. Языки программирования бывают типизированными и нетипизированными (бестиповыми). Хранение данных в Java осуществляется привычным для программиста образом: в переменных и константах. Языки программирования бывают типизированными и нетипизированными (бестиповыми).
Отсутствие типизации в основном присуще старым и низкоуровневым языкам программирования, например, Forth, некоторые ассемблеры. Все данные в таких языках считаются цепочками бит произвольной длины и, как следует из названия, не делятся на типы. Работа с ними часто труднее, и при чтении кода не всегда ясно, о каком типе переменной идет речь. При этом часто безтиповые языки работают быстрее типизированных, но описывать с их помощью большие проекты со сложными взаимосвязями довольно утомительно. Отсутствие типизации в основном присуще старым и низкоуровневым языкам программирования, например, Forth, некоторые ассемблеры. Все данные в таких языках считаются цепочками бит произвольной длины и, как следует из названия, не делятся на типы. Работа с ними часто труднее, и при чтении кода не всегда ясно, о каком типе переменной идет речь. При этом часто безтиповые языки работают быстрее типизированных, но описывать с их помощью большие проекты со сложными взаимосвязями довольно утомительно.
\begin{frm} \begin{frm}
Java является языком со строгой (сильной) явной статической типизацией. Java является языком со строгой (сильной) явной статической типизацией.
\end{frm} \end{frm}
@ -509,57 +106,14 @@ print(how\_old, "лет назад ты стал совершеннолетни
\section{Специализация: Тонкости работы} \section{Специализация: Тонкости работы}
Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML? Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML?
\chapter{Java Development Kit}
\section{Исключения}
Механизм и понятие, введение в \textbf{многопоточность}, throw; Наследование и полиморфизм в исключениях; Способы обработки исключений (try/catch, throws, finally); try-with-resources, штатные и нештатные ситуации
\section{Интерфейсы}
Понятие и принцип работы, implements; Наследование и множественное наследование интерфейсов; Значения по-умолчанию
\section{Обобщённое программирование}
\section{Коллекции}
List, Set; Хэш-код, интерфейс Comparable; Map, Object (Использование методов, Переопределение методов); Итераторы, \textbf{Многопоточные} коллекции
\section{Многопоточность}
Понятие, Принцип (реальная и псевдопараллельность); Runnable, Thread (Свойства, Особенности создания); Deadlock, Состояние гонки, Object (Ожидание/уведомление); Синхронизация (Синхронизация по монитору, Частичная, по классу)
\section{Графический интерфейс пользователя}
GUI (Swing): Окна и свойства окон, \textbf{Многопоточность} и абстргирование асинхронных вызовов; менеджеры размещений и проведение параллелей с веб-фреймворками, разделение на фронт-энд и бэк-энд; JPanel и рисование, Обработка действий пользователя
\chapter{Java Junior}
\section{JDBC}
\section{Сетевое программирование}
Socket, ServerSocket, Многопоточность, абстрагирование сетевого взаимодействия, интерфейсы
\section{Введение в архитектуры приложений на Java}
клиент-серверы, веб-приложения, сервлеты, толстые и тонкие клиенты, выделение бизнес-логики и хранения, создание общих пространств и модульность проекта
\section{Сериализация, StreamAPI, ReflectionAPI}
\section{Введение в Java EE}
\section{Введение в Spring framework}
\chapter{Java Junior+}
\newpage \newpage
\appendix \appendix
\sloppy \sloppy
\addcontentsline{toc}{chapter}{Термины, определения и сокращения} %\addcontentsline{toc}{chapter}{Термины, определения и сокращения}
\printnomenclature[20mm] \printnomenclature[20mm]
\chapter*{Приложения} \chapter*{Приложения}
\addcontentsline{toc}{chapter}{Приложения} %\addcontentsline{toc}{chapter}{Приложения}
\renewcommand{\thesection}{\Asbuk{section}} \renewcommand{\thesection}{\Asbuk{section}}
\end{document} \end{document}

468
jtc1-1a.tex Normal file
View File

@ -0,0 +1,468 @@
\documentclass[main.tex]{subfiles}
\begin{document}
\section{Платформа: история и окружение}
\subsection{В этом разделе}
Краткая история (причины возникновения); инструментарий, выбор версии; CLI; структура проекта; документирование; некоторые интересные способы сборки проектов.
В этом разделе происходит первое знакомство со внутреннем устройством языка Java и фреймворком разработки приложений с его использованием. Рассматривается примитивный инструментарий и базовые возможности платформы для разработки приложений на языке Java. Разбирается структура проекта, а также происходит ознакомление с базовым инструментарием для разработки на Java.
\begin{itemize}
\item \nom{JDK}{(от англ. Java Development Kit) — комплект разработчика приложений на языке Java, включающий в себя компилятор, стандартные библиотеки классов, примеры, документацию, различные утилиты и исполнительную систему. В состав JDK не входит интегрированная среда разработки на Java, поэтому разработчик, использующий только JDK, вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки.}
\item \nom{JRE}{(от англ. Java Runtime Environment) — минимальная (без компилятора и других средств разработки) реализация виртуальной машины, необходимая для исполнения Java-приложений. Состоит из виртуальной машины Java Virtual Machine и библиотеки Java-классов.}
\item \nom{JVM}{(от англ. Java Virtual Machine) — виртуальная машина Java, основная часть исполняющей системы Java. Виртуальная машина Java исполняет байт-код, предварительно созданный из исходного текста Java-программы компилятором. JVM может также использоваться для выполнения программ, написанных на других языках программирования.}
\item \nom{JIT}{(англ. Just-in-Time, компиляция «точно в нужное время»), динамическая компиляция — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы. Таким образом достигается высокая скорость выполнения по сравнению с интерпретируемым байт-кодом за счёт увеличения потребления памяти (для хранения результатов компиляции) и затрат времени на компиляцию. Технология JIT базируется на двух более ранних идеях, касающихся среды выполнения: компиляции байт-кода и динамической компиляции.}
\item \nom{CLI}{(англ. Command line interface, Интерфейс командной строки) — разновидность текстового интерфейса между человеком и компьютером, в котором инструкции компьютеру даются в основном путём ввода с клавиатуры текстовых строк (команд). Также известен под названиями «консоль» и «терминал».}
\item \nom{Docker}{программное обеспечение для автоматизации развёртывания и управления приложениями, контейнеризатор приложений. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть развёрнут почти на любой системе.}
\end{itemize}
\nomenclature{GPL}{GNU General Public License (чаще всего переводят как Открытое лицензионное соглашение GNU) — лицензия на свободное программное обеспечение, созданная в рамках проекта GNU, по которой автор передаёт программное обеспечение в общественную собственность. Её также сокращённо называют GNU GPL или даже просто GPL, если из контекста понятно, что речь идёт именно о данной лицензии. GNU Lesser General Public License (LGPL) — это ослабленная версия GPL, предназначенная для некоторых библиотек ПО.}
\subsection{Краткая история (причины возникновения)}
\begin{itemize}
\item Язык создавали для разработки встраиваемых систем, сетевых приложений и прикладного \nom{ПО}{программное обеспечение};
\item Популярен из-за скорости исполнения и полного абстрагирования от исполнителя кода;
\item Часто используется для программирования бэк-энда веб-приложений из-за изначальной нацеленности на сетевые приложения.
\end{itemize}
\begin{figure}[H]
\centering
\includegraphics[width=17cm]{jc-01-tiobe.png}
\caption{График популярности языков программирования TIOBE}
\label{pic:java-in-tiobe}
\end{figure}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Как Вы думаете, почему язык программирования Java стал популярен в такие короткие сроки?
\begin{itemize}
\item существовавшие на тот момент Pascal и C++ были слишком сложными;
\item Java быстрее C++;
\item Однажды написанная на Java программа работает везде.
\end{itemize}
\end{enumerate}
\subsection{Базовый инструментарий, который понадобится (выбор IDE)}
\begin{itemize}
\item NetBeans - хороший, добротный инструмент с лёгким ностальгическим оттенком;
\item Eclipse - для поклонников Eclipse Foundation и швейцарских ножей с полусотней лезвий;
\item IntelliJ IDEA - стандарт де-факто, используется на курсе и в большинстве современных компаний;
\item Android Studio - если заниматься мобильной разработкой.
\end{itemize}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Как Вы думаете, почему среда разработки IntelliJ IDEA стала стандартом де-факто в коммерческой разработке приложений на Java?
\begin{itemize}
\item NetBeans перестали поддерживать;
\item Eclipse слишком медленный и тяжеловесный;
\item IDEA оказалась самой дружелюбной к начинающему программисту;
\item Все варианты верны.
\end{itemize}
\end{enumerate}
\subsection{Что нужно скачать, откуда (как выбрать вендора, версии)}
Для разработки понадобится среда разработки (\nom{IDE}{(от англ. Integrated Development Environment) это интегрированная, единая среда разработки, которая используется разработчиками для создания различного программного обеспечения. IDE представляет собой комплекс из нескольких инструментов, а именно: текстового редактора, компилятора или интерпретатора, средств автоматизации сборки и отладчика.}) и инструментарий разработчика (JDK). JDK выпускается несколькими поставщиками, большинство из них бесплатны и полнофункциональны, то есть поддерживают весь функционал языка и платформы.
В последнее время, с развитием контейнеризации приложений, часто устанавливают инструментарий в Docker-контейнер и ведут разработку прямо в контейнере, это позволяет не захламлять компьютер разработчика разными версиями инструментария и быстро разворачивать свои приложения в \nom{CI}{(англ. Continious Integration) практика разработки программного обеспечения, которая заключается в постоянном слиянии рабочих копий в общую основную ветвь разработки и выполнении частых автоматизированных сборок проекта для скорейшего выявления потенциальных дефектов и решения интеграционных проблем.} или на целевом сервере.
\begin{frm}
В общем случае, для разработки на любом языке программирования нужны так называемые \nom{SDK}{(от англ. software development kit, комплект для разработки программного обеспечения) — это набор инструментов для разработки программного обеспечения в одном устанавливаемом пакете. Они облегчают создание приложений, имея компилятор, отладчик и иногда программную среду. В основном они зависят от комбинации аппаратной платформы компьютера и операционной системы.} (Software Development Kit, англ. - инструментарий разработчика приложений или инструментарий для разработки приложений). Частный случай такого SDK - инструментарий разработчика на языке Java - Java Development Kit.
\end{frm}
На курсе будет использоваться BellSoft Liberica JDK 11, но возможно использовать и других производителей, например, самую распространённую Oracle JDK. Производителя следует выбирать из требований по лицензированию, так, например, Oracle JDK можно использовать бесплатно только в личных целях, за коммерческую разработку с использованием этого инструментария придётся заплатить.
\begin{frm}
Для корректной работы самого инструментария и сторонних приложений, использующих инструментарий, проследите, пожалуйста, что установлены следующие переменные среды ОС:
\begin{itemize}
\item в системную \code{PATH} добавить путь до исполняемых файлов JDK, например, для UNIX-подобных систем: \verb|PATH=$PATH:/usr/lib/jvm/jdk1.8.0_221/bin|
\item \code{JAVA_HOME} путь до корня JDK, например, для UNIX-подобных систем: \code{JAVA_HOME=/usr/lib/jvm/jdk1.8.0_221/}
\item \code{JRE_HOME} путь до файлов JRE из состава установленной JDK, например, для UNIX-подобных систем: \code{JRE_HOME=/usr/lib/jvm/jdk1.8.0_221/jre/}
\item \code{J2SDKDIR} устаревшая переменная для JDK, используется некоторыми старыми приложениями, например, для UNIX-подобных систем: \code{J2SDKDIR=/usr/lib/jvm/jdk1.8.0_221/}
\item \code{J2REDIR} устаревшая переменная для JRE, используется некоторыми старыми приложениями, например, для UNIX-подобных систем: \code{J2REDIR=/usr/lib/jvm/jdk1.8.0_221/jre/}
\end{itemize}
\end{frm}
Также возможно использовать и другие версии, но не старше 1.8. Это обосновано тем, что основные разработки на данный момент только начинают обновлять инструментарий до более новых версий (часто 11 или 13) или вовсе переходят на другие JVM-языки, такие как Scala, Groovy или Kotlin.
Иногда для решения вопроса менеджмента версий прибегают к стороннему инструментарию, такому как SDKMan.
Для решения некоторых несложных задач курса мы будем писать простые приложения, не содержащие ООП, сложных взаимосвязей и проверок, в этом случае нам понадобится Jupyter notebook с установленным ядром (kernel) IJava.
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Чем отличается SDK от JDK?
\item Какая версия языка (к сожалению) остаётся самой популярной в разработке на Java?
\item Какие ещё JVM языки существуют?
\end{enumerate}
\subsection{Из чего всё состоит (JDK, JRE, JVM и их друзья)}
TL;DR:
\begin{itemize}
\item JDK = JRE + инструменты разработчика;
\item JRE = JVM + библиотеки классов;
\item JVM = Native API + механизм исполнения + управление памятью.
\end{itemize}
Как именно всё работает? Если коротко, то слой за слоем накладывая абстракции. Программы на любом языке программирования исполняются на компьютере, то есть, так или иначе, задействуют процессор, оперативную память и прочие аппаратурные компоненты. Эти аппаратурные компоненты предоставляют для доступа к себе низкоуровневые интерфейсы, которые задействует операционная система, предоставляя в свою очередь интерфейс чуть проще программам, взаимодействующим с ней. Этот интерфейс взаимодействия с \nom{ОС}{(операционная система) — комплекс управляющих и обрабатывающих программ, которые, с одной стороны, выступают как интерфейс между устройствами вычислительной системы и прикладными программами, а с другой стороны — предназначены для управления устройствами, управления вычислительными процессами, эффективного распределения вычислительных ресурсов между вычислительными процессами и организации надёжных вычислений.} мы для простоты будем называть Native API.
С ОС взаимодействует JVM (\href{https://ru.m.wikipedia.org/wiki/Список_виртуальных_машин_Java}{Wikipedia: Список виртуальных машин Java}), то есть, используя Native API, нам становится всё равно, какая именно ОС установлена на компьютере, главное уметь выполняться на JVM. Это открывает простор для создания целой группы языков, они носят общее бытовое название JVM-языки, к ним относят Scala, Groovy, Kotlin и другие. Внутри JVM осуществляется управление памятью, существует механизм исполнения программ, специальный JIT\footnote{JIT, just-in-time - англ. в\'{о}время, прямо сейчас}-компилятор, генерирующий платформенно-зависимый код.
JVM для своей работы запрашивает у ОС некоторый сегмент оперативной памяти, в котором хранит данные программы. Это хранение происходит «слоями»:
\begin{enumerate}
\item Eden Space (heap) в этой области выделяется память под все создаваемые из программы объекты. Большая часть объектов живёт недолго (итераторы, временные объекты, используемые внутри методов и т.п.), и удаляются при выполнении сборок мусора это области памяти, не перемещаются в другие области памяти. Когда данная область заполняется (т.е. количество выделенной памяти в этой области превышает некоторый заданный процент), сборщик мусора выполняет быструю (minor collection) сборку. По сравнению с полной сборкой, она занимает мало времени, и затрагивает только эту область памяти, а именно, очищает от устаревших объектов Eden Space и перемещает выжившие объекты в следующую область.
\item Survivor Space (heap) сюда перемещаются объекты из предыдущей области после того, как они пережили хотя бы одну сборку мусора. Время от времени долгоживущие объекты из этой области перемещаются в Tenured Space.
\item Tenured (Old) Generation (heap) — Здесь скапливаются долгоживущие объекты (крупные высокоуровневые объекты, синглтоны, менеджеры ресурсов и прочие). Когда заполняется эта область, выполняется полная сборка мусора (full, major collection), которая обрабатывает все созданные JVM объекты.
\item Permanent Generation (non-heap) Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.).
\item Code Cache (non-heap) — эта область используется JVM, когда включена JIT-компиляция, в ней кешируется скомпилированный платформенно-зависимый код.
\end{enumerate}
JVM самостоятельно осуществляет сборку так называемого мусора, что значительно облегчает работу программиста по отслеживанию утечек памяти, но важно помнить, что в Java утечки памяти всё равно существуют, особенно при программировании многопоточных приложений.
\begin{figure}[H]
\centering
\def\svgwidth{150mm}
\input{pics/jc-01-jvm-struct.pdf_tex}
\label{jvm:structure}
\caption{принцип работы JVM}
\end{figure}
На пользовательском уровне важно не только исполнять базовые инструкции программы, но чтобы эти базовые инструкции умели как-то взаимодействовать со внешним миром, в том числе другими программами, поэтому JVM интегрирована в JRE - Java Runtime Environment. JRE - это набор из классов и интерфейсов, реализующих
\begin{itemize}
\item возможности сетевого взаимодействия;
\item рисование графики и графический пользовательский интерфейс;
\item мультимедиа;
\item математический аппарат;
\item наследование и полиморфизм;
\item рефлексию;
\item ... многое другое.
\end{itemize}
Java Development Kit является изрядно дополненным специальными Java приложениями SDK. JDK дополняет JRE не только утилитами для компиляции, но и утилитами для создания документации, отладки, развёртывания приложений и многими другими. В таблице \ref{table:jdk-contents} на странице \pageref{table:jdk-contents}, приведена примерная структура и состав JDK и JRE, а также указаны их основные и наиболее часто используемые компоненты из состава Java Standard Edition. Помимо стандартной редакции существует и Enterprise Edition, содержащий компоненты для создания веб-приложений, но JEE активно вытесняется фреймворками Spring и Spring Boot.
\begin{table}[H]
\centering
\begin{adjustbox}{angle=90}
\begin{tabular}{|l|ll|llllllll|}
\cline{1-1} \cline{4-11}
\multirow{15}{*}{\rotatebox[origin=c]{270}{Java Development Kit }} & & & \multicolumn{8}{l|}{Language} \\ \cline{4-11}
& & & \multicolumn{1}{l|}{\multirow{3}{23mm}{tools + tools api}} & \multicolumn{1}{l|}{javac} & \multicolumn{1}{l|}{java} & \multicolumn{1}{l|}{javadoc} & \multicolumn{1}{l|}{javap} & \multicolumn{1}{l|}{jar} & \multicolumn{2}{l|}{JPDA} \\ \cline{5-11}
& & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{JConsole} & \multicolumn{1}{p{23mm}|}{JavaVisualVM} & \multicolumn{1}{l|}{JMC} & \multicolumn{1}{l|}{JFR} & \multicolumn{1}{l|}{Java DB} & \multicolumn{1}{l|}{Int'l} & JVM TI \\ \cline{5-11}
& & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{IDL} & \multicolumn{1}{l|}{Troubleshoot} & \multicolumn{1}{l|}{Security} & \multicolumn{1}{l|}{RMI} & \multicolumn{1}{l|}{Scripting} & \multicolumn{1}{l|}{Web services} & Deploy \\ \cline{2-2} \cline{4-11}
& \multicolumn{1}{l|}{\multirow{11}{*}{\rotatebox[origin=c]{270}{Java Runtime Environment }}} & & \multicolumn{1}{l|}{deployment} & \multicolumn{4}{l|}{Java Web} & \multicolumn{3}{l|}{Applet/Java plug-in} \\ \cline{3-11}
& \multicolumn{1}{l|}{} & \multirow{10}{*}{\rotatebox[origin=c]{270}{Java Standard Edition }} & \multicolumn{1}{l|}{\multirow{2}{*}{UI toolkit}} & \multicolumn{2}{l|}{Swing} & \multicolumn{2}{l|}{Java 2D} & \multicolumn{1}{l|}{AWT} & \multicolumn{2}{l|}{Accessibility} \\ \cline{5-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{2}{l|}{Drag'n'Drop} & \multicolumn{2}{l|}{Input Methods} & \multicolumn{1}{l|}{Image I/O} & \multicolumn{1}{l|}{Print Service} & Sound \\ \cline{4-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{p{23mm}|}{Integration libraries} & \multicolumn{1}{l|}{IDL} & \multicolumn{1}{l|}{JDBC} & \multicolumn{1}{l|}{JNDI} & \multicolumn{1}{l|}{RMI} & \multicolumn{1}{l|}{RMI-IIOP} & \multicolumn{2}{l|}{Scripting} \\ \cline{4-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{\multirow{3}{23mm}{Other base libraries}} & \multicolumn{2}{l|}{Override Mechanism} & \multicolumn{2}{l|}{Intl Support} & \multicolumn{2}{l|}{Input/Output} & JMX \\ \cline{5-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{2}{l|}{XML JAXP} & \multicolumn{2}{l|}{Math} & \multicolumn{2}{l|}{Networking} & Beans \\ \cline{5-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{2}{l|}{Security} & \multicolumn{2}{l|}{Serialization} & \multicolumn{2}{l|}{Extension Mechanism} & JNI \\ \cline{4-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{\multirow{3}{23mm}{Java lang and util base libs}} & \multicolumn{1}{l|}{JAR} & \multicolumn{1}{l|}{Lang and util} & \multicolumn{2}{l|}{Ref Objects} & \multicolumn{2}{l|}{Preference API} & Reflection \\ \cline{5-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{Zip} & \multicolumn{1}{l|}{Management} & \multicolumn{2}{l|}{Instrumentation} & \multicolumn{2}{l|}{Stream API} & Collections \\ \cline{5-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{Logging} & \multicolumn{1}{p{23mm}|}{Regular Expressions} & \multicolumn{2}{p{23mm}|}{Concurrency Utilities} & \multicolumn{2}{l|}{Datetime} & Versioning \\ \cline{4-11}
& \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{JVM} & \multicolumn{7}{l|}{Java Hot Spot VM (JIT)} \\ \hline
\end{tabular}
\end{adjustbox}
\label{table:jdk-contents}
\caption{Общее представление состава JDK}
\end{table}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item JVM и JRE - это одно и тоже?
\item Что входит в состав JDK, но не входят в состав JRE?
\item Утечки памяти
\begin{itemize}
\item Невозможны, поскольку работает сборщик мусора;
\item Возможны;
\item Существуют только в С++ и других языках с открытым менеджментом памяти.
\end{itemize}
\end{enumerate}
\subsection{Структура проекта (пакеты, классы, метод main, комментарии)}
Проекты могут быть любой сложности. Часто структуру проекта задаёт сборщик проекта, предписывая в каких папках будут храниться исходные коды, исполняемые файлы, ресурсы и документация. Без их использования необходимо задать структуру самостоятельно.
\textbf{Простейший проект} чаще всего состоит из одного файла исходного кода, который возможно скомпилировать и запустить как самостоятельный объект. Отличительная особенность в том, что чаще всего это один или несколько статических методов в одном классе.
Файл \code{Main.java} в этом случае может иметь следующий, минималистичный вид
\begin{lstlisting}[language=Java,style=JCodeStyle]
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
\end{lstlisting}
\textbf{Скриптовый проект} это достаточно новый тип проектов, он получил развитие благодаря растущей популярности Jupyter Notebook. Скриптовые проекты удобны, когда нужно отработать какую-то небольшую функциональность или пошагово пояснить работу какого-то алгоритма.
\begin{figure}[H]
\centering
\includegraphics[width=12cm]{jc-01-jupyter-example.png}
\caption{Пример простого Java проекта в Jupyter Notebook}
\label{pic:jupyter-sample}
\end{figure}
\textbf{Обычный проект} состоит из пакетов, которые содержат классы, которые в свою очередь как-то связаны между собой и содержат код, который исполняется.
\begin{itemize}
\item Пакеты. Пакеты объединяют классы по смыслу. Классы, находящиеся в одном пакете доступны друг другу даже если находятся в разных проектах. У пакетов есть правила именования: обычно это обратное доменное имя (например, для gb.ru это будет ru.gb), название проекта, и далее уже внутренняя структура. Пакеты именуют строчными латинскими буквами. Чтобы явно отнести класс к пакету, нужно прописать в классе название пакета после оператора \code{package}.
\item Классы. Основная единица исходного кода программы. Одному файлу следует сопоставлять один класс. Название класса - это имя существительное в именительном падеже, написанное с заглавной буквы. Если требуется назвать класс в несколько слов, применяют UpperCamelCase.
\item \code{public static void main(String[] args)}. Метод, который является точкой входа в программу. Должен находиться в публичном классе. При создании этого метода важно полностью повторить его сигнатуру и обязательно написать его с название со строчной буквы.
\item Комментарии. Это часть кода, которую игнорирует компилятор при преобразовании исходного кода. Комментарии бывают:
\begin{itemize}
\item \code{// comment} - до конца строки. Самый простой и самый часто используемый комментарий.
\item \code{/* comment */} - внутристрочный или многострочный. Никогда не используйте его внутри строк, несмотря на то, что это возможно.
\item \code{/** comment */} - комментарий-документация. Многострочный. Из него утилитой Javadoc создаётся веб-страница с комментарием.
\end{itemize}
\end{itemize}
Для примера был создан проект, содержащий два класса, находящихся в разных пакетах. Дерево проекта представлено на рис. \hrf{pic:simple-tree}, где папка с выходными (скомпилированными) бинарными файлами пуста, а файл README.md создан для лучшей демонстрации корня проекта.
\begin{figure}[H]
\begin{forest}
for tree={
font=\ttfamily, grow'=0, child anchor=west,
parent anchor=south, anchor=west, calign=first,
edge path={
\noexpand\path [draw, \forestoption{edge}]
(!u.south west) +(7.5pt,0) |- node[fill,inner sep=1.5pt]
{} (.child anchor)\forestoption{edge label};
}, before typesetting nodes={
if n=1 {insert before={[,phantom]}} {} },
fit=band, before computing xy={l=20pt},
}
[Sample
[src
[ru
[gb
[jcore
[regular
[OtherClass.java]
]
[sample
[Main.java]
]
]
]
]
]
[out
]
[README.md]
]
\end{forest}
\label{pic:simple-tree}
\caption{Структура простого проекта}
\end{figure}
Содержимое файлов исходного кода представлено ниже.
\begin{lstlisting}[language=Java,style=JCodeStyle]
package ru.gb.jcore.sample;
import ru.gb.jcore.regular.OtherClass;
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!"); // greetings
int result = OtherClass.sum(2, 2); // using a class from other package
System.out.println(OtherClass.decorate(result));
}
}
\end{lstlisting}
\begin{lstlisting}[language=Java,style=JCodeStyle]
package ru.gb.jcore.regular;
public class OtherClass {
public static int sum(int a, int b) {
return a + b; // return without overflow check
}
public static String decorate(int a) {
return String.format("Here is your number: %d.", a);
}
}
\end{lstlisting}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Зачем складывать классы в пакеты?
\item Может ли существовать класс вне пакета?
\item Комментирование кода
\begin{itemize}
\item Нужно только если пишется большая подключаемая библиотека;
\item Хорошая привычка;
\item Захламляет исходники.
\end{itemize}
\end{enumerate}
\subsection{Отложим мышки в сторону (CLI: сборка, пакеты, запуск)}
\label{subsec:cli}
Простейший проект возможно скомпилировать и запустить без использования тяжеловесных сред разработки, введя в командной строке ОС две команды:
\begin{itemize}
\item javac <Name.java> скомпилирует файл исходников и создаст в этой же папке файл с байт-кодом;
\item java Name запустит скомпилированный класс (из файла с расширением \code{.class}).
\end{itemize}
\begin{lstlisting}[style=ASMStyle]
ivan-igorevich@gb sources % ls
Main.java
ivan-igorevich@gb sources % javac Main.java
ivan-igorevich@gb sources % ls
Main.class Main.java
ivan-igorevich@gb sources % java Main
Hello, world!
\end{lstlisting}
\begin{frm}
Скомпилированные классы всегда содержат одинаковые первые четыре байта, которые в шестнадцатиричном представлении формируют надпись «кофе, крошка».
\begin{figure}[H]
\centering
\includegraphics[width=14cm]{jc-01-cafe-babe.png}
\end{figure}
\end{frm}
Для компиляции более сложных проектов, необходимо указать компилятору, откуда забирать файлы исходников и куда складывать готовые файлы классов, а интерпретатору, откуда забирать файлы скомпилированных классов. Для этого существуют следующие ключи:
\begin{itemize}
\item javac:
\begin{itemize}
\item \code{-d} выходная папка (директория) назначения;
\item \code{-sourcepath} папка с исходниками проекта;
\end{itemize}
\item java:
\begin{itemize}
\item \code{-classpath} папка с классами проекта;
\end{itemize}
\end{itemize}
Классы проекта компилируются в выходную папку с сохранением иерархии пакетов.
\begin{lstlisting}[style=ASMStyle]
ivan-igorevich@gb Sample % javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
ivan-igorevich@gb Sample % java -classpath ./out ru.gb.jcore.sample.Main
Hello, world!
Here is your number: 4.
\end{lstlisting}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Что такое javac?
\item Кофе, крошка?
\item Где находится класс в папке назначения работы компилятора?
\begin{itemize}
\item В подпапках, повторяющих структуру пакетов в исходниках
\item В корне плоским списком;
\item Зависит от ключей компиляции.
\end{itemize}
\end{enumerate}
\subsection{Документирование (Javadoc)}
Документирование конкретных методов и классов всегда ложится на плечи программиста, потому что никто не знает программу и алгоритмы в ней лучше, чем программист. Утилита Javadoc избавляет программиста от необходимости осваивать инструменты создания веб-страниц и записывать туда свою документацию. Достаточно писать хорошо отформатированные комментарии, а остальное Javadoc возьмёт на себя.
\begin{figure}[H]
\centering
\includegraphics[width=12cm]{jc-01-javadoc.png}
\caption{Часть cтраницы автосгенерированной документации}
\label{pic:}
\end{figure}
Чтобы просто создать документацию надо вызвать утилиту javadoc с набором ключей.
\begin{itemize}
\item \code{ru} пакет, для которого нужно создать документацию;
\item \code{-d} папка (или директория) назначения;
\item \code{-sourcepath} папка с исходниками проекта;
\item \code{-cp} путь до скомпилированных классов;
\item \code{-subpackages} нужно ли заглядывать в пакеты-с-пакетами;
\end{itemize}
Часто необходимо указать, в какой кодировке записан файл исходных кодов, и в какой кодировке должна быть выполнена документация (например, файлы исходников на языке Java всегда сохраняются в кодировке \nom{UTF-8}{(от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-бит») — распространённый стандарт кодирования символов, позволяющий более компактно хранить и передавать символы Юникода, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой ASCII. Кодировка UTF-8 сейчас является доминирующей в веб-пространстве. Она также нашла широкое применение в UNIX-подобных операционных системах.}, а основная кодировка для ОС Windows - \nom{cp1251}{набор символов и кодировка, являющаяся стандартной 8-битной кодировкой для русских версий Microsoft Windows до 10-й версии. Была создана на базе кодировок, использовавшихся в ранних русификаторах Windows.})
\begin{itemize}
\item \code{-locale ru_RU} язык документации (для правильной расстановки переносов и разделяющих знаков);
\item \code{-encoding} кодировка исходных текстов программы;
\item \code{-docencoding} кодировка конечной сгенерированной документации.
\end{itemize}
Чаще всего в комментариях используются следующие ключевые слова:
\begin{itemize}
\item \code{@param} описание входящих параметров
\item \code{@throws} выбрасываемые исключения
\item \code{@return} описание возвращаемого значения
\item \code{@see} где ещё можно почитать по теме
\item \code{@since} с какой версии продукта доступен метод
\item \code{{@code "public"}} вставка кода в описание
\end{itemize}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Javadoc находится в JDK или JRE?
\item Что делает утилита Javadoc?
\begin{itemize}
\item Создаёт комментарии в коде;
\item Создаёт программную документацию;
\item Создаёт веб-страницу с документацией из комментариев.
\end{itemize}
\end{enumerate}
\subsection{Собери его, если сможешь (Makefile, Docker)}
В подразделе \hrf{subsec:cli} мы проговорили о сборке проектов вручную. Компилировать проект таким образом — занятие весьма утомительное, особенно когда исходных файлов становится много, в проект включаются библиотеки и прочее.
\begin{frm}
\code{Makefile} — это набор инструкций для программы \code{make} (классическая, это GNU Automake), которая помогает собирать программный проект в одну команду. Если запустить \code{make} то программа попытается найти файл с именем по-умолчанию \code{Makefile} в текущем каталоге и выполнить инструкции из него.
\end{frm}
Make, не привносит ничего принципиально нового в процесс компиляции, а только лишь автоматизируют его. В простейшем случае, в \code{Makefile} достаточно описать так называемую цель, \code{target}, и что нужно сделать для достижения этой цели. Цель, собираемая по-умолчанию называется \code{all}, так, для простейшей компиляции нам нужно написать:
\begin{lstlisting}[style=ASMStyle]
all:
javac -sourcepath .src/ -d out src/ru/gb/jcore/sample/Main.java
\end{lstlisting}
\begin{frm}
Внимание поклонникам войны за пробелы против табов в тексте программы: в Makefile для отступов при описании таргетов нельзя использовать пробелы. Только табы. Иначе make обнаруживает ошибку синтаксиса.
\end{frm}
По сути, это всё. Но возможно сделать более гибко настраиваемый файл, чтобы не нужно было запоминать, как называются те или иные папки и файлы. В Makefile можно записывать переменные, например:
\begin{itemize}
\item SRCDIR := src
\item OUTDIR := out
\end{itemize}
И далее вызывать их (то есть подставлять ихзначения в нужное место текста) следующим образом:
\begin{lstlisting}[style=ASMStyle]
javac -sourcepath .${SRCDIR}/ -d ${OUTDIR}
\end{lstlisting}
Чтобы вызвать утилиту для сборки цели по-умолчанию, достаточно в папке, содержащей \code{Makefile} в терминале написать \code{make}. Чтобы воспользоваться другими написанными таргетами нужно после имени утилиты написать через пробел название таргета
\begin{frm}
Docker — программное обеспечение для автоматизации развёртывания и управления приложениями, контейнеризатор приложений. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть развёрнут на любой системе, поддерживающей соответствующую технологию.
\end{frm}
Docker также не привносит ничего технологически нового, но даёт возможность не устанавливать JDK и не думать о переключении между версиями, достаточно взять контейнер с нужной версией инструментария и запустить приложение в нём.
Образы и контейнеры создаются с помощью специального файла, имеющего название \code{Dockerfile}. Первой строкой \code{Dockerfile} мы обязательно должны указать, какой виртуальный образ будет для нас основой. Здесь можно использовать как образы ОС, так и образы SDK.
\begin{lstlisting}[style=ASMStyle]
FROM bellsoft/liberica-openjdk-alpine:11.0.16.1-1
\end{lstlisting}
При создании образа необходимо скопировать все файлы из папки \code{src} проекта внутрь образа, в папку \code{src}.
\begin{lstlisting}[style=ASMStyle]
COPY ./src ./src
\end{lstlisting}
Потом, также при создании образа, надо будет создать внутри папку \code{out} простой терминальной командой, чтобы компилятору было куда складывать готовые классы.
\begin{lstlisting}[style=ASMStyle]
RUN mkdir ./out
\end{lstlisting}
Последнее, что будет сделано при создании образа - запущена компиляция.
\begin{lstlisting}[style=ASMStyle]
RUN javac -sourcepath ./src -d out ./src/ru/gb/dj/Main.java
\end{lstlisting}
Последняя команда в \code{Dockerfile} говорит, что нужно сделать, когда контейнер создаётся из образа и заускается.
\begin{lstlisting}[style=ASMStyle]
CMD java -classpath ./out ru.gb.dj.Main
\end{lstlisting}
Docker-образ и, как следствие, Docker-контейнеры возможно настроить таким образом, чтобы скомпилированные файлы находились не в контейнере, а складывались обратно на компьютер пользователя через общие папки.
Часто команды разработчиков эмулируют таким образом реальный продакшн сервер, используя в качестве исходного образа не JDK, а образ целевой ОС, вручную устанавливают на ней JDK, запуская далее своё приложение.
\subsection*{Домашнее задание}
\begin{itemize}
\item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю;
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам;
\item Создать Makefile с задачами сборки, очистки и создания документации на весь проект.
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере подьзователя, а второй забирать скомпилированные классы и исполнять их.
\end{itemize}
\end{document}

Binary file not shown.

View File

@ -1,373 +0,0 @@
\documentclass[russian]{beamer}
\usepackage{multicol}
\usepackage{babel}
\usepackage{fontspec}
\input{../fancy-listings-preamble}
\usepackage{forest}
\makeatletter
\def\beamer@framenotesbegin{% at beginning of slide
\usebeamercolor[fg]{normal text}
\gdef\beamer@noteitems{}%
\gdef\beamer@notes{}%
}
\makeatother
\newcommand{\code}[1]{\small{\texttt{\detokenize{#1}}}\normalsize}
% \setbeamertemplate{note page}{\pagecolor{yellow!5}\insertnote}
% \setbeameroption{show notes on second screen=right}
\usetheme{Madrid}
\usecolortheme{seahorse}
\setmainfont{PT Astra Sans}
\setsansfont{PT Astra Sans}
\title{Платформа: история и окружение}
\author{Иван Игоревич Овчинников}
\institute[GB: Java]{GeekBrains. Java Core.}
\date{2022}
\begin{document}
\setbeamertemplate{enumerate items}[circle]
\frame{\titlepage}
\note{...}
\begin{frame}
\frametitle{Введение и знакомство (о себе)}
Иван Овчинников. НПО ИТ, РКС, GB.
\begin{block}{Используемые технологии}
Много и с удовольствием C, C++, Java, Verilog. C\# и Python даже не считаем.
\end{block}
Для GB более 20 потоков по разным направлениям, более двух тысяч студентов.
\end{frame}
\note{...}
\begin{frame}
\frametitle{О курсе}
и об уркое
\end{frame}
\note{...}
\begin{frame}
\frametitle{Краткая история}
\includegraphics[width=12cm]{../pics/jc-01-tiobe.png}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Почему Java?}
Написано однажды, работает везде.
\end{frame}
\note{...}
\begin{frame}
\frametitle{Базовый инструментарий}
\begin{enumerate}
\item Eclipse
\item NetBeans
\item IntelliJ IDEA
\item BlueJ
\item Oracle JDeveloper
\item MyEclipse
\item Greenfoot
\item jGRASP
\item JCreator
\item DrJava
\end{enumerate}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Что нужно скачать}
\begin{enumerate}
\item ждк
\item среду
\end{enumerate}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Что нужно скачать}
\begin{enumerate}
\item Oracle JDK
\item OpenJDK by Oracle
\item Liberica JDK
\item экзотические
\begin{itemize}
\item GOST Java
\item AdoptOpenJDK
\item Red Hat OpenJDK
\item Azul Zulu
\item Amazon Corretto
\end{itemize}
\end{enumerate}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Кто делает для нас JDK}
\includegraphics[width=12cm]{../pics/jc-01-jdk-contrib.png}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Когда нужно по-быстрому}
\includegraphics[width=12cm]{../pics/jc-01-jupyter-logo.png}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Переменные среды}
\begin{itemize}
\item \code{PATH}
\item \code{JAVA_HOME}
\item \code{JRE_HOME}
\item \code{J2SDKDIR}
\item \code{J2REDIR}
\end{itemize}
\end{frame}
\note{...}
\begin{frame}
\frametitle{JDK и его друзья}
TL;DR:
\begin{itemize}
\item JDK = JRE + инструменты разработчика;
\item JRE = JVM + библиотеки классов;
\item JVM = Native API + механизм исполнения + управление памятью.
\end{itemize}
\end{frame}
\note{...}
\begin{frame}
\frametitle{JVM и что в нём происходит}
рис 1.2 (стр 4) конспекта
\end{frame}
\note{...}
\begin{frame}
\frametitle{Структура проекта}
\begin{itemize}
\item простейшие (один файл)
\item обычные (несколько пакетов)
\item шаблонные (формируются сборщиками)
\item скриптовые (jupyter notebook)
\end{itemize}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Простейший проект}
Думаю, тут надо вживую покодить, благо немного
\begin{multicols}{2}
public class Main
public static void main(String[] args)
System.out.println("Hello, world!");
\columnbreak
ivan@gb src > javac Main.java
ivan@gb src > java Main
Hello, world!
\end{multicols}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Jupyter Notebook}
также вживую открыть юпитер ноутбук, показать, что возможно запускать код в скриптовом формате
\end{frame}
\note{...}
\begin{frame}
\frametitle{Проект на Java}
\begin{itemize}
\item пакеты,
\item классы,
\item метод main,
\item комментарии
\item ресурсы
\end{itemize}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Пакеты}
разделить на два слайда
сначала пакет с пакетами потом
стоящие стройными рядами коробки или контейнеры
\end{frame}
\note{...}
\begin{frame}
\frametitle{Классы}
разделить на два слайда
сначала фото пустого школьного класса, потом
\end{frame}
\note{...}
\begin{frame}
\frametitle{метод мейн}
разделить на два слайда
псвм
показать точку входа как вход в пещеру
\end{frame}
\note{...}
\begin{frame}
\frametitle{комментарии}
разделить на два слайда
можно как в редакции «комменты и лайки туда»
и слайд с типами комментариев
\end{frame}
\note{...}
\begin{frame}
\frametitle{Структура простого проекта}
\begin{forest}
for tree={
font=\ttfamily, grow'=0, child anchor=west,
parent anchor=south, anchor=west, calign=first,
edge path={
\noexpand\path [draw, \forestoption{edge}]
(!u.south west) +(7.5pt,0) |- node[fill,inner sep=1.25pt]
{} (.child anchor)\forestoption{edge label};
}, before typesetting nodes={
if n=1 {insert before={[,phantom]}} {} },
fit=band, before computing xy={l=15pt},
}
[Sample
[src
[ru
[gb
[jcore
[regular
[OtherClass.java]
]
[sample
[Main.java]
]
]
]
]
]
[out
]
[README.md]
]
\end{forest}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Терминал}
показать папку с простейшим проектом из одного файла, скомпилировать, запустить.
\end{frame}
\note{...}
\begin{frame}
\frametitle{Терминал}
тут, скорее всего, без лайв кода не обойтись, нужно открыть терминал и показать папку проекта, структуру проекта и содержимое файлов
\end{frame}
\note{...}
\begin{frame}
\frametitle{Javadoc}
Пример автоматически сгенерированной документации
\includegraphics[width=12cm]{../pics/jc-01-javadoc.png}
\end{frame}
\note{...}
\begin{frame}
\frametitle{утилита javadoc}
основные ключи и аргументы
\begin{itemize}
\item \code{-d docs}
\item \code{-sourcepath src}
\item \code{-cp out}
\item \code{-subpackages}
\item \code{ru}
\end{itemize}
\end{frame}
\note{...}
\begin{frame}
\frametitle{куда же без особенностей работы с Windows?}
\begin{itemize}
\item \code{-locale ru_RU}
\item \code{-encoding utf-8}
\item \code{-docencoding cp1251}
\end{itemize}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Автоматизация сборки в CLI}
makefile
\end{frame}
\note{...}
\begin{frame}
\frametitle{Автоматизация сборки в CLI}
SRCDIR := src
OUTDIR := out
JC := javac
JCFLAGS := -sourcepath .(SRCDIR)/ -d (OUTDIR)
MAINSOURCE := ru/gb/dj/Main
MAINCLASS := ru.gb.dj.Main
all:
(JC) (JCFLAGS) {SRCDIR}/{MAINSOURCE}.java
clean:
rm -R (OUTDIR)
run:
cd out \&\& java {MAINCLASS}
\end{frame}
\note{...}
\begin{frame}
\frametitle{Автоматизация сборки в CLI, контейнеризация}
docker
\end{frame}
\note{...}
\begin{frame}
\frametitle{Автоматизация сборки в CLI, контейнеризация}
\# syntax=docker/dockerfile:1
FROM bellsoft/liberica-openjdk-alpine:11.0.16.1-1
\# from where (related to Dockerfile) to where
COPY ./src ./src
\# remember that you are root and in / directory
RUN mkdir ./out
\# be sure to use relative paths
RUN javac -sourcepath ./src -d out ./src/ru/gb/dj/Main.java
\# what will we do on a container start
CMD java -classpath ./out ru.gb.dj.Main
\end{frame}
\note{...}
\begin{frame}
\frametitle{итоги}
что изучили и домашка
\end{frame}
\note{...}
\end{document}

View File

@ -1,300 +0,0 @@
\documentclass[../j-spec.tex]{subfiles}
\begin{document}
\showslide{build/jc-1-b.pdf}
Добро пожаловать на специализацию Java, лучшую из всех специализаций Java, что вы сможете найти.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Здравствуйте, меня зовут Иван, я разработчик программного обеспечения в Российских космических системах, начальник группы программистов, автор и преподаватель нескольких курсов в направлении программирования на портале GeekBrains. Пара слов обо мне, почему я нахожусь здесь и планирую Вам что-то рассказывать про язык Java? Для этого придётся вынести за скобки мой опыт работы в цифровой схемотехнике и других языках, в том числе создание бортовой аппаратуры, которая прямо сейчас летает у нас над головами или продолжает доставлять другие полезные грузы в космос. С точки зрения языка Java, обо мне можно сказать, что я являюсь разработчиком нескольких отраслевых информационных систем поддержки единой наземной инфраструктуры российского космического агентства. На моём счету также участие в межотраслевых проектах по созданию единых баз данных космического применения.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Данный курс, первый из специализации, направлен на первое знакомство со внутренним устройством языка и фреймворком разработки приложений с его использованием. Курс демонстрирует механизмы работы знакомых студенту концепций на примере языка Java. В рамках курса будут рассмотрено устройство языка Java и сопутствующих технологических решений, платформы для создания и запуска приложений на JVM-языках (Groovy, Kotlin, Scala, и др). Будут рассмотрены некоторые базовые пакеты ввода-вывода, позволяющие манипулировать данными за пределами программы. В результате прохождения курса у вас, слушатели, должно появиться знание принципов работы платформы Java, понимание того, как язык выражает принципы программирования, его объектную природу. Вы научитесь писать базовые терминальные приложения и утилиты, решать задачи (в том числе алгоритмические, не требующие подключения сложных библиотек) с использованием языка Java и с учётом его особенностей.
На этом уроке мы поговорим о
\begin{itemize}
\item краткой истории и причинах возникновения язка
\item что нужно скачать, откуда и как это всё выбирать
\item из чего всё состоит
\item изучим простую структуру проекта и способы его запуска
\item коротко рассмотрим утилиту джавадок
\end{itemize}
Рассмотрим примитивный инструментарий и базовые возможности платформы для разработки приложений на языке Java. В конце урока рассмотрим альтернативные способы сборки проектов, популярные и не очень.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Итак язык Java. Согласно википедии, Java — строго типизированный объектно-ориентированный язык программирования общего назначения, разработанный компанией Sun Microsystems. Разработка ведётся сообществом; язык и основные реализующие его технологии распространяются по лицензии GPL.
Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре, для которой существует реализация виртуальной Java-машины. Дата официального выпуска — 23 мая 1995 года. Традиционно занимает высокие места в рейтингах популярности языков программирования (3-е место в рейтинге TIOBE (на август 2021)). На графике отлично видно, что с 2002 года язык уверенно держится в тройке популярных, значительную часть времени возглавляя его.
Но это всё - сухие факты, ничего не говорящие нам о том, чем руководствовались разработчики языка и что нам, программистам, с этим делать.
Существует, интересная версия происхождения названия языка, связанная с аллюзией на кофе машину как пример бытового устройства, для программирования которого изначально язык создавался. Кстати, в результате работы проекта мир увидел принципиально новое устройство, карманный персональный компьютер, который опередил своё время более чем на 10 лет, но из-за большой стоимости не смог произвести переворот в мире технологии и был забыт. Устройство Star7 не пользовалось популярностью, в отличие от языка программирования Java и его окружения. С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и серверного программного обеспечения. Тогда же некоторое распространение получила технология Java-апплетов — графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей динамических веб-страниц технология стала применяться редко и язык стал применяться для бэк-энда.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Итак Язык программирования Java занял свою нишу в системном и прикладном программировании из-за своей высокой скорости работы, и веб-программировании, из-за удобного сетевого окружения, ставшего основой для создания бэк-энда веб-сервисов. Java очевидно испытал влияние языков C, C++, Pascal и других, так что многое в этих языках достаточно досконально изучить один раз, чтобы иметь возможность понимать все связанные.
Поскольку язык изначально проектировался для множества разнообразных исполнителей с разными архитектурами процессоров и систем, было принято решение отделить исполнителя от решаемой прикладной задачи, так появилась виртуальная машина Java, речь о которой пойдёт немного позже. Основной смысл в том, что у языка Java появился девиз: Написано однажды, работает везде.
\paragraph{Задания для самопроверки}
\begin{enumerate}
\item Как Вы думаете, почему язык программирования Java стал популярен в такие короткие сроки? (3)
\begin{itemize}
\item существовавшие на тот момент Pascal и C++ были слишком сложными;
\item Java быстрее C++;
\item Однажды написанная на Java программа работает везде.
\end{itemize}
\end{enumerate}
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Мы привыкли к тому, что для программирования нужна некоторая среда, которая будет удобно подсказывать нам, что делать, как писать программу, запускать написанный код и помогать нам отлаживать его. Чаще всего это так, но я призываю вас не останавливаться на единственном инструменте, ведь если быть всегда сосредоточенным на отвёртке, вы никогда не узнаете, что люди придумали очень удобный шуруповёрт.
Я не планирую рекламировать ту или иную среду, скорее всего не буду даже много говорить о плюсах и минусах той или иной среды, просто покажу список и коротко расскажу о главных действующих лицах:
\begin{enumerate}
\item NetBeans - если коротко, то эта среда с нами из уважения к истории, она была первой, созданной для разработки на языке Java. Долгое время разработка этой среды не велась, но в последние несколько лет разработчики как будто бы вспомнили о ней и активно взялись за дело, сейчас есть версии под все популярные ОС, поддерживается весь популярный современный функционал, есть прикольные самобытные моменты, вроде расширенных клавиатурных макросов для написания функций с передаваемыми в них массивами;
\item Eclipse - проще, наверное, назвать язык или технологию, под которую нет плагина для этой весьма расширяемой и дополняемой среды программирования. Долгое время, вплоть до недавнего, а где-то и до сих пор, является корпоративным стандартом для написания Enterprise приложений и прочих сложных корпоративных приложений. Весьма гибкая среда и-за того, что разрабатывается Eclipse Foundation к ней можно подключить плагины, решающие почти любые задачи разработки. Из того что я видел своими глазами, Siemens использует Eclipse для разработки своих систем поддержки жизненного цикла изделий;
\item IntelliJ IDEA - стандарт де-факто примерно десять последних лет. Не уверен, можно ли назвать эту среду российской разработкой, но у компании, разрабатывающей эту среду, три русских учредителя. Да и сама эта компания началась именно с этой среды. В этой среде можно настроить почти любую деталь, что часто бывает очень удобно. Среда расширяется плагинами на почти все случаи жизни разработчика. Часто входит в экосистему JetBrains, развёрнутую на предприятии, поэтому тесно интегрируется в другие сферы деятельности компании. Существует как бесплатная, так и платная версия с расширенным функционалом, например, доступа к базам данных.
\end{enumerate}
Отдельно стоит обговорить такую среду, как Android Studio, как мог заметить внимательный зритель, её нет в списке на слайде, но не потому, что в ней нельзя разрабатывать Java-приложения, а потому что если не разрабатывать в ней именно Android приложения, следует отказаться от её использования из-за некоторой избыточности. Среда снабжена значительным количеством надстроек и эмуляторов мобильных устройств, которые попросту будут вам мешать, если вы не используете их в своей профессиональной деятельности. С другой стороны, если ваша цель - это именно мобильная разработка под Android, то и выбора у вас особо нет, только Android Studio.
\paragraph{Задания для самопроверки}
\begin{enumerate}
\item Как Вы думаете, почему среда разработки IntelliJ IDEA стала стандартом де-факто в коммерческой разработке приложений на Java? (4)
\begin{itemize}
\item NetBeans перестали поддерживать;
\item Eclipse слишком медленный и тяжеловесный;
\item IDEA оказалась самой дружелюбной к начинающему программисту;
\item Все варианты верны.
\end{itemize}
\end{enumerate}
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Для разработки на языке Java вам может понадобиться довольно много разного инструментария, тем более, что требования к инструментарию отличаются ещё и от команды к команде, вам может потребоваться средство для работы с БД, средства моделирования и описания систем, дополнительные средства документирования кода и решений. Но совершенно точно можно сказать, что без двух вещей обойтись не удастся: это иде, они же среды программирования и ждк, он же инструментарий разработчика на java. О средах программирования дополнительно только что поговорили, нужно выбрать какую-нибудь, и скачать. Скорее всего вы это сделали для прохождения более ранних курсов, сейчас сможете для себя выбрать инструмент более осознанно. В курсе, кроме этой лекции и следующего за ней семинара, будет использоваться комьюнити версия среды Intellij IDEA, можете для простоты выбрать её, что вы уже скорее всего и сделали. Наверняка, для прохождения предыдущих курсов вы уже скачали и установили JDK какой-нибудь хорошей новой версии, а сейчас пришла пора разобраться, что это, какие они бывают, откуда их брать и как их выбирать, мы же за осознанность как-никак.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Итак, вендоры и версии. JDK развивается, поэтому выходят новые версии, исправляющие предыдущие недочёты, добавляющие новую функциональность. Самая распространённая версия в современной российской действительности - восьмая, но есть очень серьёзный тренд на переход к 11 и 13й версиям, на более новые часто смотрят с опаской. Распространённых вендоров три - оракл, опен, либерика. Есть, конечно, компании, собирающие свой инструментарий из открытых источников самостоятельно, но их крайне мало. Про экзотических вендоров рассказывать смысла не много, важно помнить, что они есть и у них у всех разные лицензионные политики. Я в курсе буду использовать либерику, как делаю последние несколько лет, хотя довольно долгое время пользовался ораклом. Поскольку я работаю в около- государственной компании, не могу не упомянуть о ГОСТ джаве, которая часто всерьёз рассматривается в организациях, подобных моей, и об опенЖДК, который является основой для самостоятельных сборок инструментария.
Наиболее популярной, конечно, является оракл ждк, но, если мне будет позволено высказать персональное мнение, это больше дань традиции, нежели какая-то жизненная необходимость.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Если внимательно посмотреть на компании, внесшие вклад в развитие открытой части инструментария, начиная с ждк11 и до актуального на сегодня ждк18, конечно, максимально вкладывается оракл, но и беллсофт, производитель либерики, там будет в первой десятке. Повторюсь, я на курсе буду использовать либерику ждк11, благо для неё есть и докер-образ, если нужно как-то автоматизировать сборки вашего приложения, например; вы можете использовать любую другую не старше 8. Все примеры я буду приводить с учётом именно 8й версии языка, чтобы рассмотреть подходящий подавляющему большинству людей инструментарий. Если у вас уже установлена 11я версия от другого вендора - ничего менять не нужно, если установлена более новая версия, есть вероятность, что некоторые примеры будут отмечаться как чрезвычайно устаревшие, возможно, эти предупреждения на этапе обучения следует игнорировать. Для выбора вендора внимательно ознакомьтесь с лицензией, а для выбора версии языка руководствуйтесь здравым смыслом: большинство компаний в России и мире работают на 8, 11 или 13й версиях. Зачем учиться на какой-нибудь 18-й версии, если потом на работе вы не увидите половины каких-нибудь новых фич и фактически, придётся переучиваться?
Из-за обилия вендоров и версий, которые нужно поддерживать, создаётся необходимость в автоматизации переключения между версиями. На помощь приходят инструменты, наподобие SDKMan, написанные на языке bash, позволяющие осуществить этот самый рутинный и утомительный менеджмент. Очевидным недостатком SDKMan является то, что помимо самого СДКМан нужно установить требующиеся версии и варианты ЖДК специальными внутренними командами. Хотя, например, можно перевести приложение в режим офлайн и попробовать как-то поплясать с бубном вокруг настроек. Думаю, что если в команде используется этот инструмент, для него уже есть все необходимые скрипты настроек и автоматизации. Есть и другие варианты, об одном из них (Docker) мы поговорим позднее в этой лекции.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Для решения некоторых несложных задач курса мы будем писать простые приложения, не содержащие ООП, сложных взаимосвязей и проверок, в этом случае нам понадобится Jupyter notebook с установленным ядром (kernel) IJava. Да, многие думают, что Jupyter ноутбуки - это только для языка пайтон или для скриптовых языков, но это не так. Архитектура юпитер ноутбука позволяет ему работать с любым ядром, главное, чтобы ядро умело корректно интерпретировать написанное в ячейке с кодом. Ядро IJava делает именно это - интерпретирует Java-код, используя установленный на компьютере разработчика JDK.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Для корректной работы самого инструментария и сторонних приложений, использующих тот инструментарий, проследите, пожалуйста, что установлены следующие переменные среды ОС:
\begin{itemize}
\item [] в системную \code{PATH} добавить путь до исполняемых файлов JDK
\item [] \code{JAVA_HOME} путь до корня JDK
\item [] \code{JRE_HOME} путь до файлов JRE из состава установленной JDK
\item [] \code{J2SDKDIR} устаревшая переменная для JDK, используется некоторыми старыми приложениями
\item [] \code{J2REDIR} устаревшая переменная для JRE, используется некоторыми старыми приложениями
\end{itemize}
Это позволит вам не особенно много думать о настройках видимости библиотек ОС при дальнейшей установке инструментария, например, сборщиков проектов.
\paragraph{Задания для самопроверки}
\begin{enumerate}
\item Чем отличается SDK от JDK? (J это частный случай, больше спец. библиотек)
\item Какая версия языка (к сожалению) остаётся самой популярной в разработке на Java? (8, 1.8)
\item Какие ещё JVM языки существуют? (Scala, Kotlin, Groovy)
\end{enumerate}
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Очень часто в интернете, при скачивании какого-то программного обеспечения, связанного с Java можно увидеть разные аббревиатуры: JRE, JVM, JDK и тому подобные, и чтобы в них не запутаться давайте коротко и быстро разберёмся что они значат, потому что я чувствую, как вам уже начинают надоедать все эти вступления.
Пойдём от самого масштабного и общего к самому маленькому и частному. Самая масштабная и общая аббревиатура - это JDK Java Development Kit - инструментарий разработчика на языке Java. Это обычный SDK который содержит в себе также всё необходимое для разработки именно на языке Java здесь есть куча других аббревиатур, компилятор, средства развёртывания, создания документации, итд они позволяют удобно писать программы на языке Java и абстрагируют программиста от необходимости описывать все вспомогательные процессы непосредственно на языке программирования то есть, грубо говоря это некие классы которые инкапсулирует сложное преобразование текста программ в простой интерфейс разработчика.
Всё, что разрабатывает разработчик, исполняется в специальной среде это среда является частью JDK и позволяет исполнять все программы написанные разработчиками на конечном в компьютере. Именно эта среда и устанавливается на компьютере пользователя чтобы пользователь мог запускать приложения, написанные на языке Java. Итак, самая необходимая вещь для любого пользователя это JRE. Это аббревиатура расшифровывается как Java Runtime Environment, то есть среда исполнения программ на языке Java. Она содержит в себе основной внутренний механизм который называется Java virtual machine и библиотеку из разных классов чтобы эта виртуальная машина хорошо работала умела показывать пользователю строки осуществлять ввод-вывод фреймворк коллекций и прочее, тут тоже есть куча интересных аббревиатур, которые мы так или иначе изучим, например, Java native interface, Java database connectivity и другие. Если копнуть ещё чуть глубже, можно и JRE разделить на JSE и JEE, но нас это деление пока не очень интересует, оно произойдёт естественным образом на более старших курсах. Пока что всё, что мы будем изучать, это JSE.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Инструментарий разработчика мы будем так или иначе рассматривать весь оставшийся курс, части среды исполнения мы тоже будем всесторонне изучать на последующих уроках. Сейчас хотелось бы подробнее остановиться на виртуальной машине Java, поскольку понимание того, как она устроена, должно значительно облегчить для вас понимание процесса исполнения программы и, как следствие, процесс разработки этих самых программ. Виртуальная машина Java осуществляет загрузку классов программы в оперативную память, причём здесь имеется ввиду не оперативная память как аппаратная часть компьютера, а некая выделенная часть этой оперативной памяти, которой с нами поделилось операционная система. Также осуществляется управление памятью, а именно очистка и сборка мусора и непосредственное исполнение классов нашего приложения, путём компиляции методов из промежуточного байткода в непосредственные вызовы операционной системы или другого исполнителя, то есть грубо говоря преобразования классов Java в ассемблерный код конкретного компьютера. Этот процесс называется JIT компиляция. Существуют разные Реализация виртуальных машин (\href{https://ru.m.wikipedia.org/wiki/Список_виртуальных_машин_Java}{Wikipedia: Список виртуальных машин Java}), даже экзотические, например мультиязыковой интерпретатор GraalVM. По большей части виртуальные машины отличаются как раз этой частью, с Just In Time компиляцией, то есть с преобразованием методов в непосредственные машинные вызовы в реальном времени. Чем быстрее происходит эта JIT компиляция, тем, соответственно, быстрее работает приложение на виртуальной машине. JVM самостоятельно осуществляет сборку так называемого мусора, что значительно облегчает работу программиста по отслеживанию утечек памяти, но, на мой взгляд, не способствует должной концентрации внимания программиста на этом вопросе. Важно помнить, что в Java утечки памяти всё равно существуют, особенно при программировании многопоточных приложений.
\paragraph{Задания для самопроверки}
\begin{enumerate}
\item JVM и JRE - это одно и тоже? (нет)
\item Что входит в состав JDK, но не входят в состав JRE? (компилятор, средства для доков, отладки, развёртывания)
\item Утечки памяти (2)
\begin{itemize}
\item Невозможны, поскольку работает сборщик мусора;
\item Возможны;
\item Существуют только в С++ и других языках с открытым менеджментом памяти.
\end{itemize}
\end{enumerate}
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Ну, наконец-то проект. Проекты бывают разной сложности, сейчас поговорим о проектах без применения сборщиков, потому что сборщикам и соответствующим проектам у нас будет посвящено отдельное занятие. Все проекты по сложности структуры можно разделить на четыре основные категории: простейшие, обычные, шаблонные, скриптовые.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Начнём с простейшего проекта, который будет состоять из одного файла исходников. Естественно, вы спросите, что за чушь, мы же уже сотни раз писали «привет мир» и запускали его удобной зелёной стрелочкой в ИДЕ. Есть ответ. Мы же выясняем, что там внутри, под капотом этих удобных стрелочек и привычных процессов. Да и ради простейшего проекта запускать тяжеловесную среду программирования как-то неестественно что ли.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Пока далеко не ушли от простейших проектов, думаю, целесообразно будет проговорить о скриптовых возможностях Java. Поскольку язык является не только компилируемым, но и интерпретируемым благодаря работе JVM, его возмжоно использовать как скриптовый внутри юпитер ноутбука, подключив соответствующее ядро. Интересной особенностью юпитер ноутбука является разделение фронтенда и ядра, что даёт возможность заменять эти самые ядра (в терминах юпитера они называются кернелы). скачав и установив ядро IJava мы получаем шикарную возможность делать простые наброски логики, снабжая их комментариями в формате маркдаун. На самом деле можно делать и непростые наброски, но это выходит далеко за рамки нашего курса о языке. Если будет очень интересно, призываю вас самостоятельно почитать о возможностях ядра, благо на него очень хорошая документация с примерами.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Как я сказал в начале этого блока, шаблонные проекты, создаваемые сборщиками мы обсудим на следующей лекции, поэтому осталось только поговорить о том, из чего состоит обычный простой проект. Итак чаще всего, это пакеты, классы, метод main, комментарии, ресурсы. Обо всём по порядку. Давайте сразу договоримся, что я сначала буду давать формальное понятие, а потом буду говорить, как его можно представить в более простом виде.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Пакет - это пространство имён языка. Теоретически, как мы видели на примере простейшего проекта, класс может не находиться в пакете, но на практике такого положения дел не встретить. Например, в проекте из нескольких модулей классы без пакетов просто не будут найдены. Пакет - это некоторое место хранения и создания иерархии классов проекта. Проще всего представить пакет как папку на диске, тем более, что в файловой системе пакеты так и показываются. Но пакет - это чуть более сложная сущность. Для пакетов существуют модификаторы доступа, классы, находящиеся в одном пакете доступны друг другу даже если находятся в разных проектах (это как раз и есть отличие пакетов от папок на диске). Для нас пока достаточно, что пакеты объединяют классы по смыслу. У пакетов есть правила именования: обычно это обратное доменное имя (например, для гб.ру это будет ру.гб), название проекта, и далее уже внутренняя структура. Пакеты следует писать латинскими строчными буквами. Чтобы явно отнести класс к пакету недостаточно его просто туда положить, нужно ещё прописать в классе название пакета после специального оператора package.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Класс - это основная единица исходного кода программы. Без класса не может начаться никакое программирование на языке Java. Даже скомпилированные файлы исходного кода имеют расширение .class. Что такое классы в терминах ООП вы уже знаете, но в Java классы - это более широкое понятие. Сама программа - это тоже класс. У классов также есть модификаторы доступа. Важно про классы - это то, что в файл с расширением джава следует класть только один класс и делать его публичным. Формально, язык не запрещает иметь в файле другие, не публичные классы, но писать так свои программы - это не толкьо дурной тон, но и весьма сбивающая с толку практика. У классов также есть правила именования. Название класса - это имя существительное в именительном падеже, написанное с заглавной буквы. Если требуется назвать класс в несколько слов, применяют так называемый upper camel case, то есть пишут слова строчными буквами, делая заглавной первую букву каждого слова.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Метод мейн - это единственный в своём роде метод, который является точкой входа в программу. Метод является публичным, и должен находиться в публичном классе, то есть он доступен для исполнения любому желающему. А желает его исполнить JVM. Метод именно с такой сигнатурой (публичный, статический, ничего не возвращающий, принимающий массив строк) - это конвенция, договорённость, об именовании. JVM при старте программы среди всех пакетов и классов будет искать именно этот метод и будет передавать ему именно массив строк в качестве параметра. При создании этого метода важно полностью повторить его сигнатуру и обязательно написать его с название со строчной буквы.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
С комментариями всё просто - это часть кода, которую игнорирует компилятор при преобразовании исходного кода. Комментарии бывают:
\begin{itemize}
\item \code{// comment} - до конца строки. Самый простой и самый часто используемый комментарий. Эти комментарии обычно поясняют неочевидные программные решения или сложные алгоритмы.
\item \code{/* comment */} - внутристрочный или многострочный. Никогда не используйте его внутри строк, несмотря на то, что это возможно. Обычно эти комментарии используют, чтобы оставить какое-нибудь длинное сообщение будущим поколениям программистов, которые будут поддерживать этот код.
\item \code{/** comment */} - комментарий-документация. Многострочный. Из него утилитой Javadoc создаётся веб-страница с комментарием. Самый полезный из всех полезных комментариев. Сейчас будем учиться делать из таких комментариев целые веб-сайты с программной документацией.
\end{itemize}
Есть ещё такое собирательное понятие, как ресурсы, но его, возможно не следует рассматривать прямо сейчас потому что оно не является обязательным для вообще любого проекта, в отличие от пакетов, классов и комментариев. Работу с ресурсами мы разберём когда будем беседовать о более сложных проектах.
\paragraph{Задания для самопроверки}
\begin{enumerate}
\item Зачем складывать классы в пакеты? (структурирование, видимость*)
\item Может ли существовать класс вне пакета? (да*, нет)
\item Комментирование кода(2)
\begin{itemize}
\item Нужно только если пишется большая подключаемая библиотека;
\item Хорошая привычка;
\item Захламляет исходники.
\end{itemize}
\end{enumerate}
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Для дальнейших упражнений на сегодняшнем уроке нам понадобится небольшой проект, буквально из двух классов в двух пакетах, без каких-то ограничений видимости и других усложнений. На основе этого проекта мы и поговорим об оставшихся на сегодня двух несложных темах - терминальная сборка и генерация документации. Дерево проекта представлено на слайде, где папка с выходными (скомпилированными) бинарными файлами пуста, а файл README.md создан для лучшей демонстрации корня проекта.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Итак. У нас был простейший проект, написать его было элементарно, что там, простой хелловорлд, скомпилировать и запустить его также просто. Нам понадобится утилита javac из состава JDK которая скомпилирует из текста программы байт-код, и утилита java из состава JRE которая этот байт-код сможет интерпретировать. То есть очевидно, и мы просто проговорим это дополнительно, что простому пользователю для запуска программы не нужен весь тяжёлый ЖДК. Показываем работу следующими командами
\begin{verbatim}
ls
javac Main.java
ls
java Main
\end{verbatim}
Также существует забавный факт, что скомпилированные джава классы всегда содержат одинаковые первые 4 байта, которые в 16тиричном представлении формируют надпись «кофе, крошка», cafe babe.
(открыть мейн.класс в хекс-редакторе, показать)
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Для компиляции более сложных проектов, содержащих каике-то иерархические структуры из пакетов и классов, необходимо указать компилятору, откуда забирать файлы исходников (сорспас) и куда класть готовые классы (д может быть расшифрован как директория или как дестинейшн - назначение), а интерпретатору, откуда забирать файлы скомпилированных классов (класпас). Как хорошо видно среди только что написанных букв, для этого достаточно через пробел написать соответствующие ключи компиляции и запуска. Конечно, писать каждый раз эти ключи довольно утомительно и для автоматизации этого процесса придумали сборщики проектов, но всегда круто знать и уметь делать вещи в отсутствие сложного инструментария. Показываем работу следующими командами
\begin{verbatim}
javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
java -classpath ./out ru.gb.jcore.sample.Main
\end{verbatim}
\paragraph{Задания для самопроверки}
\begin{enumerate}
\item Что такое javac? (компилятор)
\item Кофе, крошка? (да)
\item Где находится класс в папке назначения работы компилятора?
\begin{itemize}
\item В подпапках, повторяющих структуру пакетов в исходниках
\item В корне плоским списком;
\item Зависит от ключей компиляции.
\end{itemize}
\end{enumerate}
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
И к последней на сегодня теме, которая мочему-то вызывает у многих даже активно практикующих программистов отторжение. К самому полезному для передачи опыта между программистами и командами программистов. К документации на свой код. Конечно, особенно ярые противники описывать свою работу сейчас возмутятся, мол, я ж программист, пусть программную документацию пишут технические писатели. Но если подумать, то техпис фактически всё равно придёт к вам, программисту, за разъяснениями, что именно делает тот или иной фрагмент кода. А комментарии к коду всё равно писать, да и техпису, скорее всего придётся отвечать в текстовом виде, так почему бы не облегчить себе жизнь сразу, документируя свой код по мере написания, например, между спринтами.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Чтобы просто создать документацию надо вызвать утилиту javadoc с небольшим количеством ключей, давайте их разберём. Уже знакомый нам ключ -d означающий папку (или директорию, кому как больше нравится) в которую следует положить готовую документацию. Помним, ключ легко запомнить, если расшифровать его как дестинейшн, назначение. -sourcepath означает папку, где лежат исходники проекта, как мы помним, в исходниках мы пишем те самые комментарии, которые потом можно преобразовать в джавадок. -cp говорит о том, где лежат готовые скомпилированные классы, эта информация нужна, чтобы понять, как программа в итоге скомпилировалась, что в ней задействовано, что как связано и прочее. -subpackages говорит о том, что надо взять не только указанный далее пакет, но и все его подпакеты рекурсивно. Ну и, собственно, пакет, для которого нужно создать документацию, ru. Показываем работу следующими командами:
\begin{verbatim}
javadoc -d docs -sourcepath src -cp out -subpackages ru
\end{verbatim}
Если нужно сгенерировать документацию к конкретному пакету, например, если вы хотите разложить их по разным папкам, то надо указатеь его полный адрес, и, вероятно, убрать ключ subpackages
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Чтобы учесть то, что происходитс ОС Windows надо чуть больше, поскольку так исторически сложилось, что у Windows есть проблемки с локалью. Поскольку все программы на Java пишутя в кодировке UTF-8, а основная кодировка всех приложений, работающих под ОС виндоус это ср1251, то при создании документации стандартными средствами итоговые веб-страницы создаются на клингонском. Чтобы перевести их на земной кириллический, нужно добавить три ключа - указать какая локаль установлена -locale, в какой кодировке исходный текст -encoding utf-8, в какой кодировке должен быть итоговый документ -docencoding cp1251. Показываем работу следующими командами:
\begin{verbatim}
javadoc -locale ru_RU -encoding utf-8 -docencoding cp1251 \
-d docs -sourcepath src -cp out -subpackages ru
\end{verbatim}
Поскольку я сейчас не с виндоусом, то такие настройки наоборот, сломают отображение.
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Javadoc находится в JDK или JRE? (ждк)
\item Что делает утилита Javadoc? (3)
\begin{itemize}
\item Создаёт комментарии в коде;
\item Создаёт программную документацию;
\item Создаёт веб-страницу с документацией из комментариев.
\end{itemize}
\end{enumerate}
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Компилировать проект руками — занятие весьма утомительное, особенно когда исходных файлов становится больше одного, и для каждого из них надо каждый раз набивать команды компиляции, а ещё не забыть о том, какой файл в проекте главный, какие включены библиотеки и многое другое. Руки так и тянутся куда-то это записать, чтобы не забыть, но говорить о специальных менеджерах проектов ещё рано, поэтому научимся автоматизировать терминальную сборку. Будем учиться создавать и использовать Мейкфайлы.
Makefile — это набор инструкций для программы make (классически, это GNU Automake), которая помогает собирать программный проект буквально в одну команду. Хотя эта технология и отмирает, но все равно используется как некоторыми отдельными разработчиками, так и в проектах, особенно часто это встречается, когда в Java переквалифицируются бывшие С++ программисты. Если запустить make то программа попытается найти файл с именем по-умолчанию Makefile в текущем каталоге и выполнить инструкции из него. Эти самые мейкфайлы и сохранят для нас все нужные настройки проекта, компиляции, структуры и прочего.
Не лишним будет напомнить, что мейкфайлы, не привносят ничего принципиально нового в процесс компиляции, а только лишь автоматизируют его, поэтому важно помнить, что все действия, которые мы совершаем при ручной компиляции просто записаны в мейкфайл, и обратно, то что записано в мейкфайле может быть выполнено вручную в терминале.
В простейшем, то есть нашем, случае, в мейкфайле достаточно описать так называемую цель, таргет, и что нужно сделать для достижения этой цели. Цель, собираемая по-умолчанию называется all, так, для простейшей компиляции нам нужно написать
\begin{verbatim}
all:
javac -sourcepath .src/ -d out src/ru/gb/jcore/sample/Main.java
\end{verbatim}
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
По сути, это всё. Но мы же хотим, чтобы вся было гибо и не нужно было запоминать что как называется, чтобы это потом можно было поправить где-то в одном месте. Для этого в мейкфайлах придумали переменные, и они работают как самые обычные переменные, их значение подставляется в то место, где переменная вызывается. Добавив пару таргетов и немного переменных мы получим мейкфайл как на слайде, он позволит нам не только компилировать проект, но также очищать выходные файлы в случае неудачи и запускать его. Также не особенно переживая о ключах, командах и прочем.
Для того, чтобы утилита мейк сделала своё дело нужно в терминале просто её вызвать без аргументов. Чтобы воспользоваться другими написанными таргетами (автоматизациями, задачами) нужно после имени утилиты написать через пробел название таргета, например, часто пишут задачу clean, рекурсивно очищающую папку с готовыми классами, соответственно, вызов make clean как ни странно, рекурсивно удалит папку с готовыми классами.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
Docker — программное обеспечение для автоматизации развёртывания и управления приложениями, контейнеризатор приложений. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть развёрнут почти на на любой системе, и уж точно на системах большой тройки (линукс виндоус макос).
Целью этого курса не является рассмотрение всех возможностей докер, поэтому ограничимся только теми, которые нам понадобятся, чтобы увидеть заветное, запущенное джавой, «привет мир» в терминале. Снова не лишним будет напомнить, что мы можем выполнить все те же самые действия в простом терминале. Но докер даёт нам немного преимуществ. Например, не нужно устанавливать JDK и думать о переключении между версиями, достаточно взять контейнер с нужной версией и запустить наше приложение в нём. Помните я буквально полчаса назад упоминал о том, что есть более абстрактный инструмент менеджмента версий языка и инструментария? вот, это он.
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
докерфайл
% -----------------------------------------------------------------------------------
\showslide{build/jc-1-b.pdf}
На этом уроке мы рассмотрели историю и причины создания языка, его окружение и структуру проекта, узнали, что скрывают в себе такие аббревиатуры как JDK JRE JVM SDK JIT CLI. Рассмотрели базовое применение утилит java, javac и javadoc. Даже немного посмотрели в сторону автоматизации рутинных задач. В качестве домашнего задания попробуйте
\begin{itemize}
\item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю.
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам.
\end{itemize}
На следующей лекции мы поговорим о том как осуществлять управление более сложными проектами: Jar-файлы; сборщики Gradle/Maven; чтоб такое репозитории и как ими пользоваться.
\end{document}

599
scenarios/jtc1-1b.tex Normal file
View File

@ -0,0 +1,599 @@
\documentclass[russian]{beamer}
\usepackage{multicol}
\usepackage[russian]{babel}
\usepackage{fontspec}
\input{../settings/fancy-listings-preamble}
\usepackage{forest}
\makeatletter
\def\beamer@framenotesbegin{% at beginning of slide
\usebeamercolor[fg]{normal text}
\gdef\beamer@noteitems{}%
\gdef\beamer@notes{}%
}
\makeatother
\newcommand{\code}[1]{\small{\texttt{\detokenize{#1}}}\normalsize}
% \setbeamertemplate{note page}{\pagecolor{yellow!5}\insertnote}
% \setbeameroption{show notes on second screen=right}
\usetheme{Madrid}
\usecolortheme{seahorse}
\setsansfont{IBM Plex Sans}
\title{Платформа: история и окружение}
\author{Иван Игоревич Овчинников}
\institute[GB: Java]{GeekBrains. Java Core.}
\date{2022}
\begin{document}
\setbeamertemplate{enumerate items}[circle]
\setbeamertemplate{note page}[plain]
\setbeameroption{show notes}
\frame{\titlepage}
\note{Добро пожаловать на техническую специализацию Java, лучшую из всех технических специализаций Java, что вы сможете найти.}
\begin{frame}
\frametitle{Введение и знакомство (о себе)}
Иван Овчинников. НПО ИТ, РКС, GB.
\begin{block}{Используемые технологии}
Много и с удовольствием C, C++, Java, Verilog. C\# и Python даже не считаем.
\end{block}
Для GB более 20 потоков по разным направлениям, более двух тысяч студентов.
\end{frame}
\note{Здравствуйте, меня зовут Иван, я разработчик программного обеспечения в Российских космических системах, начальник группы программистов, автор и преподаватель нескольких курсов в направлении программирования на портале GeekBrains. Пара слов обо мне, почему я нахожусь здесь и планирую Вам что-то рассказывать про язык Java? Для этого придётся вынести за скобки мой опыт работы в цифровой схемотехнике и других языках, в том числе создание бортовой аппаратуры, которая прямо сейчас летает у нас над головами или продолжает доставлять другие полезные грузы в космос. С точки зрения языка Java, обо мне можно сказать, что я являюсь разработчиком нескольких отраслевых информационных систем поддержки единой наземной инфраструктуры российского космического агентства. На моём счету также участие в межотраслевых проектах по созданию единых баз данных космического применения.
}
\begin{frame}
\frametitle{О курсе}
и об уркое
\end{frame}
\note{Данный курс, первый из технической специализации, направлен на первое знакомство со внутренним устройством языка и фреймворком разработки приложений с его использованием. Курс демонстрирует механизмы работы знакомых студенту концепций на примере языка Java. В рамках курса будут рассмотрено устройство языка Java и сопутствующих технологических решений, платформы для создания и запуска приложений на JVM-языках (Groovy, Kotlin, Scala, и др). Будут рассмотрены некоторые базовые пакеты ввода-вывода, позволяющие манипулировать данными за пределами программы. В результате прохождения курса у вас, слушатели, должно появиться знание принципов работы платформы Java, понимание того, как язык выражает принципы программирования, его объектную природу. Вы научитесь писать базовые терминальные приложения и утилиты, решать задачи (в том числе алгоритмические, не требующие подключения сложных библиотек) с использованием языка Java и с учётом его особенностей.
}
\newpage
\note{На этом уроке мы поговорим о
\begin{itemize}
\item краткой истории и причинах возникновения язка
\item что нужно скачать, откуда и как это всё выбирать
\item из чего всё состоит
\item изучим простую структуру проекта и способы его запуска
\item коротко рассмотрим утилиту джавадок
\end{itemize}
Рассмотрим примитивный инструментарий и базовые возможности платформы для разработки приложений на языке Java. В конце урока рассмотрим альтернативные способы сборки проектов, популярные и не очень.
}
\begin{frame}
\frametitle{Краткая история}
\includegraphics[width=12cm]{../pics/jc-01-tiobe.png}
\end{frame}
\note{Итак язык Java. Согласно википедии, Java — строго типизированный объектно-ориентированный язык программирования общего назначения, разработанный компанией Sun Microsystems. Разработка ведётся сообществом; язык и основные реализующие его технологии распространяются по лицензии GPL.
Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре, для которой существует реализация виртуальной Java-машины. Дата официального выпуска — 23 мая 1995 года. Традиционно занимает высокие места в рейтингах популярности языков программирования (3-е место в рейтинге TIOBE (на август 2022)). На графике отлично видно, что с 2002 года язык уверенно держится в тройке популярных, значительную часть времени возглавляя его.
Но это всё - сухие факты, ничего не говорящие нам о том, чем руководствовались разработчики языка и что нам, программистам, с этим делать.
}
\newpage
\note{Существует, интересная версия происхождения названия языка, связанная с аллюзией на кофе машину как пример бытового устройства, для программирования которого изначально язык создавался. Кстати, в результате работы проекта мир увидел принципиально новое устройство, карманный персональный компьютер, который опередил своё время более чем на 10 лет, но из-за большой стоимости не смог произвести переворот в мире технологии и был забыт. Устройство Star7 не пользовалось популярностью, в отличие от языка программирования Java и его окружения. С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и серверного программного обеспечения. Тогда же некоторое распространение получила технология Java-апплетов — графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей динамических веб-страниц технология стала применяться редко и язык стал применяться для бэк-энда.
}
\begin{frame}
\frametitle{Почему Java?}
Написано однажды, работает везде.
\end{frame}
\note{Итак Язык программирования Java занял свою нишу в системном и прикладном программировании из-за своей высокой скорости работы, и веб-программировании, из-за удобного сетевого окружения, ставшего основой для создания бэк-энда веб-сервисов. Java очевидно испытал влияние языков C, C++, Pascal и других, так что многое в этих языках достаточно досконально изучить один раз, чтобы иметь возможность понимать все связанные.
Поскольку язык изначально проектировался для множества разнообразных исполнителей с разными архитектурами процессоров и систем, было принято решение отделить исполнителя от решаемой прикладной задачи, так появилась виртуальная машина Java, речь о которой пойдёт немного позже. Основной смысл в том, что у языка Java появился девиз: Написано однажды, работает везде.
}
\begin{frame}
\frametitle{Задания для самопроверки}
\begin{enumerate}
\item Как Вы думаете, почему язык программирования Java стал популярен в такие короткие сроки? (3)
\begin{itemize}
\item существовавшие на тот момент Pascal и C++ были слишком сложными;
\item Java быстрее C++;
\item Однажды написанная на Java программа работает везде.
\end{itemize}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Базовый инструментарий}
\begin{enumerate}
\item Eclipse
\item NetBeans
\item IntelliJ IDEA
\item BlueJ
\item Oracle JDeveloper
\item MyEclipse
\item Greenfoot
\item jGRASP
\item JCreator
\item DrJava
\end{enumerate}
\end{frame}
\note{Мы привыкли к тому, что для программирования нужна некоторая среда, которая будет удобно подсказывать нам, что делать, как писать программу, запускать написанный код и помогать нам отлаживать его. Чаще всего это так, но я призываю вас не останавливаться на единственном инструменте, ведь если быть всегда сосредоточенным на отвёртке, вы никогда не узнаете, что люди придумали очень удобный шуруповёрт.
Я не планирую рекламировать ту или иную среду, скорее всего не буду даже много говорить о плюсах и минусах той или иной среды, просто покажу список и коротко расскажу о главных действующих лицах:
NetBeans - если коротко, то эта среда с нами из уважения к истории, она была первой, созданной для разработки на языке Java. Долгое время разработка этой среды не велась, но в последние несколько лет разработчики как будто бы вспомнили о ней и активно взялись за дело, сейчас есть версии под все популярные ОС, поддерживается весь популярный современный функционал, есть прикольные самобытные моменты, вроде расширенных клавиатурных макросов для написания функций с передаваемыми в них массивами;
}
\newpage
\note{
Eclipse - проще, наверное, назвать язык или технологию, под которую нет плагина для этой весьма расширяемой и дополняемой среды программирования. Долгое время, вплоть до недавнего, а где-то и до сих пор, является корпоративным стандартом для написания Enterprise приложений и прочих сложных корпоративных приложений. Весьма гибкая среда и-за того, что разрабатывается Eclipse Foundation к ней можно подключить плагины, решающие почти любые задачи разработки. Из того что я видел своими глазами, Siemens использует Eclipse для разработки своих систем поддержки жизненного цикла изделий;
IntelliJ IDEA - стандарт де-факто примерно десять последних лет. Не уверен, можно ли назвать эту среду российской разработкой, но у компании, разрабатывающей эту среду, три русских учредителя. Да и сама эта компания началась именно с этой среды. В этой среде можно настроить почти любую деталь, что часто бывает очень удобно. Среда расширяется плагинами на почти все случаи жизни разработчика. Часто входит в экосистему JetBrains, развёрнутую на предприятии, поэтому тесно интегрируется в другие сферы деятельности компании. Существует как бесплатная, так и платная версия с расширенным функционалом, например, доступа к базам данных.
}
\newpage
\note{
Отдельно стоит обговорить такую среду, как Android Studio, как мог заметить внимательный зритель, её нет в списке на слайде, но не потому, что в ней нельзя разрабатывать Java-приложения, а потому что если не разрабатывать в ней именно Android приложения, следует отказаться от её использования из-за некоторой избыточности. Среда снабжена значительным количеством надстроек и эмуляторов мобильных устройств, которые попросту будут вам мешать, если вы не используете их в своей профессиональной деятельности. С другой стороны, если ваша цель - это именно мобильная разработка под Android, то и выбора у вас особо нет, только Android Studio.
}
\begin{frame}
\frametitle{Задания для самопроверки}
\begin{enumerate}
\item Как Вы думаете, почему среда разработки IntelliJ IDEA стала стандартом де-факто в коммерческой разработке приложений на Java? (4)
\begin{itemize}
\item NetBeans перестали поддерживать;
\item Eclipse слишком медленный и тяжеловесный;
\item IDEA оказалась самой дружелюбной к начинающему программисту;
\item Все варианты верны.
\end{itemize}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Что нужно скачать}
\begin{enumerate}
\item ждк
\item среду
\end{enumerate}
\end{frame}
\note{Для разработки на языке Java вам может понадобиться довольно много разного инструментария, тем более, что требования к инструментарию отличаются ещё и от команды к команде, вам может потребоваться средство для работы с БД, средства моделирования и описания систем, дополнительные средства документирования кода и решений. Но совершенно точно можно сказать, что без двух вещей обойтись не удастся: это иде, они же среды программирования и ждк, он же инструментарий разработчика на java. О средах программирования дополнительно только что поговорили, нужно выбрать какую-нибудь, и скачать. Скорее всего вы это сделали для прохождения более ранних курсов, сейчас сможете для себя выбрать инструмент более осознанно. В курсе, кроме этой лекции и следующего за ней семинара, будет использоваться комьюнити версия среды Intellij IDEA, можете для простоты выбрать её, что вы уже скорее всего и сделали. Наверняка, для прохождения предыдущих курсов вы уже скачали и установили JDK какой-нибудь хорошей новой версии, а сейчас пришла пора разобраться, что это, какие они бывают, откуда их брать и как их выбирать, мы же за осознанность как-никак.}
\begin{frame}
\frametitle{Что нужно скачать}
\begin{enumerate}
\item Oracle JDK
\item OpenJDK by Oracle
\item Liberica JDK
\item экзотические
\begin{itemize}
\item GOST Java
\item AdoptOpenJDK
\item Red Hat OpenJDK
\item Azul Zulu
\item Amazon Corretto
\end{itemize}
\end{enumerate}
\end{frame}
\note{Итак, вендоры и версии. JDK развивается, поэтому выходят новые версии, исправляющие предыдущие недочёты, добавляющие новую функциональность. Самая распространённая версия в современной российской действительности - восьмая, но есть очень серьёзный тренд на переход к 11 и 13й версиям, на более новые часто смотрят с опаской. Распространённых вендоров три - оракл, опен, либерика. Есть, конечно, компании, собирающие свой инструментарий из открытых источников самостоятельно, но их крайне мало. Про экзотических вендоров рассказывать смысла не много, важно помнить, что они есть и у них у всех разные лицензионные политики. Я в курсе буду использовать либерику, как делаю последние несколько лет, хотя довольно долгое время пользовался ораклом. Поскольку я работаю в около- государственной компании, не могу не упомянуть о ГОСТ джаве, которая часто всерьёз рассматривается в организациях, подобных моей, и об опенЖДК, который является основой для самостоятельных сборок инструментария.
Наиболее популярной, конечно, является оракл ждк, но, если мне будет позволено высказать персональное мнение, это больше дань традиции, нежели какая-то жизненная необходимость. }
\begin{frame}
\frametitle{Кто делает для нас JDK}
\includegraphics[width=12cm]{../pics/jc-01-jdk-contrib.png}
\end{frame}
\note{Если внимательно посмотреть на компании, внесшие вклад в развитие открытой части инструментария, начиная с ждк11 и до актуального на сегодня ждк18, конечно, максимально вкладывается оракл, но и беллсофт, производитель либерики, там будет в первой десятке. Повторюсь, я на курсе буду использовать либерику ждк11, благо для неё есть и докер-образ, если нужно как-то автоматизировать сборки вашего приложения, например; вы можете использовать любую другую не старше 8. Все примеры я буду приводить с учётом именно 8й версии языка, чтобы рассмотреть подходящий подавляющему большинству людей инструментарий. Если у вас уже установлена 11я версия от другого вендора - ничего менять не нужно, если установлена более новая версия, есть вероятность, что некоторые примеры будут отмечаться как чрезвычайно устаревшие, возможно, эти предупреждения на этапе обучения следует игнорировать. Для выбора вендора внимательно ознакомьтесь с лицензией, а для выбора версии языка руководствуйтесь здравым смыслом: большинство компаний в России и мире работают на 8, 11 или 13й версиях. Зачем учиться на какой-нибудь 18-й версии, если потом на работе вы не увидите половины каких-нибудь новых фич и фактически, придётся переучиваться?
}
\newpage
\note{
Из-за обилия вендоров и версий, которые нужно поддерживать, создаётся необходимость в автоматизации переключения между версиями. На помощь приходят инструменты, наподобие SDKMan, написанные на языке bash, позволяющие осуществить этот самый рутинный и утомительный менеджмент. Очевидным недостатком SDKMan является то, что помимо самого СДКМан нужно установить требующиеся версии и варианты ЖДК специальными внутренними командами. Хотя, например, можно перевести приложение в режим офлайн и попробовать как-то поплясать с бубном вокруг настроек. Думаю, что если в команде используется этот инструмент, для него уже есть все необходимые скрипты настроек и автоматизации. Есть и другие варианты, об одном из них (Docker) мы поговорим позднее в этой лекции.}
\begin{frame}
\frametitle{Когда нужно по-быстрому}
\includegraphics[width=12cm]{../pics/jc-01-jupyter-logo.png}
\end{frame}
\note{Для решения некоторых несложных задач курса мы будем писать простые приложения, не содержащие ООП, сложных взаимосвязей и проверок, в этом случае нам понадобится Jupyter notebook с установленным ядром (kernel) IJava. Да, многие думают, что Jupyter ноутбуки - это только для языка пайтон или для скриптовых языков, но это не так. Архитектура юпитер ноутбука позволяет ему работать с любым ядром, главное, чтобы ядро умело корректно интерпретировать написанное в ячейке с кодом. Ядро IJava делает именно это - интерпретирует Java-код, используя установленный на компьютере разработчика JDK.}
\begin{frame}
\frametitle{Переменные среды}
\begin{itemize}
\item \code{PATH}
\item \code{JAVA_HOME}
\item \code{JRE_HOME}
\item \code{J2SDKDIR}
\item \code{J2REDIR}
\end{itemize}
\end{frame}
\note{Для корректной работы самого инструментария и сторонних приложений, использующих тот инструментарий, проследите, пожалуйста, что установлены следующие переменные среды ОС:
\begin{itemize}
\item [] в системную \code{PATH} добавить путь до исполняемых файлов JDK
\item [] \code{JAVA_HOME} путь до корня JDK
\item [] \code{JRE_HOME} путь до файлов JRE из состава установленной JDK
\item [] \code{J2SDKDIR} устаревшая переменная для JDK, используется некоторыми старыми приложениями
\item [] \code{J2REDIR} устаревшая переменная для JRE, используется некоторыми старыми приложениями
\end{itemize}
Это позволит вам не особенно много думать о настройках видимости библиотек ОС при дальнейшей установке инструментария, например, сборщиков проектов.}
\begin{frame}
\frametitle{Задания для самопроверки}
\begin{enumerate}
\item Чем отличается SDK от JDK? (J это частный случай, больше спец. библиотек)
\item Какая версия языка (к сожалению) остаётся самой популярной в разработке на Java? (8, 1.8)
\item Какие ещё JVM языки существуют? (Scala, Kotlin, Groovy)
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{JDK и его друзья}
TL;DR:
\begin{itemize}
\item JDK = JRE + инструменты разработчика;
\item JRE = JVM + библиотеки классов;
\item JVM = Native API + механизм исполнения + управление памятью.
\end{itemize}
\end{frame}
\note{Очень часто в интернете, при скачивании какого-то программного обеспечения, связанного с Java можно увидеть разные аббревиатуры: JRE, JVM, JDK и тому подобные, и чтобы в них не запутаться давайте коротко и быстро разберёмся что они значат, потому что я чувствую, как вам уже начинают надоедать все эти вступления.
Пойдём от самого масштабного и общего к самому маленькому и частному. Самая масштабная и общая аббревиатура - это JDK Java Development Kit - инструментарий разработчика на языке Java. Это обычный SDK который содержит в себе также всё необходимое для разработки именно на языке Java здесь есть куча других аббревиатур, компилятор, средства развёртывания, создания документации, итд они позволяют удобно писать программы на языке Java и абстрагируют программиста от необходимости описывать все вспомогательные процессы непосредственно на языке программирования то есть, грубо говоря это некие классы которые инкапсулирует сложное преобразование текста программ в простой интерфейс разработчика.
}
\newpage
\note{
Всё, что разрабатывает разработчик, исполняется в специальной среде это среда является частью JDK и позволяет исполнять все программы написанные разработчиками на конечном в компьютере. Именно эта среда и устанавливается на компьютере пользователя чтобы пользователь мог запускать приложения, написанные на языке Java. Итак, самая необходимая вещь для любого пользователя это JRE. Это аббревиатура расшифровывается как Java Runtime Environment, то есть среда исполнения программ на языке Java. Она содержит в себе основной внутренний механизм который называется Java virtual machine и библиотеку из разных классов чтобы эта виртуальная машина хорошо работала умела показывать пользователю строки осуществлять ввод-вывод фреймворк коллекций и прочее, тут тоже есть куча интересных аббревиатур, которые мы так или иначе изучим, например, Java native interface, Java database connectivity и другие. Если копнуть ещё чуть глубже, можно и JRE разделить на JSE и JEE, но нас это деление пока не очень интересует, оно произойдёт естественным образом на более старших курсах. Пока что всё, что мы будем изучать, это JSE.
}
\begin{frame}
\frametitle{JVM и что в нём происходит}
рис 1.2 (стр 4) конспекта
\end{frame}
\note{Инструментарий разработчика мы будем так или иначе рассматривать весь оставшийся курс, части среды исполнения мы тоже будем всесторонне изучать на последующих уроках. Сейчас хотелось бы подробнее остановиться на виртуальной машине Java, поскольку понимание того, как она устроена, должно значительно облегчить для вас понимание процесса исполнения программы и, как следствие, процесс разработки этих самых программ. Виртуальная машина Java осуществляет загрузку классов программы в оперативную память, причём здесь имеется ввиду не оперативная память как аппаратная часть компьютера, а некая выделенная часть этой оперативной памяти, которой с нами поделилось операционная система. Также осуществляется управление памятью, а именно очистка и сборка мусора и непосредственное исполнение классов нашего приложения, путём компиляции методов из промежуточного байткода в непосредственные вызовы операционной системы или другого исполнителя, то есть грубо говоря преобразования классов Java в ассемблерный код конкретного компьютера. Этот процесс называется JIT компиляция.
}
\newpage
\note{
Существуют разные Реализация виртуальных машин (Список можно посмотреть, например, в википедии), даже экзотические, например мультиязыковой интерпретатор GraalVM. По большей части виртуальные машины отличаются как раз этой частью, с Just In Time компиляцией, то есть с преобразованием методов в непосредственные машинные вызовы в реальном времени. Чем быстрее происходит эта JIT компиляция, тем, соответственно, быстрее работает приложение на виртуальной машине. JVM самостоятельно осуществляет сборку так называемого мусора, что значительно облегчает работу программиста по отслеживанию утечек памяти, но, на мой взгляд, не способствует должной концентрации внимания программиста на этом вопросе. Важно помнить, что в Java утечки памяти всё равно существуют, особенно при программировании многопоточных приложений. }
\begin{frame}
\frametitle{Задания для самопроверки}
\begin{enumerate}
\item JVM и JRE - это одно и тоже? (нет)
\item Что входит в состав JDK, но не входят в состав JRE? (компилятор, средства для доков, отладки, развёртывания)
\item Утечки памяти (2)
\begin{itemize}
\item Невозможны, поскольку работает сборщик мусора;
\item Возможны;
\item Существуют только в С++ и других языках с открытым менеджментом памяти.
\end{itemize}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Структура проекта}
\begin{itemize}
\item простейшие (один файл)
\item обычные (несколько пакетов)
\item шаблонные (формируются сборщиками)
\item скриптовые (jupyter notebook)
\end{itemize}
\end{frame}
\note{Ну, наконец-то проект. Проекты бывают разной сложности, сейчас поговорим о проектах без применения сборщиков, потому что сборщикам и соответствующим проектам у нас будет посвящено отдельное занятие. Все проекты по сложности структуры можно разделить на четыре основные категории: простейшие, обычные, шаблонные, скриптовые.}
\begin{frame}
\frametitle{Простейший проект}
Думаю, тут надо вживую покодить, благо немного
\begin{multicols}{2}
public class Main
public static void main(String[] args)
System.out.println("Hello, world!");
\columnbreak
ivan@gb src > javac Main.java
ivan@gb src > java Main
Hello, world!
\end{multicols}
\end{frame}
\note{Начнём с простейшего проекта, который будет состоять из одного файла исходников. Естественно, вы спросите, что за чушь, мы же уже сотни раз писали «привет мир» и запускали его удобной зелёной стрелочкой в ИДЕ. Есть ответ. Мы же выясняем, что там внутри, под капотом этих удобных стрелочек и привычных процессов. Да и ради простейшего проекта запускать тяжеловесную среду программирования как-то неестественно что ли.}
\begin{frame}
\frametitle{Jupyter Notebook}
также вживую открыть юпитер ноутбук, показать, что возможно запускать код в скриптовом формате
\end{frame}
\note{Пока далеко не ушли от простейших проектов, думаю, целесообразно будет проговорить о скриптовых возможностях Java. Поскольку язык является не только компилируемым, но и интерпретируемым благодаря работе JVM, его возмжоно использовать как скриптовый внутри юпитер ноутбука, подключив соответствующее ядро. Интересной особенностью юпитер ноутбука является разделение фронтенда и ядра, что даёт возможность заменять эти самые ядра (в терминах юпитера они называются кернелы). скачав и установив ядро IJava мы получаем шикарную возможность делать простые наброски логики, снабжая их комментариями в формате маркдаун. На самом деле можно делать и непростые наброски, но это выходит далеко за рамки нашего курса о языке. Если будет очень интересно, призываю вас самостоятельно почитать о возможностях ядра, благо на него очень хорошая документация с примерами. }
\begin{frame}
\frametitle{Проект на Java}
\begin{itemize}
\item пакеты,
\item классы,
\item метод main,
\item комментарии
\item ресурсы
\end{itemize}
\end{frame}
\note{Как я сказал в начале этого блока, шаблонные проекты, создаваемые сборщиками мы обсудим на следующей лекции, поэтому осталось только поговорить о том, из чего состоит обычный простой проект. Итак чаще всего, это пакеты, классы, метод main, комментарии, ресурсы. Обо всём по порядку. Давайте сразу договоримся, что я сначала буду давать формальное понятие, а потом буду говорить, как его можно представить в более простом виде.}
\begin{frame}
\frametitle{Пакеты}
разделить на два слайда
сначала пакет с пакетами потом
стоящие стройными рядами коробки или контейнеры
\end{frame}
\note{Пакет - это пространство имён языка. Теоретически, как мы видели на примере простейшего проекта, класс может не находиться в пакете, но на практике такого положения дел не встретить. Например, в проекте из нескольких модулей классы без пакетов просто не будут найдены. Пакет - это некоторое место хранения и создания иерархии классов проекта. Проще всего представить пакет как папку на диске, тем более, что в файловой системе пакеты так и показываются. Но пакет - это чуть более сложная сущность. Для пакетов существуют модификаторы доступа, классы, находящиеся в одном пакете доступны друг другу даже если находятся в разных проектах (это как раз и есть отличие пакетов от папок на диске). Для нас пока достаточно, что пакеты объединяют классы по смыслу. У пакетов есть правила именования: обычно это обратное доменное имя (например, для гб.ру это будет ру.гб), название проекта, и далее уже внутренняя структура. Пакеты следует писать латинскими строчными буквами. Чтобы явно отнести класс к пакету недостаточно его просто туда положить, нужно ещё прописать в классе название пакета после специального оператора package.}
\begin{frame}
\frametitle{Классы}
разделить на два слайда
сначала фото пустого школьного класса, потом
\end{frame}
\note{Класс - это основная единица исходного кода программы. Без класса не может начаться никакое программирование на языке Java. Даже скомпилированные файлы исходного кода имеют расширение .class. Что такое классы в терминах ООП вы уже знаете, но в Java классы - это более широкое понятие. Сама программа - это тоже класс. У классов также есть модификаторы доступа. Важно про классы - это то, что в файл с расширением джава следует класть только один класс и делать его публичным. Формально, язык не запрещает иметь в файле другие, не публичные классы, но писать так свои программы - это не толкьо дурной тон, но и весьма сбивающая с толку практика. У классов также есть правила именования. Название класса - это имя существительное в именительном падеже, написанное с заглавной буквы. Если требуется назвать класс в несколько слов, применяют так называемый upper camel case, то есть пишут слова строчными буквами, делая заглавной первую букву каждого слова.}
\begin{frame}
\frametitle{метод мейн}
разделить на два слайда
псвм
показать точку входа как вход в пещеру
\end{frame}
\note{Метод мейн - это единственный в своём роде метод, который является точкой входа в программу. Метод является публичным, и должен находиться в публичном классе, то есть он доступен для исполнения любому желающему. А желает его исполнить JVM. Метод именно с такой сигнатурой (публичный, статический, ничего не возвращающий, принимающий массив строк) - это конвенция, договорённость, об именовании. JVM при старте программы среди всех пакетов и классов будет искать именно этот метод и будет передавать ему именно массив строк в качестве параметра. При создании этого метода важно полностью повторить его сигнатуру и обязательно написать его с название со строчной буквы.}
\begin{frame}
\frametitle{комментарии}
разделить на два слайда
можно как в редакции «комменты и лайки туда»
и слайд с типами комментариев
\end{frame}
\note{С комментариями всё просто - это часть кода, которую игнорирует компилятор при преобразовании исходного кода. Комментарии бывают:
\begin{itemize}
\item \code{// comment} - до конца строки. Самый простой и самый часто используемый комментарий. Эти комментарии обычно поясняют неочевидные программные решения или сложные алгоритмы.
\item \code{/* comment */} - внутристрочный или многострочный. Никогда не используйте его внутри строк, несмотря на то, что это возможно. Обычно эти комментарии используют, чтобы оставить какое-нибудь длинное сообщение будущим поколениям программистов, которые будут поддерживать этот код.
\item \code{/** comment */} - комментарий-документация. Многострочный. Из него утилитой Javadoc создаётся веб-страница с комментарием. Самый полезный из всех полезных комментариев. Сейчас будем учиться делать из таких комментариев целые веб-сайты с программной документацией.
\end{itemize}
}
\newpage
\note{
Есть ещё такое собирательное понятие, как ресурсы, но его, возможно не следует рассматривать прямо сейчас потому что оно не является обязательным для вообще любого проекта, в отличие от пакетов, классов и комментариев. Работу с ресурсами мы разберём когда будем беседовать о более сложных проектах.}
\begin{frame}
\frametitle{Задания для самопроверки}
\begin{enumerate}
\item Зачем складывать классы в пакеты? (структурирование, видимость*)
\item Может ли существовать класс вне пакета? (да*, нет)
\item Комментирование кода(2)
\begin{itemize}
\item Нужно только если пишется большая подключаемая библиотека;
\item Хорошая привычка;
\item Захламляет исходники.
\end{itemize}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Структура простого проекта}
\begin{forest}
for tree={
font=\ttfamily, grow'=0, child anchor=west,
parent anchor=south, anchor=west, calign=first,
edge path={
\noexpand\path [draw, \forestoption{edge}]
(!u.south west) +(7.5pt,0) |- node[fill,inner sep=1.25pt]
{} (.child anchor)\forestoption{edge label};
}, before typesetting nodes={
if n=1 {insert before={[,phantom]}} {} },
fit=band, before computing xy={l=15pt},
}
[Sample
[src
[ru
[gb
[jcore
[regular
[OtherClass.java]
]
[sample
[Main.java]
]
]
]
]
]
[out
]
[README.md]
]
\end{forest}
\end{frame}
\note{Для дальнейших упражнений на сегодняшнем уроке нам понадобится небольшой проект, буквально из двух классов в двух пакетах, без каких-то ограничений видимости и других усложнений. На основе этого проекта мы и поговорим об оставшихся на сегодня двух несложных темах - терминальная сборка и генерация документации. Дерево проекта представлено на слайде, где папка с выходными (скомпилированными) бинарными файлами пуста, а файл README.md создан для лучшей демонстрации корня проекта.}
\begin{frame}
\frametitle{Терминал}
показать папку с простейшим проектом из одного файла, скомпилировать, запустить.
\end{frame}
\note{Итак. У нас был простейший проект, написать его было элементарно, что там, простой хелловорлд, скомпилировать и запустить его также просто. Нам понадобится утилита javac из состава JDK которая скомпилирует из текста программы байт-код, и утилита java из состава JRE которая этот байт-код сможет интерпретировать. То есть очевидно, и мы просто проговорим это дополнительно, что простому пользователю для запуска программы не нужен весь тяжёлый ЖДК. Показываем работу следующими командами
ls /javac Main.java /ls /java Main
Также существует забавный факт, что скомпилированные джава классы всегда содержат одинаковые первые 4 байта, которые в 16тиричном представлении формируют надпись «кофе, крошка», cafe babe.
(открыть мейн.класс в хекс-редакторе, показать)}
\begin{frame}
\frametitle{Терминал}
тут, скорее всего, без лайв кода не обойтись, нужно открыть терминал и показать папку проекта, структуру проекта и содержимое файлов
\end{frame}
\note{Для компиляции более сложных проектов, содержащих каике-то иерархические структуры из пакетов и классов, необходимо указать компилятору, откуда забирать файлы исходников (сорспас) и куда класть готовые классы (д может быть расшифрован как директория или как дестинейшн - назначение), а интерпретатору, откуда забирать файлы скомпилированных классов (класпас). Как хорошо видно среди только что написанных букв, для этого достаточно через пробел написать соответствующие ключи компиляции и запуска. Конечно, писать каждый раз эти ключи довольно утомительно и для автоматизации этого процесса придумали сборщики проектов, но всегда круто знать и уметь делать вещи в отсутствие сложного инструментария. Показываем работу следующими командами
/javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
/java -classpath ./out ru.gb.jcore.sample.Main
}
\begin{frame}
\frametitle{Задания для самопроверки}
\begin{enumerate}
\item Что такое javac? (компилятор)
\item Кофе, крошка? (да)
\item Где находится класс в папке назначения работы компилятора? (1)
\begin{itemize}
\item В подпапках, повторяющих структуру пакетов в исходниках
\item В корне плоским списком;
\item Зависит от ключей компиляции.
\end{itemize}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Javadoc}
Пример автоматически сгенерированной документации
\includegraphics[width=12cm]{../pics/jc-01-javadoc.png}
\end{frame}
\note{И к последней на сегодня теме, которая мочему-то вызывает у многих даже активно практикующих программистов отторжение. К самому полезному для передачи опыта между программистами и командами программистов. К документации на свой код. Конечно, особенно ярые противники описывать свою работу сейчас возмутятся, мол, я ж программист, пусть программную документацию пишут технические писатели. Но если подумать, то техпис фактически всё равно придёт к вам, программисту, за разъяснениями, что именно делает тот или иной фрагмент кода. А комментарии к коду всё равно писать, да и техпису, скорее всего придётся отвечать в текстовом виде, так почему бы не облегчить себе жизнь сразу, документируя свой код по мере написания, например, между спринтами. }
\begin{frame}
\frametitle{утилита javadoc}
основные ключи и аргументы
\begin{itemize}
\item \code{-d docs}
\item \code{-sourcepath src}
\item \code{-cp out}
\item \code{-subpackages}
\item \code{ru}
\end{itemize}
\end{frame}
\note{Чтобы просто создать документацию надо вызвать утилиту javadoc с небольшим количеством ключей, давайте их разберём. Уже знакомый нам ключ -d означающий папку (или директорию, кому как больше нравится) в которую следует положить готовую документацию. Помним, ключ легко запомнить, если расшифровать его как дестинейшн, назначение. -sourcepath означает папку, где лежат исходники проекта, как мы помним, в исходниках мы пишем те самые комментарии, которые потом можно преобразовать в джавадок. -cp говорит о том, где лежат готовые скомпилированные классы, эта информация нужна, чтобы понять, как программа в итоге скомпилировалась, что в ней задействовано, что как связано и прочее. -subpackages говорит о том, что надо взять не только указанный далее пакет, но и все его подпакеты рекурсивно. Ну и, собственно, пакет, для которого нужно создать документацию, ru. Показываем работу следующими командами:
/javadoc -d docs -sourcepath src -cp out -subpackages ru
Если нужно сгенерировать документацию к конкретному пакету, например, если вы хотите разложить их по разным папкам, то надо указатеь его полный адрес, и, вероятно, убрать ключ subpackages}
\begin{frame}
\frametitle{куда же без особенностей работы с Windows?}
\begin{itemize}
\item \code{-locale ru_RU}
\item \code{-encoding utf-8}
\item \code{-docencoding cp1251}
\end{itemize}
\end{frame}
\note{Чтобы учесть то, что происходитс ОС Windows надо чуть больше, поскольку так исторически сложилось, что у Windows есть проблемки с локалью. Поскольку все программы на Java пишутя в кодировке UTF-8, а основная кодировка всех приложений, работающих под ОС виндоус это ср1251, то при создании документации стандартными средствами итоговые веб-страницы создаются на клингонском. Чтобы перевести их на земной кириллический, нужно добавить три ключа - указать какая локаль установлена -locale, в какой кодировке исходный текст -encoding utf-8, в какой кодировке должен быть итоговый документ -docencoding cp1251. Показываем работу следующими командами:
/javadoc -locale ru\_RU -encoding utf-8 -docencoding cp1251 -d docs -sourcepath src -cp out -subpackages ru
Поскольку я сейчас не с виндоусом, то такие настройки наоборот, сломают отображение.}
\begin{frame}
\frametitle{Задания для самопроверки}
\begin{enumerate}
\item Javadoc находится в JDK или JRE? (ждк)
\item Что делает утилита Javadoc? (3)
\begin{itemize}
\item Создаёт комментарии в коде;
\item Создаёт программную документацию;
\item Создаёт веб-страницу с документацией из комментариев.
\end{itemize}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Автоматизация сборки в CLI}
makefile
\end{frame}
\note{Компилировать проект руками — занятие весьма утомительное, особенно когда исходных файлов становится больше одного, и для каждого из них надо каждый раз набивать команды компиляции, а ещё не забыть о том, какой файл в проекте главный, какие включены библиотеки и многое другое. Руки так и тянутся куда-то это записать, чтобы не забыть, но говорить о специальных менеджерах проектов ещё рано, поэтому научимся автоматизировать терминальную сборку. Будем учиться создавать и использовать Мейкфайлы.
Makefile — это набор инструкций для программы make (классически, это GNU Automake), которая помогает собирать программный проект буквально в одну команду. Хотя эта технология и отмирает, но все равно используется как некоторыми отдельными разработчиками, так и в проектах, особенно часто это встречается, когда в Java переквалифицируются бывшие С++ программисты. Если запустить make то программа попытается найти файл с именем по-умолчанию Makefile в текущем каталоге и выполнить инструкции из него. Эти самые мейкфайлы и сохранят для нас все нужные настройки проекта, компиляции, структуры и прочего.
}
\newpage
\note{
Не лишним будет напомнить, что мейкфайлы, не привносят ничего принципиально нового в процесс компиляции, а только лишь автоматизируют его, поэтому важно помнить, что все действия, которые мы совершаем при ручной компиляции просто записаны в мейкфайл, и обратно, то что записано в мейкфайле может быть выполнено вручную в терминале.
В простейшем, то есть нашем, случае, в мейкфайле достаточно описать так называемую цель, таргет, и что нужно сделать для достижения этой цели. Цель, собираемая по-умолчанию называется all, так, для простейшей компиляции нам нужно написать
all:
javac -sourcepath .src/ -d out src/ru/gb/jcore/sample/Main.java
}
\begin{frame}
\frametitle{Автоматизация сборки в CLI}
SRCDIR := src
OUTDIR := out
JC := javac
JCFLAGS := -sourcepath .(SRCDIR)/ -d (OUTDIR)
MAINSOURCE := ru/gb/dj/Main
MAINCLASS := ru.gb.dj.Main
all:
(JC) (JCFLAGS) {SRCDIR}/{MAINSOURCE}.java
clean:
rm -R (OUTDIR)
run:
cd out \&\& java {MAINCLASS}
\end{frame}
\note{По сути, это всё. Но мы же хотим, чтобы вся было гибо и не нужно было запоминать что как называется, чтобы это потом можно было поправить где-то в одном месте. Для этого в мейкфайлах придумали переменные, и они работают как самые обычные переменные, их значение подставляется в то место, где переменная вызывается. Добавив пару таргетов и немного переменных мы получим мейкфайл как на слайде, он позволит нам не только компилировать проект, но также очищать выходные файлы в случае неудачи и запускать его. Также не особенно переживая о ключах, командах и прочем.
Для того, чтобы утилита мейк сделала своё дело нужно в терминале просто её вызвать без аргументов. Чтобы воспользоваться другими написанными таргетами (автоматизациями, задачами) нужно после имени утилиты написать через пробел название таргета, например, часто пишут задачу clean, рекурсивно очищающую папку с готовыми классами, соответственно, вызов make clean как ни странно, рекурсивно удалит папку с готовыми классами.}
\begin{frame}
\frametitle{Автоматизация сборки в CLI, контейнеризация}
docker
\end{frame}
\note{Docker — программное обеспечение для автоматизации развёртывания и управления приложениями, контейнеризатор приложений. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть развёрнут почти на на любой системе, и уж точно на системах большой тройки (линукс виндоус макос).
Целью этого курса не является рассмотрение всех возможностей докер, поэтому ограничимся только теми, которые нам понадобятся, чтобы увидеть заветное, запущенное джавой, «привет мир» в терминале. Снова не лишним будет напомнить, что мы можем выполнить все те же самые действия в простом терминале. Но докер даёт нам немного преимуществ. Например, не нужно устанавливать JDK и думать о переключении между версиями, достаточно взять контейнер с нужной версией и запустить наше приложение в нём. Помните я буквально полчаса назад упоминал о том, что есть более абстрактный инструмент менеджмента версий языка и инструментария? вот, это он.
}
\begin{frame}
\frametitle{Автоматизация сборки в CLI, контейнеризация}
\# syntax=docker/dockerfile:1
FROM bellsoft/liberica-openjdk-alpine:11.0.16.1-1
\# LABELS go here
\# from where (related to Dockerfile) to where
COPY ./src ./src
\# remember that you are root and in / directory
RUN mkdir ./out
\# be sure to use relative paths
RUN javac -sourcepath ./src -d out ./src/ru/gb/dj/Main.java
\# what will we do on a container start
CMD java -classpath ./out ru.gb.dj.Main
\end{frame}
\note{С точки зрения разработки, контейнерные приложения в докере это, по сути, набор инструкций, которые вы пишете в специальном файле. Всё остальное докер берёт на себя. Он эти инструкции выполняет, виртуализует, запускает и делает все остальные свои важные вещи, а мы в результате видим заветный сервис или приложение, поднятые буквально парой команд в терминале.
Упомянутый специальный файл называется докерфайл и в нашем случае он будет мало отличаться от того, что мы писали ранее в терминале или написали в мейкфайле. Первой строкой докерфайла мы обязательно должны указать, какой виртуальный образ будет для нас основой. Тут можно выбрать пустой образ, образ ОС, например, убунту или центос, а можно выбрать сразу ЖДК, как поступим мы.
FROM bellsoft/liberica-openjdk-alpine:11.0.16.1-1
Дальше скажем докеру, что надо будет при создании образа скопировать все файлы из нашей папки СРЦ внутрь образа, в папку СРЦ
COPY ./src ./src
}
\newpage
\note{
потом также при создании образа надо будет создать внутри папку аут простой терминальной командой
RUN mkdir ./out
и запустить компиляцию. мы же изначально используем образ ждк, а значит там внутри есть компилятор. главное не запутаться в путях и не забывать, что команда будет выполняться в образе, а не на нашем компьютере.
RUN javac -sourcepath ./src -d out ./src/ru/gb/dj/Main.java
А последняя команда говорит, что именно нужно сделать, когда контейнер создаётся из образа и заускается.
CMD java -classpath ./out ru.gb.dj.Main
Как очевидно, докер-образ и как следствие докер-контейнеры возможно настроить таким образом, чтобы скомпилированные файлы складывались обратно на компьютер пользователя через общие папки, если это нужно, или, например, компилировать в разные папки классы разными версиями компилятора, и запускать их также разными версиями, имея весь этот зоопарк технологий в контейнерах, не засоряя свой компьютер.
Можно даже, например, не брать в качестве исходного образа ждк, а взять ОС, вручную установить на ней ждк и, например, мейк, и автоматизировать всё мейком внутри докера. Это странно, но, как минимум не запрещено.}
\begin{frame}
\frametitle{итоги}
что изучили и домашка
\end{frame}
\note{На этом уроке мы рассмотрели историю и причины создания языка, его окружение и структуру проекта, узнали, что скрывают в себе такие аббревиатуры как JDK JRE JVM SDK JIT CLI. Рассмотрели базовое применение утилит java, javac и javadoc. Даже немного посмотрели в сторону автоматизации рутинных задач.
}
\newpage
\note{
В качестве домашнего задания попробуйте
\begin{itemize}
\item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю.
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам.
\item Создать Makefile с задачами сборки, очистки и создания документации на весь проект.
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере подьзователя, а второй забирать скомпилированные классы и исполнять их.
\end{itemize}
На следующей лекции мы поговорим о том как осуществлять управление более сложными проектами: Jar-файлы; сборщики Gradle/Maven; чтоб такое репозитории и как ими пользоваться.
}
\end{document}

View File

@ -8,7 +8,7 @@
\usepackage{enumitem} \usepackage{enumitem}
\usepackage{multicol,multirow} \usepackage{multicol,multirow}
\usepackage{float,adjustbox} \usepackage{float,adjustbox}
\usepackage{fontawesome} %\usepackage{fontawesome}
\usepackage{longtable} \usepackage{longtable}
\usepackage{tikz} \usepackage{tikz}
\usepackage{hyperref} \usepackage{hyperref}
@ -17,15 +17,17 @@
\usetikzlibrary{mindmap,trees} \usetikzlibrary{mindmap,trees}
\usepackage{booktabs}% http://ctan.org/pkg/booktabs \usepackage{booktabs}% http://ctan.org/pkg/booktabs
\newcommand{\tabitem}{~~\llap{\textbullet}~~} \newcommand{\tabitem}{~~\llap{\textbullet}~~}
\usepackage{setspace,fontspec}
\spacing{1.15}
\babelfont{rm}{IBM Plex Sans}
\babelfont{tt}{PT Mono}
\titlelabel{\thetitle. \quad} \titlelabel{\thetitle. \quad}
\setcounter{tocdepth}{1} \setcounter{tocdepth}{2}
\renewcommand{\nomname}{Термины, определения и сокращения} \renewcommand{\nomname}{Термины, определения и сокращения}
\makeindex \makeindex
\makenomenclature \makenomenclature
\babelfont{rm}{PT Astra Serif}
\babelfont{sf}{PT Astra Serif}
\babelfont{tt}{PT Mono}
\newcounter{slidenum} \newcounter{slidenum}
\setcounter{slidenum}{1} % set to 2 if want to exclude title page of presentation \setcounter{slidenum}{1} % set to 2 if want to exclude title page of presentation
@ -52,7 +54,7 @@
\lhead{\includegraphics[height=5mm]{logo.png}} \lhead{\includegraphics[height=5mm]{logo.png}}
\rhead{И.И. Овчинников \\ \href{https://t.me/ivanigorevichfeed}{Telegram: ivanigorevichfeed}} \rhead{И.И. Овчинников \\ \href{https://t.me/ivanigorevichfeed}{Telegram: ivanigorevichfeed}}
\chead{\thepage} \chead{\thepage}
\cfoot{\faRocket} % \cfoot{\faRocket}
\rfoot{Всего слов: \wordcount} \rfoot{Всего слов: \wordcount}
} }