3 个版本

使用旧的 Rust 2015

0.1.2 2019 年 6 月 6 日
0.1.1 2019 年 6 月 3 日
0.1.0 2017 年 12 月 9 日

编程语言 中排名 #372

MIT 许可证

140KB
3K SLoC

PIKE

Build Status Documentation

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");

mandelbrot fractal

功能

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