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 解释器仅仅对其内容和属性求值,并原样复制到输出文档中,比如:<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 是 HVML 预定义的变量,用于获取系统相关信息。除此之外,$STR 用于执行字符串相关操作;$MATH 提供数学计算功能等等。
性能卓越HVML 是通用语言,可以用来编写简单的脚本工具,也可以开发复杂 GUI 应用,还能够编写服务器端程序
虽然是解释执行的,但 HVML 的性能非常好。原因有二,一是其栈式虚拟机非常简单高效,且不适用影响性能的任何垃圾收集器。而是支持线程、协程和异步,能够非常简单地进行高并发编程。
技术架构从技术架构来看,其目前开源的项目主要有以下六个,代码量已超过百万行。
- HVML 解释器(PurC),用于解释执行 HVML 代码
- HVML 外部数据获取器(PurC Fetcher),用于动态获取外部数据
- HVML 字符渲染器(PurC Midnight Commander)
- HVML 图形渲染器(xGUI Pro)
- DOM 布局库(DOM Ruler)
- 扩展 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 代码,无需更新设备固件。