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

你是否曾对软件编程栈的混乱感到过困惑?错综复杂和臃肿的解决方案无处不在,但无论是在当代软件的构建还是维护环节,很少有架构师和程序员能真正意识到由此带来的成本。Red的存在正是为了反击这种复杂性,这是它最主要的设计目的。没错,在现代软件世界中,“简单”的工具和简单的解决方案仍是可以企及的。这是个所有人都竭力掖藏的行业秘密(这可不是什么好事儿),但自1997年以来,解决方案其实已由Rebol编程语言给出。Red继承自Rebol谱系,并尝试将Rebol原先的使用范围加以大大拓展。Red是个雄心壮志的项目,它想要成为首个全栈编程语言。以下是其主要特性和设计目标:

范式无关,默认提供函数式/命令式/符号式范式

支持基于原型的对象

同像语言(Red语言是其自身的元语言)

既能以静态方式,也能以JIT方式编译为本地代码

强力支持并发和并行(通过Actor和并行聚集)

通过内置Red/System DSL提供底层系统编程能力

提供高级脚本特性和REPL控制台支持

高度可嵌入(​​像Lua一样,或者更好一些)

低内存占用,支持垃圾回收

低磁盘空间占用(<1MB)

生成单个的命令行可执行文件

零安装、零配置

独立的跨平台工具链

除运行的操作系统外,概无其他依赖

Red语言,正如Rebol一样,依靠独特的途径来编程,与目前主流语言的主张有所不同。以下是JSON发明者Douglas Crockford对Rebol语言发表的评论:

Rebol是一种更具现代性的语言,但也有些与Lisp语言非常相似的思想蕴涵在内,主要体现在它也是完全建立在先进行数据表示、尔后将其作为程序执行起来这样的基础之上。但它拥有更丰富的语法材料。Rebol是一种才华横溢的语言,它本该更普及一些,现在却并未如此,这可引为憾事。

Red和Rebol的设计目标是要尽可能地提供表达能力,同时保持源代码的高可读性,事实上它们的源代码很接近自然语言。2013年的一项将程序设计语言按表达能力排序的研究项目中,Rebol语言名列第三,仅次于Augeas和Puppet这两种DSL()。这有力地表明,在所有通用型程序设计语言中,Rebol是表达能力最强的一个。Red和Rebol都遵守务实设计原则,没有哪部分是拍脑袋的决定,或是“为了不同而不同”。每个语法或语义背后,都有明确的设计理由。

Red语言初探

Red和Rebol如何在企及如此水平的效率的同时,又保持“简单”呢?根本的原因之一,是因为这两者都既是一种数据格式,又是一门程序设计语言。此特性继承自Lisp,特别是s-表达式概念。Lisp中也建立了Red和Rebol所依赖的元编程模型。它们都是同像语言,所有的代码都表示为数据。值存储在块中(使用方括号记法:[……]),即普通列表,这和Lisp的记法一样,但它们不要求函数调用的那对括号,这就使得代码看上去更像自然语言。函数在默认情况下采用前缀记法,然而,Red和Rebol也支持针对数学和布尔运算符采用中缀表示法,这为代码阅读提供了便利。采用这种纯元编程进行程序设计,反射、热补丁、甚至即时编码这些语言特性都能得到内建支持,不需要学习任何新API,也无须特别的库支持,只使用基本函数进行数据操作即可。以下是使用Red语言REPL的示例:

$ red red>> code: ["hello"] == ["hello"] red>> insert code 'print == ["hello"] red>> code == [print "hello"] red>> do code hello red>> code/2: 123 == 123 red>> code == [print 123] red>> append code [+ 1] == [print 123 + 1] red>> do code 124 red>> length? code == 4 red>> type? code/1 == word! red>> foreach value code [probe type? value] word! integer! word! integer!

如君所见,该语言的基本构件如下:

值:它们代表着数字、时间、字符串、文件名和URL等,如123 45.6 10:20:30.456 192.168.1.0 "Hello" 

字:它们可以被用作“变量”(但不是所有的都可以),如print block? string! map-each ?? + =。

块:由值、字和块以任何顺序组合而成,如[1 2 3] [123 "abc" print 10:20]。

这些就是用来表示数据、构建表达式、定义函数、创建对象、以及构造更复杂数据类型的基本构件。符号都是一等(first-class)值,也是一种更自然也更有效的字符串替代品,这对于很多用例都适用,尤其是涉及查找操作时就更能说明问题,因为符号可以以O(1)的效率比较,而字符串则要求O(n)。符号不区分大小写,所以print、Print和PRINT是等同的,人类语言不也是这样吗?

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

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