Cómo funciona Java

13

Програмування на Java часто сприймається новачками як складне завдання, але логіка, що лежить в його основі, напрочуд проста. Незалежно від того, чи хочете ви, будучи підлітком, створити свою першу відеогру, чи ви, будучи пенсіонером, нарешті наважуєтеся задовольнити цікавість, яка збиралася у вас десятиліттями, поріг входу нижче, ніж ви думаєте. Ми приберемо зайву складність і подивимося, як насправді працюють комп’ютерні програми, навчаючись програмування Java.

Це керівництво припускає, що у вас немає жодних знань у галузі програмування. Якщо ви вже знаєте C++ або Python, основи тут здадуться повторенням, тому ви можете сміливо пропускати відповідні розділи. Ми припускаємо, що ви вмієте працювати з інтерфейсом комп’ютера: редагувати файли, переміщати дані та керувати папками. Також передбачається використання операційного середовища Windows (від 95 до XP), хоча ці концепції легко переносяться на MacOS або Linux, якщо ви використовуєте іншу систему.

Найкраща частина? Вам не потрібно витрачати жодної копійки. Інструменти, необхідні для початку написання коду Java, безкоштовні, широко доступні в інтернеті і підтримуються величезними освітніми спільнотами. Як тільки ви освоїте Java, вивчення інших мов стане значно простішим. Це надійна база.

Перш ніж завантажувати якісь інструменти, давайте розберемося з термінологією. Плутанина часто виникає через змішування коду, який пишете ви, та коду, який виконує комп’ютер.

Що таке комп’ютерна програма?

У своїй основі комп’ютерна програма – це список інструкцій. Вона вказує на машину, що саме потрібно зробити наступним. Подумайте про це як про рецепт для кухаря чи ноти для музиканта. Комп’ютер не здогадується; він буквально слідує вашим вказівкам.

Ці інструкції можуть включати додавання стовпця чисел, порівняння двох значень для прийняття рішення або відображення графіки на екрані. Кінцевим результатом може бути будь-що: від збалансованої книги обліку до складного текстового процесора. Головний висновок у тому, що програма — це набір інструкцій. Комп’ютер є лише виконавцем.

Роль мови програмування

Комп’ютери не розуміють англійську (або Java, або Python). Вони розуміють машинний код — двійкову мову, що складається з одиниць та нулів. Щоб подолати цей розрив, люди використовують “мови програмування”.

Існує безліч мов: від старих стандартів, таких як Fortran і Cobol, до сучасних фаворитів, таких як C++, Perl і Java. Всі вони виражають схожі логічні концепції, але з різним синтаксисом та правилами. Java була обрана для цього посібника, тому що вона широко використовується, строго типізована (що допомагає виявляти помилки на ранніх етапах) і працює практично на будь-якому пристрої.

Розуміння компілятора

Тут розпочинається технічна частина. Ви пишете свій код на Java, який є читаним для людини. Комп’ютер не може виконати його безпосередньо. Йому потрібний перекладач.

Цей перекладач називається “компілятором”.

Компілятор бере ваш код на Java і перетворює його на машинний код (на Windows це часто файли з розширенням .exe ). Саме цей формат, зрозумілий машині, виконує процесор. Без компілятора ваш код – це просто текстовий файл, що лежить на жорсткому диску і нічого не робить.

Підготовка до написання коду

Для написання коду Java потрібно компілятор Java. Наступний крок – завантаження та встановлення необхідного програмного забезпечення. Цей процес займе деякий час, переважно через завантаження великих файлів. Вам також потрібно переконатися, що на диску вільно щонайменше 40 мегабайт місця.

Навіщо морочитися з налаштуванням? Тому що, отримавши компілятор, ви знайдете силу творити. Ви можете перетворити абстрактну логіку на відчутне програмне забезпечення. Це навичка, яка окупається розумінням того, як працює цифровий світ.

Комп’ютерна програма – це просто набір інструкцій для комп’ютера. Комп’ютер точно і послідовно виконує ваші інструкції і робить щось корисне.

Інструменти безкоштовні. Спільнота величезна. Логіка універсальна. Залишилося лише почати друкувати.

Запуск компілятора Java – це не просто натискання кнопки “Далі”. Потрібна певна послідовність завантажень, установок та змін у системі. Якщо ви хочете писати програми на Java, вам потрібне робоче середовище розробки. А це означає роботу з великими файлами, архіваторами та змінними середовищами.

Процес простий, але не вибачає пропущених кроків. Вам потрібні SDK, документація та інструменти для їх розпакування. На старих Windows це часто означало використання WinZip. На сучасних системах підійде будь-який архіватор, але логіка залишається незмінною.

Почніть із створення тимчасової папки. Назвіть її каталог завантаження. Це дозволить відокремити великі файли від системного сміття.

Крок 1: Завантаження SDK

Перейдіть до офіційної сторінки завантаження. Для Java 1.4.2 вам потрібний SDK. Натисніть посилання. Прийміть ліцензійну угоду. Це стандартна юридична перешкода, а не технічна. Виберіть операційну систему. Завантажте файл у тимчасову папку, яку ви створили.

Будьте попереджені: це величезний файл. Якщо ви все ще використовуєте dial-up модем, йдіть заваріть чай. Це займе годинник. Файл документації не набагато менший.

Крок 2: Завантаження документації

Вам потрібний довідковий матеріал. Натисніть посилання для документації SDK 1.4.1. Знову виберіть ОС. Завантажте її до того ж каталогу.

Крок 3: Робота з архіватором

Ви встановили WinZip? Якщо ні, він вам потрібний. Архіви Java мають формат .zip. Ви не можете відкрити їх у Блокноті. Перейдіть на веб-сайт WinZip. Завантажте пробну версію. Запустіть файл, що виконується. Встановіть його.

Цей інструмент знадобиться пізніше для розпакування документації. Не пропускайте цей крок.

Крок 4: Встановлення набору розробки

Знайдіть файл j2sdk-1_4_1-*.exe, який ви завантажили на Кроку 1. Двічі клацніть по ньому. Інсталятор автоматично розпакує набір. Він помістить файли туди, де вважатиме за потрібне. Запам’ятайте цей шлях. Він вам знадобиться пізніше.

Крок 5: Встановлення документації

Документація не має власного установника. Вам потрібно розмістити її вручну. Прочитайте інструкції, що йдуть у комплекті із завантаженням. Вони підкажуть вам перемістити файл документації до того ж каталогу, куди ви встановили набір розробки.

Розпакуйте його. Файли розпакуються у правильну структуру.

Крок 6: Налаштування змінних середовища

Тут більшість людей застряє. Вам потрібно оновити змінну PATH. Вона повідомляє комп’ютера, де знайти команду javac.

Відкрийте вікно MS-DOS. Введіть PATH. Що вже там є? Тепер відкрийте autoexec.bat у Блокноті. Додайте до шляху каталог bin Java, точно так, як зазначено в інструкціях. Збережіть файл. Перезавантажте комп’ютер, щоб зміни набули чинності.

Якщо ви пропустите один символ, компілятор не працюватиме.

Крок 7: Перевірка налаштування

Відкрийте вікно MS-DOS. Введіть javac. Натисніть клавішу Enter.

Якщо все працює, ви побачите дворядковий текст із поясненням того, як використовувати компілятор. Це означає, що ви готові.

Якщо ви бачите “Bad Command or File Name”, ви помилилися. Шлях вказано неправильно. Поверніться назад. Прочитайте інструкції. Перевірте autoexec.bat. Будьте наполегливими. Ця вправа з налагодження навіть до того, як ви написали код.

Чому це важливо

Тепер у вас є машина, здатна компілювати Java. Ви готові написати програмне забезпечення.

У папці установки ви знайдете каталог demo. Він сповнений прикладів. Вони готові до запуску. Знайдіть файли на зразок example1.html. Завантажте їх у веб-браузер.

Багато хто з них видає звуки. Увімкніть динаміки.

Це не просто теорія. Ви взаємодієте із платформою. Компілятор працює. Середовище настроєно.

Але налаштування – це лише половина справи. Інша половина – написання коду. І код має бути ідеальним. Одна пропущена точка з комою ламає все.

Ваша перша програма

Подорож починається із чогось простого. Полотно. Лінія. Це все, що нам потрібне для старту.

Ви створите область для малювання. Потім ви проведете по ній діагональну лінію. Це звучить тривіально, але цей процес навчить вас основним механізмам компіляції та запуску Java-коду у веб-середовищі. Ось робочий процес:

  1. Відкрийте Блокнот.
  2. Введіть код.
  3. Збережіть його як FirstApplet.java.
  4. Скомпілюйте його за допомогою javac.
  5. Створіть HTML-обертку.
  6. Запустіть його.

Ось вихідний код, який потрібно набрати вручну. Не копіюйте та не вставляйте його, якщо хочете вивчити синтаксис.

“java
import java.awt.Graphics;

public class FirstApplet extends java.applet.Applet {
public void paint(Graphics g) {
g.drawLine(0, 0, 200, 200);
}
}
bash
cd path\to\your\folder
bash
javac FirstApplet.java
`

Збережіть цей файл у тій же директорії, що і ваш Java-файл.

Назвіть його: applet.htm.

Тег є мостом. Він вказує браузеру (або браузеру), де знайти скомпільований клас. code=FirstApplet.class вказує на байт-код. width=200 та height=200 визначають область малювання.

Якщо ви не розумієте HTML, зупиніться. Прочитайте, як працюють веб-сторінки. Вам потрібно зрозуміти контейнер, перш ніж розуміти вміст.

Крок 6: Запуск аплету

Поверніться до командного рядка.

Ви все ще знаходитесь в директорії з обома файлами.

Запустіть браузер аплетів.

`

З’явиться вікно.

Подивіться на нього.

Ви повинні побачити порожній квадрат. Усередині нього діагональна лінія йде від лівого верхнього кута (0,0) до нижнього правого (200,200).

Якщо вікно надто маленьке, лінія може бути обрізана. Потягніть за краї, щоб змінити розмір.

Ви також можете відкрити applet.htm в браузері. Netscape Navigator чи Internet Explorer. Вони зроблять те саме.

Все працює. Ви написали код. Він скомпілювався. Він запустився.

Це

Ви щойно створили щось. Або, точніше, написали інструкції для того, щоб на екрані сталася якась дія.

Все почалося з коду для апплету на Java. Аплет — це програма Java, призначена для запуску всередині веб-браузера. Це відрізняється від програми на Java, яка є самостійною програмою, що працює на вашому локальному комп’ютері. Програми складніші і трохи менш популярні для інтеграції в Інтернет, тому ми починаємо з аплетів. Ми скомпілювали код за допомогою javac. Ми обернули його на базову HTML-сторінку. Потім ми запустили його за допомогою appletviewer, хоча браузер працює так само добре.

Код складається лише з десяти рядків.

`java
import java.awt.Graphics;
public class FirstApplet extends java.applet.Applet {
public void paint(Graphics g) {
g.drawLine(0, 0, 200, 200);
}
}

Це малює квадрат з хрестиком усередині. Переконайтеся, що вікно досить велике, щоб бачити всю фігуру.

Ви також можете міняти кольори. Метод setColor дозволяє переключитися із чорного за замовчуванням на щось інше. Вам потрібно імпортувати клас Color, щоб використати іменовані кольори, такі як червоний або синій.

Ось трохи складніша версія:

“java
import java.awt.Graphics;
import java.awt.Color;

public class FirstApplet extends java.applet.Applet {
public void paint(Graphics g) {
g.setColor(Color.red);
g.fillRect(0, 0, 200, 200);
g.setColor(Color.black);
g.drawLine(0, 0, 200, 200);
g.drawLine(200, 0, 0, 200);
}
}
`

Тепер подивіться на цю версію:

`java
g.setColor(Color.black);
g.drawLine(0, 0, 200, 200);
g.drawLine(200, 0, 0, 200);
g.setColor(Color.red);
g.fillRect(0, 0, 200, 200);

Це малює чорний контурний прямокутник із двома діагоналями. Тепер змініть останній рядок на:

`java
g.drawLine(0, 200, 0, 200);

Тут width та height оголошені як int. Це означає, що вони зберігають цілі числа. Цілі числа. Без дрібної частини. Без тексту.

Саме ця суворість є причиною, через яку Java називають строго типізованим мовою. Інші мови можуть дозволити вам зберігати рядок у змінній одну секунду, а число – наступного. Java каже “ні”. Ви повідомляєте тип заздалегідь. Це видається зайвою роботою. Так і є. Але для великих проектів це рятує від тонких помилок, коли ви випадково поводитеся з текстом як із числом.

Ініціалізація має значення

У наведеному вище фрагменті ми не просто оголосили змінні. Ми їх ініціалізували.

`java
int width = 200;

Результат той самий. Більше набір тексту. Навіщо потрібна ініціалізація? Тому що Java скаржитися, якщо ви її не зробите.

Спробуйте видалити =200. Спробуйте скомпілювати код. Компілятор випустить помилку. Він не дозволить запустити код із неініціалізованими локальними змінними. Це корисна функція. Вона рятує вас від збоїв під час виконання програми пізніше.

Примітивні змінні проти змінних-класів

Java має дві основні категорії змінних.

  1. Примітивні (прості) змінні : Наприклад, int. Вони зберігають одне значення. Нічого більше. Ви задаєте його, читаєте його.
  2. Змінні класи : Це об’єкти. Вони містять кілька частин (полів) та мають пов’язані з ними методи (функції).

Візьміть клас Rectangle (Прямокутник). Це не просто число. Це постать. У нього є ширина, висота, координати x та y. Він має поведінку.

Створення чуйного коду

У попередньому прикладі розмір вікна був жорстко заданий як 200×200. Це негнучки. Що, якщо користувач змінить розмір вікна? Код відображення повинен адаптуватись.

Ми можемо запросити у графічного контексту доступний простір.

`java
Rectangle r = g.getClipBounds();

Точковий оператор (. ) дозволяє звертатися до полів усередині об’єкта. r.width отримує поле ширини з об’єкта r. Ми віднімаємо 1, тому що краї часто перекриваються на один піксель. Спробуйте видалити -1. Спробуйте -5. Подивіться, як зміщується малювання.

Навіщо використовувати проміжні змінні?

Ви могли б взагалі пропустити змінні width та height.

`java
g.drawRect(0, 0, r.width - 1, r.height - 1);

Перший рядок тут — місце, де новачки часто спотикаються. radius=diameter/2.0; каже Java взяти значення з diameter, розділити його на 2.0 і помістити результат у radius.

Знак рівності не є твердженням про рівність. Це оператор присвоєння. Він означає: “обчисліть вираз праворуч і помістіть результат у змінну зліва”.

Цей напрямок має значення. Якщо ви зміните їх місцями, код не спрацює. Java не вирішує рівняння алгебри. Вона виконує вказівки.

Далі йде обчислення обсягу. У ньому використовується константа пі (приблизно рівна 3.14159) та радіус, отриманий з діаметра. Тут також застосовується порядок операцій. Множення та розподіл виконуються зліва направо, якщо тільки дужки не вказують інше.

Чому використовується 2.0, а не 2? Тому що diameter має тип “float”. Використання цілого чисельного літералу в деяких контекстах може примусово виконати цілісний поділ або, принаймні, створити неявне перетворення. Явне використання 2.0 зберігає всі обчислення в ділянці дробових чисел. Це дозволяє уникнути помилок округлення із самого початку.

Таким чином, ви маніпулюєте простими типами. Ви надаєте. Обчислюєте. Перепривласнюєте. Машина робить рівно те, що ви їй кажете, і нічого більше.

Комп’ютери призначені для повторень. Люди втомлюються. Код – ні. Якщо ви коли-небудь писали послідовний блок коду просто для повторення простої дії, ви відчували цю незручність. Це втомлює. Це схильна до помилок. І саме тому є цикли.

Розглянемо конкретний приклад. Уявіть, що вам потрібно намалювати сітку із горизонтальних ліній. Ви можете прописати кожну лінію окремо.

Ось як це виглядає на чистому Java:

`java
import java.awt.Graphics;
public class FirstApplet extends java.applet.Applet {
public void paint(Graphics g) {
int y;
y = 10;
g.drawLine(10, y, 210, y);
y = y + 25;
g.drawLine(10, y, 210, y);
y = y + 25;
g.drawLine(10, y, 210, y);
// ... і так далі для кожної лінії.
}
}

При запуску цього коду Java малює дев’ять горизонтальних ліній. Ось що відбувається під капотом.

На операторі while Java зупиняється. Вона перевіряє вираз у дужках. Менше чи одно y значенню 210?

  • Якщо так, вона входить у блок коду всередині фігурних дужок {}. Виконує команду малювання. Оновлює y. Потім досягає дужки, що закриває, і повертається нагору. Вона ставить питання знову.
    – Якщо ні, вона повністю пропускає блок. Переходить до того, що йде далі.

Спочатку y дорівнює 10. 10 менше 210. Java малює лінію від (10,10) до (210,10). Вона встановлює y рівним 35. Цикл повертається. 35 менше ніж 210. Вона малює ще одну лінію. Встановлює y рівним 60. Цей цикл повторюється доти, доки y нарешті не перевищить 210. Тоді цикл завершується.

Ви можете завершити сітку, додавши другий цикл while для вертикальних ліній:

`java
import java.awt.Graphics;
public class FirstApplet extends java.applet.Applet {
public void paint(Graphics g) {
int x, y;
y = 10;
while (y <= 210) { g.drawLine(10, y, 210, y); y = y + 25; } x = 10; while (x <= 210) { g.drawLine(x, 10, x, 210); x = x + 25; } } }

Ви можете переписати його як цикл for :

``java
for (y = 10; y <= 210; y = y + 25) { g.drawLine(10, y, 210, y); } ````

Цикл for не робить нічого чарівного. Він просто стискає кроки ініціалізації, перевірки та інкременту в один рядок коду. Це заощаджує місце. Це зберігає логіку на увазі. Ось і все.

Поширені помилки при роботі з циклами

Є два важливі моменти, які слід мати на увазі під час роботи з циклами.

По-перше, напрямок не має значення. Ви могли б ініціалізувати y значенням 210 та зменшувати його на 25 щоразу. Умовою стане y> = 10. Математично це ідентично. Більшість людей воліють додаток, тому що рахунок вгору здається більш природним, але ви можете віддати перевагу віднімання. Використовуйте той варіант, який знижує когнітивне навантаження у конкретному випадку.

По-друге, і це критично важливо: крок інкременту не є опціональним.

Якщо ви випадково пропустите y = y + 25 усередині циклу, y залишиться рівним 10 назавжди. 10 завжди менше 210. Цикл ніколи не закінчиться. Це "нескінченний цикл". Це одна з найпоширеніших помилок у програмуванні. Програма зависне, споживатиме ресурси процесора і виглядатиме замороженою. Вам доведеться примусово закрити програму або завершити процес. Це головний біль, якого можна уникнути за допомогою крапки з комою та звички перевіряти код.

Спробуйте написати програми для малювання простих фігур за допомогою цих концепцій. Звикайте до ритму ініціалізації, перевірки, дії та оновлення. Це серцебиття більшості програм.

Де копати глибше

Бажаєте більше коду? Більше синтаксису? Більше способів зламати збирання? На наступній сторінці ви знайдете посилання. Java - не єдина мова. Це просто той, який ми розбирали останні вісім сторінок. Інші також існують. C ++, Python, Rust. Кожен має свої особливості, свої екосистеми, свої способи змусити вас засумніватися у правильності життєвих виборів.

Перейдіть за цими посиланнями. Занурюйтесь. Або ні. Компілятор все одно.