RyLink(​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​面向“链”编程语言)

介绍

RyLink语言是一门面向“链”的脚本语言。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​目前RyLink支持对ANSIUTF8两种编码格式的文档进行处理。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

RyLink语言基于编译器生成字节码,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​然后由跨平台虚拟机RyLinkVM执行字节码。在RyLink中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​支持库开发分为编译器版与虚拟机版。编译器库由编译器加载,主要用于编译阶段的代码类型检测等操作。而虚拟机版库由虚拟机加载,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​其中包含了库的实际执行代码与动态检测。

部分机制特点

由于RyLink拥有特别的“链”机制,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​因此在解释器中需要额外考虑一些情况。例如:循环引用的处理、组合体内引用更新机制等。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

组合体引用更新机制

配图

循环引用处理

配图

基本构成

文件规范

  • 代码文件:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​以.ry为后缀;
  • 字节码文件:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​以.ryb为后缀;
  • 代码文件:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​以.ry为后缀;

可执行文件

目前RyLink语言总体分为三个可执行文件。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​分别为:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

  • RyLink 编译器
  • RyLinkVM 解释器
  • RyLinkBT 字节码转义工具

注’ 其中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​ 编译器 和 字节码转义工具 都具备中英双语版本

关键字

num (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​数值)str (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​字符串)bool (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​逻辑)fun (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​函数)
any (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​任意)null (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​空值)global (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​全局)copy (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​复制)
true (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​真)false (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​假)and (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​且)or (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​或)
if (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​若)else (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​否则)switch (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​开关)for (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​遍历)
while (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​循环)continue (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​跳过)break (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​跳出)link (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​链接)
unlink (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​解链)infof (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​信息)return (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​返回)do (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​执行)
elif (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​否则若)combine (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​组合)com (​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​结构)

优先级

*注’ 优先级由低到高排序

类型相关内容
赋值、运算:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​=, +=, -=, *=, /=, \=, %=
逻辑处理:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​or,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​and
比较运算符:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​>, >=, <, <=, ==, !=
加减运算:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​+, -
乘除运算:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​*, /, \, %
前缀运算:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​-X,++X,--X
函数调用:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​function(X) , infof
索引成员:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​array[index]
链接访问:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​link.property , link.function()
链运算:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​link , unlink , copy , combine

语法

注释

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​包括多行注释和单行注释:

// 单行注释内容
/* 多行注释内容 */

数据类型

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​包括如下数据类型与结构:

str     //字符串
num     //数值
boolean //逻辑
com     //组合
any     //任意
*[]     //数组
*()     //函数

以下为RyLink较为特别的运算设计:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

字符串 * num = 字符串自身的num倍
字符串 * 字符串 = 字符串字符串字符串
字符串 / 字符串 = 字符串按照字符串分割
字符串 / num = 字符串长度 / num 后截取的内容
字符串 + num = 字符串 + 字符串自身的num部分
字符串 - num = 字符串 - num长度
字符串 + 字符串 = 字符串字符串
字符串 - 字符串 = 字符串中去除所有字符串

字面量

字符串字面量
"单行字符串内容"
&>多行字符串内容<&
数值字面量
0   //整形数值
0.0 //浮点型数值
逻辑字面量
true  //真
false //假
空值字面量
null //空值

变量声明

[global] var 变量[:变量类型] [= 字面量]

循环

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​for循环仅用于处理数组遍历,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​并且允许在遍历中途跳过某轮循环continue或直接跳出breakreturn。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

for(变量,数组){
    /*代码语句*/
}

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​while循环的关键字位置将会决定循环的执行方式。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

// 先判断后执行
while(布尔){
    /*代码语句*/
}
// 先执行后判断
do{
    /*代码语句*/
}while(布尔)

流程控制

If语句

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​if语句与其它语言类似。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

if(布尔){
    /*代码语句*/
}
if(布尔){
    /*代码语句*/
}
elif(布尔){
    /*代码语句*/
}
else{
    /*代码语句*/
}
Switch语句

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​switch会更为简洁且更为强大,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​switch不仅能处理更多的字面量类型,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​并且还支持动态变量的分支处理。RyLink允许switch分支为不同的类型数据,当传入的变量类型与值都和分支相同时才会进入分支执行。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

switch(变量){
    字面量{
        /*代码语句*/
        break;
    }
    字面量{
        /*代码语句*/
        break;
    }
    ...
    any{
        /*代码语句*/
        break;
    }
}

函数

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​fun函数由此关键字声明。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​此外,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​global用于声明函数是否公开,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​这主要用于模块声明,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​当一个文件被引入后,只有其中被global声明的函数才会被公开引用。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

[global] fun 函数名(参数列表){
    /*代码语句*/
    [return 字面量或变量]
}

注’ 值得注意的是,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​在调用函数时,若函数参数列表中形参支持默认值,则在调用时需在对应参数位置传入”null”

数组

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​数组通过变量:类型[] = [字面量列表]进行赋值初始化,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​而数组访问则通过[数值 | 数值变量]进行,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​多维数组操作类似。

链接与解链

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​链接与解链是一个特殊设计,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​通过父变量 link (变量 | 函数)父变量 unlink (变量 | 函数)语句实现关联。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​被链接对象作为父变量,链接对象作为子变量,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​访问方式为父变量.子变量。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

此外,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​RyLink语言还提供copycombine关键字。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​通过父变量 copy (变量 | 函数)可以将指定对象的内容值拷贝给父变量。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​而父变量 combine (变量 | 函数)则可以将指定变量以拷贝值的形式链接入父变量。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​link 与 combine的差异就在于link是拷贝引用,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​而combine是拷贝值。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

infof

通过infof 名可以获取对应变量的信息值,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​其中给定了声明类型、内容类型、垃圾回收权重,数据以json形式提供,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​后续动态增加相关信息,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​以此便于开发者进行更精细的控制。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

模块

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​支持模块化设计。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​在一个文件中撰写代码后,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​此代码可以被其他文件引用,引用语法为<"引用路径">。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​值得注意的是,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​被引用代码文件中,只有被global声明的函数或变量才能被当前代码使用。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

在RyLink语言中,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​可引用库分为两种,一种是代码文件库,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​即由RyLink代码编写成的库;另一种是动态支持库,即由其它编程语言编写的符合动态链接规范的功能库*.dll/*.so。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​

首版作者信息

(​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​添加请备注:“RyLink”)

@QQ :​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​2874148643

@E-mail:​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​ 2874148643@qq.​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​com

注’ 由于作者认为RyLink相较于其它语言并没有特别的优势,​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​因此已暂停维护。​‌‎​​‌‎​‌​‎‌‌​​‎​‌‌‌‎‌‌‌‌‌‎‌​‌‌‎‌​​‌‎​