【问题标题】:what higher-level language is most like c?什么高级语言最像c?
【发布时间】:2010-06-26 07:05:41
【问题描述】:

我一直在学习 C:它是一门优美的、经过深思熟虑的语言。但是,如此低级,以至于编写任何类型的重大项目都变得乏味。

哪种高级语言具有最类似于 C 的语法,但没有 C++ 之类的所有混乱。有吗?

【问题讨论】:

  • 定义“杂乱”,定义“最喜欢”。
  • 语言越高级,你会发现越“杂乱”,因为它的抽象使它更高级。
  • “这是一门优美的、经过深思熟虑的语言”你在开玩笑吗?
  • @TandemAdam,这只是诱饵。这是一种非常好的可移植语言。
  • 我喜欢把 C 想象成没有护栏的高速公路立交桥。是的,它会让你从'A'点快速到达'B'点,但是一个错误的转弯和你去的边缘。注意:如果您以 Ricky Bobby 的声音阅读此内容,则 +1。

标签: c programming-languages


【解决方案1】:

哪种高级语言具有最类似于 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 最适合高级编程的特性是接口垃圾收集异常

    李>

这里的共同点是使用垃圾回收来减轻程序员的内存管理负担。这大大提高了生产力。

每种语言都有很多值得推荐的地方。我自己的喜好是小而简单的语言,我非常欣赏 Rob Pike 的工作,所以如果我必须为自己挑选一种,那就是 Go,尽管它是新的且未经证实的。

【讨论】:

  • Java 的最大优势——坦率地说也是最大的问题——是可用的库数量之多,它们可以做非常有趣的事情。这很好,因为这意味着通常有一些东西可以帮助你做你想做的事,而这很糟糕,因为找到合适的库(并学习使用它,虽然这当然不是严格意义上的 Java 问题)可能真的很难。
  • 我正在尝试 Go,它看起来很有趣——D 看起来也不错。谢谢:)
  • @Donal:欢迎来到可重用性诅咒:“嗨。我是圣诞老人,我的包里有 10 亿个组件,你可以拥有其中任何一个。继续选择吧。 "
  • Java 还有一个问题是在某些方面太高而在其他方面太低,它的位置并不一致。
  • @RCIX Java 和 C# 不是基本一样的吗?
【解决方案2】:

在 C++ 中,您可以编写 C 代码并将其成功编译为 C++(大多数情况下)。因此,尽管我建议您的“混乱”一词既贬义又含糊,但您唯一会遇到的混乱就是您选择自己编写的内容。您可以将 C++ 用作更大的工具包,而无需使用所有工具(如果您愿意,也可以使用杂乱无章的工具)。

因此,答案 C++,不管你喜欢与否。大多数其他类似 C 的语言都添加了 OO 功能,这可能是您认为的杂乱无章的东西,但您不会白白获得一些东西,您需要有语法来支持这些附加功能。此类语言包括:

  • Java
  • C#
  • Objective-C
  • D

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

Java 无处不在,但最好将其描述为表面上类似于 C。 C# 具有有限的跨平台支持,但它是具有出色免费开发工具的 Windows GUI 开发阻力最小的途径。 C# 还具有比 C++ 更简单但更严格的 OO 实现,因此可能会满足您的要求,但它与 C/C++ 的相似之处可能会产生误导;它的工作方式与 Java 的工作方式有着根本的不同。 D 有点小众,由一个作者开发(尽管曾是著名的 Zortech/Symantec C++ 编译器的作者)。

关于它“低级”和“乏味”,在着手一个“重大项目”时,您很少会从头开始,只有标准库和 OS API 可用,您会使用第三方和-house 开发了库以快速开发更高级别的功能。也就是说,OO 方法通常更适合这种“代码重用”方法,当然 C++ 的标准库和第三方库更广泛(尤其是因为它可以使用 C 库和 C++ 库)。事实上,我建议除了对 OO 的形式支持之外,使 C++ 更高级的唯一因素是它通过作为一流对象的类的可扩展性。尽管如此,它仍然适合作为系统级语言。

【讨论】:

  • 我不明白。您声称答案的基础是您可以将语言“用作更大的工具包而不使用所有工具(或混乱)”,然后说答案是 C++。为什么作为 C 的实际超集的 Objective C 不是一个更合适的答案?
  • @Ken:可能是这样,但是 Objective-C 的跨平台支持不太好,而且一般应用不太广泛,所以帮助、支持和参考资料并不那么普遍。然而,它是 OSX 和 iPhone 开发的一个很好的答案。
  • C# 神话编号 1:“C# 具有有限的跨平台支持”。 mono-project.com/Main_Page
  • @Callum Rogers:Mono 的 .Net Framework 支持肯定比我上次看的更全面,但不是 100%。然而,可能足以让我的陈述不真实。我意识到 C# 和 .NET 框架是分开的,但编写的 C# 代码并不使用 .NET 框架。
  • @Callum:实际上我收回了这一点。 C# 确实有有限的跨平台支持;这不是神话。 C# 需要当前由 .NET、.NETMicro 或 Mono 提供的底层运行时。 C++ 甚至可以在没有操作系统的裸机硬件上运行。甚至 .NETMicro 也需要具有 >256Kb RAM 的 32 位处理器。 C++ 将在具有 16Kb RAM 的 8 位处理器上运行。跨平台不仅仅意味着 Windows、Linux 和 OSX。
【解决方案3】:

D 编程语言试图成为 C++ 应有的样子(根本不抨击 C++,它是我的主要语言),我从网站上引用,“D 是一种系统编程语言。它的重点是结合C 和 C++ 的强大和高性能以及 Ruby 和 Python 等现代语言的程序员生产力。特别关注质量保证、文档、管理、可移植性和可靠性的需求。“D 的问题是它相对较新与许多语言相比,但幸运的是它仍然可以使用 C 库,这允许它访问大量预先存在的代码库。当然值得一试。

Java 是另一种选择,但它明显比 C 慢。在语法上,它非常相似,并为编写代码提供了一个很好的面向对象的环境。大多数人也认为它是比 C 和 C++ 更安全的语言。广泛应用于企业。

Python 虽然在语法上不像 C,但它是一种高级面向对象编程语言,它非常流行,可以导入 C 模块,这在未来可能非常有用。

【讨论】:

  • Python 在精神上与 C 非常相似。基本模块是操作系统提供的薄垫片。 Python 信任程序员,并为自己提供了充足的绳索。 (真的!)
【解决方案4】:

这个问题太笼统了,最好制作社区维基。

但是,在我看来,C 的主要区别在于它的紧凑性。整个语言可以用 K&R 这样的小书来描述。人们可以毫不费力地记住所有的语法细节(因为它们很少),并且它不会试图保护它的用户免受他们自己的伤害。

像 C++ 这样的语言更加巴洛克。很难记住所有的规则和例外。我对 Perl 和 Ruby 也有同样的感觉。有很多事情要记住,也有很多事情需要注意。

我对 Python 有同样的紧凑感(尽管可能不如 C)。几乎没有“特殊语法”,所有库和模块都以类似的方式操作。

这(可能与该问题上的大多数其他 cmets 一样)是个人评价,绝不是最终结论。

【讨论】:

  • 好吧,我区分编程错误(段错误等)和语言强加的规则,你可能会绊倒。 C 非常符合它的语言规则。
【解决方案5】:

Google 的 Go language 具有相似的语法(尽管我认为已经足够不同)和语义,不过语言中内置了垃圾收集、多态性等。

【讨论】:

  • Go 看起来很棒,我正在尝试。
【解决方案6】:

可能是 Java 和 C#……我认为 Java 更多一些。

这与语言无关 - 与库有关。试用 Qt (http://qt.nokia.com/)。它是为 C++ 编写的,我知道你说的是 C,但我只是要指出,你会发现自己编写的代码与为 Java 或 C# 应用程序编写的代码一样少(甚至可能更少!)。此外,它们是原生的和跨平台的。

关于图书馆的一切。

【讨论】:

  • +1 如果你习惯了 C99,Java 代码至少看起来差不多。
  • 是的,许多命名约定也是如此(我猜要减去匈牙利语)。
  • 我想这确实体现了我们所说的“像 C”。 :)
【解决方案7】:

我一直在学习 C:它是一门优美的、经过深思熟虑的语言。然而,它是如此的低级,以至于编写任何类型的重大项目都变得乏味。

有人会说,第二句证明第一句的断言是假的。

另一点是,这几乎是无法回答的。什么是“高级”语言?你对“亲密”的标准是什么?语法、计算模型、性能?您想用这种假设语言构建什么类型的应用程序?

如果您只想使用“看起来像”C 的语言,为什么?作为一个不知道自己使用过多少种编程语言的人,我可以告诉你,编程语言语法的差异通常并不重要。只要有时间,你几乎可以习惯任何语法。

【讨论】:

    【解决方案8】:

    这个comparison of basic instructions 让您很好地了解哪些语言彼此相似。

    我会说 PHP 最像 C,除了 $variables,如果你能区分 php 语言和 php 平台。 Java 在某些方面进行了尝试,但过于面向对象,无法与 C 相似。

    【讨论】:

    • 也许 PHP 有点高级了,怎么会输掉打字。
    【解决方案9】:

    Javascript 具有相当类似于 C 的语法,并且它是一种非常流行的语言。 Javascript 有很多怪癖,但它与 C 有一个强大的相似之处——它很简单。完整的 Javascript 规范非常短,语言非常强大和高级。不过,最好把它从一些难看的东西上清理掉。

    【讨论】:

      【解决方案10】:

      我只想指出,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.pascado - 你假设有一个“typedef struct”,你错过了指针的使用。虽然是真的 - 构造函数实际上只是一个函数,而 typedef 结构只是另一种形式的前期工作,以节省以后的混乱。不过,关于该初始化函数的一点是,无论如何它都必须完成我示例的前五行的工作——而不仅仅是三个成员分配。 C 语言中仍然存在额外的混乱——尽管它并不总是影响使用高级库的程序员。
      • @el.pascado - 实际上,我本来打算说“调用只是任何语言的调用 - 细微的语法差异并不重要,甚至隐式调度机制也可能是使用显式调度决策函数实现。我不记得是否是这个问题,但由于评论长度问题,我还是放弃了它。
      【解决方案11】:

      我会投票给 C#。我不知道你所说的“混乱”是什么意思,但从可用性的角度来看,C# 很好,因为它避免了 C++ 的一些乏味的事情,比如必须基本上“声明”每个类的方法两次(在头文件,然后基本上在你的类的实现中复制相同的东西)。放弃头文件在其他方面也很好,比如消除大型项目中的依赖冲突或避免循环引用。在 C# 中,编译器会处理所有这些(尽管您仍然必须设置对其他文件或程序集的引用)。

      我从事 C# 已有 10 年了,但我仍然怀念一些指针,不管你信不信,在我看来,它实际上让调试变得更容易了!

      【讨论】:

      • 我不相信! (好吧,我接受这是你的意见......只是客观上不是正确的...... :-))
      • 但是 C# 确实 有指针。 (msdn.microsoft.com/en-us/library/y31yhkeb.aspx)
      • 关于指针的说法起源于Java,它是垃圾。 Java/C#中的引用一个指针。仅仅因为它是隐藏的并且不支持指针运算,并不意味着它不是指针。至于“声明两次”——好吧,你可以说一本书在内容页面上复制了所有章节和章节标题。遗憾的是,C++ 并没有完全分离接口描述和实现,但至少它尝试过。当然,C# 在另一种形式中也有同样的东西——你在接口和实现它的类中复制方法描述。
      【解决方案12】:

      如果您要经常编程,最好了解彼此明确相似的语言。了解诸如 python 或 ruby​​ 之类的高级脚本语言特别有用。如果您可以像 C 中的程序员一样思考,那么您应该可以很好地学习这两者中的任何一个。 许多大型项目利用了 python 或 ruby​​ 等高级语言的快速原型设计,但也利用了 C/C++ 等低开销(快速)编译语言。

      【讨论】:

      • 我已经了解 Ruby,但我学习了 C 并且认为从美学的角度来看,它要好得多。 (奇怪,我知道。)
      【解决方案13】:

      如果您认为 C++ 杂乱无章,那么您就是不知道如何编写有效的 C++,因为没有人强迫您使用任何可用的高级工具。你可以完全用 C 加上你最喜欢的 C++ 特性(比如 AWESOME 标准库)编写一个 C++ 程序。这就是整洁的定义。杂乱无章的语言是 Java/C#,您必须将每个函数放在一个类中。太乱了。

      【讨论】:

      • 这不是真正的问题,但我不同意 C++ 标准库“很棒”。拿容器。它们既不是一回事,也不是另一回事。作为抽象,它们非常容易泄漏,并且迭代器的使用很脆弱。作为数据结构库,它们不灵活,隐藏内部结构并阻止有效扩展。总的来说,它们通常是可以的——例如,如果迭代器总是使用标准库算法或众所周知的健壮习语来操作,你不会关心脆弱性,因为它不会影响你。但是,我不会说“很棒”。
      • @Steve314:您的意思是,作为数据结构库,它们为不同的操作和不同的类型要求提供了各种不同的复杂性,并且非常易于使用且速度极快?或者如何使用任何迭代器接口扩展 STL,充分利用 STL 提供的算法,如排序?
      • 我说它们没问题,但是作为数据结构库,请考虑 std::map。按照这个标准,它不是红黑平衡二叉树,而是抽象的key->data映射。尽管如此,我们都知道它在实践中是什么,并且有时由于抽象的泄漏而依赖于这一事实。因此,从库中受益应该不难,但为每个节点添加额外的摘要 - 例如允许 log n 时间下标。在典型的 C 二叉树库中,这没什么大不了的。在 C++ 标准库中这是不可能的。
      • 我自己写了一个容器库。它通常比 STL 容器更易于使用。 “迭代器”(我称它们为游标)永远不会因插入或删除而失效,并且始终指向同一个项目,即使它已在内存中移动。而且很多时候它都超过了 STL,因为它使用了比 STL 更多的缓存友好数据结构(您不需要知道)。它已经支持使用额外的每个节点摘要的高效下标,并且由于数据结构是与前端抽象数据类型分开的层,因此您可以对其进行扩展。
      • 我并不是说我的库优于标准库容器。它有自己的缺点,也有优点。例如,如果您没有进行太多的顺序访问,而是进行了大量的插入和删除,那么“游标维护”可能会产生很大的开销。关键是没有理由对 C++ 标准库感到敬畏。这不是神的作品。如果你认为它在各个方面都是完美的,那么当你需要不同的东西时,你就会否认。如果每个人都这样,那么 - 一开始就不会有 Boost 侵入式容器。
      【解决方案14】:

      ActionScript 3 怎么样?它很像 Java。

      【讨论】:

      • 真的吗?我认为它会很像 ECMAScript。哦等等,它 ECMAScript。
      • 动作脚本(1,2,3 随便)是 ECMAScript 吗?那么 JavaScript 是 ECMAScript,它是 actionscript,所以 JavaScript 是 actionscript?我敢说很多动作脚本代码在未经修改的情况下不能像 JavaScript/ECMAScript 一样运行,所以它是不同的;也许只是一点点,但它并不完全符合 ECMAScript
      • ECMAScript 和 JavaScript 实际上总是非标准的,因为当您从一个主机应用程序移动到另一个主机应用程序时,您主要使用的对象模型本质上是不同的。诚然,您可以(原则上)将 JavaScript 从一个浏览器带到另一个浏览器,但您不能真正将它带到 Photoshop 中。
      • actionscript 不是只用来flash的吗?
      • 是的,它用于闪存。请原谅我。它不像java,但更像javascript。我的错! .. :p
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多