C和C ++之间是否有语言?


18

我真的很喜欢C的简单和透明的性质:当我编写C代码时,我不受“泄漏抽象”的束缚,并且几乎总能对我正在生成的程序集做出精明的猜测。我也喜欢C的简单,熟悉的语法。

但是,C没有C ++提供的这些简单,有用的东西,例如类,简化的非字符串处理等。我知道可以使用跳转表之类的东西在C中实现,但这有时有点麻烦,并且出于各种原因也不是很安全的类型。

不过,我不喜欢过分强调C ++中的对象,并且我对“ new”运算符等不屑一顾。例如,C ++似乎有太多的障碍,无法用作系统编程语言。

在小部件和小工具的规模上是否存在介于C和C ++之间的语言?

免责声明:我的意思是纯粹是事实问题。我不想激怒您,因为我不同意您的观点,即C {,++}足以胜任我计划的一切。


10
您说您的问题“完全是事实”,但您不赞成c ++,因为它“似乎”有太多麻烦。这些打ic是什么,它们是打折C ++的正当理由吗?
whatsisname 2012年

2
“小部件和装饰的规模”是多少?如果您想为“纯粹事实”的问题提供真实答案,则应避免使用无意义的指标。
Caleb '04

2
关于C ++的一些陈述背叛了一些误传。new主要是增强功能malloc还可以为您初始化内存。使用“ placement new”和operator new,您可以决定如何以及在何处分配内存。至于对象强调:在您上面的几行指出,您认为类是“简单,有用的东西”。下定决心!

25
使用C+ 免责声明:抱歉,我无法t resist. It4
knut

2
这听起来很像连续性假设,而且答案可能相同。(en.wikipedia.org/wiki/Continuum_hypothesis
约翰·史密斯

Answers:


29

这些可能是您要寻找的机器人...

转到-http: //golang.org/

D- http://dlang.org/

锈-http: //rust-lang.org/


5
@dtech:D拥有毫无意义的GC /“从对象继承的一切” /值必须糟透了。我已经有了C#,它实际上具有不错的工具。去吧,我承认我对为什么丢弃它的记忆有些模糊,但是正如我回想的那样,它剪切了几个非常有用的功能。
DeadMG

4
-1表示“ C ++应该是什么”。C ++就是它的本质,如果您无法处理,那很大程度上就是您的问题。您可以使用更适合您的语言来处理它,但这并不意味着C ++ 应该已经像该语言一样。
back2dos 2012年

7
@DeadMG在D上,您做了2条有意义的声明:GC是强制性的,所有东西都必须是一个对象。两者都是错的。这使我认为您的结论更多是基于无知而不是实际知识。我必须同意CodexArcanum。
deadalnix 2012年

5
@deadalnix:从技术上讲,您可以选择不使用GC。但是,由于您无法知道或控制哪些库函数或语言功能在使用GC,因此实际上没有办法生成不使用该函数的程序。而且您不能创建不继承自Object的类。与structC ++值相比,它们的严重不足-例如,没有继承,没有右值引用,因此不可能像D中的值字符串类那样简单地产生像C ++等效的东西。这些都是关于D语言的事实。
DeadMG

5
@DeadMG:创建没有继承的结构是一项功能,而不是““脚”。他们做对了,历史上几乎所有没有命名为“ C ++”的OO语言(包括Simula,原始的OO语言)都正确了,而C ++却犯了不可思议的错误。 继承和值类型不能混合使用。 它打破了对象身份,打破了Liskov替代,打破了整个OO范式。
梅森惠勒

19

有相当多的语言(例如Java,Go,D,Objective-C)与C ++大致平行,或者试图解决作者在C ++中看到的问题。

但是,至少IMO,就大多数实际目的而言,所有这些工具的性能都大大低于C ++。

不幸的是,根据您对知道将要生成哪些汇编代码的明显喜好,我们可能会立即排除Objective C和Java。

从理论上讲,我认为Go是其中最有趣的-它具有一些真正新颖的想法和解决问题的有趣方法,这些问题使某些类型的代码更加容易。不幸的是,当前的编译器无法生成非常好的代码,并且在过去几年中在这方面没有太多改进。

这几乎让D成为唯一有机会的人。它可能最类似于C ++(其中的C ++),但也最不可能解决(IMO)的问题。

留下一种明显的方法:使用C ++,但仅使用所需的部分,而避免使用不喜欢的部分。


13
+1表示“使用C ++并避免了不喜欢的部分”。我建议OP来学习更多的C ++,人们常常因为对事物的了解不够而拒绝事物。
Doc Brown

1
@DocBrown也许是因为要了解C ++并非那么容易。
马尔科姆

3
@Malcolm:深入学习现代C ++当然很困难。但是,另一方面,绝对没有理由“对新的运营商害羞”,这听起来对我来说是迷信的。
Doc Brown

3
@Malcolm:可能是因为概念很简单。我需要UTF-32字符串文字还是UTF-16字符串文字?好吧,假设您知道wtf字符串编码的基础知识,那么这是一个很容易回答的问题。还有那些难点?它们存在是有原因的。例如,Java的泛型。与模板相比,它们是可悲的。当然,要学习的东西更少,但这仅仅是因为它们不是很有用。这就像把任何比Brainfuck复杂的事情称为困难一样。
DeadMG

3
@马尔科姆:完全不对。流行度受99999项内容的影响,除了该语言是否好/有用。
DeadMG

16

但是,C没有C ++提供的这些简单,有用的东西,例如类,简化的非字符串处理等。我知道可以使用跳转表之类的东西在C中实现,但这有时有点麻烦,并且出于各种原因也不是很安全的类型。

不过,我不喜欢过分强调C ++中的对象,并且我对“ new”运算符等不屑一顾。

抱歉,好友,矛盾警报。非字符串处理要求 new。这是根本的必要。你不能std::string没有new。此外,new/ delete完全等同于malloc/,free更安全,因为它保证正确构造和销毁堆对象(完全必要!),并使用异常处理而不是NULL返回,因此在每种可以想象的方式中都优于。在C ++ 11中,非常有可能编写自己的new样式函数,因为完美的转发功能使您可以处理任何类型的任何构造函数。如果您不屑一顾new,那么我建议您根本不知道您在处理什么。

哦,是的,并且智能指针使它成为可能,因此您永远都不必自己真正地处理任何此类问题。

此外,在C ++中没有过分强调。您不必使用任何不需要的对象。您可以随时使用lambda进行功能编程。没有人强迫您使用继承和虚函数-实际上,许多好的C ++程序很少展现继承。模板是更强大,更有用的抽象技术。这不是Java。


1
我同意。最好使用您想要的方式使用C ++,而不是搜索(可能逊色的)替代方案
dtech 2012年

1
我认为lambda不足以进行功能编程。我还希望有一个函数组合运算符,currying等。另请参阅stackoverflow.com/questions/1981400/functional-programming-in-c。对我来说,感觉就像是在C中进行OOP ...
Giorgio'4

@乔治:这个问题的答案只是说“很难!”。他们没有提供任何证据证明这实际上是困难的。为什么要为功能组合使用单独的运算符?f(g(x))似乎对我来说很好。而且我也相信,可以将Curcurring作为C ++ 11中的一个通用库来完成。
DeadMG

1
@DeadMG:函数组合运算符是函数编程中一个非常完善的基本概念。我希望能以支持FP的语言找到它。我发现将一个复杂的函数定义为其他函数的组合非常方便(简洁)(例如,就像您在Unix中使用管道一样)而无需使用变量:k = h。G 。f
Giorgio

1
@乔治:std::bind支持这样的事情。
DeadMG

4

C几乎是C ++的一个子集,因此您可以只使用自己喜欢的C ++部分,而忽略其余部分。甚至有可能写出有效的C,它也是有效的C ++。

您将不会编写惯用的C ++,但这实际上就相当于“介于两者之间”。

另外,您可以检查其他尝试将C扩展到更强大功能的语言,尤其是D和Objective-C。

最后,根据项目的性质,您可以采用多种方法:将项目分为模块,然后为每个部分选择最合适的语言。这样做的缺点是您需要使各种语言协同工作,这可能是太多的工作,不值得付出努力。


确实,在诸如控制台游戏开发之类的行业中工作,我们确实想要“介于C和C ++之间的语言”,这正是我们所做的。我们使用了C ++功能的一个子集,其中某些东西是禁止进入的,或更可能是性能关键循环中的禁止进入的。
Carson63000

3

只是提供一个荒谬的开箱即用的答案:如果您想要的语言不存在,为什么不自己做一个?在(F)Lex和Yacc / Bison的老版本中,有各种各样强大的语言开发工具。由于您已经了解C,因此只需要您的“编译器”来输出C代码,然后使用您的现有工具链即可。

比您想象的更简单,更强大。从C的解析器/词法分析器开始,然后添加您认为重要的额外功能。如果跳转表令人讨厌用手编写,请找出一种表达摘要的结构,然后让您的解释器为您编写它们。本质上,这只是使用外部工具进行元编程的更高级别的预处理器元编程。因为您知道C,并且您知道语言扩展将扩展到什么C,所以您始终将确切地知道最终的汇编程序是什么样的。

显然,在不进行大量额外工作的情况下其有效性会有一些限制。添加一个完整的静态类型系统可能要比您想做的要复杂得多,但是如果您发现自己喜欢它,可以尝试一下。您的DSL扩展功能强大且复杂,因为您有时间和精力来制作它们,谁知道呢,也许有一天您的扩展语言将成为“下一个C ++”。


2

您还没有说过什么C ++功能让您讨厌。无论如何,您可以尝试使用Objective-C。它着重于面向对象而不是C ++上的标准库。


2
imho Objective-C是一次微不足道的尝试,目的是将类引入C并以多种方式劣于C ++。此外,它很少在Mac OS X / iOS之外使用。
dtech 2012年

1
@dtech:有趣的是,我的前同事不是Mac迷(而是Debian / Linux的家伙),他坚信Objective-C是C的比C ++更干净的OO扩展。不过,我从未尝试过Objective-C,因此对此我没有意见。
Giorgio

1
@dtech:然后,我谦虚地建议您重新考虑您的意见;)Objective-C与面向对象有关,并且在这方面比C ++更好,因为它引入了消息传递。尽管我同意该语言在许多方面都劣于C ++,但在其他方面也同样出色。
back2dos 2012年

@ Giorgio我同意您的同事的观点,尽管Obj-C也有一些限制(Obj-C 2.0可能已经消除了其中一些限制),例如,我想重载“方法”(选择器),但我想函数重载La Fortran在C中...
ShinTakezou 2012年

2

嵌入式世界指定了Embedded C ++,这可能正是您要寻找的。他们删除了诸如多重继承之类的东西。据我所知,它几乎已经消失了。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.