AviatorScript轻量级高性能脚本语言

简介: 在 5.0 版本以前,它的名字是叫 Aviator ,定位一直只是一个表达式引擎,不支持 if/else 条件语句(仅有三元运算符支持 ?: ),没有内置的 for/while 循环支持(虽然你可以用 seq 库类似函数式的方式来处理集合),也没有赋值(后来在 4.0 引入),没有作用域的概念(也在 4.0 引入 lambda 函数后部分实现)等等一般语言常见的能力。在 5.0 版本后,它变成了一门脚本语言,叫:AviatorScript 。

网络异常,图片无法展示
|


简介

5.0 版本以前,它的名字是叫 Aviator ,定位一直只是一个表达式引擎,不支持 if/else 条件语句(仅有三元运算符支持 ?: ),没有内置的 for/while 循环支持(虽然你可以用 seq 库类似函数式的方式来处理集合),也没有赋值(后来在 4.0 引入),没有作用域的概念(也在 4.0 引入 lambda 函数后部分实现)等等一般语言常见的能力。在 5.0 版本后,它变成了一门脚本语言,叫:AviatorScript

5.0 ,新加了如下新特性:

  • 大括号 { ... } 括起来的词法作用域。
  • let 语句用于定义局部变量。
  • 条件语句 if/elsif/else
  • 循环语句 forwhile ,以及相应的 breakcontinue 语句支持。
  • return 语句用于从脚本或者函数中返回值。
  • fn hello() { println("hello"); } 新的 fn 语法用于定义命名函数。
  • ## 单行注释 注释支持
  • 模块系统
  • new 语法用于创建对象
  • 异常处理
  • 命令行工具 aviator

使用

AviatorScript 可以单纯的作为脚本语言使用,也可以和 Java 配合使用。

单纯的作为脚本语言使用

作为脚本语言使用时,需要下载一个 aviator,然后用它去执行脚本文件。

下载:

执行下面命令下载,如果你电脑没有安装 wget 工具,你也可以直接打开 raw.githubusercontent.com/killme2008/…**

$ wget https://raw.githubusercontent.com/killme2008/aviator/master/bin/aviator
$ chmod u+x aviator

初始化:

下载完后,需要执行一下命令,它会自动在 ~/.aviatorscrip 下载所需要的依赖。

╰─$ aviator
Downloading AviatorScript now...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   148  100   148    0     0    249      0 --:--:-- --:--:-- --:--:--   248
100   159  100   159    0     0    158      0  0:00:01  0:00:01 --:--:--   158
100  583k  100  583k    0     0  51321      0  0:00:11  0:00:11 --:--:-- 35877
Usage: java com.googlecode.aviator.Main [file] [args]
     : java com.googlecode.aviator.Main -e [script]
     : java com.googlecode.aviator.Main -v

执行脚本文件:

下载好相关的环境后,就可以编写一个脚本文件了,文件名一般以 .av 结尾,这个不是必须的,你想以其他结尾也可以

test.av:

println("Hello World!");

然后执行该脚本文件:

╰─$ aviator test.av
Hello World!
null

界面输出 Hello World!,最后一行的 null 表示是整个表达式的执行结果,就是返回值的意思,比如定义 return 时,这个 null 就会变成 return 的值,我们做如下更改:

test.av:

println("Hello World!");
return "success";

我们添加了一个 return 数据,然后执行这个脚本文件:

╰─$ aviator test.av
Hello World!
success

执行结果就会变成我们定义的 return 数据。

具体的可参考文档 aviator 命令行

配合 Java 使用

配合 Java 使用时,需要导入 Aviator 的依赖,可以在 [search.maven.org](search.maven.org/search?q=g:… AND a:aviator&core=gav) 查看可用的版本。

<dependency>
  <groupId>com.googlecode.aviator</groupId>
  <artifactId>aviator</artifactId>
  <version>{version}</version>
</dependency>

导入依赖后,我们先来演示执行一个 1+1 操作:

int result = (int) AviatorEvaluator.execute("return 1+1;");
System.out.println(result);

上面代码中,我们直接返回 1+1 的结果,然后输出,但是当我们执行的时候,就回报如下错误:

Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
  at top.mjava.demo.AviatorDemo.demo5(AviatorDemo.java:19)
  at top.mjava.demo.AviatorDemo.main(AviatorDemo.java:15)

这是因为在 Aviator 中任何整数都将被转换为 Long 类型,而 Long 类型是不能转换为 Integer 类型的,所以会报上面的错误。所以我们要将 int 改为 long 即可:

long result = (long) AviatorEvaluator.execute("return 1+1;");
System.out.println(result);

输出:

2

挂载 Java 方法

在 Aviator 中,除了可以使用它提供的法来创建函数外,还可以挂载 Java 的自定义方法,然后在 Aviator 脚本中使用。

定义自定义的 Java 方法时,需要继承 AbstractFunction 抽象类,然后重写 callgetName 这两个方法:

  • call : 方法具体逻辑代码
  • getName : 在 Aviator 中使用时的函数名

定义自定义函数:

这边自定义了一个加法运算的方法,传入两个参数然后计算它们的和

class AddFunction extends AbstractFunction{
    @Override
    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2) {
        long p1 = (long) arg1.getValue(env);
        long p2 = (long) arg2.getValue(env);
        long result = p1+p2;
        return AviatorLong.valueOf(result);
    }
    @Override
    public String getName() {
        return "add";
    }
}

使用自定义函数:

如果要在 Aviator 脚本中使用这个自定义的函数时,需要先注册这个 Java 类,然后在 Aviator 脚本中使用 getName() 返回的方法名作为函数名来调用:

// 注册自定义函数
AviatorEvaluator.addFunction(new AddFunction());
// 使用自定义函数
long result = (long) AviatorEvaluator.execute("return add(2,1);");
System.out.println(result);

输出:

3
目录
相关文章
|
4月前
|
负载均衡 Java 中间件
使用Go语言构建高性能Web服务
Go语言作为一种快速、高效的编程语言,其在构建高性能Web服务方面具有独特优势。本文将探讨如何利用Go语言开发和优化Web服务,以实现更高的性能和可伸缩性。
|
22天前
|
安全 前端开发 PHP
PHP与现代Web开发:构建高效和可扩展的应用程序
【8月更文挑战第29天】在这篇文章中,我们将深入探讨PHP如何适应现代Web开发的需求。我们将通过实际案例分析,揭示PHP的核心优势,并展示如何利用这些优势来构建高性能、可扩展的Web应用。文章不仅提供理论知识,还包括具体的代码示例,旨在帮助开发者更好地理解和运用PHP解决实际问题。
|
21天前
|
Rust 安全 Java
Rust语言在Web后端的应用:基于Actix-web构建高性能、安全可靠的服务器实践
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的无限潜力。
47 0
|
30天前
|
缓存 监控 中间件
构建高效的Go语言Web服务器:基于Fiber框架的性能优化实践
在追求极致性能的Web开发领域,Go语言(Golang)凭借其高效的并发处理能力、垃圾回收机制及简洁的语法赢得了广泛的青睐。本文不同于传统的性能优化教程,将深入剖析如何在Go语言环境下,利用Fiber这一高性能Web框架,通过精细化配置、并发策略调整及代码层面的微优化,构建出既快速又稳定的Web服务器。通过实际案例与性能测试数据对比,揭示一系列非直觉但极为有效的优化技巧,助力开发者在快节奏的互联网环境中抢占先机。
|
3月前
|
Rust 前端开发 JavaScript
Tauri框架:使用Rust构建轻量级桌面应用
Tauri是一个用Rust构建的开源框架,用于创建轻量、安全且高效的跨平台桌面应用,结合Rust与Web技术(HTML/CSS/JS)。它遵循最小权限原则,仅在必要时调用OS API。Tauri架构包括Rust后端、Web前端、Tauri API和包装器。通过`cargo tauri init`可创建新项目,Rust后端处理系统交互,前端负责UI,两者通过Tauri API通信。Tauri支持自定义API、集成前端框架、资源管理、自动更新、系统集成和安全配置。此外,Tauri拥有插件系统和丰富的扩展能力,提供调试和测试工具,并有性能优化建议。
229 4
|
4月前
|
缓存 监控 NoSQL
使用Elixir进行可扩展的Web服务开发
【5月更文挑战第30天】本文探讨了使用Elixir进行可扩展Web服务开发,Elixir基于Erlang/OTP,提供并发、分布式处理和容错能力。Phoenix框架助力构建实时Web应用,支持WebSocket。实现可扩展性涉及并发处理、分布式架构、数据库优化、缓存策略及监控告警。实践案例显示,Elixir和Phoenix能有效应对高并发场景,适用于构建高性能Web服务。
|
4月前
|
API 开发工具 C语言
【嵌入式开源库】EasyLogger的使用, 一款轻量级且高性能的日志库
【嵌入式开源库】EasyLogger的使用, 一款轻量级且高性能的日志库
631 0
|
4月前
|
存储 传感器 缓存
轻量级的嵌入式模块化软件架构
轻量级的嵌入式模块化软件架构
99 1
|
4月前
|
存储 缓存 网络协议
Go语言并发编程实战:构建高性能Web服务器
【2月更文挑战第6天】本文将通过构建一个高性能的Web服务器实战案例,深入探讨如何在Go语言中运用并发编程技术。我们将利用goroutine和channel实现高效的请求处理、资源管理和并发控制,以提升Web服务器的性能和稳定性。通过这一实战,你将更好地理解和掌握Go语言在并发编程方面的优势和应用。
|
4月前
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly 的魅力:高效、安全、跨平台(下)
WebAssembly 的魅力:高效、安全、跨平台(下)
WebAssembly 的魅力:高效、安全、跨平台(下)