什么高级语言最像C语言?

10

我一直在学习C语言:它是一门美丽而周密的语言。然而,由于它是如此底层,因此编写任何类型的大型项目变得很繁琐。

有哪种高级语言拥有最接近C语言的语法——但不像C++那样混乱呢?是否存在这样一种语言呢?


3
"Clutter"的定义是指杂乱无章、混乱的物品或事物。"Most like"的意思是最相似或最类似的。 - Oded
5
语言层次越高,因为抽象概念增多,你会发现越来越多的“冗余内容”。 - Konerak
17
“它是一种美丽、经过深思熟虑的语言。” 你在开玩笑吗? - Adam Harte
9
@TandemAdam,那只是挑衅的话。它是一种相当好的、便携的语言。 - BobbyShaftoe
2
@Konerak:我不这么认为。尽管仍然相当低级,但C++是最混乱的语言。例如,Java比C++更高级且更简洁。 - el.pescado - нет войне
显示剩余3条评论
14个回答

16

哪种高级语言的语法最像C语言,但没有C++这样的混乱呢?

我将回答一个稍微不同的问题:

有哪些语言既像C语言那样设计良好、思路清晰,也适用于系统编程,让人们可以在比C更高的级别上进行编程,并且相对简洁无华?

我认为这个问题并没有一个单一的正确答案,但以下三种语言都值得一提(按字母顺序排列):

  • D. D语言的设计本质上是作为更好、更干净的C++。与C++一样,D被明确地设计成包含很多特性,但人们希望以比C++更清晰、更和谐的方式实现。一个主要的区别是,内存由语言自动管理,并且编译器(和运行时系统)通过垃圾回收来保证安全性,使程序员能够在更高的级别上工作。

  • Go. Go在设计上非常出色,思路精美:Rob Pike是一位大师级设计师,已经练习了这个特定的手艺25年。它的明确目标是不杂乱,并让系统编程“再次变得有趣”。Go仍然是一种新语言,Rob从Squeak、Newsqueak、Alef和Limbo中学到了很多东西。因为Rob理解伟大的设计是没有不必要的部分,所以Go是干净而简洁的。它的主要特点比C更高级,包括类型安全、垃圾回收和优秀的并发模型。

  • Java。Java有一个设计良好的核心(参见Jim Waldo的书Java:The Good Parts),但不幸的是,它遭受了任何成熟、成功语言所积累的杂乱。使Java最适合高级编程的特性包括接口、垃圾回收和异常。

这里的共同点是使用垃圾回收来减轻程序员对内存管理的负担。这对提高生产力有很大帮助。
每种语言都有其优点。我个人偏好小而简单的语言,并且非常欣赏Rob Pike的作品,所以如果必须选择一种语言,我会选择Go,尽管它是新的且未经验证。

2
Java最大的优点 - 也是最大的问题 - 就是它拥有大量可用于实现非常有趣功能的库。这是好事,因为通常都能找到帮助你完成所需功能的库,但这也是坏事,因为找到合适的库(以及学会使用它们,尽管这当然不仅仅是Java的问题)可能非常困难。 - Donal Fellows
1
@Donald:欢迎来到可重用性诅咒:“嗨,我是圣诞老人,我的袋子里有10亿个组件,你可以选择其中任何一个。” - Ira Baxter
1
@RCIX Java和C#基本上不是一样的吗?<戴上石棉服> - Norman Ramsey
不,Java只是一个廉价的模仿品,它出现在之前 :) Java有各种奇怪的规则和拼凑在一起的解决方案(参见Java泛型)。 - RCIX
垃圾回收对于性能高、系统级编程并不好,这可能是C语言最好的使用场景。而Java则在强制文件布局和将所有内容塞入人工对象格式方面提供了繁琐的杂物,这两者都会强制程序员应对他们永远不应该处理的摩擦。我几乎认为将Java包含进来是一个愚人节玩笑... - SO_fix_the_vote_sorting_bug
显示剩余2条评论

13

在C++中,你可以编写C代码并将其成功编译为C++(大部分情况下)。因此,尽管我认为你的术语“clutter”(杂乱无章)既带有贬义又模糊不清,但你将拥有的唯一杂乱无章是你自己选择编写的内容。你可以将C++用作更大的工具包,而无需使用所有工具(或者如果你愿意,可以不涉及杂乱无章的问题)。

因此答案就是C++,无论你喜欢与否。大多数其他类似于C的语言都添加了面向对象的特性,这也许就是你所认为的杂乱无章,但你不可能白嫖,需要有支持额外特性的语法。这些语言包括:

  • Java
  • C#
  • Objective-C
  • D

其中,Objective-C可能是最像C的语言,因为它是C的超集,而C++则不完全是。它也是OSX和iPhone/iPod Touch开发的首选语言,这可能很有吸引力。

Java是无所不在的,但最好描述为表面上类似于C。 C#具有有限的跨平台支持,但对于具有出色免费开发工具的Windows GUI开发来说是最为简单的路径。C#还具有比C++更简单但更具限制性的面向对象实现,因此可能符合你的要求,但它与C/C++的相似之处可能会误导人;它在操作方式上基本上与Java类似。D算是一个小众语言,由单一作者开发(尽管该作者曾是著名的Zortech/Symantec C++编译器的开发者)。

在开始“重大项目”时,“低级”和“繁琐”的问题不会成为阻碍。您很少只使用标准库和操作系统API从头开始编写,而是利用第三方和内部开发的库来快速开发更高级别的功能。尽管如此,面向对象的方法通常更适合这种“代码重用”方法,当然C++的标准库和第三方库更加广泛(因为它可以使用C库和C++库)。事实上,我认为除了支持OO之外,唯一使C++更高级的东西就是通过类作为一等对象进行扩展性。尽管如此,它仍然适用于系统级语言。


3
你说基于答案可以使用语言“作为更大的工具包,而不必使用所有工具(或杂物)”,但是你却说答案是C++,我不明白。根据这个标准,为什么实际上是C的超集的Objective C不是更合适的答案呢? - Ken
@Ken:这可能是真的,但Objective-C跨平台支持较差,在一般情况下使用也不如其他语言广泛,因此相关帮助、支持和参考资料并不是那么普遍。不过,对于OSX和iPhone开发来说,它仍然是一个不错的选择。 - Clifford
1
C#神话之一:“C#跨平台支持有限”。http://www.mono-project.com/Main_Page - Callum Rogers
@Callum Rogers:Mono的.Net Framework支持比我上次看到的更全面,但并非100%。可能足以使我的说法不正确。我意识到C#和.NET Framework是分开的,但几乎没有编写不使用.NET Framework的C#代码。 - Clifford
@Callum:实际上我撤回之前的说法。C#确实有有限的跨平台支持,这不是一个神话。C#需要一个底层运行时,目前由.NET、.NETMicro或Mono提供。C++可以在裸机硬件上运行,甚至没有操作系统。即使.NETMicro也需要一个32位处理器,内存大于256Kb。而C++可以在一个8位处理器上运行,只需16Kb的RAM。跨平台不仅仅意味着Windows、Linux和OSX。 - Clifford

12

谷歌的Go语言语法与C类似(虽然有所不同),同时具备垃圾回收、多态等功能,这些功能是集成在语言中的。


2
Go看起来很棒,我正在尝试它。 - Aaron Yodaiken

9
D编程语言旨在成为C++所应具备的(并非对C++进行攻击,C++是我的主要语言)——引自该网站的话:“D是一种系统编程语言,其重点在于将C和C++的强大性能与Ruby和Python等现代语言的程序员生产力相结合。特别关注质量保证、文档、管理、可移植性和可靠性需求。” D的问题在于它相对于许多语言来说还比较新,但幸运的是它仍然可以使用C库,从而允许它访问大量现有的代码库。值得一看。
Java是另一个选择,然而它明显比C慢。语法上非常相似,为编写代码提供了良好的面向对象环境。它也被大多数人认为是比C和C++更安全的语言。它在企业中被广泛使用。
Python虽然语法上不像C,但它是一种高级面向对象编程语言,非常流行,并且可以导入C模块,这可能在以后非常有用。

1
Python在精神上非常像C语言。基本模块只是对操作系统提供的薄层包装。Python信任程序员,给予了足够的自由度,你可以自己拿绳子去上吊。(真的!) - u0b34a0f6ae

5
这是一个过于宽泛的问题,最好将其作为社区wiki。然而,在我看来,C语言的主要特点是紧凑性。整个语言可以用像K&R这样的小书来描述。人们可以轻松记住所有的句法细节(因为有这么少的细节),它也不试图保护用户免受自己的伤害。
诸如C++之类的语言则更加复杂。很难记住所有的规则和例外情况。我对Perl和Ruby也有同样的感觉。需要记住很多东西并且需要注意很多事情。
我感到Python也具有相同的紧凑感(尽管可能不如C)。几乎没有“特殊语法”,所有的库和模块都以类似的方式操作。
这(可能像这个问题上的大多数其他评论一样)是个人评价,绝不是最后的结论。

嗯,我区分编程错误(segfaults等)和语言强制执行的规则之间的差异,你可能会被绊倒。C语言在其语言规则方面非常一致。 - Noufal Ibrahim

4
也许是Java和C#...我认为Java更多一些。
重点不在语言上,而在于库。试试Qt(http://qt.nokia.com/)。它是用于C++的,我知道你说的是C,但我只是想说明一个观点,你会发现自己写的代码量与Java或C#应用程序中写的代码量一样少(甚至更少!)。而且它们是本地化和跨平台的。
一切都在于库。

如果您已经熟悉C99,那么Java代码看起来至少几乎相同。 - helpermethod
是的,许多命名约定也是如此(我猜除了匈牙利命名法)。 - Jake Petroules
我猜这真正锻炼了我们所说的“像C一样”。 :) - BobbyShaftoe

4
我一直在学习C语言,这是一种美丽而深思熟虑的语言。然而,它是如此低级,以至于编写任何类型的大型项目都变得令人疲倦。
有些人会说第二个句子证明了第一个句子的说法是错误的。
另一个观点是,这几乎无法回答。什么是“高级”语言?你对“接近”的标准是什么?语法、计算模型、性能?你想用这种假想语言构建什么样的应用程序?
如果你只想局限于“看起来像”C的语言,为什么呢?作为一个使用过无数编程语言的人,我可以告诉你,编程语言语法的差异通常是相当不重要的。经过一段时间,你可以适应几乎任何语法。

1

我想指出的是,Pascal在语义上(尽管不是在语法上)与C非常相似,因此有一些选项,如Object Pascal、Modula 2、Ada和Oberon,您可以在其中重复使用大部分您已经掌握的非平凡部分,平凡部分只是拼写而已。

就就业前景而言,您可能最好还是坚持使用C#或Java。

编辑

我还要补充的是,在杂乱问题上,重要的是要弄清哪些杂乱是重要的。C的语言定义中确实没有那么多“杂乱”,但相关的杂乱都在源代码中。请考虑以下内容...

//  C
struct mystruct *myvar;
myvar = (struct mystruct *) malloc (sizeof (struct mystruct));
myvar->a = 1;
myvar->b = 2;
myvar->c = 3;
call_something (myvar);
free (myvar);

//  C++
auto_ptr<mystruct> myvar (new myclass (1, 2, 3));
call_something (myvar);

重点在于语言定义中的“混乱”是有原因的。在编写库时进行一些前期工作,可以避免后续的大量工作(和混乱)。即使你正在编写一个库,你也会受益于其他库编写者所做的前期工作。

C示例的前5行可以压缩成一行“mystruct_t myvar = mystruct_new (1,2,3);”的精简代码。相反,编写不良的C++代码可能会更长。 - el.pescado - нет войне
@el.pascado - 你假设有一个 "typedef struct",而且你错过了指针的使用。虽然是真的 - 构造函数实际上只是一个函数,而 typedef 结构只是另一种形式的前期工作,以节省后面的混乱。不过,关于初始化函数的一个要点是,它仍然需要执行我示例中前五行的工作 - 不仅仅是三个成员分配。在 C 中仍然存在额外的混乱 - 尽管它并不总是影响高级库使用程序员。 - user180247
@el.pascado - 实际上,我本意是想表达“调用只是调用,在任何语言中都是如此 - 小的语法差异并不重要,甚至可以使用显式调度决策函数来实现隐式调度机制。我不记得是这个问题还是其他问题,但无论如何,由于评论长度问题,我都放弃了它。 - user180247

1

这个基本指令比较可以让你了解哪些语言相似。

我认为,除了 $ 变量之外,PHP 最像 C,如果你能将 PHP 语言与平台区分开来的话。Java 在某些方面也尝试着这样做,但是过于强调面向对象,不太像 C。


也许PHP有点太高级了,因为它的类型不够严格。 - Aaron Yodaiken

1
Javascript 具有相当类似 C 的语法,是一种非常流行的语言。Javascript 有很多怪癖,但它与 C 有一个强大的相似之处 - 它很简单。完整的 Javascript 规范非常简短,而且这种语言非常强大和高级。不过,从一些丑陋的东西中清理出来会更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接