作者自述CSE语言设计思想(二)----CSE语言表达风格

本文探讨了CSE语言的设计思想,强调了其不同于C/C++和Python的独立风格。CSE采用“##”作为注释标志,保留了C/C++的字串表达形式,并通过四类操作符(一元、二元、标记、变元)实现表达式构建。这种设计使CSE能够动态注册操作符,作为‘编程语言的语言’提供强大的表达能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每门语言都有她的风格,像Python用缩进表示语句块,语句行尾不加分号,#开头表示注释,C/C++用花括号表示语句块,程序分表达式与语句,用“//”或“/* */”表示注释等。设计CSE时我面临一个选择,顺从一个已有语言的风格呢?还是自创一种风格,05年那个夏天确实被这个问题纠结了很长时间,后来原型做出来了,经评估才发现这不是问题的关键。

如果顺从C/C++,至少要95%的语法与C/C++相同,这样介绍CSE时要着重介绍5%的内容就可以了,否则,比方80%相同,20%不同,反倒让人更困惑。曾有一位宁波同事,在温州生活多年,怎么也说不好温州话,但他的英语与普通话都说得都很溜,属有点天份的那类,可问题就在这儿,宁波话与温州接近,说温州话老串宁波腔。

我们原型做出来后,评估了一下,只5%语法差异根本不可能构造出一个解释性语言环境,结论明朗了:确定自己的语言风格。但为什么不顺从已有脚本语言的风格呢?比如Python,原因是Python的命令式风格重了点,拿它仿真C语言操作有点困难了,仿真C++语法几乎不可行,即使选它我们也得做不少改造,同样也陷入上面80%与20%的困境。

CSE语言风格是什么呢?学过CSE的已经清楚了,他的内核语法规则非常简单,内核语法也就是CSE作为“编程语言的语言”的描述方法。而CSE的延伸规则依据适配对象不同,比方模拟C、C++、C#,还有仿JavaScript(已纳入开发计划)又能灵活衍化。这里,我们不讲衍化后CSE的表现规则,重点把内核语法的表达风格讲清楚。

 

1. 注释风格

CSE用“##”开始到行尾表示注释,最早期CSE曾借Python注释风格(用“#”),后来改用两个“#”号了,因为拿一门语言描述另一门语言,需要一种“超集”表达能力,标识符(即变量、函数名)不能限定于A-Z、a-z、0-9还有下划杠了,我们把“#”也纳入到常规标识中,比如uppercase#1与uppercase#2都是CSE合法函数名,翻译成C++,成为两个uppercase同名函数,这让脚本形态的函数成功模拟C++的多态函数。此外,“#”在C/C++中表示宏指令,“#”成为CSE标识符,我们便能用常规符号模拟C/C++的#define、#if等指令。赋予“#”有特殊功用后,CSE的注释就改用“##”表示了。

 

2.字串

CSE的字串主要顺从C/C++表达形式,主要便于C/C++程序快速切入这门语言,连续多个字串自动连接、反斜杠转义等规则与C语言相同。

CSE没采用跨行表达方式,是考虑集成界面的基于代码碎片扫描符号定义的需要。在CseWin界面中,随便写几行脚本,都容易得到输入信息提示的,比如,键入这行代码“name as TCharArray("example");”,然后键入“name.”就有该类对象的成员提示了。CSE语言设计考虑了从碎片代码扫描数据类型的需求,正在编程中的代码总是不完整的,不能依赖严谨的语法分析去得到符号定义,CSE字串不跨行方便了碎片代码的特征扫描,另外,CSE的as、declare等设计也很好支持了这一目的。

 

3.操作符

在CSE中,除了用户定义的变量、函数、类型声明,剩下都是操作符。从内核语言的角度,CSE没有语句,只有表达式,尽管它表面用起来可以像C/C++中的语句。而表达式由一元操作、二元操作、标记操作、变元操作构成,这4类已是全部。如new、delete是一元操作,加减乘除是二元操作,C语言的“cond?expr1:expr2”三元操作,在CSE中理解为两个二元操作的叠加,标记操作是由左标记(LNotator)开启,并由右标记(RNotator)结束的操作,如class、func等开启一个语句块,用end结束一个语句块。

变元操作则根据不同使用情况,自动转为一元、二元,或标记操作。比如“try doSomething();”中变元操作try是用作一元操作符的,但在如下句式中用作标记操作。

try:
  doSomething1();
  doSomething2();
end;

又如,变元操作global,它单独使用时,相当于“global()”,在“global.AVar”表达式中它的作用相当于一个变量。

强调一句,上述4类操作已构成CSE“可计算”符号的全部,这在常规编语言看不到的,比如大家经常遇到数组表达式“AVar[n]”,中括号在CSE中注册为左标记,它既开启一个列表,即[n],也用作二元操作,连接AVar与[n]。再如小括号,如下用注释给出各种场合下左小括号的功能:

AFunc(arg1,arg2);  ## 用作左标记符:(arg1,arg2)
                   ## 用作二元操作符,连接 AFunc 与 (arg1,arg2)
(expr)             ## 用作左标记符,表示操作优先级
(expr,)            ## 作左标记符,描述参数列表

当所有计算元素都精简为操作时,我们把编程语言归一化了,因为操作符是动态注册的,并非事先预置,预置意味着功能固定不变,且必须经过语法分析才发挥作用。

我们对通用语言抽象出4类操作,保障了CSE作为“编程语言的语言”的表达能力,CSE从V1版本就采用这个框架,多年来基本没变,但用仿真的语言从C、C++、OOC等一路扩展,实践证明该机制既充分自我描述,表达能力也是完备的。

介绍上面这些对了解CSE语言风格差不多了,这门语言比较规整,有据可循,它常用冒号开启一个语句块,用end结束语句块,大家学一条if句式,其它触类旁通,勿需死记。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值