«Rust - будущее системного программирования, С - новый Ассемблер» - выступление одного из ведущих инженеров Intel
На недавно прошедшем Саммите по технологиям с открытым исходным кодом (Open Source Technology Summi - OSTS) Джош Триплетт (Josh Triplett), ведущий инженер Intel, рассказал о том, что его компания заинтересована в том, чтобы в ближайшем будущем Rust достиг "паритета" со все еще доминирующим в области системной и низкоуровневой разработки языком C. В своем выступлении под заголовком "Intel и Rust: будущее системного программирования" он также рассказал об истории системного программирования, о том, как C стал языком системного программирования "по умолчанию", какие возможности Rust дают ему преимущество над C и как в ближайшем будущем он сможет полностью заменить C в данной области программирования.
Системное программирование - это разработка и управление программным обеспечением, которое служит платформой для создания прикладных приложений, обеспечивая взаимодействие последних с процессором, оперативной памятью, устройствами ввода-вывода и сетевым оборудованием. Системное программное обеспечение создает специальную абстракцию в виде интерфейсов, которые помогают создавать прикладное ПО, не вникая в детали того, как работает непосредственно "железо".
Сам Триплетт определяет системное программирование как "все, что не является приложением". Оно включает в себя такие вещи, как BIOS, прошивки, загрузчики и ядра операционных систем, различные виды встроенного низкоуровневого кода, а также реализации виртуальных машин. Интересно, что Триплетт считает, что веб-браузер - это тоже системное программное обеспечение, поскольку браузер давно стал бóльшим, чем "просто программой", превратившись в самостоятельную "платформу для веб-сайтов и веб-приложений".
В прошлом большинство системных программ, в том числе BIOS, загрузчики и прошивки, писались на языке ассемблера. В 1960-х годах начались эксперименты по обеспечению аппаратной поддержки языков высокого уровня, что привело к созданию таких языков, как PL/S, BLISS, BCPL и ALGOL 68.
Затем, в 1970-х годах, Деннис Ритчи (Dennis Ritchie) создал язык программирования C (Си) для операционной системы Unix. Созданный на языке программирования B, не имевшим даже поддержки типизации, C был наполнен мощными высокоуровневыми функциями, которые лучше всего подходили для написания операционных систем и драйверов. Несколько компонентов UNIX, включая его ядро, были в конечном итоге переписаны на C. В дальнейшем многие другие системные программы, включая базу данных Oracle, большую часть исходного кода Windows и операционную систему Linux, были также написаны на C.
C получил огромную поддержку в данном направлении. Но что именно заставило разработчиков перейти на него? Триплетт считает, что для того, чтобы замотивировать разработчиков перейти с одного языка программирования на другой, последний прежде всего должен обеспечить новые функции без потери старых возможностей.
Во-первых, язык должен предлагать "достаточно впечатляющие" новые функции. "Он не может быть немного лучше. Он должен быть значительно лучше, чтобы оправдать усилия и время инженеров, необходимое для перехода", - объясняет он. По сравнению с языком ассемблера у С было много вещей, которые он мог предложить. Он поддерживал в некоторой степени безопасную типизацию, обеспечивал лучшую переносимость и производительность с высокоуровневыми конструкциями, а также генерировал в целом намного более читаемый код.
Во-вторых, язык должен обеспечивать поддержку старых возможностей, а это значит, что в истории с переходом на C разработчики должны были быть уверены, что он не менее функционален, чем язык ассемблера. Триплетт поясняет: "Новый язык не может быть просто лучше, он также должен быть не хуже". Помимо того, что C был быстрее и поддерживал любые типы данных, которые мог использовать язык ассемблера, он также имел то, что Триплетт назвал "аварийным люком", а именно поддерживал внутри себя вставки кода на языке ассемблера.
Триплетт считает, что C сейчас становится тем, чем был язык ассемблера много лет назад. "С - это новый Ассемблер", - заявляет он. Теперь разработчики ищут новый язык высокого уровня, который не только решит накопившиеся в C проблемы, исправить которые уже невозможно, но и также предложит новые впечатляющие возможности. Такой язык должен быть достаточно убедительным, чтобы заставить разработчиков перейти на него, должен быть безопасным, обеспечивать автоматическое управление памятью и многое другое.
"Любой язык, который хочет быть лучше, чем C, должен предлагать гораздо больше, чем просто защиту от переполнения буфера, если он действительно хочет стать убедительной альтернативой. Разработчики заинтересованы в удобстве использования и производительности, в написании кода, который не требует пояснений и выполняет больше работы за меньшее количество строк. Также необходимо решить проблемы безопасности. Простота использования и производительность неразрывно с нею связаны. Чем меньше кода вам нужно написать для достижения чего-либо, тем меньше у вас возможностей, чтобы допустить какие-либо ошибки, связанные с безопасностью или нет", - объясняет Триплетт.
Сравнение Rust и C
Еще в 2006 году Грейдон Хоар (Graydon Hoare), сотрудник Mozilla, начал писать Rust как личный проект. А в 2009 году Mozilla начала спонсировать разработку Rust для собственных нужд, а также расширила команду для дальнейшего развития языка.
Одна из причин, по которой Mozilla заинтересовалась в новом языке, заключается в том, что Firefox был написан на более чем 4 миллионах строк кода C++ и имел довольно много критических уязвимостей. Rust был создан с учетом требований безопасности и параллелизма, что делает его идеальным выбором для переписывания многих компонентов Firefox в рамках проекта Quantum по полной переработке архитектуры браузера. Также Mozilla использует Rust для разработки Servo, движка рендеринга HTML, который в будущем заменит текущий движок рендеринга Firefox. Многие другие компании начали использовать Rust для своих проектов, включая Microsoft, Google, Facebook, Amazon, Dropbox, Fastly, Chef, Baidu и многие другие.
Rust решает одну из наиболее важных проблем языка C. Он предлагает автоматическое управление памятью, поэтому разработчикам не нужно вручную выделять, а затем освобождать ее для каждого объекта в приложении. Что отличает Rust от других современных языков, так это то, что он не имеет сборщика мусора, который автоматически удаляет из памяти неиспользуемые объекты, а также среды выполнения, необходимой для его работы, как, например, Java Runtime Environment для Java. Вместо этого у Rust есть концепции владения, заимствования, ссылок и времени жизни. "В Rust есть система декларирования вызовов объекта, позволяющая указать, использует ли его владелец или это просто заимствование. Если вы просто заимствуете объект, компилятор будет следить за этим и гарантировать, что оригинал останется на месте, пока вы ссылаетесь на него. А также Rust проследит, что объекта будет удален из памяти сразу по завершении его использования, вставляя соответствующий вызов в код во время компиляции без дополнительных затрат времени", - рассказывает Триплетт.
Отсутствие собственной среды выполнения также можно считать положительной чертой Rust. Триплетт считает, что языки, которые выполняются с ее помощью, сложно использовать в качестве инструмента для системного программирования. Как он поясняет: "Вы должны инициализировать эту среду выполнения, прежде чем сможете вызвать любой код, вы должны использовать эту среду выполнения для вызова функций, и сама среда выполнения может запускать дополнительный код за вашей спиной в неожиданные моменты времени".
Также Rust стремится обеспечить безопасное параллельное программирование. Те же функции, которые делают его безопасным для памяти, отслеживают такие вещи, как то, какому потоку принадлежит какой объект и какие объекты могут передаваться между потоками, а какие нуждаются в блокировке.
Все эти функции делают Rust достаточно убедительным, чтобы разработчики смогли выбрать его как новый инструмент для системного программирования. Однако, с точки зрения параллельных вычислений Rust пока еще немного отстает от C.
Триплетт собирается создать специальную рабочую группу, которая займется внедрением в Rust необходимых функцией, чтобы он смог полностью сравняться, превзойти и заменить C в области системного программирования. В теме на Reddit, посвященной его выступлению, он сообщил, что "группа FFI/ C Parity находится в процессе создания и еще не начала работу", пока что он готов ответить на любые вопросы, а в будущем обязательно опубликует ближайшие планы по развитию Rust в рамках его инициативы для всех заинтересованных лиц.
Можно предположить, что в первую очередь группа FFI/ C Parity займется улучшением поддержки многопоточности в Rust, внедрением поддержки BFLOAT16, формата представления чисел с плавающей запятой, который появился в новых процессорах Intel Xeon Scalable, а также стабилизацией вставок кода на Ассемблере.