darsd的wasm支持几乎所有的d运行时

news/2024/11/23 20:48:10/

原文
大家好,我再次试用亚当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.dimport 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栈是不透明的.你可让编译器输出影子栈或,当它是空的时,如上扫描计划.都应起作用,但是我还没有时间来实现.


http://www.ppmy.cn/news/10179.html

相关文章

ES为什么要移除types类型

文章目录elasticsearch(集群)中可以包含多个索引index(数据库) ,每个索引中可以包含多个类型types(表) ,每个类型下又包含多个文档Document(行) ,每个文档中又包含多个字段Field&…

Python爬虫登录后token处理

今天继续给大家介绍Python爬虫相关知识,本文主要内容是Python爬虫登录后token处理。 一、网页token及token作用 在上文Python爬虫登录后cookie处理中,我们介绍过使用使用Python爬虫解决cookie及网页登录访问问题。 然而,有的网站&#xff0…

数据库,计算机网络、操作系统刷题笔记27

数据库,计算机网络、操作系统刷题笔记27 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle…

LeetCode刷题模版:21 - 30

目录 简介21. 合并两个有序链表22. 括号生成23. 合并K个升序链表24. 两两交换链表中的节点25. K 个一组翻转链表26. 删除有序数组中的重复项27. 移除元素28. 找出字符串中第一个匹配项的下标29. 两数相除【未理解】30. 串联所有单词的子串【未理解】结语简介 Hello! 非常感谢您…

RocketMQ5.0.0部署与实例

一、Idea调试1.相关配置文件在E:\rocketmq创建conf、logs、store三个文件夹。从RocketMQ distribution部署目录中将broker.conf、logback_namesrv.xml、logback_broker.xml文件复制到conf目录。如下图所示。其中logback_namesrv.xml、logback_broker.xml分别是NameServer、Brok…

LeetCode[1046]最后一块石头的重量

难度&#xff1a;简单 题目&#xff1a; 有一堆石头&#xff0c;每块石头的重量都是正整数。每一回合&#xff0c;从中选出两块最重的 石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a;如果 x …

httpd安装

一、离线安装 1、去 https://pkgs.org/ 下载httpd所依赖的7个rpm包 [基于CentOS 7 x86_64系统&#xff0c;如需其他环境可前往官网直接下载] apr-1.4.8-5.el7.x86_64.rpm apr-util-1.5.2-6.el7.x86_64.rpm apr-util-ldap-1.5.2-6.el7.x86_64.rpm postgresql-libs-9.2.24-1.el…

idea调试npm、tomcat远程服务(包括docker部署方式)

前言 idea调试npm、tomcat远程服务&#xff1a;包括docker部署方式及非docker部署方式 博客地址&#xff1a;芒果橙的个人博客 【http://mangocheng.com】 调试npm项目 1. 新增一个npm项目 2. 配置package.json及启动脚本 3. debug模式启动 远程调试docker部署的项目 1. 配置…