在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
コマンドを実行して、コピペするのが間違いない。

現在の知見

    1. 左側に行番号があってもなくてもよい。

 

    1. 行番号がない場合は、コンパイルオプションをつけないと空白またはタブが必要。

 

    1. 「cobc -x ソースファイル名」 で実行プログラムを作成できる。

 

    1. 「./実行プログラム名」 で実行できる。

 

    1. 上記2つをスクリプトにしてみる。

 

    1. 先頭にタブを入れるプログラムをcobolで作ってみる。(未着手)

 

    1. -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

第七章

NumberOK/ERRORListing 7-1 Reading the Employee file.cblE1->OListing 7-2 Reading the Employee file and displaying the records.cblOListing 7-3 Writing and Reading the Employee file.cblOListing 7-4 Displays the value of the gadgets in stock.cblE2Listing 7-5 Adds two records and then displays stock values again.cblE2

在“开始”段落中:
错误:未知语句“列表”
没有这样的文件或目录

最后添加了一行包含”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上带来的源代码需要两个预处理步骤。

    1. 有时候,如果文件名为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

非常感谢您的阅读至最后。

喜欢的话,请关注我。

非常感谢您读到最后一句话。

请点击喜欢的图标?并关注我,享受幸福生活。

广告
将在 10 秒后关闭
bannerAds