darsd的wasm支持几乎所有的d运行时-创新互联

原文
大家好,我再次试用亚当wasm最小运行时,昨天我取得了很大的进步.
目前,唯一没有实现特性是try/catch/finally/throw等,主要是因为引擎不用它,我想问你们当前使用它的反馈,我已写了一个仅测试wasm运行时的文件:

创新互联建站是一家专注于成都网站制作、成都网站设计、外贸营销网站建设与策划设计,城关网站建设哪家好?创新互联建站做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:城关等地区。城关做网站价格咨询:18980820575
// ldc2 -i=. --d-version=CarelessAlocation -i=std -Iarsd-webassembly/ -L-allow-undefined -ofserver/omg.wasm -mtriple=wasm32-unknown-unknown-wasm arsd-webassembly/core/arsd/aa arsd-webassembly/core/arsd/objectutils arsd-webassembly/core/internal/utf arsd-webassembly/core/arsd/utf_decoding hello arsd-webassembly/object.d

import arsd.webassembly;
import std.stdio;

class A {int _b = 200;
    int a() {return 123; }
}

interface C {void test();
}
interface D {void check();
}

class B : A, C
{int val;
    override int a() {return 455 + val; }

    void test()
    {rawlog(a());
        int[] a;
        a~= 1;
    }
}

void rawlog(Args...)(Args a, string file = __FILE__, size_t line = __LINE__)
{writeln(a, " at "~ file~ ":", line);
}


struct Tester
{int b = 50;
    string a = "hello";
}
void main()
{float[] f = new float[4];
    assert(f[0] is float.init);
    f~= 5.5; //附加
    f~= [3, 4];
    int[] inlineConcatTest = [1, 2] ~ [3, 4];

    auto dg = delegate()
    {writeln(inlineConcatTest[0], f[1]);
    };
    dg();
    B b = new B;
    b.val = 5;
    A a = b;
    a.a();
    C c = b;
    c.test();
    assert(cast(D)c is null);
    Tester[] t = new Tester[10];
    assert(t[0] == Tester.init);
    assert(t.length == 10);

    switch("hello")
    {case "test":
            writeln("broken");
            break;
        case "hello":
            writeln("工作的猜串");
            break;
        default: writeln("哈哈");
    }
    string strTest = "test"[0..$];
    assert(strTest == "test");


    Tester* structObj = new Tester(50_000, "内联分配");
    writeln(structObj is null, structObj.a, structObj.b);

    int[string] hello = ["hello": 500];
    assert(("hello" in hello) !is null, "No key hello yet...");
    assert(hello["hello"] == 500, "Not 500");
    hello["hello"] = 1200;
    assert(hello["hello"] == 1200, "重赋值不工作");
    hello["h2o"] = 250;
    assert(hello["h2o"] == 250, "New member");


    int[] appendTest;
    appendTest~= 50;
    appendTest~= 500;
    appendTest~= 5000;
    foreach(v; appendTest)writeln(v);
    string strConcatTest;
    strConcatTest~= "Hello";
    strConcatTest~= "World";
    writeln(strConcatTest);
    int[] intConcatTest = cast(int[2])[1, 2];
    intConcatTest~= 50;
    string decInput = "a";
    decInput~= "こんいちは";
    foreach(dchar ch; "こんいちは")
    {decInput~= ch;
        writeln(ch);
    }
    writeln(decInput);
    int[] arrCastTest = [int.max];

    foreach(v; cast(ubyte[])arrCastTest)
        writeln(v);

}

目前已通过所有这些测试.这表明从D运行时Arsd自定义运行迁移时,几乎得到了所有的常见特征.表明唯一失去的是WASIlibc.但引擎不会使用它的全部,而只有它的一个子集.所以,我想说,现在谁都可玩它.

话虽如此,还是要谨慎地建议,虽然我带来了这些实现,但我并不关心内存泄漏,因此,它是不带垃集的运行时:粗心分配.但是!如果自己清理,移植一些程序是可能的.因为引擎不会在循环泄漏内存(因为那会使它触发GC,从而变慢),所以完全可用它.
“但为什么不继续SkoppeWASM工作呢?”,不管我怎么努力,我构建不了LDC运行时.在最小运行时上,做这项工作要容易得多.

我不打算用它替代druntime.我已做了使引擎网络工作最小子集的特性.我仍期待和等待真实的druntime.
可在以下位置测试PR:位置

这很好,谢谢你!!坚持下去,我可能真会决定用你的游戏引擎来做项目. 😃

现在大的问题是,对接如WebGLWebAPI接口的状态如何?需要多少JS胶水代码?最好是可自动化所有JS样板文件,这样我就不必为D项目编写一行JS,就可在WASM中工作.

这一部分非常简单,可用opDispatchD调用它,或按eval串传递它.

但是我有个计划,应该会管用:执行

setTimeout(collect, 0);

这样,在事件循环空闲时运行它.
然后wasm栈为空时,可扫描纯内存.
:D需要第2线程.
这是错误的,即使在普通桌面上,也不需要第二个线程.
wasm上使用GC的问题是,webasm栈是不透明的.你可让编译器输出影子栈或,当它是空的时,如上扫描计划.都应起作用,但是我还没有时间来实现.

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页名称:darsd的wasm支持几乎所有的d运行时-创新互联
网站路径:http://azwzsj.com/article/dhgohi.html