我一直在学习C语言:它是一门美丽而周密的语言。然而,由于它是如此底层,因此编写任何类型的大型项目变得很繁琐。
有哪种高级语言拥有最接近C语言的语法——但不像C++那样混乱呢?是否存在这样一种语言呢?
我一直在学习C语言:它是一门美丽而周密的语言。然而,由于它是如此底层,因此编写任何类型的大型项目变得很繁琐。
有哪种高级语言拥有最接近C语言的语法——但不像C++那样混乱呢?是否存在这样一种语言呢?
哪种高级语言的语法最像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最适合高级编程的特性包括接口、垃圾回收和异常。
在C++中,你可以编写C代码并将其成功编译为C++(大部分情况下)。因此,尽管我认为你的术语“clutter”(杂乱无章)既带有贬义又模糊不清,但你将拥有的唯一杂乱无章是你自己选择编写的内容。你可以将C++用作更大的工具包,而无需使用所有工具(或者如果你愿意,可以不涉及杂乱无章的问题)。
因此答案就是C++,无论你喜欢与否。大多数其他类似于C的语言都添加了面向对象的特性,这也许就是你所认为的杂乱无章,但你不可能白嫖,需要有支持额外特性的语法。这些语言包括:
其中,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++更高级的东西就是通过类作为一等对象进行扩展性。尽管如此,它仍然适用于系统级语言。
我想指出的是,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);
这个基本指令比较可以让你了解哪些语言相似。
我认为,除了 $ 变量之外,PHP 最像 C,如果你能将 PHP 语言与平台区分开来的话。Java 在某些方面也尝试着这样做,但是过于强调面向对象,不太像 C。