Почему использование C? [закрытый]

Обратите внимание, что следующее эквивалентно, но одинаково неприятно:

printf("%d\n", (&a)[1][-1]);

В этом случае, на мой взгляд, более явно, что происходит:

указатель на массив a берется

  • указатель используется, как если бы он был массивом: массив элементов наподобие a, то есть массивы из 4 целых чисел, используется 1-й элемент этого массива.

  • Поскольку a на самом деле не массив, а только один элемент (состоящий из четырех подэлементов!), Это индексирует часть памяти сразу после

  • [ -1] читает целое число непосредственно перед памятью непосредственно после a, которое является последним подэлементом в

10
задан z - 12 June 2009 в 18:56
поделиться

11 ответов

C компилируется до машинного кода и не требует поддержки во время выполнения для самого языка. Это означает, что можно написать код, который может работать до того, как появятся такие вещи, как файловые системы, виртуальная память, процессы и все остальное, кроме регистров и ОЗУ.

24
ответ дан 3 December 2019 в 13:09
поделиться

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

Большинство операционных систем имеют ядро, написанное на C, а приложения - на нем. кроме того, что написано на C, C ++, C # или Obj-C

14
ответ дан 3 December 2019 в 13:09
поделиться

C - безусловно, самый простой язык (кроме ассемблера) для "работы" на голом оборудовании. С C (при условии, что у вас есть 32-битный загрузчик, такой как GRUB, для переключения жесткого режима) все, что вам нужно сделать, это создать небольшой файл crt0.asm, который устанавливает стек, и все (вы получаете язык, не включая libc) . С C ++ вы должны беспокоиться о динамических приведениях, исключениях, глобальных конструкторах, переопределении new и т. Д. С C # вы должны переносить среду выполнения .Net (которая сама по себе в основном требует ядра), и я не уверен в Obj-C , но я уверен, что у него также есть некоторые требования ...

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

13
ответ дан 3 December 2019 в 13:09
поделиться

«почему мы используем язык C для написания драйверов и кодов ОС?»

Так что программистам не придется изучать новый синтаксис каждого нового языка ассемблера для каждого нового типа машина.

«Существуют ли какие-либо драйверы, написанные на каких-либо других языках?»

Исторически сложилось так, что языки ассемблера. Я не помню, можно ли было использовать PL / S или BLISS для драйверов. Возможно B. В наше время несколько смелых людей используют C ++, но им нужно быть очень осторожными. В некоторых ситуациях C ++ проще использовать в драйверах пользовательского режима.

13
ответ дан 3 December 2019 в 13:09
поделиться

In критически важные для безопасности среды (например, авионика, космические корабли, медицинские устройства, транспорт, программное обеспечение для управления технологическим процессом), системы (а также драйверы) часто пишутся с использованием Ada или даже SPARK / Ada .

Для пояснения: C обычно понимается как довольно низкий уровень, и в значительной степени похож на «макроязык» для самого ассемблера, вот в чем его сила (скорость, размер, переносимость).

Ада, с другой стороны, была специально разработана для приложений, критически важных для безопасности, с учетом возможности проверки, если цитировать Ада 2005 для критически важных систем :

Ада [9] - это язык является выбором для многих критически важных систем благодаря тщательному проектированию и существованию четких руководящих принципов по созданию систем с высокой степенью целостности [10]

. Именно здесь появляется поддержка Ada строгой типизации, а также ряд других важных функций (цитируется конструкция для безопасности ): их пригодность для использования в системы, связанные с безопасностью. Carré et al. определены шесть факторов, влияющих пригодность языка для приложения с высоким уровнем целостности [Carré 1990]. Это:

  • Логическая надежность
  • Сложность определения
  • Выразительная сила
  • Безопасность
  • Проверяемость
  • Ограниченные временные и пространственные ограничения

Ни один стандартный язык программирования не работает хорошо во всех этих областях, хотя некоторые (например, Паскаль и Ада) много лучше, чем такие языки, как C или C ++. В критически важных приложениях "проверяемость" имеет большое важность. Некоторые языки позволяют мощные инструменты проверки программного обеспечения использоваться для выполнения широкого спектра статические тесты кода для обнаружения диапазон ошибок программирования. [...] An важный вопрос при выборе язык программирования - это качество доступные компиляторы и другие инструменты. Для некоторых языков подтверждено компиляторы доступны. В то время как не гарантия совершенства, проверка значительно увеличивая нашу уверенность в инструмент. К сожалению, подтверждено компиляторы доступны только для ограниченное количество языков, например Ада и Паскаль. В дополнении к компиляторы, разработчики критических системы будут использовать ряд другие инструменты, такие как статический код пакеты анализа. Статические тесты что может быть выполнено на куске код сильно различается в зависимости от используемый язык. Чтобы помочь этому процессу, часто ограничивают функции которые используются в определенных языках к «безопасному подмножеству» языка. Хорошо структурированные и определенные языки такие как подмножества Ады, Паскаля и Модула-2 позволяет проводить множество тестов. выполняться, например, поток данных анализ, анализ использования данных, анализ информационного потока и диапазон проверка. К сожалению, многие из них тесты нельзя проводить на языках такие как C и C ++.

Более подробное рассмотрение вопроса выходит за рамки этого вопроса, но вы можете проверить некоторые из следующих указателей:

Если кто-то хочет еще раз изучить Ada, ознакомьтесь с этим: Программирование на Ada (викиучебники)

Есть даже языки программирования, специально разработанные для особо важных приложений, такие как JOVIAL или HAL / S , последний из которых используется программой космического шаттла.

Существуют ли какие-либо драйверы, написанные на каких-либо других языках?

Я видел некоторые драйверы Linux для специального оборудования, написанные на Ada , но не знаю о других операционных системах. Однако такие драйверы обычно завершают работу с API C.

22
ответ дан 3 December 2019 в 13:09
поделиться

Lisp machines had their operating systems written in Lisp, which shows that you don't have to use C or assembly. The Lisp machine business was destroyed by the availability of cheap PCs, whose operating systems were of course written in C and assembly.

11
ответ дан 3 December 2019 в 13:09
поделиться

Помните, что C изначально был разработан для написания операционных систем (в в данном случае - Unix) и тому подобное на низком уровне. Он очень близок к архитектуре системы и не содержит каких-либо дополнительных функций, которые мы хотим контролировать, как именно они работают. Однако обратите внимание, что остальная часть операционной системы, включая библиотеки программирования, не обязательно должна быть написана на том же языке, что и ядро. Функции ядра предоставляются через систему прерываний, и на самом деле такие библиотеки программирования могут быть написаны на любом языке, поддерживающем фрагменты ассемблера.

Самые популярные операционные системы в настоящее время написаны на C: Windows, Linux и многих других клонах Unix, однако это не правило. Есть некоторые объектно-ориентированные операционные системы, в которых и ядро, и программный интерфейс написаны на объективном языке, например:

  • NeXTSTEP - Objective-C
  • BeOS - C ++
  • Syllable - C ++

См .: Объектно-ориентированная операционная система в Википедии

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

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

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

3
ответ дан 3 December 2019 в 13:09
поделиться

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

4
ответ дан 3 December 2019 в 13:09
поделиться

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

8
ответ дан 3 December 2019 в 13:09
поделиться

Еще одно примечание для машин с драйверами на других языках: робототехническая платформа SunSpot . Драйверы для подключенных устройств (датчики, двигатели и все остальное, что может обмениваться данными через контакты ввода-вывода) написаны пользователем на Java.

0
ответ дан 3 December 2019 в 13:09
поделиться

«C компилируется до машинного кода и не требует поддержки во время выполнения для самого языка.»

Это лучшая функция C

2
ответ дан 3 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

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