1. Знайомство з компілятором
Компʼютер не розуміє людської мови. Не розуміє він і мов програмування. Він розуміє лише програми, написані машинним кодом — такі, що складаються з нулів і одиниць. Люди ж мислять словами й ідеями, тож, звісно, їм складно складати цілі програми лише з 0 і 1.
00100100 перекладається як десяткове число
36 або символ
$
Тому й зʼявилися мови програмування на кшталт Swift. Вони стали своєрідними «перекладачами»: тепер програміст може написати команди «Зроби те й те» зрозумілою для себе мовою, а не у вигляді довгого ланцюжка команд процесора.
Але є один підводний камінь. Компʼютер усе одно не розуміє мови Swift! Якщо просто подати йому файл із кодом, він лише розведе руками й нічого не зробить. Саме для такої ситуації й існує компілятор.
Що ж таке компілятор?
Компілятор — це спеціальна програма, яка компілює код: перекладає Swift-код у код, зрозумілий компʼютеру. Він бере текст на Swift, розбирає його, перевіряє на помилки й перетворює на машинний код.
- Програма мовою Swift
-
Компілятор
- Програма, що складається з машинних кодів
Можна уявити компілятор як суворого вчителя, який:
- уважно перевіряє фрази: чи не припустилися ви помилки?
- змушує дотримуватися правил, наприклад правильних імен змінних, дужок, типів та областей видимості…
- і лише після цього допускає вас до діалогу з компʼютером!
Якби не компілятор, написання програми було б схоже на складання «Війни і миру» азбукою Морзе.
Компілятор ще розумніший
Компілятор Swift став ще розумнішим — він може не лише перекладати, а й оптимізувати код, підказувати помилки й навіть радити, як писати краще. І це ще не все.
А ще заради швидкості й оптимізації він не завжди одразу перетворює Swift-код на машинні команди суцільним потоком: усередині компілятора є кілька етапів.
Ідея проста: компілятор намагається згенерувати швидкий код під вашу платформу (процесор/ОС), а водночас перевіряє, чи все ви написали коректно.
flowchart TD
Source(["📄 Вихідний код Swift"]) --> Compiler{"Компілятор"}
subgraph Stage1 ["Етап перевірок"]
Compiler --> Check["Перевіряє код на помилки"]
Compiler --> Rules["Змушує дотримуватися правил"]
Compiler --> Advise["Радить, як писати краще"]
end
subgraph Stage2 ["Внутрішні етапи"]
Check & Rules & Advise --> Internal("Багатоступенева внутрішня обробка")
Internal --> Optimize["Оптимізація коду"]
Optimize --> Gen["Генерація швидкого коду
під платформу (Процесор/ОС)"]
end
Gen --> Exec(["Виконання програми"])
2. Помилки під час компіляції
Швидкість і оптимізація коду нас поки що не дуже цікавлять. А от що важливо, так це те, що компілятор перевіряє вашу програму на помилки. Він перевіряє код на коректність і не пропустить його далі, якщо знайде навіть найменшу помилку.
Приклад помилки:
Ви намагаєтеся присвоїти число змінній, яка може зберігати лише текст.
let userName: String = 42 // Ой! Так не можна.
Компілятор одразу видасть помилку, що типи не збігаються (наприклад: Cannot convert value of type 'Int' to specified type 'String').
Інший приклад — друкарська помилка в команді print:
prnt("Привіт!") // Помилка в назві функції
Компілятор скаже щось на кшталт: «Такої функції не існує — перевірте синтаксис!» (у реальності це буде повідомлення на кшталт Cannot find 'prnt' in scope).
Як читати помилки?
Більшість компіляторів підказують, де саме в коді помилка, і часом навіть пропонують варіанти виправлення. Не бійтеся помилок: кожна з них — це крок до розуміння й до подолання вашого внутрішнього «боса».
3. Типові помилки компіляції у Swift
cannot find ... in scope — імʼя не знайдено
Це означає, що ви звертаєтеся до імені, якого компілятор не знає. Найчастіше причина — друкарська помилка або змінну оголошено не там, де ви намагаєтеся її використати.
print(message)
Якщо message ніде не оголошено, компілятор видасть помилку.
cannot convert value of type ... to expected argument type ... — типи не збігаються
Одна з найчастіших помилок у новачків — спроба використати значення одного типу там, де очікується інший тип.
let age: String = 18
Тут ліворуч очікується String, а праворуч знаходиться Int.
Або так:
let a: Int = 10
let b: Double = 2.5
let sum = a + b
У Swift не можна просто так додавати Int і Double. Потрібно явно привести один тип до іншого.
expected ... / consecutive statements on a line ... — порушено синтаксис
Якщо ви пропустили дужку, лапку, кому або ще щось, компілятор повідомить, що очікував інший символ або конструкцію.
print("Hello"
Тут не вистачає закривальної дужки.
Swift досить чутливий до синтаксису, тому іноді одна маленька помилка ламає розбір усього рядка. У таких випадках корисно перевірити рядок трохи вище й трохи нижче місця, указаного в повідомленні.
4. Коментарі
Отже, уявіть: ви пишете складну програму. Усе працює, ви — геній! Але через місяць ви відкриваєте той самий код і... нічого не розумієте. Тут кілька рядків коду, там дивна змінна. У голові лише: «Це явно писав хто завгодно, але не я!». Саме тут і рятують коментарі.
Коментарі — це як записки на полях підручника або підписи на холодильнику («Пиво. Не пити. На ранок!»). Компілятор їх ігнорує, а люди — навпаки. Коментарі дають змогу пояснити зміст коду, позначити важливі деталі й навіть «вимкнути» шматки програм, не видаляючи їх.
Важливо: Жоден компілятор не читає ваші коментарі — він повністю їх ігнорує!
Однорядкові коментарі
У Swift є два види коментарів — однорядкові та багаторядкові. Однорядкові починаються з подвійного слеша // і тривають до кінця рядка. Усе, що стоїть після //, вважається коментарем і повністю ігнорується компілятором.
Приклад:
print("Привіт, світе!") // Це виводить привітання на екран
Ось тут // Це виводить привітання на екран — коментар. Якщо рядок коду видається незрозумілим і вам неясно, навіщо він потрібен, пишіть саме так!
Ще приклад:
let x = 42 // Значення віку програміста
Можна писати однорядкові коментарі й на окремих рядках:
// Ініціалізація змінної з іменем користувача
let userName = "Остап"
Майже як репліки в сценарії: коментар пояснює, навіщо і чому.
Багаторядкові коментарі
А якщо треба записати багато пояснень? Для цього є багаторядкові коментарі, які починаються з /* і закінчуються на */. Усе між цими символами ігнорується компілятором, навіть якщо це кілька рядків.
Приклад:
/*
Тут виводимо імʼя користувача на екран.
Якщо імʼя відсутнє, напишемо "Гість".
*/
print("Введіть ваше імʼя:")
Або так:
let age = 18 /* Початкове значення віку
для нового користувача */
Увага: не можна вкладати один багаторядковий коментар в інший. Не намагайтеся бути хитрішими за компілятор — це не спрацює.
Ілюстрація:
| Вид | Синтаксис | Приклад |
|---|---|---|
| Однорядковий | |
|
| Багаторядковий | |
|
5. Приклади з життя
Тимчасове вимкнення рядка коду:
Буває, що ви хочете тимчасово не виконувати якийсь фрагмент коду. Коментарі тут саме доречні:
// print("Текст, який тимчасово не потрібен")
Рядок залишився, але компілятор його не «бачить».
Позначки TODO і FIXME
Програмісти — теж люди. Іноді потрібно нагадати собі, що код ще не допрацьований, або що тут є вада. Для цього часто пишуть:
// TODO: зробити перевірку на порожнє введення
// FIXME: ця функція неправильно обчислює суму
Багато редакторів та IDE навіть виділяють такі слова!
Програмісти жартують
Ну і, звісно, іноді в коді трапляються дуже цікаві коментарі:
// Я не відповідаю за цей код. Мене змусили написати його всупереч моєму бажанню.
// Дорогий, я_з_майбутнього! Будь ласка, пробач мене за цей код.
// Якщо я ще раз побачу таке, мені доведеться почати носити на роботу зброю.
// Якщо ця умова колись виконається, будь ласка, повідомте мені за тел. ххх-ххх-ххх за винагороду.
// Дорогий програміст:
//
// Коли ти закінчиш «оптимізувати» цю підпрограму
// і зрозумієш, якою великою помилкою було це робити,
// будь ласка, збільш лічильник унизу як попередження
// для наступного хлопця:
//
// кількість_годин_витрачених_тут = 42
// Коли я починав це писати, тільки Бог і я розуміли, що я роблю.
// Зараз залишився тільки Бог
// Іноді мені здається, що компілятор ігнорує всі мої коментарі
// Я присвячую весь свій код, усю роботу своїй дружині Дарлін, якій
// доведеться утримувати мене, наших трьох дітей і собаку, коли
// це піде в продакшн.
Так, коментарі можуть бути дуже смішними. Адже їх пишуть живі люди.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ