Почему C используется для написания драйверов и кодов ОС?
Есть ли проблема с размером?
Есть ли драйверы, написанные на других языках?
На каком языке были написаны XP, Vista и Solaris?
Почему C используется для написания драйверов и кодов ОС?
Есть ли проблема с размером?
Есть ли драйверы, написанные на других языках?
На каком языке были написаны XP, Vista и Solaris?
C компилируется до машинного кода и не требует поддержки во время выполнения самого языка. Это означает, что можно писать код, который может работать до таких вещей, как файловые системы, виртуальная память, процессы и что-то еще, кроме регистров и оперативной памяти.
В критически важных для безопасности средах (думаю, авионика, космические аппараты, медицинские устройства, транспорт, программное обеспечение для управления процессом) системы (а также драйверы) часто пишутся с использованием Ada или даже SPARK/Ada.
Чтобы уточнить: C обычно понимается как довольно низкий уровень и в значительной степени похож на "макроязык" для самой сборки, что также связано с его мощностью (скорость, размер, переносимость).
Ada, с другой стороны, рука была специально разработана для критически важных для безопасности приложений с проверяемостью, чтобы процитировать Ada 2005 для Mission-Critical Systems:
Ада [9] является языком выбора для многих критических систем из-за его тщательного проектирования и наличия четких руководящих принципов для построения систем с высокой степенью целостности [10]
Это также означает, что Ada поддерживает сильную типизацию, а также ряд других важных функций (цитируя дизайн для безопасности):
Языки программирования сильно отличаются друг от друга их пригодность для использования в системы, связанные с безопасностью. Carré et al. определили шесть факторов, которые влияют пригодность языка для приложения с высокой степенью целостности [Carré 1990]. Это:
- Логическая устойчивость
- Сложность определения
- Выразительная сила
- Безопасность
- Проверяемость
- Ограниченные ограничения времени и пространства
Нет стандартного языка программирования хорошо во всех этих областях, хотя некоторые (такие как Паскаль и Ада) выполняют много лучше, чем языки, такие как C или С++. В высококритических приложениях "Проверяемость велика важность. Определенные языки позволяют мощные инструменты проверки программного обеспечения для использования для широкого спектра статические тесты кода для обнаружения диапазон ошибок программирования. [...] важной проблемой при выборе язык программирования - это качество доступных компиляторов и других инструменты. Для определенных языков, подтвержденных компиляторы доступны. В то время как не гарантирование совершенства, валидация что значительно увеличивает нашу уверенность в инструмент. К сожалению, компиляторы доступны только для ограниченное количество языков, таких как Ада и Паскаль. В дополнении к компиляторы, разработчики критических системы будут использовать ряд другие инструменты, такие как статический код аналитических пакетов. Статические тесты которые могут выполняться на куске код сильно варьируется в зависимости от используемого языка. Чтобы помочь этому процессу, является общим для ограничения возможностей которые используются на определенных языках к" безопасному подмножеству языка". Хорошо структурированные и определенные языки таких как подмножества Ada, Pascal и Модула-2 позволяет провести множество испытаний такие как поток данных анализ, анализ использования данных, анализ и диапазон информационных потоков проверка. К сожалению, многие из этих тесты не могут выполняться на языках таких как C и С++.
Было бы гораздо глубже охватить этот вопрос, но вы можете проверить некоторые из следующих указателей:
Если кто-то хочет еще раз взглянуть на Аду, проверьте это: Ada Programming (wikibooks)
Существуют даже языки программирования, специально разработанные для критически важных приложений, таких как JOVIAL или HAL/S, последний из которых используется программой космического челнока.
Есть ли драйверы, написанные на любых других языках?
Я видел некоторые драйверы Linux для специального оборудования, написанного в Ada, но не знаю о других операционных системах. Однако такие драйверы обычно завершают API C.
"почему мы используем язык C для написания драйверов и кодов ОС.?
Так что программистам не придется изучать новый синтаксис каждого нового языка ассемблера для каждого нового типа машины.
"Есть ли драйверы, написанные на любых других языках?"
Исторически, языки ассемблера. Я не помню, чтобы PL/S или BLISS могли использоваться для драйверов. Возможно, B. В наше время несколько храбрых людей используют С++, но они должны быть очень осторожны. В некоторых ситуациях С++ можно использовать несколько проще в драйверах пользовательского режима.
Поскольку C имеет наилучшую комбинацию скорости, низкой памяти, низкоуровневого доступа к оборудованию и популярности.
В большинстве операционных систем есть ядро, написанное на C, а приложения поверх того, что написано в C, С++, С# или Obj-C
C на сегодняшний день является самым простым языком (кроме сборки), чтобы "перейти" на оборудование с голыми костями. С C (если у вас есть 32-битный загрузчик, такой как GRUB для переключения жесткого режима), все, что вам нужно сделать, это сделать небольшой файл crt0.asm, который устанавливает стек и его (вы получаете язык, не включая libc), С С++ вы должны беспокоиться о динамических бросках, исключениях, глобальных конструкторах, переопределять новые и т.д. И т.д. С С# вы должны порт .Net runtime (который на нем сам по себе требует ядра), и я не уверен в Obj-C, но я уверен, что он также имеет некоторые требования...
C - просто самый простой язык для использования драйверами. Не только легко начать работу, но и легко понять, что происходит на уровне машины. Их не перегружает оператор, чтобы запутать вас и тому подобное. Конечно, это удобно в "хорошем" окружении, но в Ring 0, где плохой указатель не только сбой вашего приложения, но обычно приводит к тройной ошибке (перезагрузка), синему экрану или панике ядра. Вам действительно нравится знать, что происходит на вашей машине.
Lisp машины имели свои операционные системы, написанные в Lisp, что показывает, что вам не нужно использовать C или сборку. Машиностроительный бизнес Lisp был разрушен наличием дешевых ПК, операционные системы которых, конечно же, были написаны на C и сборке.
C был одним из первых языков (который не был сборкой), который был подходящим для написания операционных систем, поэтому он попал на ранней стадии. В то время как появились другие языки, поскольку они также подходят для написания операционных систем, C остается популярным, возможно, из-за его долгой истории, а программисты-знакомые имеют свою структуру и синтаксис.
C также является языком, который много рассказывает о управлении памятью и достаточно низкоуровневым, чтобы показать барьер между аппаратным и программным обеспечением. Это то, что сегодня редко встречается среди многих методологий, которые стали больше ориентироваться на абстракцию выше всего на аппаратном уровне. Я нахожу, что C - отличный способ изучить эти вещи, одновременно умея писать быстрый код.
Помните, что C был первоначально разработан для написания операционных систем (в данном случае - Unix) и подобных низкоуровневых материалов. Он очень близок к архитектуре системы и не содержит никаких дополнительных функций, которые мы хотим контролировать, как они точно работают. Однако учтите, что остальная часть операционной системы, включая библиотеки программирования, не должна быть написана на том же языке, что и ядро. Функции ядра предоставляются через систему прерываний, и на самом деле такие библиотеки программирования могут быть записаны на любом языке, который поддерживает фрагменты ассемблера.
Самая популярная операционная система в настоящее время написана на C: Windows, Linux и многих других Unix-клонах, однако это не правило. Существуют объектно-ориентированные операционные системы, где и ядро, и интерфейс программирования написаны на объективном языке, например:
Смотрите: Объектно-ориентированная операционная система в Википедии
Обратите внимание, что в Linux можно писать драйверы ядра на языках, отличных от C (однако это не рекомендуется). Во всяком случае, все становится машинным кодом, когда дело доходит до его запуска.
"C компилируется до машинного кода и не требует поддержки во время выполнения самого языка".
Это лучшая особенность C
Я полагаю, что такие языки, как Python, Java и другие, популярны главным образом потому, что они предлагают обширные стандартные библиотеки, которые позволяют программисту кодировать решение в меньших количествах. Буквально рубиновый программист может открывать и читать файл в одной строке, где в C он принимает несколько строк. Однако под этой абстракцией находятся несколько строк. Поэтому такая же абстракция должна выполняться на языке C, и это рекомендуется. Как ни странно, кажется, что философия C не сводит к нулю общие строки кода, поэтому нет никаких организованных усилий для этого. C, как представляется, рассматривается как язык для всех процессорных чипов, и, естественно, это означает, что трудно создать любые "стандартные" абстрактные однолинейные решения. Но C позволяет вам использовать команды препроцессора #ifdef, поэтому теоретически вы можете иметь несколько вариантов реализации для нескольких процессоров и платформ в одном файле заголовка. Это не может быть для python или java. Поэтому, в то время как C не имеет причудливой стандартной библиотеки, это полезно для переносимости. Если ваша компания хочет предлагать программы, которые работают на компьютерах, встраиваемых и переносных устройствах, тогда C - ваш язык выбора. Трудно заменить C полезностью в мире.
В качестве другой заметки для машин с драйверами на других языках существует SunSpot платформа робототехники. Драйверы для подключаемых устройств (датчики, двигатели и все остальное, которые могут взаимодействовать через контакты ввода/вывода) записываются на Java пользователем.