Розповідається про основи комп’ютерів, включаючи їх компоненти, такі як жорсткий диск, ОЗП, відеокарта, материнська плата і процесор. Описується роль ЦПУ в виконанні інструкцій і структуру комп’ютерних програм. Також вводиться поняття бінарної, десяткової і шістнадцяткової систем числення, мов програмування та операційних систем. Окрім того, роз’яснюється як додатки взаємодіють з ОС і як гри є частиною цього процесу. Читачі дізнаються про основи створення і роботи комп’ютерних ігор, а також про те, як вони інтегровані в комп’ютерні системи.
Звичайний комп’ютер складається з кількох підключених компонентів. Серед найважливіших:
Жорсткий диск
ОЗП
Відео Карта
Материнська плата
ЦП
Якщо ви знімете бічну частину настільного комп’ютера, деталі можуть бути розміщені в такій конфігурації:
Для наших цілей ми лише коротко розглянемо перші чотири компоненти, а потім зосередимося на ЦП у наступному розділі:
Жорсткі диски відповідають за зберігання великих файлів, таких як фотографії, виконувані файли або системні файли.
Оперативна пам’ять зберігає дані, до яких потрібен швидкий доступ. Дані завантажуються в оперативну пам’ять з жорсткого диска.
За відображення графіки на моніторі відповідають відеокарти.
Материнські плати поєднують усі ці компоненти разом і дозволяють їм обмінюватися даними.
ЦП – це мозок комп’ютера. Він відповідає за виконання інструкцій. Ці інструкції спрощені та відрізняються залежно від архітектури. Наприклад, інструкція може додати два числа. Щоб прискорити час виконання, центральний процесор має кілька спеціальних областей, де він може зберігати та змінювати дані. Вони називаються реєстрами.
Усі комп’ютерні програми складаються із серії інструкцій. Як ми обговорювали вище, інструкція є простою і зазвичай виконує лише одну дію. Наприклад, нижче наведено деякі інструкції, які можна знайти в більшості архітектур:
Додайте два числа
Відняти два числа
Порівняйте два числа
Перемістити число в розділ пам’яті (RAM)
Перейдіть до іншого розділу коду
Комп’ютерні програми розробляються на основі цих простих інструкцій, поєднаних разом. Наприклад, простий калькулятор може виглядати так:
mov eax, 5 mov ebx, 4 add eax, ebx
Перша інструкція ( mov ) переміщує значення 5 у регістр eax . Другий переміщує значення 4 у регістр ebx . Потім інструкція додавання додає eax і ebx і поміщає результат назад в eax .
Комп’ютерні програми — це збірники інструкцій. Програми відповідають за отримання значення (вхід), а потім створення значення (вихід) на основі отриманого значення.
Наприклад, одна проста програма може прийняти число як вхід, збільшити число на 1, а потім перемістити його на вихід. Це може виглядати так:
mov eax, input add eax, 1 mov output, eax
Більш складна програма мала б багато з цих простих програм «всередині». У цьому контексті ці прості внутрішні програми називаються функціями. Функції, як і програми, приймають вхідні дані та створюють вихідні дані. Наприклад, ми могли б зробити нашу попередню програму функцією, яка виконує те саме. Це може виглядати так:
function add(input): mov eax, input add eax, 1 mov output, eax
Ми також могли б створити іншу функцію, яка виконує подібну операцію. Наприклад, ми могли б написати функцію для зменшення числа на 1:
function subtract(input): mov eax, input sub eax, 1 mov output, eax
Ці дві функції ( додавання та віднімання ) потім можна використовувати для створення більш складної програми. Ця нова програма візьме число та збільшить або зменшить його. Буде потрібно два входи:
Номер
Математична операція, у цьому випадку додавання (+) або віднімання (-)
Ця нова програма буде довшою та матиме два різні способи її виконання. Вони будуть пояснені після коду:
function add(input): mov eax, input add eax, 1 mov output, eax function subtract(input): mov eax, input sub eax, 1 mov output, eax cmp operation, '-' je subtract_number add(number) exit subtract_number: subtract(number) exit
Цей код має дві функції у верхній частині. Як ми обговорювали, вони беруть вхідні дані, а потім додають або віднімають 1 від вхідних даних, щоб отримати вихід. Інструкція cmp порівнює два значення. У цьому випадку він порівнює тип операції, отриманий як вхідні дані, і значення, закодоване в програмі, – . Якщо ці значення рівні, ми переходимо до (або переходимо до) іншого розділу коду ( je = переход, якщо дорівнює).
Якщо операція дорівнює – , ми переходимо до коду, який віднімає 1 від числа. В іншому випадку ми продовжуємо програму і додаємо 1 до числа перед виходом.
Порівняння чисел і наступний перехід до іншого коду залежно від їхнього значення називається розгалуженням. Розгалуження є ключовим компонентом розробки складних програм, які можуть реагувати на різні вхідні дані. Наприклад, у грі часто є розгалуження для кожного напрямку, у якому гравець може рухатися.
По суті, процесори є схемами. У колах або протікає електрика (увімкнено), або немає (вимкнено). Ці два стани можуть бути представлені двійковою системою числення (або основою 2). У системі з основою 2 у вас є два можливих значення: 0 і 1. Прикладом двійкового числа є 1101.
Ми знайомі з десятковою системою числення (чи з основою 10), яка має 10 можливих значень: 0, 1, 2, 3, 4, 5, 6, 7, 8 і 9. Прикладом десяткового числа є 126. Це число можна представити в більш явному форматі як:
Ми можемо представити двійкове число вище (1101) у тому ж форматі. Однак ми замінимо 10 на 2, оскільки ми переходимо від системи з базою 10 до системи з базою 2:
Двійкові числа можуть швидко стати громіздкими, коли їм потрібно представити більші значення. Наприклад, двійкове представлення десяткового числа 250 дорівнює 11111010.
Для представлення цих більших двійкових чисел в обчислювальній техніці зазвичай використовуються шістнадцяткові числа (з основою 16). Шістнадцяткові числа зазвичай мають префікс ідентифікатора 0x
та мають шістнадцять можливих значень: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E та F. Приклад шістнадцяткового числа номер є 0xA1D
.
Інструкції представлені у вигляді чисел, як і всі інші дані на комп’ютері. Ці числа відомі як коди операцій, часто скорочені до кодів операцій. Коди операцій залежать від архітектури. ЦП знає кожен опкод і що йому потрібно робити, коли він зустрічає кожен з них. Коди операцій зазвичай представлені в шістнадцятковому форматі. Наприклад, якщо процесор Intel зустрічає 0xE9
, він знає, що йому потрібно виконати інструкцію jmp (перехід).
Ранні комп’ютери вимагали написання програм у кодах операцій. Це, очевидно, важко зробити, особливо для складніших програм. Потім були прийняті варіанти мови асемблера, які дозволяли писати інструкції. Вони схожі на приклади, які ми написали вище. Мову асемблера легше читати, ніж просто коди операцій, але на ній все ще важко розробляти складні програми.
Щоб покращити досвід розробки, було розроблено кілька мов вищого рівня, таких як FORTRAN, C та C++. Ці мови легко читати та містять такі операції керування потоком, як if і else * умови. Наприклад, нижче наведено нашу програму збільшення/зменшення в C. У C int відноситься до цілого чи цілого числа (-1, 0, 1 або 2 є прикладами).
int add(int input) { return input + 1; } int subtract(int input) { return input - 1; } if(operation == '-') { subtract(number); } else { add(number); }
Усі ці мови вищого рівня скомпільовані до асемблера. Потім традиційний асемблер перетворює цю збірку на коди операцій, які ЦП може зрозуміти.
Написання програм для зв’язку з обладнанням – трудомісткий і складний процес. Щоб виконати нашу програму збільшення/зменшення, нам також довелося б написати код для обробки натискань клавіш з клавіатури, відображення графіки на моніторі, створення наборів символів, щоб ми могли представляти літери та цифри, і спілкуватися з оперативною пам’яттю та жорстким диском. . Щоб було легше розробляти програми, були створені операційні системи. Вони містять код, який уже може обробляти ці апаратні функції. Вони також мають кілька стандартних функцій, які зазвичай використовуються, наприклад копіювання даних з одного місця в інше.
Три основні операційні системи, які все ще використовуються сьогодні, це Windows, Linux і MacOS. Усі вони мають різні бібліотеки та методи зв’язку з обладнанням. Ось чому програми, написані для Windows, не працюють у Linux.
Операційним системам потрібен спосіб визначити, як обробляти дані, коли користувач вибирає їх. Якщо дані є фотографією, операційна система хоче відкрити певну програму (наприклад, Paint) для перегляду фотографії. Подібним чином, якщо дані є самою програмою, операційна система повинна передати їх ЦП для виконання.
Кожна операційна система обробляє виконання унікальним чином. У Linux для звичайного файлу встановлюється спеціальний дозвіл на виконання. У Windows програми відформатовані особливим способом, який Windows знає, як аналізувати. Це називається форматом PE, або Portable Executable. Формат PE має кілька розділів, наприклад розділ .text для зберігання програмного коду та розділ .data для зберігання змінних.
Покінчивши з усім цим, ми нарешті можемо обговорити ігри. Ігри – це просто програми. У Windows вони відформатовані у форматі PE, ідентичному будь-якій іншій програмі. Вони містять розділ .text , який містить код програми, що складається з кодів операцій. Потім ці коди операцій виконуються ЦП, а операційна система відображає результуючу графіку та обробляє введення, наприклад натискання клавіш.