6.A Профессор Фортран о том, почему Java - это не кофе
![](https://img.golos.io/proxy/https://i.imgur.com/JH1yn8X.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/47zTMVj.jpg)
Фортран: Дорогие друзья, сегодня я хотел бы затронуть тему появления языка Java и рассмотреть, когда он появился и зачем. Стоит сказать, что даже на сегодняшний день, самым важным итогом микропроцессорной революции стало появление персональных компьютеров, что уж говорить про начало 90-х годов. Поэтому нет ничего удивительного в том, что Sun Microsystems, осознав это в 1991 году, создало внутрикорпоративный исследовательский проект, который и привел к появлению C++-подобного объектно-ориентированного языка программирования, названного Java.
![](https://img.golos.io/proxy/https://i.imgur.com/t497YA5.jpg)
Воробей: А какое это имеет отношение к микропроцессорной революции?
![](https://img.golos.io/proxy/https://i.imgur.com/UztLxSZ.jpg)
Фортран: Все дело в том, что стандарты в аппаратном и программном обеспечении только вырабатывались. Компьютеры создавались на базе нескольких аппаратных платформ, и даже на одной аппаратной платформе можно было установить разные операционные системы. На каждой из этих платформ было свое программное обеспечение, которое не работало на других платформах.
Разработчики Java решили разобраться с этой проблемой на корню и создать язык, на котором можно писать программы способные работать на самых разнообразных компьютерных системах. Иногда такой подход называют коротко - «написано однажды, работает везде».
А дальше пошло-поехало. В 1993 году веб стал набирать популярность, и Sun углядела в этом потенциал, чтобы использовать Java для добавления динамического контента на веб-страницы, что позволило придавать сайтам интерактивность и элементы анимации.
Из-за феноменального успеха веб-а члены бизнес сообщества обратили внимание на Java. По сей день Java применяется для создания крупномасштабных enterprise-приложений, для повышения функциональности веб-серверов, т.е. компьютеров, которые предоставляют весь контент, который мы наблюдаем в наших веб-браузерах, а также для наших смартфонов, работающих под управлением операционной системы Android.
Из-за экономического кризиса, начавшегося в 2008 году, в 2010 году Oracle купила компанию Sun Microsystems, но Java осталась на плаву и продолжила свое развитие.
![](https://img.golos.io/proxy/https://i.imgur.com/rKuLaHY.jpg)
Воробей: А что означает развитие языка программирования? Если меняется синтаксис, то это значит, что разные версии языка будут несовместимы между собой?
![](https://img.golos.io/proxy/https://i.imgur.com/20v8LU7.jpg)
Фортран: Да, такое возможно, но в данном случае обратная совместимость сохраняется и поэтому программы, написанные еще для Java 1, будут работать и на Java 9. В Java-мире – это закон.
Под развитием понимается не изменение старого, а добавление нового функционала в язык. Например, в Java 8 самым важным достижением стало появление элементов функционального программирования. Но это не все. С каждой новой версией, в Java дополняются библиотеки классов.
![](https://img.golos.io/proxy/https://i.imgur.com/fNHlSw7.jpg)
Воробей: А что такое библиотеки классов?
![](https://img.golos.io/proxy/https://i.imgur.com/1Q5mwjh.jpg)
Фортран: Смотри, ты, конечно, можешь сам написать каждый класс и метод, чтобы создать свою программу на Java. Однако, большинство программистов, и я тебе советую придерживаться этого же подхода, пользуются богатым набором готовых классов и методов, уже содержащихся в Java. Этот набор классов и называется библиотекой, хотя часто его называют коротко – Java API (Application Programming Interfaces).
Например, в Java 8 библиотека классов была расширена за счет Java Date/Time API для работы с датами.
![](https://img.golos.io/proxy/https://i.imgur.com/ilTdW2I.jpg)
Воробей: А что, до этого в Java нельзя было работать с датами?
![](https://img.golos.io/proxy/https://i.imgur.com/AucPZt2.jpg)
Фортран: Конечно же, можно, но функционал Java в этом вопросе был ограничен, что и привело к тому, что сторонние разработчики создавали для этого отдельные фреймворки. Один из таких популярных фреймворков называется Joda-Time.
Oracle же наблюдал за всем этим и понял, что потребность в более развитом инструменте для работы с датами есть, поэтому и решил добавить функционал, схожий с Joda-Time, в свою библиотеку классов, начиная с 8-ой версии Java.
Но мы отклонились от темы. Единственное, что я хочу здесь добавить, это дать тебе еще раз совет – не изобретать велосипед, а использовать классы и методы Java API там, где это возможно, вместо того, чтобы писать свои собственные версии подобных классов.
Кроме того, что подобный подход сократит твое время на написание программ, это может и повысить производительность твоего кода, потому что реализация Java API могла быть оптимизирована разработчиками языка.
![](https://img.golos.io/proxy/https://i.imgur.com/LCGuPMu.jpg)
Воробей: Совет учту, тем более, что я не люблю велосипеды, т.к. у меня лапы до педалей не дотягиваются.
![](https://img.golos.io/proxy/https://i.imgur.com/aCh7EzP.jpg)
Фортран: Давай теперь пройдемся по тем шагам, которые нужно предпринять, чтобы создать и выполнить Java приложение.
Этот процесс можно поделить на 5 фаз:
- Редактирование исходного кода программы.
- Компиляция программы в байткод.
- Загрузка программы в память.
- Верификация байткода.
- Выполнение программы.
Мы обсудим их в контексте Java Development Kit (JDK), т.е. набора утилит для разработки софта на Java.
Фаза 1 заключается в редактировании файла с кодом в программе-редакторе. В редакторе, вы пишете исходный код Java программы, вносите исправления и сохраняете его на жестком диске. Файлы исходного кода на Java имеют расширение .java.
![](https://img.golos.io/proxy/https://i.imgur.com/1UODvjx.jpg)
В Linux-е есть два широко распространенных редактора – это vi и emacs. В OS X есть TextEdit. В Windows есть Notepad (Блокнот), но гораздо лучше скачать что-нибудь более функциональное вроде Notepad++, TextPad, EditPlus. Также можно скачать jEdit, версия которого есть под любую из вышеупомянутых операционных систем, т.к. он написан на Java.
![](https://img.golos.io/proxy/https://i.imgur.com/Bg8ZaBa.jpg)
Воробей: А для чего нам все эти редакторы, когда есть интегрированные среды разработки IDE (integrated development environments), предоставляющие инструменты для поддержки всех стадий процесса разработки, такие как редакторы кода, отладчики для обнаружения логических ошибок (т.е. ошибок, которые приводят к тому, что программа выполняется неправильно) и т.д.
![](https://img.golos.io/proxy/https://i.imgur.com/MSg8PpT.jpg)
Фортран: Верно, просто я хотел указать, что есть альтернативы, если нужно просто подправить код в одном файле. Создавать в редакторах серьезные проекты я бы не рекомендовал. Однако не будем сейчас останавливаться на теме IDE, т.к. о них мы уже подробно поговорили ранее.
![](https://img.golos.io/proxy/https://i.imgur.com/9diksPc.jpg)
Воробей: С редактированием все понятно, а что происходит на фазе 2?
![](https://img.golos.io/proxy/https://i.imgur.com/xv5eqtP.jpg)
Фортран: На фазе 2, мы используем команду javac
(компилятор Java) для компиляции программы. Например, для компиляции файла программы HelloWorld.java
, нужно набрать
javac HelloWorld.java
в командной строке (в Windows – это Command Prompt, в Linux – это shell (также называемый Terminal в некоторых версиях Linux), а в OS X – это Terminal). Если программа компилируется, то компилятор создаст файл с расширением .class. В данном случае файл HelloWorld.class
будет содержать скомпилированную версию программы.
![](https://img.golos.io/proxy/https://i.imgur.com/5Pe1WQl.jpg)
Воробей: А зачем нам знать эти сложности, когда в любой IDE есть пункт меню под названием Build или Make?
![](https://img.golos.io/proxy/https://i.imgur.com/HggSZRb.jpg)
Фортран: Все верно, я просто хочу, чтобы ты знал, что при выборе названного тобой пункта меню на самом деле происходит вызов команды javac
.
Итак, если компилятор обнаружит ошибки, нам придется вернуться на фазу 1 и исправить их. Мы еще поговорим подробнее о типах ошибок, которые может обнаружить компилятор.
![](https://img.golos.io/proxy/https://i.imgur.com/6L7pZP9.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/MG3uLr6.jpg)
Воробей: А за счет чего обеспечивается кроссплатформенность языка Java, если здесь идет компиляция программы в машинный код?
![](https://img.golos.io/proxy/https://i.imgur.com/lshEypz.jpg)
Фортран: Нет, Воробей, компилятор Java переводит исходный код на языке Java не в машинный, а в байткод. Если машинный код исполняет непосредственно микропроцессор, то байткод Java запускается в приложении, которое называется виртуальная машина Java JVM (Java Virtual Machine). JVM — это часть JDK и основа Java платформы.
Виртуальная машина (VM) – это приложение, которое симулирует компьютер, но скрывает реальную операционную систему и аппаратное обеспечение от программ, исполняющихся под VM. Если одна и та же VM реализована на многих компьютерных платформах, то приложения, разработанные под данный тип VM, могут быть запущены на всех этих платформах. JVM является наиболее распространенной виртуальной машиной. Виртуальная машина .NET от Microsoft использует схожую архитектуру.
В отличие от инструкций машинного кода, которые платформо зависимы, т.е. зависят от конкретного компьютерного железа, инструкции байткода – платформо независимы. Таким образом, байткод Java переносим без перекомпилирования исходного кода, т.е. одни и те же инструкции байткода могут выполняться на любой платформе с запущенной JVM, понимающей ту версию Java, под которую скомпилирован байткод.
JVM вызывается командой, которая называется - java
. Например, для выполнения Java приложения HelloWorld, вы должны вызвать команду
java HelloWorld
в командном окне для вызова JVM, которая, в свою очередь, начала бы выполнять шаги, необходимые для выполнения нашего приложения. Разумеется, если мы работаем в IDE, то мы должны найти пункт меню Run, который вызовет команду java
за нас.
![](https://img.golos.io/proxy/https://i.imgur.com/cIkwUBf.jpg)
Воробей: Правильно ли я понимаю, что именно после вызова команды java
, начинается фаза 3 и загрузка классов в память компьютера?
![](https://img.golos.io/proxy/https://i.imgur.com/XTWjUFr.jpg)
Фортран: Так точно, на фазе 3 JVM помещает программу в память для ее выполнения. Загрузчик классов JVM (class loader) берет файлы с расширением .class, содержащие байткод программы, и помещает их в оперативную память (ОЗУ). Также загружаются все файлы .class, которые не являются частью нашей программы, но которые наша программа использует (например, библиотеки классов Java, о которых говорилось выше, или прочие сторонние библиотеки классов какого-нибудь фреймворка, например, Spring-а). Файлы с расширением .class могут быть подгружены с жесткого диска или из сети (например, из Интернета).
![](https://img.golos.io/proxy/https://i.imgur.com/BpkWChI.jpg)
На фазе 4, когда классы уже загружены в память, верификатор байткода проверяет их, чтобы убедиться, что классы корректны и не нарушают ограничения по безопасности Java.
![](https://img.golos.io/proxy/https://i.imgur.com/33C4iwu.jpg)
Воробей: А зачем Java так блюдет безопасность, это же наши классы, которые мы написали?
![](https://img.golos.io/proxy/https://i.imgur.com/DnelxlQ.jpg)
Фортран: Необязательно, есть Java программы, которые могут распространяться через сеть, поэтому Java заботится о том, чтобы вирусный или червячный байткод не нанесет ущерб нашей системе.
![](https://img.golos.io/proxy/https://i.imgur.com/nQOWGpm.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/DDTP5kr.jpg)
Воробей: Понимаю, компьютерные черви не так вкусны, как обычные. Их надо держать в узде.
![](https://img.golos.io/proxy/https://i.imgur.com/mlJWBZo.jpg)
Фортран: Вот именно. И, наконец, мы дошли до фазы 5, где JVM выполняет байткод программы. В ранних версиях Java, JVM просто интерпретировала байткод. Поэтому большинство Java программ работало медленно, из-за того, что JVM интерпретировала и выполняла один байткод за раз. Современные компьютеры могут выполнять несколько инструкций параллельно. Поэтому новые версии JVM выполняют байткод, используя комбинацию из интерпретации и так называемой JIT (just-in-time) компиляции. При таком подходе, JVM анализирует байткод по мере его интерпретации в поисках тех частей байткода, которые выполняются часто (так называемые, hot spot-ы). Для таких частей и создан JIT компилятор, такой как Java HotSpot компилятор от Oracle, переводящий байткод в машинный язык. Когда JVM встречает эти скомпилированные части снова, выполняется быстрый машинный язык, а не медленный байткод. Таким образом, Java программа проходит через 2 фазы компиляции — одна, на которой исходный код переводится в байткод (для обеспечения кроссплатформенности), и вторая – в процессе выполнения, когда байткод переводится в машинный язык.
![](https://img.golos.io/proxy/https://i.imgur.com/9c8Iu0w.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/SYkjD4i.jpg)
Воробей: Профессор, а что, если программа не заработает с первой попытки?
![](https://img.golos.io/proxy/https://i.imgur.com/ne7aB0U.jpg)
Фортран: В этом нет ничего страшного, особенно для начинающего программиста. Каждая фаза может отработать со сбоями из-за различных ошибок, которые мы еще будем рассматривать позднее.
Например, программа может попытаться поделить на ноль, а это некорректная операция для целочисленных вычислений в Java. Это приведет к тому, что отобразится сообщение об ошибке. Если это произошло, то тебе следует вернуться к фазе редактирования, внести необходимые изменения и пройти через оставшиеся фазы снова, чтобы убедиться, что внесенные изменения исправили проблему.
Обрати внимание, что большинство программ осуществляют ввод или вывод данных. И когда мы говорим, что программа отображает сообщение, мы обычно подразумеваем, что программа показывает ошибку на экране компьютера. Однако надо иметь в виду, что сообщения и другие данные могут быть выведены не только на экран, но и на другие устройства, такие как жесткий диск или принтер, или даже в сеть для передачи на другие компьютеры.
Такие ошибки как деление на ноль происходят во время выполнения программы, поэтому часто их называют runtime-ошибками. Runtime-ошибки, которые приводят к тому, что программа немедленно прерывается, не завершая свою работу, называются фатальными (fatal runtime errors). Не фатальные runtime-ошибки позволяют программе доработать до конца, часто приводя к ошибочным результатам на выходе.
С твоего позволения, я бы завершил сегодняшний урок. На следующем коротком уроке мы коснемся темы установки JDK и рассмотрим, что нужно настроить в операционной системе, чтобы Java работала безукоризненно.