0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Piccolo-用纯Rust实现的无栈Lua虚拟机

jf_wN0SrCdH 来源:Rust语言中文社区 2024-01-05 09:44 次阅读

Piccolo - 用纯Rust实现的无栈Lua虚拟机

Piccolo,原名luster,在经过数年的中断后,于2023年4月悄然恢复了开发。曾经开发过 rlua 的 kyren,在底层gc-arenacrate 取得突破后,回到了piccolo项目。这两个项目现在已经(小心地)在生产中使用,比如 Fish Folk 用在了游戏脚本中,Ruffle 用于其 ActionScript 虚拟机。 如今两个重要版本的发布了:piccolo v0.3.0 和 gc-arena v0.5。 Piccolo项目的目标,按大致优先级降序排列:

成为一个可以工作、有用的 Lua 解释器。

成为一种简单而可靠的方式,用于安全地隔离不受信任的Lua脚本。

抵御来自不受信任脚本的 DoS 攻击(脚本不能够导致解释器崩溃或使用无限量的内存,并应保证在有限时间内返回控制权给调用者)。

提供一种安全地将 Rust API 绑定到 Lua 的简便方法,具有对异常情况和边缘情况具有处理的绑定系统,并且用户类型可以安全地参与运行时垃圾回收。

与某些版本的 PUC-Rio Lua 兼容。

不要过于缓慢(例如,避免不必要的抽象化)。

使用 Rust 生成 IP 地址的 PNG 图片

看起来像是这样:

c5f4c42c-ab0e-11ee-8b88-92fbcf53809c.png

原文是一个详尽的教程,告诉读者如何一步一步的实现这个例子,感兴趣的可以查看原文。最终实现其实代码很简洁:

use std::{io::Cursor, net::SocketAddr, sync::OnceLock};

use axum::{
extract::ConnectInfo,
http::{header, StatusCode},
response::IntoResponse,
routing::get,
Router,
};
use image::{ImageBuffer, ImageOutputFormat, Rgb};
use imageproc::drawing::draw_text_mut;
use rusttype::{Font, Scale};

const X: i32 = 8;
const Y: i32 = 96;
const WIDTH: u32 = 256;
const HEIGHT: u32 = WIDTH;
const TEXT_COLOR: Rgb= Rgb([235, 219, 178]);
const BACKGROUND_COLOR: Rgb= Rgb([177, 98, 134]);
const SCALE: Scale = Scale { x: 32.0, y: 32.0 };
const FONT_DATA: &[u8] = include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/fonts/UbuntuMono-R.ttf"
));

#[derive(Debug, thiserror::Error)]
#[error("Failed to generate image: {0}")]
struct AvatarError(#[from] image::ImageError);

impl IntoResponse for AvatarError {
fn into_response(self) -> axum::response::Response {
(StatusCode::INTERNAL_SERVER_ERROR, self.to_string()).into_response()
}
}

fn font() -> &'static Font<'static> {
static FONT: OnceLock= OnceLock::new();
FONT.get_or_init(|| Font::try_from_bytes(FONT_DATA).expect("Built-in font data was invalid"))
}

async fn avatar(
ConnectInfo(addr): ConnectInfo,
) -> Result {
// Wow, IPv6 causes a lot of headache.
let ip = addr.ip().to_canonical();
letmut img = ImageBuffer::from_pixel(WIDTH, HEIGHT, BACKGROUND_COLOR);

draw_text_mut(&mut img, TEXT_COLOR, X, Y, SCALE, font(), "Hello,");
let y = Y + SCALE.y asi32;
draw_text_mut(&mut img, TEXT_COLOR, X, y, SCALE, font(), &format!("{ip}!"));

letmut cursor = Cursor::new(vec![]);
img.write_to(&mut cursor, ImageOutputFormat::Png)?;

Ok(([(header::CONTENT_TYPE, "image/png")], cursor.into_inner()))
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
let app = Router::new().route("/avatar.png", get(avatar));

let listener = tokio::net::TcpListener::bind("[::]:3000").await?;
let make_service = app.into_make_service_with_connect_info::();
axum::serve(listener, make_service).await?;
Ok(())
}







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 虚拟机
    +关注

    关注

    1

    文章

    908

    浏览量

    28078
  • Lua
    Lua
    +关注

    关注

    0

    文章

    80

    浏览量

    10543
  • 解释器
    +关注

    关注

    0

    文章

    103

    浏览量

    6494
  • Rust
    +关注

    关注

    1

    文章

    228

    浏览量

    6570

原文标题:【Rust日报】Piccolo - 用纯Rust实现的无栈Lua虚拟机

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    虚拟化数据恢复—XenServer虚拟机数据恢复案例

    Server操作系统虚拟机,该虚拟机有2块虚拟磁盘(系统盘+数据盘),当作网站服务器使用。 服务器虚拟化故障: XenServer虚拟机
    的头像 发表于 11-08 10:32 104次阅读
    <b class='flag-5'>虚拟</b>化数据恢复—XenServer<b class='flag-5'>虚拟机</b>数据恢复案例

    虚拟机数据恢复—异常断电导致XenServer虚拟机不可用的数据恢复案例

    虚拟机数据恢复环境: 某品牌服务器通过同品牌某型号的RAID卡,将4块STAT硬盘为一组RAID10阵列。上层部署XenServer虚拟化平台,虚拟机安装Windows Server系统,每台
    的头像 发表于 10-21 14:17 148次阅读
    <b class='flag-5'>虚拟机</b>数据恢复—异常断电导致XenServer<b class='flag-5'>虚拟机</b>不可用的数据恢复案例

    鸿蒙跨端实践-JS虚拟机架构实现

    在Roma跨端方案中,JS虚拟机是框架的核心,负责执行动态化的JS代码。在Android平台采用了基于V8的J2V8,iOS平台则使用了系统自带的JSCore,而在HarmonyOS中,由于业界
    的头像 发表于 09-30 14:42 2325次阅读
    鸿蒙跨端实践-JS<b class='flag-5'>虚拟机</b>架构<b class='flag-5'>实现</b>

    虚拟化数据恢复—异常断电导致VMware虚拟机文件丢失的数据恢复案例

    某品牌服务器(部署VMware EXSI虚拟机)+同品牌存储(存放虚拟机文件)。
    的头像 发表于 09-14 17:35 335次阅读
    <b class='flag-5'>虚拟</b>化数据恢复—异常断电导致VMware<b class='flag-5'>虚拟机</b>文件丢失的数据恢复案例

    虚拟化数据恢复—EXSI虚拟机误还原快照如何恢复数据?

    虚拟化技术原理是将硬件虚拟化供不同的虚拟机使用,一台物理机上可以有多台虚拟机。人为误操作或者物理故障会导致上层
    的头像 发表于 09-09 11:56 309次阅读
    <b class='flag-5'>虚拟</b>化数据恢复—EXSI<b class='flag-5'>虚拟机</b>误还原快照如何恢复数据?

    什么是虚拟机?什么是虚拟化?

    在日新月异的科技世界中,虚拟化技术如同一座桥梁,连接着现实与数字的鸿沟,为我们打开了全新的计算维度。虚拟机,这一概念,自其诞生以来,就以其独特的魅力和强大的功能,深深地影响了软件开发、系统测试和云计算等多个领域。即使目前你还不了解它的应用,你应该也听过
    的头像 发表于 09-04 14:55 692次阅读

    创建ubuntu虚拟机

    英文的习惯。创建ubuntu虚拟机打开VMware软件,点击创建新的虚拟机。进入以下界面:选择自定义,点击“下一步”。选择对应VMware版本的兼容性,版本可在帮助->关于VMware
    发表于 08-10 14:15

    虚拟机数据恢复—KVM虚拟机被误删除的数据恢复案例

    虚拟机数据恢复环境: Linux操作系统服务器,EXT4文件系统。服务器中有数台KVM虚拟机虚拟机1:主数据库服务器 虚拟磁盘:系统盘(qcow2)+数据盘(raw)
    的头像 发表于 08-07 13:33 369次阅读
    <b class='flag-5'>虚拟机</b>数据恢复—KVM<b class='flag-5'>虚拟机</b>被误删除的数据恢复案例

    什么是虚拟机虚拟机真的那么好用吗?

    在日新月异的科技世界中,虚拟化技术如同一座桥梁,连接着现实与数字的鸿沟,为我们打开了全新的计算维度。虚拟机,这一概念,自其诞生以来,就以其独特的魅力和强大的功能,深深地影响了软件开发、系统测试和云
    的头像 发表于 07-06 08:05 463次阅读
    什么是<b class='flag-5'>虚拟机</b>?<b class='flag-5'>虚拟机</b>真的那么好用吗?

    虚拟化数据恢复—虚拟机误还原快照的数据恢复案例

    有一台虚拟机是由物理迁移到ESXI上面的,迁移完成后为该虚拟机做了一个快照。虚拟机上运行了一个SQL Server数据库,记录了5年左右的数据。 该ESXI上共有二十几台
    的头像 发表于 05-11 11:07 498次阅读

    VMware虚拟机慢,卡顿,远程桌面的方法变顺畅

          如题,VMware虚拟机慢,可以安装VMware tools,但如果由于某些原因,比如说某些旧版本的VMware会出现安装不了VMware tools,我们就可以远程桌面的方法,流畅
    的头像 发表于 05-09 10:06 4715次阅读
    VMware<b class='flag-5'>虚拟机</b>慢,卡顿,<b class='flag-5'>用</b>远程桌面的方法变顺畅

    虚拟机的ip地址和主机一样吗

    地址,用于与其他设备进行通信。下面将详细介绍虚拟机的IP地址和主机的IP地址之间的区别和联系。 IP地址是用于在网络中唯一标识设备的一串数字。在TCP/IP协议中,IP地址被用于路由数据包,并将数据从源设备传递到目标设备。每个主机(或虚
    的头像 发表于 03-26 15:34 4868次阅读

    VMware虚拟机的三种网络模式

    VMware虚拟机的三种网络模式 VMware是一种广泛使用的虚拟机软件,可以创建和管理多个虚拟机。在使用VMware虚拟机时,网络设置非常重要,因为它决定了
    的头像 发表于 02-04 11:17 1882次阅读

    虚拟机ubuntu怎么联网

    虚拟机ubuntu怎么联网  虚拟机(Virtual Machine)是运行在物理(Host Machine)上的虚拟操作系统环境。在虚拟机
    的头像 发表于 12-27 16:51 941次阅读

    虚拟机和模拟器有哪些异同点和区别

    虚拟机和模拟器有哪些异同点和区别  虚拟机和模拟器是计算机领域中常用的技术,它们可以在一台计算机上同时运行多个操作系统或环境。虚拟机和模拟器虽然功能相似,但是在定义、实现、性能、资源利
    的头像 发表于 12-27 16:26 2644次阅读