當前位置:
首頁 > 知識 > 十年老程序員親述,一個COBOL神秘 bug的解決過程

十年老程序員親述,一個COBOL神秘 bug的解決過程

喜劇演員羅德尼?丹傑菲爾德(RodneyDangerfield)曾在舞台上抱怨自己不受尊重,而COBOL就像是編程語言中的RodneyDangerfield,沒有得到任何尊重,很多程序員都第diss它冗長古老。但是實際情況並非如此,COBOL處理了85%的交易業務,每年也會有50億條新的COBOL代碼加入。

作為一名十年COBOL程序員,我並不認為COBOL有人們描述的那麼糟糕。事實上,它在貨幣處理和固定格式記錄方面的表現還是相當不錯的。但不可否認的是,COBOL確實有很多怪癖,其中有很多是植根於早期編程的計算環境。

下面以我自己的親身經歷,和大家分享一個打孔卡吃了我的程序的故事。

一個神秘的bug

以下是問題代碼示例,該段代碼是在嘗試計算訂單的運費和預計發貨日期:

十年老程序員親述,一個COBOL神秘 bug的解決過程

這段代碼的邏輯非常清晰,其實是從來沒有看過COBOL代碼的人也可以看得懂。

如果運送方式是「FX」,客戶的商品第二天將獲得運送,否則的話,運輸需要兩周時間(90年代)。員工可以享受免費送貨, 其他人則需支付4.99美元。在我看來這段代碼完全是正確的,但其實存在一個bug,它的發貨日期計算是正確的,但是員工的運輸費卻是全額收取的。

當時,我採取了一些偵探手段來跟蹤問題,結果發現是19行處出現問題。而現在語法高亮編輯就可以直接解決這個問題。

Sentences代替blocks

為了回答這個問題,我們需要追溯到20世紀50年代後期。在此之前,絕大部分語言是被設計來解決科學和工程問題,它們的語法類似於數學方程。Fortran就是這方面的典型例子。而COBOL的設計初衷主要是用於商業計算,為了讓COBOL更易於學習,Grace Hopper和IBM工程師團隊給COBOL設計一種英文語法。COBOL程序具有層次結構,而不是大多數現代編程語言的遞歸語法。代替COBOL,COBOL是由句子組成。像英語一樣,每個句子也有時間限制。

這從理論上來看是個好主意,但實際上卻是有問題的,代碼很難移動,stray期間很可能會意外終止塊。而且還會涉及到一個更深層次的問題,COBOL首次開發時程序員如何編寫代碼。

十年老程序員親述,一個COBOL神秘 bug的解決過程

COBOL設計時,硬碟驅動器非常昂貴,所以大多數程序都是用打孔卡寫的。最常見的打孔卡由12x80格子組成,其中孔表示1和非孔代表0。每一列是一個12位的字元,每個卡是一個80個字元的文本行。運行程序的時候,需要將一張打孔卡片放入讀卡器。每張卡片的前六列和最後八列保留序列號和標識符。這樣,如果當卡片掉了之後,這可能是你的程序的唯一副本,並可以通過機械分揀機卡,把它們放回到正確的順序。

這意味著COBOL第72列之後的所有字元會被忽略。如果這是一個時期發生的事情,你的代碼的整個邏輯都會改變。所以你一定猜到了,19行的代碼剛好排到了73列。這是COBOL編譯器如何實際解釋這些行:

十年老程序員親述,一個COBOL神秘 bug的解決過程

一旦找到問題,修復就是一件很簡單的事情:從第19行開始刪除了一個空格,它就排在了72列。雖然這個問題我從來沒有遇到,但這是一個常見問題,許多COBOL程序員會在其終端的72列和73列之間加一條線。

現在的COBOL

COBOL-85標準添加了範圍終止符,如end-if,因此句子不再需要結束。COBOL 2002標準允許自由格式的代碼,寫入2002年標準的代碼使其看起來更像是一種現代編程語言:

十年老程序員親述,一個COBOL神秘 bug的解決過程

請注意,行的開始處的空格也不再是必需的。我的工作系統通常都會支持範圍終結器和自由格式的代碼。COBOL編譯器傳統上是閉源和昂貴的,大多數COBOL代碼是在企業環境中編寫的。2002年,一個名為OpenCOBOL的開源編譯器出現了,2013年,它被正式接受為GNU軟體包,並更名為GnuCOBOL。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT168企業級 的精彩文章:

微軟推出CoCo區塊鏈框架,明年有望開源!
無伺服器功能構建簡單化 功能即服務—OpenFaaS介紹
Skylake Xeon SP的派對上怎能少了IBM?
谷歌推出基於機器學習的工具 以此追蹤仇恨犯罪

TAG:IT168企業級 |

您可能感興趣

不一樣的Windows,ReactOS系統詳細安裝過程
實戰!為App Spack 重設計LOGO的過程是怎樣的
做Kindle書的過程
Magic Leap 首次對外講述產品演化過程
MySQL DeadLock故障排查過程
MongoDB系統CentOS 7.1 crash的排障過程
FinnCiti理財遊戲的三個過程
SonarQube代碼審核詳細過程
OPPO Reno製造過程:全靠「虐機」,不愧世界前五廠商!
圍棋AI ELF OpenGo全面開源,田淵棟揭秘訓練過程
James Lewis:新技術的採納是一個組織變革的過程
一個網工的Linux學習過程
四方框框|Lidia Springer~「GIRL IN MASK」 精彩插圖繪製過程
Photoshop詳細解析室內人像後期精修過程
Nature:密切關注整個衰老過程
HttpURLConnection使用過程中踩的坑
Kubernetes中Node的網路重啟後,所有Pod無法訪問的調查過程
剖析Hadoop和Spark的Shuffle過程差異
SHINee Key-log6日出擊 公開專輯製作過程
有一種設計叫別人家的Logo,一組設計LOGO 的動態步驟過程