中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

溫習一下你的COBOL:為什么一門有60年歷史的語言突然有了需求?

發(fā)布于:2021-01-21 15:29:19

0

249

0

COBOL 程序員

從前,當世界和計算機都是新事物的時候,我正在攻讀數(shù)據(jù)處理的副學士學位,那時沒有“計算機科學”課程,我必須學習會計學、數(shù)學、統(tǒng)計學和三種計算機語言:IBM/360基本匯編語言、FORTRAN和COBOL。到了80年代,學生們被告知COBOL是一種死語言,沒有人再學習它了。

現(xiàn)在,到了2020年,政府和銀行都在懇求COBOL程序員,一種不會消亡的語言。

那么,你如何學習COBOL,賺大錢,并節(jié)省大量的國家機構需要新的代碼來處理所有新的政府刺激計劃?

COBOL公司?這是什么東西?

COBOL代表面向業(yè)務的通用語言。作為最早的高級語言之一,它是由國防部贊助的一個小組組織起來開發(fā)的一種通用商務語言。這個小組后來被稱為數(shù)據(jù)系統(tǒng)語言委員會CODASYL,并從Grace Hopper的FLOW-MATIC以及Univac的AIMACO和IBM的COMTRAN等其他語言中定義了一種“面向業(yè)務的通用語言”。由此產(chǎn)生的語言經(jīng)歷了更多的修改,但很快就成為構建業(yè)務系統(tǒng)的主導語言,并且從那時起它一直處于主導地位。

許多公司仍在使用COBOL,包括IBM、UPS和Cigna。Cigna的軟件工程師Mario Ceballos告訴我,“語法保持簡單,讓非程序員(業(yè)務)能夠閱讀和理解它。COBOL應該是明確的,因為不應該有任何假設的空間?!?/span>

當然,它也受到了批評。1975年,Edsgar Dijkstra著名地宣稱“使用COBOL會削弱大腦;因此,其教學應被視為刑事犯罪[sic]”。這無疑導致了大學中COBOL教學的衰落,但COBOL仍然是占主導地位的商業(yè)語言。

但是找到有COBOL技能的人可能很困難。Ceballos說:“大型機是一個很難學習的平臺,這是由于成本問題?!薄!皞€人沒有錢租賃主機。極少數(shù)學校在大型機和COBOL上教授課程。當IBM開始遠程工作和外包時,他們就不再鼓勵美國學校教授大型機和COBOL課程。人才庫從岸上轉移到了離岸。任何本地人才的咨詢費都會很貴?!?/span>

為什么COBOL仍然占主導地位?

與當今常見的編程語言相比,COBOL是不同的,而且在某些方面非常有限:您不能進行動態(tài)內(nèi)存分配,不能輕松訪問操作系統(tǒng)或特定計算機體系結構的低級功能。最常見的語言形式不能使用遞歸。你永遠不會想用COBOL編寫編譯器。一個計算機科學專業(yè)的學生如果被出示COBOL,一定會大吃一驚。

這是類別錯誤。在現(xiàn)代術語中,COBOL實際上是一種特定于領域的語言,特定于業(yè)務編程的特定領域。Robert Glass確定了COBOL比通用語言更適合業(yè)務編程的具體方式,其中包括:

  • 面向業(yè)務的語言需要聲明、管理和操作異構數(shù)據(jù)。業(yè)務程序在復雜的記錄結構中混合了固定長度和可變長度的字符串、浮點、整數(shù)和十進制數(shù)據(jù),通常包含可變部分。數(shù)據(jù)庫程序員熟悉其中的一些問題,對象-關系映射工具經(jīng)常會忽略這些復雜性。

  • 業(yè)務和財務數(shù)據(jù)需要使用真正的十進制數(shù)據(jù)類型進行管理。會計系統(tǒng)必須精確到最后一位小數(shù),并且需要精確地再現(xiàn)手工計算的結果;傳統(tǒng)的浮點數(shù)會導致復雜性和錯誤。

  • 面向業(yè)務的語言需要訪問和操作外部維護的大量記錄結構化數(shù)據(jù)。

當然,這一切都超出了通用編程語言的能力。但在COBOL中,它是該語言的原生語言。

我們可以對COBOL的必要性進行辯論,但事實是,存在著數(shù)千億行COBOL代碼,而且從COBOL遷移出去的嘗試通常并不成功。

你的第一個COBOL程序

源文件是簡單的文本文件。對于COBOL來說,擁有一個支持語言的有用的編程編輯器和任何其他語言一樣方便,如果不是更方便的話。對于初學者來說,最簡單的事情就是使用visualstudio代碼,這是自EMACS以來我所喜愛的唯一競爭對手。

COBOL的VSCode擴展多得驚人?,F(xiàn)在,我正在使用bitlang代碼著色器和Broadcom COBOL語言支持。其他的很多都是為在大型機環(huán)境中編程的人準備的,但這增加了我們不需要介紹的復雜性。

因此,總結一下,開始試驗COBOL:

  1. 如果尚未安裝Visual Studio代碼,請下載并安裝。

  2. 安裝比特語言.cobol和Broadcom COBOL語言支持擴展。

  3. 安裝GnuCOBOL。(老實說,如果有什么事情會引起麻煩,那就是這個。MacOS上的自制安裝運行得很好,我沒有其他系統(tǒng)可以測試。在Windows上,MicroFocus免費試用visualstudio COBOL和Azure實驗支持。)

現(xiàn)在,您已經(jīng)安裝了所有內(nèi)容,并準備編寫第一個COBOL程序。按照傳統(tǒng),我們將從你的節(jié)目“Hello, World”開始

因此,作為一個新的COBOL程序員,這里是您的第一個驚喜:COBOL關心您的代碼在哪個列中。在傳統(tǒng)的COBOL程序中,源代碼有幾個組件:

{xunruicms_img_title}

列1-6表示序列號。第7列稱為指示符區(qū)域;一般來說,它主要用于通過在該列中添加星號“*”來表示注釋。然后代碼進入第8列到第72列,第73列到第80列基本上是免費的,供程序員使用。

這一切都是基于當我們把我們的來源到80列霍勒瑞斯卡的日子。

現(xiàn)代COBOL編譯器也接受一種免費的格式,這種格式不會強迫您的代碼進入80列的限制中,但是現(xiàn)有代碼中很大一部分仍然是卡片圖像格式?,F(xiàn)在,我們將繼續(xù)使用卡片圖像。

振作起來:COBOL并不像你曾經(jīng)使用過的任何其他語言那樣是塊結構語言。COBOL從一開始的一個主要設計目標是,它應該是“自文檔化”的,具有類似英語的語法。我們沒有函數(shù)、子例程和塊,而是有劃分、節(jié)、段落和語句。(我們將看到類似下面帶有PERFORM動詞的子例程。)。

哦,對了,我們還有COBOL操作符的動詞。

以下是COBOL中的“Hello, World”:

      IDENTIFICATION DIVISION.
      PROGRAM-ID. HELLO.
      PROCEDURE DIVISION.
          DISPLAY "Hello, world".
      END PROGRAM HELLO.

與某些語言相比,它有點冗長,但老實說也不算太糟。將其與簡單的Java版本進行比較:

public class Hello {
public static void main(String[] args){
System.out.println("Hello, world!");
}
}

像所有的“Hello,world”程序一樣,它的作用不大,但是如果你被告知用COBOL編寫一個basic程序需要90行代碼,那么,你就被誤導了。

現(xiàn)在讓我們把“Hello world”程序分解為第一個示例。

第一行是:

IDENTIFICATION DIVISION.

COBOL程序總是至少有一個標識劃分和一個過程劃分。識別部門有一個重要的段落,即PROGRAM-ID。你需要在這里給程序起個名字。名稱不需要與文件名或幾乎任何東西對應,除非從另一個COBOL程序調用您的COBOL程序。這是通過CALL動詞實現(xiàn)的,我們將不討論。

我們需要一個程序ID,所以我們添加

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

還有很多其他的事情,通常會進入鑒定部門。我將添加幾個常見的示例。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
AUTHOR. CHARLES R MARTIN.
DATE-WRITTEN. 2020-APR-11.

然而,在現(xiàn)代環(huán)境中,這些都是評論。

說到現(xiàn)代環(huán)境,順便說一下,COBOL并不像我一直使用的那樣需要所有的cap。GnuCOBOL會非常樂意。

      identification division.
      program-id. tut2.
      author. charlie martin.
      procedure division.
          display "hello, world".
      end program tut2.

我只是有點迷茫的懷舊。

別妄下判斷我。所以呢讓我們結束我們的“你好,世界”。COBOL程序的執(zhí)行部分在過程部分中。

       IDENTIFICATION DIVISION. 
       PROGRAM-ID. HELLO.
       PROCEDURE DIVISION.
           DISPLAY "Hello, world".
       END PROGRAM HELLO.

這里還有一種卡片圖像格式。注意,`DISPLAY“Hello,world”`縮進了四列。這是因為第8-72欄的部分實際上有兩部分:第8-11欄的A部分和第12欄的B部分。分部、節(jié)和段落需要從A節(jié)開始;代碼語句應該從B節(jié)開始。

擴展COBOL示例

當然,“Hello,World”并不能為任何語言提供一個很好的描述,所以讓我們用一些至少類似于真實商業(yè)程序的東西來深入研究COBOL。我們將使用一個非常常見的例子:計算小時工的工資,包括計算聯(lián)邦、州和FICA稅。

做了這件事,我可以告訴你這不是一件容易的事,事實上,稅率表是復雜和神秘的,所以我們要簡化,使聯(lián)邦稅率為16.4%,州稅率為7%,并將FICA稅率固定在6.2%,同時仔細選擇我們的工資率和工作時間,以不達到FICA的上限。我們只做小時工,我們計算超過40小時的加班時間是基準費率的1.5倍。

重復身份劃分毫無意義。我們從一個新的部門開始,環(huán)境部門,它的存在是為了收集COBOL程序和外部世界之間的接口。

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT TIMECARDS
               ASSIGN TO "TIMECARDS.DAT"
                   ORGANIZATION IS LINE SEQUENTIAL.

再一次,我們將練習COBOL的一些方面,這將使那些沒有在面向記錄的數(shù)據(jù)處理領域工作過的人感到驚訝。在UNIX、Linux、MacOS或Windows中,記錄是一行文本,后跟一些行尾字符。這給傳統(tǒng)的COBOL帶來了一個問題,但是COBOL編譯器實現(xiàn)了一個非標準的擴展來處理這個問題:ORGANIZATION IS LINE SEQUENTIAL。

input-output部分只為文件分配一個符號名(TIMECARDS),并將其連接到外部環(huán)境中的文件。

程序的下一部分描述我們正在處理的數(shù)據(jù)。在COBOL中,所有數(shù)據(jù)通常被假定包含在固定格式的記錄中。這些記錄有一個層次結構,由級別號表示:01是最高層,而細分得到更高的數(shù)字。我使用02、03等等,但這是任意的;我們使用01、05等等,因為插入卡片更容易,而不必全部重新裝訂。

但現(xiàn)在我們介紹另一個部門,數(shù)據(jù)部門。正如你可能猜到的,這是數(shù)據(jù)。我們使用了兩個部分。首先是文件部分。

       DATA DIVISION.
       FILE SECTION.
           FD TIMECARDS.
           01 TIMECARD.
               02 EMPLOYEE-NAME.
                   03 EMP-FIRSTNAME PIC X(10).
                   03 EMP-SURNAME   PIC X(15).
               02 HOURS-WORKED PIC 99V9.
               02 PAY-RATE     PIC 99.

這是我們的輸入,是固定格式;我們用FD行將它連接到TIMECARDS文件。接下來是工作存儲部分。如果您不習慣COBOL,這看起來有點陌生,但實際上,我只是聲明了稍后將在程序中使用的變量。

       WORKING-STORAGE SECTION.
      * temporary variables in computational usage.
      *    intermediate values for computing paycheck with overtime
           01 REGULAR-HOURS    PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-HOURS   PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-RATE    PIC 9(4)V99 USAGE COMP.
           01 REGULAR-PAY      PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-PAY     PIC 9(4)V99 USAGE COMP.
      *    computed parts of the paycheck
           01 GROSS-PAY        PIC 9(4)V99 USAGE COMP.
           01 FED-TAX          PIC 9(4)V99 USAGE COMP.
           01 STATE-TAX        PIC 9(4)V99 USAGE COMP.
           01 FICA-TAX         PIC 9(4)V99 USAGE COMP.
           01 NET-PAY          PIC 9(4)V99 USAGE COMP.

其中不熟悉的部分是PIC(或PICTURE)子句。COBOL根本不是強類型的。相反,更像C,每個聲明都標識一段內(nèi)存;PIC告訴COBOL如何用“picture”解釋該內(nèi)存。在這種情況下,9(4)v99告訴COBOL,一個名為REGULAR-HOURS的內(nèi)存塊將被解釋為一個六位數(shù)字,該數(shù)字假定在最后兩位之前有一個小數(shù)點(V)。告訴COBOL使用適合快速算術的內(nèi)部格式。這種格式實際上是有點靈活的,并且取決于體系結構,這意味著您最好不要依賴于它在任何地方都是相同的。

如果您想對此有信心,請不要使用USAGE COMP,這會導致數(shù)據(jù)的另一部分,即輸出檢查的格式。這些字段是默認用法,可在USAGE COMP不可用時打印。

           01 PAYCHECK.
               02 PRT-EMPLOYEE-NAME    PIC X(25).
               02 FILLER               PIC X.
               02 PRT-HOURS-WORKED     PIC 99.9.
               02 FILLER               PIC X.
               02 PRT-PAY-RATE         PIC 99.9.
               02 PRT-GROSS-PAY        PIC $,$$9.99.
               02 PRT-FED-TAX          PIC $,$$9.99.
               02 PRT-STATE-TAX        PIC $,$$9.99.
               02 PRT-FICA-TAX         PIC $,$$9.99.
               02 FILLER               PIC X(5).
               02 PRT-NET-PAY          PIC $*,**9.99.

這里唯一有趣的是我們有了一些新的格式:$,$$9.99有一個美元符號,它總是與最左邊的數(shù)字相對,而$*,**9.99用*填充美元符號和第一個數(shù)字之間的空間。

我將很快展示整個程序,但我確實想指出COBOL處理數(shù)學的方式,如COMPUTE-GROSS-PAY所示:

       COMPUTE-GROSS-PAY.
           IF HOURS-WORKED > 40 THEN
               MULTIPLY PAY-RATE BY 1.5 GIVING OVERTIME-RATE
               MOVE 40 TO REGULAR-HOURS
               SUBTRACT 40 FROM HOURS-WORKED GIVING OVERTIME-HOURS
               MULTIPLY REGULAR-HOURS BY PAY-RATE GIVING REGULAR-PAY
               MULTIPLY OVERTIME-HOURS BY OVERTIME-RATE
                   GIVING OVERTIME-PAY
               ADD REGULAR-PAY TO OVERTIME-PAY GIVING GROSS-PAY
           ELSE
               MULTIPLY HOURS-WORKED BY PAY-RATE GIVING GROSS-PAY
           END-IF
           .

是的,標準COBOL讓你拼出來。

下面是完整的程序。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. PAYCHECKS.
       AUTHOR. CHARLES R. MARTIN.
       DATE-WRITTEN. 2020-APR-15.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT TIMECARDS
               ASSIGN TO "TIMECARDS.DAT"
                   ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
           FD TIMECARDS.
           01 TIMECARD.
               02 EMPLOYEE-NAME.
                   03 EMP-FIRSTNAME PIC X(10).
                   03 EMP-SURNAME   PIC X(15).
               02 HOURS-WORKED PIC 99V9.
               02 PAY-RATE     PIC 99.
       WORKING-STORAGE SECTION.
      * temporary variables in computational usage.
      *    intermediate values for computing paycheck with overtime
           01 REGULAR-HOURS    PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-HOURS   PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-RATE    PIC 9(4)V99 USAGE COMP.
           01 REGULAR-PAY      PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-PAY     PIC 9(4)V99 USAGE COMP.
      *    computed parts of the paycheck
           01 GROSS-PAY        PIC 9(4)V99 USAGE COMP.
           01 FED-TAX          PIC 9(4)V99 USAGE COMP.
           01 STATE-TAX        PIC 9(4)V99 USAGE COMP.
           01 FICA-TAX         PIC 9(4)V99 USAGE COMP.
           01 NET-PAY          PIC 9(4)V99 USAGE COMP.
      * print format of the check
           01 PAYCHECK.
               02 PRT-EMPLOYEE-NAME    PIC X(25).
               02 FILLER               PIC X.
               02 PRT-HOURS-WORKED     PIC 99.9.
               02 FILLER               PIC X.
               02 PRT-PAY-RATE         PIC 99.9.
               02 PRT-GROSS-PAY        PIC $,$$9.99.
               02 PRT-FED-TAX          PIC $,$$9.99.
               02 PRT-STATE-TAX        PIC $,$$9.99.
               02 PRT-FICA-TAX         PIC $,$$9.99.
               02 FILLER               PIC X(5).
               02 PRT-NET-PAY          PIC $*,**9.99.
      * Tax rates -- 77 level aha!
           77 Fed-tax-rate     Pic V999 Value Is .164 .
           77 State-tax-rate   Pic V999 Value Is .070 .
           77 Fica-tax-rate    Pic V999 Value Is .062 .
      * 88 Level is for conditions.
           01 END-FILE             PIC X.
               88  EOF VALUE "T".
       PROCEDURE DIVISION.
       BEGIN.
           PERFORM INITIALIZE-PROGRAM.
           PERFORM PROCESS-LINE WITH TEST BEFORE UNTIL EOF
           PERFORM CLEAN-UP.
           STOP RUN.
       INITIALIZE-PROGRAM.
           OPEN INPUT TIMECARDS.
       PROCESS-LINE.
           READ TIMECARDS INTO TIMECARD
               AT END MOVE "T" TO END-FILE.
           IF NOT EOF THEN
               PERFORM COMPUTE-GROSS-PAY
               PERFORM COMPUTE-FED-TAX
               PERFORM COMPUTE-STATE-TAX
               PERFORM COMPUTE-FICA
               PERFORM COMPUTE-NET-PAY
               PERFORM PRINT-CHECK
            END-IF.
       COMPUTE-GROSS-PAY.
           IF HOURS-WORKED > 40 THEN
               MULTIPLY PAY-RATE BY 1.5 GIVING OVERTIME-RATE
               MOVE 40 TO REGULAR-HOURS
               SUBTRACT 40 FROM HOURS-WORKED GIVING OVERTIME-HOURS
               MULTIPLY REGULAR-HOURS BY PAY-RATE GIVING REGULAR-PAY
               MULTIPLY OVERTIME-HOURS BY OVERTIME-RATE
                   GIVING OVERTIME-PAY
               ADD REGULAR-PAY TO OVERTIME-PAY GIVING GROSS-PAY
           ELSE
               MULTIPLY HOURS-WORKED BY PAY-RATE GIVING GROSS-PAY
           END-IF
           .
       COMPUTE-FED-TAX.
           MULTIPLY GROSS-PAY BY FED-TAX-RATE GIVING FED-TAX
           .
       COMPUTE-STATE-TAX.
      * Compute lets us use a more familiar syntax
           COMPUTE STATE-TAX = GROSS-PAY * STATE-TAX-RATE
           .
       COMPUTE-FICA.
           MULTIPLY GROSS-PAY BY FICA-TAX-RATE GIVING FICA-TAX
           .
       COMPUTE-NET-PAY.
           SUBTRACT FED-TAX STATE-TAX FICA-TAX FROM GROSS-PAY
               GIVING NET-PAY
           .          
       PRINT-CHECK.
           MOVE EMPLOYEE-NAME  TO PRT-EMPLOYEE-NAME
           MOVE HOURS-WORKED   TO PRT-HOURS-WORKED
           MOVE PAY-RATE       TO PRT-PAY-RATE
           MOVE GROSS-PAY      TO PRT-GROSS-PAY
           MOVE FED-TAX        TO PRT-FED-TAX
           MOVE STATE-TAX      TO PRT-STATE-TAX
           MOVE FICA-TAX       TO PRT-FICA-TAX
           MOVE NET-PAY        TO PRT-NET-PAY
           DISPLAY PAYCHECK
           .
        CLEAN-UP.
           CLOSE TIMECARDS.
        END PROGRAM PAYCHECKS.

數(shù)據(jù)文件如下:

Charlie   Martin         41015
Terry     Lacy           32007

輸出結果如下:

$ cobc -x paycheck.cob 
$ ./paycheck 
Charlie   Martin          41.0 15.0 $622.50 $102.09  $43.57  $38.59     $**438.25
Terry     Lacy            32.0 07.0 $224.00  $36.73  $15.68  $13.88     $**157.71
$

學習COBOL的資源

實際上有相當多的課程和書籍學習COBOL。許多課程來自海外,因為離岸外包公司多年來一直在滿足COBOL的需求。

我買了這本書,并完成了我的課程,它相當不錯,在Kindle上的幾本COBOL書籍中,我喜歡Michael Coughlan的《程序員COBOL入門》。YouTube上的視頻堆積如山,我只看了幾個。這一個看起來不錯,但搜索COBOL,你會發(fā)現(xiàn)更多。

接下來還會有更多。4月9日,IBM和openmainframe項目宣布了一個聯(lián)合項目,用COBOL技能連接各州并教授COBOL編程。它有幾個資源,包括一個公告欄,面向那些想重返行業(yè)的COBOL程序員,以及一個開源COBOL課程的開始。

為什么COBOL名聲不好?

從這個小示例中可以看出,COBOL與普通編程語言不同。不能用COBOL編寫編譯器或內(nèi)核模塊,而且語法也不是我們所期望的。但是再考慮另一種常見的領域特定語言:SQL。語法有點奇怪,語義依賴于關系代數(shù)。

Ceballlos說:“在大型機上編程可以讓你一窺軟件過去是如何構建的?!皩τ谌魏维F(xiàn)代程序員來說,它就像一個時間膠囊。與現(xiàn)代的DEVOPS和自動化技術相比,它的大部分仍然是非常手工的。”

COBOL在很多方面都是一種過時的、糟糕的編程語言。但對于它的特定領域,它比其他任何東西都好。