迁移代码库时,下一代低级语言哪种最好?

30

假设你的公司正在大量使用C/C++,并且你想开始规划迁移到新技术,以免像15年前的COBOL公司一样遭受灾难。

目前,C/C++ 运行得非常好,并且市场上有很多相关开发人员。

但是你想现在开始考虑这个问题,因为由于巨大的代码基础和数据敏感性,你觉得在不过度使用预算和开发团队的情况下,可能需要5-10年才能迈向下一步。

你听说过D语言,它正在逐渐成熟,还有Go语言,它有望变得非常流行。

你会选择哪一个?为什么?


11
当我没注意的时候,COBOL离开了吗? - Nosredna
14
为什么有些人认为COBOL依然活跃呢?是的,由于人们别无选择,因此还存在一些遗留的维护项目,但从现实意义上来说,它已经死了,再也没有人会为新项目使用它。如果15年后C++也走向同样的境地,我也不会感到惊讶。 - dsimcha
9
COBOL仍然存在,非常存在,而且独自存在,这就是问题所在。在我的国家,整个邮政支付系统都是用COBOL编写的。美国也是如此:http://www.careerjet.com/cobol-jobs.html。但是,没有人想再使用COBOL编程,甚至不敢想象学习它,无论工作待遇多么优厚,有些工作机会的薪资待遇都是极高的。 - Bite code
3
你想保持低层次的编程有特别的原因吗?十年前的 C 程序今天可以很好地转化为 Python 或 Ruby 程序,并且代码会更加简短! - Ken
6
你在开玩笑吗?如果我薪水翻倍,我会为了你学习COBOL。即便是这份工作需要学习COBOL,我也会去学。问题在于,不论报酬如何,老式COBOL系统的问题在于它们枯燥无味,没有人想要从事那些只会让人听起来像“维护一个旧系统,并且永远不再发明任何东西”的工作。我不知道这样做对错与否,但COBOL就像是一块告示牌,上面写着“我们被困在古老的系统架构中”。 - Steve Jessop
显示剩余5条评论
14个回答

40

D 和 Go 可能会像 Python 和 Ruby 今天一样受到欢迎。它们各自填补了一些领域,尽管 D 原本被认为是 C++ 的全面替代品,但它可能永远无法获得足够的用户支持来取代 C++。更不用说这两种语言都还不够稳定/成熟,而且未知未来 10-20 年的硬件和操作系统是否会支持它们。考虑到 C/C++ 几乎是编译型语言中唯一的代表,并被广泛应用于大多数操作系统和本地代码应用程序中,因此在可预见的未来中,它很可能不会被淘汰。


1
说得好。C语言很棒,而C++则带有足够的功能,我们勉强接受它的存在。 - Matt Joiner
4
很不幸,他们需要非常幸运才能像Python和Ruby一样成为主流。 - Roman A. Taycher

37

C和C++组合在本地/非托管/“低级”语言方面几乎是无与伦比的。

这不是因为它们是最好的语言,恰恰相反,而是因为它们已经存在,能够胜任工作,并且"足够好"。毫无疑问,例如D,在大多数方面都优于C++。但是它在最重要的方面失败了:与所有现有的C++代码兼容性。如果没有这个要求,今天大部分代码将以托管语言编写。今天许多代码库之所以使用C++,仅仅是因为他们去年在使用它,转换到其他语言将是一件麻烦的事情。但是如果他们转换,通常不会转向D,而是选择C#,Java或Python。

D和其他“正在崛起”的语言争夺同样的领域时存在问题,尽管它们更好,但它们不足以激励人们真正切换到它们。

因此,C和C++会继续存在。 C不太可能进一步发展。它就是那样,其中一个填补的领域是"即使对于编译器编写者也很简单"。即使他们再也不修订标准,也没有其他语言可能在这个领域击败它。

C++的演变非常引人注目,C++0x即将到来,他们已经有了一个巨大的功能列表,想在之后实现。C++在任何方面都不是死路。

这两种语言会继续存在。也许在50年后,其他语言会取代它们,但这不会发生在本十年。


36
“这个十年内不会发生” - 在这个十年的最后一个月说起来容易 :) - Lawrence Dol
4
哈哈,你知道我想说什么... ;) 虽然如此,我还是给你点赞了 ;) - jalf
“简洁性,即使对于编译器编写者来说也是如此。”现代优化编译器过于假设代码没有未定义行为,这在许多情况下会导致非简单行为。有些低级程序员想要的东西(可移植的汇编语言)与 C 实际上用于某些用例之间存在不匹配:一个潜在的带符号溢出 UB 地雷区。而且它缺乏一些可以表达 CPU 所能做的事情的可移植方式,比如检查带符号溢出、popcnt 或 bitscan(第一个/最后一个设置位,尽管 POSIX 的 ffs() 只能实现一个方向),或饱和算术。 - Peter Cordes
2
Rust是一个重大的改进:整数原始类型具有popcnt、查找第一个/最后一个集合、旋转、位反转、饱和或包裹操作、算术与逻辑右移等方法。在具有本机支持的CPU上,您可以获得有效的代码,而不需要编译器将整个循环识别为popcnt习语。在其他目标上,您将获得编译器作者为该目标设计的任何有效模拟。 https://doc.rust-lang.org/std/primitive.i32.html。 - Peter Cordes

24

我目前经常使用D语言。但由于它处于太过尖端的阶段,我不建议那些写生产代码的人使用它。我可以用它来进行生物信息学研究原型程序的编写,这是因为我的许多代码都是研究性质的。然而,该语言正在开始稳定下来。Andrei Alexandrescu将在明年三月份出版名为“D程序设计语言”的书籍,并且现在正在推动将第二版语言规范稳定下来,以便赶上这本书的出版。

D虽然不是C语言的正式超集,但除了没有预处理器之外,我认为它是一个习惯性的超集。换句话说,任何用C语言编写的代码(忽略预处理器),都可以轻松地转换为D语言而无需重新设计,因为D语言中存在指针和内联ASM等C语言概念,并且在D语言中与C语言相同。此外,D还支持直接链接到C代码,并且D标准库包括整个C标准库。

尽管由于D语言仍然处于尖端阶段而缺少库,但它是库编写者的梦想,因为它具有元编程能力。如果它获得成功,它可能会有一些非常出色的库。要预览此功能,请参见D2标准库(Phobos)中的std.range或std.algorithm。作为另一个示例,我在D语言中作为纯库实现了类似于OpenMP的并行模型(并行foreach、并行map、并行reduce和futures),而没有任何特殊的编译器支持。(请参阅http://cis.jhu.edu/~dsimcha/parallelFuture.html

考虑到你主要关注长期利益,我建议先给D语言六个月的时间来稳定下来(鉴于Andrei的书以及当前推动将该语言规范稳定下来,第二版应该会稳定下来),然后再好好研究它。

编辑:现在,由于核心语言规范相对稳定,重点已转向工具链和库的开发,我可以推荐使用D语言进行小型生产项目,除非您处于非常保守的环境中。但是,必须具备良好的工具链和库支持的大型项目仍然需要等待。


你需要对C语言的内存和硬件有深入的根本理解才能有效地使用“D编程语言”吗?换句话说,学习这本书是否需要具备C语言的知识作为先决条件? - Honinbo Shusaku
这取决于您的用例。您可以通过编写内联汇编、使用自己的内存管理并像C/C++一样避免使用运行时来尽可能地降低D的使用难度。另一方面,您也可以选择高级别的应用,这时D就会变得像Java或其他流行的多范式语言(如Java、C#等)。 - DejanLekic

15
如果你相信精益制造原则,那么你应该努力实现“尽可能晚地做出决定”。这个时刻应该是最后负责的时刻,也就是指在这一刻之前不做决定会消除一个重要的选择。
我认为这个原则可以应用到你的情况中。与其现在就选定一种编程语言(你不知道它是否会在未来10年内流行),不如保持开放的选项。也许重构你的代码,使其更加通用或者基于更多的抽象化构建,这样当迁移确实需要进行时,过程会更加容易。

2
这个原则听起来很不错。我希望过去能更多地考虑它。 - Matt Joiner

14

坚持使用C和C++。我看不到它会走COBOL的路线,它与其他语言一样运行良好,并且你会很容易找到编写C和C++代码的人。


14

C++ -- 它相对较年轻并经常更新... 它有许多编译器供应商,并且不断得到改进。

C -- 它将在很长一段时间内填补汇编语言和高级语言之间的空白。它也是非常简单和易于实现的语言,因此它将保持第一个适用于各种“奇怪”架构的语言,如嵌入式或全新的架构。

D 很有前途,但仍然具有非常新和不稳定的规范和库。

Go 几周前才诞生... 不要在大型重要项目中使用版本 0 的任何东西。另外,它比 C++ 或者 D 受限制得多。


1
关于C++,它一直在不断改进 - 只需看看03和11的区别。我最初接触C++时并没有了解版本的差异;我只是假定教程是针对“那个”版本的。后来重新开始并致力于使用C++11/14时,我惊讶地发现C++11增加了多少功能。这就是C++一直应该有的样子(也是我下意识希望C语言拥有的)。而且它只会变得更好! - underscore_d

10

2019年更新: C ++将在未来的10年里继续存在......(如果不是,当这个答案不再相关时,我会更正它....)

公司今天使用COBOL的原因是因为他们已经编写了数百万行的COBOL代码。如果他们可以扔掉它,他们会一次性地这样做,另一方面,公司使用C / C ++作为其需求的一部分,并使用这种语言开发新项目,因为他们不能/不想使用Java / C#或其他基于框架的语言 - 因此COBOL不是这里的比喻。


友情提醒,已经过去10年了,是时候更新您的答案了。 - Malekai
C++也将在接下来的10年中继续存在。 - Dani

7
像dsimcha所说的那样,D语言目前存在风险。然而,该语言具有巨大的潜力,它是低级别的,我使用D语言的生产力明显提高(而不是C++)。也许这就是人们使用动态语言的感觉。
Go语言在博客中被过度营销,这对我来说像个笑话。 调度接口方法并不容易,实际上比调度常规的单继承方法要慢。
如果您有一个庞大的代码库,决策当然更加困难,我建议只为新项目切换,而不是现有项目。

6
我建议不要过于关注一门编程语言,而是更多地关注围绕它的库。C++与boost库的结合是一个很好的选择。开发C++的人往往对计算机有更好的理解。我自己最开始使用Java,因为它隐藏了很多基础知识,这很好,但只有当我学习了C/C++(指针等)时,我才真正开始理解编程。
我认识到C++可能很难(例如内存管理),所以我认为有一门“附加”语言是很好的,其中性能并不重要,可读性(==可维护性)很高:我推荐Python。

3

目前有大量机器正在运行C++软件,我并未看到它们全部同时关闭。如果C++将走向COBOL的道路,那么应用程序迁移市场将会很大。届时将会开发专门的工具来将C++应用程序转换为当下流行的语言(例如Z++?)。

所以我的建议是:踏入这个领域时再做决定。


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