Почему не появился более быстрый, «лучший» язык, чем С? [закрыто]


147

Со всеми новыми «современными» языками сегодня, как получается, что C по-прежнему считается самым быстрым и «самым близким к машине»? Я действительно не верю в то, что когда-либо существует только один правильный способ сделать что-то, а Си существует уже очень давно (с 60-х годов!). Разве мы не придумали ничего лучше, чем то, что было написано почти 50 лет назад?

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

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

РЕДАКТИРОВАТЬ Слушай, я не пытаюсь стучать C или любой ваш любимый язык. Мне интересно, почему C стал стандартом и почему другие альтернативы так и не появились, а C просто «приняли».


44
C ++ так же быстр и гораздо более продуктивен для записи. <3
GManNickG

6
ты не забыл про c ++?

23
Я бы сказал, что сборка самая быстрая и «ближайшая» к машине.

27
почему все движения закрываются? мне действительно любопытно ... я не пытаюсь начать пламенные войны или что-то еще
Джейсон

15
снова закрыто? после того, как его снова открыл Джефф Этвуд? почему вы хотите закрыть это?
Джейсон

Ответы:


164

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

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

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

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

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


31
Под «простым» вы подразумеваете «простой от POV компиляторов, а не POV программистов». C прост, потому что это в основном сборка с утверждениями и выражениями. Это не так просто, как Python.
Мариус

15
Но уточнить, просто для компилятора это значит просто подобрать. Возможно, не так просто реализовать сложные идеи.
GManNickG

16
Что бы ни стоило, OCaml производит высокооптимизированный нативный код примерно так же быстро, как C и C ++, а сам код такой же краткий, как и Python. С некоторой полировкой, я думаю, что OCaml мог бы соответствовать или превосходить C как язык выбора, когда вам нужно написать код для максимальной скорости и минимального использования памяти. Objective-C также делает довольно хорошую работу, хотя и не всегда так быстро, как C, он получает всю вещь "C с объектами" правильно, как C ++ никогда не мог и никогда не будет.
Джульетта

2
Согласившись с @ Thorbjørn, обратная совместимость с C - вот почему C ++ завоевал популярность, а D - нет. Если мы хотим отказаться от этого, нет никаких причин соглашаться на постепенное улучшение, то есть D. Мы могли бы пойти на гораздо лучшие языки, которые полностью не относятся к семейству C. Как говорит @Juliet, OCaml может быть достойным соперником в плане производительности. Но то же самое можно сказать и о многих других языках, если авторы компиляторов потратили на них столько же времени, сколько и на C или C ++. В любом случае, хороший ответ и +1 от меня.
Джалф

5
@Ferruccio: Да, но каждый язык может ссылаться на библиотеки C. Поэтому, если мы готовы согласиться с этим, вместо фактической совместимости исходного кода, как предлагает C ++ (более или менее), то мы могли бы также выбрать совершенно другой язык, скажем, Haskell или Python. Причиной для C ++ стало то, что он может ссылаться на библиотеки C. Это было то, что он мог скомпилировать C-код.
jalf

64

Есть быстрее чем языки Си.

Есть языки быстрее, чем C. Например, Fortran, как уже упоминалось, работает очень хорошо, потому что у него гораздо более ограниченные правила языка псевдонимов.

Существуют также экспериментальные ассемблеры, такие как языки, которые атакуют C на фронте, где он используется как язык ассемблера высокого уровня, например, для создания компилятора. Ты когда-нибудь слышал о Си или о Янусе? Но эти двое были убиты проектом LLVM.

Могу поспорить, что APL или другие математические языки выдувают C из воды в специальных областях приложения, поскольку они имеют встроенную поддержку модулей обработки Vector. Это то, что невозможно для C (и ребята: НЕТ! Специальные оптимизированные библиотеки со связью C не имеют ничего общего с C как языком).

Также производители процессоров удалили все, что помогло авторам компиляторов на других языках - помните помеченные арифметические коды ассемблера для быстрой реализации LISP на SPARC? Унесенные ветром.

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

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

Просто сравните вызов qsort для мегабайтного массива целых чисел с хорошей рукописной реализацией, использующей доступ к массиву и встроенный оператор «<».


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

1
Спасибо, я забыл упомянуть невозможность вернуть несколько значений результата. Еще один низкоуровневый аспект, который мне не хватает при использовании его в качестве ассемблера высокого уровня.

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

1
@Rascher: Все верно, и вы видите влияние C на разработчиков ЦП, которые всегда определяют ABI ЦП. А множественные возвращаемые значения - это то, что просто не приходит в голову, даже если количество регистров не будет проблемой (SPARC, PowerPC, Itanium)

13
Псевдоним указателя в C был рассмотрен restrictв C99 (10 лет назад!).

35

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

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

  • C раньше был языком для написания кода сервера. Сеть вытеснила удивительное разнообразие языков в это пространство - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - и случаи, когда C имеет какой-либо смысл для серверного кода, сейчас немногочисленны.

  • C используется для научных вычислений, но он сталкивается с конкуренцией со стороны предметно-ориентированных языков, таких как Matlab и Mathematica, а также библиотек, таких как SciPy . Многие люди, которые пишут код в этой нише, не являются программистами по профессии, и C не очень подходит для них.

Но ниша C - системный код. Ядра операционной системы. Драйверы. Динамические библиотеки. В этом пространстве так установлено, что даже C ++ смещает его довольно медленно.

C победил в 1970-х годах благодаря UNIX, потому что конкурирующие языки были либо слишком ограничивающими, либо слишком медленными, а также потому, что код C считался достаточно переносимым (вранье даже тогда). Но его самые большие преимущества сегодня не связаны, и проистекают главным образом из десятилетий доминирования над его нишей. Существуют хорошие инструменты для C: оптимизация компиляторов, отладчиков ядра, эффективный статический анализ для поиска ошибок в коде драйвера и т. Д. Почти каждая крупная платформа определяет C ABI, и часто это является языком общения для библиотек. Есть пул программистов, которые знают, как кодировать C - и кто знает, в чем проблемы и подводные камни C.

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


9
C по-прежнему широко используется для серверного кода. Существует не только Интернет, большинство серверов DNS, электронной почты и т. Д.

@bortzmeyer: Хотя Apache довольно стар. Я не говорю, что это бесполезно или было заменено, оно было просто создано, когда был C, и не было много хороших альтернатив.
Macke

1
Мне любопытно, почему вы считаете C "не очень подходящим" для научных вычислений. По общему признанию, Python приятнее работать, но я обнаружил, что C является надежной альтернативой, когда требуется более быстрый код и многие из возможных альтернатив (C ++) не приносят огромного количества в таблицу, в отличие от других аспектов программирования. ,
Fomite

1
Помимо этого, количество вещей в SciPy / NumPy и т. Д., Которые написаны на C, уже делает это полезным знать.
Fomite

1
@EpiGrad Может быть, C является хорошей альтернативой для вас. Но у C очень крутая кривая обучения, особенно для людей, которые не имеют опыта программирования. В частности, иногда происходит сбой, и если вы не программист, у вас мало надежды на то, чтобы понять это. Mathematica облегчает написание огромного количества вещей, и вы в итоге получаете меньше кода в сотни раз. И это не терпит крах.
Джейсон Орендорфф

25

Перефразируя очень хороший комментарий: не так много разных способов сделать язык быстрым и «близким к машине» - С справился с этим хорошо, и вряд ли есть место для этого.

Оригинальный ответ:

Быстро выполнить или быстро писать вещи в?

Языки не являются быстрыми или медленными для выполнения, есть конкретные реализации. Язык можно считать более быстрым, чем другие, когда он каким-то образом облегчает быстрые реализации . Неизменно это означает «близко к машине». Но с быстрым экспоненциальным увеличением скорости машин со временем становится все менее интересным. Вместо этого легкость и скорость разработки и мобильность стали гораздо важнее, поэтому «лучше» стало означать «вдали от машины» . За последние 5 десятилетий почти все усилия в области языкового дизайна были направлены в этом направлении.

Итак, вы: ближе к машине и существуют более быстрые языки, чем С; это те, что были до C : Assembler, Fortran. Вероятно, некоторые из них забыты.


@michael - но все еще существует рынок сверхлегких, сверхбыстрых программ, особенно с натиском всех этих мобильных устройств ... почему C по-прежнему является лучшим вариантом для некоторых из этих устройств, т. е. почему нет другого на уровне языка, например .NET-vs-Python-esque?
Джейсон

5
Лисп. Дремлющий, но не забытый! :)

2
@Jason: Вопрос в том, сколько портативных ассемблеров вам нужно? C хорошо известен, и очень сложно написать язык с более быстрой реализацией, так зачем беспокоиться? В разговорной речи нет требований, нет рынка, нет мотивации.

4
@ Майкл, извиняюсь за комментирование твоего ответа. Причина, лежащая в основе python / ruby ​​/ java и т. Д., Заключается в том, что, как только вы перестанете пытаться выбрать наиболее эффективный из возможных языков, вы получите гораздо больше опций относительно того, какие функции следует расставлять по приоритетам, и каждый подход может дать новый язык. Существует гораздо меньше способов написать самый быстрый язык.

1
-1 для «и вряд ли есть место для этого» - есть много возможностей для улучшения C / C ++ без ущерба для производительности.
BlueRaja - Дэнни Пфлюгофт

21

Fortran быстрее, чем C, для численных задач из-за способа обработки ссылок на память (указатели на C труднее оптимизировать). Тяжелые числовые библиотеки в основе таких вещей, как Matlab и Numpy, все еще написаны на Фортране.

С другой стороны, C ++ может быть таким же быстрым, как C, но имеет гораздо более продвинутые возможности программирования. Это гораздо более новый язык, с середины 80-х годов.


1
И C ++ все еще обновляется.
GManNickG

5
@GMan: как и С.


3
Поправьте меня, если я ошибаюсь, но разве у restrictуказателя C99 нет такой же семантики псевдонимов, как у Fortran? И что еще есть, что имеет значение?

9
Я думаю, что идея о том, что Fortran быстрее, чем C, несколько мифична, в зависимости от того, что кодируется и кто это делает. Причина, по которой тяжелые числовые библиотеки есть в Фортране, не в том, что Фортран работает быстрее, а в том, что подпрограммы изначально были написаны на Фортране, и немногие люди имеют смелость или необходимость переписывать их. Небольшое количество математических гуру, которые пишут и проверяют эти алгоритмы, счастливы в Фортране и не видят необходимости менять, тем более что они думают, что Фортран работает быстрее.
Майк Данлавей

16

Какого черта, я прибавлю свои 0,02 доллара.

Во многих случаях существует реальная или предполагаемая разница между языками «систем» и языками более высокого уровня. Я буду игнорировать большинство языков «более высокого уровня», поскольку никто (по крайней мере, не многие) будет утверждать, что для многих задач такие языки, как Python, Ruby и т. Д., Проще в работе.

C был разработан как системный язык, то есть он был разработан как язык, на котором была написана операционная система Unix. Таким образом, он был разработан как простой, мощный и быстрый. Простой язык приобретает силу благодаря тому, что не системные программисты часто считают опасными: указатели, ручное управление памятью и т. Д. Как уже упоминалось, C довольно прост. K & R - самая маленькая книга на моей программной полке (не считая ссылок на O'Reilly Pocket), и она лишь немного «больше», чем моя Ruby Pocket Reference. С довольно мощный. Если вам нужно поговорить с аппаратным обеспечением, проверьте вручную и переключитесь с памятью и т. Д. C имеет такую ​​возможность.

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

В некоторых случаях, особенно когда текущий «стандарт» столь же «достаточно хорош», как и С, просто нет большого стимула для чего-то «лучшего» (C ++, Objective-C, D и т. Д.) Набирать обороты, когда даже достаточно стимула для создания чего-то «лучшего».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.