在docker中运行COBOL
尝试在40年后重新运行COBOL:使用Docker执行COBOL。通过Docker(81)稍作调整(4)的程序。
这是修订版。
由于我最近一次的职业转换中有COBOL编程的经验,所以被提及了。
不是必须要用COBOL。
首先,我们很少提及机械专用的JCL(作业控制语言)类似于Shell脚本的语言,如果不了解这两者,移植将变得非常困难。
另外,该机器专用的数据库结构、定义方法和处理方式与其他不同,只有同时理解两者才能进行移植。(Chinese)
在没有两种机器存在的地方进行移植是一项极其困难的技术。
我曾经写过一个将主机上的数据库移植的程序。
与此相比,COBOL自身是一种早早成为国际标准的语言。
除了JCL启动过程和特定机型专用的数据库外,与C语言相比,可移植性更高。
有一些人正在討論COBOL。
如果你有这么多闲暇的话,不如去运行COBOL。
非常愉快。
40年前与现在相比,有如天堂与地狱。
我开始学习JavaScript时,觉得它有点像COBOL。COBOL是一种用于设计输出和描述输入与逻辑关系的语言。
我认为只要会写JavaScript且不讨厌英语的人,有90%的概率可以在3个小时内学会COBOL。
ゼロから始めるJavaScript。英語のYoutubeで勉強しようと思った。初日。
COBOLがない計算機の前に座って、40年ぶりにCOBOL動かした。
お題は、
Beginning COBOL for Programmers
https://www.apress.com/jp/book/9781430262534
这个链接是github上的一个库,里面有一个文件源代码。
<この項は書きかけです。順次追記します。>
从Docker Hub的使用
下で導入したcobolのシステムをdocker hubからrunするだけで、もうあなたはCOBOL World
なお、下記はMacosのdockerで、ユーザ名がwatashiの場合。Documentsの下でcobolというフォルダがある場合。
$ docker run -v /Users/watashi/Documents/cobol:/home/cobol -it kaizenjapan/cobol /bin/bash
请指定您能够读写的位置。
COBOLを動かす場所まで移動して
pwd
コマンドを実行して、コピペするのが間違いない。
現在の知見
-
- 左側に行番号があってもなくてもよい。
-
- 行番号がない場合は、コンパイルオプションをつけないと空白またはタブが必要。
-
- 「cobc -x ソースファイル名」 で実行プログラムを作成できる。
-
- 「./実行プログラム名」 で実行できる。
-
- 上記2つをスクリプトにしてみる。
-
- 先頭にタブを入れるプログラムをcobolで作ってみる。(未着手)
-
- -freeをつければ左の行番号、空白、タブが要らない
- ファイルの読み込みで大文字小文字の違いでエラーになることあり。
如果文件名大小写不同,会导致错误。
# ../co.sh Listing5-6
libcob: File does not exist (STATUS = 35) File : 'Listing5-6-TData.Dat'
# mv Listing5-6-TData.dat Listing5-6-TData.Dat
# ./Listing5-6
Teresa Casey 08712351 LM042
Padraig Quinlan 08712352 LM051
Kevin Tucker 08712353 LM051
Maria Donovan 08712354 LM042
Liam Lorigan 98712355 LM110
Fiachra Luo 98712356 LM051
可以更改程序中的文件指定。
IDENTIFICATION DIVISION.
PROGRAM-ID. Listing5-6.
AUTHOR. Michael Coughlan.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT StudentFile ASSIGN TO "Listing5-6-TData.Dat"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD StudentFile.
01 StudentDetails.
88 EndOfStudentFile VALUE HIGH-VALUES.
02 StudentId PIC X(8).
02 StudentName PIC X(25).
02 CourseCode PIC X(5).
PROCEDURE DIVISION.
Begin.
OPEN INPUT StudentFile
READ StudentFile
AT END SET EndOfStudentFile TO TRUE
END-READ
PERFORM UNTIL EndOfStudentFile
DISPLAY StudentName SPACE StudentId SPACE CourseCode
READ StudentFile
AT END SET EndOfStudentFile TO TRUE
END-READ
END-PERFORM
CLOSE StudentFile
STOP RUN.
SELECT StudentFile ASSIGN TO "Listing5-6-TData.Dat"
在中文中,”を” 可以翻译成 “将”。
SELECT StudentFile ASSIGN TO "Listing5-6-TData.dat"
可以这样做。
尝试将其转化为脚本。
#!/bin/bash
cobc -x -free $1.cbl
./$1
创建一个文件
cd ..
vi co.sh
按下”i”键后,复制粘贴上述内容。
请按下[ESC]键。
:wq
如果当前文件夹中有名为add.cbl的文件,并且co.sh在其下一级目录中存在的话。
$ ../co.sh add
第七章
在“开始”段落中:
错误:未知语句“列表”
没有这样的文件或目录
最后添加了一行包含”Listing”字符串的行。
删除后,错误消除了。
错误:语法错误,意外的$undefined,期望”文件结束”
没有这个文件或目录
第8章
八减四
Listing8-4.cbl:32行:错误:没有先前的08级数据项
../co.sh:第4行:./Listing8-4: 没有此文件或目录
Listing8-4.cbl:36: 错误: 没有04级别的先前数据项
在Listing8-4.cbl的第32行出现错误:需要为“MOBandDOB”添加PICTURE子句。
当文件名过长时,文件不存在(状态= 35)。
八减五
文件名太长了。缩短后通过了。
第九章
九点二
# ../co.sh Listing9-2
Listing9-2.cbl:9: Error: syntax error, unexpected DATA
../co.sh: line 4: ./Listing9-2: No such file or directory
# cat Listing9-2.cbl
IDENTIFICATION DIVISION.
PROGRAM-ID. Listing9-2.
AUTHOR. Michael Coughlan.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
CURRENCY SIGN IS "?"
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Edit1 PIC ???,??9.99.
PROCEDURE DIVISION.
Begin.
MOVE 12345.95 TO Edit1
DISPLAY "Edit1 = " Edit1
STOP RUN.
第7行末尾缺少句号。在CURRENCY SIGN后面加上句号后,编译通过了。
# ../co.sh Listing9-2
Edit1 = ?12,345.95
九點三
# ../co.sh Listing9-3
Listing9-3.cbl:15: Error: Invalid picture string - '$$$,$$9.99'
Listing9-3.cbl:17: Error: Invalid picture string - '???,??9.99'
Listing9-3.cbl: In paragraph 'Begin':
Listing9-3.cbl:30: Error: 'PrnPoundValue' is not numeric or numeric-edited name
../co.sh: line 4: ./Listing9-3: No such file or directory
背景 – Background
我认为日本的COBOL下滑是因为认真进行PC上的COBOL编程的人很少。
在坐了一个小时的时间里,完成COBOL的引入,获取源代码并进行编译运行。
大约30年前,我去参加微软会议时,在旧金山附近看到很多人正在用PC运行COBOL。
我觉得当时日本可能使用了100倍以上的设备来运作。
我记得富士通和日立的人也在进行COBOL编程。
私はPCでアセンブラ, BASIC, メインフレームでCOBL, FORTRAN, またPCに戻ってCと移って行ったのでPCでCOBOLは仕事ではうごかしていない。
只需要一个选择,原文的中文翻译如下:
COBOL使用纸卡打码并打洞。然后,等待将其放入纸卡阅读器中阅读,进行编译和执行。
每台设备都被占用,导致每天只能编译两次,分别在上午和下午。
然后,如果出现错误,就再次打印纸质卡片。
将纸质卡片放入卡片阅读器中。
进行编译和运行的动作,用现在所说的脚本语言称为JCL(作业控制语言)编写的内容,有时候也会使用纸卡打孔。唉,忘记打了什么了。
在现在每小时可以编译10甚至20次的情况下,简直是天堂和地狱。
100分の1の費用でできることを、なぜやらずに下降線をたどるままに今日まで来たのでしょうか。
動かすのが1時間、docker hubに登録するのが30分。この資料の整理時間を入れて。1時間半の間に、お風呂にお湯をはったり、お湯をわかして緑茶を4杯飲んだりの雑用もこなして。
请注意
我从Git上带来的源代码需要两个预处理步骤。
-
- 有时候,如果文件名为PC,则无法正确处理空格。将文件移动到没有空格的文件名(mv)。
在行首加入制表符或行号。如果不这样做,可能会导致编译错误。
COBOL文件
以下是对原文的中文解释:
日本工业规格 JIS X3002:2011(ISO/IEC 1989:2002) 是关于电子计算机程序语言 COBOL 的信息技术领域的编程语言规范。
你可以在此网站查看详细内容:http://kikakurui.com/x3/X3002-2011-01.html
ISO/IEC 1989:2014 (https://www.iso.org/standard/51416.html) 是关于信息技术的国际标准,涉及编程语言、其环境和系统软件接口以及 COBOL 编程语言。
《面向程序员的COBOL入门》
$ docker run -v /home/ogawakiyoshi/Documents/cobol/home/cobol -it ubuntu /bin/bash
# apt-get update
# apt-get install open-cobol, vim
# apt-get install git
#git clone https://github.com/Apress/beg-cobol-for-programmers.git
IDENTIFICATION DIVISION.
PROGRAM-ID. ShortestProgram.
PROCEDURE DIVISION.
DisplayPrompt.
DISPLAY "I did it".
# cobc -x 'Listing 2-1 Shortest COBOL program.cbl'
Listing 2-1 Shortest COBOL program.cbl:1: Error: Invalid indicator 'F' at column 7
从今天开始学习COBOL(上)
000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. SAMPLE-01.
000030*
000040 ENVIRONMENT DIVISION.
000050*
000060 DATA DIVISION.
000070*
000080 PROCEDURE DIVISION.
000090 MAIN.
000100 DISPLAY "Hello world!" UPON CONSOLE.
000110 STOP RUN.
# cobs -x hoge.cob
# ./hoge
Hello world!
即使有行号也没关系。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-01.
*
ENVIRONMENT DIVISION.
*
PROCEDURE DIVISION.
DISPLAY "I did it!".
不需要行号也没关系。
# cobc -x Listing\ 2-3\ \ The\ DoCalc\ example\ program.cbl
gcc: error: 2-3: No such file or directory
gcc: error: The: No such file or directory
gcc: error: DoCalc: No such file or directory
gcc: error: example: No such file or directory
gcc: error: program: No such file or directory
root@266eec874239:/home/ogawakiyoshi/Documents/cobol/beg-cobol-for-programmers/978-1-4302-6253-4_Coughlan_Ch02# cobc -x 'Listing 2-3 The DoCalc example program.cbl'
gcc: error: 2-3: No such file or directory
gcc: error: The: No such file or directory
gcc: error: DoCalc: No such file or directory
gcc: error: example: No such file or directory
gcc: error: program: No such file or directory
# cp 'Listing 2-3 The DoCalc example program.cbl' docal.cbl
# cobc -x docal.cbl
# ./docal.cbl
Please enter two single digit numbers
1
2
Result is = 03
扩展名可以是cob或cbl都没问题。
IDENTIFICATION DIVISION.
PROGRAM-ID. CobolGreeting.
*>Program to display COBOL greetings
DATA DIVISION.
WORKING-STORAGE SECTION.
01 IterNum PIC 9 VALUE 5.
PROCEDURE DIVISION.
BeginProgram.
PERFORM DisplayGreeting IterNum TIMES.
STOP RUN.
DisplayGreeting.
DISPLAY "Greetings from COBOL".
# cp 'Listing 2-2 The COBOL Greeting program.cbl' tcgp.cbl
# cobc -x tcgp.cbl
# ./tcgp.cbl
Greetings from COBOL
Greetings from COBOL
Greetings from COBOL
Greetings from COBOL
Greetings from COBOL
01 Iternum PIC 9 VALUE 5 的解释是变量声明并初始化为5。
执行DisplayGreeting IterNum次。
只需一个选择,用中文重新表述以下内容:
COBOL是一种通过阅读英语就能理解的语言。非常简单。不需要COBOL程序员这个职业。只要能读写英语就能做计算并得出结果。
数据的结构定义也很容易。可能有些人对不像函数调用的方式有抵触感。但英语不是函数调用,这又有什么问题呢。
数据分区
程序分布
有数据和处理分离和结构化。
将数据保存到Docker中。
在与正在运行的Docker分离的另一台电脑的操作系统命令提示符下。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
266eec874239 ubuntu "/bin/bash" About an hour ago Up About an hour ecstatic_easley
$ docker commit 266eec874239 kaizenjapan/cobol
sha256:2eaafd2ced044b906e15b2276e1fe5987b7202f4816065efd725cd3988bc7e98
$ docker push kaizenjapan/cobol
The push refers to repository [docker.io/kaizenjapan/cobol]
98f34bdd40b3: Pushed
27a216ffe825: Mounted from library/ubuntu
9e9d3c3a7458: Mounted from library/ubuntu
7604c8714555: Mounted from library/ubuntu
adcb570ae9ac: Mounted from library/ubuntu
latest: digest: sha256:dfaf8a3e5c910197465469fac68d35948dcabdc0341dccb668196599b5fd5bb3 size: 1363
请参考以下的资料(reference)。
在Qiita上也有有关COBOL的内容。
帮助
# cobc --help
Usage: cobc [options] file...
Options:
--help Display this message
--version, -V Display compiler version
-v Display the programs invoked by the compiler
-x Build an executable program
-m Build a dynamically loadable module (default)
-std=<dialect> Compile for a specific dialect :
cobol2002 Cobol 2002
cobol85 Cobol 85
ibm IBM Compatible
mvs MVS Compatible
bs2000 BS2000 Compatible
mf Micro Focus Compatible
default When not specified
See config/default.conf and config/*.conf
-free Use free source format
-fixed Use fixed source format (default)
-O, -O2, -Os Enable optimization
-g Produce debugging information in the output
-debug Enable all run-time error checking
-o <file> Place the output into <file>
-b Combine all input files into a single
dynamically loadable module
-E Preprocess only; do not compile, assemble or link
-C Translation only; convert COBOL to C
-S Compile only; output assembly file
-c Compile and assemble, but do not link
-t <file> Generate and place a program listing into <file>
-I <directory> Add <directory> to copy/include search path
-L <directory> Add <directory> to library search path
-l <lib> Link the library <lib>
-D <define> Pass <define> to the C compiler
-conf=<file> User defined dialect configuration - See -std=
--list-reserved Display reserved words
--list-intrinsics Display intrinsic functions
--list-mnemonics Display mnemonic names
-save-temps(=<dir>) Save intermediate files (default current directory)
-MT <target> Set target file used in dependency list
-MF <file> Place dependency list into <file>
-ext <extension> Add default file extension
-W Enable ALL warnings
-Wall Enable all warnings except as noted below
-Wobsolete Warn if obsolete features are used
-Warchaic Warn if archaic features are used
-Wredefinition Warn incompatible redefinition of data items
-Wconstant Warn inconsistent constant
-Wparentheses Warn lack of parentheses around AND within OR
-Wstrict-typing Warn type mismatch strictly
-Wimplicit-define Warn implicitly defined data items
-Wcall-params Warn non 01/77 items for CALL params (NOT set with -Wall)
-Wcolumn-overflow Warn text after column 72, FIXED format (NOT set with -Wall)
-Wterminator Warn lack of scope terminator END-XXX (NOT set with -Wall)
-Wtruncate Warn possible field truncation (NOT set with -Wall)
-Wlinkage Warn dangling LINKAGE items (NOT set with -Wall)
-Wunreachable Warn unreachable statements (NOT set with -Wall)
-ftrace Generate trace code (Executed SECTION/PARAGRAPH)
-ftraceall Generate trace code (Executed SECTION/PARAGRAPH/STATEMENTS)
-fsyntax-only Syntax error checking only; don't emit any output
-fdebugging-line Enable debugging lines ('D' in indicator column)
-fsource-location Generate source location code (Turned on by -debug or -g)
-fimplicit-init Do automatic initialization of the Cobol runtime system
-fsign-ascii Numeric display sign ASCII (Default on ASCII machines)
-fsign-ebcdic Numeric display sign EBCDIC (Default on EBCDIC machines)
-fstack-check PERFORM stack checking (Turned on by -debug or -g)
-ffold-copy-lower Fold COPY subject to lower case (Default no transformation)
-ffold-copy-upper Fold COPY subject to upper case (Default no transformation)
-fnotrunc Do not truncate binary fields according to PICTURE
-ffunctions-all Allow use of intrinsic functions without FUNCTION keyword
-fmfcomment '*' or '/' in column 1 treated as comment (FIXED only)
-fnull-param Pass extra NULL terminating pointers on CALL statements
请参考以下资料(reference)
顺便提一下,我们公司也在维护COBOL,对于那些从未接触过它的人来说,这是一篇能够完全理解COBOL的文章。
https://qiita.com/e99h2121/items/47857957fd549c83b5cb
2020年是COBOL的元年,所以我要挑戰在1小時內完成Hello World。
(Translation: 2020 is the first year of COBOL, so I will challenge myself to complete Hello World in 1 hour.)
オブジェクト指向言語じゃない、COBOLで依存性逆転の法則を実践してみる
https://qiita.com/madilloar/items/f5126dbd03f69b5b986c
自我参照 (zì wǒ
在Qiita上也有COBOL的相关内容。
三大面向对象语言
编程语言教育的XYZ
废弃的软件或者目前未使用的软件
数据科学家的领悟!”讨厌那些学习却不把所学运用在工作中的人!” 突然意识到 “难道我就是其中之一吗?”
2022年的降临日历。
我們今年策劃了四個圣誕日歷,現在我們將分別介紹其中一篇文章。
AUTOSAR日历2022。
AUTOSAR 对 ISO、IEC、ITU、IEEE、RFC 和 SEA 等进行了参考。
2022年汽车手册圣诞日历
基本原则,波什汽车手册(英文)第11版摘要<2>
2022 年「点赞」文章排行榜(O.K. 版)2022 年圣诞日历
2022年1月下旬,一篇收到了16个赞的文章。
AdCale(好的)2022年圣诞节日历
会议将在不到15分钟之内结束。听来的小道消息。
2022 年《Advent Calendar》報告。
在错误的评估方面不擅长(在非专业领域)。
这篇文章是基于个人过去经历的个人感想。与我目前所在的组织和工作无关。
文件历史记录
第一版0.01 起草于20221212
第二版0.02 增加URL 于20230224
非常感谢您的阅读至最后。
喜欢的话,请关注我。
非常感谢您读到最后一句话。
请点击喜欢的图标?并关注我,享受幸福生活。