Вы всю жизнь слышали, что «компьютеры понимают только единицы и нули», но могли спросить себя: «Ну как же они делают так много вещей, используя только единицы и нули?». И никто не очень хорошо объяснил, что, ну, этот курс делает это!
История
У меня был тяжелый период, я был не очень продуктивным около полутора месяцев и не мог мотивировать себя сделать что-то действительно полезное. Дерьмо действительно поразило фаната, когда отношения закончились. Мне очень нужно было что-то, чтобы стимулировать мой разум, иначе я бы впал в депрессию. Поэтому я удалил приложение 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 во время перечисления этой песни: