HVML 是一款非常有趣的编程语言,与我们常见的编程语言有很大的不同,其作者将其定义为可编程标记语言(Programmable Markup Language),目标是让开发者直接使用 Web 前端技术开发 GUI 应用程序,无需通过浏览器或 Node.js 做包装,本质上解除了 Web 前端技术和 JavaScript 的耦合,以新的更简单更健壮的现代编程语言直接操纵 DOM 和 CSS,接下来我们就来聊聊关于你知道的并行编程语言有哪些?以下内容大家不妨参考一二希望能帮到您!

你知道的并行编程语言有哪些(近期看到的几款国产编程语言之)

你知道的并行编程语言有哪些

HVML 是一款非常有趣的编程语言,与我们常见的编程语言有很大的不同,其作者将其定义为可编程标记语言(Programmable Markup Language),目标是让开发者直接使用 Web 前端技术开发 GUI 应用程序,无需通过浏览器或 Node.js 做包装,本质上解除了 Web 前端技术和 JavaScript 的耦合,以新的更简单更健壮的现代编程语言直接操纵 DOM 和 CSS。

基本语法

HVML 采用标记性语法,和 HTML 一样非常简单易上手,以下是一个简单的 Hello world 实例代码。

<hvml target="html" lang="$STR.substr($SYS.locale, 0, 2)"> $STREAM.stdout.writelines('Start of `Hello, world!`') <body> <!-- 'test' 元素检查系统区域是否以 'zh' 开头 --> <test with = $STR.starts_with($SYS.locale, 'zh') > <p>世界,您好!</p> <!-- 如果系统区域不是以 'zh' 开头 --> <differ> <p>Hello, world!</p> </differ> </test> </body> $STREAM.stdout.writelines('End of `Hello, world!`') </hvml>

可以看出,HVML 的语法和 HTML 很像,只是根元素由 html 变为 hvml,另外加上了若干控制逻辑。目前来看,HVML 大概引入了20个左右的内部标签,内部标签的意思是这些标签具有特殊含义,HVML 解释器负责解释它们。

  • hvml, head 和 body 是 框架标签(frame tag),用于定义 HVML 程序的整体结构。

  • archetype, achedata, error 和 except 被称为 模板标签(template tag); 它们用于定义参数化模板。

  • init, test, iterate, define, call, include, load, exit, return, update, back 和其他使用动词的标签被称为 动词标签(verb tag),它们用于定义操作数据、更新目标文档或控制虚拟机的动作。

    除以上标签外,其余标签均被视为外部标签,HVML 解释器仅仅对其内容和属性求值,并原样复制到输出文档中,比如:<p>世界,您好!</p> 就会原样输出。

    解释执行

    HVML 是解释执行的,因此开发者需要先安装其官方解释器 PurC(如何安装请参考官方文档),使用以下命令执行。

    purc -b hello-world.hvml

    上述实例代码在中文语言环境下输出以下文档:

    <html lang="zh"> <head> </head> <body> <p>世界,您好!</p> </body> </html>

    英文环境下则输出:

    <html lang="en"> <head> </head> <body> <p>Hello, world!</p> </body> </html>

    主要特点

    从语法层面来看,HVML 使用标记来定义程序结构和控制流,简单易上手,从其背后的实现和技术栈来看,主要有以下特点和优势。

    数据驱动

    标记语法和解释执行决定了 HVML 实际上一种数据驱动的编程语言,开发人员更多地关注数据的生成和处理,可以从远程数据源获取数据、模板、程序片段 。而数据使用大家都熟悉的 JSON 表达,和其它系统交互非常方便。以下是基本的数据类型。

  • 单引号字符串:'这是一个文字文本,$SYS.locale 不会被求值。'

  • 双引号字符串:"$SYS.locale 将在此文本中进行求值。"

  • 长整数(64 位):5L

  • 随机数数组:[ $SYS.random(1.0), $SYS.random(2.0), $SYS.random(3.0) ]

  • 对象:{ locale: $SYS.locale, timezone: $SYS.timezone }

    上述例子中,$SYS 是 HVML 预定义的变量,用于获取系统相关信息。除此之外,$STR 用于执行字符串相关操作;$MATH 提供数学计算功能等等。

    性能卓越

    HVML 是通用语言,可以用来编写简单的脚本工具,也可以开发复杂 GUI 应用,还能够编写服务器端程序

    虽然是解释执行的,但 HVML 的性能非常好。原因有二,一是其栈式虚拟机非常简单高效,且不适用影响性能的任何垃圾收集器。而是支持线程、协程和异步,能够非常简单地进行高并发编程。

    技术架构

    从技术架构来看,其目前开源的项目主要有以下六个,代码量已超过百万行。

    1. HVML 解释器(PurC),用于解释执行 HVML 代码

    1. HVML 外部数据获取器(PurC Fetcher),用于动态获取外部数据

    1. HVML 字符渲染器(PurC Midnight Commander)

    1. HVML 图形渲染器(xGUI Pro)

    1. DOM 布局库(DOM Ruler)

    1. 扩展 WebKit 引擎

    总的来看,HVML 实际和 Vue、React 这样的技术挺像的,但解耦了 Javascript 和浏览器,实现了自己的一套解释、渲染引擎,使得 HVML更加轻量、更加高效,个人感觉在嵌入式这样资源受限的环境中会是个不错的选择。

    以下是一个综合的示例:

    <!DOCTYPE hvml> <hvml target="html" script="python"> <head> <connect at="tcp://foo.bar/bracelet" as="braceletInfo" for="MQTT"> <update on="$TIMERS" to="displace"> [ { "id" : "clock", "interval" : 1000, "active" : "yes" }, ] </update> <link rel="stylesheet" type="text/css" href="/foo/bar/bracelet.css"> </head> <body> <div class="clock" id="clock"> <observe on="$TIMERS" for="expired:clock"> <update on="#clock" at="textContent" with="$_SYSTEM.time('%H:%m')" /> </observe> </div> <div class="temperature" id="temperature"> <observe on="$braceletInfo" for="temperature"> <update on="#temperature" at="textContent" with="$?.value ℃" /> </observe> </div> <div class="heartbeat" id="heartbeat"> <observe on="$braceletInfo" for="heartbeat"> <update on="#heartbeat" at="textContent" with="$?.value BPM" /> </observe> </div> <div class="steps" id="steps"> <observe on="$braceletInfo" for="steps"> <update on="#steps" at="textContent" with="$?.value" /> </observe> </div> <observe on="$braceletInfo"> <choose on="$?" by="CLASS: CDumpEvent" /> </observe> </body> </hvml>

    上述代码假设一个智能手环上显示当前时间、当地气温、佩戴者的心跳信息和步数信息等信息,而这个智能手环通过 MQTT和云端服务器交换信息,比如向云端服务器发送佩戴者的心跳和步数信息、地理位置信息,获得时间以及当前位置的气象条件等信息。

    可以看出,HVML 相当灵活,其生成的文档可以在本地,也可以在云端改变并推送给设备,并重新渲染。因此,复杂的逻辑代码可以全部运行在云端,设备端只需要包含一个根据 DOM 树和 CSS 来渲染最终用户界面的渲染器。需要调整设备端的显示效果或者功能时,只需修改 HVML 代码,无需更新设备固件。