Курс Лекція 0
▶ Слайди⌨️ команди 9 · 9 нових
Конспект · Лекція 0

ВСТУП ДО ДИСЦИПЛІНИ: ПРОГРАМА, ОРГАНІЗАЦІЯ РОБОТИ, ОЦІНЮВАННЯ

Про що курс, як побудований семестр і що від тебе очікується

Ключова ідея. Системне програмування — це три межі між програмою й машиною (контейнер, пам'ять, набір інструкцій); семестр побудований так, щоб кожну межу перетнути на лекції, у лабораторній і в самостійній роботі.
Демо. Відкрити сайт курсу: показати структуру (лекції → ЛР → СРС), сторінку робочої програми, Лабораторну 0 і як виглядає робоче середовище (термінал у контейнері, docker version).
📚 ТЕОРЕТИЧНІ ВІДОМОСТІ

Предмет і мета дисципліни

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

Курс побудований навколо трьох таких меж:

  1. Межа середовища виконання (модуль 1). Контейнер — це процес, якому ядро Linux підмінило видимість системи через простори імен (namespaces) і обмежило ресурси через групи керування (cgroups). Інструмент — Docker; предмет — механізми ядра.
  2. Межа безпеки пам'яті (модуль 2). Мова Rust доводить на етапі компіляції, що програма не має помилок керування пам'яттю: моделі володіння (ownership) і запозичення (borrowing) замінюють збирач сміття статичною перевіркою.
  3. Межа набору інструкцій (модуль 3). Від машинного коду x86-64 і асемблера до WebAssembly — переносного низькорівневого формату коду, що виконується в пісочниці браузера й поза ним.

Організація семестру

Обсяг — 3 кредити ЄКТС (90 годин): 20 годин лекцій, 20 годин лабораторних робіт, 50 годин самостійної роботи. Форма контролю — залік, накопичувальний: підсумок формують рівні, досягнуті в десяти лабораторних роботах, і результати трьох модульних контролів.

Лекційне заняття триває дві години й складається з презентації теми (з живим демо в терміналі) та самостійної роботи над двома темами СРС, що відповідають цій лекції. Матеріали СРС публікуються в Google Classroom разом із лекцією. СРС окремо не оцінюється: перша тема готує до захисту рівня 2, друга — до розширення рівня 3 відповідної лабораторної роботи.

Лабораторна робота має три рівні: рівень 1 (оцінка 3) перевіряється автотестами за покроковою інструкцією; рівень 2 (оцінка 4) — захист із поясненням механізму й живою демонстрацією; рівень 3 (оцінка 5) — розширення за контрактом (автоматизація, оптимізація, власне рішення). Студент обирає рівень самостійно; вищий рівень включає виконання попередніх.

Робоче середовище і здача

Усі роботи виконуються в підготовленому контейнері розробника з попередньо встановленими інструментами відповідного модуля (Ubuntu 24.04 + Docker Engine; Rust 1.79 + Cargo; WABT, Node.js, clang, wasm-pack). Опис середовища кожної роботи зафіксований у конфігурації курсу і використовується для ініціалізації робочого простору — у кабінеті курсу або в GitHub Codespaces навчального репозиторію.

Здача — тегом submit/labNN у навчальному репозиторії; звіт REPORT.md містить варіант, вивід команд кожного кроку та відповіді на контрольні питання. Детально порядок здачі, перевірка середовища та робота з довідкою (man, --help, cat README.md) описані в Лабораторній 0, яка відкрита протягом усього семестру.

Матеріали курсу

Кожна лабораторна робота має дві версії з ідентичними вимогами: сюжетну (наскрізна історія, у яку вплетені технічні відомості — основна для студента) та академічну (методична форма). Лекції та конспекти — академічні. На кожній сторінці лабораторної, СРС і конспекту наведено блок «Команди на цій сторінці» з однореченнєвим описом кожної команди терміналу.

Розбір за слайдами

План заняття

Показати сайт наживо паралельно зі слайдами

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

Одна ідея на весь семестр: межа. Усі три модулі — про те, де вона проходить і хто її охороняє

Три модулі — три межі

Показати на сайті три «стрічки» модулів

Курс у цифрах

90
годин · 3 кредити ЄКТС
20 лекцій · 20 лабораторних · 50 СРС
3
модулі — три межі
ізоляція · пам'ять · інструкції
10+1
лабораторних (місій)
+ Лабораторна 0 — вступ, завжди відкрита
20
тем СРС
по 2 на кожну лекцію та ЛР

Цифри — за тарифікацією 2026/27; Лекція 0 і Лабораторна 0 — поза сіткою годин, додаткові матеріали

Як влаштований кожен тиждень

Лекціяпрезентація + демо · 1 год
СРС2 теми в аудиторії · 1 год
Лабораторнаконтейнер · 2 год
Здачатег submit/labNN
Захистрівні 2–3 · до кінця модуля

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

Лекції семестру

ТемаМодуль
Л1Три межі курсу: процес, адресний простір, системні викликиМ1
Л2Простори імен, групи керування (cgroups), привілеїМ1
Л3Образ як шари, Dockerfile, кеш, багатоетапна збіркаМ1
Л4Чому програми псують пам'ятьМ2
Л5Володіння (ownership)М2
Л6Запозичення і зрізиМ2
Л7Option і ResultМ2
Л8Асемблер x86-64М3
Л9WebAssembly як переносний асемблерМ3
Л10Rust у WASM, межа з host-середовищемМ3

Кожна лекція — одна ідея й одне живе демо; слайди й конспект — на сайті

Лабораторні роботи — 10 місій

Академічна назваСюжетна назваМ
ЛР1Контейнер розробника й огляд просторів імен«Ізоляційна Капсула»М1
ЛР2Dockerfile з багатоетапною збіркою і порівнянням розмірів«Кібер-Дієта»М1
ЛР3Два контейнери разом і ізольована мережа«Сліпий Канал»М1
ЛР4Перший проєкт на Cargo з юніт-тестом«Кування Відмички»М2
ЛР5Набір програм, що не компілюються (borrow checker)«Мертвий Лог»М2
ЛР6Структури і перелічення без null«Архітектура Ворога»М2
ЛР7Читання файлу з обробкою помилок«Мінне Поле»М2
ЛР8Модуль на WAT вручну«Пряма Ін'єкція»М3
ЛР9Той самий алгоритм у двох асемблерах«Розтин Системи»М3
ЛР10Ядро на Rust у WASM на сторінці з відтворюваною збіркою«Звільнення»М3

Кожна ЛР має сюжетну й академічну версію з однаковими вимогами; три рівні → «3» / «4» / «5»

Теми СРС — модуль 1

ТемаДо якої ЛР і рівня готує
СРС 01Простори імен Linux (PID, NET, MNT, UTS, IPC, USER): що ізолює коженЛР1 · рівень 2 → «4»
СРС 02Групи керування cgroups v2: обмеження CPU та пам'яті контейнераЛР1 · рівень 3 → «5»
СРС 03OverlayFS і шари образу: як влаштовано об'єднану файлову системуЛР2 · рівень 2 → «4»
СРС 04Відтворюваність збірки і довіра до образу (digest, pin версій)ЛР2 · рівень 3 → «5»
СРС 05Мережі Docker (bridge/none/host) і службове DNS між контейнерамиЛР3 · рівень 2 → «4»
СРС 06Керування секретами: env проти файлів проти docker secretsЛР3 · рівень 3 → «5»

Виконуються на 2-й годині відповідної лекції; окремо не оцінюються

Теми СРС — модуль 2

ТемаДо якої ЛР і рівня готує
СРС 07Модель володіння Rust проти збирача сміття і ручного керування пам'яттюЛР4 · рівень 2 → «4»
СРС 08Екосистема crates.io, Cargo.toml/Cargo.lock і семантичне версіонування залежностейЛР4 · рівень 3 → «5»
СРС 09Часи життя (lifetimes) у сигнатурах функцій: що саме перевіряє компіляторЛР5 · рівень 2 → «4»
СРС 10Rc і RefCell: спільне володіння та внутрішня мутабельність без гонокЛР5 · рівень 3 → «5»
СРС 11Алгебраїчні типи даних (enum) і вичерпне зіставлення зі зразком (match)ЛР6 · рівень 2 → «4»
СРС 12Патерн «зробити некоректний стан непредставним» (make illegal states unrepresentable)ЛР6 · рівень 3 → «5»
СРС 13Result<T, E> проти panic!: коли доречна відновна відмова, а коли зупинка програмиЛР7 · рівень 2 → «4»
СРС 14Власні типи помилок і трейт std::error::Error: Display, Debug, BoxЛР7 · рівень 3 → «5»

Виконуються на 2-й годині відповідної лекції; окремо не оцінюються

Теми СРС — модуль 3

ТемаДо якої ЛР і рівня готує
СРС 15Стекова машина WebAssembly і структура текстового формату .watЛР8 · рівень 2 → «4»
СРС 16Лінійна пам'ять WASM і межі безпеки пісочниціЛР8 · рівень 3 → «5»
СРС 17Угоди виклику (calling conventions) x86-64: System V AMD64 ABIЛР9 · рівень 2 → «4»
СРС 18Інструменти дизасемблювання: objdump та wasm-objdump, синтаксис AT&T проти IntelЛР9 · рівень 3 → «5»
СРС 19Межа Rust↔JS через wasm-bindgen: маршалінг типів і виклик з JavaScriptЛР10 · рівень 2 → «4»
СРС 20Відтворювані збірки Rust→WASM і цілісність ланцюга постачання (supply chain)ЛР10 · рівень 3 → «5»

Виконуються на 2-й годині відповідної лекції; окремо не оцінюються

Шлях однієї лабораторної

  1. 1
    Відкрити місіюсайт → сюжет або академічна версія; контейнер піднімається сам
  2. 2
    Виконати рівень 1за кроками з очікуваним виводом; REPORT.md
  3. 3
    Здати тегомgit tag submit/labNN && git push --tags → автотести
  4. 4
    Захистити 2 / 3пояснити механізм наживо; розширення за контрактом
  5. 5
    Підвищити до кінця модуляоцінка не остаточна, поки модуль відкритий

Дві версії однієї лабораторної

Сюжетна (основна для студента)
  • Наскрізна історія про С.І.Д.
  • Теорія вплетена в сцени
  • Рівні як місії, пасхалки, арт
Академічна
  • Мета · теорія · порядок виконання
  • Ті самі кроки й критерії
  • Зручна для звіту й захисту

Перемикач — угорі кожної сторінки; вимоги ідентичні

Як побудоване лекційне заняття (2 год)

СРС має подвійний зв'язок: до лекції (коли робимо) і до лабораторної (навіщо робимо)

Лабораторні: три рівні — три оцінки

Підкреслити: «3» — це вже робоча, перевірена автотестами лабораторна, а не «заради галочки»

Робоче середовище: Docker-контейнер розробника

Демо: відкрити середовище ЛР1, набрати cat /etc/os-release і docker version

Перша перевірка середовища

bash
cat /etc/os-release | head -2
docker version
cat README.md        # інструкція до роботи — прямо в терміналі
docker run --help    # довідка з будь-якої команди

Якщо це працює — середовище готове; далі все за інструкцією лабораторної

Здача робіт

Показати на сайті Лабораторну 0 — там покроково, з командами git

Здача тегом

bash
git add lab01 && git commit -m "lab01: рівень 2"
git tag submit/lab01 && git push --tags
# повторна здача після покращень:
git tag -f submit/lab01 && git push -f --tags

Тег — це «я здаю». Перевстановлений тег — «я здаю кращу версію»

Сайт курсу: дві версії кожної лабораторної

Показати ЛР1 у двох версіях і блок команд; QR — сайт відкриваємо просто зараз

docs.sp.ordynski.com

Політики курсу

РН17/ЗК9: обґрунтований вибір цифрових інструментів і ШІ з дотриманням доброчесності

Інструменти й джерела на семестр

Повний список — розділ «Джерела» робочої програми

Що зробити до наступного заняття

docs.sp.ordynski.com/lab0 → Лабораторна 0

Джерела

🥚 ПАСХАЛКА
У прикладі здачі коміт підписано «lab01: рівень 2», а в Лабораторній 0 на дні голопроєктора вигравіювано C1D — шістнадцяткове число, яке дорівнює 3101. Запам'ятай його: воно трапиться в курсі не раз.
⌨️ КОМАНДИ НА ЦІЙ СТОРІНЦІ 9 · 9 нових

Кожна команда терміналу з цієї сторінки — одним реченням. Позначка нове — команда зустрічається в курсі вперше; далі вважаємо її знайомою.

catнове
Виводить вміст файлу в термінал повністю (від concatenate); зручно для коротких файлів і /proc/....
headнове
Показує перші рядки файлу або потоку (head -5 — перші п'ять).
docker versionнове
Показує версії клієнта й демона — перевірка, що Docker встановлений і працює.
dockerнове
Клієнт Docker: усі дії з образами й контейнерами — через його підкоманди (docker <підкоманда> --help — довідка).
docker runнове
Створює й запускає контейнер з образу (docker run -it ubuntu:24.04 bash — інтерактивно з терміналом; -d — у фоні; --rm — видалити після виходу; -p 8080:80 — прокинути порт).
gitнове
Система керування версіями: історія змін, гілки, теги; здача робіт у курсі — через теги submit/labNN.
git tagнове
Позначає поточний коміт іменем (git tag submit/lab01) — так ти «здаєш» лабораторну.
git pushнове
Відправляє коміти й теги у віддалений репозиторій (git push --tags).
manнове
Відкриває посібник (manual) до команди: man ps; вихід — q.

💡 Прочитати README прямо в терміналі: cat README.md (виведе весь файл) або less README.md (посторінково; вихід — клавіша q).
Довідка з будь-якої команди: man curl (повний посібник, вихід — q) або коротко curl --help; для підкоманд — docker run --help, cargo build --help.