Компилируемые современные альтернативы 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, но они не такие быстрые, популярные или используемые. Язык Google Go мог бы быть кандидатом, но он все еще очень молод и нацелен на немного другой домен.

Тем не менее, обратите внимание, что 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 toolchain (GCC содержит интерфейс Ada)
  • Отлично также для разработки программного обеспечения, то есть когда вам нужно напрямую взаимодействовать с оборудованием
  • Поддерживает универсальное программирование (универсальные пакеты, процедуры, функции)
  • Функции поддерживают крупномасштабную разработку программного обеспечения (пакеты, дочерние пакеты, отдельная компиляция, строгое различие между спецификацией и реализацией)

1
Не говоря уже об Ada Tasks (распараллеливание!)
NWS

6
+1: я пытался выучить немного Ады, и я думаю, что это очень надежный и чистый язык. Жаль, что там не так много рабочих мест, как для других языков программирования.
Джорджио

3
Хорошее упоминание, я искал что-то более «современное», но я забыл об Аде
Джереми Френч

4
@ Джереми Френч: Какие функции вы ищете на более «современном» языке, который Ада не предлагает?
Джорджио

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)
  • Плохая поддержка фреймворка (Фортран)
  • Имеет небольшие сообщества (что-либо за пределами топ-10)
  • Кошмар для устранения неполадок (что-нибудь с высокоуровневыми надежными концепциями и прочим)
  • Требуется 500 МБ предварительной обработки на компьютере клиента (JVM / .NETVM)

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

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

Я знаю, что люди будут принижать это, но подумайте об этом, правда.


71
C ++ «очень легко кодировать» - просто смехотворно неправильно, извините. Это невероятно сложный язык для изучения, и даже если вы используете современные идиомы C ++ и избегаете указателей, вы столкнетесь с множеством загадочных ошибок компилятора и времени выполнения, прежде чем освоите его. И даже после того, как вы освоите его, синтаксис будет мешать довольно часто. Safe C ++ часто использует беспорядок вложенных шаблонов, которые генерируют огромное количество стандартного кода.
Конрад Рудольф

20
Очень выразительные и очень динамичные не похожи на типичные черты C ++, по сравнению с динамическими языками.
vartec

29
@gbjbaanb «немного сложнее учиться», опять же, смехотворно неуместен. Сожалею. Я программировал все эти языки в течение многих лет, я явно предпочитаю C ++ (и занимаюсь самым серьезным программированием на нем), но сказать, что это легко, просто вводит в заблуждение. И я не говорю о причудливых вещах метапрограммирования, я говорю об ошибках компилятора, вызванных заурядным кодом, вызванным сокрытием имени, ADL, constпроблемами корректности и тому подобным. Любой, кто читал Effective C ++ (как утверждает Кодер) и считает, что C ++ легко, имеет психическое отключение.
Конрад Рудольф

13
@gbjbaanb Я программист на C ++. Еще раз, я не думаю, что C ++ - это легко. И эта ветка комментариев также вызвала недовольство в чате C ++. Так что это не так. И разница между хитами C ++ и другими языками заключается в том, что если вы не знаете о них на других языках, вы, вероятно, будете в порядке. В C ++ вы тост. И даже если вы знаете о них, вы все равно можете получить несколько экранных страниц с сообщениями об ошибках компиляции для одной ошибки (это случилось со мной сегодня снова). И хотя ошибку было легко исправить (опечатка), требуется время, чтобы разобраться во всем этом.
Конрад Рудольф

6
Когда популярный язык когда-либо был хорошим? PHP очень популярен, и ни один серьезный человек не считает его «хорошим» языком даже для своей ниши. Единственная «хорошая» вещь в популярных языках - это то, что существует множество библиотек, облегчающих программирование определенных доменов. Сам C ++ полон разочарований.
weberc2

11

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

Если вы проводите все свое время в поисках чего-то нового, просто потому, что оно новое, и поэтому думаете, что оно должно быть как-то лучше, вас ждет большое разочарование. Это относится к языкам программного обеспечения, системам графического интерфейса (обратите внимание, Microsoft и Gnome) и любителям (обратите внимание, юные леди :))

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


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

1
Как повторяющиеся уязвимости в безопасности, связанные с использованием буфера в какой-либо форме, являются «хорошей вещью», независимо от того, сколько лет или укоренившихся языков? И действительно ли это отличается от того, чтобы утверждать о продолжении установленного брака после повторного насилия?
user2864740

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

@ gbjbaanb Нет, я никогда этого не говорил. Я рисовал сравнение специально для ущерба, вызванного не улучшением контекста ситуаций. Я вообще вполне рациональн и не склонен к "фанбои" подбора трендовых тем или инструментов (это просто моя природа). Кроме того, C и C ++ - это разные языки; все же они оба оправданы по той же самой общей причине. И это проблема с такими.
user2864740

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: Сравнение трассировщиков лучей . Конечно, это очень конкретный пример, и для лучшего понимания производительности OCaml необходимо провести более обширное тестирование.


Может ли downvoter дать подсказку о том, как этот ответ может быть улучшен? Спасибо.
Джорджио

3

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


2
Каждую финансовую работу, на которую я смотрел, хотят разработчики на C / C ++, а не Java. Исходя из опыта работы с Java, я не вижу высокопроизводительной системы, если вы не добавите в нее массу оборудования.
gbjbaanb

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

3

Когда вы говорите, что ваш проект чувствителен к производительности, вы имеете в виду каждую строчку кода? Или, как обычно, есть меньший процент, который критикует производительность, а остальная часть - ваш обычный прогон обычного бизнес-кода?

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

Предполагая, что вы ответите на второй вопрос для обоих, вы должны разработать язык более высокого уровня, который поддерживает нативное взаимодействие (Python, Ruby, .Net Family имеют все это). Сначала закончите проект. Затем профиль, оптимизировать, промыть, повторить. Только после этого рассмотрите возможность изменения сегмента выбора приложения в нативном коде и интеграции этого нативного кода с готовым продуктом.


Раз это Java, вы не сможете его спасти, если он слишком медленный.
Кодер

6
@Coder Java имеет FFI (JNI), который позволяет вам «нанести ущерб» на выбранном вами языке. Поэтому, если вы хорошо спроектировали интерфейсы, вы можете просто заменить реализацию Java на собственную. Платформа Java хорошо продумана.
К.Стефф

1

Vala похож на Java и C #, компилируется в нативный код (или исходный код C, если вы предпочитаете) и работает очень быстро . Он требует GLib для своих объектно-ориентированных битов, и он написан хакерами Linux для хакеров Linux, поэтому, если ваш домен Windows, это может быть не очень хорошо.


1

Objective-C - это современная, скомпилированная альтернатива прямым C и C ++. Он имеет как сборщик мусора, так и детерминированное управление памятью, а среда выполнения передачи сообщений оптимизирована для повышения производительности.

Он доступен через GCC и CLang, и есть библиотеки приложений, такие как GNUStep и Cocotron, которые работают на различных платформах.

Если вы выполняете высокопроизводительную работу, я собираюсь предположить, что это что-то вроде обработки чисел или другой работы «разделяй и властвуй» вместо пользовательского интерфейса, так что это означает, что вы можете выполнять пользовательский интерфейс на любом языке, который вам проще всего, например, HTML через мини-http-сервер.


0

Я никогда не использовал его, но один из моих знакомых с Cython, который позволяет вам использовать примитивы стиля C в критически важных для вашего кода частях кода, сохраняя при этом общий синтаксис python и имея возможность в полной мере использовать конструкции высокого уровня python для сокращения времени разработки время везде

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