Машина на глиняних ногах
6 / 18

Розділ 5. Спадок 1978-го (x86)

Гонка, у яку Intel ув’язалась випадково

У 1976 році Intel була успішною компанією — але не лідером. Її головним продуктом були мікросхеми пам’яті (DRAM, EPROM), а не процесори. Процесорний бізнес сприймався як побічний — щось маленьке, не дуже прибуткове, у чому компанію випереджав конкурент Zilog, заснований колишніми інженерами Intel.

Zilog Z80, випущений у 1976-му, був покращеною копією Intel 8080. Він міг виконувати код 8080 і додавав власні корисні розширення. Він став хітом — на ньому працювали комп’ютери Sinclair ZX Spectrum, TRS-80, MSX, Amstrad CPC, безліч ігрових автоматів. Intel дивилася і скрипіла зубами.

Тоді ж у Intel було два процесорні проекти. Один великий, амбітний, із новою архітектурою — iAPX 432 (його ще називали “8800”). Другий — невеликий, тимчасовий, “поки 432 не вийде”. Невеликий проект очолював інженер на ім’я Стівен Морс.

Морсу дали всього десять тижнів, щоб спроектувати новий процесор, який утримав би клієнтів від переходу на Zilog. Десять тижнів. Один проектувальник — він сам. Без готової архітектури — її треба було вигадати на ходу.

Морс зробив, що міг. Він узяв архітектуру 8080, розширив регістри з 8 біт до 16, додав сегментацію пам’яті (щоб адресувати до 1 мегабайта замість 64 кілобайт), додав кілька нових інструкцій. Все мало бути сумісне з 8080 на рівні асемблерного коду — програміст міг переписати свою стару програму з мінімальними змінами.

Цей процесор отримав назву 8086. Випустили в червні 1978-го.

Це і був первородний гріх. Процесор, спроектований одним інженером за десять тижнів як тимчасова заглушка, став основою всієї індустрії на наступні півстоліття. Великий, “правильний” iAPX 432 — який мав замінити 8086 — провалився катастрофічно: був занадто складний, занадто повільний, занадто пізно. Вийшов у 1981-му, помер у 1986-му.

А 8086 — лишився. Лишився назавжди.

Як IBM випадково створила монополію

У 1980 році в IBM сталася внутрішня революція. Великі мейнфрейми приносили основні гроші, але швидко зростав ринок персональних комп’ютерів — Apple II, Atari 800, TRS-80. IBM вирішила швидко зробити свій. Зібрала маленьку команду в містечку Бока-Ратон у Флориді і дала їй карт-бланш: зробіть PC за рік, використовуйте готові компоненти.

Команда мала вибрати процесор. Кандидати: - Motorola 68000 — потужніший, чистіший, гарно спроектований 32-бітний процесор. На ньому згодом побудували Macintosh, Amiga, Atari ST, Sega Genesis. - Intel 8086 — слабший, з некрасивою сегментованою архітектурою. Але вже на ринку, з готовою екосистемою (Zilog зробив 8086 модним).

IBM обрала 8088 — здешевлений варіант 8086 із 8-бітною шиною даних (щоб використовувати дешевшу обв’язку). Чому? Кілька причин: - Intel була охоча співпрацювати. Motorola — менше. - 8088 був трохи дешевший. - Intel забезпечувала другого виробника (AMD на той момент, якій Intel ліцензувала виробництво). IBM хотіла мати запасного постачальника.

Це був випадковий вибір. Ніхто в IBM не передбачав, що IBM PC стане стандартом. Більшість сподівалася продати кілька десятків тисяч штук.

Продали мільйони. До 1985-го — мільярди доларів виручки. До кінця 80-х — IBM PC і його клони (від Compaq, Dell, HP) витіснили майже всіх альтернативних виробників. Apple вижила лише в одній ніші. Amiga, Atari, Acorn — повимирали.

А вибір процесора, зроблений мимохіть, став архітектурою всього світу.

Що було не так із 8086

Оглянемося на 8086 з висоти 2024-го. Це досить страшний процесор.

Сегментована пам’ять. Замість одного великого адресного простору, 8086 ділив пам’ять на сегменти по 64 КБ. Щоб вказати на байт у пам’яті, треба було знати сегмент і зміщення в сегменті. Програмісти C мали тип покажчика “near” (16 біт, тільки в межах поточного сегмента) і “far” (32 біти, з номером сегмента). Це здавалося гнучким на той час, а виявилося пеклом, бо 64 КБ — це дуже мало, і програмам постійно треба було перемикати сегменти.

Спеціалізовані регістри. На відміну від чистої RISC-архітектури, де всі регістри взаємозамінні, 8086 мав AX, BX, CX, DX, SI, DI, BP, SP — і кожен мав свою спеціальність. CX — для лічильника циклів. DX — для введення-виведення. SI/DI — для рядкових операцій. Хочеш зробити щось не за призначенням — пиши спеціальний код. Це жахливо неоптимально.

BCD-інструкції. Серйозно. 8086 мав вбудовані інструкції двійково-десяткової арифметики (DAA, DAS, AAA, AAM, AAD, AAS) — для обробки чисел, де кожна десяткова цифра окремо кодувалась у чотирьох бітах. Це було потрібно банкам у 1970-х. Сьогодні — нікому. Але інструкції ці є в кожному Intel і AMD досі.

Адресація з косими модифікаторами. Інструкція могла містити префікси — REP, LOCK, SEG — які модифікували поведінку. Декодер мусив усе це розбирати.

Змінна довжина інструкцій. На відміну від RISC, де кожна інструкція рівно 4 байти, інструкція x86 може бути від 1 до 15 байтів. Це жахливо для декодування — щоб знати, де закінчується інструкція, треба прочитати її повністю, а щоб прочитати наступну — закінчити цю.

Усе це разом — катастрофа з точки зору чистої комп’ютерної науки. Але це було те, що запам’ятав і чим почав користуватися увесь світ.

Один доміно — і не скинеш

Інженери Intel чудово розуміли проблеми 8086. У 1985 році вийшов 80386 — революційний процесор, який додавав 32-бітну архітектуру, віртуальну пам’ять, “плаский” режим (без сегментів), захищений режим. Геніальна робота. Але — 80386 продовжував повністю підтримувати все старе: 16-бітний режим, сегменти, BCD-інструкції, навіть так званий “real mode”, у якому процесор поводився саме як 8086 з 1978-го.

Чому? Бо світ був повний коду, написаного для 8086. MS-DOS. Lotus 1-2-3. WordPerfect. Тисячі програм. Якби 386 не міг їх запускати — ніхто б його не купив.

І так почалася традиція. Кожне нове покоління процесорів x86 додавало нові можливості, але не прибирало старі. У 80486 додали кеш на чіпі. У Pentium — суперскалярність (виконання двох інструкцій за такт). У Pentium Pro — out-of-order. У Pentium MMX — векторні розширення MMX. Потім SSE, SSE2, SSE3, SSE4. Потім AVX, AVX2, AVX-512. Потім AES, BMI, RTM, MPX, SGX, CET, AMX…

До 2024 року в наборі x86 — близько 1500 окремих інструкцій. Для порівняння, у класичного RISC-процесора (наприклад, MIPS) було близько 60.

Сучасний Intel чи AMD — це фактично процесор всередині процесора. Зовні він приймає x86 і видає виконання. Всередині — спеціальний блок під назвою декодер перекладає x86-інструкції у внутрішні мікрооперації (micro-ops, або μops), а потім уже власне ядро (RISC-подібне) виконує ці мікрооперації.

Декодер — це податок на сумісність. У сучасному Intel чи AMD він займає мільйони транзисторів. Гріє. Споживає енергію. Сповільнює. Усе тільки для того, щоб ти міг запустити DOS-гру 1990-го року.

Італійська війна Intel: Itanium

У 1990-х Intel зрозуміла, що x86 — глухий кут. Архітектура занадто стара, занадто складна, не масштабується. У 1994-му Intel домовляється з HP про спільну розробку нової архітектури, яка замінить x86. Назва: IA-64, або Itanium.

Itanium був радикально іншим. Він використовував концепцію під назвою VLIW (Very Long Instruction Word) — інструкції упаковуються по три в один пакет, і компілятор сам вирішує, які інструкції виконуються паралельно. Ідея: винести складність із заліза в програмне забезпечення. Потужно. Чисто. Сучасно.

Випустили в 2001-му. Провалився.

Чому? По-перше, компілятори не змогли впоратись із завданням. Виявилось, що автоматично знаходити паралелізм у коді набагато важче, ніж думали архітектори. Itanium-чіпи на практиці працювали повільніше, ніж аналогічні x86.

По-друге, проблема сумісності повернулася. Itanium міг запускати x86-код тільки через емуляцію — і робив це жахливо повільно. Покупці серверів подивилися: “У нас тисячі x86-програм. Для чого нам процесор, який гірше їх запускає?”.

По-третє — і ось тут починається смішне — AMD скористалася моментом. У 2003-му AMD випустила процесор Opteron на власній архітектурі AMD64 (також відома як x86-64). Ця архітектура була простим розширенням x86 до 64-бітів. Не нова, чиста, ідеальна — а просто x86 із ще одним шаром бруду згори. Але вона повністю сумісна зі старим кодом, легка для портування, і її було просто впровадити.

Покупці прокинулися: можна мати 64-біти і не жертвувати сумісністю. Itanium провалився остаточно. Microsoft вирішила, що Windows на 64 біти буде на AMD64, не на Itanium. Intel пообіцяла довічну підтримку Itanium і тихо зникла з нього (останній Itanium вийшов у 2017-му, остаточно знятий у 2021-му).

Принизливим було те, що Intel мусила ліцензувати AMD64 у AMD. Свої власні 64-бітні чіпи Intel випустила тільки після AMD, і їхня архітектура — це AMD64 з трохи іншою назвою (Intel називає її Intel 64, EM64T, або просто x86-64).

Цей епізод — найкраща ілюстрація того, як сумісність перемагає чистоту. Чисто спроектована архітектура (Itanium) програла потворно розрослій (x86-64) тільки тому, що остання могла запустити стару Windows.

Що x86 нам дало і чим заплатило

З одного боку — x86 створила багатство і функціональність. Уся персональна обчислювальна техніка, увесь Windows-світ, увесь Linux на десктопах і серверах, ігри, інтернет, хмарні сервіси перших двох десятиліть 2000-х — це все на x86.

З іншого боку — ось ціна:

Складність. Сучасний процесор Intel або AMD — це 10-15 мільярдів транзисторів. Серед них значна частина — це декодер x86, апаратура, що підтримує старі режими, мікрокод-блоки, які реалізують рідко використовувані інструкції. Усе це гріє і споживає енергію.

Енергоспоживання. Тривалий час x86-процесори споживали 65-150 Вт у настільних варіантах і 15-45 Вт у ноутбукових. Водночас ARM-процесори у телефонах робили подібну роботу при 3-5 Вт.

Безпекові вразливості. У 2018 році світ дізнався про Spectre і Meltdown — фундаментальні дірки у безпеці майже всіх сучасних процесорів. Ці дірки виникли через те, що для досягнення високої швидкості процесори робили спекулятивне виконання — виконували інструкції наперед, угадуючи, куди піде програма. І ця спекуляція залишала сліди в кеші, які можна було прочитати з іншої програми. Уразливими були практично всі x86-чіпи останніх 20 років. Виправлення зменшили продуктивність на 5-30% на різних задачах. Це був прямий наслідок того, що архітектура не дозволяла зробити простіше.

Залежність від двох виробників. Сьогодні x86 виробляють тільки Intel і AMD. Решта компаній (Cyrix, VIA, Transmeta, Centaur) або вмерли, або були поглинуті. Це найменша конкуренція в історії процесорної індустрії.

Початок кінця

З 2010-х x86 почав поступово втрачати територію.

Apple Silicon (2020). Apple у 2020 році перейшла з Intel на власні ARM-процесори в Mac. Apple M1 показав те, що інженери підозрювали роками: на тому самому завданні ARM-процесор може бути швидшим і споживати в 3-5 разів менше енергії. Розкішні Mac Mini охолоджували пасивно — без вентилятора. Це був шок для індустрії.

Хмара. Amazon у 2018-му запустила свої власні Graviton ARM-процесори для AWS. Економія: 20-40% на ту саму продуктивність. Сьогодні значна частина AWS уже на Graviton. Microsoft Azure теж розробляє свої ARM-чіпи. Google теж.

RISC-V. Це ще цікавіше. RISC-V — повністю відкрита (без роялті) архітектура, розроблена в Berkeley у 2010 році. Вона простіша, чистіша, сучасніша за все, що було досі. Китай, Індія, Європа активно інвестують у RISC-V як спосіб уникнути залежності від США і Великобританії (де базується ARM Holdings). До 2024 року вже існують RISC-V-чіпи в смартфонах, серверах, embedded-пристроях. Зростання експоненційне.

x86 не помре завтра. Але починає видніти горизонт. 30 років неподільного панування на десктопах і серверах підходить до кінця.

Що з цього винести

  1. x86 — архітектура, спроектована за 10 тижнів одним інженером у 1978-му як тимчасова заглушка. Вона не повинна була домінувати в індустрії.
  2. Сумісність — найсильніша сила в обчислювальній техніці. Раз закладений код переживає десятиліття. Архітектура, яка його запускає, переживає теж.
  3. Усі сучасні x86-процесори — це RISC-ядра з декодером x86 поверх них. Старі інструкції живі лише номінально.
  4. Спроби прибрати x86 (Itanium) провалилися. Спроби обійти його збоку (ARM, RISC-V) — успішні.
  5. Уся ця складність має ціну: тепло, енергія, безпекові дірки, складність розробки. Spectre/Meltdown — не аномалія, а наслідок.
  6. x86 не зникне швидко. Але 2020-ті — перше десятиліття за 40 років, коли x86 не лідер. ARM у мобільному — давно. ARM у десктопі (Mac) — є. ARM у хмарі — росте. RISC-V на горизонті.

У наступному розділі — історія тих самих ARM-чіпів. Це історія повстання маленької англійської компанії проти американського гіганта. Історія про те, як 12 інженерів у Кембриджі спроектували процесор настільки простий і енергоефективний, що він випадково став основою кишенькової революції 2000-х і повторно прийшов руйнувати десктопний ринок 2020-х.

Цю історію можна було б назвати “помста простоти”.