Assemblyscript: لماذا لا تتحول إلى الصدأ

تم إنشاؤها على ٦ أغسطس ٢٠٢٠  ·  5تعليقات  ·  مصدر: AssemblyScript/assemblyscript

أهلا،

كنت أتساءل لماذا لم تسلك طريق إنشاء برنامج كتابة نص إلى ناقل الصدأ ثم إنشاء كود js بمساعدة حزمة wasm

من عند:

export greet(){
 let x: boolean = true;
 if(x){
  console.log("Greetings, x is true");
 }
}

(AST العبور بين)

إلى:

#[wasm_bindgen]
pub fn greet() {
    let x: bool = true; 
    if x {
        println!("Greetings, x is true");
    }
}

هل هناك أسباب؟

question

ال 5 كومينتر

solidsnail ماذا عن الإدارة التلقائية للذاكرة (التي توفرها AssemblyScript ولا يوفرها Rust)؟ في البداية. :غمزة:

solidsnail على الفور إلى السؤال الثاني. يوفر AssemblyScript أربعة خيارات لمكتبة دعم وقت التشغيل بأحجام ووظائف مختلفة (https://www.assemblyscript.org/runtime.html). ما هي فكرتك في إعادة تطبيقه مع Rust (باستخدام no-std التي أفترضها)؟

في حالة AssemblyScript ، لغة مختلفة تمامًا عن Rust ، فإن التحويل إلى Rust من شأنه أن يحل محل الطبقة منخفضة المستوى من Binaryen IR بطبقة مختلفة منخفضة المستوى من Rust لم يتم تصميمها خصيصًا للمهمة. يمكن القيام به إلى حد ما ، مع فائدة طفيفة تتمثل في القدرة الفعالة على المرور عبر LLVM (أتوقع أن تتضاءل هذه الميزة بمرور الوقت) ، ولكن هذا يعني أيضًا طبقتين من المكتبات القياسية مع طبقتين من المجمعين ، مما يؤدي على الأرجح إلى كود WebAssembly النهائي دون المستوى الأمثل وغير الضروري. تفوق العيوب بسرعة الفوائد إن وجدت ، أي جعل كل شيء أكبر للتحميل ، وأصعب في الإعداد ، وجعل التجميع أبطأ بكثير ، وفي النهاية عدم القدرة على تمهيد المحول البرمجي.

سبب وجيه أيضًا وصفه Alon لماذا نستخدم Binaryen بدلاً من LLVM أو LLVM

أرى ، شكرا على الأفكار.

أنا في الواقع أكثر حرصًا على رؤية الأشياء من منظور DX ، والتفكير في شيء على غرار هذا:

عداد .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 ، وتحويل وإنشاء الملفات:

المضاد:

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);
    }
}
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات