ЛЕКЦІЯ 1

Огляд системного програмування

Спеціалізовані мови програмування

VTFK • 2025

План лекції

  • Системне програмування: визначення
  • C, Rust, Assembly — порівняння
  • Архітектура комп'ютера
  • Навіщо вчити низькорівневе

Фокус: від теорії до практики

Системне програмування

System Programming

Розробка програм, які взаємодіють прямо з апаратурою: операційні системи, драйвери, компілятори, базові утиліти.

Аналогія: Як архітектор будівель розуміє не тільки дизайн, але й основу, фундамент, конструкцію

Три рівні абстракції

Рівні програмування

Абстракція і контроль

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% graph LR App["Додатки
Python, JS"] -->|calls| OS["ОС
Linux/Windows
C, Rust"] OS -->|calls| HW["Апаратура
Assembly
x86-64"] Dev1["High-level"] -.-> App Dev2["System-level"] -.-> OS Dev3["Low-level"] -.-> HW style App fill:#E5F3FF style OS fill:#FFE5E5 style HW fill:#FFE5FF

Мови системного програмування

Мова Рівень Безпека Продуктивність Крива навчання
C Низький Ручна Дуже висока Висока
Rust Низький Автоматична Висока Дуже висока
Assembly Дуже низький Немає Максимальна Найвища
Python Високий Автоматична Низька Низька

Який файл як вибрати?

Той самий код: три мови

Додавання двох чисел

// C: контроль над всім
#include 

int main() {
    int a = 5, b = 3;
    int sum = a + b;  // + в C = одна машинна інструкція
    printf("%d\n", sum);
    return 0;
}

// Результат: 8

Той самий код: Rust

Безпечніше, але більше синтаксису

// Rust: безпека + контроль
fn main() {
    let a = 5;
    let b = 3;
    let sum = a + b;  // Компілятор перевіряє типи
    println!("{}", sum);
}

// Результат: 8

Той самий код: Assembly (x86-64)

Машина говорить нам

; Assembly: абсолютний контроль
mov rax, 5      ; rax = 5
mov rbx, 3      ; rbx = 3
add rax, rbx    ; rax = rax + rbx (8)
; Результат у rax: 8

Як код стає бітами

Шлях компіляції

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% flowchart LR Source["C код
main.c"] --> Compiler["Компілятор
gcc/clang"] Compiler --> ASM["Assembly
main.s"] ASM --> Assembler["Асемблер
as"] Assembler --> OBJ["Об'єктний файл
main.o"] OBJ --> Linker["Лінкер
ld"] Linker --> BIN["Виконавець
./main"] BIN --> CPU["CPU
виконує"] style Source fill:#E5F3FF style BIN fill:#FFE5E5 style CPU fill:#FFE5FF

Чому системне програмування важливо?

Архітектура: коротко

Міні-вікторина

Яка різниця між C та Assembly?

  • Немає — Assembly швидше
  • C — переносима, Assembly — архітектурна
  • Assembly безпечніший
✅ Правильна відповідь: C — переносима, Assembly — архітектурна
💡 Пояснення:

Assembly для x86-64 не працює на ARM. C — зв'язок між логікою та машиною.

Помилка: мислити 'C = Assembly'

⚠️ ЗАСТЕРЕЖЕННЯ

C часто простіший, ніж Assembly, та переносимий

❌ Неправильно

// Я писатиму Assembly
// щоб мій код був швидшим
int c_version() { return 5 + 3; }

Сучасні компілятори (gcc -O3) генерують ідентичний Assembly

✓ Правильно

// Пиши на C/Rust першим
// Оптимізуй тільки вузькі місця
// Профілюй інструментами: perf, valgrind

Правило 80/20: 80% часу у 20% коду

Модулі цього курсу

Підсумки

  • Системне програмування — взаємодія з апаратурою
  • C — компроміс між контролем і переносимістю
  • Rust — сучасна альтернатива з гарантіями безпеки

Далі — системи числення

Домашнє завдання

Наступна лекція:

Лекція 2: Системи числення

📚 Корисні ресурси:

📚 Корисні ресурси:

Дякую за увагу! 💾

← Повернутися до списку лекцій