На странице Википедии для Windows говорится, что Windows написана на ассемблере для загрузчика и переключателя задач, а C и C ++ для подпрограмм ядра.
IIRC, вы можете вызывать функции C ++ из блока extern "C"
'd'. Я могу использовать C для функций ядра, чтобы их могли использовать чистые приложения C (как printf
и тому подобное), но если они могут быть просто обернуты в extern "C "
блок, то зачем код на C?
c++
c
language-choice
kernel
Коул Джонсон
источник
источник
this
переменнойОтветы:
Это в основном по историческим причинам. Некоторые части ядра Windows изначально были написаны на C, потому что в 1983 году, более трех десятилетий назад, когда Windows 1.0 была выпущена, C ++ был выпущен с трудом. Теперь эти C-библиотеки останутся там «навсегда», потому что Microsoft сделала обратную совместимость точкой продажи, а переписывание совместимой с ошибками версии C-частей на C ++ требует огромных усилий без какой-либо эффективной выгоды.
источник
Как указывало большинство людей, причины на данный момент являются историческими, но есть кое-что еще, о чем никто не упоминает, и я полагаю, что это причина, по которой люди все еще пишут код на C для низкого уровня.
C - маленький язык в том смысле, что спецификация (относительно) коротка. C ++ огромен, и это преуменьшение. Это может не иметь большого значения для программиста (хотя я думаю, что это имеет значение), но это чрезвычайно важно, если вы хотите сделать формальную проверку . Кроме того, существуют установленные инструменты для анализа кода C, которые могут помочь предотвратить ошибки и т. Д.
И это очень важно во встраиваемом программном обеспечении, где стоимость развертываемой ошибки чрезвычайно высока по сравнению с остальной отраслью (сравните Web, где вы можете немедленно применить исправление для всех пользователей). Не говоря уже о критически важных программах и медицинских материалах.
Были попытки сместить C с его доминирующего места в низкоуровневом программировании с языками, которые даже лучше в этом, например, BitC, но они пока не увенчались успехом.
источник
источник
Причины не технические. Немного сборки неизбежно, но они не вынуждены использовать случайный C, они хотят . Моя компания использует свое собственное собственное ядро, написанное почти полностью на C ++, но нам не нужно поддерживать интерфейс C с ядром, как большинство других, потому что наше встроенное ядро монолитно скомпилировано с нашими приложениями C ++. Когда у вас есть интерфейс C, часто легче написать код интерфейса на C, даже если его можно использовать
extern "C"
для написания на C ++.Даже у нас есть небольшое количество файлов C, в основном из-за стороннего кода. Сторонний низкоуровневый код почти всегда предоставляется в C, потому что встроить код C в приложение C ++ намного проще, чем наоборот.
источник
Разработчики ядра часто относятся к тем людям, которые чувствуют себя счастливее, когда из источника сразу видно, что на самом деле делает код.
C ++ имеет гораздо больше функций, которые скрывают то, что код делает больше, чем простой код C, скрывает это: перегрузки, виртуальные методы, шаблоны, ссылки, броски ... C ++ также имеет гораздо больше синтаксиса, который вы должны освоить, чтобы даже понять C ++ код, использующий это.
Я думаю, что сила C ++ - это очень мощные инструменты для создания библиотек и фреймворков, которые затем упрощают разработку приложений. Очень часто разработчик приложений на C ++ полностью теряется во внутренних библиотеках, заполненных шаблонами, даже если он очень компетентен в создании приложений с использованием этой библиотеки. А написание правильной библиотеки C ++ - очень сложная задача программирования, и сделано она только для того, чтобы обеспечить отличную среду для разработчиков приложений. Библиотеки C ++ не являются внутренне простыми, они (или могут быть ...) просто мощными, но простыми с точки зрения программистов приложений.
Но API ядра не может быть API C ++, это должен быть API, не зависящий от языка, поэтому большинство приятных вещей в C ++ не могут быть непосредственно использованы в этом интерфейсе. Более того, ядро на самом деле не разделено на «библиотечные» и «прикладные» части, разработанные независимо, при этом больше усилий логически направляется на одну библиотеку, чтобы упростить создание массы приложений.
Кроме того, безопасность и стабильность более важны внутри ядра, а виртуальные методы гораздо более динамичны и, следовательно, намного сложнее изолировать и проверить, чем простые обратные вызовы или другие C-подобные механизмы.
Короче говоря, хотя вы, конечно, могли бы написать любую программу на C, включая ядро, как C ++, большая часть возможностей C ++ недостаточно хорошо используется в ядре. И многие утверждают, что инструменты программирования должны мешать вам делать то, что вы не должны делать. С ++ не будет.
источник
Бьярн Страуструп, в интервью в июле 1999 года :
источник
C является языком очень низкого уровня, по своему дизайну. Это один шаг от ассемблера; зная набор микросхем, на который вы нацеливаетесь, вы можете, немного зная, вручную «скомпилировать» C в ASM. Этот тип языка, близкого к металлическому, является ключевым для высокого уровня оптимизации (производительности, эффективности памяти и т. Д.). Однако, потому что это так близко к металлу, вы не получаете много бесплатно с этим языком; это процедурный, не объектно-ориентированный язык, и поэтому работа с такими конструкциями требует большого количества стандартного кода для создания и использования многозначных конструкций в памяти.
C ++ - это «лучше на один», добавляя ряд удобных функций, таких как динамическое выделение памяти, распределение встроенных структур, большая библиотека предопределенного кода и т. Д., За счет некоторых потерь в эффективности (все еще гораздо лучше чем управляемые среды выполнения). Для обычного кодера преимущества намного перевешивают недостатки в тех областях кодовой базы, которые не нуждаются в антивещественном управлении распределением памяти и т. Д.
Комбинация двух довольно традиционна; вы используете C для написания наиболее критичных для производительности и областей памяти, эффективно использующих память, с которыми вы можете работать более абстрактно с помощью вызовов методов из кода C ++, которые могут быть более элегантно организованы и спроектированы, чем Uber-Performancemant Uber-oogly оптимизированный код C.
источник
iostream
. «Слишком медленно» никогда не является хорошим оправданием для использования C над C ++.Вполне возможно, что с C вы проводите большую часть своего времени, думая о проблеме и о том, как кодировать решение. В C ++ вы в конечном итоге думаете о C ++ и его множестве функций, функций и неясного синтаксиса.
Кроме того, во многих магазинах C ++ ваш код отслеживается «полицией моды», которая увлечена последним набором шаблонов проектирования или последними неразборчивыми заявлениями великого бога Страуструпа. Красивый код становится более ценным, чем рабочий код, и поиск использования последнего набора шаблонов Boost вызывает больше восхищения, чем нахождение рабочего решения для бизнеса.
Мой опыт показывает, что при всех умных особенностях и ОО-чистоте C ++ кодирование на простом C позволяет выполнять работу быстрее и эффективнее.
источник
Возможно, что части C не очень переносимы для компилятора C ++, который используется для частей C ++. Может быть, код C дружит с компилятором C таким образом, что это нарушает компилятор C ++.
Если у вас есть качественный компилятор C ++, почти нет причин смешивать C и C ++ в проекте. Почти.
Одной из причин может быть то, что ваш проект совместно использует код C с другими проектами, код не компилируется как C ++, и вы не хотите поддерживать C ++ форк этого кода.
источник
Я думаю, что у вас это задом наперед -
extern "C"
блок гарантирует, что соглашения о вызовах C используются для всех функций в блоке. Таким образом, вы можете вызывать чистые функции C из C ++, а не функции C ++ из C. Несмотря на это, я полагаю, что причина, по которой люди используют и C, и C ++, заключается в том, что многие низкоуровневые библиотеки написаны с использованием C, и легче использовать то, что уже существует (и, по-видимому, отлажен и оптимизирован), чем писать свои собственные. OTOH, C ++ предлагает много хороших высокоуровневых функций, с которыми люди предпочитают работать, поэтому они используют это для остальных.источник
Существуют различные уровни встроенных платформ, использующих C в качестве языка программирования (конечно, вы можете свободно использовать язык ассемблера в любое время)
Для «Уровня» я говорю о внутреннем уровне ресурсов SRAM и ROM для системы.
Эти платформы иногда ограничены в ресурсах (например, некоторые платформы 8051 имеют только 128 байтов пользовательской SRAM).
Бессмысленно поддерживать динамическое выделение памяти с таким небольшим объемом оперативной памяти. (новый / удалить) или даже malloc в C.
Одним из основных улучшений от C до C ++ является объектно-ориентированная парадигма. C ++ подходит для программного обеспечения с большим объемом памяти
но не во встроенных прошивках, которые имеют ограничение по размеру до 32 КБ. (например, в 16-битной плате MCU)
Нет необходимости иметь компилятор C ++, который обычно более сложен, чем компилятор C. (по крайней мере, поставщики SDK не будут делать это).
На самом деле я едва могу найти компилятор C ++ на 32-битной платформе ARM7.
Это просто не стоит сложности
В некоторых 8051 (8 бит): 1MB ROM, 128B RAM
TI MSP430 (16 бит): 32 КБ ПЗУ, 4 КБ ОЗУ
ST Microelectronics ARM 32-разрядное ядро процессора Cortex ™ -M3 (STM32F103T4): 16 или 32 КБ флэш-памяти, 6 или 10 КБ SRAM
источник
Я вижу пару возможных причин:
Отредактировано: как выясняется, третий аргумент неверен (см. Комментарии).
источник
extern "C"
).Потому что C, возможно, лучший язык, чем C ++. И потому, что часть кода была написана до того, как C ++ стал популярным, и у людей не было причин его заменять.
И потому что C ++ имеет множество функций, которые могут сломать ваш код, если вы не будете осторожны при использовании его в ядре.
источник
[stuff] that C++ expects
. Почему C ++ использует больше кучи, чем C? Почему C ++ требует больше DLL, чем C? Просто НЕ ПРАВДА