darsd的wasm支持几乎所有的d运行时
原文
大家好,我再次试用亚当
的wasm
最小运行时,昨天我取得了很大
的进步.
目前,唯一没有实现特性是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, "内联分配");
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
.但引擎
不会使用它的全部,而只有它的一个子集
.所以,我想说,现在谁都可玩它.
话虽如此,还是要谨慎
地建议,虽然我带来了这些实现,但我并不关心内存泄漏
,因此,它是不带垃集
的运行时:粗心分配
.但是!如果自己清理,移植
一些程序是可能的.因为引擎
不会在循环
中泄漏内存
(因为那会使它触发GC
,从而变慢),所以完全可用它.
“但为什么不继续Skoppe
的WASM
工作呢?”,不管我怎么努力,我构建不了LDC
运行时.在最小
运行时上,做这项工作
要容易得多.
我不打算用它
替代druntime
.我已做了使引擎
为网络工作
的最小子集
的特性.我仍期待和等待
真实的druntime
.
可在以下位置测试PR
:位置
这很好,谢谢你!!坚持
下去,我可能真会决定用你的游戏引擎
来做项目. 😃
现在最大的问题是,对接如WebGL
等WebAPI
接口的状态
如何?需要多少JS
胶水代码?最好是可自动化所有JS
样板文件,这样我就不必为D项目
编写一行JS
,就可在WASM
中工作.
这一部分非常
简单,可用opDispatch
从D
调用它,或按eval
串传递它.
但是我有个计划,应该会管用:执行
setTimeout(collect, 0);
这样,在事件循环
空闲时运行它.
然后wasm
栈为空时,可扫描
纯内存.
:D需要第2线程.
这是错误
的,即使在普通桌面上,也不需要第二个线程
.
在wasm
上使用GC
的问题是,webasm
栈是不透明的.你可让编译器输出
影子栈或,当它是空的时,如上扫描
计划.都应起作用,但是我还没有时间来实现.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现