Мне действительно нравится простая и прозрачная природа C: когда я пишу код на C, я чувствую себя свободным от «утечек абстракций» и почти всегда могу сделать хитрое предположение о сборке, которую я создаю. Мне также нравится простой, знакомый синтаксис для C.
Тем не менее, в C нет таких простых, полезных полезностей, которые предлагает C ++, например, классы, упрощенная обработка не-cstring и т. Д. Я знаю, что все это можно реализовать в C с использованием таблиц переходов и тому подобного, но иногда это немного сложно. и не очень типизированный по разным причинам.
Однако я не фанат чрезмерного акцента на объектах в C ++, и я не боюсь оператора «new» и тому подобного. В С ++, похоже, слишком мало икоты, например, для использования в качестве языка системного программирования.
Существует ли язык, который находится между C и C ++ в масштабе виджетов и doodads?
Отказ от ответственности: я имею в виду это как чисто фактический вопрос. Я не собираюсь злить вас, потому что я не разделяю ваше мнение, что C {, ++} достаточно хорош, чтобы делать все, что я планирую.
new
в основном усиленный вверх ,malloc
что может также заботиться о инициализации памяти для вас. С помощью «размещения нового» иoperator new
, вы можете решить, как и где он выделяет память. А что касается выделения объектов: несколько строк над вами утверждают, что вы считаете классы «простым полезным помощником». Прими решение!C+
Diclaimer: Извините, я неt resist. It
Ответы:
Это могут быть дроиды, которых вы ищете ...
Go - http://golang.org/
D - http://dlang.org/
Руст - http://rust-lang.org/
источник
struct
s серьезно затруднены по сравнению со значениями C ++ - например, нет наследования, нет ссылок на rvalue, поэтому невозможно создать что-то столь же простое, как класс строки значений в D, столь же эффективное, как и его эквивалент C ++. Это факты о языке D.Существует довольно много языков (например, Java, Go, D, Objective-C), которые либо приблизительно параллельны C ++, либо пытаются исправить проблемы, которые авторы видели в C ++.
По крайней мере, IMO, однако, все они работают значительно хуже C ++ для большинства практических целей.
К сожалению, исходя из вашего очевидного вкуса к знанию того, какой код сборки будет создан, мы, вероятно, можем немедленно исключить Objective C и Java.
Теоретически, я считаю Go самым интересным из них - у него есть действительно оригинальные идеи и интересные подходы к решению проблем, которые значительно упрощают некоторые виды кода. К сожалению, современные компиляторы не производят очень хороший код, и за последние несколько лет не было большого улучшения в этом отношении.
Это в значительной степени оставляет D как единственный, у которого есть шанс. Это, вероятно, наиболее похоже на C ++ (из них), но также наименее вероятно (IMO), чтобы исправить то, что вы, похоже, видите как проблемы.
Это оставляет один очевидный подход: используйте C ++, но используйте только те части, которые вам нужны, и избегайте частей, которые вам не нравятся.
источник
Извини, дружище, тревога противоречий. Обработка без cstring требует
new
. Это фундаментальная необходимость. Вы не можете иметьstd::string
безnew
. И, кроме того,new
/delete
в точности эквивалентенmalloc
/,free
но безопаснее , потому что гарантирует правильное построение и уничтожение объектов кучи (абсолютно необходимо!) И использует обработку исключений вместоNULL
возврата, и поэтому превосходит все мыслимые способы. В C ++ 11 очень возможно написать свою собственнуюnew
функцию-стиля, потому что совершенная пересылка позволяет вам иметь дело с любым конструктором любого типа. Если вы стесняетесь оружияnew
, то я полагаю, что вы просто не знаете, с чем имеете дело.О, да, и умные указатели делают это так, что вам никогда не придется иметь дело с чем-либо из этого самостоятельно.
Кроме того, в C ++ нет чрезмерного акцента. Вам не нужно использовать любой объект, который вы не хотите. Вы можете программировать функционально с лямбдами и тому подобным в любое время. Никто не заставляет вас использовать наследование и виртуальные функции - на самом деле, многие хорошие программы на C ++ редко демонстрируют наследование. Шаблоны являются более мощной и полезной техникой абстракции. Это не Java.
источник
f(g(x))
кажется, работает просто отлично для меня. И я также считаю, что карри можно сделать как библиотеку в C ++ 11.std::bind
поддерживает такие вещи.C - почти подмножество C ++, поэтому вы можете просто использовать те части C ++, которые вам нравятся, и игнорировать остальные. Можно даже написать действительный C, который также является допустимым C ++.
Вы не будете писать идиоматический C ++, но это будет настолько промежуточным, насколько это возможно.
В качестве альтернативы, вы можете проверить другие языки, которые пытаются расширить C на что-то более мощное, особенно D и Objective-C.
И, наконец, в зависимости от характера проекта, вы можете использовать полиглотный подход: разделить ваш проект на модули и выбрать наиболее подходящий язык для каждой части. Недостатком этого является то, что вам нужно заставить языки работать вместе, что может быть слишком большой работой, чтобы стоить усилий.
источник
Просто чтобы предложить дикий, нестандартный ответ: если нужного вам языка не существует, почему бы не сделать его самостоятельно? Существует множество мощных инструментов для разработки языков, вплоть до старых резервов (F) Lex и Yacc / Bison. Поскольку вы уже знаете C, вам просто нужен ваш «компилятор» для вывода кода C, для которого вы затем используете свою существующую цепочку инструментов.
Это может быть и проще, и мощнее, чем вы думаете. Начните с парсера / лексера для C, затем добавьте дополнительные функции, которые вы считаете важными. Если таблицы переходов надоедают писать вручную, придумайте конструкцию для выражения аннотации, и пусть ваш интерпретатор напишет их для вас. По сути, это просто более высокий уровень метапрограммирования препроцессора, использующий внешние инструменты для выполнения метапрограммирования. Вы всегда будете точно знать, какой будет финальная сборка, так как вы знаете C и знаете, в какой C будут расширяться ваши языковые расширения.
Очевидно, есть некоторые ограничения на то, насколько эффективно это может быть без большой дополнительной работы. Добавление полностью статической системы типов может быть немного сложнее, чем вы хотите, но это вариант, который вы можете изучить, если обнаружите, что у вас есть вкус к нему. Ваши DSL-расширения настолько мощны и сложны, насколько у вас есть время и энергия для их создания, и кто знает, может быть, когда-нибудь ваш язык расширений станет «следующим C ++».
источник
Вы не сказали, какие функции C ++ вас раздражают. в любом случае вы можете попробовать Objective-C. Он делает акцент на объектно-ориентированной, а не стандартной библиотеке на C ++.
источник
Встраиваемый мир определил Embedded C ++ , который может быть тем, что вы ищете. Они убрали такие вещи, как множественное наследование и тому подобное. Насколько я знаю, это в значительной степени вымерло все же.
источник
Это глубокое параллельное сравнение C ++, Objective-C, Java и C # может оказаться полезным. Лично я считаю, что с C # работать намного чище, чем с C ++. Я перенес несколько C (числовых / расчетных) функций C на C # прежде, не требуя слишком большого количества изменений из-за сходства синтаксического и числового типов данных.
источник