0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Piccolo-用純Rust實(shí)現(xiàn)的無棧Lua虛擬機(jī)

jf_wN0SrCdH ? 來源:Rust語言中文社區(qū) ? 2024-01-05 09:44 ? 次閱讀

Piccolo - 用純Rust實(shí)現(xiàn)的無棧Lua虛擬機(jī)

Piccolo,原名luster,在經(jīng)過數(shù)年的中斷后,于2023年4月悄然恢復(fù)了開發(fā)。曾經(jīng)開發(fā)過 rlua 的 kyren,在底層gc-arenacrate 取得突破后,回到了piccolo項(xiàng)目。這兩個(gè)項(xiàng)目現(xiàn)在已經(jīng)(小心地)在生產(chǎn)中使用,比如 Fish Folk 用在了游戲腳本中,Ruffle 用于其 ActionScript 虛擬機(jī)。 如今兩個(gè)重要版本的發(fā)布了:piccolo v0.3.0 和 gc-arena v0.5。 Piccolo項(xiàng)目的目標(biāo),按大致優(yōu)先級(jí)降序排列:

成為一個(gè)可以工作、有用的 Lua 解釋器。

成為一種簡(jiǎn)單而可靠的方式,用于安全地隔離不受信任的Lua腳本。

抵御來自不受信任腳本的 DoS 攻擊(腳本不能夠?qū)е陆忉屍鞅罎⒒蚴褂脽o限量的內(nèi)存,并應(yīng)保證在有限時(shí)間內(nèi)返回控制權(quán)給調(diào)用者)。

提供一種安全地將 Rust API 綁定到 Lua 的簡(jiǎn)便方法,具有對(duì)異常情況和邊緣情況具有處理的綁定系統(tǒng),并且用戶類型可以安全地參與運(yùn)行時(shí)垃圾回收。

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

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

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

看起來像是這樣:

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

原文是一個(gè)詳盡的教程,告訴讀者如何一步一步的實(shí)現(xiàn)這個(gè)例子,感興趣的可以查看原文。最終實(shí)現(xiàn)其實(shí)代碼很簡(jiǎn)潔:

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(())
}







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    917

    瀏覽量

    28209
  • Lua
    Lua
    +關(guān)注

    關(guān)注

    0

    文章

    81

    瀏覽量

    10564
  • 解釋器
    +關(guān)注

    關(guān)注

    0

    文章

    103

    瀏覽量

    6513
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    228

    瀏覽量

    6611

原文標(biāo)題:【Rust日?qǐng)?bào)】Piccolo - 用純Rust實(shí)現(xiàn)的無棧Lua虛擬機(jī)

文章出處:【微信號(hào):Rust語言中文社區(qū),微信公眾號(hào):Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    虛擬化數(shù)據(jù)恢復(fù)—XenServer虛擬機(jī)數(shù)據(jù)恢復(fù)案例

    Server操作系統(tǒng)虛擬機(jī),該虛擬機(jī)有2塊虛擬磁盤(系統(tǒng)盤+數(shù)據(jù)盤),當(dāng)作網(wǎng)站服務(wù)器使用。 服務(wù)器虛擬化故障: XenServer虛擬機(jī)
    的頭像 發(fā)表于 11-08 10:32 ?148次閱讀
    <b class='flag-5'>虛擬</b>化數(shù)據(jù)恢復(fù)—XenServer<b class='flag-5'>虛擬機(jī)</b>數(shù)據(jù)恢復(fù)案例

    虛擬化數(shù)據(jù)恢復(fù)——Hyper-V虛擬機(jī)數(shù)據(jù)恢復(fù)案例

    虛擬化數(shù)據(jù)恢復(fù)環(huán)境: Windows Server操作系統(tǒng)服務(wù)器上部署Hyper-V虛擬機(jī)環(huán)境。虛擬機(jī)的硬盤文件和配置文件存放在一臺(tái)存儲(chǔ)中,該存儲(chǔ)上有一組由4塊硬盤組建的raid5陣列,除此之外
    的頭像 發(fā)表于 10-25 09:26 ?201次閱讀
    <b class='flag-5'>虛擬</b>化數(shù)據(jù)恢復(fù)——Hyper-V<b class='flag-5'>虛擬機(jī)</b>數(shù)據(jù)恢復(fù)案例

    Lua語法基礎(chǔ)教程(上篇)

    意味著Lua虛擬機(jī)可以很方便的嵌入別的程序里,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。而整個(gè)Lua虛擬機(jī)編譯后僅僅一百余K,經(jīng)過適當(dāng)?shù)牟眉暨€能做到更小,十分適合嵌入式的開發(fā)。 同時(shí),在
    的頭像 發(fā)表于 10-24 07:17 ?210次閱讀

    虛擬機(jī)數(shù)據(jù)恢復(fù)—異常斷電導(dǎo)致XenServer虛擬機(jī)不可用的數(shù)據(jù)恢復(fù)案例

    虛擬機(jī)數(shù)據(jù)恢復(fù)環(huán)境: 某品牌服務(wù)器通過同品牌某型號(hào)的RAID卡,將4塊STAT硬盤為一組RAID10陣列。上層部署XenServer虛擬化平臺(tái),虛擬機(jī)安裝Windows Server系統(tǒng),每臺(tái)
    的頭像 發(fā)表于 10-21 14:17 ?204次閱讀
    <b class='flag-5'>虛擬機(jī)</b>數(shù)據(jù)恢復(fù)—異常斷電導(dǎo)致XenServer<b class='flag-5'>虛擬機(jī)</b>不可用的數(shù)據(jù)恢復(fù)案例

    鴻蒙跨端實(shí)踐-JS虛擬機(jī)架構(gòu)實(shí)現(xiàn)

    在Roma跨端方案中,JS虛擬機(jī)是框架的核心,負(fù)責(zé)執(zhí)行動(dòng)態(tài)化的JS代碼。在Android平臺(tái)采用了基于V8的J2V8,iOS平臺(tái)則使用了系統(tǒng)自帶的JSCore,而在HarmonyOS中,由于業(yè)界
    的頭像 發(fā)表于 09-30 14:42 ?2419次閱讀
    鴻蒙跨端實(shí)踐-JS<b class='flag-5'>虛擬機(jī)</b>架構(gòu)<b class='flag-5'>實(shí)現(xiàn)</b>

    虛擬化數(shù)據(jù)恢復(fù)—異常斷電導(dǎo)致VMware虛擬機(jī)文件丟失的數(shù)據(jù)恢復(fù)案例

    某品牌服務(wù)器(部署VMware EXSI虛擬機(jī))+同品牌存儲(chǔ)(存放虛擬機(jī)文件)。
    的頭像 發(fā)表于 09-14 17:35 ?487次閱讀
    <b class='flag-5'>虛擬</b>化數(shù)據(jù)恢復(fù)—異常斷電導(dǎo)致VMware<b class='flag-5'>虛擬機(jī)</b>文件丟失的數(shù)據(jù)恢復(fù)案例

    虛擬化數(shù)據(jù)恢復(fù)—EXSI虛擬機(jī)誤還原快照如何恢復(fù)數(shù)據(jù)?

    虛擬化技術(shù)原理是將硬件虛擬化供不同的虛擬機(jī)使用,一臺(tái)物理機(jī)上可以有多臺(tái)虛擬機(jī)。人為誤操作或者物理機(jī)故障會(huì)導(dǎo)致上層
    的頭像 發(fā)表于 09-09 11:56 ?378次閱讀
    <b class='flag-5'>虛擬</b>化數(shù)據(jù)恢復(fù)—EXSI<b class='flag-5'>虛擬機(jī)</b>誤還原快照如何恢復(fù)數(shù)據(jù)?

    什么是虛擬機(jī)?什么是虛擬化?

    在日新月異的科技世界中,虛擬化技術(shù)如同一座橋梁,連接著現(xiàn)實(shí)與數(shù)字的鴻溝,為我們打開了全新的計(jì)算維度。虛擬機(jī),這一概念,自其誕生以來,就以其獨(dú)特的魅力和強(qiáng)大的功能,深深地影響了軟件開發(fā)、系統(tǒng)測(cè)試和云計(jì)算等多個(gè)領(lǐng)域。即使目前你還不了解它的應(yīng)用,你應(yīng)該也聽過
    的頭像 發(fā)表于 09-04 14:55 ?958次閱讀

    創(chuàng)建ubuntu虛擬機(jī)

    英文的習(xí)慣。創(chuàng)建ubuntu虛擬機(jī)打開VMware軟件,點(diǎn)擊創(chuàng)建新的虛擬機(jī)。進(jìn)入以下界面:選擇自定義,點(diǎn)擊“下一步”。選擇對(duì)應(yīng)VMware版本的兼容性,版本可在幫助->關(guān)于VMware
    發(fā)表于 08-10 14:15

    虛擬機(jī)數(shù)據(jù)恢復(fù)—KVM虛擬機(jī)被誤刪除的數(shù)據(jù)恢復(fù)案例

    虛擬機(jī)數(shù)據(jù)恢復(fù)環(huán)境: Linux操作系統(tǒng)服務(wù)器,EXT4文件系統(tǒng)。服務(wù)器中有數(shù)臺(tái)KVM虛擬機(jī)虛擬機(jī)1:主數(shù)據(jù)庫服務(wù)器 虛擬磁盤:系統(tǒng)盤(qcow2)+數(shù)據(jù)盤(raw)
    的頭像 發(fā)表于 08-07 13:33 ?462次閱讀
    <b class='flag-5'>虛擬機(jī)</b>數(shù)據(jù)恢復(fù)—KVM<b class='flag-5'>虛擬機(jī)</b>被誤刪除的數(shù)據(jù)恢復(fù)案例

    什么是虛擬機(jī)?虛擬機(jī)真的那么好用嗎?

    在日新月異的科技世界中,虛擬化技術(shù)如同一座橋梁,連接著現(xiàn)實(shí)與數(shù)字的鴻溝,為我們打開了全新的計(jì)算維度。虛擬機(jī),這一概念,自其誕生以來,就以其獨(dú)特的魅力和強(qiáng)大的功能,深深地影響了軟件開發(fā)、系統(tǒng)測(cè)試和云
    的頭像 發(fā)表于 07-06 08:05 ?463次閱讀
    什么是<b class='flag-5'>虛擬機(jī)</b>?<b class='flag-5'>虛擬機(jī)</b>真的那么好用嗎?

    虛擬化數(shù)據(jù)恢復(fù)—虛擬機(jī)誤還原快照的數(shù)據(jù)恢復(fù)案例

    有一臺(tái)虛擬機(jī)是由物理機(jī)遷移到ESXI上面的,遷移完成后為該虛擬機(jī)做了一個(gè)快照。虛擬機(jī)上運(yùn)行了一個(gè)SQL Server數(shù)據(jù)庫,記錄了5年左右的數(shù)據(jù)。 該ESXI上共有二十幾臺(tái)
    的頭像 發(fā)表于 05-11 11:07 ?561次閱讀

    VMware虛擬機(jī)慢,卡頓,遠(yuǎn)程桌面的方法變順暢

    ? ? ? 如題,VMware虛擬機(jī)慢,可以安裝VMware tools,但如果由于某些原因,比如說某些舊版本的VMware會(huì)出現(xiàn)安裝不了VMware tools,我們就可以遠(yuǎn)程桌面的方法,流暢
    的頭像 發(fā)表于 05-09 10:06 ?5074次閱讀
    VMware<b class='flag-5'>虛擬機(jī)</b>慢,卡頓,<b class='flag-5'>用</b>遠(yuǎn)程桌面的方法變順暢

    虛擬機(jī)的ip地址和主機(jī)一樣嗎

    地址,用于與其他設(shè)備進(jìn)行通信。下面將詳細(xì)介紹虛擬機(jī)的IP地址和主機(jī)的IP地址之間的區(qū)別和聯(lián)系。 IP地址是用于在網(wǎng)絡(luò)中唯一標(biāo)識(shí)設(shè)備的一串?dāng)?shù)字。在TCP/IP協(xié)議中,IP地址被用于路由數(shù)據(jù)包,并將數(shù)據(jù)從源設(shè)備傳遞到目標(biāo)設(shè)備。每個(gè)主機(jī)(或虛
    的頭像 發(fā)表于 03-26 15:34 ?5312次閱讀

    VMware虛擬機(jī)的三種網(wǎng)絡(luò)模式

    VMware虛擬機(jī)的三種網(wǎng)絡(luò)模式 VMware是一種廣泛使用的虛擬機(jī)軟件,可以創(chuàng)建和管理多個(gè)虛擬機(jī)。在使用VMware虛擬機(jī)時(shí),網(wǎng)絡(luò)設(shè)置非常重要,因?yàn)樗鼪Q定了
    的頭像 發(fā)表于 02-04 11:17 ?2023次閱讀