Yorick 编程语言

作者:Cary O'Brien

Linux 利用了大量的学术软件,这些软件要么是现有 UNIX 软件包的简单移植,要么是近年来日益增多的、可以在 Linux 下运行的软件。Yorick 就是一个例子,本文试图简要概述该系统的性质和功能。

Yorick 不仅仅是另一个计算器。可读的语法、数组表示法以及强大的 I/O 和图形功能使 Yorick 成为科学数值分析的首选工具。使用标准 NetCDF 文件格式的独立于机器的 I/O 简化了应用程序在硬件架构之间的迁移。Yorick 是一种由 David H. Munro 在利弗莫尔实验室开发的解释型语言。它用 C 语言实现,并在宽松的版权下免费分发。Yorick 可以在各种各样的机器上运行,从 486SX Linux 笔记本电脑(在我的例子中)到 Cray YMP 超级计算机。

谁在使用 Yorick?大多数用户是物理学家,其中许多人可以访问世界上最强大的计算机。具体应用包括天体物理学、天文学、神经科学、医学图像处理和聚变研究。

在本文中,我将讨论运行 Yorick 的基础知识,描述关键的数组操作,并简要讨论数组操作、编程和图形。我希望这次快速浏览足以让更多对数学感兴趣的读者尝试一下 Yorick。

基本操作

当不带参数调用时,Yorick 会呈现一个典型的命令行界面。表达式会立即求值,结果会显示出来。原始类型包括整数、浮点值和字符串。所有您期望存在的内置函数和常量都存在。变量名是未修饰的,没有前导 $ 字符,也不需要预先声明。支持 C 风格的注释。

人们可能不期望解释型语言适合数值分析,事实上,如果数组没有内置到语言中,情况确实如此。数组是第一类对象,可以使用单个操作对其进行操作。由于虚拟机理解数组,它可以将优化的编译子程序应用于数组操作,从而消除了解释器的速度损失。

数组可以显式创建

> a1 = [1.1, 1.2, 1.3, 1.4, 1.5]

元素可以单独或作为子集访问,1 为原点。圆括号表示索引操作,可以指定单个索引或索引范围。

> a1
[1.1,1.2,1.3,1.4,1.5]
> a1(2)
1.2
> a1(1:3)
[1.1,1.2,1.3]
由于数组操作内置于语言中,因此应用于数组的函数会自动应用于所有元素。
> sqrt(a1)
[1.04881,1.09545,1.14018,1.18322,1,2.23607]
数组的维度没有限制。数组的秩(索引数)不限于一维(向量)或二维(矩阵),但可以根据需要任意大。秩为 3 的数组可以用来表示参数在体积上的分布,而秩为 4 的数组可以模拟参数随时间的变化。

Yorick 还提供了一个简单但有效的帮助系统。执行 help 命令会描述帮助系统。使用命令名称作为参数执行它会提供有关该命令的信息。

Yorick 提供了一种完整的编程语言,它在控制流、表达式和变量用法方面与 C 语言非常相似。例如,语句

> for(i=1; i<10; i++) { print,1<<i; }

将打印 2 的幂,正如您所期望的那样。函数声明,以 func 引入,也按预期工作

> func csc(x) {
> return 1/sin(x);
> }
存在一些差异——变量不需要声明,并且数组比 C 语言中强大得多。主要的区别在于函数调用。在括号中传递参数会导致对结果进行求值和打印;但是,用逗号分隔传递参数只会执行函数,而不会返回结果。由于在大多数情况下不需要中间结果,因此许多脚本包含 f,x,y 形式的函数调用,而不是更熟悉的 f(x,y)。

拥有与 C 语言接近的编程语言可以轻松地在 Yorick(用于原型设计)和 C 语言(用于最终实现)之间迁移。然而,正如几位 Yorick 用户所指出的那样,迁移到 C 语言通常是不必要的——Yorick 程序被证明足够快,可以以最少的编程工作完成任务。

如果需要 C 扩展,则可以使用一个简单的框架来扩展 Yorick 命令语言,以添加任何必要的新操作。

高级数组操作

Yorick 具有紧凑而复杂的机制来描述数组索引和操作,这些机制用于精确指定要对解释器执行的操作。将操作应用于数组会导致该操作应用于数组的每个元素。例如

> a = [1,2,3,4,5]
> sqrt(a)
[1,1.41421,1.73205,2,2.23607]

那么,两个向量相乘呢?默认情况下执行逐元素乘法。

> b = [2,4,6,8,10]
> a*b
[2,8,18,32,50]
那些记得物理或线性代数的人会回忆起内积和外积。内积定义为成对乘积的总和
> a(+)*b(+)
110
外积从每个可能的乘法中创建一个矩阵
> a(-,)*b(,-)
[[2,4,6,8,10],
 [4,8,12,16,20],
 [6,12,18,24,30],
 [8,16,24,32,40],
 [10,20,30,40,50]]
符号 +- 用在索引的位置,被称为特殊下标,并提供对数组操作执行方式的精确控制。+ 是矩阵乘法伪索引,它向 Yorick 指示应沿哪个维度执行矩阵乘法的加法部分。- 是一个伪索引,它创建一个以前不存在的索引。

秩缩减运算符 summinmaxavg 可以代替索引使用。

> a(max)
5
> b(avg)
6

人们可能会想,当存在等效的函数运算符(即 min()avg())时,为什么这是必要的?原因是对于秩为 2 或更大的矩阵,秩缩减索引运算符允许您精确指定如何执行操作。例如,给定一个 3x3 数组,您是想对行、列还是整个数组求平均值?

> c = [[1,2,3],[4,5,6],[7,8,9]]
> dimsof(c)
[2,3,3]
> avg(c)
5
> c(avg,avg)
5
> c(avg,)
[2,5,8]
> c(,avg)
[4,5,6]
在这里,我们还介绍了 dimsof() 函数运算符,它报告参数的维度。在本例中,结果告诉我们 c 是一个秩为 2 的数组,每个方向上有三个元素。
图形操作

在 Linux 下,Yorick 与 GIST 图形子系统链接,允许立即显示绘图和图表。绘图是交互式的,允许用户使用鼠标放大和缩小、拉伸轴以及裁剪显示。Yorick 能够显示随时间推移的绘图序列,就像电影一样,因此,准备新图像的命令是 fma 或帧前进。

要绘制函数在均匀间隔点的值,我们必须首先创建 x

> x = span(0,10,256)
> dimsof(x)
[1,256]

x 现在是一个 256 元素的数组,其值范围从 0 到 10。

The Yorick Programming Language

图 1. x-y 绘图

给定 xy 值的向量,plg 函数绘制 x-y 图形。

plg, sin(x^2), x

此命令的结果如图 1 所示。请注意,参数按 y,x(而不是 x,y)提供。如果需要,这允许 Yorick 提供默认的 x 向量(范围从 1y 点的数量)。

也支持参数绘图。考虑以下命令,这些命令生成了图 2 中的螺旋线

&GT; window, style="vgbox.gs"
&GT; a = span(0,20,256)
&GT; x = a * sin(a)
&GT; y = a * cos(a)
&GT; plg, y, x
The Yorick Programming Language

图 2. 螺旋线图

表面图也可用,可以是如图 3 所示的线框图

&GT; #include "plwf.i"
> orient3
> x = span(-pi,pi,32)(,-:1:32)
> y = transpose(x)
> fma
> plwf, sin(x)*cos(y)
The Yorick Programming Language

图 3. 线框表面图

也可以是如图 4 所示的阴影表面渲染图

> fma
> plwf, sin(x)*cos(y), shade=1, edges=0
The Yorick Programming Language

图 4. 阴影表面图

Yorick 附带的演示程序中使用了许多高级图形选项,最新版本的文档对图形选项进行了广泛的描述。此外,还提供了读取、写入和显示 PNM 格式图像的库。

结束语

Yorick 是一个非常丰富的数值分析环境。本文未探讨其许多功能,例如文件 I/O、调试、动画和使用 MPY 的分布式操作。请花时间阅读文档和示例程序。您不会失望的。

资源

本文最初发表在 LinuxGazette.com 第 26 期,这是一个以前由 Linux Journal 出版的在线电子杂志。

Cary O'Brien (cobrien@access.digex.net) 居住在华盛顿特区,如果被问及,他称自己为“系统工程师”。他目前是 Optim Systems, Inc. 的副总裁,该公司为电信行业提供产品和服务。他从高中开始就一直在摆弄计算机硬件和软件。他已婚,有两个孩子,分别是 4 岁和 7 岁,他们甚至更早开始接触计算机。

加载 Disqus 评论