Чому не вийшла більш швидка, "краща" мова, ніж C? [зачинено]


147

З усіма новими "сучасними" мовами сьогодні, як це все-таки оголошується C як найшвидший і "найближчий до машини"? Я насправді не вірю в те, що коли-небудь існував лише один правильний спосіб робити речі, і C існує вже дуже довго (з 60-х!). Хіба ми насправді не придумали нічого кращого, ніж щось написане майже 50 років тому?

Я знаю, що сучасні мови вищого рівня і піклуються про певні завдання, такі як збирання сміття та розподіл пам’яті, а також використовують бібліотеки тощо. Я просто запитую, чому ніколи не було справжнього другого варіанту для C.

Чи може бути, що C настільки досконалий, що жоден інший спосіб керування комп'ютером не міг бути неможливим (прийняття розробника вбік)?

EDIT Подивіться, я не намагаюся збити 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. Ми могли б піти на набагато кращі мови, які повністю виходять із сімейства С. Як говорить @Juliet, OCaml міг би бути життєздатним суперником. Але це могло б зробити і ряд інших мов, якби автори-компілятори витратили на них стільки ж часу, скільки й на C або C ++. У будь-якому випадку, хороша відповідь та +1 від мене.
яльф

5
@Ferruccio: Так, але кожна мова може посилатися на бібліотеки C. Отже, якщо ми готові домогтися цього, замість фактичної сумісності вихідного коду, як пропонує C ++ (більш-менш), то ми можемо також вибрати зовсім іншу мову, скажімо, Haskell або Python. Причина, на яку C ++ натрапила, не в тому, що він може зв’язатися з бібліотеками C. Це було те, що він міг скласти код C.
джельф

64

Існують швидше, ніж мови С.

Мови існують швидше, ніж C. Наприклад, Fortran, як уже згадувалося, справляється дуже добре, оскільки має набагато більш обмежені правила зшивання мов.

Існують також експериментальні збірки, як мови, які атакують С на фронті, де він використовується як мова асемблеру високого рівня, наприклад створення компілятора. Коли-небудь чули про С-- чи Януса? Але ці двоє були вбиті проектом LLVM.

Я б погодився, що APL або інші математичні мови видують C з води в спеціальні області додатків, оскільки вони мають вбудовану підтримку для технологічних одиниць Vector. Це те, що неможливо для C (а хлопці: НІ! Спеціалізовані оптимізовані бібліотеки з C-зв’язком не мають нічого спільного з C як мовою).

Також виробники процесора видалили всі матеріали, допомагаючи авторам-компіляторам на інших мовах - пам’ятаєте позначені арифметичні асемблерні коди для того, щоб зробити LISP реалізацією на SPARC швидко? Віднесені вітром.

І якщо ви перейдете від мікро-орієнтирів до розробки додатків, то для розробки додатків існують швидші мови. Мій особистий приклад тут завжди SmartEiffel. Він націлений на C, але використовує глобальну оптимізацію системи, що робить його швидшим, ніж C, у розробці реальних програм.

У цій галузі навіть прості неправильні або низькі абстракції можуть знищити всю мову. Оскільки C не пропонує високих абстракцій, більшість людей кажуть, що це проблема програмування, але це не так. Наприклад, подивіться на відсутність дженериків. У C ви опинитеся з повільними реалізаціями, такими як функція бібліотеки "qsort", яка може бути записана на швидкість швидше за допомогою дженериків (де виклик функції для порівняння ключів усувається).

Просто порівняйте виклик qsort на мегабайтному масиві ints з хорошою письмовою реалізацією, яка використовує доступ до масиву та вбудований оператор <<.


9
Дуже хороший коментар. Важливо усвідомити, що деякі аспекти специфікації мови C (наприклад, правила зведення вказівників) унеможливлюють генерацію справді оптимального машинного коду. Будучи асемблером високого рівня, C - не "найшвидший", а просто "досить швидкий".

1
Дякую, я забув згадати неможливість повернення кількох значень результатів. Ще один аспект низького рівня, який мені важко бракує при використанні його як асемблера високого рівня.

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

1
@Rascher: Це правильно, і там ви бачите вплив C на дизайнерів процесора, які завжди визначають ABI CPU. І множинні значення повернення - це те, що просто не спадає на думку, навіть якщо кількість реєстрів не буде проблемою (SPARC, PowerPC, Itanium)

13
Псевдонімом вказівника на C займався restrictC99 (10 років тому!).

35

Гарне питання. Я думаю, що мови досягають успіху, знайшовши свою нішу. Важливо зазначити, що є багато нових мов, які кращі за С у своїх нішах.

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

  • C раніше була мовою для написання коду сервера. Інтернет висунув дивовижне різноманіття мов у цей простір - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - і випадки, коли C має сенс для коду сервера, зараз мало і далеко.

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

Але ніша C - це системний код. Ядра операційної системи. Водії. Бібліотеки часу виконання. Він настільки встановлений у тому просторі, що навіть C ++ витісняє його досить повільно.

C виграв ще в 70-х роках завдяки UNIX, тому що конкуруючі мови були або занадто обмежуючими, або занадто повільними, і тому, що код C вважався досить портативним (брехня навіть тоді). Але його найбільші переваги сьогодні не пов’язані між собою і пов'язані переважно з десятиліттями панування в ніші. Існують хороші інструменти для C: оптимізація компіляторів, налагоджувачів ядра, ефективний статичний аналіз для пошуку помилок у коді драйвера тощо. Практично кожна основна платформа визначає C ABI, і часто це бібліотека lingua franca. Існує група програмістів, які вміють кодувати C - і які знають, у чому проблеми і підводні камені C.

Довгостроково ця ніша не проходить; і у C є деякі проблеми. Але конкурентам все одно буде вкрай важко.


9
C досі широко використовується для коду сервера. Існує не тільки Інтернет, більшість серверів DNS, електронної пошти та ін. Написані на C. Навіть для Інтернету Apache знаходиться у C.

@bortzmeyer: Хоча Apache досить старий. Я не кажу, що це не корисно або замінено, воно було створене, коли це було C, і не було багато хороших альтернатив.
Макке

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

1
Крім того, кількість матеріалів у SciPy / NumPy тощо, написаних на С, вже робить корисним знати.
Фоміт

1
@EpiGrad Можливо, C - це солідна альтернатива для вас. Але C має надзвичайно круту криву навчання, особливо для людей, які не мають досвіду кодування. Зокрема, іноді вона виходить з ладу, і якщо ви не кодер, у вас є мала надія розібратися в цьому. Mathematica полегшує написання величезної кількості речей, і ви отримуєте менше коду за фактором у сотні. І це не врізається.
Джейсон Орендорф

25

Перефразовуючи дуже хороший коментар: Існує не так багато різних способів зробити мову швидкою та "близькою до машини" - C це зробив добре, і навряд чи є можливість покращити це.

Оригінальна відповідь:

Швидке виконання або швидке введення матеріалів у?

Мови не швидко і повільно виконуються, конкретні реалізації є. Язик можна розглядати швидше, ніж інші, коли це якимось чином полегшує швидку реалізацію . Це незмінно означає «близько до машини». Але коли машини стають швидшими експоненціально, це з часом стає прогресивно менш цікавим. Натомість легкість і швидкість розвитку та портативність стали набагато важливішими, тому "краще" стало означати "далеко від машини" . За останні 5 десятиліть у цьому напрямку пішли майже всі зусилля з дизайну мови.

Отже, ви знаходитесь: ближче до машини і існують швидші мови, ніж C; це ті, що були перед C : Assembler, Fortran. Напевно, якісь забуті.


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

5
Лісп. Дрімає, але не забувається! :)

2
@Jason: Питання в тому, скільки портативних складальників вам потрібно? C добре відомий, і дуже важко написати мову з більш швидкою реалізацією, так навіщо турбуватися? Якщо говорити про костюм, то тут немає жодної вимоги, немає ринку, немає мотивації.

4
@ Майкл, вибачте за те, що за ваші відповіді викрали коментарі. Причина того, що в місцевості python / ruby ​​/ java тощо є більше, полягає в тому, що, коли ви перестанете намагатися якомога ефективніше, ви отримаєте набагато більше варіантів, яким можливостям поставити пріоритет, і кожен підхід може дати нову мову. Існує набагато менше способів написання найшвидшої мови.

1
-1 для "і навряд чи є можливість покращити це" - є багато можливостей для покращення на C / C ++, не впливаючи на продуктивність.
BlueRaja - Danny Pflughoeft

21

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

З іншого боку, C ++ може бути таким же швидким, як і C, але має багато більш досконалих функцій програмування. Це набагато новіша мова, починаючи з середини 80-х.


1
А C ++ все ще оновлюється.
GManNickG

5
@GMan: так і C.


3
Виправте мене, якщо я помиляюся, але хіба restrictвказівник С99 не матиме таку саму чисту семантику - це Fortran? І що ще там має значення?

9
Я думаю, що думка про те, що Фортран швидший за С, є дещо міфом, залежно від того, що кодується та хто це робить. Причина, що численні бібліотеки важкої ваги знаходяться у Фортрансі, не в тому, що Фортран швидший, а в тому, що рутини спочатку були закодовані у Фортран і мало хто має нерви або потребують їх переписати. Невелика кількість математиків-гуру, які пишуть і перевіряють ці алгоритми, щасливі у Фортран і не потребують змін, тим більше, що вони уявляють, що Фортран швидше.
Майк Данлаве

16

Що за чорт, я задзвонюся з моїми 0,02 дол.

У багатьох випадках існує реальна або сприйнята різниця між "системними" мовами та мовами вищого рівня. Я ігнорую більшість мов "вищого рівня", оскільки ніхто (принаймні, не багато) заперечуватиме, що для багатьох завдань такі мови, як Python, Ruby тощо, простіші в роботі.

C був розроблений як системна мова, тобто він був розроблений як мова, якою написана операційна система Unix. Як така, вона була розроблена просто, потужно і швидко. Проста мова набирає сили тим, що несистемні програмісти часто вважають небезпечними: покажчики, ручне управління пам’яттю тощо. Як вже було сказано, C досить простий. K&R - це найменша книга на моїй програмі на полиці на сьогодні (не рахуючи O'Reilly Pocket References), і вона лише незначно "більша" від моєї Ruby Pocket Reference. С досить потужний. Якщо вам потрібно поговорити з обладнанням, перевірте його вручну та поспілкуйтеся з пам’яттю тощо.

Однак, з точки зору програміста, C не такий простий. Швидкість та потужність поставляються ціною ручного управління пам’яттю та не дуже великою підтримкою OOP, вбудованою в мову. C ++ (не моя улюблена мова) набагато простіший з точки зору програміста, але набагато простіший з точки зору компілятора. Objective-C (можливо, моя улюблена мова) має такий самий компроміс, з легким нахилом у напрямку спрощення мови (наприклад, збирання сміття є новачком для Objective-C, наприклад). Але оскільки світ обчислень, як багато хто з нас знає, він написаний на мові С, новим, більш складним, але "легшим" мовам важко отримати широке поширення.

У деяких випадках, особливо коли поточний "стандарт" є настільки ж "хорошим", як і С, просто не існує великого стимулу для чогось "кращого" (C ++, Objective-C, D тощо), щоб отримати тягу, коли є навіть достатньо стимулу для створення чогось «кращого».

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.