原文
大家好,我再次試用亞當
的wasm
最小運行時,昨天我取得了很大
的進步.
目前,唯一沒有實現(xiàn)特性是try/catch/finally/throw
等,主要是因為引擎
不用它,我想問你們當前使用它的反饋,我已寫了一個僅測試wasm
運行時的文件:
// 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, "內聯(lián)分配");
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
自定義運行遷移時,幾乎得到
了所有的常見特征
.表明唯一失去的是WASI
的libc
.但引擎
不會使用它的全部,而只有它的一個子集
.所以,我想說,現(xiàn)在誰都可玩它.
話雖如此,還是要謹慎
地建議,雖然我?guī)砹诉@些實現(xiàn),但我并不關心內存泄漏
,因此,它是不帶垃集
的運行時:粗心分配
.但是!如果自己清理,移植
一些程序是可能的.因為引擎
不會在循環(huán)
中泄漏內存
(因為那會使它觸發(fā)GC
,從而變慢),所以完全可用它.
“但為什么不繼續(xù)Skoppe
的WASM
工作呢?”,不管我怎么努力,我構建不了LDC
運行時.在最小
運行時上,做這項工作
要容易得多.
我不打算用它
替代druntime
.我已做了使引擎
為網絡工作
的最小子集
的特性.我仍期待和等待
真實的druntime
.
可在以下位置測試PR
:位置
這很好,謝謝你!!堅持
下去,我可能真會決定用你的游戲引擎
來做項目. 😃
現(xiàn)在大的問題是,對接如WebGL
等WebAPI
接口的狀態(tài)
如何?需要多少JS
膠水代碼?最好是可自動化所有JS
樣板文件,這樣我就不必為D項目
編寫一行JS
,就可在WASM
中工作.
這一部分非常
簡單,可用opDispatch
從D
調用它,或按eval
串傳遞它.
但是我有個計劃,應該會管用:執(zhí)行
setTimeout(collect, 0);
這樣,在事件循環(huán)
空閑時運行它.
然后wasm
棧為空時,可掃描
純內存.
:D需要第2線程.
這是錯誤
的,即使在普通桌面上,也不需要第二個線程
.
在wasm
上使用GC
的問題是,webasm
棧是不透明的.你可讓編譯器輸出
影子棧或,當它是空的時,如上掃描
計劃.都應起作用,但是我還沒有時間來實現(xiàn).
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧