首页
学习
活动
专区
圈层
工具
发布

ABAP 作为一门编程语言,居然没有原生的布尔类型 ?!

笔者接触 ABAP 之前,用的编程语言是 Java,JavaScript,C++.

这些编程语言都有自己原生的 bool(布尔)类型,true 和 false 的分别,就像 1 和 0 一样泾渭分明。

因此当笔者第一次看到 ABAP 从语言层面支持的原生数据类型列表时,有点疑惑:为什么没有 bool 类型?

然后当我看到 ABAP 代码里到处可见的 abap_true, abap_false, 不过是长度为 1,值为 'X' 和 ' ' 的字符常量时,更是一脑子问号:为什么要这样设计?

后来随着我对 ABAP 了解程度的加深,对于 ABAP 这种看似奇怪的设计,我有了一些个人的理解

ABAP 真的会过时吗?聊聊 ABAP 的过去,现在和未来

ABAP 的儿童期回顾和未来展望

江湖 · 剑 · ABAP 之宿命

如笔者上述文章所述,在 SAP 软件的早期时代——20 世纪 80 年代末到 90 年代初,SAP 的 ABAP/4 语言运行在大型机(Mainframe)和早期服务器环境中。那个时代计算资源相对匮乏,存储空间宝贵,因此使用单字符来表示true 和 false 被视为一种节省空间的优化。

ABAP 起源于 IBM 大型主机环境。在当时的系统上,没有原生的布尔类型供 ABAP 使用,而 SAP 工程师选择利用一个字节的字符类型(c)来模拟布尔值。

采用单字符不仅实现简单,而且与底层数据库以及前端显示方式契合。

当时 SAP 的许多数据表和屏幕字段设计也遵循这个约定:用 X 标记`是`,空白表示`否`。

比如在经典 SAP 数据字典中,有一个名为 XFELD 的域(Domain),专门用于表示`是/否`选项,其值范围正是限定为 X 或空格两个取值,含义分别为`是(Yes)`和`否(No)`.

这个命名中的`X`可以理解为打钩的符号(在选框中打一个叉表示选中),而`FELD`在德语中是`字段`的意思,合起来表示布尔标志字段。

通过这种设计,SAP 系统在用户界面上提供勾选框(checkbox)时,用户勾选就会在后端字段中产生一个 X,不勾选则保持为空白。

这种约定直观而高效地将业务含义(选中/未选中)映射到一个字节的存储表示上。

这就好比在纸质调查问卷上,用画`叉 (X)`的方式来表示一个选项被选中,而空着不标记则表示未选中。

ABAP 的布尔值正是采用了类似的思想:用一个明显的标记符号来代表真,其余情况则留白代表假。从此,SAP 从用户界面到数据库存储,都沿用了这一套符号,形成了一种约定俗成的规范。

为什么 ABAP 近些年来飞速发展,引入了非常多新的语言特性和关键字,却唯独没有引入原生的布尔类型支持?

事实上,即使到了 NetWeaver 时代甚至 SAP S/4HANA 的最新 ABAP Platform 上,仍然没有正式增加原生的布尔数据类型——而是继续使用 abap_bool 这种基于字符的替代方案来表示布尔值。

笔者个人猜测,原因之一可能是出于兼容性考虑。

ABAP 语言非常强调向后兼容。大量早期编写的 ABAP 程序以及数据库表结构都使用了字符型来存储布尔状态。如果后来版本的 ABAP 引入真正的布尔类型,与既有的 X/空格约定并存,反而会引入复杂性和兼容问题。

因此,SAP 选择在很长时间内维持这种实现,不贸然改变底层表示。这种坚持确保了老版本代码可以无缝运行在新系统上,避免了因为基础类型变更而导致的潜在错误。

底层存储与内存表示

从系统底层角度来看,使用 X 和空格表示布尔值,实际上是一种对内存非常经济的做法。每个布尔量只占用 1 个字节的存储。相比之下,如果采用类似某些语言的整型 (如 4 字节) 或特殊布尔类型,有可能占用更多的存储空间或需要位操作支持。

ABAP 早期运行环境(例如 IBM 主机)对位操作和特殊类型支持有限,但对定长的字符处理非常成熟。这使得以字符模拟布尔既简单又稳健。

当然,凡事有利就有弊。使用字符来表示布尔值,也意味着这个字符的其他取值理论上也是可能的。

换言之,一个类型为 abap_bool 的变量本质上还是一个字符变量,如果被赋予除 `X` 和空格以外的值(例如 'Y' 或 '1'),从语义上不符合 ABAP 约定俗成的规范,但技术上讲,并不会引起任何编译期间的错误。在 ABAP 编译器眼中,`X` 和 `Y` 以及任何其他长度为 1 的字符变量它都会一视同仁。

因此,SAP 只能在 ABAP 文档中,通过文字形式加以约束,告诫 ABAP 开发人员,在 ABAP 代码里如果要操作布尔语义类型时,不要使用除了 abap_true,abap_false 和 abap_undefined 之外的其他值。

顺便说一句,abap_undefined 这个常量,笔者这么多年 ABAP 开发还从未用过。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OfX5Pw7MpvzT0eNPNr8CgGCg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券