#编程语言 #seraphine #cli #算术运算 #对象 #数字 #

app seraphine-cli

Seraphine编程语言的CLI

2个版本

0.1.1 2023年9月20日
0.1.0 2023年9月20日

#628编程语言

MIT 许可证

185KB
5K SLoC

Seraphine

Seraphine是一种动态、强类型和解释型编程语言。

目前Seraphine是我探索将人类可读源代码转换为可执行代码过程的一个学习和实验项目。这就是为什么其语言核心是独立于外部依赖而实现的。由于解释器的非常原始,Seraphine目前非常慢。在我的机器上,与等效的Python实现相比,sudoku示例大约慢2.5倍,与等效的Rust实现相比慢200倍。

了解语言的最佳方式是看看示例

// This function returns a new counter object. Since the last expression is
// returned automatically, we can simply use double curly braces.
fn new_counter(initial_count) {{
    count: initial_count,
    previous_counts: [],
    increment() {
        // `this` receiver to access object
        this.previous_counts.push(this.count)
        this.count = this.count + 1
    },
    for_each_count(func) {
        // Boolean coercion
        if (func) {
            // For loops to iterate over lists
            for (c in this.previous_counts) {
                func(c)
            }
        }
    },
    get_initial_count() {
        if (this.previous_counts.length == 0) {
            return this.count
        } else {
            return this.previous_counts[0]
        }
    },
}}

counter = new_counter(42)
println("Counter at", counter.count)
while (counter.count < 45) {
    counter.increment()
}
println("Counter at", counter.count)

// Anonymous functions (closures are possible)
counter.for_each_count(fn (count) {
    println("Counter was", count)
})

println("Initial count was", counter.get_initial_count())

更多示例可以在示例目录中找到。

功能

  • 算术和逻辑运算
  • 带有 else ifelse 的if语句
  • while和for循环
    • breakcontinue
  • 内置和用户定义的函数
    • 从函数中自动返回最后一个表达式
  • 类型
    • null
    • 数字
    • 布尔
    • 字符串
    • 函数
    • 列表
    • 对象
    • 迭代器
  • 值的索引和成员访问
  • this 对象方法接收者
  • 从stdin读取和写入stdout和stderr
  • 使用 // 的注释
  • 对换行符的宽松解析,允许将代码拆分为多行
  • 用户友好的错误消息,包括堆栈跟踪
    • 注意:当前REPL中不可用堆栈跟踪
  • REPL(读取-评估-打印循环)

执行模型

有两种可能的执行Seraphine代码的方式。这实际上没有实际用途。这只是语言发展的方式——由于这是一个学习项目,我想保留这两种方法。

第一种方法是较老的方法:评估器直接评估AST。

第二种方法使用抽象语法树(AST)生成简单的指令形式的字节码。然后,虚拟机(VM)执行这些指令。字节码也可以进行序列化。

目前,序列化的字节码还包含编译时的代码。当运行时出现错误时,此代码仅用于生成用户友好的错误消息。

REPL

可以使用REPL交互式探索语言并评估代码。要启动REPL,将repl作为CLI的第一个参数传递(例如:seraphine repl)。REPL当前使用评估器来执行代码。

REPL使用原始终端并提供以下功能:

  • 在当前行移动光标
  • 历史记录
  • 清屏
  • 评估不适合一行代码的代码(例如,具有非平凡体的if语句)

构建和运行

由于Seraphine是用Rust实现的,因此您首先需要安装Rust工具链

要在调试模式下运行REPL,可以使用cargo run -- repl。您还可以选择评估文件,使用cargo run -- eval my_file.sr。为了获得更好的性能,您应该在cargo run后放置--release标志。要仅构建可执行文件,请使用cargo build --release。可执行文件将放在target/release目录中。

测试

所有Seraphine功能都由测试覆盖。使用cargo test --workspace运行测试套件。

工作区结构

  • seraphine-core包含核心功能(标记化器、解析器、评估器、字节码生成和序列化、虚拟机)
  • seraphine-cli包含CLI和REPL功能的可执行文件

依赖关系

~175KB