Почему C ++ обратно совместим с C? Почему нет «чистого» языка C ++? - PullRequest
11 голосов
/ 01 января 2011

C и C ++ - это разные языки, блабабла, мы это знаем.

Но если эти языки отличаются, почему все еще возможно использовать функцию, подобную malloc или free? Я уверен, что в C ++ есть все что-то пыльное из-за C, но, поскольку C ++ - это другой язык, почему бы не удалить эти вещи, чтобы сделать его немного менее раздуваемым и более чистым и ясным?

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

Ответы [ 10 ]

22 голосов
/ 01 января 2011

Потому что C ++ был бы совершенно мертвым, если бы он не был совместим с C, как сейчас. Никто, кроме фанатов, не хотел бы C ++, если он не будет совместим с C.

16 голосов
/ 01 января 2011

О том, «почему нет« чистого »языка C ++ ... Ну, по крайней мере, один. Самый популярный из них называется D, он великолепен, хорошо продуман, многофункциональн и приятен для программированияможет использовать с ним библиотеки C.

Ах, и почти никто не использует это.их унаследованного кода для более современных и, как вы описали, «чистых» языков, таких как D.

7 голосов
/ 01 января 2011

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

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

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

7 голосов
/ 01 января 2011

Он спроектирован так, что вы можете портировать код C и напрямую скомпилировать его как код C ++, и он позволяет постепенно обновлять существующий код. Если в C ++ не было malloc / free, вы не могли бы скомпилировать существующий код C как C ++, потому что вам пришлось бы заплатить какую-то плохую чушь, чтобы пройти и найти все вызовы malloc и заменить их, что дорого.

5 голосов
/ 01 января 2011

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

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

Если вы хотите «чистый» C ++, вы можете просто использовать C ++ без вызова каких-либо библиотек C.

[Как уже говорили другие с тех пор, как я начал печатать это: Design & Evolution of C ++ - это хорошее место, чтобы начать читать с фона.]

4 голосов
/ 01 января 2011

Я предлагаю вам взглянуть на Design & Evolution C ++ , чтобы лучше понять причину, по которой язык оказался таким, какой он есть.Существуют исторические причины, по которым C ++ вырос из C и стал обратно совместимым с ним.

3 голосов
/ 01 января 2011

Ранние версии C ++ были построены поверх C, и фактически компилятор переводил код C ++ в C, который в свою очередь компилировался локальным компилятором C.Бьярн Страуструп - большой сторонник обратной совместимости и, я уверен, будет противостоять любым попыткам лишить функциональности.

Вы можете прочитать все об этом в книге Бьярне Дизайн и развитие C ++ .

1 голос
/ 02 января 2011

malloc() и free() необходимы для того, чтобы вы могли обращаться к библиотекам языка C из кода C ++. Библиотека языка C может возвращать указатель на память, выделенную с помощью malloc(), которая должна быть освобождена вызывающей стороной с помощью free(); или, реже, может потребоваться указатель на память, выделенную с помощью malloc(), которую он может перераспределить внутренне с помощью realloc() или освободить с помощью free().

1 голос
/ 02 января 2011

Все правы.Подводя итог: причина в политике .Если вы хотите, чтобы что-то было популярным, улучшите то, что уже популярно, и у вас есть готовый рынок.Спроектируйте что-то новое, и никто не заинтересуется, если вы не Sun, спроектируйте какую-то чушь, но вложите миллиарды долларов в развитие библиотек и маркетинг.

1 голос
/ 01 января 2011

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

Что вы делаете, так это рассматриваете такие языки, как C # или Python, и удивляетесь, почему C ++ не похож на них, но забыличто для достижения этой цели нужны ступеньки, такие как C ++ и Java, или Awk и Perl.

Чтобы адаптировать цитату, о которой я слышал ранее: C # - версия Microsoft для версии Sun для идиотов от Sun, версия Bell для C-Симула.

...