This commit is contained in:
Ivan I. Ovchinnikov 2022-08-18 09:02:46 +03:00
commit 4d820a5893
4 changed files with 70 additions and 3 deletions

1
.gitignore vendored
View File

@ -10,4 +10,5 @@
!/build/*.pdf !/build/*.pdf
!/*/build/*.pdf !/*/build/*.pdf
/methodist-share
Icon* Icon*

Binary file not shown.

View File

@ -1,4 +1,4 @@
\immediate\write18{texcount -sum -1 j-spec.tex > /tmp/wordcount.tex} %\immediate\write18{texcount -sum -1 j-spec.tex > /tmp/wordcount.tex}
%\immediate\write18{texcount -sum -1 scenarios/jc-1-c.tex > /tmp/wordcount.tex} %\immediate\write18{texcount -sum -1 scenarios/jc-1-c.tex > /tmp/wordcount.tex}
\documentclass[12pt, a4paper]{report} \documentclass[12pt, a4paper]{report}
\usepackage[english,russian]{babel} % локализация и переносы \usepackage[english,russian]{babel} % локализация и переносы
@ -87,6 +87,8 @@
\section{Платформа: история и окружение} \section{Платформа: история и окружение}
\subsection{В этом разделе} \subsection{В этом разделе}
Краткая история (причины возникновения); инструментарий, выбор версии; CLI; структура проекта; документирование; Краткая история (причины возникновения); инструментарий, выбор версии; CLI; структура проекта; документирование;
В этом разделе происходит первое знакомство со внутреннем устройством языка Java и фреймворком разработки приложений с его использованием. Рассматривается примитивный инструментарий и базовые возможности платформы для разработки приложений на языке Java. Разбирается структура проекта, а также происходит ознакомление с базовым инструментарием для разработки на Java.
\begin{itemize} \begin{itemize}
\item \nom{JDK}{(от англ. Java Development Kit) — комплект разработчика приложений на языке Java, включающий в себя компилятор, стандартные библиотеки классов, примеры, документацию, различные утилиты и исполнительную систему. В состав JDK не входит интегрированная среда разработки на Java, поэтому разработчик, использующий только JDK, вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки.} \item \nom{JDK}{(от англ. Java Development Kit) — комплект разработчика приложений на языке Java, включающий в себя компилятор, стандартные библиотеки классов, примеры, документацию, различные утилиты и исполнительную систему. В состав JDK не входит интегрированная среда разработки на Java, поэтому разработчик, использующий только JDK, вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки.}
\item \nom{JRE}{(от англ. Java Runtime Environment) — минимальная (без компилятора и других средств разработки) реализация виртуальной машины, необходимая для исполнения Java-приложений. Состоит из виртуальной машины Java Virtual Machine и библиотеки Java-классов.} \item \nom{JRE}{(от англ. Java Runtime Environment) — минимальная (без компилятора и других средств разработки) реализация виртуальной машины, необходимая для исполнения Java-приложений. Состоит из виртуальной машины Java Virtual Machine и библиотеки Java-классов.}
@ -94,6 +96,7 @@
\item \nom{JIT}{(англ. Just-in-Time, компиляция «точно в нужное время»), динамическая компиляция — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы. Таким образом достигается высокая скорость выполнения по сравнению с интерпретируемым байт-кодом за счёт увеличения потребления памяти (для хранения результатов компиляции) и затрат времени на компиляцию. Технология JIT базируется на двух более ранних идеях, касающихся среды выполнения: компиляции байт-кода и динамической компиляции.} \item \nom{JIT}{(англ. Just-in-Time, компиляция «точно в нужное время»), динамическая компиляция — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы. Таким образом достигается высокая скорость выполнения по сравнению с интерпретируемым байт-кодом за счёт увеличения потребления памяти (для хранения результатов компиляции) и затрат времени на компиляцию. Технология JIT базируется на двух более ранних идеях, касающихся среды выполнения: компиляции байт-кода и динамической компиляции.}
\item \nom{CLI}{(англ. Command line interface, Интерфейс командной строки) — разновидность текстового интерфейса между человеком и компьютером, в котором инструкции компьютеру даются в основном путём ввода с клавиатуры текстовых строк (команд). Также известен под названиями «консоль» и «терминал».} \item \nom{CLI}{(англ. Command line interface, Интерфейс командной строки) — разновидность текстового интерфейса между человеком и компьютером, в котором инструкции компьютеру даются в основном путём ввода с клавиатуры текстовых строк (команд). Также известен под названиями «консоль» и «терминал».}
\end{itemize} \end{itemize}
\subsection{Теория} \subsection{Теория}
\subsubsection{Краткая история (причины возникновения)} \subsubsection{Краткая история (причины возникновения)}
\begin{itemize} \begin{itemize}
@ -108,6 +111,16 @@
\label{pic:java-in-tiobe} \label{pic:java-in-tiobe}
\end{figure} \end{figure}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Как Вы думаете, почему язык программирования Java стал популярен в такие короткие сроки? (3)
\begin{itemize}
\item существовавшие на тот момент Pascal и C++ были слишком сложными;
\item Java быстрее C++;
\item Однажды написанная на Java программа работает везде.
\end{itemize}
\end{enumerate}
\subsubsection{Базовый инструментарий, который понадобится (выбор IDE)} \subsubsection{Базовый инструментарий, который понадобится (выбор IDE)}
\begin{itemize} \begin{itemize}
\item NetBeans - хороший, добротный инструмент с лёгким ностальгическим оттенком; \item NetBeans - хороший, добротный инструмент с лёгким ностальгическим оттенком;
@ -116,7 +129,18 @@
\item Android Studio - если заниматься мобильной разработкой. \item Android Studio - если заниматься мобильной разработкой.
\end{itemize} \end{itemize}
\subsubsection{Что нужно скачать, откуда (как выбрать вендора, выбор версии)} \subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Как Вы думаете, почему среда разработки IntelliJ IDEA стала стандартом де-факто в коммерческой разработке приложений на Java? (4)
\begin{itemize}
\item NetBeans перестали поддерживать;
\item Eclipse слишком медленный и тяжеловесный;
\item IDEA оказалась самой дружелюбной к начинающему программисту;
\item Все варианты верны.
\end{itemize}
\end{enumerate}
\subsubsection{Что нужно скачать, откуда (как выбрать вендора, версии)}
Для разработки понадобится среда разработки (\nom{IDE}{(от англ. Integrated Development Environment) это интегрированная, единая среда разработки, которая используется разработчиками для создания различного программного обеспечения. IDE представляет собой комплекс из нескольких инструментов, а именно: текстового редактора, компилятора или интерпретатора, средств автоматизации сборки и отладчика.}) и инструментарий разработчика (JDK). JDK выпускается несколькими поставщиками, большинство из них бесплатны и полнофункциональны, то есть поддерживают весь функционал языка и платформы. Для разработки понадобится среда разработки (\nom{IDE}{(от англ. Integrated Development Environment) это интегрированная, единая среда разработки, которая используется разработчиками для создания различного программного обеспечения. IDE представляет собой комплекс из нескольких инструментов, а именно: текстового редактора, компилятора или интерпретатора, средств автоматизации сборки и отладчика.}) и инструментарий разработчика (JDK). JDK выпускается несколькими поставщиками, большинство из них бесплатны и полнофункциональны, то есть поддерживают весь функционал языка и платформы.
В последнее время, с развитием контейнеризации приложений, часто устанавливают инструментарий в Docker-контейнер и ведут разработку прямо в контейнере, это позволяет не захламлять компьютер разработчика разными версиями инструментария и быстро разворачивать свои приложения в \nom{CI}{(англ. Continious Integration) практика разработки программного обеспечения, которая заключается в постоянном слиянии рабочих копий в общую основную ветвь разработки и выполнении частых автоматизированных сборок проекта для скорейшего выявления потенциальных дефектов и решения интеграционных проблем.} или на целевом сервере. В последнее время, с развитием контейнеризации приложений, часто устанавливают инструментарий в Docker-контейнер и ведут разработку прямо в контейнере, это позволяет не захламлять компьютер разработчика разными версиями инструментария и быстро разворачивать свои приложения в \nom{CI}{(англ. Continious Integration) практика разработки программного обеспечения, которая заключается в постоянном слиянии рабочих копий в общую основную ветвь разработки и выполнении частых автоматизированных сборок проекта для скорейшего выявления потенциальных дефектов и решения интеграционных проблем.} или на целевом сервере.
@ -129,6 +153,13 @@
Для решения некоторых несложных задач курса мы будем писать простые приложения, не содержащие ООП, сложных взаимосвязей и проверок, в этом случае нам понадобится Jupyter notebook с установленным ядром (kernel) IJava. Для решения некоторых несложных задач курса мы будем писать простые приложения, не содержащие ООП, сложных взаимосвязей и проверок, в этом случае нам понадобится Jupyter notebook с установленным ядром (kernel) IJava.
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Чем отличается SDK от JDK? (J это частный случай, больше спец. библиотек)
\item Какая версия языка (к сожалению) остаётся самой популярной в разработке на Java? (8, 1.8)
\item Какие ещё JVM языки существуют? (Scala, Kotlin, Groovy)
\end{enumerate}
\subsubsection{Из чего всё состоит (JDK, JRE, JVM и их друзья)} \subsubsection{Из чего всё состоит (JDK, JRE, JVM и их друзья)}
TL;DR: TL;DR:
\begin{itemize} \begin{itemize}
@ -143,7 +174,7 @@ TL;DR:
JVM для своей работы запрашивает у ОС некоторый сегмент оперативной памяти, в котором хранит данные программы. Это хранение происходит «слоями»: JVM для своей работы запрашивает у ОС некоторый сегмент оперативной памяти, в котором хранит данные программы. Это хранение происходит «слоями»:
\begin{enumerate} \begin{enumerate}
\item Eden Space (heap) в этой области выделятся память под все создаваемые из программы объекты. Большая часть объектов живёт недолго (итераторы, временные объекты, используемые внутри методов и т.п.), и удаляются при выполнении сборок мусора это области памяти, не перемещаются в другие области памяти. Когда данная область заполняется (т.е. количество выделенной памяти в этой области превышает некоторый заданный процент), сборщик мусора выполняет быструю (minor collection) сборку. По сравнению с полной сборкой, она занимает мало времени, и затрагивает только эту область памяти, а именно, очищает от устаревших объектов Eden Space и перемещает выжившие объекты в следующую область. \item Eden Space (heap) в этой области выделяется память под все создаваемые из программы объекты. Большая часть объектов живёт недолго (итераторы, временные объекты, используемые внутри методов и т.п.), и удаляются при выполнении сборок мусора это области памяти, не перемещаются в другие области памяти. Когда данная область заполняется (т.е. количество выделенной памяти в этой области превышает некоторый заданный процент), сборщик мусора выполняет быструю (minor collection) сборку. По сравнению с полной сборкой, она занимает мало времени, и затрагивает только эту область памяти, а именно, очищает от устаревших объектов Eden Space и перемещает выжившие объекты в следующую область.
\item Survivor Space (heap) сюда перемещаются объекты из предыдущей области после того, как они пережили хотя бы одну сборку мусора. Время от времени долгоживущие объекты из этой области перемещаются в Tenured Space. \item Survivor Space (heap) сюда перемещаются объекты из предыдущей области после того, как они пережили хотя бы одну сборку мусора. Время от времени долгоживущие объекты из этой области перемещаются в Tenured Space.
\item Tenured (Old) Generation (heap) — Здесь скапливаются долгоживущие объекты (крупные высокоуровневые объекты, синглтоны, менеджеры ресурсов и прочие). Когда заполняется эта область, выполняется полная сборка мусора (full, major collection), которая обрабатывает все созданные JVM объекты. \item Tenured (Old) Generation (heap) — Здесь скапливаются долгоживущие объекты (крупные высокоуровневые объекты, синглтоны, менеджеры ресурсов и прочие). Когда заполняется эта область, выполняется полная сборка мусора (full, major collection), которая обрабатывает все созданные JVM объекты.
\item Permanent Generation (non-heap) Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.). \item Permanent Generation (non-heap) Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.).
@ -199,6 +230,18 @@ Java Development Kit является изрядно дополненным сп
\caption{Общее представление состава JDK} \caption{Общее представление состава JDK}
\end{table} \end{table}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item JVM и JRE - это одно и тоже? (нет)
\item Что входит в состав JDK, но не входят в состав JRE? (компилятор, средства для доков, отладки, развёртывания)
\item Утечки памяти (2)
\begin{itemize}
\item Невозможны, поскольку работает сборщик мусора;
\item Возможны;
\item Существуют только в С++ и других языках с открытым менеджментом памяти.
\end{itemize}
\end{enumerate}
\subsubsection{Структура проекта (пакеты, классы, метод main, комментарии)} \subsubsection{Структура проекта (пакеты, классы, метод main, комментарии)}
Проекты могут быть любой сложности. Часто структуру проекта задаёт сборщик проекта, предписывая в каких папках будут храниться исходные коды, исполняемые файлы, ресурсы и документация. Без их использования необходимо задать структуру самостоятельно. Проекты могут быть любой сложности. Часто структуру проекта задаёт сборщик проекта, предписывая в каких папках будут храниться исходные коды, исполняемые файлы, ресурсы и документация. Без их использования необходимо задать структуру самостоятельно.
@ -301,6 +344,17 @@ public class OtherClass {
} }
\end{lstlisting} \end{lstlisting}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Зачем складывать классы в пакеты? (структурирование, видимость*)
\item Может ли существовать класс вне пакета? (да*, нет)
\item Комментирование кода(2)
\begin{itemize}
\item Нужно только если пишется большая подключаемая библиотека;
\item Хорошая привычка;
\item Захламляет исходники.
\end{itemize}
\end{enumerate}
\subsubsection{Отложим мышки в сторону (CLI: сборка, пакеты, запуск)} \subsubsection{Отложим мышки в сторону (CLI: сборка, пакеты, запуск)}
Простейший проект возможно скомпилировать и запустить без использования тяжеловесных сред разработки, введя в командной строке ОС две команды: Простейший проект возможно скомпилировать и запустить без использования тяжеловесных сред разработки, введя в командной строке ОС две команды:
@ -349,6 +403,18 @@ Hello, world!
Here is your number: 4. Here is your number: 4.
\end{lstlisting} \end{lstlisting}
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Что такое javac? (компилятор)
\item Кофе, крошка? (да)
\item Где находится класс в папке назначения работы компилятора? (1)
\begin{itemize}
\item В подпапках, повторяющих структуру пакетов в исходниках
\item В корне плоским списком;
\item Зависит от ключей компиляции.
\end{itemize}
\end{enumerate}
\subsubsection{Документирование (Javadoc)} \subsubsection{Документирование (Javadoc)}
Документирование конкретных методов и классов всегда ложится на плечи программиста, потому что никто не знает программу и алгоритмы в ней лучше, чем программист. Утилита Javadoc избавляет программиста от необходимости осваивать инструменты создания веб-страниц и записывать туда свою документацию. Достаточно писать хорошо отформатированные комментарии, а остальное Javadoc возьмёт на себя. Документирование конкретных методов и классов всегда ложится на плечи программиста, потому что никто не знает программу и алгоритмы в ней лучше, чем программист. Утилита Javadoc избавляет программиста от необходимости осваивать инструменты создания веб-страниц и записывать туда свою документацию. Достаточно писать хорошо отформатированные комментарии, а остальное Javadoc возьмёт на себя.
\begin{figure}[H] \begin{figure}[H]

Binary file not shown.