Hai, yang di sana,
Saya bertanya-tanya mengapa Anda tidak mengikuti rute membuat typesript ke rust transpiler dan kemudian menghasilkan kode js dengan bantuan wasm-pack
Dari:
export greet(){
let x: boolean = true;
if(x){
console.log("Greetings, x is true");
}
}
(AST Melintasi di antaranya)
Ke:
#[wasm_bindgen]
pub fn greet() {
let x: bool = true;
if x {
println!("Greetings, x is true");
}
}
Apakah ada alasan?
@solidsnail bagaimana dengan Manajemen Memori Otomatis (yang disediakan oleh AssemblyScript dan Rust tidak)? Untuk permulaan. :mengedip:
@solidsnail segera ke pertanyaan kedua. AssemblyScript menyediakan empat opsi untuk Pustaka Dukungan Runtime dengan berbagai ukuran dan fungsionalitas (https://www.assemblyscript.org/runtime.html). Apa ide Anda untuk mengimplementasikannya kembali dengan Rust (menggunakan no-std saya kira)?
Dalam kasus AssemblyScript, bahasa yang sangat berbeda dengan Rust, transpiling ke Rust hanya akan menggantikan lapisan tingkat rendah Binaryen IR dengan lapisan tingkat rendah Rust yang berbeda yang tidak dirancang khusus untuk tugas tersebut. Dapat dilakukan sampai batas tertentu, dengan sedikit manfaat karena secara efektif dapat menyalurkan melalui LLVM (saya berharap manfaat ini berkurang seiring waktu), tetapi itu juga berarti dua lapisan perpustakaan standar dengan dua lapisan kompiler, kemungkinan besar menghasilkan kode WebAssembly akhir yang kurang optimal dan tidak perlu. Kekurangannya dengan cepat lebih besar daripada manfaatnya jika ada, yaitu membuat semuanya lebih besar untuk diunduh, lebih sulit untuk diatur, membuat kompilasi jauh lebih lambat, dan pada akhirnya tidak dapat mem-bootstrap kompiler.
Juga alasan bagus yang dijelaskan oleh Alon mengapa kami menggunakan Binaryen alih-alih bahasa berbasis LLVM atau LLVM
Saya mengerti, terima kasih atas wawasannya.
Saya sebenarnya lebih tertarik untuk melihat sesuatu dari perspektif DX, memikirkan sesuatu seperti ini:
counter.tsx:
import { WASM, Component, i32 } from "./lib";
<strong i="9">@Component</strong>
export class Counter {
wasm_state = {
count: 1,
};
@WASM({
getter: true,
})
getCount() {
return this.wasm_state.count;
}
@WASM({
setter: true,
})
setCount(count: i32) {
this.wasm_state.count = count;
}
render() {
return (
<div>
<h1>Count: {this.getCount()}</h1>
</div>
);
}
}
AST TypeScript melintasi, mengubah, dan menghasilkan file:
counter.wasm:
extern crate cfg_if;
extern crate wasm_bindgen;
mod utils;
use cfg_if::cfg_if;
use wasm_bindgen::prelude::*;
cfg_if! {
if #[cfg(feature = "wee_alloc")] {
extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
}
}
#[wasm_bindgen]
pub struct State {
count: i32,
}
#[wasm_bindgen]
impl State {
#[wasm_bindgen(constructor)]
pub fn new(count: i32) -> State {
State { count }
}
#[wasm_bindgen(getter)]
pub fn getCount(&self) -> i32 {
self.count
}
#[wasm_bindgen(setter)]
pub fn setCount(&mut self, count: i32) {
self.count = count;
}
}
counter.js:
import {html, render} from 'lit-html';
import { State } from './counter.wasm';
export class Counter extends HTMLElement{
constructor(){
super();
State.setCount(1)
this.renderHtml()
}
renderHtml(){
render(html`
<div>
<h1>Count: ${State.getCount()}</h1>
</div>
`, this);
}
}