fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Как выучить

Руководство по низкоуровневому программированию для начинающих

Руководство по низкоуровневому программированию для начинающих

Языки высокого уровня, такие как JavaScript и Python, могут быть самыми популярными языками программирования сегодня, но нет никаких аргументов в пользу того, что эти языки делают много работы за разработчика, от управления памятью до интерпретации во время выполнения. С другой стороны, в низкоуровневом программировании очень мало абстракции – вы пишете код гораздо ближе к компьютеру. Так зачем же вам изучать низкоуровневое программирование? В этом руководстве наставник и ученик из школы Холбертон ответят на все ваши вопросы о низкоуровневом программировании!

Что нужно знать:

Низкий уровень относится к коду, написанному непосредственно для компьютера – т.е. машинный код и ассемблер.

Является ли язык Си языком низкого уровня? Мнения неоднозначны!

Почему именно низкоуровневый? Понимание низкоуровневого программирования является ключевым, если вы хотите работать в области машинного обучения или Интернета вещей. Кроме того, понимание того, что происходит под капотом, делает любого разработчика лучше.

Знакомство с экспертами

Оливье является наставником в школе Холбертон, где он помогает студентам, когда у них возникают вопросы, связанные с низкоуровневым программированием. Он также является главным архитектором программного обеспечения в компании FutureOn, работающей в нефтяной промышленности. В прошлом он руководил разработкой библиотек ГИС (картографии) для мобильных устройств и создавал видеоигры, такие как Age of Conan.

Артур Дамм 7 лет работал частным репетитором по математике, естественным наукам и программированию (и в течение года проходил стажировку по разработке Java Android). Артур выбрал Holberton School из-за доступности ISA, классного кампуса в Сан-Франциско и строгой учебной программы полного цикла (которая, конечно, включает низкоуровневое программирование). В настоящее время Артур находится на заключительном этапе специализации в школе Holberton.

Что такое низкоуровневое программирование?

Артур: В современном понимании низкоуровневое программирование – это любой язык, в котором вы управляете памятью. Любой язык, где управление памятью или сборка мусора делается за вас, а это сейчас большинство языков, считается “высокоуровневым”.

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

Профессиональный совет: Сборка мусора – это когда система убирает за вас. В программировании на языке Си вы должны убирать за собой сами.

Примеры языков программирования низкого уровня

Артур: В старые времена язык Си считался языком высокого уровня. Сегодня многие инженеры могут посмеяться над этим, потому что язык Си настолько низкоуровневый.

Оливье: Определение низкого уровня довольно сильно изменилось с момента зарождения компьютерной науки. Я бы не стал относить C к языкам низкого или высокого уровня, а скорее к промежуточным языкам. Единственным настоящим низкоуровневым языком программирования является машинный код или ассемблер (asm). Ассемблер максимально приближен к тому, что может выполнить CPU (процессор компьютера), поскольку это буквально текстовый перевод двоичного кода, который понимает CPU. Например, библиотеки сжатия обычно собираются на C, а очень специфические части собираются с помощью ассемблера, но количество ассемблера становится все меньше, потому что компиляторы становятся намного лучше в оптимизации.

Артур: В настоящее время я считаю C низкоуровневым языком. Конечно, это основной язык, который Холбертон использует в низкоуровневой учебной программе. Так что для меня C является низкоуровневым, потому что при его использовании мы должны управлять собственной памятью приложения, она не управляется за нас языком. Это требует от нас, инженеров, полной ответственности за свои действия. Это означает, что наши ошибки будут, как правило, катастрофическими, но вознаграждение будет значительным в плане эффективности и энергопотребления на любом устройстве, на котором работает наш код. Кроме того, работа программистом на языке Си может быть приятной, если вам нравится разбираться в технических деталях своей работы.

Программирование низкого уровня в сравнении с программированием высокого уровня

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

Примеры языков высокого уровня:

Артур: За первые девять месяцев обучения в школе Холбертон мы изучили два языка высокого уровня – Python и JavaScript. Все языки высокого уровня, такие как Python, Javascript и т.д., созданы на основе языка C. Понимая, как они работают под капотом, я могу лучше написать свой высокоуровневый код, чтобы он действовал в соответствии с его внутренним дизайном, обеспечивая превосходную производительность приложения с более глубоким осознанием ошибок. Кроме того, поскольку язык C настолько строг, при переходе на язык более высокого уровня у программиста возникает ощущение, что он снимает с себя груз и испытывает чувство выразительной легкости.

Профессиональный совет: Когда вы хотите добавить новые возможности в Python, это называется расширением. И они на самом деле написаны на C! В некоторых заданиях Холбертона студенты пишут код на Си, который ложится под Python, а затем тестируют их вместе, чтобы убедиться, что они работают.

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

Артур: В инженерии не бывает идеальных решений. Есть только компромиссы. Когда язык занимается управлением памятью, инженеру гораздо проще работать. За вас убирают все лишнее. Однако компромисс заключается в том, что это, как правило, создает менее эффективный код, который требует больших вычислительных затрат. Практически это означает, что он будет потреблять больше энергии на ячейке.

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

Оливье: Несмотря на то, что сейчас очень популярны языки высокого уровня для написания низкоуровневых вещей, таких как драйверы для видеокарт, языки низкого уровня все еще необходимы для производительности. Например, все, что связано с кодированием или декодированием и шифрованием, вероятно, будет использовать низкоуровневое программирование, с C и, возможно, некоторым ассемблером для использования расширенных инструкций (таких как AVX, SSE и т.д.). В общем, все, что требует высокой производительности и тонкой настройки, потребует немного низкоуровневого программирования.

Работа, требующая низкоуровневого программирования

Оливье: Любая работа, связанная с разработкой встроенного программного обеспечения и созданием кода, который должен работать быстро. Если вы понимаете низкоуровневое программирование, вы, вероятно, поймете все, что выше. Когда я набираю персонал и соискатель застревает на проблеме React, я хочу видеть, что разработчик способен читать код и понимать, что делает библиотека.

Кроме того, если вы хотите работать в области программирования на GPU с использованием языков “высокого уровня”, таких как CUDA или OpenCL, вам потребуется понимание низкоуровневого программирования. В GPU (графический процессор) все массово параллельно, и то, как вы форматируете память, на самом деле так же важно, как и сам код.

Артур: Я буду искать работу в области Интернета вещей или встраиваемых систем. Моя цель – работать над интересным проектом и, конечно, применить свои навыки низкоуровневого программирования на языке Си.

Как изучать Си или низкоуровневое программирование

Стоит ли изучать низкоуровневое программирование до изучения языка высокого уровня, такого как Python, JavaScript или Java?

Артур: Ответ на этот вопрос зависит от типа инженера, которым вы хотите стать. Если вы хотите оптимизировать кратчайшее время обучения, вам следует игнорировать низкий уровень, сразу перейти к JavaScript или Python и просто попрактиковаться в этой одной вещи и стать достаточно хорошим в ней, чтобы начать работать.

Но я очень высоко оценил идею Holberton School – они являются альтернативой традиционному четырехлетнему образованию в области компьютерных наук, которое по своей сути является более строгим и техническим уровнем инженера. В этом случае, я думаю, начинать с языка C – идеальный вариант, потому что он требует от вас понимания всех деталей в очень актуальной форме. Например, изучив сначала C, мы становимся гораздо более способными, когда переходим к Python.

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

Нужно ли знать математику для программирования на низком уровне?

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

Низкоуровневое программирование в школе Холбертон

Артур: Наши первые девять месяцев (они называются Foundations) – это программа полного стека, то есть мы изучаем низкоуровневые и высокоуровневые языки. Foundations – это отличное общее введение во все уровни стека, то есть: низкоуровневый, высокоуровневый, devops, базы данных и портфельные проекты. Мы изучаем программирование на языке C почти ровно три месяца. А затем на специализации мы продолжаем то, на чем остановились в той части стека Foundations. В моем случае мы продолжили программирование технических систем на низкоуровневом языке C. Таким образом, мы учимся писать наш код так, как он написан для Linux, который считается стандартной операционной системой в инженерном мире.

Оливье: Фундамент языка C важен, потому что он дает студентам Холбертона базу, на которую можно опираться. Если вы знаете C, то с большой вероятностью вы сможете понять любой императивный язык, который вам подкинут. Кроме того, вы будете понимать, как работает память. 9-месячная специализация Holberton School – это, по сути, сжатый кикстартер, который поможет вам быстрее стать лучше в той отрасли информатики, которая вам нравится.

Пример проекта по низкоуровневому программированию

Артур: По большей части до сих пор мы копировали компоненты, существующие в операционной системе Linux. Linux считается произведением инженерного искусства. В настоящее время мы работаем над оболочкой или командной строкой. Это включает в себя довольно много продвинутого системного программирования.

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

Для нашей еженедельной практики по алгоритмам мы недавно изучали очень интересный алгоритм сопоставления шаблонов под названием KMP, Knuth-Morris-Pratt substring-search. Это действительно технический, но в то же время удивительно доступный алгоритм. Я всегда испытываю небольшой душевный подъем, когда впервые изучаю новый алгоритм и действительно начинаю его понимать.

Как можно начать изучать низкоуровневое программирование?

Оливье: Нам повезло, что мы живем в такое время, когда информация повсюду. Я рекомендую книгу “Язык программирования Си” Денниса М. Ричи и Брайана В. Кернигана (создателей языка Си).

Мой совет каждому студенту – читайте код! Вначале это трудно, но потом вы станете лучше. Мои основы языка C очень помогли мне на протяжении многих лет”.

Узнайте больше и читайте о школе Холбертон на сайте Course Report. Эта статья была подготовлена командой Course Report в сотрудничестве со школой Холбертон.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *