首页 新闻中心 当前文章

xLang 系列编程语言项目开始,语言标准前瞻

xLeaves(xxrpa) 发布于 2022年08月18日 18:29:22


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

若无特殊声明,上述内容为本站原创,未经授权禁止转载!