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

    文章

    855

    浏览量

    27381
  • Lua
    Lua
    +关注

    关注

    0

    文章

    75

    浏览量

    10445
  • 解释器
    +关注

    关注

    0

    文章

    98

    浏览量

    6423
  • Rust
    +关注

    关注

    1

    文章

    223

    浏览量

    6387

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

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

收藏 人收藏

    评论

    相关推荐

    在ubuntu16.04虚拟机测试uvc camera以及usb hid数据,虚拟机后不识别,没有反应是怎么回事?

    你好,我想在ubuntu16.04虚拟机测试uvc camera以及usb hid数据,但是虚拟机后不识别,没有反应。我其他的u盘或其他的uvc camera验证却可以识别。请问你们的uvc这块是否有专门的ubuntu驱动安装
    发表于 02-28 06:06

    VMware虚拟机的三种网络模式

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

    虚拟机ubuntu怎么联网

    虚拟机ubuntu怎么联网  虚拟机(Virtual Machine)是运行在物理机(Host Machine)上的虚拟操作系统环境。在虚拟机中安装Ubuntu操作系统后,需要进行网络
    的头像 发表于 12-27 16:51 550次阅读

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

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

    虚拟机怎么进入root用户

    进入虚拟机的root用户,需要通过以下步骤完成。首先,我们需要明确一点,root用户是Linux系统下的超级管理员,具有最高权限。 第一步:打开虚拟机 首先,要确保已经安装了虚拟机软件,并启动
    的头像 发表于 11-23 10:51 6903次阅读

    怎么安装linux虚拟机

    在计算机领域,虚拟机是一种软件程序,它允许在主操作系统上运行多个虚拟操作系统。Linux虚拟机在开发、测试和学习等环境中得到广泛应用。本文将详细介绍如何安装Linux虚拟机,并提供一个
    的头像 发表于 11-23 10:50 624次阅读

    Docker与虚拟机的区别

    Docker和虚拟机是两种不同的虚拟化技术,它们在实现方式、资源消耗、运行性能等方面存在许多差异。本文将会详细介绍它们的区别。 一、实现方式 1.1
    的头像 发表于 11-23 09:37 2450次阅读

    虚拟机如何运行c程序

    虚拟机(Virtual Machine,VM)是一种模拟了物理计算机的软件,可以在计算机上创建虚拟的硬件平台,使得用户可以在其中运行操作系统和应用程序。在虚拟机中运行C程序需要进行多个步骤,下面将给
    的头像 发表于 11-17 10:14 2210次阅读

    linux虚拟机系统基本指令

    Linux虚拟机系统是一种通过虚拟化技术在物理服务器上部署多个独立的虚拟机实例的操作系统。它可以帮助用户更有效地利用硬件资源,并方便地部署和管理多个操作系统环境。本文将介绍一些常用的Linux
    的头像 发表于 11-17 10:04 639次阅读

    什么是虚拟机?使用C代码实现一个虚拟机

    本文将教你编写一个自己的虚拟机(VM),这个虚拟机能够运行汇编语言编写的程序, 例如我朋友编写的 2048 或者我自己的 Roguelike。如果你会编程,但希望 更深入地了解计算机的内部原理以及
    的头像 发表于 11-01 10:48 580次阅读
    什么是<b class='flag-5'>虚拟机</b>?使用C代码<b class='flag-5'>实现</b>一个<b class='flag-5'>虚拟机</b>

    虚拟机的Ubuntu系统装了SDK,怎么才能装驱动呢?

    我按厂家技术说的,虚拟机的Ubuntu系统装了SDK。然后怎么才能装驱动呢,就是摄像头驱动+打印机驱动
    发表于 09-12 08:22

    虚拟机下载与安装的步骤有哪些

    本文章会详细介绍虚拟机下载与安装的步骤,有很多读者都会遇到这样的情况,软件装不上,自己的电脑中软件很多,又不想换电脑系统,那么虚拟机可以帮你解决这个烦恼。     0 1 什么是虚拟机虚拟
    的头像 发表于 09-04 10:16 1025次阅读
    <b class='flag-5'>虚拟机</b>下载与安装的步骤有哪些

    如何实现NUC980-IOT开发板与虚拟机的文件共享或者传输?

    本人主机采用的是新唐提供的Ubuntu虚拟机,想实现虚拟机和NUC980-IOT开发板两者之间的文件共享或者传输,不用每次修改程序都要重新烧写一些,谢谢。
    发表于 09-01 07:53

    基于Rust语言的高可靠、开源嵌入式Hypervisor

    Rust-Shyper 是北京航空航天大学计算机学院王雷教授团队设计开发的虚拟机监控器,该系统基于 Rust 语言,实现了一个高可靠、嵌入式 Hypervisor。2023 年 2
    的头像 发表于 05-24 16:31 1033次阅读
    基于<b class='flag-5'>Rust</b>语言的高可靠、开源嵌入式Hypervisor

    中国电信自研 RISC-V 云原生轻量级虚拟机 TeleVM 成功运行,内存开销降低约 90%

    ,“TeleVM 针对传统 QEMU+KVM 虚拟化方案中 QEMU 代码臃肿、资源消耗高、攻击面大的问题, 基于 Rust 安全语言重写了虚拟机并进行 RISC-V 架构适配优化 ,结合 RISC-V
    发表于 05-05 09:46