Java和Cobol的区别

5

有谁能帮忙比较和对比Java和Cobol在技术差异以及架构设计风格方面的不同之处?


哎呀,从哪里开始呢!这个问题的答案会非常长。 - Kris Krause
@dragthor:环境部分怎么样? :) - t0mm13b
1
可能是重复问题:https://dev59.com/i0vSa4cB1Zd3GeqPcjRO - pavium
1
+1 有很大的搞笑潜力 - Itay Moav -Malimovka
今天早些时候有人问过,显然是同一个人:http://stackoverflow.com/questions/2029397(但这次措辞略微更好) - kdgregory
+1 对于一个有趣的问题来说是不错的,尽管有点像捉弄人 :) - Larry Watanabe
6个回答

4

相似之处

  1. Cobol和Java曾试图改变世界并解决编程问题。

  2. 但它们都没有达到最初的炒作效果。

  3. 现在有很多庞大而笨重的Cobol和Java程序被银行使用,并成为"遗留代码"...太大且关键,无法重写或丢弃。

  4. Cobol引入了在代码中使用长而易读名称的想法。Java推荐使用长而易读的名称。

不同之处

  1. Cobol由美国人Grace Murray Hopper发明,她获得了国防部最高奖项-国防杰出服务奖章。

  2. Java由加拿大人James Gosling发明,他获得了加拿大最高的文职荣誉-加拿大勋章官员。

3 COBOL约定使用“-”来分隔名称中的单词,Java约定使用大小写驼峰命名法。


2

COBOL是一种流行的编程语言,用于开发商业应用程序。

由于其语法非常清晰且类似于人类语言,采用过程化风格编写,因此更容易适应业务环境的变化。例如,将pi的值分配给一个变量,然后从中减去零 - 这是一个简单的示例,展示了COBOL语句/句子的实际情况(我已经多年没有编写COBOL代码了)。

MOVE 3.14 INTO VARPI.
SUBTRACT ZERO FROM VARPI GIVING VARPIRESULT.
IF VARPIRESULT AND ZERO EQUALS VARPI THEN DISPLAY 'Ok'.

如果我没记错的话,COBOL语句必须在第30列...

因此,COBOL更容易进行故障排除,因为任何潜在的业务逻辑错误都可以轻松地定位。此外,由于COBOL运行在主机系统上,因此数据传输速度比其他系统(如PC)快得多,这也是COBOL数据处理极快的另一个原因。

我曾在主机(IBM MVS/360)上处理Y2k问题,这在21世纪初是不可思议的,祈祷我所做的修复措施不会使业务应用程序崩溃...除此之外...至今仍在使用,因为数据在主机内部传输速度非常快,而且易于维护。

对于Java来说,它不仅无法做到这一点,而且是否有IBM MVS/360、390、AS400等主机的Java端口可用?

现在,企业不能放弃COBOL,否则他们将有效地“自杀”,因为他们的业务应用程序就在那里。这也是升级、迁移或转换到其他语言过于昂贵并会在今天的商业世界中引起严重头痛的原因...

此外,想象一下必须重写过程化代码(遗留代码),其中可能包含关键业务逻辑,以利用Java的OOP风格,最终结果将是“失去翻译”,需要大量耐心、压力和压力。

想象一下,一个医疗保健系统(我曾为其中一个工作,它运行在我上面提到的系统上),要放弃所有的索赔处理、计费等(以COBOL编写),转而使用Java,还有潜在的故障和不言而喻的巨额投资,这将使医疗保健公司自身付出更多代价,最终结果将是混乱、损失和客户(提供员工福利的公司)会为了更好的公司而放弃该公司。

因此,回答您的问题,我希望我已经说明了差异 - 总结如下:

COBOL是:

  • 过程化语言
  • 简单易懂的语法
  • 在主机系统上非常快
  • 由于语法易于维护代码

相比之下,

Java是:

  • 面向对象的
  • 语法可能会变得复杂
  • 需要Java虚拟机才能运行和执行已编译的字节码。

希望这可以帮到您,


目前,我的客户正在进行一个项目,他们正在退役一款运行在主机上的十年老龄COBOL应用程序,并用基于Java的替代方案来替换它。这个新系统仅用了大约6个月的时间编写,因为维护主机的成本太高了。起初,每个人都有点担心(可能现在还是),因为要替换一个多年演变成庞大的代码块、包含各种逻辑和验证的系统!但是新系统似乎很有前途。但是没错,我们从未听说过主机出现性能问题。 - Raj
@Ranju V:哇!祝你迁移策略好运...希望一切顺利,这肯定是一个重大的冒险商业决策...祈祷一切顺利...如果你能在这里回复一下进展情况,那对其他人来说将是非常宝贵的阅读材料... :) - t0mm13b
所有的IBM操作系统都有Java端口可用。而IBM企业Cobol通过交叉继承与Java相互操作良好。不过我不同意你对于语法的看法 - Cobol有1000多个保留字和上下文相关的语法,具有非常扭曲和难以处理的语法结构,尽管大多数英语使用者可能已经适应了它。而另一方面,Java只有极少数的保留字和上下文无关的语法,非常简洁美观。 - Joe Zitzelberger
@Joe:显然你不欣赏COBOL语法是简化和更易理解地实现业务逻辑变更的基础...这就是我想表达的观点...试着向那些需要对现有业务逻辑进行更改的人解释如何使用Java迭代器、枚举器和泛型,这是大公司不能放弃它的另一个原因,因为它是他们业务的支柱! - t0mm13b

1

更容易指出它们的共同点,而不是列举它们的不同之处。

因此,这里是列表:

  1. 您可以使用两者来使计算机执行操作
  2. 它们都编译为不同的语言(机器代码、字节码)
  3. 就是这样!

5
它们两个都有循环和条件。 - Itay Moav -Malimovka
区别:这两种语言的名称没有任何共同字母。这有帮助吗? - Ira Baxter

0

相似之处:

  1. 两者都非常冗长,是为了考虑到管理层而不是程序员而创建的。
  2. 两者主要用于枯燥的商业软件。
  3. 两者都有庞大的遗留系统,并将继续存在一段时间。

程序 -> 服务;JCL -> XML;复制本 -> Beans;等等。我想知道有多少Java程序最终比等效的COBOL程序(系统)更长? - Roboprog

0

Cobol是一种纯过程式语言,甚至连函数也不支持(我在90年代使用Cobol时,可能已经发生了变化)。 Java是面向对象的(虽然我听说Cobol也有面向对象的版本),哦...而且语法不同。


相似和不同之处的优秀列表:http://www.jsrsys.com/jsrsys/s8383sra.htm

这就是我们所做的! COBOL:COBOL概念描述 Java:Java/OO类似概念 ++:Java/OO添加到概念中的内容 当我开始学习Java时,我曾经认为OO(面向对象)只是好的编程实践,除了更正式外,编译器还强制执行某些限制。

我不再这样想了。然而,当你刚开始学习时,我认为某些“类似于”示例将帮助你理解这些概念。

COBOL:加载模块/程序 Java:类

COBOL:PERFORM Java:方法 ++:可以向方法传递参数,更像FUNCTION 如果声明为public,则其他程序/类可以调用不同类中的方法。 public/private使设计者可以控制其他类在类内部看到什么。

COBOL:工作存储,静态链接子例程 Java:实例变量 ++:(见下文)

COBOL:工作存储器,动态加载子例程 Java:类变量 ++:Java可以混合使用类变量(称为静态变量,正好与我们COBOL示例相反)和实例变量(默认)。 类变量(静态变量)仅在每个类中出现一次(实际上在一个JVM运行时环境中)。 实例变量对于类的每个实例都是唯一的。 这里有一个来自JsrSysout类的例子。根据我COBOL的背景,我喜欢通过DISPLAY将重要数据输出到SYSOUT数据集来调试我的代码。有一个Java方法可以实现这一点,即System.out.prinln(...)。但是,这种方法的问题在于,你想要的数据会在Java控制台上滚动显示,这相当于SYSOUT或者如果您有自己的独立机器,则相当于DISPLAY UPON CONSOLE。我需要一种方便的方法来停止屏幕已满时的显示。由于只有一个Java控制台,因此屏幕的行数显然需要是一个类变量,因此所有实例(每个记录日志的程序/类都有其自己的JsrSysout实例)都会在屏幕底部停止。
同一类的多个实例: 一个(调用程序)类可以创建同一类的多个实例。为什么要这样做呢?一个很好的 COBOL 示例是 I/O 例程。在 COBOL 中,您需要为每个要访问的文件编写一个 I/O 例程。如果您想在一个运行时环境中两次打开特定的文件,则需要使用不同名称的不同 I/O 例程,即使逻辑相同。
使用 Java,您可以为特定的逻辑文件类型编写一个类。然后,对于您希望读取(或写入)的每个文件,只需使用 new 运算符创建该类的另一个实例。以下是程序 IbfExtract 中的一些代码片段,它们正是这样做的。该程序利用了我编写的 Line Input 类和 Line Output 类。它们被称为 JsrLineIn 和 JsrLineOut。
这说明了 Java 的另一个动态特性。当输出首次创建时,它是一个空指针数组,占用非常少的空间。只有在创建新对象并将其指针隐式放入数组时,才会分配对象的存储空间。该对象可以是从字符串到非常复杂的类的任何内容。

COBOL: PICTURE Java: 没有真正的等价物。 因此,我发明了一种方法来模拟整数输入的ZZZ,ZZZ,...掩码。我通常将我的实用程序函数分组在JsrUtil中。这些方法实际上与任何类型的对象都没有关系。以下是实现此逻辑的padLeft的示例。 padLeft也是多态的一个很好的例子。在COBOL中,如果您有不同的参数列表,则需要不同的入口点。在Java中,参数类型是定义的一部分。例如:

COBOL:十进制算术 Java:在本机Java中没有,但IBM已经实现了一些BigDecimal类。 我认为这是Java在会计类型应用程序方面的主要弱点。我希望看到压缩的十进制数据类型作为本机JVM字节架构的一部分。我想这是因为它不在C或C ++中。我只读过BigDecimal类,所以无法真正评论它们的有效性。

COBOL: COPY或INCLUDE Java: 继承 ++:更加强大!

在COBOL中,如果您更改了COPY或INCLUDE成员,则必须重新编译使用它的所有程序。在Java中,如果程序B继承自程序A,则对程序A的更改会自动继承到程序B中,无需重新编译!是的,这确实有效,并为Java应用程序提供了巨大的能力。我利用这一点来开发我的Read/Sort/Report系统。类IbfReport包含所有报告程序共有的基本逻辑。它具有其所有方法的适当默认值。类IbfRP####扩展了IbfReport,并仅包含特定报告所需的方法。如果在IbfReport中进行更改,则在下次运行IbfRP####程序(类)时将反映出来。

COBOL: ON EXCEPTION Java: try/throw/catch ++:可以限制错误检测的范围(请参见以下内容)

COBOL: OPEN Java: 输入流 ++:自动错误检测,既是福音也是诅咒。

COBOL: WRITE Java: 写入(是的,真的)。

COBOL: CLOSE Java: close方法

COBOL: READ Java: 读取...


1
Cobol具有嵌套子程序,其操作方式与C函数或Pascal函数/过程完全相同。 - Joe Zitzelberger
@Joe Zitzelberger 自从我接触 Cobol 已经超过 10 年了,但所有变量不都在全局作用域吗? - Itay Moav -Malimovka
完全不是这样的。Cobol 85允许嵌套子程序,可以将所有范围限制在封闭的子程序中。使用GLOBAL关键字可以与所有封闭的子程序共享变量,使用COMMON关键字可以共享子程序。嵌套子程序提供了很好的受限范围。我承认有一些Cobol程序员仍然喜欢以Cobol 74风格编写他们的代码,其中所有内容都是全局的,但语言本身并没有阻止一个有良心的程序员编写良好封装的Cobol代码。 - Joe Zitzelberger
就我所知,Cobol 的许多问题在于它没有区分“程序”和“函数”,而是将它们都称为“程序”。因此,所有内容对于“程序”来说都是全局的,但一个“程序”可以包含无限数量的“程序”,这些“程序”限制范围且仅为父级“程序”所知 -- 即其他语言所称的函数或过程。 - Joe Zitzelberger
@Joe Zitzelberger - 感谢您的回答。 - Itay Moav -Malimovka

0

两种语言都针对“编写一次,随处运行”的理念。如果避免使用特定于供应商的扩展,Cobol非常可移植。

Cobol非常注重过程式语言,而Java非常注重面向对象的语言。尽管如此,几十年来已经有供应商特定的OO扩展到Cobol,并且新规范包含正式规范。在Java中也可以编写过程式代码,您可以轻松地将一个程序制作成单个main()方法。

两者都广泛用于企业计算,因为它们相对容易使用。与其他常见语言(如C和C ++)相比,这两种语言都不太容易出错。

最显着的区别是Cobol支持本机定点算术。这在处理财务时非常重要。大多数语言,包括Java,在处理定点数据时仅通过附加库进行支持,因此它们在处理定点数据时慢了许多个数量级,并且在该库代码中容易出现(可能非常昂贵的)错误。


在Java中,您可以轻松使用长整数,并通过10的幂(例如1000)进行缩放以表示十进制数量。使用相同比例因子表示的十进制数相加只需要1个机器时钟,在现代CPU上运行速度超过大型计算机。 - Ira Baxter
你在技术上是正确的。缩放整数确实可行,但容易出现许多故障,无论是程序员不理解正在发生的事情,还是将整数传递给其他可能不会以相同方式进行缩放的软件部分。我明白了,我知道它可行,我也做过,但它远远不如在共享副本中定义的本地定点支持那么好。 - Joe Zitzelberger
如果你在使用Java或C#编程,你就不需要复制书。你可以将缩放的int打包到一个类中,该类的方法会自动处理缩放。"其他软件可能无法以相同的方式进行缩放":这是其他软件的问题。像所有其他编程API一样,如果你正确使用它们,它们就能正常工作。如果你不这样做,就会出现错误。(我们碰巧在由遗留Cobol自动翻译创建的Java或C#程序中使用了它。翻译器生成了正确的代码)。 - Ira Baxter

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