xLang(X Language)是雄心工作室未来 3 年的开发重点,旨在于实现一个性能优秀,语法灵活的开发平台。
xLang 设计为支持多种语法的形式,生成的程序和库可以通用,可以混编(类似 .NET 模式)
目前计划实现三种语法:C Like(XCL)、BASIC Like(XBL)、Lua Like(XSL),前期开发工作以 XSL 优先。
xLang 设计为即可编译生成机器指令的应用程序,也可以通过解释器来解释执行 两种工作模式,因此我们选择使用 TCC 作为后端来实现这个能力。
同时 xLang 也尽可能的支持更多平台,前期会先支持 Windows,然后逐步支持 Linux、Android 等系统,甚至嵌入式系统。
我们的思路很明确,C语言非常优秀,但是语言特性已经有些落后了,而且对复杂的数据和字符串进行操作时总是很麻烦。
这些问题恰好是脚本语言十分擅长的,但是脚本语言的性能往往很糟糕,而且每一种脚本语言都或多或少带有一些缺陷,这些缺陷对于C语言来说反而是非常容易解决的。
因此我们希望能够融合两者的优势,创造出一种具备脚本语言灵活性,同时性能很高,ABI兼容C语言的全新编程语言。
这个目标在很早之前就已经根植在我心中了,经过许多年的学习之后,现在我终于有能力实现它了,因此,它动起来了,也许不久后就会和大家见面。
xLang 语言标准(第三版):
语言类型:
XC:X C Language,类似 C 语言的语法
XB:X BASIC Language,类似 BASIC 语法
XS:X Script Language,类似 Lua 语法
XS 关键字列表:
bool
byte int8 ubyte uint8
short int16 ushort uint16
int int32 uint uint32
longint int64 ulongint uint64
long ulong
single float32 double float64 float
string astr wstr ustr buffer
array table struct function
var in is true false null
and or xor not
if then end select case
for while do
function ... [...]
namespace union struct create destroy
object get set meta self private
new delete
async await
注释:
// REM
/* REM */
原生数据类型:
var
null
bool
int
int8 (byte)
uint8 (ubyte)
int16 (short)
uint16 (ushort)
int32 (int)
uint32 (uint)
int64 (longint)
uint64 (ulongint)
long (int32 或 int64 的别名)
ulong (uint32 或 uint64 的别名)
float
float (single)
float64 (double)
string
astr
wstr
ustr
binary
table
function
custom
array (隐含类型,用于和 C 语言交换数据)
struct (隐含类型,用于和 C 语言交换数据)
变量定义:
C like:
type name[ = *][, *]
可以使用 【var a = 0】 这样的语句来定义一个变体类型
BASIC like:
Dim name[ as type][ = *][, *]
若省略【as type】,则定义为 var 类型
Script:
var name[ = *][, *]
XS 无法指定数据的类型,全部定义为 var 类型
运算符:
+ 加法
- 减法
* 乘法
/ 除法
\ 整数除法
% 取模
~ 位非
| 位或
& 位与
^ 位异或
>> 右移位
<< 左移位
|| 逻辑或
&& 逻辑与
! 逻辑非
- 负号运算符
exp ? a : b 三目运算符
++ 自增
-- 自减
= 赋值
+= 累加
-= 累减
*= 乘后赋值
/= 除后赋值
\= 整数除后赋值
%= 取模后赋值
~= 取反后赋值
|= 取或后赋值
&= 取非后赋值
>>= 右移位后赋值
<<= 左移位后赋值
@ 值取指针
# 指针取值
> 大于
< 小于
>= 大于等于
<= 小于等于
!= 不等于
== 等于
and 自动与(有逻辑值参与则为逻辑短路与,否则为位与)
or 自动或(有逻辑值参与则为逻辑短路或,否则为位或)
xor 位异或
not 自动非(逻辑值则逻辑或,否则位或)
in 表、数组、列表是否包含某元素
is 变量是否是某一数据类型
条件分支:
C like:
if ( exp ) { code line }
if ( exp ) {
code block
} else if ( exp ) {
code block
} else {
code block
}
BASIC like:
If Exp Then code line
If Exp Then
code block
ElseIf Exp Then
code block
Else
code block
End If
Script
if exp then code line
if exp
code block
else if exp
code block
else
code block
end
条件选择:
C like:
switch ( exp ) {
case A, B ... :
code block
case C, D ... :
code block
default:
code block
}
BASIC like:
Select Case Exp
Case A, B ...
code block
Case C, D ...
code block
Case Else
code block
End Select
Script:
select exp
case A, B ...
code block
case C, D ...
code block
else
code block
end
计次循环:
C like:
for (var i = 0, i<100, i++) {
code block
}
跳出写法:
break
BASIC like:
For i = 1 to 100[ Step 1]
code block
Next
跳出写法:
Exit For
Script:
for i = 0, 100[, 1]
code block
end
跳出写法:
break
迭代循环:
C like:
for ( [k, ]v in tbl ) {
code block
}
跳出写法:
break
BASIC like:
For [k, ]v In Tbl
code block
Next
跳出写法:
Exit For
Script
for [k, ]v in tbl
code block
end
跳出写法:
break
条件循环:
C like:
while ( exp ) {
code block
}
do {
code block
} while ( exp )
跳出写法:
break
BASIC like:
Do
code block
Loop
Do While Exp
code block
Loop
Do Until Exp
code block
Loop
Do
code block
Loop While Exp
Do
code block
Loop Until Exp
跳出写法:
Exit Do
Script:
while exp
code block
end
do
code block
while exp end
跳出写法:
break
函数定义:
C like:
type name([type ]param) {
code block
}
返回值写法:
return x
return(无返回值)
BASIC like:
Function name(param[ As type]) As type
code block
End Function
返回值写法:
Return x
name = x
Function = x
Exit Function(无返回值)
Script:
function name(param)
code block
end
返回值写法:
return x
return(无返回值)
Script 不限制返回值的数据类型,永远使用变体类型
可选参数:
C like:
type name([type ]param, [type ]param = default) {
code block
}
BASIC like:
Function name(param[ As type], param[ As type] = default) As type
code block
End Function
Script:
function name(param, param = default)
code block
end
可变参数:
C like:
type name([type ]param, ...) {
code block
}
访问:
[...] 将可变参数转换为数组,数组成员都是 var 类型
BASIC like:
Function name(param[ As type], ...) As type
code block
End Function
访问:
[...] 将可变参数转换为数组,数组成员都是 Variant 类型
Script:
function name(param, ...)
code block
end
访问:
[...] 将可变参数转换为数组
命名空间定义:
C like:
namespace name {
body
}
BASIC like:
NameSpace name
body
End NameSpace
Script:
namespace name
body
end
共用体定义:
C like:
union name {
body
}
BASIC like:
Union name
body
End Union
Script:
union name
body
end
结构体定义(字段固定的数据结构,不支持构造、析构和面向对象能力,但可以继承数据结构):
C like:
struct name[ : pclass] {
body
}
BASIC like:
Type name[ Extends pclass]
body
End Type
Script:
type name[ : pclass]
body
end
对象定义(字段不固定,具有元编程特性的数据结构):
C like:
object name[ : pobject] {
[name(param) {
// 构造
}]
[~name() {
// 析构
}]
body
}
单一声明:
object name : pobject
BASIC like:
Object name[ Extends pobject]
Constructor(param)
// 构造
End Constructor
Destructor()
// 析构
End Destructor
body
End Object
单一声明:
Object name Extends pobject
Script:
object name[ : pobject]
create(param)
// 构造
end
destroy()
// 析构
end
body
end
单一声明:
object name : pobject
成员函数:
直接在结构域内定义即可:
C like:
type func(param) {
block code
}
BASIC like:
Function func(param)
block code
End Function
Script:
function func(param)
block code
end
属性:
变量可直接作为结构的属性访问,或可定义函数属性:
C like:
type name get(param) {
block code
}
type name set(param) {
block code
}
同一名称的属性,参数类型必须完全相同,set 比 get 多一个参数,在最后面,代表设置的新值
BASIC like:
Property name(param) As type
block code
End Property
Property name(param)
block code
End Property
有返回值的,就是 get 操作,没有返回值的,就是 set 操作
同一名称的属性,参数类型必须完全相同,set 比 get 多一个参数,在最后面,代表设置的新值
Script:
get name(param)
block code
end
set name(param)
block code
end
同一名称的属性,参数数量只能差一个,set 比 get 多一个参数,在最后面,代表设置的新值
可以在结构域外定义,name 改为 class.name 即可
元编程:
meta 代表实现一个元语言方法
C like:
meta func(param) {
block code
}
BASIC like:
Meta func(param)
block code
End Meta
Script:
meta func(param)
block code
end
支持的元方法列表:
set:设置了一个未知的成员值
get:读取了一个未知的成员值
call:调用了一个未知的函数
callself:调用了本身
to:类型转换
对象自身:
self
对象私有域(两条下划线的数据属于对象自身的数据):
private
__type 用于 is 判断的类型名
__name typename函数获取的类型名
__parent 继承的父表
__meta_set 元编程函数
__meta_get 元编程函数
__meta_call 元编程函数
__meta_callself 元编程函数
__meta_to 元编程函数
__create 构造函数
__destroy 析构函数
创建对象:
C like:
type name = new(param)
BASIC like:
Dim name As type = New(param)
Dim name = New type(param)
Script:
var name = new type(param)
立即值:
十进制整数:
数字直接表示
八进制整数:
&O数字表示
不支持C语言0开头的表示方法,歧义过大容易引发问题
十六进制整数:
0x数字表示
&H数字表示
二进制整数:
0b数字表示
&B数字表示
浮点数:
正常表示,可使用科学计数法
逻辑值:
true、false,不同语言决定是否区分大小写,C语言有 TRUE 和 FALSE 两个别名
字符串:
"文字内容,支持换行回车,支持转义符"
'文字内容,支持换行回车,不支持转义符,表达单引号本身用两个单引号'
ANSI字符串:
A"文字内容"
A'文字内容'
不管文件用什么编码,都以 ANSI 编码存储(OEM编码)
UNICODE字符串:
W"文字内容"
W"文字内容"
不管文件用什么编码,都以 UNICODE 编码存储
UTF-8字符串:
U"文字内容"
U"文字内容"
不管文件用什么编码,都以 utf-8 编码存储
动态编码字符串:
T"文字内容"
转换为对应的编码储存
数组(元组):
[value, ...]
数组下标总是从 0 开始,不允许出现负数下标
表:
{key=value, ...}
索引:
数组(元组):
var[index]
var[-index] 从后向前的索引
var[a to b] 截取数组的一部分
var[a, b, c, d, ...] 按照索引截取数组的一部分,数组索引会按照顺序重新排列
表:
var[index]
var[a to b] 截取表的一部分(仅支持数字索引的表)
var[a, b, c, d, ...] 按照索引截取表的一部分
数据类型强转:
C like:
(type)value
BASIC like:
Cast(type, value)
Script:
value.To(String)
value.To(Int32)
value.To(Double)
语言特性:
async
await
GC