Есть ли язык в стиле C ++ без атрибутов C?

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

Правка / пояснение: настоящий убийца для меня во втором предложении. Есть ли язык, действительно разработанный с нуля, который не навязывает вашему коду то, чего вы не хотите? В C ++ есть философия дизайна: не хотите RTTI? Его не существует. Не хотите вывоза мусора? Его там нет. Проблема с C ++ в том, что он (IMO) нарушает это требование, когда отказывается оторваться от прошлого. Я не хочу, чтобы проблема обратной совместимости с кодом 20-летней давности мешала мне двигаться вперед. C ++ не хочет этого делать. Что есть / есть?

Edit2: Полагаю, я должен был более четко понять, что такое стоимость. Есть несколько потенциальных затрат. Первоначально я сосредоточился на затратах времени выполнения.

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

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

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


person jmucchiello    schedule 12.06.2009    source источник
comment
Отличный вопрос. Хотя я не думаю, что вы действительно можете сказать, что совместимость с C имеет / runtime / cost, иногда это приводит к неудобному выбору дизайна.   -  person Matthew Flaschen    schedule 12.06.2009
comment
Носредна: Это во втором предложении: вы платите только за то, что вам нужно. Нет управляемой памяти. Нет встроенных типов, которые не соответствуют типам машин.   -  person jmucchiello    schedule 12.06.2009
comment
Я бы подумал, что это сам C не заставляет платить за то, что вам не нужно.   -  person Nosredna    schedule 12.06.2009
comment
Носредна: Как я уже говорил кому-то, есть обратная сторона. Если я могу себе это позволить, обеспечивает ли это язык? В C я не могу создавать полиморфные классы, не прыгая через обруч. В C ++ мне не нужно прыгать через обруч, и когда мне не нужен полиморфизм, я также не плачу за него. Видите различие? Есть ли язык высокого уровня, который не требует, чтобы я платил за абстракции, которые я не использую?   -  person jmucchiello    schedule 12.06.2009
comment
Я не согласен с тем, что вы не платите за полиморфизм. Чтобы справиться с этим, язык должен быть больше и сложнее (при прочих равных). Что вы можете себе позволить заплатить? Некоторые люди не могут позволить себе расплачиваться за функциональное программирование. Другие люди не могут позволить себе заплатить цену императива. Ни то, ни другое ничего не стоит, если вы так думаете о проблемах.   -  person John Y    schedule 12.06.2009
comment
Джон: см. Edit2, о каких затратах я говорю.   -  person jmucchiello    schedule 12.06.2009
comment
@jmucchiello: Вы не слишком помогли, потому что сказали, что другие затраты уменьшают [затраты времени выполнения]. Вы не оспаривали утверждение Мэтью Флашена о том, что совместимость с C не требует затрат времени выполнения; поэтому, похоже, вы считаете, что стоимость совместимости с C находится в другой категории. Это туманная область, которая мне в первую очередь не понравилась.   -  person John Y    schedule 13.06.2009
comment
Ты прав. Я неправильно это описал. Я пытаюсь изобразить обратную совместимость с кодом 40-летней давности любой ценой, который является недостатком C ++. Было ошибкой называть это совместимостью с C. Комитет C ++ отказывается добавлять ключевые слова из опасения сломать существующие программы, в том числе написанные 40 лет назад. Таким образом, перегруженные ключевые слова: static, auto, скоро удалить и default. И эта сложность требует больших затрат на написание / обслуживание. Теперь можем ли мы сконцентрироваться на поиске языка с конструкциями высокого уровня, которые можно игнорировать, заплатив скрытую стоимость, если таковая существует?   -  person jmucchiello    schedule 13.06.2009
comment
Язык асимптоты C + 1 - styled. ;) Также посмотрите на гугл Go.   -  person Hamish Grubijan    schedule 07.06.2010
comment
Это очень хороший вопрос. Я бы проголосовал дважды, если бы мог.   -  person pyon    schedule 02.07.2011


Ответы (9)


язык D

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

Общий вид D похож на C и C ++. Это упрощает изучение и перенос кода на D. Переход с C / C ++ на D должен казаться естественным. Программисту не нужно будет изучать совершенно новый способ работы.

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

person Igor Krivokon    schedule 12.06.2009
comment
Я знаю про Д. Мне было интересно, есть ли еще что-нибудь. Я не уверен, что это соответствует моему требованию не платить за то, что вы не используете. Но больше всего не нужно платить за то, что вы не используете язык, будет ассемблер, и это не совсем лучше, чем C ++. - person jmucchiello; 12.06.2009
comment
@jmucchiello - ну, вы ищете не просто язык, который ничего не навязывает, а лучше, чем C ++ D.I.T. язык. На этот вопрос сложно ответить, потому что он во многом зависит от вашего определения слова «лучше». Еще один определенно D.I.T. язык - четвертый. Но вопрос о лучшем оставлю вам :) - person Igor Krivokon; 12.06.2009
comment
@ Игорь: Не обязательно быть правильным ответом. Я хотел глубже вникнуть в D. @GMan: А теперь сборка и C ++ не равны по сложности. Я говорил, что сборка требует наименьшего (а на самом деле нет) того, что вы можете и чего не можете делать. - person jmucchiello; 12.06.2009

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

Если вы сочтете сборку мусора и явные объектно-ориентированные функции "ерундой", то, честно говоря, я думаю, что C, вероятно, лучший кандидат. Язык на самом деле небольшой и элегантно оформлен. Он отвечает требованию большинства людей о том, что он "влезает в голову". Для языка, который дает такой полный контроль над оборудованием, он очень выразителен.

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

Если есть некоторые высокоуровневые функции, без которых вы «не можете жить» (что, кажется, вы подразумеваете, называя «C ++ без совместимости с C» в качестве предпочтительного языка), то вам следует прямо сказать, что это такое. Что именно предлагает C ++, чем вы не хотите жертвовать?

person John Y    schedule 12.06.2009
comment
На самом деле C - определенно язык, который мало что требует от программиста. Вопрос в том, сможете ли вы добавить больше языковых функций и при этом сохранить этот минимализм. Например, добавление утиной печати накладывает дополнительные расходы. Если язык (каким-то образом) позволяет вам использовать утиный ввод или позволяет отключить утиный ввод, то он соответствует моим критериям оплаты только за то, что вы используете. Дело не в том, без чего я не могу жить. Это то, что я могу получить, когда мне это нужно, и выбросить, когда нет. - person jmucchiello; 12.06.2009

Ада - еще одна альтернатива - gc не является обязательным в реализации языка:

http://en.wikipedia.org/wiki/Ada_(programming_language)

person David Cournapeau    schedule 12.06.2009

Вы также можете попробовать Ch по адресу: http://www.softintegration.com/

person auvi    schedule 12.06.2009
comment
Ch - это, по сути, подмножество C ++, предназначенное для написания сценариев. Я не вижу, чтобы это отвечало на вопрос ОП. - person Matthew Flaschen; 12.06.2009
comment
С сайта: Ch is C plus (Ch = C +). Ch - интерпретатор C. Ch - это C с классами и расширениями высокого уровня. Ch является надмножеством C. Обратите внимание, что C ++ больше не является надмножеством C. Например, арифметика с плавающей запятой VLA и IEEE в C не поддерживается в C ++. C - для системного программирования низкого уровня и встроенных систем; C ++ для масштабных проектов. Ch оптимален для независимого от платформы написания сценариев в числовых вычислениях и визуализации, быстрой разработки приложений, веб-программирования и построения графиков, встроенных сценариев, программирования оболочки, интеграции с унаследованными системами и изучения C / C ++. - person auvi; 12.06.2009

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

person Chin Huang    schedule 12.06.2009
comment
+1 Круто! Это не совсем ответ на вопрос, но это так здорово ... - person Zifre; 13.06.2009
comment
Это было бы круто, если бы он не выглядел так, как Паскаль. И если бы он был обновлен до C ++ 0x. - person jmucchiello; 02.11.2010

Эйфель. Похоже на Паскаль, имеет семантику типа C ++. Кроме того, добавляет специальные утверждения «программирование по контракту», которые встроены в определение языка за много лет до того, как люди заговорили о библиотеках модулей «X».

person Roboprog    schedule 12.06.2009
comment
Я давно не смотрел на Эйфеля. Существуют ли языковые функции, которые добавляют накладные расходы, которые я могу отключить, когда они мне не нужны? В этом суть моего вопроса. Могу ли я написать собственное управление памятью? Если я создам иерархию без исключений, будет ли код обработки исключений в моей среде выполнения? - person jmucchiello; 12.06.2009
comment
Хотел бы я ответить на ваши вопросы. Прошли годы с тех пор, как я тоже смотрел на это в контексте получения дополнительных сведений об использовании C ++ и Borland ObjectPascal. Не думаю, что можно отключить обработку исключений. Вы можете отключить проверки предусловия и постусловия. - person Roboprog; 13.06.2009

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

Айкидо в Википедии

person Suvesh Pratapa    schedule 12.06.2009
comment
Но он интерпретирован, и я думаю, что он имеет встроенную сборку мусора. Что на самом деле не соответствует тому, что он хочет в своем вопросе. - person Nosredna; 12.06.2009
comment
Хорошо, просто предложил это как другой вариант! - person Suvesh Pratapa; 12.06.2009

Я не совсем уверен, сколько стоит обратная совместимость с C ...

person Brian Postow    schedule 12.06.2009
comment
Макросы? Может быть, не столько затраты времени на выполнение, сколько источник ошибок? Указатель обрабатывает беспорядок в целом? Кроме того, мне очень нравится, как Паскаль маскирует многие предполагаемые операции с указателями с помощью параметров var, обращение к которым должно быть отменено при вызове подпрограммы. Я не уверен, что ссылки и параметры C ++ находятся на таком же высоком уровне. - person Roboprog; 13.06.2009

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

Изменить: странно, что я не заметил сообщение прямо подо мной с тем же комментарием в первой строке

person Hippiehunter    schedule 12.06.2009
comment
Обратная совместимость с C требует затрат на обслуживание. Я никогда не говорил, что C ++ не соответствует цели. Мне просто интересно, есть ли альтернативы. Почему не стало больше языков с мантрами «не плати»? - person jmucchiello; 13.06.2009