Red语言:向编程复杂性反击(2)

Rebol或Red程序源代码通常都是UTF-8输入字符串,它们都会被LOAD化处理。LOAD是原生的核心功能,能够将任何字符串变换成包含在一个块中的内存二进制格式。块将值存储至128比特的相邻单元内。值主要分为标量值(其尺寸固定)或序列值(用户可以向其中添加/删除数据)。数字、日期、元组和值对是标量值的,而值块、字符串、URL、路径、文件和标签是序列值的示例。标量值通常可以置入单个存储单元,而序列值则需要额外内存。

因此,块是带有垃圾回收的内存管理器进行保留和回收的主要分配单位。Rebol采用经典的stop-the-world标记和清理垃圾回收算法,而Red则依赖于stop-the-thread分代压缩垃圾回收算法(尚未完全实现),交替进行部分或全部遍扫。Red将扩充其垃圾回收算法,在未来实现增量回收,以使得它可以用来开发实时应用,例如60-FPS的街机游戏。

一旦源代码被加载入内存,变成一个值块,它就只是纯粹的数据。默认地,在遍扫源代码,使之变换成Red或Rebol二进制文件时,就会对值进行计算。如果是用Rebol语言,加载的块会被解释执行;如果是用Red语言,它们就将被编译成本地代码,但目的都是为了完成计算。然而,值块以何种方式进行解释,则是依赖于语境的。解释方式有如下几种:

函数式:由某个函数来取参计算

作为一种特殊语法:即所谓方言(指DSL)

通过Parse方言语句:匹配(matching)、回溯(backtrack),以及生成(production)

ad-hoc代码:你想如何处理,由自己决定

默认的(非纯的)、以函数式方式解释的语言(即我们通常所谓的“代码”),是一种面向表达式的语言,它带有很简单的语义规则:

没有关键字

带有称为“改进”的可选扩充的定参函数

单一或多值的函数参数和返回值

表达式由左到右求值

中缀运算符优先级高于前缀函数调用

因此,浮在语言上方的函数层可以很容易地被任何自定义计算体取代(例如,撰写一个类似于Prolog的解释器将非常简单)。这使得Red和Rebol具备了极好的可延展性,十分容易适应任何你可能的需要。这种灵活性是DSL得以成为一种自然的方式解决一些计算任务,通过提供特定领域的微语言对于给定的任务实现优化的基础。Red和Rebol凭借这种力量,在核心语言和标准库中广泛地使用了嵌入式DSL:

VID:视图接口方言(View Interface Dialect)是用于建立GUI的DSL

Draw:进行2D绘图的DSL

Parse DSL:一种类BNF语法解析DSL

Security Dialect:一种在运行时用于控制安全沙箱特性的DSL

函数规格:函数原型亦使用DSL来描述

使得嵌入式DSL的创建容易、便捷的因素有:

Parse DSL:一种强大的TDPL,并带递归和回溯支持

可将Red或Rebol代码直接内嵌于规则解析的能力

丰富的数据类型:已支持数十种常用数据的字面量符号,所以没有必要建立特殊规则来解析之

下面是一些在Rebol2中的GUI DSL的示例:

按一个大小为100×100的红色按钮,以打开一个窗口:

>> view layout [button "Hello" red 100x100]

显示会触发一个动作的按钮:

>> view layout [button "Hi" [print "Hello!"]]

显示按钮,打印一个字段的内容:

>> view layout [ in: field 200 button "Print" [print in/text] ]

Red语言中的一个Parse DSL示例:

  red>> digit: charset "0123456789"   red>> parse "hello 888 world" [   some [copy n some digit | skip]   ]   red>> n   == "888" 与Rebol相比,Red带来了什么?

由于想要解决Rebol语言的一些不足之处,Red语言应运而生。这些不足包括:

 性能不够高(接近Ruby/ PHP)

 缺乏底层编程能力

 不能利用多核,并发支持有限

 缺少对移动操作系统的支持(在2013年才对Android提供有限的支持)

 不开源(开源时限仅至2012年12月,且仅限于Rebol第3版)

Red在解决以上大部分问题时都采用了创新设计:嵌入一个低层次的程序设计语言,它可以直接编译为本地代码,即Red/System。它采用Red语法(值仍为块的形式),但与C类似,语义级别更低。它是静态类型语言,并仅提供少数几种数据类型:integer!、float!、float32!、byte!、logic!、pointer!、struct!,以及function!。它算支持指针算术,这赋予了它近于C的力量。标准库也非常简约,所以纯Red/System编译后的代码尺寸非常小,下面这个程序:

Red/System [ Title: "Hello World app" ] print "Hello World!"

编译后通常小于10KB。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2637d3e909090340c3a17e4e146bfdd7.html