Програмуємо на вихідних: 6 ідей проєктів для саморозвитку

  • 13 января, 15:27
  • 3853
  • 0

Найкоротша відстань між двома точками - пряма. Якнайшвидший спосіб освоїти мову програмування або фреймворк - створити працюючий проєкт. Доцент Університету Теннессі Остін Хенлі зібрав в своєму блозі ідеї відповідних проектів, які він радить студентам і професійними розробниками:

  1. Текстовий редактор.
  2. Двовимірна гра.
  3. Компілятор.
  4. Маленька операційна система.
  5. Електронна таблиця (завдання зі «зірочкою»).
  6. Емулятор консолі відеоігри (теж важко).

Пост отримав 300 відгуків на Hacker News і 100 коментарів на Reddit. Хенлі доповнив добірку ідеями з коментарів. Вони перераховані в кінці публікації.

Текстовий редактор

Ми використовуємо текстові редактори щодня, але як вони працюють? Забудемо поки про "наворочені" функції. Як вивести вікно з текстовим полем? Як створити миготливий текстовий курсор? Щоб він переміщався і виділяв текст. Щоб вставляв і видаляв нові символи. Без готових текстових компонентів, де все придумано іншими розробниками.

Пам'ять. Як зберегти текстовий документ в пам'яті? Перша думка - використовувати масив. Але у масива жахлива продуктивність. Якщо тільки користувач не робот, який додає текст лише в кінець документа. Вивчіть інші структури даних і вирішите, яка підійде краще.

Програмуємо на вихідних: 6 ідей проєктів для саморозвитку

Поведінка курсора. Нехай маркер курсору мигає в середині текстового поля. Якщо натиснути клавішу зі стрілкою вгору ↑, куди він переміститься? В той же стовпець символів? Не обов'язково: якщо рядок короткий, потрібно поставити курсор в кінець рядка. Але як тільки зустрічається рядок довший, маркер повинен повернутися до вихідної колонки. Інакше при русі вгору покажчик буде зміщатися до лівого краю.

Користувач натискає кнопку «вгору». Прослідкуйте, як курсор рухається по тексту.

У комерційних редакторах курсор «пам'ятає» початкове положення по горизонталі, і як тільки це можливо, повертається на найближчу позицію. Такі деталі не помічаєш, поки не берешся за справу.

Розширюємо набір функцій. І ось ми друкуємо і видаляємо в редакторі текст, виділяємо рядки і слова, курсор блимає і носиться по екрану. Що ще спробувати? 

Два завдання: 1) скасування та повтор дій, 2) перенесення слів по складах.

Як вести запис дій з мінімальними затратами пам'яті? Відразу і не додумаєшся. Хенлі описав як ішов до вирішення. Спочатку намагався зберігати стан в масиві, потім спробував шаблон проектування Хранитель (англ. Memento). Нарешті, зупинився на Команді (англ. Command).

Завдання перенесення слів по складах змусить задуматися про те, як рядок зберігається в пам'яті, і яким його бачить.

В яких темах ви розберетеся:

  • Структури даних для зберігання тексту: масив, rope, буферне вікно, piece table.
  • Поведінка і реалізація текстового курсора.
  • Патерни проектування для undo / redo.

Що почитати:

2D гра - Космічні загарбники

Щоб створити навіть примітивну гру, потрібно вибрати структуру даних і шаблон проектування. Не грузнучи в ігровому дизайні, реалізуйте від початку і до кінця двовимірну гру. Наприклад, клонуйте Space Invaders (Космічні загарбники). Краще взяти бібліотеку 2D-графіки: SDL для С, PyGame для Python або SFML для Java, C #, Go. Інакше потужний ігровий движок приховає все цікаве.

Програмуємо на вихідних: 6 ідей проєктів для саморозвитку

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

Графіка. Навчіться малювати рух персонажів. Щоб створити ефект руху об'єктів, зображення на екрані повинні швидко змінювати один одного.

Принцип атаки. Як розпізнавати одноразове і подвійне клацання? Якщо користувач затиснув клавішу зі стрілкою, чи повинен об'єкт прискорити рух? 

Логіка гри. Поведінка персонажів описується логікою гри. Як динамічно оновлювати кількість ворогів? Коли і як змінюються позиції куль? Як дізнатися, що ворог переможений? Коли гра закінчується?

А ще? Готова основа гри - додайте меню і титульний екран. Переконайтеся, що гра з однаковою швидкістю працює на різних комп'ютерах. Створіть ворогів за допомогою штучного інтелекту. Додайте ефекти, звук і розрахований на багато користувачів онлайн-режим.

Що почитати:

Компілятор для Tiny BASIC

Напишіть свій компілятор для простої мови, наприклад, Tiny BASIC. Нехай компілятор транслює його в симпатичну вам мову. Наприклад, напишіть на на Python компілятор Tiny BASIC, який виводить код C#. Не потрібно створювати збірку. Тим більше якщо вам це нецікаво. Зосередьтеся на трансляції.

Порядок дій. Створюйте компілятор в тому ж порядку, в якому він буде працювати з вихідним кодом. Кожен етап має на увазі власний інструмент і свій набір алгоритмів.

1. На стадії лексичного аналізу токенізатор групує елементи вихідної послідовності по заздалегідь відомим категоріям.

2. Парсер призводить послідовність токенів в структурований формат.

3. На етапі семантичного аналізу програма перевіряє, що код має сенс і дотримані правила мови. Якщо все в порядку, створюється проміжне представлення.

4. Генератор коду з проміжного представлення переводить код на цільову мову.

Програмуємо на вихідних: 6 ідей проєктів для саморозвитку

Як поліпшити? Щоб поліпшити компілятор, між пунктами 3 і 4 потрібно додати етап оптимізації. Потрібно виключити зайві конструкції і спростити код зі збереженням його сенсу. Як тільки зробите базовий компілятор, навчіть програму працювати зі стандартною бібліотекою. І нехай компілятор не тільки знаходить помилки в разі неправильного коду, але і виводить змістовні повідомлення.

В яких темах ви розберетеся:

  • Лексичний аналіз.
  • Синтаксичний аналіз (парсинг).
  • Метод рекурсивного спуску.
  • Абстрактне синтаксичне дерево.
  • Семантичний аналіз.
  • Оптимізуючий компілятор.
  • Кодогенерація.

Що почитати:

Міні-операційна система

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

Програмуємо на вихідних: 6 ідей проєктів для саморозвитку

Ось короткий список тем, в яких ви розберетеся:

  • Крос-компіляція
  • Завантажувач операційної системи
  • переривання BIOS
  • Режими роботи процесора
  • Управління пам'яттю і підкачка сторінок
  • Планування, наприклад, алгоритм Round-robin
  • Файлові системи (наприклад, FAT)

Що почитати:

Все ще недостатньо складно для вас? Спробуйте наступні два проекти:

Електронна таблиця

Завдання створення додатка для електронних таблиць, що поєднує елементи двох описаних вище проектів: текстового редактора і компілятора.

Текстовий редактор. Кількість інформації в осередках може бути різною. При виділенні окремого осередку надання інформації повинен враховуватись не тільки його вміст, а й посилання, підсвічуватись функції і оператори.

Компілятор. Осередок електронної таблиці може містити функції, змінні, посилання на інші осередки, константи і оператори. При цьому функції можуть діяти відносно вектора або двовимірного масиву значень. У загальному випадку кожна клітинка - та ж, що маленька програма. Тому потрібен компактний компілятор, який буде проводити всі необхідні перетворення і перевірки, видаючи кінцеві значення.

Емулятор консолі відеоігри

Продовжимо ідею проекту з двовимірними іграми. Де ми могли зустрічати такі ігри крім автоматів? На ігрових консолях. Особливий фан представляє написання емулятора консолі, яка вміє запускати ігри, придумані іншими розробниками. Такий проект об'єднує в собі створення компілятора і операційної системи.

Емулятор - віртуальна машина, яка прикидається, що функціонує так само, як апаратні компоненти ігрової консолі. Тому він може запускати гри, призначені для приставки.

CHIP-8. Хенлі рекомендує почати з емуляції CHIP-8. Це проста віртуальна консоль, для якої легко знайти приклади емуляції. Потім можна перейти до емуляції реальних консолей, як Dendy або Sega. У них доведеться враховувати особливості конкретного обладнання.

Програмуємо на вихідних: 6 ідей проєктів для саморозвитку

PICO-8. Раз вже емулятор - це віртуальна машина, то необов'язково, щоб консоль існувала в дійсності. Півтори тисячі ігор написано під 15-доларовий емулятор PICO-8. Спробуйте створити вільну версію емулятора і подивитися, як запустяться віртуальні картриджі. 

Приклади емуляції для різних мов і консолей:

Користувачі HackerNews, Reddit, Twitter та інші прислали Остину Хенлі наступні ідеї проектів:

  • Система управління базами даних 
  • Растровий графічний редактор в дусі MS Paint.
  • Редактор векторної графіки.
  • Декодер зображень.
  • Веб-додаток онлайн-чату.
  • Калькулятор числа пі з заданим числом знаків.
  • Утиліти командного рядка (наприклад, grep ).
  • FTP-клієнт і сервер.

Джерело перекладу


0 комментариев
Сортировка:
Добавить комментарий