Недавно я закончил первую часть курса nand2tetris на Coursera, также известного как Сборка современного компьютера с первых принципов: от Nand до Tetris. Некоторое время назад я открыл для себя книгу Элементы вычислительных систем, но с тех пор она томилась где-то далеко не в самом верху моего списка чтения и дел, со смутным представлением это то, что я действительно хотел бы сделать один раз. день". Когда я увидел, что в моих рекомендациях Coursera появился 6-недельный курс с гидом, это был именно тот толчок, который мне был нужен, чтобы, наконец, выбрать его. Я записался на месте.

Первая часть курса посвящена созданию функционального компьютера, начиная с Nand-gates и Flip-Flops — полупроводниковых гаек и болтов современной электроники. Не волнуйтесь, для выполнения еженедельных заданий не требуется пайки! Схемы и микросхемы разрабатываются с использованием простого языка описания оборудования и проверяются с помощью прилагаемого симулятора. Есть несколько кратких замечаний о лежащей в основе физике и электронной инженерии, которая используется для реализации основных строительных блоков, но это курс о вычислениях. Все, что вам нужно, это простой текстовый редактор и немного времени. (Предоставляемый инструментарий построен на Java и работает на ПК/Mac/Linux.) Курс завершается разработкой простого ассемблера, способного преобразовывать (относительно) удобочитаемые инструкции низкого уровня в машинный код.

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

Если вы строитель в душе, то вам доставляет огромное удовольствие разрабатывать все это самостоятельно и видеть, как части подходят и взаимодействуют друг с другом. Но более того, для тех из нас, кто работает намного выше в стеке программного обеспечения, это развитие механической симпатии к тому, что лежит за компонентами высокого уровня, на которых мы сосредоточены большую часть времени. Это мнение, широко приписываемое сэру Джеки Стюарту, заключается в том, что гонщики должны иметь разумное представление о механике своих автомобилей и действующих силах, чтобы иметь возможность эффективно добиваться наилучших результатов в течение всей гонки. Мартин Томпсон уже некоторое время популяризирует эту же идею в контексте разработки программного обеспечения. Лично я считаю, что это самое большое преимущество завершения проектов.

// Assembly listing: computes R0 = 2 + 3
@2
D=A
@3
D=D+A
@0
M=D

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