Вы всю жизнь слышали, что «компьютеры понимают только единицы и нули», но могли спросить себя: «Ну как же они делают так много вещей, используя только единицы и нули?». И никто не очень хорошо объяснил, что, ну, этот курс делает это!

История

У меня был тяжелый период, я был не очень продуктивным около полутора месяцев и не мог мотивировать себя сделать что-то действительно полезное. Дерьмо действительно поразило фаната, когда отношения закончились. Мне очень нужно было что-то, чтобы стимулировать мой разум, иначе я бы впал в депрессию. Поэтому я удалил приложение Instagram и пообещал себе, что не буду скачивать его обратно, пока не пройду этот курс!

Как я узнал об этом курсе?

Я узнал об этом курсе в двух разных местах.

Сначала его порекомендовал инженер Массачусетского технологического института Грег Прайс в обсуждении Zulip.

Второй увидел на этом сайте — https://teachyourselfcs.com/

Я подумал, какого черта, только возьми!

Путешествие

Боже мой, мне понравился этот курс. Вы не поверите, как просто вы перейдете от элементарного элемента Nand к созданию компьютера общего назначения!

Курс начинается с этого мема:

«Шаг за шагом» — основная тема этого курса. Вот как выглядит каждый шаг:

(Осторожно, жаргон!)

Неделя 1 — Используя ворота Nand, мы строим другие ворота:

Не, И, Или, Xor, Mux, DMux.

16-битные варианты — Not16, And16, Or16, Mux16.

Еще — Or8Way, Mux4Way16, Mux8Way16, DMux4Way, DMux8Way («nWay» означает, что гейт принимает n входов).

Неделя 2. Используя вышеуказанные ворота, мы делаем следующее:

HalfAdder, FullAdder, Incrementor и, наконец, арифметико-логическое устройство! (Прошла 2 неделя, и вы только что сделали чёртово сердце компьютера!)

Спецификация АЛУ уже дана, т.е. она уже спроектирована под нужды нашей системы — какие входы она будет принимать, какие вычисления на каких входах выполнять. Наша задача — просто соединить ворота вместе, следуя спецификации. И они не слишком углубляются в дизайн ALU. Но чтобы уложиться в этот амбициозный курс всего за 6 недель, я думаю, мы сможем понять, если они не будут слишком углубляться в некоторые детали.

Правильно, идем дальше…

Неделя 3 — последовательная логика.

Итак, в предыдущие недели вся логика происходила мгновенно, но теперь мы хотели сделать что-то, что запоминает «состояние» нашей системы, то есть что-то, что может хранить некоторые значения.

Нас знакомят с еще одной элементарной микросхемой "Флип-флоп", как ее делать не учат (она сделана из элементов Нанд и часов), и, честно говоря, я был не против, что не научили что.

Проект на эту неделю тоже был интересным, смотрите, как все прошло -

Given => Flip-Flop (сохраняет бит за единицу времени)

Из флип-флопа мы сделали 1-битный регистр.

Из этого мы сделали 16-битный регистр. (слово длина нашего процессора равно 16).

Из этого мы сделали оперативную память различных размеров.

Неделя 4 — Машинный язык.

Эта неделя была менее ориентирована на концепцию и больше сосредоточена на спецификации компьютера Hack. Нас учили, как наш компьютер интерпретирует 16-битную двоичную инструкцию, которая выглядит так — «1110111001110» и делает что-то полезное. Нас также научили писать программы на языке Hack Assembly, что мне очень понравилось!

Вы можете спросить, если мы еще не построили компьютер, то почему же мы делаем программы?

Неделя 5 — Архитектура компьютера.

И вот мы снова возимся с воротами и проводами. На этой неделе мы, наконец, объединим все наши микросхемы и создадим компьютер общего назначения, способный запускать любую программу на машинном языке! Вы делаете процессор, заканчиваете оперативную память и объединяете все это вместе, чтобы сделать наш компьютер! Вот как выглядела схема нашего процессора:

Сумасшедшие вещи, верно? Выглядит сложно, но вы не представляете, как это приятно, когда понимаешь, как это работает, и делаешь своими руками.

Неделя 6 — Ассемблер.

Мы закончили с созданием нашего компьютера, теперь он может запускать любую двоичную программу, которая придет вам в голову (он может даже играть в такие игры, как понг). Но, как оказалось, написание программ в двоичном формате — не очень простая задача. Таким образом, проект этой недели состоит в том, чтобы создать ассемблер с использованием языка более высокого уровня, такого как Python/Java, который принимает в качестве входных данных файл с кодом ассемблера и выводит файл, заполненный двоичными инструкциями, которые мы затем передаем нашему компьютеру для взлома.

woooshhh, это было полным глотком, но это было все содержание Nand-To-Tetris часть 1. Здесь мы сделали наш собственный компьютер, который может запускать любую двоичную программу, которая приходит на ум.

Также есть вторая часть курса — Nand-To-Tetris, часть 2. Она начинается с нашего компьютера и создает виртуальную машину, компилятор, операционную систему и некоторые другие классные вещи. По сути, этот курс строит программный уровень поверх аппаратного уровня, который мы создали в этом курсе.

Собираюсь ли я принять это?

Нет, как бы я ни хотел, следующая часть потребует в два раза больше времени для завершения, у меня его сейчас нет, но если у меня когда-нибудь будет шанс в будущем, я обязательно им воспользуюсь!

Заключение:

Если вы изучаете информатику или разрабатываете программное обеспечение, я настоятельно рекомендую пройти этот курс, так как он покажет вам, как на самом деле работают компьютеры внутри, и в отличие от скучного обучения в колледже, этот курс очень практичен и учит, позволяя ты пачкаешь руки.

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

Было действительно эпично снова загрузить приложение Instagram во время перечисления этой песни: