Assemblyscript: Mengapa tidak berubah menjadi karat

Dibuat pada 6 Agu 2020  ·  5Komentar  ·  Sumber: AssemblyScript/assemblyscript

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?

question

Semua 5 komentar

@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);
    }
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

emil14 picture emil14  ·  3Komentar

torch2424 picture torch2424  ·  5Komentar

MaxGraey picture MaxGraey  ·  3Komentar

DanielMazurkiewicz picture DanielMazurkiewicz  ·  4Komentar

DuncanUszkay1 picture DuncanUszkay1  ·  3Komentar