Компьютер — это просто. Или нет?


Любой человек, интересующийся сферой информационных технологий, хоть раз задумывался о том, как на самом деле работает компьютер. А и действительно, с помощью компьютера можно сделать столько всего удивительного, что невозможно поверить, что всё, что происходит внутри него, — сложение чисел. Почему бы тогда не сделать свой самому?

image

Эта мысль явно прослеживается в книге Чарльза Петцольда «Код» — хорошее чтиво для тех, кто хочет разобраться в устройстве компьютера на пальцах не тратя особо времени. Эта книга произвела сильное впечатление на меня, да так, что я решил, что компьютер и вовсе банально простой агрегат и ничего сложного в нём нет.

Но это не так. После прочтения у меня всё-таки поселилось ощущение того, что от меня что-то сокрыто, что какие-то аспекты архитектуры вовсе не затрагивались. За бо?льшими объёмами информации я обратился к следующей книге — «Архитектура Компьютера» Эндрю Таненбаума. Информация в этой книге оказалась гораздо обширнее, однако я получил не совсем то, чего хотел.

На этом мой путь в мире архитектуры ЭВМ приостановился, началась учёба, я отвлёкся на другие, более интересные для меня на тот момент проекты. Но, к сожалению, я из тех людей, которые не могут без угрызений совести пользоваться чем-либо, не зная хотя бы примерно механизма работы этого инструмента. Это заставляло меня искать материал буквально обо всём.

Череда разочарований наступила после прочтения нескольких глав книг об игровых движках, компиляторах, операционных системах и пр. Я просто растерялся: мир, который казался мне логичным и в меру простым в миг стал огромным и запутанным, требующим внушительных объёмов знаний.

Начало великого пути


То, что спасло меня, был ответ одного пользователя на каком-то форуме на пост человека, страдавшего похожим «расстройством», мир IT казался ему таким огромным, что его точно нельзя постичь. Я помню те слова, и они меня выручают каждый раз, когда я сталкиваюсь с чем-то новым. «Do not let yourself get overwhelmed» — то, что стоит говорить каждому новичку в IT.

И тогда я начал с новыми силами бороздить просторы интернета в поисках литературы. Мне очень повезло, что я наткнулся на замечательную книгу «The Elements of Computing Systems. Building a Modern Computer from First Principles» by Noam Nisan and Shimon Schocken(нет русского издания). В ней именно для таких, как я показывают создание реально работающего компьютера с нуля, то есть из логических вентилей.

Я загорелся идеей и приступил к работе. Начал с того, что когда-то уже делал после прочтения Петцольда, — сумматоры, регистры, мультиплексоры. Это одни из самых простых устройств, работу которых вовсе не сложно понять (если не думать об эффективности), а сделать такие можно за 10 минут в удобном приложении на вашем смартфоне.

Каждую следующую главу я начинал с жаждой знаний. Сконструировал АЛУ, руководясь заданиями в книге. Не могу сказать, что что-то в нём придумал я, скорее мне дали готовые детальки, а я их собрал в красивую машину. Зато какое удовольствие я получил, когда понял, что я своими руками собрал полностью работающее АЛУ.

Схема платы АЛУ, выполненная в программе BOOLR
image

Первые плоды


За ним последовал полностью работающий 16-битный процессор, который я доделал сегодня. Моему счастью нет предела, но я не собираюсь останавливаться. К моему сожалению, хоть в книге весь процессор и был собран полностью с нуля, но ассемблер для него был абстракцией в следующей главе(что логично, книга расчитана на более-мение краткое, хоть и детальное изложение). Немного погрустив, я понял, что Ассембли — тоже язык программирования, и создание полноценного Ассемблера с нуля займёт много времени.

Схема готового процессора. Большое чёрное пятно - то самое АЛУ
image

Об ассемблере в книге
На самом деле эта тема в книге не была полностью опущена. Там говорится о том, что ассемблер можно написать, используя любой высокоуровневый язык программирования. Меня как слабоумного и отважного такой вариант не сильно устраивает, я хочу всё сделать своими ручками используя тот процессор, который у меня есть. И да, я понимаю, что потеряю много времени, но я получу от этого удовольствие, я уверен.

Написать свой Ассемблер — амбициозная цель, но это не единственная сложность. Путь, который я выбрал, обещает быть непростым. Регистры и в целом память в программе BOOLR можно реализовать только используя логические вентили. Почему это проблема? Всё просто: ничтожные 1024 байт RAM десятки раз рекурсивно пытаются поселить в оперативной памяти моего компьютера свои составные 16-битные регистры. Вот, что из этого получается:

Скриншот из списка процессов Дичпетчера Задач

В общем говоря, иногда проект просто не открывается из-за нехватки оперативной памяти. Выглядит как тупик, но я не намерен останавливаться на этом.