Сучасні альтернативи компіляції C / C ++ [закрито]


38

Я розглядаю можливість створення нового програмного продукту. Ефективність буде критично важливою, тому я насторожено використовую інтерпретовану мову або мову, що використовує шар емуляції (читати Java).

Це призводить мене до думки про використання C (або C ++), проте вони обидва досить довгі. Я вже давно не користувався. Я подумав, що за останні 20 років хтось, напевно, створив щось, що є досить популярним, приємним для кодування та складання.

Які ще сучасні альтернативи C для написання високоефективного складеного коду?

Якщо C ++ є іншим звіром, ніж це було 15 років тому, я б вважав це, я думаю, у мене було припущення, що у нього є деякі притаманні проблеми.

Паралелізація була б важливою, але, ймовірно, не на кількох машинах.


21
Сучасний C ++ докорінно відрізняється від C. Це набагато порівнянніше з чимось на кшталт Java або C #, ніж це з C, за винятком того, що воно має детерміновані знищення замість збору сміття, а також має невизначене поведінку, оскільки не працює у вітрині чи керується середовище. Ваша інша альтернатива - D, що є гідною мовою, але все ще дуже незрілою з точки зору бібліотек та підтримки.
Чарльз Сальвія

11
Чи можете ви детальніше зупинитися на частині "продуктивність буде критичною"? Чому це буде критично? Ви що-небудь ще виміряли?
JesperE

3
15 років - це еон в комп'ютерному плані, і поки що такі люди, як Ericsson, користуються функціональними мовами, такими як Erlang, для підтримки розповсюджених, відмовлених від несправностей програмних програм, що працюють в режимі реального часу, без зупинки у своїх вбудованих системах! Не припускайте, що тільки C ++ може забезпечити потрібну вам продуктивність, можливо, вам краще буде кидати більше обладнання на цю проблему та заощадити багато часу на впровадження іншою мовою.
Марк Бут

5
@JeremyFrench: але ви ставите питання на основі помилкового припущення, що продуктивність => статична компіляція.
vartec

4
Наскільки це вартує, в більшості випадків Haskell слугує моєю заміною C ++.
Джон Перді

Відповіді:


54

У розробці є мова, яка називається The Rust Programming Language, яка переслідує подібні цілі, що і C ++, зокрема абстрагування з нульовою вартістю та тонкий контроль над управлінням пам'яттю. Але це, мабуть, найпомітніший кандидат, незважаючи на те, що він ще дуже молодий.

Крім Rust насправді не існує інших популярних альтернатив, які компілюють у рідний код. Є, звичайно, і Delphi, і D, але вони не настільки швидкі, популярні та не використовуються. Мова Go від Google може бути кандидатом, але вона все ще дуже молода і спрямована на дещо інший домен.

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

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


5
Я б не сказав, що функціональність C "застаріла", в офіційному розумінні - просто, що майже немає причин ніколи використовувати C-бібліотечні функції, необроблені покажчики або C-масиви в C ++.
Чарльз Сальвія

20
+1 для розмови проти "компіляції потрібно для виконання" помилкового припущення.
Теластин

3
@gbjbaanb спробуйте компілювати з Visual Studio і з MinGW під Windows і удачі з цим: | спробуйте також переконати людину, яка надає вам складену бібліотеку, складену за допомогою одного з цих інструментів, яка нічого не знає про ABI, що він помиляється, і він повинен дати вам джерело цієї бібліотеки або навчитися перекомпілювати та дати потрібні характеристики . жах, іноді.
user827992

5
@paxRoman: ти можеш писати невеликі програми на C ++ і писати їх безпечніше, ніж можна в C.
kevin cline

3
@JBRWilkinson Наскільки мені відомо, популярність Objective-C відсутня за межами платформи Apple.
zxcdw

19

Існує також Ada , яка компілює в початковий код і переноситься на різних платформах в межах своєї стандартної бібліотеки. Мова живий і здоровий, зараз триває останнє оновлення стандартів мови (відоме як Ada 2012).

Короткий підсумок для незнайомих людей з Ада:

  • Сильно набраний
  • Вбудована підтримка одночасності
  • Об'єктно-орієнтовані чи процедурні, залежно від ваших вимог
  • Підтримується ланцюжком інструментів GNU (GCC містить Ada frontend)
  • Відмінно також для розробки програмного забезпечення, тобто коли вам потрібно безпосередньо взаємодіяти з обладнанням
  • Підтримує загальне програмування (загальні пакети, процедури, функції)
  • Особливості підтримки масштабної розробки програмного забезпечення (пакети, дочірні пакети, окрема компіляція, чітке розмежування між специфікацією та реалізацією)

1
Не кажучи вже про завдання Ада (паралелізація!)
NWS

6
+1: Я спробував навчитися деяких Ада і вважаю, що це дуже міцна і чиста мова. Шкода, що роботи не так багато, як для інших мов програмування.
Джорджіо

3
Добре зауважте, я шукав щось більш «сучасне», але забув про Ада
Джеремі Французька

4
@Jeremy French: Які функції ви шукаєте в більш «сучасній» мові, яку Ада не пропонує?
Джорджіо

17

Якщо C ++ є іншим звіром, ніж це було 15 років тому, я б вважав це, я думаю, у мене було припущення, що у нього є деякі притаманні проблеми.

15 років тому не було стандарту C ++. Другий був опублікований минулого року. Найкращі практики C ++ сильно змінилися за 5 років після публікації стандарту 98, і вони знову змінюються з публікацією 11-го.


12

Чому люди завжди наполягають на пошуку нових мов?

C ++:

  • Це мова №4 від TIOBE, але стримує всю конкуренцію, якщо поєднується з C
  • Має багато рамок
  • Кодувати дуже просто
  • Налаштовується дуже просто
  • Дуже виконавський
  • Дуже безпечно
  • Має дуже гарну підтримку в галузі
  • Є кросова платформа
  • При правильному виконанні не потрібні додаткові візуалізація / фреймворки / безлад
  • Легко ви знайдете роботу
  • Має всі необхідні речі для створення .so / .dll для запуску на дуже старих системах
  • Легко усунути неполадки
  • Дуже виразний
  • Дуже динамічний
  • і купа інших цікавих речей

Єдиним недоліком C ++ є те, що вам доведеться трохи навчитися. Це воно.

Порівняйте це з іншими мовами, які є однією або кількома з:

  • Вузько підтримується (OCML, Fortran, ...)
  • Повільний (Java, Javascript)
  • Експериментальний (Silverlight)
  • Рухома ціль (.NET 1/2/3/4/5? Яка з останніх зараз?)
  • Платформа заблокована (.NET)
  • Недостатня підтримка фреймворку (Fortran)
  • Малі громади (що-небудь поза топ-10)
  • Є кошмаром для усунення несправностей (усе, що стосується дурних концепцій та речей)
  • Потрібно 500MB попередньої інсталяції на машині клієнтів (JVM / .NETVM)

ІМХО, чим менше мов ми будемо використовувати та підтримувати, тим кращою буде ситуація.

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

Я знаю, що люди спростують це, але подумайте про це, дійсно.


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

20
Дуже виразні та дуже динамічні не схожі на типові риси C ++, порівняно з динамічними мовами.
vartec

29
@gbjbaanb "трохи складніше вчитися" - це, знову ж таки, смішно збивається. Вибачте. Я програмував усі ці мови протягом багатьох років, я, очевидно, віддаю перевагу C ++ (і займаюся найсерйознішим програмуванням в ньому), але кажу, що це просто, це просто цілком оману. І я не говорю про химерні речі метапрограмування, я кажу про помилки компілятора, що створюються кодом запуску верстата, викликані прихованням імен, ADL, constпроблемами коректності тощо. Кожен, хто прочитав Ефективний C ++ (як це стверджує Кодер) і стверджує, що C ++ є легким, має розумовий розрив.
Конрад Рудольф

13
@gbjbaanb Я програміст на C ++. Ще раз, я не думаю, що C ++ не є легким. І цей потік коментарів також трохи нахмурився від чату на C ++. Так це не те. І різниця між C ++ gotchas та іншими мовами полягає в тому, що якщо ви не знаєте про них іншими мовами, ви, ймовірно, будете добре. В C ++ ви тости. І навіть якщо ви знаєте про них, ви все одно можете отримати кілька екранних сторінок помилок компіляції за одну помилку (трапилася зі мною сьогодні знову). І хоча помилку було легко виправити (помилка друку), потрібно проаналізувати все це.
Конрад Рудольф

6
Коли популярна мова коли-небудь була доброю? PHP користується величезною популярністю, і жодна серйозна людина не думає, що це "гарна" мова навіть для своєї ніші. Єдине "гарне", що стосується популярних мов - це те, що є багато бібліотек, які полегшують програмування певних доменів. Сам C ++ загрожує розчаруванням.
weberc2

11

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

Якщо ви витрачаєте весь свій час на пошуки чогось нового, просто тому, що його нове, і тому ви думаєте, що це якось повинно бути краще, вас чекає велике розчарування. Це стосується мов програмного забезпечення, систем GUI (візьміть на замітку, Microsoft та Gnome) та любителів (візьміть на замітку, панночки :))

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


16
Я думаю, що C і C ++ є прикладом коментаря Хоара щодо розробки програмного забезпечення: або зробити його таким простим, очевидно, що недоліків немає, або зробити його таким складним, що явних недоліків немає.
TMN

1
Як багаторазові вразливості безпеки через певну форму буфера експлуатують "хорошу річ", незалежно від того, скільки років або закріплена мова? І чи це справді інше, ніж аргументувати продовження встановленого шлюбу після неодноразового зловживання?
користувач2864740

@ user2864740 Ви пропонуєте розлучитися, тому що дружина стара, і ви хочете нову захоплюючу модель ... Я кажу, що ви дотримуєтесь того, що у вас є, тому що ви знаєте огляди та примхи. Скільки нових, крутих мов вирішують такі проблеми, як переповнення буфера, а потім виявляються, що вони мають тонкі способи переповнення буферів? Тож що краще - переливу, якого ви можете уникнути, не лінуючись чи використовуючи правильну конструкцію, або ту, до якої ви потрапляєте, бо ви не знали, що там є?
gbjbaanb

@gbjbaanb Ні, я ніколи цього не казав. Я малював приклад спеціально на шкоду, заподіяну не поліпшення контексту ситуацій. Я, як правило, досить раціональний і не схильний до "фанбої" підбору трендівних тем чи інструментів (це лише моя природа). Крім того, C і C ++ - це різні мови; але вони обидва виправдані з тієї ж причини прикриття. І в цьому проблема з такими.
користувач2864740

8

Нинішнім стандартом C ++ є C ++ 11 , який був опублікований у 2011 році. Отже, це не 20-річний стандарт. І між ними існували численні стандарти. Кожен з них представляє численні поліпшення продуктивності.

Компілятори також постійно вдосконалюються. Вони набагато кращі в оптимізації, ніж раніше.

Також покращилися виконавчі формати, 20 років тому ви мали a.out , тепер у вас є ELF .

Загалом, припущення про те, що C ++ не змінився протягом 20 років, не може бути далі від істини.

Також майте на увазі, що C і C ++ - це дуже різні мови.


2
Моє припущення було те, що щось, що було вперше задумане 20 років тому, матиме властиві архітектурні обмеження, які можна було б покращити лише за допомогою чистого сланця. Я думаю, це припущення, можливо, було неправильним.
Джеремі Френч

4
@JeremyFrench: Як архітектура x86?
TMN

2
@TMN це доводить чи спростовує моє припущення?
Джеремі Французький

6
Оригінальна архітектура x86 була неприємним компромісом між зворотною сумісністю з 8080 та набором функцій, що конкурували з моделями 68000 та NS32032. Сегментована пам'ять (із вказівниками "далеко" та "біля"), лише 4 регістри загального призначення, кодування інструкцій змінної довжини, понад 50 смаків інструкції JMP, мультиплексована тридержавна системна шина ... І все-таки сьогодні та сама базовий дизайн іде сильніше, ніж будь-коли, після того як багато «чудових» конструкцій з чистого шиферу (Alpha, MIPS, PowerPC) не змогли його витіснити.
TMN

1
@JeremyFrench ні, ваше припущення не було помилковим, принаймні у випадку з C ++. C ++ 11 функцій, безумовно, корисні; однак у цей момент вони просто більше лайно на купі лайна. Вони намагаються вибудовувати особливості сучасних мов, але, щоб впоратися з існуючим безладом C ++, у них повинні бути винятки, і ці винятки матимуть винятки тощо і так далі.
weberc2

6

Я не є великим знавцем цієї мови, але я думаю, що OCaml міг би бути цікавим варіантом.

OCaml - це компільована, функціональна / об'єктно-орієнтована мова. Для порівняння продуктивності з C ++ див. Порівняння C ++ проти OCaml: Ray tracer . Звичайно, це дуже специфічний приклад, і потрібно зробити більш обширне тестування, щоб краще відчути ефективність роботи OCaml.


Чи можете будь-ласка підказати, як можна покращити цю відповідь? Спасибі.
Джорджіо

3

Залежить від того, що ваш продукт буде робити. Якщо продуктивність дуже важлива, мова про вибір мови все ще FORTRAN . Я також не виключав би Java - вона використовується у багатьох великих обсягах фінансових торгових додатків. Erlang варто переглянути, якщо ваш проблемний домен вимагає високої одночасності. Objective-C приємний, хоча я не знаю, наскільки добре його підтримують за межами екосистеми Apple (крім компіляторів та базового режиму виконання). Я також чув хороші речі щодо продуктивності Haskell, але не впевнений, чи це абсолютна продуктивність, чи просто продуктивність щодо інших функціональних мов.


2
кожна фінансова робота, яку я розглядав, хочу розробників C / C ++, а не Java. З досвіду роботи з Java, я не бачу високопродуктивних, якщо ви не кинете на нього маси обладнання.
gbjbaanb

На Уолл-стріт та в різних інвестиційних банках США та Великобританії існує багато торгових систем Java. Він також досить активно використовується на Чиказькій товарній біржі.
TMN

3

Якщо ви говорите, що ваш проект є чутливим до продуктивності, ви маєте на увазі кожен рядок його коду? Або, як звичайно, чи є менший відсоток, який є критичним для продуктивності, а решта - це звичайний бізнес-код заводу?

Після того, як ви відповісте на це, який більший ризик для вашого проекту: якщо кінцевий результат занадто повільний, або що ви ніколи не закінчите його в першу чергу?

Якщо припустити, що ви відповідаєте другим на обидва, вам слід розробити мову вищого рівня, яка підтримує вбудований інтероп (Python, Ruby, сімейство .Net мають усі). Спочатку закінчіть проект. Потім профілюйте, оптимізуйте, промийте, повторіть. Тільки після цього розгляньте перекритинг сегмента вибору програми у власному коді та інтегруйте цей кодовий код із готовим продуктом.


Як тільки це Java, ви не зможете її врятувати, якщо вона занадто повільна.
Coder

6
@Coder Java має FFI (JNI), який дозволяє вам "нанести хаос" вашою мовою. Отже, якщо ви добре спроектували інтерфейси, ви можете просто замінити реалізацію Java на рідну. Платформа Java добре продумана.
K.Steff

1

Vala схожий на Java та C #, збирається у вихідний код (або вихідний код C, якщо ви бажаєте), і дуже швидкий . Тут потрібен GLib для об'єктно-орієнтованих бітів, і це написано хакерами Linux для хакерів Linux, тому, якщо ваш домен є Windows, це може бути не дуже добре.


1

Objective-C - це сучасна, складена альтернатива прямим C та C ++. Він має як зібраний сміття, так і детермінований менеджмент пам'яті, а час передачі повідомлень OO оптимізований для продуктивності.

Він доступний через GCC та CLang, і є бібліотеки додатків, такі як GNUStep та Cocotron, які працюють на різних платформах.

Якщо ви виконуєте високоефективні роботи, я припускаю, що це така чисельна чистка чи інша робота з діленням і підкоренням замість інтерфейсу, так що це означає, що ви можете робити інтерфейс будь-якою легкою для вас мовою, наприклад, HTML через міні-http-сервер.


0

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

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