COBOL(Common Business-Oriented Language)起源于50年代中期,是一种面向过程的高级程序设计语言,主要用于商业和数据处理领域。经过不断发展和标准化,已成为国际上应用最广泛的商业编程语言之一,在某red书上还有招聘COBOL程序员去日本的帖子,个人害怕噶腰子所以不推荐。COBOL语言具有结构化编程、面向业务处理、高度模块化、易于维护和移植以及强大的数据表示能力等特点,广泛应用于商业数据处理、金融领域以及大型企业应用开发,根据一些统计,例如IJARSCT的数据,43%的银行系统仍在使用COBOL,每天处理的交易额高达3万亿美元,其中包括美国95%的ATM交易和80%的信用卡交易。许多关键的政府系统是用COBOL编写的,这些系统可能涉及社会保障、税务、公共服务等多个方面。例如,美国多个州的失业保险系统就是使用COBOL编写的,面对大量申请时,这些系统需要紧急维护和更新。同时随着技术的发展,许多企业和机构可能希望将旧系统迁移到更现代的技术平台上。然而,由于COBOL编写的系统通常包含大量的业务逻辑和数据,迁移这些系统可能需要巨大的成本和时间投入。因此,许多企业和机构选择继续维护这些遗留系统,而不是完全替换它们。
安装Cobol
GunCOBOL(也称为GnuCOBOL或OpenCOBOL)是一个开源的COBOL编译器,具有跨平台特性并支持多种操作系统,同时GnuCOBOL允许COBOL程序无缝地调用C语言编写的函数和库,从而增强了COBOL程序的功能和性能,GnuCOBOL可以直接访问所有C库,甚至是C++基础库。同时支持多种数据库和脚本语言的集成,如PostgreSQL、Firebird、ODBC、DB2、Ada、Guile、Lua、Rexx、Javascript、Python等。
sudo apt install gnucobol
cobc -v
安装成功:
同时这里面会有个错误提示:
cobc: error: no input files
这里表示cobc(GnuCOBOL 编译器)在运行时没有指定输入文件,在此只是验证安装是否成功,不必理会它。
安装VS Cde插件
安装插件 COBOL Language Support 和 COBOL debugger
COBOL Language Support插件
作用:
- 语法高亮与代码补全:提供COBOL语言的语法高亮功能,使得代码更加易读易懂。同时,支持代码自动补全,提高编写效率。
- 错误检查与提示:在编写COBOL代码时,插件能够实时检查语法错误,并提供错误提示,帮助开发者及时发现并修复问题。
- 文档与代码结构导航:可能支持快速导航到函数、变量等定义的位置,以及查看相关的文档说明,提升开发效率。
- 格式化代码:提供代码格式化功能,帮助开发者保持代码风格的统一和整洁。
COBOL debugger插件
作用:
- 调试COBOL程序:允许开发者在VS Code中直接调试COBOL程序,无需切换到其他IDE或调试工具。
- 设置断点:支持在代码中的指定位置设置断点,当程序执行到断点时自动暂停,方便开发者观察程序的运行状态和变量的值。
- 单步执行与查看变量:提供单步执行(步入、步过、步出)等功能,以及查看和修改变量值的能力,帮助开发者深入理解程序的执行流程和逻辑。
- 调用栈与线程管理:可能支持查看当前程序的调用栈信息,以及管理多线程程序的调试。
- 性能分析:部分高级的COBOL debugger插件可能还具备性能分析功能,可以帮助开发者分析程序的性能瓶颈,优化代码执行效率。
输出HELLO
在编写代码前需要先注意一个COBOL语言的特点,就是在写代码之前需要先空5个空格,如下所示:
接下来逐行解析上述代码:
IDENTIFICATION DIVISION.
这一行标志着IDENTIFICATION DIVISION
部分的开始,在COBOL程序中,IDENTIFICATION DIVISION
用于提供程序的描述性信息,比如程序的名字、作者、日期等,这里啥也没写哈。
PROGRAM-ID. HELLO.
这一行指定了程序的名字为HELLO
。PROGRAM-ID
是IDENTIFICATION DIVISION
中常用的一个段落,用于标识程序的唯一名称。
PROCEDURE DIVISION.
这一行标志着PROCEDURE DIVISION
部分的开始。PROCEDURE DIVISION
包含了程序的实际执行语句,即程序要执行的操作。
DISPLAY 'HELLO'.
这一行是程序的实际执行语句之一。DISPLAY
是一个COBOL动词,用于在屏幕上显示信息。这里,它用于显示文本HELLO
。
STOP RUN.
这一行是程序的最后一条执行语句。STOP RUN
是一个COBOL动词,用于终止程序的执行。在这个简单的示例中,程序在显示HELLO
之后就会停止运行。
以下是完整版代码:
-
IDENTIFICATION DIVISION.
-
PROGRAM-ID. HELLO.
-
PROCEDURE DIVISION.
-
DISPLAY
'HELLO'.
-
STOP RUN.
编译并运行程序
cobc -x hello.cob -o hello ./hello
COBOL语言的类概念
这里定义了一个建议的银行小程序,具有初始化账户信息和显示账户信息的功能:
-
IDENTIFICATION DIVISION.
-
PROGRAM-ID. BankAccount.
-
DATA DIVISION.
-
WORKING-STORAGE SECTION.
-
01 BankAccount.
-
05 AccountNumber PIC 9(10).
-
05 AccountName PIC X(25).
-
05 AccountBalance PIC 9(7)V99.
-
-
PROCEDURE DIVISION.
-
-
BEGIN.
-
PERFORM InitializeAccount
-
PERFORM DisplayAccountInfo
-
STOP RUN.
-
-
InitializeAccount.
-
MOVE 1234567890 TO accountNumber
-
MOVE
"GGBond" TO accountName
-
MOVE 1000.00 TO accountBalance.
-
-
DisplayAccountInfo.
-
DISPLAY
"Account Number: " accountNumber
-
DISPLAY
"Account Name: " accountName
-
DISPLAY
"Account Balance: $" accountBalance.
代码运行结果如下:
代码主要分为五个部分:
标识部分(IDENTIFICATION DIVISION)
PROGRAM-ID. BankAccount. * 定义程序的标识符为BankAccount。
在COBOL语言中 * 是单行注释 ,*>
和 <*
之间是多行注释
定义程序的标识符为BankAccount
数据部分(DATA DIVISION)
WORKING-STORAGE SECTION. * 定义工作存储区,用于存储程序运行期间所需的数据。 01 BankAccount. * 定义一个名为BankAccount的记录结构。 05 AccountNumber PIC 9(10). * 定义账户号码,为10位数字。 05 AccountName PIC X(25). * 定义账户名称,为最多25个字符的字符串。 05 AccountBalance PIC 9(7)V99. * 定义账户余额,为最多7位整数和2位小数的数值。
过程部分(PROCEDURE DIVISION)
BEGIN. * 程序开始。 PERFORM InitializeAccount * 调用InitializeAccount段落,用于初始化账户信息。 PERFORM DisplayAccountInfo * 调用DisplayAccountInfo段落,用于显示账户信息。 STOP RUN. * 程序结束。
初始化账户信息(InitializeAccount)
-
MOVE 1234567890 TO accountNumber * 将账户号码设置为1234567890。
-
MOVE
"GGBond" TO accountName * 将账户名称设置为
"GGBond"。
-
MOVE 1000.00 TO accountBalance. * 将账户余额设置为1000.00。
显示账户信息(DisplayAccountInfo)
-
DISPLAY
"Account Number: " accountNumber * 显示账户号码。
-
DISPLAY
"Account Name: " accountName * 显示账户名称。
-
DISPLAY
"Account Balance: $" accountBalance. * 显示账户余额。
使用COBOL做一个四则运算计算器
-
IDENTIFICATION DIVISION.
-
PROGRAM-ID. Calculator.
-
-
DATA DIVISION.
-
WORKING-STORAGE SECTION.
-
01 Num1 PIC
9(
5)V9(
2).
-
01 Num2 PIC
9(
5)V9(
2).
-
01 Result PIC
9(
6)V9(
2).
-
01 Operator PIC X.
-
-
PROCEDURE DIVISION.
-
Main-Procedure.
-
DISPLAY
"Enter the first number: ".
-
ACCEPT Num1.
-
DISPLAY
"Enter the operator (+, -, *, /): ".
-
ACCEPT Operator.
-
DISPLAY
"Enter the second number: ".
-
ACCEPT Num2.
-
-
EVALUATE TRUE
-
WHEN Operator =
"+"
-
ADD Num1 TO Num2 GIVING Result
-
DISPLAY
"The result is: ", Result
-
WHEN Operator =
"-"
-
SUBTRACT Num2 FROM Num1 GIVING Result
-
DISPLAY
"The result is: ", Result
-
WHEN Operator =
"*"
-
MULTIPLY Num1 BY Num2 GIVING Result
-
DISPLAY
"The result is: ", Result
-
WHEN Operator =
"/"
-
IF Num2 <>
0 THEN
-
DIVIDE Num1 BY Num2 GIVING Result
-
DISPLAY
"The result is: ", Result
-
ELSE
-
DISPLAY
"Error: Division by zero is not allowed."
-
END-IF
-
WHEN OTHER
-
DISPLAY
"Error: Invalid operator."
-
END-EVALUATE.
-
-
STOP RUN.
安装Hercules和x3270
Hercules:是一个开源软件项目,实现了IBM的大型主机体系结构,包括System/370、ESA/390以及最新的64位z/Architecture,Hercules能够精确地模拟各种大型机指令集,并提供详细的系统状态反馈,使得用户能够在本地环境中复现大型机应用,适用于需要进行旧系统迁移测试、教学演示或希望在本地环境下复现大型机应用的场景。
x3270: 一款强大的终端模拟器,它使得用户能够通过个人电脑连接到IBM Mainframe系统,进行远程操作和数据交互,x3270是处理与IBM Mainframe系统相关的任务时的理想工具。它提供了一个高效且便捷的解决方案,使得用户能够轻松地连接到Mainframe系统,执行各种关键业务应用和数据交互操作。
先更新列表
sudo apt update sudo apt upgrade
安装 Hercules
sudo apt install hercules
安装X3270
sudo apt install x3270
找到配置文件路径
sudo find / -name hercules.cnf
运行配置文件模拟大型机:
hercules -f hercules.cnf
hercules 运行成功
可以根据自己需求来修改hercules的配置文件,以下是初始版本的配置文件:
-
#
-
# Sample configuration file for Hercules ESA/390 emulator
-
#
-
-
#------------------------------------------------------------------------------
-
# CPU Configuration
-
#------------------------------------------------------------------------------
-
-
CPUSERIAL 002623
# CPU serial number
-
CPUMODEL 3090
# CPU model number
-
MODEL EMULATOR
# STSI returned model
-
PLANT ZZ
# STSI returned plant
-
MANUFACTURER HRC
# STSI returned manufacturer
-
LPARNAME HERCULES
# DIAG 204 returned lparname
-
CPUVERID FD
# CPU Version Identification
-
MAINSIZE 64
# Main storage size in megabytes
-
XPNDSIZE 0
# Expanded storage size in megabytes
-
NUMCPU 1
# Number of CPUs
-
# NUMVEC 1 # Number of Vector Processors
-
MAXCPU 8
# Maximum number of CPUs
-
ARCHMODE ESA/390
# Architecture mode S/370, ESA/390 or z/Arch
-
ALRF DISABLE
# ASN-and-LX-Reuse facility
-
ECPSVM NO
# VM Assist : NO or Level (20 recommended)
-
-
#------------------------------------------------------------------------------
-
# OS Tailoring
-
#------------------------------------------------------------------------------
-
-
LOADPARM 0120....
# IPL parameter
-
OSTAILOR LINUX
# OS tailoring
-
SYSEPOCH 1900
# Base year for initial TOD clock
-
# TZOFFSET 0 # Using UTC (GMT)
-
-
-
#------------------------------------------------------------------------------
-
# Hercules Service Processor and Hercules Application Window
-
#------------------------------------------------------------------------------
-
-
-
# MODPATH /usr/local/lib/hercules # Where to search for modules
-
# LDMOD dyninst tcpip # Modules to be loaded
-
-
#------------------------------------------------------------------------------
-
# Hercules Service Processor and Hercules Application Window
-
#------------------------------------------------------------------------------
-
-
CODEPAGE default
# CodePage conversion table
-
DIAG8CMD
disable
# OS may not issue commands via DIAG 8
-
-
HTTPPORT 8081 noauth userid password
# HTTP server port
-
# HTTPROOT /usr/local/share/hercules/ # HTTP root directory
-
-
PANRATE FAST
# Panel refresh rate
-
-
-
#-------------------------------------------------------------------------------
-
# Advanced Hercules Performance Tailoring
-
#
-
# +----------------------------------------------------------------+
-
# | Caution: Modification of these parameters may adversely |
-
# | affect the performance of the host system |
-
# | and/or Hercules. |
-
# +----------------------------------------------------------------+
-
#-------------------------------------------------------------------------------
-
-
# HERCPRIO 0 # Hercules process runs at Normal priority
-
# CPUPRIO 15 # CPU thread(s) run at Low priority
-
# DEVPRIO 8 # Device thread(s) run at Below Normal priority
-
# TODPRIO -20 # TOD Clock and timer thread are Time Critical
-
-
-
#-------------------------------------------------------------------------------
-
# Integrated Hercules I/O Controller
-
#
-
-
# DEVTMAX 0 # Device threads, 8 on Windows, else unlimited
-
CNSLPORT 3270
# TCP port number to which consoles connect
-
# SHRDPORT 3990 # TCP port number for sharing DASD images on
-
# this instance of Hercules (inactive)
-
-
# .-----------------------Device number
-
# | .-----------------Device type
-
# | | .---------File name and parameters
-
# | | |
-
# V V V
-
# ---- ---- --------------------
-
0009 3215-C / noprompt
-
000C 3505 ./util/zzsacard.bin
-
000D 3525 punch00d.txt ascii
-
000E 1403 print00e.txt crlf
-
001F 3270
-
# The following statements are examples. Some of them require
-
# user tailoring before being used.
-
# 0580 3420 ickdsf.ipl
-
# 0120 3380 mvsv5r.120
-
# 0121 3380 mvsv5d.121
-
# 0122 3380 mvswk1.122
-
# 0140 9336 dosres.140
-
# 0141 9336 syswk1.141
-
#
-
# The following statement defines 3 3270 devices starting
-
# at address 0200
-
# 0200.3 3270
-
#
-
# The following statement defines 3480 devices
-
# at addresses 0280 to 028F
-
# 280-28F 3480
-
#
-
# The following statement defines 3420 devices
-
# at addresses 02C0 & 02C2
-
# 2C0,2C2 3420
-
# 0300 3370 sysres.300
-
#
-
# The following statements define 3380 Devices
-
# with the CUU substituted in the device file name
-
# device file names will be
-
# 400.3380, 401.3380, 402.3380 and 403.3380
-
# 400-403 3380 $(CUU).3380
-
#
-
# CCUU may also be used to define a 4 digit device address
-
# in the name
-
# device file names will be
-
# 0480.3380, 0481.3380, 0482.3380 and 0483.3380
-
# 480-483 3380 $(CCUU).3380
-
#
-
# 0700 3270
在保持Hercules模拟运行的同时,新建终端并运行运行命令来启动x3270(必须是在图形界面)
x3270
点击连接,可以使用127.0.0.1作为ip,3270作为端口(比如127.0.0.1:3270)
连接成功:
右上角还有个小键盘嘞