Есть ли язык между C и C ++?

18

Мне действительно нравится простая и прозрачная природа C: когда я пишу код на C, я чувствую себя свободным от «утечек абстракций» и почти всегда могу сделать хитрое предположение о сборке, которую я создаю. Мне также нравится простой, знакомый синтаксис для C.

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

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

Существует ли язык, который находится между C и C ++ в масштабе виджетов и doodads?

Отказ от ответственности: я имею в виду это как чисто фактический вопрос. Я не собираюсь злить вас, потому что я не разделяю ваше мнение, что C {, ++} достаточно хорош, чтобы делать все, что я планирую.

Роберт Мартин
источник
10
Вы говорите, что ваш вопрос «чисто фактический», но вы отказываетесь от c ++, потому что он «кажется» имеет слишком много икоты. Каковы эти икоты, и являются ли они вескими причинами для скидок с ++?
whatsisname
2
Что такое «шкала виджетов и дуддов»? Если вы хотите получить реальные ответы на «чисто фактический» вопрос, вам следует избегать бессмысленных показателей.
Калеб
2
И те немногие вещи, которые вы делаете в C ++, предают некоторую дезинформацию. newв основном усиленный вверх , mallocчто может также заботиться о инициализации памяти для вас. С помощью «размещения нового» и operator new, вы можете решить, как и где он выделяет память. А что касается выделения объектов: несколько строк над вами утверждают, что вы считаете классы «простым полезным помощником». Прими решение!
25
Используйте C+ Diclaimer: Извините, я неt resist. It
смог
2
Это звучит очень похоже на гипотезу континуума, и, вероятно, с тем же ответом. ( en.wikipedia.org/wiki/Continuum_hypothesis )
Джон Смит,

Ответы:

29

Это могут быть дроиды, которых вы ищете ...

Go - http://golang.org/

D - http://dlang.org/

Руст - http://rust-lang.org/

Jacks_Gulch
источник
5
@dtech: D имеет этот бессмысленный GC / «Все наследует от Object» / Значения должны быть ужасными. Я уже получил C # для этого, и у него действительно есть приличные инструменты. Пойду, я признаю, что моя память о том, почему я отказался от этого, несколько туманная, но, насколько я помню, она отрезала несколько очень полезных функций.
DeadMG
4
-1 для того, что "C ++ должен был быть". C ++ - это то, что есть, и если вы не можете справиться с этим, это в значительной степени ваша проблема. Вы можете справиться с этим, используя язык, который подходит вам лучше, но это не значит, что C ++ должен был быть таким, как этот язык.
back2dos
7
@DeadMG На D вы сделали 2 значимых утверждения: GC является обязательным, и все должно быть объектом. Оба не правы. Это привело меня к мысли, что ваш вывод больше основан на невежестве, чем на фактическом знании. Я должен согласиться с CodexArcanum.
Deadalnix
5
@deadalnix: Технически, вы можете не использовать GC. Но так как у вас нет возможности узнать или управлять тем, какие библиотечные функции или языковые функции используют GC, реально нет способа создать программу, которая не использует ее. И вы не можете создать класс, который не наследуется от Object. И их structs серьезно затруднены по сравнению со значениями C ++ - например, нет наследования, нет ссылок на rvalue, поэтому невозможно создать что-то столь же простое, как класс строки значений в D, столь же эффективное, как и его эквивалент C ++. Это факты о языке D.
DeadMG
5
@DeadMG: Создание структур без наследования - это особенность , а не «позор». Это то, что они поняли правильно, то, что почти каждый язык OO в истории, не названный «C ++», понял (в том числе Simula, оригинальный язык OO), и что C ++ невероятно ошибался. Типы наследования и значения не смешиваются. Он нарушает идентичность объекта, нарушает подстановку Лискова, разрушает всю ОО-парадигму.
Мейсон Уилер
19

Существует довольно много языков (например, Java, Go, D, Objective-C), которые либо приблизительно параллельны C ++, либо пытаются исправить проблемы, которые авторы видели в C ++.

По крайней мере, IMO, однако, все они работают значительно хуже C ++ для большинства практических целей.

К сожалению, исходя из вашего очевидного вкуса к знанию того, какой код сборки будет создан, мы, вероятно, можем немедленно исключить Objective C и Java.

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

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

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

Джерри Гроб
источник
13
+1 за «используйте C ++ и избегайте частей, которые вам не нравятся». И я бы посоветовал ОП узнать больше о С ++, люди часто отказываются от вещей просто потому, что недостаточно хорошо их знают.
Док Браун
1
@DocBrown Может быть, это потому, что не так легко знать C ++ достаточно хорошо.
Малкольм
3
@Malcolm: конечно, трудно изучить современный C ++ всесторонне. Но, с другой стороны, нет абсолютно никакой причины быть "стеснительным в отношении нового оператора", что для меня звучит просто суеверно.
Док Браун
3
@Malcolm: Возможно, потому что концепция очень проста . Нужен ли строковый литерал UTF-32 или строковый литерал UTF-16? Ну, это довольно простой вопрос, если предположить, что вы знаете основы кодирования строк wtf. И это множество сложных функций? Они существуют по причине . Например, дженерики Java. Они жалки по сравнению с шаблонами. Конечно, есть меньше, чтобы учиться, но это просто потому, что они просто не очень полезны. Это все равно что называть что-то более сложное, чем Brainfuck.
DeadMG
3
@Malcolm: Это совсем не так. На популярность влияют 99999 вещей, кроме того, является ли язык хорошим / полезным.
DeadMG
16

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

Однако я не фанат чрезмерного акцента на объектах в C ++, и я не боюсь оператора «new» и тому подобного.

Извини, дружище, тревога противоречий. Обработка без cstring требует new . Это фундаментальная необходимость. Вы не можете иметь std::stringбез new. И, кроме того, new/ deleteв точности эквивалентен malloc/, freeно безопаснее , потому что гарантирует правильное построение и уничтожение объектов кучи (абсолютно необходимо!) И использует обработку исключений вместо NULLвозврата, и поэтому превосходит все мыслимые способы. В C ++ 11 очень возможно написать свою собственную newфункцию-стиля, потому что совершенная пересылка позволяет вам иметь дело с любым конструктором любого типа. Если вы стесняетесь оружия new, то я полагаю, что вы просто не знаете, с чем имеете дело.

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

Кроме того, в C ++ нет чрезмерного акцента. Вам не нужно использовать любой объект, который вы не хотите. Вы можете программировать функционально с лямбдами и тому подобным в любое время. Никто не заставляет вас использовать наследование и виртуальные функции - на самом деле, многие хорошие программы на C ++ редко демонстрируют наследование. Шаблоны являются более мощной и полезной техникой абстракции. Это не Java.

DeadMG
источник
1
Я согласен. Гораздо лучше использовать C ++ так, как вы хотите, чем искать (вероятно, низшую) альтернативу
dtech
1
Я не думаю, что лямбды достаточно, чтобы программировать функционально. Я также ожидал бы иметь оператор композиции функций, карри и так далее. См. Также stackoverflow.com/questions/1981400/functional-programming-in-c . Для меня это похоже на выполнение ООП в Си ...
Джорджио
@ Джорджио: Ответы на этот вопрос просто сказать «Это сложно!». Они не показывают никаких доказательств того, что это действительно сложно . Зачем вам нужен отдельный оператор для композиции функций? f(g(x))кажется, работает просто отлично для меня. И я также считаю, что карри можно сделать как библиотеку в C ++ 11.
DeadMG
1
@DeadMG: оператор компоновки функций - это достаточно хорошо разработанная базовая концепция в функциональном программировании. Я ожидаю найти его на языке, поддерживающем FP. Я считаю очень удобным (сжатым) определять сложную функцию как композицию других функций (например, как вы делаете с конвейерами в Unix) без использования переменных: k = h. грамм . f
Джорджио
1
@ Джорджио: std::bindподдерживает такие вещи.
DeadMG
4

C - почти подмножество C ++, поэтому вы можете просто использовать те части C ++, которые вам нравятся, и игнорировать остальные. Можно даже написать действительный C, который также является допустимым C ++.

Вы не будете писать идиоматический C ++, но это будет настолько промежуточным, насколько это возможно.

В качестве альтернативы, вы можете проверить другие языки, которые пытаются расширить C на что-то более мощное, особенно D и Objective-C.

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

tdammers
источник
Действительно, работая в таких отраслях, как разработка консольных игр, где мы действительно хотели «язык между C и C ++», именно это мы и сделали. Мы использовали подмножество функциональных возможностей C ++ с некоторыми ограничениями или, более вероятно, запретами внутри циклов, критичных к производительности.
Carson63000
3

Просто чтобы предложить дикий, нестандартный ответ: если нужного вам языка не существует, почему бы не сделать его самостоятельно? Существует множество мощных инструментов для разработки языков, вплоть до старых резервов (F) Lex и Yacc / Bison. Поскольку вы уже знаете C, вам просто нужен ваш «компилятор» для вывода кода C, для которого вы затем используете свою существующую цепочку инструментов.

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

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

CodexArcanum
источник
2

Вы не сказали, какие функции C ++ вас раздражают. в любом случае вы можете попробовать Objective-C. Он делает акцент на объектно-ориентированной, а не стандартной библиотеке на C ++.

ноль
источник
2
imho Objective-C - скудная попытка ввести классы в C и во многих отношениях уступать C ++. Кроме того, он очень мало используется за пределами Mac OS X / iOS.
Dtech
1
@dtech: Интересно, что мой бывший коллега, который не является поклонником Mac (скорее парень из Debian / Linux), был убежден, что Objective-C был гораздо более чистым OO-расширением C, чем C ++. Я никогда не пробовал Objective-C, поэтому у меня нет мнения по этому поводу.
Джорджио
1
@dtech: Тогда я скромно предлагаю вам пересмотреть свое мнение;) Objective-C - это объектная ориентация, и он гораздо лучше справляется с этим, чем C ++, потому что он вводит передачу сообщений. Хотя я согласен с тем, что язык во многих отношениях уступает C ++, он так же превосходит другие.
back2dos
@ Джорджио Я согласен с вашей коллегой, хотя у Obj-C также есть некоторые ограничения (возможно, некоторые из них исчезли с Obj-C 2.0), например, я хотел бы иметь перегрузку «методов» (селекторов) - кстати, я хотел бы функция перегрузки а-ля
фортран
2

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

mattnz
источник
0

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

dodgy_coder
источник