GnuCOBOL

Free and open-source software

GnuCOBOL （曾称OpenCOBOL、GNU Cobol）是COBOL程式语言的自由实现，最初由Keisuke Nishida设计，由Roger While负责领导开发，最近的版本是由Simon Sobisch，Sergey Kashyrin，Ron Norman，Edward Hart和其他许多人领导。

## 历史

在Tiny COBOL上与Rildo Pragana合作时，Keisuke决定尝试建立相容于GNU编译器套装的COBOL 语言编译器，很快便成立了OpenCOBOL。Keisuke担任首席开发人员到2005年和版本0.31为止，接着由Roger While领导，并于2007年12月27日发布了OpenCOBOL 1.0。OpenCOBOL 1.1预先发表版本的工作一直持续到2009年2月。2012年5月，开发转移到SourceForge，将2009年2月的预先发表版本标记为发行版本。2013年9月下旬，OpenCOBOL 语言被接受为GNU项目，更名为GNU Cobol，最后于2014年9月更名为GnuCOBOL。Ron Norman添加了一个Report Writer模块作为GnuCobol 2.0的一个分支，Sergey Kashyrin开发了一个使用C ++（而非C语言）作为中介的版本。

目前最新的版本是2017年9月7日发布的v2.2 Final。

2015年6月17日，将GnuCOBOL 语言源代码（包括具有GNU Cobol和OpenCOBOL拼写的版本）的版权转让给自由软件基金会。

## 开发原则

开发者力求与COBOL语言标准保持一致，符合当前的COBOL 2014规范，并包含现有编译器中常见的功能，但并不保证其标准一致性的程度。即便如此，2.2最终版本通过了NIST COBOL 85测试套件中，9708个测试中的9,688个（99.79％），删除了20个。

GnuCOBOL将COBOL 语言程序（原始码）转换为C语言，然后将C语言程式码编译成电脑使用的机器语言代码（目标码），或其他程序可以呼叫（链接到）的库。在UNIX和类似的操作系统（例如Linux）下，使用GNU C编译器；在微软Windows系统，Microsoft的Visual Studio Express提供了C编译器。两阶段的编译通常可以由单个命令执行，但是使用者也可以选择只编译到C语言程式码即可。

## 文件

2002年至2012年开发团队的官方主页是opencobol.org网站，也是上游开发资料的最佳来源。但是最近的开发工作都在 SourceForge项目空间 内进行，其中也包含最新的GnuCOBOL 语言文件和信息。

由Gary Cutler撰写的OpenCOBOL程式设计指南是根据GNU自由文档许可证发布的，已更新并包含GnuCOBOL 语言和Report Writer，并列在GnuCOBOL文件概述页面中。

## 范例程式

### 传统写法

```cobol
000100* HELLO.COB GnuCOBOL example
000200 IDENTIFICATION DIVISION.
000300 PROGRAM-ID. hello.
000400 PROCEDURE DIVISION.
000500   DISPLAY "Hello, world!".
000600   STOP RUN.
```

```
编译和执行： 
```

```console
$ cobc -x HELLO.COB
$ ./HELLO
Hello, world!
```

### 现代，自由格式写法

```cobolfree
*> GnuCOBOL Hello World example
identification division.
program-id. hello.
procedure division.
display "Hello, world!" 
end-display.
goback.
```

```
编译和执行： 
```

```console
$ cobc -x -free hello.cob
$ ./hello
Hello, world!
```

### 最短写法

使用GnuCOBOL 2.0中的宽松语法选项，最短的有效COBOL程式是一个空白文件。编译和执行如下：

```console
$ cobc -x -frelax-syntax ./empty.cob
./empty.cob: 1: Warning: PROGRAM-ID header missing - assumed
$ ./empty
$ 
```

```
对于早期版本和寬鬆的语法： 
```

```cobolfree
display"Hello, world!".
```

```
编译和执行： 
```

```console
$ cobc -x -frelax-syntax -free hello.cob
hello.cob: 1: Warning: PROGRAM-ID header missing - assumed
hello.cob: 1: Warning: PROCEDURE DIVISION header missing - assumed
$ ./hello
Hello, world!
```

```
任何版本的GnuCOBOL，GNU Cobol或OpenCOBOL，没有宽松的语法。 （注意，有7个前导空格，以符合FIXED布局COBOL源（FIXED layout COBOL source））： 
```

```cobol
    program-id.h.procedure division.display "Hello, world!".
```

```
编译没有错误： 
```

```console
$ cobc -x smallest.cob
$ ./smallest
Hello, world!
```

```
''请注意，这些小程式並不是良好的COBOL語言程式碼; COBOL 语言設計目標是成为一种可读的英语编程语言。'' 
```

## 实作

解析器和词法扫描器使用Bison和Flex。GPL许可编译器和LGPL许可的运行时库是用C语言编写的，并使用C ABI进行外部程序链接。

构建包装使用GNU Build System。使用`make check进行`标准测试使用需要指定 Autoconf，通过`make test`运行的ANSI85测试套件使用Perl脚本。

设置GnuCOBOL编译的configure脚本具有以下选项：

- 选择C编译器及其后期翻译编译选项
- 用于ISAM支持的数据库管理系统
- 包含iconv

## 可用版本

- SourceForge发布1.0版。
- 1.1版，由SourceForge发布
- SourceForge的2.0开发版本
- open-cobol Debian包。
- 2.2最终，2017年9月7日从SourceForge发布
- 2.2源自SourceForge代码树的2017年9月发布的文档。

## 外部链接

- GNU站点，GnuCOBOL的官方发行版
- open-cobol
- 日本开源COBOL联盟
- GnuCOBOL常见问题
- 添加1ToCOBOL开源Cobol和OpenCOBOL宣传网站
- tiny-cobol
- 新的COBOL 语言用户组

## 基本资料

- 作者：Keisuke Nishida, Roger While
- 开发者：Edward Hart, Sergey Kashyrin, Ron Norman, Simon Sobisch and many others.
- 发行日期：2002年1月25日
- 软件版本周期：3.1.1
- 软件版本周期：2020年12月8日
- 预览版本：3.1rc-1
- 预览版本：2020年7月7日
- 编程语言：C，有使用 C++ 的分支版本
- 语言：英语、德语、意大利语、日语、西班牙语
- 类型：程式语言
- 许可协议：GPL with runtime libraries under LGPL