Чи існує мова між C і C ++?


18

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

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

Я не прихильник надмірного наголосу на об'єктах в C ++, і я соромлюсь «нового» оператора тощо. Здається, що у C ++ є лише декілька занадто багато гикавок, щоб, наприклад, використовуватися як мова системного програмування.

Чи існує мова, яка сидить між C і C ++ за шкалою віджетів і doodads?

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


10
Ви кажете, що ваше запитання "суто фактичне", але ви знижуєте c ++, тому що "здається", має занадто багато гикавки. Що це за гикавка, і чи вони є вагомими причинами знижки c ++?
whatsisname

2
Що таке "шкала віджетів та малюнків"? Якщо ви хочете реальні відповіді на "суто фактичний" питання, вам слід уникати безглуздих показників.
Калеб

2
І кілька речей, які ви заявляєте про C ++, зраджують дезінформацію. newце здебільшого виправлена ​​помилка, mallocяка також може подбати про ініціалізацію пам'яті для вас. За допомогою "Розміщення нового" і operator new, ви можете вирішити, як і де він розподіляє пам'ять. А щодо наголосу на об'єкті: Через декілька рядків вище, ви вважаєте, що класи вважаєте "простим, корисним doodad". Приведи мозок у порядок!

25
Використовуйте C+ Diclaimer: Вибачте, я не міг t resist. It1 квітня;)
knut

2
Це звучить дуже жахливо, як гіпотеза континууму, і, мабуть, з тією ж відповіддю. ( en.wikipedia.org/wiki/Continuum_hypothesis )
Джон Сміт

Відповіді:


29

Це можуть бути дроїди, яких ви шукаєте ...

Перейти - http://golang.org/

D - http://dlang.org/

Іржа - http://rust-lang.org/


5
@dtech: D має той безглуздий GC / "Все, що успадковується від Об'єкта" / Цінності повинні висмоктувати гадюку. У мене вже є C # для цього, і він насправді має гідні інструменти. Іди, я визнаю, що моя пам’ять про те, чому я відкинула це, дещо туманна, але, як я пам'ятаю, вона вирізала кілька дуже корисних функцій.
DeadMG

4
-1 для "яким C ++ мав бути". C ++ - це те, що воно є, і якщо ви не можете впоратися з цим, це багато в чому ваша проблема. Ви можете впоратися з цим, використовуючи мову, яка вам більше підходить, але це не означає, що C ++ повинен був бути таким, яким є мова.
back2dos

7
@DeadMG На D ви зробили 2 змістовні заяви: GC є обов'язковим, і все повинно бути об'єктом. Обидва помиляються. Це змушує мене думати, що ваш висновок базується більше на незнанні, ніж на фактичних знаннях. Я маю згоду з CodexArcanum.
deadalnix

5
@deadalnix: Технічно ви можете не використовувати GC. Але оскільки у вас немає ніякого способу знати або контролювати, які функції бібліотеки або мовні функції використовують GC, реально немає способу створити програму, яка не використовує її. І ви не можете створити клас, який не успадковує від Object. А їх structs серйозно поширюється порівняно зі значеннями C ++ - ні успадкування, ні посилання на оцінку, наприклад, тому неможливо створити щось таке просте, як клас рядка значень у D, який настільки ж ефективний, як і його еквівалент C ++. Це факти про мову D.
DeadMG

5
@DeadMG: Створення конструкцій без успадкування - це особливість , а не "стискання". Це те, що вони зрозуміли правильно, щось таке, що майже всі мови OO в історії, не названі "C ++", отримали правильність (включаючи Simula, оригінальну мову OO), і що C ++ отримав неймовірну помилку. Спадкові та ціннісні типи не змішуються. Це порушує ідентичність об'єкта, порушує Лісков Заміну, порушує всю парадигму ОО.
Мейсон Уілер

19

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

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

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

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

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

Це залишає один очевидний підхід: використовуйте C ++, але використовуйте лише потрібні вам частини та уникайте частин, які вам не подобаються.


13
+1 для "використовуйте C ++ і уникайте деталей, які вам не подобаються". І я б запропонував ОП дізнатися більше C ++, люди часто відмовляються від речей лише тому, що вони їх не знають достатньо добре.
Doc Brown

1
@DocBrown Можливо, це тому, що C ++ пізнає C ++ не так просто.
Малькольм

3
@Malcolm: звичайно, важко вивчити сучасний C ++ поглиблено. Але з іншого боку, немає абсолютно жодних причин бути «пістолетом сором’язливим для нового оператора», що для мене звучить просто забобонно.
Док Браун

3
@Malcolm: Можливо, тому, що концепція дуже проста . Чи потрібен UTF-32 рядковий літерал або UTF-16 рядковий літерал? Ну, на це досить просте запитання відповісти, якщо припустити, що ви знаєте основи кодування WTF рядків. І ті безліч важких рис? Вони існують не просто так . Наприклад, дженерики Java. Вони пафосні в порівнянні з шаблонами. Звичайно, є чому менше вчитися, але це просто тому, що вони просто не дуже корисні. Це як називати що-небудь складніше, ніж Brainfuck важко.
DeadMG

3
@Malcolm: Це зовсім не так. На популярність впливають 99999 речей, окрім того, добре чи корисно мова.
DeadMG

16

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

Я не прихильник надмірного наголосу на об'єктах в C ++, і я соромлюсь «нового» оператора тощо.

Вибачте, приятель, тривога протиріччя. Non-CSTRING обробка вимагає new . Це принципова необхідність. Ви не можете std::stringбез них new. І крім того, new/ deleteточно рівнозначно malloc/, freeале безпечніше , оскільки воно гарантує правильну побудову та знищення купи об'єктів (цілком необхідне!) Та використовує обробку виключень замість NULLповернення, і тому є кращим у будь-якому способі, що можна уявити. У C ++ 11 дуже можливо написати власну newфункцію -style, оскільки ідеальне переадресація дозволяє мати справу з будь-яким конструктором будь-якого типу. Якщо ви соромитеся new, тоді я пропоную вам просто не знати, з чим маєте справу.

О так, і розумні покажчики роблять це так, що вам ніколи і ніколи не доведеться насправді займатися будь-яким із цього.

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


1
Я згоден. Набагато краще використовувати C ++ так, як ви хочете, ніж шукати (ймовірно, неповноцінну) альтернативу
dtech

1
Я не думаю, що лямбдасів достатньо, щоб функціонально програмувати. Я також очікував би мати оператора композиції функцій, каррінг тощо. Дивіться також stackoverflow.com/questions/1981400/functional-programming-in-c . Мені це здається майже таким, як робити OOP в C ...
Джорджіо

@Giorgio: Відповіді на це питання просто говорять "Важко!". Вони не свідчать про те, що це насправді важко . Чому ви хочете окремого оператора для складу функції? f(g(x))здається, працює для мене просто чудово. І я також вважаю, що отримання карі можна проводити як бібліотеку в цілому на C ++ 11.
DeadMG

1
@DeadMG: Оператор композиційного функціонування є досить усталеною базовою концепцією функціонального програмування. Я би сподівався знайти його мовою, що підтримує FP. Мені дуже зручно (стисло) визначати складну функцію як склад інших функцій (наприклад, як ви робите з трубами в Unix) без використання змінних: k = h. г. f
Джорджіо

1
@Giorgio: std::bindпідтримує такі речі.
DeadMG

5

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

Ви не будете писати ідіоматичні C ++, але це приблизно так само "між ними", як це стає.

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

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


Дійсно, працюючи в таких галузях, як розробка консольних ігор, де ми дуже хотіли "мови між C і C ++", саме це ми і зробили. Ми використовували підмножину функціоналу C ++, з певними речами поза межами або, швидше за все, поза межами в критичних для циклу робочих циклах.
Carson63000

3

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

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

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


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

@ Giorgio Я погоджуюся з вашим колегою, хоча у Obj-C також є деякі обмеження (можливо, деякі з них пішли з Obj-C 2.0), наприклад, я хотів би мати перевантаження "методів" (селекторів) - btw я хотів би функція, що перевантажує a la Fortran в C ...
ShinTakezou

2

Вбудований світ вказав Вбудований C ++ , який, можливо, ви шукаєте. Вони видалили такі речі, як багаторазове успадкування тощо. Наскільки я усвідомлюю, він досить сильно вимер.


0

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

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