- Linux. Системное программирование.
- 2. Языки программирования системного уровня.
- Языки программирования высокого уровня.
- 4. Типизация.
- Язык системного программирования — System programming language
- Функции
- История
- Языки среднего уровня
- Языки высшего уровня
- Основные языки
- Смотрите также
- Примечания
- использованная литература
- внешние ссылки
Linux. Системное программирование.
Данная книга рассказывает о системном программировании в Linux. Системное программирование — это практика написания системного ПО, низкоуровневый код которого взаимодействует непосредственно с ядром и основными системными библиотеками. Иными словами, речь далее пойдет в основном о системных вызовах Linux и низкоуровневых функциях, в частности тех, которые определены в библиотеке C. Есть немало пособий, посвященных системному программированию для UNIX-систем, но вы почти не найдете таких, которые рассматривают данную тему достаточно подробно и фокусируются именно на Linux. Еще меньше подобных книгучитывают новейшие релизы Linux и продвинутые интерфейсы, ориентированные исключительно на Linux. Эта книга не только лишена всех перечисленных недостатков, но и обладает важным достоинством: дело в том, что я написал массу кода для Linux, как для ядра, так и для системных программ, расположенных непосредственно «над ядром». На самом деле я реализовал на практике ряд системных вызовов и других функций, описанных далее. Соответственно книга содержит богатый материал, рассказывая не только о том, как должны работать системные интерфейсы, но и о том, как они действительно работают и как вы сможете использовать их с максимальной эффективностью. Таким образом, данная книга одновременно является и руководством по системному программированию для Linux, и справочным пособием, описывающим системные вызовы Linux, и подробным повествованием о том, как создавать более интеллектуальный и быстрый код. Текст написан простым, доступным языком. Независимо от того, является ли создание системного кода вашей основной работой, эта книга научит полезным приемам, которые помогут вам стать по-настоящему высокопрофессиональным программистом.
2. Языки программирования системного уровня.
Чтобы осознать различие между языками описания сценариев и системными , полезно вспомнить историю развития последних. Впервые они появились в качестве альтернативы языкам ассемблера, позволяющим использовать в программе практически все особенности конкретной аппаратной подсистемы. Каждому утверждению такого языка соответствует ровно одна машинная команда, и программисту приходиться иметь дело с такими низко уровневыми деталями, как распределение регистров и последовательности вызова процедур. В результате написание и сопровождение крупных программ на языке ассемблера оказывается чрезвычайно сложным делом.
К концу 50-х годов начали появляться языки программирования более высокого уровня, такие как Lisp, Fortran, ALGOL. В них уже не было точного соответствия между языковыми конструкциями и машинными командами. Преобразование строк исходного кода в последовательности двоичных команд осуществлялось компилятором. Со временем их число пополнилось языками PL /1, Pascal, C, C++, Java. Все они менее эффективно используют аппаратуру по сравнению с языками ассемблера, но позволяет быстрее создавать приложения. В результате им удалось практически полностью вытеснить языки ассемблера при создании крупных приложений.
Языки программирования высокого уровня.
4. Типизация.
Второе различие между языками ассемблера и языками программирования системного уровня состоит в типизации. Я использую этот термин для обозначения того, до какой степени значение информации бывает определено еще прежде, чем приходит время ее использования в программе. В сильно типизированных языках требуется, чтобы программист заранее декларировал способ использования каждого фрагмента информации, и затем уже языковые средства препятствуют применению ее каким-либо иным способом. В слабо же типизированных языках на способ обработки информации не налагается предварительных ограничении; интерпретация каждого элемента данных определяется только тем, как он фактически используется, без учета каких-либо предварительных объявлении. Современные компьютеры устроены таким образом, что им не известно понятие типа. Каждое слово памяти может содержать значение любого типа; целое число, число с плавающей запятой, указатель или машинную команду. Интерпретация значения определяется способом его использования. Если указатель следующей машинной команды указывает в процессе исполнения машинной команды на некоторое слово в памяти, то оно и рассматривается как команда; если адрес слова задан в параметрах команды целочисленного сложения, то его значение и обрабатывается как целое число; и т. д. Одно и то же слово памяти может использоваться в различных случаях разными способами. В противоположность этому для современных языков программирования характерна строгая типизация. Каждая переменная в языке программирования системного уровня должна быть объявлена с указанием конкретного типа, такого как целое число или указатель на строку символов, и затем использоваться только соответствующими этому типу способами. Данные и программный код разделены; создание нового кода по ходу исполнения программы затруднено, если вообще возможно. Переменные могут объединяться в структуры или объекты с четко определенной субструктурой и методами манипулирования своими компонентами. Объект одного типа не может быть использован в ситуации, где предписано применение объект другого типа. Языки описания сценариев создавались для связывания готовых программ. Их применение подразумевает наличие достаточного ассортимента мощных компонентов, которые требуется только объединить друг с другом. Типизация дает ряд преимуществ. Во-первых, крупные программы становятся благодаря ей более управляемыми. Четкость системы типов делает для программиста ясным, для чего предназначены те или иные данные; он легко может различать их между собой и соответственно использовать. Во-вторых, компиляторы используют информацию о типах для обнаружения некоторых видов ошибок, таких как попытка, использовать число с плавающей запятой в качестве указателя. В-третьих, типизация повышает производительность приложения, позволяя компиляторам генерировать более специализированный код. Например, если компилятору известно, что некоторая переменная всегда содержит целочисленные значения, он может генерировать для манипулирования ею целочисленные инструкции; если же тип переменой компилятору неизвестен, то приходиться вставлять дополнительные инструкции для проверки типа во время исполнения. На рисунке 1 представлено распределение ряда языков программирования по мощности и степени строгости типизации.
Язык системного программирования — System programming language
Язык системного программирования является язык программирования используется для системного программирования ; такие языки предназначены для написания системного программного обеспечения , которое обычно требует иных подходов к разработке по сравнению с прикладным программным обеспечением. Эдсгер Дейкстра называет эти языки машинно-ориентированными языками высокого порядка или мохол .
Языки программирования общего назначения, как правило, сосредоточены на общих функциях, чтобы программы, написанные на этом языке, могли использовать один и тот же код на разных платформах. Примеры таких языков включают ALGOL и Pascal . Это общее качество обычно достигается за счет отказа в прямом доступе к внутренней работе машины, и это часто отрицательно сказывается на производительности.
Системные языки, напротив, разработаны не для совместимости, а для обеспечения производительности и простоты доступа к базовому оборудованию, в то же время предоставляя концепции программирования высокого уровня, такие как структурное программирование . Примеры включают SPL и ESPOL , оба из которых похожи на ALGOL по синтаксису, но настроены для соответствующих платформ. Другие являются кроссплатформенными, но предназначены для работы рядом с оборудованием, например BLISS , JOVIAL и BCPL .
Некоторые языки охватывают системную и прикладную области, сокращая разрыв между этими видами использования. Канонический пример — C , который широко используется как для системного, так и для прикладного программирования. Некоторые современные языки также делают это, например, Rust и Swift .
Функции
В отличие от языков приложений, языки системного программирования обычно предлагают более прямой доступ к физическому оборудованию машины: архетипичным языком системного программирования в этом смысле был BCPL . Языки системного программирования часто не имеют встроенных средств ввода / вывода (I / O), потому что проект системного программного обеспечения обычно разрабатывает свои собственные механизмы ввода / вывода или строится на базовых средствах ввода / вывода монитора или управления экраном. Различие между языками, используемыми для системного программирования и программирования приложений, со временем стерлось из-за широкой популярности PL / I , C и Pascal .
История
Самое раннее системное программное обеспечение было написано на языке ассемблера прежде всего потому, что не было альтернативы, но также по причинам, включая эффективность объектного кода, время компиляции и простоту отладки. Для системного программирования использовались такие прикладные языки, как FORTRAN , хотя обычно они все еще требовали написания некоторых подпрограмм на языке ассемблера.
Языки среднего уровня
Языки среднего уровня «имеют большую часть синтаксиса и возможностей языка более высокого уровня, но также обеспечивают прямой доступ на языке (а также язык ассемблера) к машинным функциям». Самый ранний из них был ESPOL на Burroughs мэйнфреймы примерно 1960, а затем Никлаус Вирт «S ПЛ360 (первый написанный на системе Burroughs как кросс — компилятор ), который имел общий синтаксис ALGOL 60 , но чьи заявления непосредственно манипулировали регистры процессора и памяти . Другие языки в этой категории включают MOL-360 и PL / S .
В качестве примера типичный оператор PL360 R9 := R8 and R7 shll 8 or R6 означает, что регистры 8 и 7 должны быть объединены вместе, результат сдвинут влево на 8 бит, результат этого или объединен с содержимым регистра 6, а конечный результат помещен в регистр 9.
Языки высшего уровня
В то время как PL360 находится на семантическом уровне языка ассемблера, другой тип языка системного программирования работает на более высоком семантическом уровне, но имеет специальные расширения, предназначенные для того, чтобы сделать язык подходящим для системного программирования. Ранним примером этого типа языка является LRLTRAN, который расширил Fortran функциями для символьных и битовых манипуляций, указателей и таблиц переходов с прямым адресом.
Впоследствии были разработаны такие языки, как C, где комбинации функций было достаточно для написания системного программного обеспечения, и можно было разработать компилятор , который генерировал эффективные объектные программы на скромном оборудовании. Такой язык обычно не включает функции, которые не могут быть реализованы эффективно, и добавляет небольшое количество машинно-зависимых функций, необходимых для доступа к определенным аппаратным возможностям; для этой цели часто используется встроенный ассемблерный код, такой как инструкция C. Хотя было разработано много таких языков, C и C ++ выжили. asm
Язык системного программирования (SPL) — это также название определенного языка на компьютерах серии HP 3000 , используемого для его операционной системы HP Multi-Programming Executive (MPE) и других частей системного программного обеспечения.
Основные языки
Язык | Оригинатор | День рождения | Под влиянием | Используется для |
---|---|---|---|---|
ESPOL | Корпорация Берроуз | 1961 г. | АЛГОЛ 60 | MCP |
PL / I | IBM , ПОДЕЛИТЬСЯ | 1964 г. | АЛГОЛ, ФОРТРАН, немного КОБОЛА | Мультики |
PL / S | IBM | 1960-е годы | PL / I | OS / 360 |
PL360 | Никлаус Вирт | 1968 г. | АЛГОЛ 60 | АЛГОЛ W |
Паскаль | Никлаус Вирт | 1970 г. | АЛГОЛ W | Apollo Computer Aegis, Apple MacApp |
БЛАЖЕНСТВО | Университет Карнеги Меллон | 1970 г. | АЛГОЛ-PL / I | VMS (порциями) |
Язык разработки систем (LSD) | Р. Даниэль Бержерон и др. (Университет Брауна) | 1971 г. | PL / I | |
C | Деннис Ричи | 1972 г. | BCPL , B (язык программирования) | Большинство ядер операционных систем , включая Unix-подобные системы |
NEWP | Берроуз | 1970-е годы | ESPOL, АЛГОЛ | MCP |
PL / 8 | IBM | 1970-е годы | PL / I | AIX |
PL-6 | Honeywell, Inc. | 1970-е годы | PL / I | CP-6 |
СИМПЛ | CDC | 1970-е годы | Веселый | Подсистемы NOS , большинство компиляторов, редактор FSE |
C ++ | Бьярне Страуструп | 1979 г. | C , Simula | C ++ приложения |
Ада | Жан Ичбия , С. Такер Тафт | 1983 г. | АЛГОЛ 68 , Паскаль , C ++ , Java , Eiffel | Встроенные системы, ядра ОС, компиляторы, игры, симуляторы, CubeSat , управление воздушным движением, авионика |
D | Цифровой Марс | 2001 г. | C ++ | Несколько доменов |
Ним | Андреас Рампф | 2006 г. | Python , Ada , Lisp , Oberon , C ++ , Modula-3 , Object Pascal | Игры, компиляторы, ядра ОС, разработка приложений, встроенные системы и т. Д. |
Ржавчина | Mozilla Research | 2010 г. | C ++ , Haskell , Erlang , Ruby | Сервопривод , Redox OS |
Быстрый | Apple Inc. | 2014 г. | C , Цель-C , D , Ржавчина | Разработка приложений для macOS , iOS , watchOS и tvOS |
Смотрите также
Примечания
использованная литература
внешние ссылки
Эта статья основана на материалах, взятых из Free On-line Dictionary of Computing до 1 ноября 2008 г. и включенных в соответствии с условиями «перелицензирования» GFDL версии 1.3 или новее.