Язык системного программирования — это язык программирования , используемый для системного программирования ; такие языки предназначены для написания системного программного обеспечения , которое обычно требует иных подходов к разработке по сравнению с прикладным программным обеспечением. Эдсгер Дейкстра назвал эти языки машинно-ориентированными языками высокого порядка , или мохолами . [1]
Языки программирования общего назначения, как правило, фокусируются на общих функциях, чтобы позволить программам, написанным на этом языке, использовать один и тот же код на разных платформах. Примерами таких языков являются ALGOL и Pascal . Это общее качество обычно достигается ценой отказа в прямом доступе к внутренним механизмам машины, и это часто негативно сказывается на производительности.
Системные языки, напротив, разработаны не для совместимости, а для производительности и простоты доступа к базовому оборудованию, при этом по-прежнему предоставляя концепции программирования высокого уровня, такие как структурное программирование . Примерами являются ESPOL и SPL , оба из которых похожи на ALGOL по синтаксису, но настроены на соответствующие платформы. Другие являются кроссплатформенными, но разработаны для работы близко к оборудованию, например BLISS , JOVIAL и BCPL .
Некоторые языки охватывают системные и прикладные домены, преодолевая разрыв между этими применениями. Каноническим примером является C , который широко используется как для системного, так и для прикладного программирования. Некоторые современные языки также делают это, например, Rust и Swift .
В отличие от прикладных языков, системные языки программирования обычно предлагают более прямой доступ к физическому оборудованию машины: архетипичным системным языком программирования в этом смысле был BCPL . Системные языки программирования часто не имеют встроенных средств ввода/вывода (I/O), поскольку проект системного программного обеспечения обычно разрабатывает собственные механизмы ввода/вывода или строится на базовых средствах управления вводом/выводом монитора или экрана. Различие между языками, используемыми для системного программирования и прикладного программирования, со временем стало размытым с широкой популярностью PL/I , C и Pascal .
Самое раннее системное программное обеспечение было написано на языке ассемблера в первую очередь потому, что не было альтернативы, но также по таким причинам, как эффективность объектного кода, время компиляции и простота отладки. Прикладные языки, такие как FORTRAN, использовались для системного программирования, хотя они обычно все еще требовали, чтобы некоторые процедуры были написаны на языке ассемблера. [2]
Языки среднего уровня «имеют большую часть синтаксиса и возможностей языка более высокого уровня, но также предоставляют прямой доступ в языке (а также предоставляют язык ассемблера) к функциям машины». [2] Самым ранним из них был ESPOL на мэйнфреймах Burroughs примерно в 1960 году, за которым последовал PL360 Никлауса Вирта ( впервые написанный на системе Burroughs как кросс-компилятор ), который имел общий синтаксис ALGOL 60 , но операторы которого напрямую манипулировали регистрами и памятью процессора. Другие языки в этой категории включают MOL-360 и PL/S .
Например, типичным оператором PL360 является R9 := R8 and R7 shll 8 or R6
, означающий, что регистры 8 и 7 должны быть объединены по схеме «И», результат сдвинут влево на 8 бит, результат этого должен быть объединен по схеме «ИЛИ» с содержимым регистра 6, а окончательный результат помещен в регистр 9. [3]
В то время как PL360 находится на семантическом уровне языка ассемблера, другой тип языка системного программирования работает на более высоком семантическом уровне, но имеет определенные расширения, разработанные для того, чтобы сделать язык пригодным для системного программирования. Ранним примером такого языка является LRLTRAN, [4], который расширил Fortran функциями для манипуляции символами и битами, указателями и таблицами переходов с прямой адресацией.
Впоследствии были разработаны такие языки, как C, где сочетание функций было достаточным для написания системного программного обеспечения, и можно было разработать компилятор , который генерировал эффективные объектные программы на скромном оборудовании. Такой язык обычно опускает функции, которые не могут быть эффективно реализованы, и добавляет небольшое количество машинно-зависимых функций, необходимых для доступа к определенным возможностям оборудования; для этой цели часто используется встроенный ассемблерный код, такой как оператор C. asm
Хотя было разработано много таких языков, [1] C и C++ — это те, которые выжили.