В первом уроке мы посмотрели на Java сверху: язык, bytecode, JVM и идея переносимости. Теперь сделаем шаг назад и разберём более общий вопрос: что вообще такое программа и почему компьютеру нужны точные инструкции.
Это может казаться слишком базовым вопросом, но он быстро помогает навести порядок. Когда вы пишете Java-код, вы не просто набираете текст в редакторе. Вы описываете последовательность действий, которую потом специальные инструменты доведут до формы, пригодной для выполнения компьютером.
Почему компьютеру нужны точные инструкции
Обычный пользователь часто не думает о том, как компьютер понимает команды. Мы нажимаем кнопку, открываем приложение, вводим текст, видим результат на экране. Снаружи всё выглядит так, будто компьютер понимает наши намерения почти по-человечески.
Внутри всё строже. Компьютер не угадывает смысл. Он выполняет конкретные инструкции, которые в конечном счёте сводятся к работе процессора, памяти и других устройств. Если инструкция задана неточно, компьютер не “додумает” её за нас. Он либо выполнит то, что написано, либо сообщит об ошибке, либо получит результат, который не совпадает с ожиданиями человека.
Представьте просьбу “сделай красиво”. Человеку можно объяснить контекст, показать пример, договориться о вкусе. Компьютеру такая просьба сама по себе бесполезна. Ему нужны действия: взять это значение, сложить с другим, проверить условие, вывести строку, повторить блок кода несколько раз.
Именно поэтому программирование начинается не с запоминания команд, а с привычки формулировать задачу точно.
Как компьютер выполняет команды
В конечном счёте программу исполняет процессор. Он получает команды и выполняет их одну за другой. Но процессор не понимает русский язык, английские фразы или красивый текст в редакторе. Ему нужна очень низкоуровневая форма команд.
На самом нижнем уровне информация внутри компьютера представляется через простые состояния: сигнал есть или сигнала нет. Из огромного количества таких состояний складываются числа, символы, команды, адреса памяти и результаты вычислений.
Для человека писать программу прямо на таком уровне почти невозможно в повседневной работе. Нужно было бы вручную думать о длинных последовательностях битов, устройстве процессора, размещении данных в памяти и множестве мелких технических деталей. Это полезно понимать в общих чертах, но неудобно использовать как основной способ разработки.
Поэтому со временем появились более удобные формы записи программ: сначала низкоуровневые языки, близкие к устройству машины, а затем высокоуровневые языки, где код намного ближе к человеческому описанию действий.
Зачем нужны языки программирования
Язык программирования нужен как мост между человеком и компьютером. Человек описывает задачу в форме, которую может читать и поддерживать. Инструменты языка переводят это описание ближе к тому виду, который может выполнить компьютер.
В Java простая арифметическая мысль может выглядеть так:
5 + 3
Для нас такая запись понятна: есть два числа и операция сложения. Но процессор не выполняет этот текст напрямую. Сам по себе фрагмент 5 + 3 — это ещё не готовая программа для процессора, а часть исходного кода на высокоуровневом языке.
Высокоуровневые языки позволяют думать о смысле программы: сложить числа, проверить условие, вывести сообщение, обработать список, создать объект. Они скрывают от нас большую часть низкоуровневых деталей, но не отменяют их. Где-то между нашим кодом и выполнением всё равно должна произойти цепочка перевода.
Как это устроено в Java
В разных языках путь от исходного текста до выполнения устроен по-разному. Java использует промежуточный этап, о котором мы уже говорили в первом уроке.
Разработчик пишет исходный код в файле с расширением .java. Затем компилятор Java, команда javac, переводит этот текст в bytecode. Bytecode сохраняется в файлах .class. После этого JVM читает bytecode и выполняет его на конкретной системе.
В Java компилятор не превращает код сразу в окончательные команды конкретного процессора. Он создаёт bytecode — промежуточный формат. Именно поэтому Java-программа обычно проходит такой путь:
- человек пишет код в файле
.java; - компилятор
javacпереводит код в bytecode; - появляется файл
.class; - JVM выполняет bytecode на конкретном компьютере.
Смысл этой цепочки простой: человек работает с понятным Java-кодом, а инструменты Java постепенно доводят его до выполнения. На следующем уроке мы установим эти инструменты и проверим, что команды java и javac доступны на вашем компьютере.
Программа — это последовательность точных инструкций для компьютера. Компьютер не угадывает намерения человека, поэтому инструкции должны быть записаны строго.
Внутри компьютера выполнение сводится к работе процессора и низкоуровневых команд. Человеку неудобно писать такие команды напрямую, поэтому используются языки программирования.
Java — высокоуровневый язык. Мы пишем исходный код в файлах .java, компилятор javac переводит его в bytecode, а JVM выполняет этот bytecode на конкретной машине.
Теперь закрепим базовую карту: программа — это точные инструкции, а Java-код проходит путь от исходного файла к bytecode и выполнению на JVM.
Что такое программа
Начнём с главного определения. Программа — это не просто значок, окно или файл на рабочем столе.
Какое описание лучше всего подходит к понятию программы?
Почему инструкция для компьютера должна быть точной?
Зачем нужны языки программирования вроде Java?
Понятия урока
Теперь соединим основные термины с их ролями в цепочке выполнения Java-программы.
Соотнесите понятие и объяснение.
Подсказка
Подсказка: Смотрите на роль каждого понятия: запись, перевод или выполнение.
Путь Java-кода
В Java между исходным кодом и выполнением есть несколько этапов. Соберите их в правильном порядке.
Расположите этапы выполнения Java-программы по порядку.
Подсказка
Подсказка: Сначала есть текст программы, затем результат компиляции, затем запуск.