1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2017年12月9日 |
---|
#967 在 编程语言 中
在 piske 中使用
14KB
277 行
Piske
Piske是一种为创建生成艺术而设计的领域特定编程语言。Piske的主要目标是提供简洁、易于理解的语法和语义,以方便生成各种算法图像。
目前,功能有限,仅考虑了非常特定的用例。Piske目前可以生成图像,其中每个像素的值由对应二维平面上值的某种计算确定。具体来说,这包括生成许多类型的分形图像。
示例
let height = 1024;
let width = 1024;
set_image_dims(height, width);
let camera_center = -0.5 + 0i;
let camera_size = 3 + 3i;
let threshold = 10;
let num_max_iters = 1000;
iterate row = [0, height) {
iterate col = [0, width) {
let z = 0 + 0i;
let c = project(row, col, camera_center, camera_size);
let value = iterate over [0, num_max_iters) {
z = z * z + c;
let escape_value = re(z * z`);
if escape_value > threshold {
break escape_value;
}
0.0
};
set_pixel_data(row, col, value);
}
}
write("mandelbrot.png");
功能
pske包含的一些功能包括
- 典型的编程语言结构(循环、if/else、函数定义和调用)
- 简化后的类似Rust的语法
- if-then结构和循环结构被视为表达式(即它们有返回值)
- 标准函数用于操作图像尺寸、图像数据和从像素空间到场景空间的投影
- 数学式符号,例如区间表示法(例如,[0, 10) 表示从0(包含)到10(不包含)的范围)和复数(例如,1 + 2i 被解释为实部为1.0,虚部为2.0的复数)
- 静态类型和推断类型
- 既可解释又可转换为Rust
用法
Piske可以交互式使用,作为解释器,或转换为Rust的转译器。
交互式外壳
$ piske
>> let a = 5;
5
>> a
5
>> a + 3
8
>> a = if a + 3 > 6 { 10 } else { 0 }
10
>> a
10
解释器
解释psk文件很简单。例如,给定一个名为test.psk
的文件,其中包含以下内容
let a = 5;
print a + 3;
可以通过执行以下操作来解释此文件
$ piske test.psk
8
转译器
对于大多数应用程序,将代码转换为Rust将是为了性能的最佳选择。这目前是一个两步过程
$ piskec test.psk ./test_proj_dir
$ cd test_proj_dir
$ ls
Cargo.toml src
$ cargo run
Updating registry `https://github.com/rust-lang/crates.io-index`
...
Compiling a bunch libraries
...
Compiling psk_std v0.1.0
Compiling test_proj_dir v0.1.0 (file:///home/jamie/devel/piske_examples/test_proj_dir)
Finished dev [unoptimized + debuginfo] target(s) in 14.78 secs
Running `target/debug/test_proj_dir`
8
第一步将psk代码文件转换为指定目录中的Rust项目。然后,使用Rust cargo
命令构建和运行转换后的代码来执行代码。
当前和未来的 piske 状态
如前所述,piske 的功能目前有限。许多特性计划在未来的版本中实现,但尚未实现。
piske 目前处于 ALPHA 状态;它具有基本功能,但存在错误、未经测试且可能发生变化。
计划未来的功能包括
- 结构体和结构体成员访问,这应该可以提高语言的简洁性(例如,拥有一个具有中心和尺寸的
camera
结构体,而不是将它们视为两个单独的复杂数字) - 特殊的迭代语法,例如,遍历目标图像中的每个像素
- 替代的图像生成方法(例如,分布采样、路径追踪)
- 对如何从图像数据数组生成图像像素值的更多控制(目前
write
函数做出了一些假设,您希望得到类似分形的外观) - 与 matrix 库的集成,允许进行基于矩阵的图像数据处理
- 可能的隐式并发
- 颜色(图像生成目前仅为灰度)
- 解释器性能改进
- 更易于使用的转译器,其中
piskec foo.psk
将简单地生成一个可执行文件 - 大量的测试和错误修复!
lib.rs
:
piske 的标准库。
依赖项
~1.5MB
~30K SLoC