3 个版本
使用旧的 Rust 2015
0.1.2 | 2019 年 6 月 6 日 |
---|---|
0.1.1 | 2019 年 6 月 3 日 |
0.1.0 | 2017 年 12 月 9 日 |
在 编程语言 中排名 #372
140KB
3K SLoC
PIKE
PIKE 是一种针对生成艺术设计的特定领域编程语言。PIKE 的主要目标是提供简洁、易于理解的语法和语义,以促进广泛算法图像的生成。
目前,功能有限,仅针对非常具体的用例。PIKE 可以生成每种像素值由相应二维平面上值的某些计算决定的图像。具体来说,这包括许多类型的分形图像的生成。
示例
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");
功能
PIKE 包含的一些功能包括
- 典型的编程语言结构(循环、if/else、函数定义和调用)
- 简化的 Rust 类似语法
- if-then 构造和循环构造被视为表达式(即它们有返回值)
- 标准函数用于操作图像尺寸、图像数据和从像素空间到场景空间的投影
- 数学符号,如区间表示法(例如 [0, 10) 表示从 0(包含)到 10(不包含)的范围)和复数(例如 1 + 2i 解释为实部为 1.0、虚部为 2.0 的复数)
- 静态类型,具有类型推断
- 既可以解释也可以转换为 Rust
用法
PIKE 可以以交互式方式、作为解释器或转换为 Rust 的转换器使用。
交互式 Shell
$ piske
>> let a = 5;
5
>> a
5
>> a + 3
8
>> a = if a + 3 > 6 { 10 } else { 0 }
10
>> a
10
解释器
解释 PIKE 文件很简单。例如,给定一个名为 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
第一步是将 PIKE 代码文件转换为指定目录中的 Rust 项目。然后,通过使用 Rust 的 cargo
命令构建和运行转换后的代码来执行代码。
PIKE 的当前状态和未来状态
如前所述,PIKE 的功能目前有限。许多功能打算在未来版本中实现,但尚未实现。
当前Piske处于ALPHA状态;它具有基本功能,但存在错误、未经过测试,且可能会发生变化。
计划中的未来功能包括
- 结构体和结构体成员访问,这应该可以提高语言的简洁性(例如,有一个具有中心点和大小的
camera
结构体,而不是将它们视为两个单独的复杂数字) - 特殊的迭代语法,例如,迭代目标图像中的每个像素
- 替代的图像生成方法(例如,分布采样,路径跟随)
- 对图像像素值如何从图像数据数组生成的额外控制(目前
write
函数做了一些假设,你可能想要一个看起来像分形的东西) - 与矩阵库的集成,以允许对图像数据进行基于矩阵的操纵
- 隐式并发(在可能的情况下)
- 颜色(图像生成目前仅为灰度)
- 解释器性能改进
- 易于使用的转译器,其中
piskec foo.psk
将简单地生成一个可执行文件 - 大量的测试和错误修复!
依赖项
~17MB
~168K SLoC