Почему операционные системы занимаются низкоуровневыми работами на C и C ++? Почему не просто C ++?

На странице Wikipedia для Windows указано, что Windows написана в сборке для загрузчика и переключателя задач, и C и C ++ для подпрограмм ядра.

IIRC, вы можете вызывать функции C ++ из блока extern "C" 'd. Я могу использовать C для функций ядра, поэтому чистые приложения C могут их использовать (например, printf и т. Д.), Но если они могут быть просто завернутый в блок extern "C ", то почему код в C?

20 голосов | спросил Cole Johnson 10 MonEurope/Moscow2012-12-10T21:32:10+04:00Europe/Moscow12bEurope/MoscowMon, 10 Dec 2012 21:32:10 +0400 2012, 21:32:10

12 ответов


31

Это в основном по историческим причинам. Некоторые части ядра Windows были первоначально написаны на C, потому что 1983 год, более трех десятилетий назад, когда Windows 1.0 был выпущен , C ++ был едва выпущен. Теперь эти C-библиотеки останутся там «навсегда», потому что Microsoft сделала обратную совместимость точкой продажи и переписала совместимую с ошибкой версию C-частей на C ++, требует огромных усилий без какой-либо эффективной выгоды.

ответил back2dos 10 MonEurope/Moscow2012-12-10T21:58:23+04:00Europe/Moscow12bEurope/MoscowMon, 10 Dec 2012 21:58:23 +0400 2012, 21:58:23
24

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

C - небольшой язык в том смысле, что спецификация (относительно) коротка. C ++ огромный , и это преуменьшение. Это может быть не так важно программисту (хотя я думаю, что это так), но очень важно, если вы хотите сделать официальную проверку . Кроме того, существуют инструменты для анализа кода C, которые могут помочь предотвратить ошибки и т. Д.

И это очень важно во встроенном программном обеспечении, где стоимость развернутой ошибки чрезвычайно высока по сравнению с остальной частью отрасли (сравните Web, где вы можете сразу применить патч для всех пользователей). Не говоря уже о критически важных программных и медицинских материалах.

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

ответил K.Steff 11 TueEurope/Moscow2012-12-11T04:33:26+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 04:33:26 +0400 2012, 04:33:26
15
  1. Время выполнения C намного меньше.
  2. Перевод C ++ в конструкции нижнего уровня менее прозрачен, чем на C. (См. ссылки и vtables для двух быстрых примеров)
  3. C обычно имеет стабильный ABI. C ++ обычно этого не делает. Это означает, что на минимальном уровне интерфейс системного вызова должен быть стилем C. Кроме того, если вам нужны какие-либо динамические модули, поддержка согласованного ABI очень помогает.
ответил wnoise 11 TueEurope/Moscow2012-12-11T11:17:12+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 11:17:12 +0400 2012, 11:17:12
6

Разработчики ядра часто являются людьми, которые чувствуют себя более счастливыми, когда сразу видно из источника, что на самом деле делает код.

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

Я думаю, что мощь C ++ - очень мощные инструменты для создания библиотек и фреймворков, которые затем делают разработку приложений быстрой. Очень часто разработчик приложений C ++ полностью терялся в заполненных шаблоном внутренних библиотеках, даже когда он очень компетентен при создании приложений с использованием этой библиотеки. И написание права на библиотеку C ++ является очень сложной задачей программирования и сделано только для того, чтобы обеспечить отличную структуру в интересах разработчика приложений. Библиотеки C ++ не являются внутренне простыми, они (или могут быть ...) просто мощными, но простыми с точки зрения программистов приложений.

Но API-интерфейс ядра не может быть C ++ API, он должен быть API-интерфейсом с языками, поэтому большинство приятных вещей на C ++ не могут быть непосредственно использованы в этом интерфейсе. Кроме того, ядро ​​на самом деле не разделено на части «библиотека» и «приложение», разработанные независимо друг от друга, с большим количеством усилий, логически идущими в одну библиотеку, чтобы упростить создание множества приложений.

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

Короче говоря, хотя вы, конечно, могли бы написать любую C-программу, включая ядро ​​как C ++, большая часть возможностей C ++ не очень хорошо используется в ядре. И многие утверждают, что инструменты программирования должны помешать вам делать то, что вам не нужно делать. C ++ не будет.

ответил hyde 11 TueEurope/Moscow2012-12-11T17:37:18+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 17:37:18 +0400 2012, 17:37:18
5

Bjarne Stroustrup, в интервью в июле 1999 года :

  

Ни один из этих языков не был радикально иным или резко   лучше других современных языков. Они были, однако, хорошими   достаточно и бенефициаров удачи и социальных факторов

ответил david 11 TueEurope/Moscow2012-12-11T09:39:08+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 09:39:08 +0400 2012, 09:39:08
3

C - язык очень низкого уровня по его дизайну. Это один шаг от ассемблера; зная, какой набор микросхем вы нацеливаете, вы могли бы, с небольшими знаниями, вручную «скомпилировать» C в ASM. Этот тип «близкого к металлу» языка является ключевым для высоких уровней оптимизации (для производительности, эффективности памяти и т. Д.). Однако, поскольку это близко к металлу, вы не получаете много свободного с этим языком; это процедурный, не объектно-ориентированный язык, и, таким образом, для работы с такими конструкциями требуется много кода шаблона для создания и использования многозначных конструкций в памяти.

C ++ - это «C один лучше», добавив ряд удобных функций, таких как распределение динамической памяти, встроенная структура маршаллинга, большая библиотека предопределенного кода и т. д. за счет some потери эффективности (все же намного лучше, чем среды с управляемым временем выполнения). Для среднего кодера преимущества намного перевешивают недостатки в областях кодовой базы, которые не нуждаются в анал-ретентивном управлении распределением памяти и т. Д.

Комбинация двух довольно традиционная; вы используете C для написания наиболее критически важных для работы с памятью областей кода, которые затем вы можете работать более абстрактно, используя вызовы методов из кода C ++, которые могут быть более элегантно организованы и разработаны, чем uber-performant , оптимизированный по Uber-oogly код C.

ответил KeithS 10 MonEurope/Moscow2012-12-10T22:13:16+04:00Europe/Moscow12bEurope/MoscowMon, 10 Dec 2012 22:13:16 +0400 2012, 22:13:16
1

Возможно, с C вы проводите большую часть своего времени, думая о проблеме и о том, как закодировать решение. В C ++ вы в конечном итоге думаете о C ++ и его множестве функций, функций и непонятного синтаксиса.

Кроме того, во многих магазинах C ++ ваш код контролируется «полицией моды», которая увлекается последним набором шаблонов дизайна или последними непонятными высказываниями великого бога Страуструпа. Достойный код становится более ценным, чем рабочий код, поиск последнего набора шаблонов Boost восхищается больше, чем поиск рабочего решения для бизнеса.

Мой опыт заключается в том, что для всех умных функций и чистоты OO C ++ кодирование в простой C быстрее и эффективнее выполняет работу.

ответил James Anderson 6 FebruaryEurope/MoscowbWed, 06 Feb 2013 05:52:15 +0400000000amWed, 06 Feb 2013 05:52:15 +040013 2013, 05:52:15
0

Возможно, что части C не очень удобны для компилятора C ++, который используется для частей C ++. Может быть, C-код является chummy с компилятором C способами, которые ломаются с компилятором C ++.

Если у вас есть качественный компилятор C ++, почти нет причин смешать C и C ++ в проекте. Почти.

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

ответил Kaz 11 TueEurope/Moscow2012-12-11T09:54:36+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 09:54:36 +0400 2012, 09:54:36
-1

Я думаю, что у вас есть это в обратном направлении - блок extern "C" гарантирует, что соглашения о вызове C используются для всех функций внутри блока. Таким образом, вы можете вызывать чистые C-функции из C ++, а не C ++-функций из C. Несмотря на это, я полагаю, что причина, по которой люди используют C и C ++, состоит в том, что множество низкоуровневых библиотек написано с использованием C, и проще использовать что-то, что уже существует (и предположительно отлаживается и оптимизируется), чем написание собственного. OTOH, C ++ предлагает множество хороших функций высокого уровня, с которыми люди скорее будут работать, поэтому они используют это для остальных.

ответил TMN 10 MonEurope/Moscow2012-12-10T21:47:02+04:00Europe/Moscow12bEurope/MoscowMon, 10 Dec 2012 21:47:02 +0400 2012, 21:47:02
-2

Существуют различные уровни встроенных платформ, использующих C в качестве языка программирования (конечно, это ваша свобода использовать язык ассемблера в любое время)

В «Уровне» я говорю о внутреннем уровне ресурсов SRAM и ROM для системы.

Эти платформы иногда ограничены ресурсами (например, на некоторых платформах 8051 имеется только 128 байт пользовательской SRAM).

Бессмысленно поддерживать динамическое распределение памяти с такой небольшой суммой для ОЗУ. (new /delete) или даже malloc в C.

Одним из основных улучшений от C до C ++ является объектно-ориентированная парадигма. C ++ подходит для программного обеспечения с большим объемом памяти

, но не во встроенной прошивке, размер которой ограничен до 32 КБ. (например, в 16-битной пластине MCU)

Нет необходимости иметь компилятор C ++, который, как правило, более сложный, чем компилятор C. (по крайней мере, поставщики SDK не потрудились сделать это).

На самом деле я вряд ли смогу найти компилятор C ++ по 32-разрядной платформе ARM7.

Это просто не стоит сложности

В некоторых 8051 (8 бит): 1 МБ ROM, 128 Б оперативной памяти

TI MSP430 (16 бит): 32 КБ ROM, 4 КБ RAM

ST Microelectronics ARM 32-разрядный процессор Core Captex ™ -M3 (STM32F103T4): 16 или 32 Кбайт флэш-памяти 6 или 10 Кбайт SRAM

ответил ansonchau 9 J000000Wednesday14 2014, 13:26:20
-4

Я вижу пару возможных причин:

  • C немного более эффективен, если сравнивать с эквивалентом C ++.
  • Некоторые библиотеки, которые они используют, написаны на C.
  • Они используют некоторые части ядра Linux, которые написаны на C.

Отредактировано: Как оказалось, третий аргумент неверен (см. Комментарии).

ответил Pijusn 10 MonEurope/Moscow2012-12-10T21:53:54+04:00Europe/Moscow12bEurope/MoscowMon, 10 Dec 2012 21:53:54 +0400 2012, 21:53:54
-4

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

И поскольку у C ++ есть много функций, которые могут сломать ваш код, если вы не будете осторожны при использовании его в ядре.

ответил Minthos 10 MonEurope/Moscow2012-12-10T21:46:43+04:00Europe/Moscow12bEurope/MoscowMon, 10 Dec 2012 21:46:43 +0400 2012, 21:46:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132