Со всеми новыми «современными» языками сегодня, как получается, что C по-прежнему считается самым быстрым и «самым близким к машине»? Я действительно не верю в то, что когда-либо существует только один правильный способ сделать что-то, а Си существует уже очень давно (с 60-х годов!). Разве мы не придумали ничего лучше, чем то, что было написано почти 50 лет назад?
Мне известно, что современные языки являются высокоуровневыми и занимаются определенными задачами, такими как сборка мусора и выделение памяти, и используют библиотеки и тому подобное. Я просто спрашиваю, почему никогда не было истинного второго варианта C.
Может ли быть так, что C настолько совершенен, что никакие другие способы управления компьютером не могут быть возможны (за исключением принятия разработчиками)?
РЕДАКТИРОВАТЬ Слушай, я не пытаюсь стучать C или любой ваш любимый язык. Мне интересно, почему C стал стандартом и почему другие альтернативы так и не появились, а C просто «приняли».
Ответы:
C - очень простой язык, и благодаря этому, наряду с его долговечностью, он быстр и оптимизирован. Он также чрезвычайно широко поддерживается в отношении встроенных сред, микропроцессоров и т. Д.
Трудно обыграть действительно простой и быстрый язык. Единственное, что можно улучшить в таком языке - это удобство использования: сократить время, необходимое для создания аналогичного универсального кода, и упростить моделирование с помощью абстракций.
Вот где приходит C ++. C ++ может быть таким же быстрым, как и C. Дело в том, что C ++ - гораздо более сложный язык, что означает, что он определенно увеличивает производительность; до тех пор, пока люди знают, как его использовать. C ++ и C больше не являются почти одним и тем же языком.
Теперь, D был еще один шаг вверх. Та же возможность быстрого кода, необязательной сборки мусора и т. Д., Но она никогда не завоевывала популярность. Надеюсь, что это изменится, потому что оно отбрасывает то, что мучает C ++: обратную совместимость с C.
Поэтому, чтобы ответить на ваш вопрос, «лучше» сложно судить. С точки зрения простоты и скорости, C, вероятно, близок к лучшему, что мы могли бы сделать. С точки зрения производительности в сравнении с простотой, C ++, вероятно, лучше, чем мы могли бы сделать, хотя это мнение значительно отличается. Наконец, с точки зрения усовершенствованного и очищенного языка со скоростью и простотой C, D побеждает в этом контексте.
источник
Есть быстрее чем языки Си.
Есть языки быстрее, чем C. Например, Fortran, как уже упоминалось, работает очень хорошо, потому что у него гораздо более ограниченные правила языка псевдонимов.
Существуют также экспериментальные ассемблеры, такие как языки, которые атакуют C на фронте, где он используется как язык ассемблера высокого уровня, например, для создания компилятора. Ты когда-нибудь слышал о Си или о Янусе? Но эти двое были убиты проектом LLVM.
Могу поспорить, что APL или другие математические языки выдувают C из воды в специальных областях приложения, поскольку они имеют встроенную поддержку модулей обработки Vector. Это то, что невозможно для C (и ребята: НЕТ! Специальные оптимизированные библиотеки со связью C не имеют ничего общего с C как языком).
Также производители процессоров удалили все, что помогло авторам компиляторов на других языках - помните помеченные арифметические коды ассемблера для быстрой реализации LISP на SPARC? Унесенные ветром.
И если вы перейдете от микропроцессоров к разработке приложений, то есть более быстрые языки для разработки приложений. Мой личный пример здесь всегда SmartEiffel. Он нацелен на C, но использует глобальную системную оптимизацию, которая делает его быстрее, чем C, в реальной разработке приложений.
В этой области даже простая неправильная или низкоуровневая абстракция может убить всю производительность языка. Поскольку C не предлагает высоких абстракций, большинство людей говорят, что это проблема программирования, но это не так. Например, посмотрите на отсутствие генериков. В C вы получите медленные реализации, такие как библиотечная функция «qsort», которая может быть записана на порядок быстрее с помощью обобщений (где исключен вызов функции для сравнения ключей).
Просто сравните вызов qsort для мегабайтного массива целых чисел с хорошей рукописной реализацией, использующей доступ к массиву и встроенный оператор «<».
источник
restrict
в C99 (10 лет назад!).Хороший вопрос. Я думаю, что языки преуспевают, находя нишу. Важно отметить, что есть много новых языков, которые лучше, чем 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.
В долгосрочной перспективе эта ниша не уходит; и С имеет некоторые проблемы. Но для любого новичка все равно будет чрезвычайно сложно конкурировать.
источник
Перефразируя очень хороший комментарий: не так много разных способов сделать язык быстрым и «близким к машине» - С справился с этим хорошо, и вряд ли есть место для этого.
Оригинальный ответ:
Быстро выполнить или быстро писать вещи в?
Языки не являются быстрыми или медленными для выполнения, есть конкретные реализации. Язык можно считать более быстрым, чем другие, когда он каким-то образом облегчает быстрые реализации . Неизменно это означает «близко к машине». Но с быстрым экспоненциальным увеличением скорости машин со временем становится все менее интересным. Вместо этого легкость и скорость разработки и мобильность стали гораздо важнее, поэтому «лучше» стало означать «вдали от машины» . За последние 5 десятилетий почти все усилия в области языкового дизайна были направлены в этом направлении.
Итак, вы: ближе к машине и существуют более быстрые языки, чем С; это те, что были до C : Assembler, Fortran. Вероятно, некоторые из них забыты.
источник
Fortran быстрее, чем C, для численных задач из-за способа обработки ссылок на память (указатели на C труднее оптимизировать). Тяжелые числовые библиотеки в основе таких вещей, как Matlab и Numpy, все еще написаны на Фортране.
С другой стороны, C ++ может быть таким же быстрым, как C, но имеет гораздо более продвинутые возможности программирования. Это гораздо более новый язык, с середины 80-х годов.
источник
restrict
указателя C99 нет такой же семантики псевдонимов, как у Fortran? И что еще есть, что имеет значение?Какого черта, я прибавлю свои 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 и т. Д.) Набирать обороты, когда даже достаточно стимула для создания чего-то «лучшего».
источник