1. Какие устройства можно программировать?
![](https://img.golos.io/proxy/https://i.imgur.com/bzY9uxY.jpg)
Икс: Дорогие друзья, пока профессор работает над выбором языка программирования, я хотел бы поделиться с вами информацией о том, какие устройства вообще можно программировать.
Как вам хорошо известно из знаменитой «Энциклопедии профессора Фортрана», за выполнение программ в компьютере отвечает центральное процессорное устройство, т.е. ЦПУ. Причем в силу того, что на рынке микро- и нанотехнологий доминирует такая страна как США и английский язык, аббревиатура ЦПУ редко используется даже в русскоязычной литературе, поэтому будем называть ЦПУ, как CPU (central processing unit).
CPU является микросхемой призванной выполнять машинные команды компьютерных программ, которые пишут подавляющее большинство программистов на подавляющем большинстве языков программирования, таких C/C++, PHP, Java, Python и др. На картинке ниже представлены микросхемы (чипы) CPU от двух гигантов этой индустрии, а именно Intel и AMD.
![](https://img.golos.io/proxy/https://i.imgur.com/6tk7o01.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/xQ0y4oZ.jpg)
Смотря на эти картинки нужно понимать, что мы видим лишь корпус чипа и его ножки, а сам чип находится внутри корпуса, где он надежно защищен от грязи, пыли и механических повреждений.
![](https://img.golos.io/proxy/https://i.imgur.com/PJgKvy7.jpg)
Воробей: Спасибо, конечно, за информацию, но я итак это знал. Неужели за 20 лет ничего не изменилось? CPU я хоть одним левым могу запрограммировать? Если это все, то я полетел…
![](https://img.golos.io/proxy/https://i.imgur.com/gLYvUu5.jpg)
Икс: Да, подожди ты, я только начал, сейчас мы подходим к самому интересному. Так вот, архитектура CPU долгое время развивалась по пути последовательного выполнения сложных программ. Наращивалась частота ядра CPU, чтобы выполнять эти программы все быстрее и быстрее, а многозадачность реализовывалась путем переключения ресурсов процессора с одной задачи на другую. Такая многозадачность по сути является лишь имитацией многозадачности и только сейчас стали производиться CPU с несколькими ядрами и реальной многозадачностью.
В это же самое время были архитекторы, которые занимались решением принципиально других задач, требующих параллельных вычислений без всякой имитации этого процесса. Это были архитекторы графических процессоров GPU (graphics processing unit). Почему же им так важна была многозадачность и, соответственно, почему их процессоры принципиально должны были быть многоядерными? Все дело в том, что в отличие от CPU, GPU должны решать простые задачи, но решать их параллельно. Для графики важно уметь одновременно вычислить цвет каждого пикселя на экране. В силу того, что разрешение современных экраном составляет миллионы пикселей (например, разрешение моего экрана 1’920 x 1’080, что не много не мало, а 2’073’600 пикселей), в идеале число ядер GPU тоже должно стремиться к этой величине. Пока эта планка не взята, но современные видеокарты могут поставляться с GPU, у которых число ядер составляет несколько тысяч штук. При этом задачи, которыми должны заниматься ядра GPU изначально были узкоспециализированными и связанными исключительно с графикой, так называемый рендеринг, без которого невозможно было бы играть в современные компьютерные игры. Однако со временем функционал ядер GPU стали развивать и в настоящее время на них можно программировать совершенно разные задачи, в первую очереди те, которые по своей сути подразумевают распараллеливание, например подбор пароля методом грубой силы (bruteforce) или майнинг криптовалюты. Ниже представлены чипы GPU от гигантов этой индустрии «зеленых», т.е. NVIDIA, и «красных», т.е. AMD (ранее ATI).
![](https://img.golos.io/proxy/https://i.imgur.com/BRtHeRM.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/iaHCWY9.jpg)
И хотя именно CPU принято называть мозгом компьютера, лично мое мнение, что по архитектуре именно GPU ближе к архитектуре мозга человека, в котором нейроны работают преимущественно параллельно, поэтому я считаю очень важным разобраться в методах программирования GPU (видеокарт) на таких языках как OpenCL и CUDA.
Кроме того, за прошедшие 20 лет произошли еще 2 революции. Это появление микроконтроллеров и программируемых логических интегральных схем (ПЛИСов). Начнем с микроконтроллеров и рассмотрим, что же это такое и почему оно имеет отношение к теме нашего разговора.
Для начала вспомним, как же работает CPU и что ему требуется для этой работы. А для работы CPU требуется:
Оперативная память, т.е RAM (random access memory), из которой CPU забирает код программы и ее данные. Планки этой памяти выглядят примерно так:
Жесткий диск HDD, SSD или просто флешка, т.е. ROM (read-only memory). Это память из которой код программы и ее данные поступают в RAM прежде, чем попасть на разделочный стол для CPU.
Материнская плата с ее портами ввода/вывода для работы с информацией из внешнего мира. Материнская плата содержит чипсет, который представляет собой каналы связи между всеми упомянутыми выше компонентами.
Теперь, когда мы это вспомнили, легко ответить на вопрос, что же такое микроконтроллер. Микроконтроллер – это все вышеперечисленное, но расположенное на одной микросхеме, т.е. это чип, вбирающий в себя функционал не только CPU, но и целого компьютера. Разумеется, мощности данных чипов не высоки по сравнению с обычным компьютером, но в этом направлении идет активное развитие. Выглядят эти крошки вот так и некоторые из них могут умещаться на кончике пальца (ниже представлены чипы ATmel):
![](https://img.golos.io/proxy/https://i.imgur.com/PLY9p2e.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/x7HDJDf.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/p75nHTK.jpg)
Воробей: Икс, а как же их программировать? С CPU и GPU все понятно: запустил компьютер, дождался завершения загрузки операционной системы, запустил среду разработки и все, дальше все зависит от тебя. А как запустить ЭТО? Куда его воткнуть, где здесь клавиатура, монитор, мышка в конце концов?
![](https://img.golos.io/proxy/https://i.imgur.com/i79YOMT.jpg)
Гусеница: А я знаю, я читала об этом. Для микроконтроллеров есть специальные отладочные платы, в которые впаивается или вставляется сам микроконтроллер и которые можно подключить к обычному компьютеру через порт USB. При этом на компьютер ставится специальная программа, которая позволяет не только писать код для микроконтроллеров, но и через USB сохранять этот код в памяти чипа микроконтроллера. После чего этот код начнет выполняться. Например, в простейшем случае на этой плате кроме микроконтроллера могут быть впаяны кнопка, соединенная с одной из ножек ввода данных в микроконтроллер, и светодиод, подсоединенный к ножке вывода микроконтроллера. Тогда можно написать программу, чтобы при нажатии кнопки, микроконтроллер заставил светодиод мигать азбукой Морзе и выдавать сигнал SOS.
![](https://img.golos.io/proxy/https://i.imgur.com/DbO8wE9.jpg)
Икс: Верно, например, сейчас очень распространены такие платы, как Arduino с микроконтроллерами ATmel. По сути Arduino состоит из 2-х частей: программная и аппаратная. Программная часть – это программная оболочка (IDE), о которой сказала Гусеница, для написания программ, их компиляции и прошивки кода в аппаратную часть. Аппаратная часть это сам микроконтроллер со всей обвязкой, т.е. с кнопочками, лампочками и множеством дополнительных плат разного функционала, выполняющих совершенно разные функции в связке с микроконтроллером. Такие платы могут поставляться как самими производителями плат Arduino, так и сторонними разработчиками.
Кроме того, те кто дружит с паяльником, могут делать такие дополнительные платы сами.
Вот посмотрите на одну из плат Arduino. У нее есть порт USB для связи с компьютером, на ней установлен микроконтроллер, а кроме того, есть куча дополнительных штырьков и разъемов для подсоединения всевозможных дополнительных плат и устройств ввода/вывода.
![](https://img.golos.io/proxy/https://i.imgur.com/wTGubjh.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/e31u7OD.jpg)
Воробей: Спасибо, Икс. Я все записал, увидимся! Про ПЛИСы тогда в следующий раз расскажешь.
![](https://img.golos.io/proxy/https://i.imgur.com/ZzBAYqQ.jpg)
Икс: Да, погоди ты еще минутку, что ты такой нетерпеливый? Совсем немного осталось.
Слушайте, ПЛИСы или программируемые логические интегральные схемы – это такие штуки, которые программируются совсем по иному принципу, чем CPU, GPU или микроконтроллеры.
Давайте вспомним, из чего состоит CPU. Из транзисторов, т.е. CPU это интегральная схема, в которой совершенно определенным образом транзисторы соединены между собой, чтобы выполнять ту работу, для которой CPU и предназначается. А что если мы хотим создать свою микросхему, со своим уникальным функционалом сильно отличающимся от CPU. Тогда нам надо ехать на завод и заказывать производство этой микросхемы, описывая сотрудникам завода как и в какой последовательности они должны соединять транзисторы, чтобы на выходе мы получили микросхему, функционирующую так, как нам и надо.
Это не очень удобно и усложняет создание прототипов устройств, когда мы хотим создать некоторое устройство в одном единственном экземпляре, опробовать его и только когда все будет работать так, как нам и надо, бежать на завод и заказывать большую партию.
Для решения этой проблемы и появились ПЛИСы. Соединение их транзисторов носит «гибкий» характер и может меняться в зависимости от того, какую программу мы напишем. В частности мы можем написать программу, которая соединит транзисторы так, как они должны быть соединены в CPU и тогда по сути мы сможем создать свой CPU, для которого мы далее сможем писать программы на уже знакомых нам языках типа C/C++ и других. Т.е. суть программирования ПЛИС, это задание архитектуры нашего устройства.
С момента появления, эта технология не стояла на месте и сейчас речь идет не только о задании связей транзисторов между собой, а скорее о задании связей более крупных строительных блоков. Так появились FPGA (field-programmable gate array), программируя которые мы можем оперировать понятиями более высокого уровня, чем просто транзистор. FPGA состоит из достаточно крупных законченных логических блоков, таких как мультиплексоры, счетчики, триггеры и даже процессоры. Нам останется только лишь запрограммировать соединение этих крупных блоков в нужные нам последовательности.
Ниже представлены FPGA от таких гигантов этой индустрии как Altera и Xilinx
![](https://img.golos.io/proxy/https://i.imgur.com/MslNhNG.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/zu7LxtY.jpg)
А программируются эти FPGA с помощью специальных языков программирования, таких как VHDL и Verilog. Для этого также применяются специальные отладочные платы, упрощающие ввод/вывод данных в эти микросхемы и их прошивку нашим кодом. Ниже представлена одна из таких плат.
![](https://img.golos.io/proxy/https://i.imgur.com/XXZtenT.jpg)
Все друзья! Всем спасибо, все свободны!
![](https://img.golos.io/proxy/https://i.imgur.com/vtZI4vc.jpg)
![](https://img.golos.io/proxy/https://i.imgur.com/eC4p1Rh.jpg)
Гусеница и Воробей: УРА!!!
ИТОГО
Было показано, что среди устройств, которые можно программировать, следует выделить:
- CPU
- GPU
- Микроконтроллер
- FPGA