笔者于 2020 年 7 月提出 HVML 编程语言并公开了相关的规范。一年后,即 2021 年 7 月,我们成立了一个攻坚团队并正式开始了 HVML 解释器(PurC)的开发。次月起,即 2021 年 8 月,我们通过“考鼎录”公众号发表 HVML 的开发月报,向关注 HVML 的各位朋友汇报相关研发进展。
本文是 HVML 开发月报的第二期。
在笔者发表于 2018 年的《三谈操作系统》一文中提到,一个操作系统区别于其他操作系统最为重要的技术特征就是围绕某个特定编程语言形成的应用编程接口(API)。我将这个技术特征比喻为操作系统的基因。要设计一个全新的操作系统,就必须在某个编程语言基础上设计一套完备的、可扩展的、易用的应用编程接口,而 HVML 就是笔者为正在开发中的下一代操作系统——合璧操作系统——设计的全新编程语言。
第一次听说 HVML 的朋友,可以阅读如下文章以了解其背景:《合璧操作系统的大胆技术突破:漫谈 HVML,它的由来和未来》。
本文作为 HVML 开发月报的第二期,主要包括如下内容:
-
8 月完成的工作内容
-
下一步计划
-
HVML 规范的调整
-
HVML 新增特性
-
HVML 兴趣小组
-
常见问题及解答
8 月完成的工作内容
2021 年 8 月,在研发团队的努力下,我们完成了如下工作:
- PurC 解释器的架构设计,并根据该架构设计对 HVML 规范做了一些完善及调整,引入了一些新的特性。
- 完成了 HVML 解析器的设计工作和部分编码工作;HVML 解析器主要包括断词(tokenization)和 vDOM 树的构建两个子模块:
- 断词状态机共有近 110 种状态。
- vDOM 树插入模式共有 10 种。
- 解析错误共有 55 种。
- 实现了常用的动态变体对象及其部分方法:
$SYSTEM
对象的uname
、locale
、random
及time
方法。- 用于逻辑运算的
$L
对象之各种方法,如not
、and
以及可对参数化逻辑运算表达式进行求值的eval
方法。 - 用于数学运算的
$MATH
对象之各种方法,如sin/sin_l
、pi/pi_l
以及可对参数化四则运算表达式进行求值的eval
及eval_l
方法。 - 用于文件系统操作的
$FS
对象之各种方法,如list
、stat
、mkdir
、rmdir
等。 - 用于文件读写操作的
$FILE
对象之各种方法,如txt.head
、bin.tail
、stream.open
、stream.readstruct
等。
下一步计划
预计 2021 年 9 月,团队将完成 HVML 的解析器。
预计 2021 年 10 月及 11 月,团队将完成用于支持 FILE、HTTP、LCMD、LSQL 等协议的数据获取器、长连接处理器以及内置执行器模块。
预计 2021 年 12 月,团队将完成 HVML 解释器,并正式发布 HVML 规范 1.0 版本。
HVML 规范的调整
最新的 HVML 规范文档可参阅:
https://gitlab.fmsoft.cn/hvml/hvml-docs/blob/master/zh/hvml-spec-v1.0-zh.md
在进行 PurC 的架构设计过程当中,我们发现了 HVML 规范原有设计中存在的一些问题,并做了相应的调整:
- 明确区分了可变数据(mutable data)和不可变数据(immutable data)。在 HVML 中,所有容器是可变数据,而所有基本类型都是不可变数据。不可变数据的意味着,一旦创建,其值就不能改变。
- 调整了如下标签的名称
- 用于长连接操作的
listen
、request
、close
标签,分别调整为connect
、send
和disconnect
。 - 用于操作数据或元素的
remove
和empty
标签,分别调整为erase
和clear
。
- 用于长连接操作的
- 移除了保留的全局变量名称之前的下划线前缀,如
$_SYSTEM
调整为$SYSTEM
。 - 将用于调用 setter 的尖括号
< ... >
写法调整成了(! ... )
写法。 - 增强规范,使得一个 HVML 文档中可以包含多个本体(
body
标签定义),并增强load
标签,可装载不同的本体。 - 调整
init
及set
的语义,可用于装载动态对象或者重置一个变量。 - 调整
bind
标签的含义,使之用于绑定一个表达式到一个变量上。
HVML 新增特性
bind
标签将一个表达式绑定到一个变量上的功能,使得 HVML 具有类似闭包的能力,如:
<bind on="$users[$MATH.random(10)]" as="me" />
上面的 me
这个变量记录的并不是上述标签定义的元素被执行时 $users[$MATH.random(10)]
的值,而是 $users[$MATH.random(10)]
这个表达式。
当我们需要对绑定的表达式求值时,使用 $me.eval
。因为上面的表达式使用了 $MATH
的 random
方法,所以每次求值将获得不同的结果。
另外,当表达式在不同的上下文环境中执行时,由于所引用变量的作用域发生了变化,所得到的结果也会出现不同。
我们可以使用 observe
标签观察一个绑定了表达式的变量,从而根据变量值的变化做出一些相应的处理。
比如,我们可以将某个目标文档元素的属性或者内容绑定到某个变量上,然后使用 observe
元素处理其上的 change
事件:
<input type="text" name="user-name" id="the-user-name" placeholder="Your Name" value="" />
<bind on="$DOC.query('#the-user-name').attr.value" as="user_name" />
<observe on="$user_name" for="change">
</observe>
在上面的例子中,bind
标签将 #the-user-name
元素(输入框)的 value
绑定到了 user_name
这个变量。当用户改变输入框中的内容时,将触发执行 observe
标签定义的操作组。
HVML 兴趣小组
HVML 兴趣小组是一个虚拟小组,主要成员是对 HVML 及相关技术感兴趣的业内人士,这个小组主要通过微信群聊沟通。
如有兴趣加入该群聊,您可以通过点击“Contact”在后台留言,留下您的微信号,小编加您好友之后拉您入群。
常见问题及解答
Q:在哪里可以看到 PurC 和 xGUI 的源代码。
A:PurC 和 xGUI 仍然处在开发状态,暂时不向公众开放其代码仓库。但您可以申请围观。
Q:未来会开源 PurC 和 xGUI 吗?
A:会的,而且我们会使用商业友好的宽松许可证(如 LGPL)发布 PurC 和 xGUI。
Q:我可以加入 PurC 或者 xGUI 的开发吗?
A:我们欢迎有能力的开发者以兼职形式加入 PurC 或者 xGUI 的开发,飞漫软件会为您的付出支付报酬。有意向的开发者,可点击“Contact”留下联系方式,我们的小编会联系您。
Q:我是一名大学生,目前还没有足够的经验胜任编码工作,能否参与到项目的非编码工作中?
A:可以的。您可以参与到测试用例的编写当中,比如针对 eJSON 和 HTML 解析器的测试用例,或者一些示例程序等。
Q:如何赞助 HVML 相关的项目?
A:个人打赏性质的赞助,您可以点击文后的原文链接。大额的赞助,可点击“Contact”留下联系方式,我们的小编会联系您。
Q:如何申请围观?
A:围观者可以获得内部设计文档以及代码仓库的只读访问权限,但要求对相关软件的设计以及编码提出建设性的意见或建议。如有兴趣,可点击“Contact”留下联系方式,我们的小编会联系您。
原文链接
https://store.fmsoft.cn/campaign/denoteoss-lt
附:商标声明
本文提到的产品、技术或者术语名称,涉及北京飞漫软件技术有限公司在中国或其他地区注册的如下商标:
-
飛漫
-
FMSoft
-
合璧
-
HybridOS
-
HybridRun
-
MiniGUI
-
xGUI
-
miniStudio
-
HVML
-
呼噜猫
-
Purring Cat
-
PurC