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

    文章

    968

    浏览量

    30178
  • Lua
    Lua
    +关注

    关注

    0

    文章

    84

    浏览量

    11339
  • 解释器
    +关注

    关注

    0

    文章

    103

    浏览量

    6935
  • Rust
    +关注

    关注

    1

    文章

    240

    浏览量

    7481

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    搭建自己的ubuntu系统之创建ubuntu虚拟机

    打开VMware软件,点击创建新的虚拟机。进入以下界面:选择自定义,点击“下一步”。选择对应VMware版本的兼容性,版本可在帮助-&gt;关于VMware Workstation中
    发表于 09-25 09:39

    中软国际鸿云虚拟机安装指南

    鸿蒙电脑作为新一代分布式计算平台,凭借其卓越的多端协同能力和智能化特性,为高效办公提供了新选择。针对专业软件兼容性这一核心痛点,中软国际的鸿云虚拟机解决方案提供了务实的技术路径。作为专为鸿蒙生态打造
    的头像 发表于 06-23 16:31 2847次阅读

    TECS OpenStack资源池虚拟机网络二层地址无法互通的问题处理

    某运营商TECS OpenStack使用主机overlay SDN方案组网,运维人员在创建虚拟机测试虚拟机网络状态时发现问题:在其中一台主机上创建两台同网段虚拟机虚拟机之间二层地址无
    的头像 发表于 06-12 09:28 681次阅读
    TECS OpenStack资源池<b class='flag-5'>虚拟机</b>网络二层地址无法互通的问题处理

    hyper 备份,Hyper备份:虚拟机备份与恢复

    的解决方案。今天就为大家介绍Hyper备份:虚拟机备份与恢复。    在虚拟化环境中,备份和恢复虚拟机是确保数据安全和业务连续性的关键操作。Hyper-V提供了多种备份和恢复方法,帮助用户灵活地管理
    的头像 发表于 02-08 09:53 1419次阅读
    hyper 备份,Hyper备份:<b class='flag-5'>虚拟机</b>备份与恢复

    hyper-v虚拟机,为何需要用hyper-v虚拟机

    随着科技的飞速发展,各类任务与数据量急剧攀升,批量管理恰似航行在信息海洋中的坚固灯塔,照亮高效管理的航道。今天小编给大家分享为何需要用hyper-v虚拟机。 使用Hyper-V虚拟机的主要原因包括
    的头像 发表于 02-07 13:37 757次阅读
    hyper-v<b class='flag-5'>虚拟机</b>,为何需要用hyper-v<b class='flag-5'>虚拟机</b>?

    hyper v 上网,Hyper-V上网:虚拟机网络配置

    大家介绍Hyper-V上网:虚拟机网络配置。    在Hyper-V环境中,正确配置虚拟机的网络设置是确保虚拟机能够正常访问外部网络的关键。以下是详细的Hyper-V虚拟机网络配置指南
    的头像 发表于 02-06 10:29 4135次阅读
    hyper v 上网,Hyper-V上网:<b class='flag-5'>虚拟机</b>网络配置

    hyper cpu,Hyper CPU优化:提升虚拟机性能

    :提升虚拟机性能。    在虚拟化环境中,CPU性能优化对于提升虚拟机的整体性能至关重要。Hyper-V提供了多种工具和策略,帮助用户根据虚拟机的工作负载需求合理分配和优化CPU资源。
    的头像 发表于 02-06 10:25 1553次阅读
    hyper cpu,Hyper CPU优化:提升<b class='flag-5'>虚拟机</b>性能

    hyper-v 备份,hyper-v怎样进行虚拟机的创建

    虚拟机技术打破了传统计算机的限制,为我们带来了全新的计算机模式。今天给大家介绍hyper-v怎样进行虚拟机的创建?    hyper-v怎样进行虚拟机的创建?    使用PowerShell启用,以
    的头像 发表于 02-05 14:54 805次阅读
    hyper-v 备份,hyper-v怎样进行<b class='flag-5'>虚拟机</b>的创建

    hyper v 删除,怎么样删除hyper-v中的虚拟机

    对于任何追求卓越运营的企业而言,批量管理如同精密时钟的核心齿轮,精准地调控着各项业务的有序运转。今天小编要带来怎么样删除hyper-v中的虚拟机。    要删除Hyper-V中的虚拟机,可以按照以下
    的头像 发表于 02-05 13:39 1516次阅读
    hyper v 删除,怎么样删除hyper-v中的<b class='flag-5'>虚拟机</b>?

    hyper-v共享,hyper-v共享:实现主机与虚拟机之间高效文件共享的最佳实践

    实现主机与虚拟机之间高效文件共享的最佳实践。    在企业级虚拟化环境中,实现主机与虚拟机之间的高效文件共享是提升资源利用率和协作效率的关
    的头像 发表于 01-24 14:23 2388次阅读
    hyper-v共享,hyper-v共享:<b class='flag-5'>实现</b>主机与<b class='flag-5'>虚拟机</b>之间高效文件共享的最佳实践

    hyper 内存,Hyper内存:如何监控与优化hyper-v虚拟机的内存使用

    :如何监控与优化hyper-v虚拟机的内存使用。    在虚拟化环境中,合理监控和优化Hyper-V虚拟机的内存使用对于提升性能和资源利用率至关重要。本文将详细介绍如何监控Hyper-V虚拟机
    的头像 发表于 01-24 14:15 1684次阅读
    hyper 内存,Hyper内存:如何监控与优化hyper-v<b class='flag-5'>虚拟机</b>的内存使用

    hyper内存条,hyper-v 添加虚拟机还需要硬盘吗

    在计算机技术的浩瀚星空中,虚拟机犹如一颗璀璨的明星,散发着独特的光芒。今天给大家介绍hyper-v添加虚拟机还需要硬盘吗?    hyper-v添加虚拟机还需要硬盘吗?    Hyper-V是
    的头像 发表于 01-24 14:01 706次阅读
    hyper内存条,hyper-v 添加<b class='flag-5'>虚拟机</b>还需要硬盘吗

    vSAN数据恢复—异常断电导致虚拟机无法启动的vSAN数据恢复案例

    异常断电导致vSAN存储上层虚拟机无法启动。
    的头像 发表于 01-08 13:18 698次阅读
    vSAN数据恢复—异常断电导致<b class='flag-5'>虚拟机</b>无法启动的vSAN数据恢复案例

    Ubuntu系统的虚拟机安装步骤 如何在Ubuntu系统上编译软件

    Ubuntu系统上安装虚拟机的步骤 在Ubuntu系统上安装虚拟机是一个相对简单的过程,通常可以通过安装VirtualBox或KVM等虚拟化软件来实现。以下是使用VirtualBox在
    的头像 发表于 12-12 14:36 1865次阅读

    Hyper-V创建虚拟机配置IP等网络配置原理(Linux、Windows为例)

    大家知道Windows系统里面内置了Hyper-V管理器,用来创建和管理本地虚拟机环境。今天我创建了两台虚拟机,一台是CentOS7.9(Linux),另一台是Windows 11,然后发现
    的头像 发表于 12-09 10:24 5589次阅读
    Hyper-V创建<b class='flag-5'>虚拟机</b>配置IP等网络配置原理(Linux、Windows为例)