Данная статья перевод с английского статьи Vladimir Alarcón и Nathaniel Monson «A Pi and a cup of Java, please!» вышедшей в 14 номере журнала MagPi. Эта статья является первой в цикле статей посвящённых описанию практических основ программирования на Java использую Raspberry Pi.
Что вам необходимо:
- Raspberry Pi и ОС Raspbian.
- 150 Мб свободного места на SD карте.
- Базовые знания программирования.
- Базовые навыки использования командной строки.
Вступление
В данной статье я расскажу вам как писать и запускать Java программы на вашем Raspberry Pi.
Java — это объектно-ориентированный язык программирования, транслирующий исходный код программ в байт-код, для запуска их независимо от операционной системы и без необходимости перекомпилляции. Также в Java входит широкий спектр технологий предназначенных для решением задач в таких областях, как запуск кластеров веб-сайтов или высоконагруженных приложений критичных к результату выполнения. В данной статье я затрону только основы данного языка. Как только вы узнаете его основы, вы без труда найдёте в Интернет веб-сайты с более подробным описанием технологий Java и содержащие более сложные примеры по ним.
В начале я покажу, как установить Java на Raspberry Pi. Затем мы создадим пару простых Java программ… И только потом мы их запустим! В первой части статьи вы в общем узнаете как запустить примеры, а затем более подробно я разъясню принципы их работы. Идея в том, что это позволит вам легче увидеть основы написания реальных Java программ, а затем самостоятельно вы сможете попробовать создать для них новые элементы и задать необходимый функционал. Как это можно сделать, я постараюсь объяснить после того, как вы напишите и запустите первую свою программу.
1. Установка
Чтобы написать, копиллировать и запустить программу вам необходимо две вещи: текстовый редактор и JDK. Вы можете использовать любой текстовый редактор для написания Java программ. Я предпочитаю Geany, так как он поддерживает подсветку синтаксиса, но Leafpad или GEdit это тоже делают. В качестве JDK я выбрал OpenJDK 7. Стандартно в пакет JDK входит компиллятор и виртуальная машина Java(JVM). Компиллятор генерирует из исходного кода программы для выполнения, а JVM обеспечивает их запуск.
Установим Geany и OpenJDK 7 открыв окно терминала и набрав:
sudo apt-get install -y openjdk-7-jdk geany
Это займёт около 9 минут на загрузку и установку всех необходимых пакетов, но это может занять и больше времени, так как всё зависит от скорости вашего интернет соединения.
После завершения проверьте, что всё корректно было установлено. Для этого вы можете открыть Geany из вкладки «Programming» основного меню Raspbian. А для проверки OpenJDK 7, откройте окно терминала и наберите:
java -version
На экране должно появится несколько строк начинающихся с:
java version "1.7...
OpenJDK ...
2. Запуск первой программы
Начнём с создания каталога для хранения наших программ. Я выбрал для него имя «cupofjava», но вы можете по желанию выбрать любое другое. Открываем окно терминала и набираем:
mkdir cupofjava
Теперь начнём писать нашу первую программу(класс) на Java. Я назову его «HiThere». Пожалуйста помните, что Java, это объектно-ориентированный язык программирования, и что каждая программа является классом, который в свою очередь можно использовать другими классами.
Открываем текстовый редактор(в моём случае Geany) для создания файла HiThere.java и сохраняем его в предварительно созданном каталоге. В этом файле набираем(или копируем) следующий исходный код программы:
public class HiThere {
public static void main(String[] args) {
System.out.println("A Java Pi!");
}
}
А теперь компилируем его. Используя окно терминала переходим в каталог «cupofjava», где до этого вы создали программу:
cd cupofjava
и набираем:
javac HiThere.java
Команда javac компиллирует программы написанные на Java. Она проанализировав набранный вами исходный код генерирует программу для запуска. Через 15 секунд или около того, данная команда закончит выполнение. Если вы допустили ошибку она об этом сообщит, указав где эта проблема возникла. Для исправления вернитесь в текстовый редактор, проверьте свой код и исправьте допущенные ошибки, сохраните файл, и попробуйте запустить компилляцию повторно. Если ошибок больше нет, то компилляция выполнена успешно. После чего вы найдёте новый файл HiThere.class в текущем каталоге. Это программа и будет вами запускаться.
Хорошо, теперь запустим нашу программу. В окне терминала набираем:
java HiThere
Вам необязательно указывать расширение .class. А в чём разница? Команда javac компиллирует программы, а команда java их запускает.
Программа будет запущена и выполнена:
Hi there!
Отлично… Поздравляю! Вы написали и запустили вашу первую Java программу на Raspberry Pi.
Наверное вы заметили, что программе потребовалось несколько секунд для того, чтобы написать это сообщение. Почему так долго? На самом деле, Java работает довольно быстро. Программе в целом понадобилось только пара миллисекунд для выполнения, всё остальное время потребовалось на загрузку в начале JVM среды для выполнения Java кода. Но есть и приятная новость, что после загрузки JVM программа будет работать очень быстро.
Ну, а теперь, можем рассмотреть программу более внимательно. В ней по сути выполняется только одна строка. Это строка:
System.out.println("A Java Pi!");
В остальных строках задаётся название класса «HiThere» (в строке 1), а также название основного метода в строке 3). В данный класс, как и в любой другой класс Java, может входить много методов, но для данного примера мы используем только один основной метод main.
Усложним задачу #1: Ваши действия. Откройте файл с исходным кодом в текстовом редакторе, измените сообщение в кавычках с «A Java Pi!» на «My name is Name.»(введите своё имя) и сохраните результат. В окне терминала снова скомпилируйте программу и запустите её использованными уже командами javac и java. Если всё сделали правильно, то теперь программа покажет ваше имя. Вы отлично справились!
Примечание: Синтаксис(словарь команд и пунктуация) написания программ на языке Java очень похож на синтаксис языка C. Любой программист знакомый с C сможет легко освоит основы Java.
3. Переменные Java и управляющие конструкции
Следующий пример иллюстрирует применение переменных и управляющих конструкций. В том-же каталоге, где мы сохраняли первую программу, создадим вторую программу назвав её DiceRoller.java. Наберите(или скопируйте) приведённый ниже исходный код:
import java.util.Random;
public class DiceRoller {
public static void main(String[] args) {
Random generator = new Random();
int d = 0;
while (d < 4) {
System.out.print("Rolling... ");
int face = 1 + generator.nextInt(6);
System.out.print("I got a "+ face
+ ". ");
if (face == 1) {
System.out.print("Wow! An ACE!");
}
System.out.println();
d = d + 1;
}
}
}
Сохраним его в файле. Скомпиллируем и запустим нашу новую программу набрав две команды:
javac DiceRoller.java
java DiceRoller
Вы увидите что-то подобное:
Rolling... I got a 2.
Rolling... I got a 1. Wow! An ACE!
Rolling... I got a 4.
Rolling... I got a 5.
Программа будет бросать четыре кубика и тот на котором выпадет единица победит. Вам интересно узнать, как это работает?
На данном примере можно продемонстрировать несколько интересных вещей. Эта программа использует две переменные d и face. Переменная d применяется когда мы делаем только четыре броска, не три и не пять, а переменная face запоминает какое значение было получено при каждом из бросков. Также программа получает набор строк в переменной args. Эта переменная передаёт параметры командной строки, если вы их задали, но в нашем примере их нет.
И ещё, помните классы Java могут использовать другие классы? В нашем примере это переменная generator. Через неё наша программа обращается к внешнему классу Random, который выполняет генерацию псевдослучайных чисел. В нашем случае мы вызываем только один из его методов nextInt() для получения случайного числа в диапазоне от 0 до 5.
Дополнительно в Java применяются фигурные скобки { и } определяющие область действия команд вызываемых в блоках. Каждый блок может быть пустой или содержать от одной и более команд. Если это необходимо, вы можете, используя управляющие конструкции, выделять подблоки внутри существующих блоков.
А теперь можно поговорить и об этом. В данном примере используются две управляющие конструкции: if и while. Управляющая конструкция if запускает выполнения блока только в случае если логическое выражение в скобках истина(true). А управляющая конструкция while работает наоборот, её блок выполняется до тех пор, пока логическое выражение в скобках не станет ложным(false). Ещё в Java применяются управляющие конструкции: for, do-while, switch, if-else и т.п.
В нашем примере if проверяет истинность выражения face == 1. По этому сообщения о выигрыше появляется только при выпадении единицы.
Управляющая конструкция while запускает свой блок четыре раза пока значение переменной d меньше чем 4. Первоначальное значение этой переменной равно 0 и с каждым циклом выполнения блока оно увеличивается на 1. Поэтому первые четыре раза(0, 1, 2, 3) блок выполняется успешно, и только в пятый раз(когда переменная d равна 4) он будет прерван.
Усложним задачу #2: Измените программу для 7 бросков кубик, увеличив диапазон возможных вариантов значений до 10. В окне терминала снова скомпилируйте программу и запустите её использованными уже командами javac и java. Если всё сделали правильно, то теперь программа покажет значение для 7 бросков кубика. А теперь, за работу!
Примечание переводчика: Исходные коды, сам текст статьи и вёрстку в Scribus вы можете найти в репозитарии github.com/svininykh/magpi-issue14-ru/tree/master/cup-of-java