https://elgek.subat.cn/d/158-Google-V8-JavaScript-matorini-C-Cmake-projikitqaekirish
ئۈستىدىكى يازمىنىڭ ئاخىرىغا ئۇلاپلا Rust نۇسقىسىنىمۇ پۈتتۈرۋېتەيلۇق،
بىراق... بىراق... بۇنى يەنە بىر قىتىم Rust دا قىلىشنىڭ سەۋەبى نېمە؟
نېمىشقا؟
چۈنكى Rust بولسا C, C++ غا قارىغاندا بىخەتەر تىل، (Compile time memory management)، ئەگەر پۈتكۈل پروگراممىنى Rust دا يازسا تېخىمۇ بىخەتەر تېخىمۇ ئۈنۈملۈك ھالدا پروگرامما يېزىشقا بولىدۇ، ئەڭ مۇھىمى Rust نىڭ ئىكىلوگىيەسىگە ئۇلانغىلى بولىدۇ،
ئەمەلىيەتتە بىلىدىغانلارغا ناتونۇش بولمىسا كىرەك، بۇ يەردە Deno ئىسىملىك بىر ئوچۇق كودلۇق JavaScript Runtime بار بولۇپ Node.js نىڭ ئاپتورى Node.js نى ياساپ پۈتكۈزىۋەتكەندىن كىيىن Deno غا تۇتۇش قىلغان، بۇنىڭ JavaScript ماتورى قىسمىغا ئوخشاشلا v8 نى ئىشلىتىپ باشقا تۆەن قاتلام io قىسىملىرىنى Rust + tokio ئاساسىدا ئەمەلگە ئاشۇرغان،
شۇڭا قائىدە بويىچە v8 نى rust قا باشقىلار ئاللىبۇرۇن ئەكىرىپ قويغان بولىشى كىرەك،
دەرۋەقە https://github.com/denoland/rusty_v8 دە deno نى ياسىغانلار deno ئۈچۈن v8 نى Rust قا ئەكىرىپ قويغان،
github ئادېرسى: https://github.com/denoland/rusty_v8
crate ئادېرسى: https://crates.io/crates/v8
دىققەت قىلىشقا تىگىشلىكى شۇكى ئەگەر سىز Github قا ئۇلىنالمايدىغان ئورۇندا بولسىڭىز ئۇنداقتا ئازراق ئەگرى توقاي يوللارنى بېسىشڭىز كىرەك:
يەنى ئۆزىڭىز https://github.com/denoland/rusty_v8 دىن release بېتىدىن static link library سىنى چۈشۈرۈپ ئادېرسىنى بئاندىن كومپىيۇتېرىڭىزنىڭ مۇھىت ئۆزگەرگۈچى مىقدارى: RUSTY_V8_ARCHIVE
غا قىممەت قىلىپ بەرگەندىن كىيىن Github قا ئۇلىنالمىسڭىزمۇ ئاخىرىنى نۇرمال تاماملىيالايسىز.
ئەسلى كود:
Rust:
fn main() {
{//Initialize v8
V8::initialize_platform(new_default_platform(0, true).make_shared());
V8::initialize();
}
let mut isolate = Isolate::new(CreateParams::default());
let handle_scope = &mut HandleScope::new(&mut isolate);
let context = Context::new(handle_scope);
let context_scope = &mut ContextScope::new(handle_scope, context);
{
let js_function = FunctionTemplate::new(context_scope, |scope: &mut HandleScope, args: FunctionCallbackArguments, return_value: ReturnValue|{
println!("{}", args.get(0).to_rust_string_lossy(scope));
}).get_function(context_scope).unwrap();
let key = v8::String::new(context_scope, "print").unwrap().into();
context.global(context_scope).set(context_scope, key, js_function.into());
{
let key = v8::String::new(context_scope, "platformInfo").unwrap().into();
let value = serde_v8::to_v8(context_scope, MyLinuxPlatformInfo {platform_name: "Linux".into(), author_name: "مۇختەرجان".into()}).unwrap();
context.global(context_scope).set(context_scope, key, value).unwrap();
}
}
{
let source_code = {
let text = &mut String::new();
File::open("js/file.js").unwrap().read_to_string(text).unwrap();
v8::String::new(context_scope, text.as_str()).unwrap()
};
let script = Script::compile(context_scope, source_code, None).unwrap();
let result = script.run(context_scope);
if let Some(ref data) = result {
println!("{:?}", data);
}
}
}
#[derive(serde::Serialize, serde::Deserialize)]
struct MyLinuxPlatformInfo {
platform_name: String,
author_name: String,
}
JavaScript:
print(JSON.stringify({
name: "مۇختەرجان",
age: 90,
address: {
country: "xxx",
city: "xxx"
},
...platformInfo
}, null, 2))
پروجىكىت ئەسلى كود ئادېرسى: https://dev.subat.cn/Ug-Projekt/hello_v8_rust_version