1 个稳定版本
新 1.0.0 | 2024 年 8 月 25 日 |
---|
#73 在 编程语言
88 每月下载量
2MB
38K SLoC
Ad Astra
Ad Astra 是一个可配置的脚本语言平台,旨在嵌入到 Rust 应用程序中。
与 Rust 或 C++ 等系统编程语言不同,脚本语言的主要优势是它们的快速编辑-编译-运行循环,允许用户快速重新运行脚本并几乎立即看到结果,而无需停止和重新构建整个宿主应用程序。此外,脚本语言(包括 Ad Astra)具有轻量级且易于学习的语法。
这些功能对于实时编码至关重要,因此它们是作为最终用户应用程序中动态插件系统基础的最佳选择。例如,它们可以用作视频游戏引擎或任何需要动态重新配置功能的其它应用程序的脚本系统。
关键特性
使 Ad Astra 在其他解决方案中脱颖而出的特点有
-
高级内置语言服务器
有了内置的 LSP 服务器,您可以为用户提供代码编辑器语言扩展,帮助他们实时探索导出的 API 并在脚本代码中导航。
-
Rust 集成
使用 Export 宏,您可以将 Rust 库 API 导入到一个完全动态的脚本环境中,只需进行最小的更改。
-
可配置的语言语义
大多数语言结构,包括运算符和类型,都是可配置和可定制的。您可以为您的应用程序领域的特定需求定义自己的领域特定语言语义。
语言服务器
您可以在互动的 沙箱 中亲身体验 Ad Astra 语言服务器的功能。
此演示编辑器在您的网络浏览器中本地运行,无需远程网络服务器。客户端使用定制的 Monaco 编辑器,而服务器端由为 WebAssembly 目标构建并运行在浏览器 Web Worker 中的 Ad Astra LSP 服务器提供支持。
可以使用支持LSP协议的任何IDE设置相同的编辑器基础设施,例如VS Code。示例设置可在示例目录中找到。
支持的LSP功能
- 源代码的实时语法和语义诊断。
- 代码完成建议。
- 跳转到标识符的定义和声明。
- 变量类型和函数参数的内联提示。
- 变量、函数和其他标识符的工具提示。
- 突出显示语义相关的标识符。
- 函数签名提示。
- 标识符重命名。
- 内置代码格式化工具。
- 问题快速修复建议。
- 脚本运行器。
导出Rust API
#[export]
宏从crate中内省Rust模块项并将它们导出到脚本引擎。
脚本用户可以随后在完全动态的脚本环境中利用导出的Rust API。
// Exports the `deg` function to the script environment.
#[export]
pub fn deg(degrees: f64) -> f64 {
PI * degrees / 180.0
}
// Exports the Rust struct `Vector` with public fields.
#[export]
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Vector {
pub x: f64,
pub y: f64,
}
// Defines the `vector_1 + vector_2` operator in the script.
#[export]
impl Add for Vector {
type Output = Self;
fn add(mut self, rhs: Self) -> Self::Output {
self.x += rhs.x;
self.y += rhs.y;
self
}
}
// Exports type methods to the script.
#[export]
impl Vector {
pub fn radius(&self) -> f64 {
(self.x * self.x + self.y * self.y).sqrt()
}
}
Ad Astra语言
Ad Astra语言是一种动态类型、解释型脚本语言,结合了函数式、面向对象和连加等范式元素。
该语言的语义受到JavaScript、Lua和Python的启发,而语法设计旨在视觉上与Rust相似。
对于大多数程序员来说,这种语言易于学习,并且不需要高级编程概念即可开始。
// Imports the Rust API from the exported crate "my_crate".
use my_crate;
// Variable declaration.
let foo = 10;
// The language supports for-loops and unbounded loops.
for i in 0..50 {
// Prints formatted strings: "Step 0", "Step 1", etc.
dbg(["Step ", i]);
}
// Function declaration.
let func = fn(a) {
// Utilizes the closure "foo".
return foo + a;
};
func(20) == 30;
// A struct is a key-value data type similar to a JavaScript object
// or Lua table. With the "struct" type, users can emulate objects
// with fields and methods.
let my_object = struct {
field: 123,
method: fn(a) {
self.field += a;
},
};
my_object.method(5);
my_object.field == 128;
基本语言故意具有最小化语法和内置API,允许您通过Rust导出满足您特定领域需求的语言环境。
快速链接
版权
这是一款专有软件,源代码可公开。
要复制、使用、分发或为此工作做出贡献,您必须同意通用许可协议的条款和条件。
有关许可条款的解释,请参阅常见问题解答。
版权(c)2024 Ilya Lakhin(伊利亚·亚历山大罗维奇·拉欣)。保留所有权利。
依赖关系
~4-5.5MB
~94K SLoC