2000 年刚上大一时,我就从学校电脑机房的因特网,晓得了国内 C 语言凌乱代码大赛这个奇葩赛事。
国内 C 语言凌乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国内编程赛事,从 1984 年开始,每年举办一次,目标是评比出最有创意的,最让人难以了解的 C 语言代码。
赛事官网:https://www.ioccc.org/,下面能看到每一年获奖作品的源代码和评委点评。说实话我也很拜服这项赛事的评委们。
来看一些作品。
上面这段 C 语言代码,用来计算圆周率。
计算字符串 MD5 hash 的代码。
一个扫雷游戏的源代码:
应用奇葩的变量命名形式,是这些参赛选手应用的根本技巧之一。
说到变量命名,ABAP 帮忙文档里明确提到,对于 ABAP 命名常规,包含数据类型,变量名称,ABAP 类和 procedure 的命名,最多容许 30 个字符的长度,举荐只应用 A 到 Z 的大小写英文字母,数字和下划线。
然而还存在 #,%,¥,* 这些非凡的字符,它们又能不能呈现在 ABAP 编程语言的变量命名中呢?
能够设想,如果搞一个 ABAP 凌乱代码大赛,那么源代码里必定少不了这些特殊字符的身影。
哪些特殊字符,能够呈现在 ABAP 数据类型,变量,以及 Procedure 和参数名称里,哪些则不行?
看上面这两张表格就行了。表格怎么来的,我先卖个关子,在文末揭晓答案。
先介绍怎么浏览这两张表格。
表格一共 10 列,第二列是字符自身,第一列是字符的 ASCII 编码 (16 进制),第三,四,五,六这四列,别离代表该字符,是否可能呈现在 ABAP 变量命名的最初一个字符地位,两头字符地位,第一个字符地位,以及名称第一个地位后紧跟下划线的四种状况。
第七列开始的四列,代表同样的排列组合,只是探讨的是这些变量命名形式,在 ABAP 类内是否非法。
光用文字描述可能有点形象,咱们来看理论的例子。
感叹号!和 “
依据表格,这两个特殊符号,不容许呈现在 ABAP 变量名的任何地位。
号
依据表格,# 号能够呈现在变量名称的两头和开端,因而下列代码是非法的,能够失常编译和运行。
DATA: a# TYPE c VALUE 'c',
b#c TYPE i VALUE 1.
WRITE: a#, b#c.
$ 美元符号
依据表格,这个符号要分类探讨。
在一般的 ABAP 报表里,$ 可能呈现在变量名称的任意地位。下列代码能够失常编译并运行。
DATA: a$ TYPE c VALUE 'c',
b$c TYPE i VALUE 1,
$ type string value 'jerry'.
WRITE: a$, b$c, $.
当在 ABAP 类的源代码中应用时,$ 不容许呈现在 ABAP 变量的任意地位。
比方下列代码第 21 行,会遇到编译谬误:
Names can consist only of the characters “A-Z, “0-9”, “_”, and “-” and they also cannot begin with a digit.
两种 ABAP 编程上下文中,$ 符号体现行为的截然不同。这种景象也能解释,在笔者的文章 ABAP 真的会过期吗?聊聊 ABAP 的过来,当初和将来 里提到:1979 年,SAP 公布了第二代 ERP 零碎,即 SAP R/2. ABAP 在 SAP R/2 的开发过程中施展了重要作用,随同着 ABAP 调试器、屏幕编辑器的呈现,俨然已成长为一个齐备的集成开发环境。
而 ABAP 面向对象个性的齐全成熟,公认的工夫点则在 R/2 问世的 20 年之后,即 Java 诞生的五年之后。ABAP 面向对象的编程范式,引入了更为严格的语法查看,本文介绍的看待 $ 符号的解决就是范例之一。
百分符号 %
这个符号比 $ 更为非凡。
在传统的 ABAP 报表开发里,% 能用在 ABAP 变量名称的任何地位。
下列代码可能失常编译并执行。
DATA: % type int4 value 1,
%% like % value 2,
%%% like %%.
%%% = %% / %.
WRITE:/ %%%.
当用在 ABAP 类里时,% 前面随同着下划线的命名形式是非法的,如下图第 21 行所示:
然而去掉下划线后,%a 这种用法就不非法,会遇到和应用 $ 时一样的编译谬误:
& 号
不容许呈现在变量名称的两头地位和开端,然而能够呈现在变量名称的结尾和下划线之前。
下列代码能够通过编译和执行。
DATA: &a TYPE c VALUE 'a',
&_b LIKE &a VALUE 'c',
c TYPE string.
c = &a && &_b.
WRITE:/ c.
* 号
能够呈现在传统 ABAP 报表变量的任意地位。不容许呈现在 ABAP 类的变量名称里。
下列代码非法,计算的是 1 乘以 2 的值,将后果存储到变量 * 里,最初打印后果 2.
至于其余的特殊字符,? < > ^ 之类,大家能够依据表格本人去尝试,本文不再赘述。
最初解答一点,这个表格怎么绘制进去的?
答案是,报表 DEMO_CHARACTERS_IN_ABAP_NAMES
的执行产物。
执行这个报表,抉择想查看命名规定的类型,比方本文的表格,就是抉择 Data Objects 之后执行的输入。
这个报表的设计原理是,通过 96 次循环,逐个检测 96 个字符在不同编程上下文的语法查看状况。如果语法查看失败,就阐明这个字符,ABAP 编译器不容许它呈现在对应的地位。
语法查看通过 ABAP 关键字 SYNTAX-CHECK 实现,如下图图例 1 所示,这个关键字承受一个内表作为输出参数(图例 2),内表蕴含的就是待查看的 ABAP 源代码。这个内表在图例 3 所示的 edit_and_check 办法里,通过 REPLACE ALL OCCURANCES OF 关键字,把待检测的符号(存储在变量 token 里),替换到源代码内表变量 source 里。
从表格的输入来看,对于 ABAP 面向对象的编程环境里,ABAP 变量名称只容许蕴含英文字母,数字和下划线,因而在变量名称可读性这一块上,不容易呈现太大的问题。
对于那些依然在传统 ABAP 报表畛域从事保护工作的敌人们来说,只管在这种环境下 ABAP 编译器对特殊符号应用的查看,要宽松得多,但倡议大家还是自觉遵守只应用英文字母,数字和下划线的组合,不给本人和他人找麻烦。毕竟,大家身边的共事,没有国内 C 语言凌乱代码大赛的评委们那么有急躁。