Memory64
github.com
github.com
Unless it ends up being seamless / no cost via loading different u32/u64 implementations.
I mostly agree with the old c++ mantra of - no feature should have a runtime cost unless used.
I suppose there might be a compromise where you cap a 64bit WASM instance to (for example) an effective 35bit address space, allocate 32GB of virtual memory and then generate code which masks off the top bits of pointers so OOB operations safely wrap around without having to branch, but I'm not sure if the spec allows that. IIRC illegal operations are required to throw an exception.
When that trick can't be used, I think the most efficient method would be to clamp the top of the address so that the max would land on a single guard page. On x86-64 and ARM that would be done with a `cmp`and a conditional move. RISC-V (RVA22 profile and up) has a `max` instruction. That would be typically one additional cycle.
The new proposal is for using a 64-bit pointer and a 64-bit offset, which would create a 65-bit effective index. So neither method above could be used. I think each address calculation would first have to add and check for overflow, then do the bounds-check, and then add the base address to the linear memory.
If you are already doing a cmp + cmov, wouldn't you be better off just doing a cmp + jmp (to OOB handler)? The cmp + jmp can fuse, so it's probably strictly better in an execution cost sense, plus it doesn't add to the critical data-dependent chain of the load address, which would otherwise add a couple of cycles to the address data chain.
Of course, it does require you have these landing pads for the jmp.
You know, it's kind of insane that things like this are nigh impossible to learn from the RISC-V official site. Googling on the site itself doesn't yield anything; you have to go to the "Technical > Specifications" page which has PDFs on the basic ISA from 2019, but not on the newer frozen/ratified extensions, and a link to the "RISC-V Technical Specifications" page on their Attlassian subdomain, where you can find a link to a Google doc "RISC-V profiles" and there you will learn that, indeed Zbb extension is mandatory for RVA22U64 profile (and that, apparently, there is no RVA22U32 profile).
And of course, you have to know that Zbb extension is the one that has max/min/minu/maxu instructions in it; grepping for "min" or "max" won't find you anything. Because why bother listing all the mnemonics of the mandatorily supported function in a document about the sets of instructions with mandatory support? If someone's reading a RISC-V document, they obviously have already read all the other RISC-V docs that predate it, that's the target audience, after all.
For one, all of the specs are getting merged into a unified isa-manual, you can get the latest version from github: https://github.com/riscv/riscv-isa-manual/releases
The other project is the riscv-unified-db: https://github.com/riscv-software-src/riscv-unified-db The goal is that this database will hold all specification information in a machine readable format.
That allows you to e.g. generate a manual for RVA22 including the ISA specifications: https://riscv-software-src.github.io/riscv-unified-db/pdfs/R...
Or a website were you can search for instructions, and get all of the relevant information about it: https://riscv-software-src.github.io/riscv-unified-db/exampl...
The above two links are still WIP, so there are still a lot of things missing.
What an understatement.
Why would you ever want to go above this? What is your scenario?
However the real win is the ability to use 64 bit types more easily, if for nothing else other than it simplifies making wasm ports of desktop libraries.
Those are available on wasm32 just the same.
I work in bioinformatics. A couple of times a year I check if browsers finally support Memory64 by default. They don't, and I conclude that Wasm is still irrelevant to my work. I no longer remember how long I've been doing that. Cross-platform applications running in a browser would be convenient for many purposes, but the technology is not ready for that.
The company I current work for makes radiotherapy software. Most of our native apps run in clinics under .NET.
There are some cases where we want users or employees to be able to access our radiotherapy tooling from a browser. Microsoft has a pretty phenomenal .NET -> WASM compiler. We can compile our .NET DICOM image viewer tooling to WASM, for example, and it is more performant and full-featured than Cornerstone.js (https://www.cornerstonejs.org/).
However, medical imagery is memory heavy. We frequently run into the 4GB limit, especially if the CT/MR image uses 32-bit voxels instead of 16-bit voxels. Or if the field of view was resized. Or if we accidentally introduce an extra image copy in memory.
So no reason why a big game with fancy graphics and lots of textures couldn't use it.
Java pointer compression promises up to 32GB of heap with 32 bit pointers, for instance.
uint64_t buffer[1<<32];
and your “pointers” are indexes to that array: (void*)(buffer+index)For example, in a project needed to rely heavily on markdown and needed the exact same markdown renderer on both server and client. That alone made us choose node.js on the server side so that we could use the same markdown module.
Today, I'd probably find a rust / c etc markdown renderer and compile it to wasm. Use it on the server and client as it.
This is a silly example but wasm being a universal runtime would allow interfacing things a lot easier.
Ah also, things like cloudflare workers let you run wasm binaries on their servers. You can write in in any language that can target wasm and you have a universal runtime. Neat.
memory64 support will be very useful, because many non-trivial designs will use a lot more than 4GiB of RAM.
https://shivangsnewsletter.com/p/why-doesnt-cloudflare-use-c...
In other words: JavaShit ho!
Change my mind.
I remember back in the day setting up cross compiling was horrendous though, so I agree, I just don't think it's the only reason. These days all you do is set a flag and rerun "go build", it's stupidly easy, as far as compiling goes.
The other two things that come to mind is that on the web users expect things to look different, so the fact that your cross compiled app looked/behaved like ass on at least one platform unless you basically rewrote the front end to conform to each platforms user interface guidelines (aka write once, rewrite everywhere), meant that websites could look more how the company making the website wanted it to look, and less like how Redmond or Cupertino-bases companies wanted it to look.
The real killer feature though, imo, was upgrading of software. Customer support is a big expense that ends up sinking developer time, and if you got bug reports and you fixed the problem, you'd keep getting bug reports for that issue and the CS team would have to figure out which version the customer is on, buried three menus deep, before getting them to upgrade. The website, however is basically always running the latest version, so no more wasting everyone's time with an old install on a customer's computer. And they showed up in metrics for management to see.
https://www.tiobe.com/tiobe-index/
Java compiles to WebAssembly too. Google uses it:
> Since there are many questions about the way the TIOBE index is assembled, a special page is devoted to its definition. Basically the calculation comes down to counting hits for the search query > > +"<language> programming"
I don't think the popularity of a programming language could be measured by how many hits it has on search engines. For example, it may well be that 50% of those hits are forum posts from people being frustrated because the language sucks. In addition, the fact that a language is in use in a lot of existing systems says little about when that code were written, and which options were available at that time.
[0] https://www.tiobe.com/tiobe-index/programminglanguages_defin...
Here's RedMonk's: https://redmonk.com/sogrady/2024/09/12/language-rankings-6-2...
Here's GitHub's: https://github.blog/news-insights/octoverse/octoverse-2024/
PyPL https://pypl.github.io/PYPL.html. Java is #2. Jobs
Job scene scraped over 21 months over 2023-24. Java is #3
https://www.devjobsscanner.com/blog/top-8-most-demanded-prog...
Bad UI frameworks that failed to be usable and/or compatible across systems. Cross compiling is more than producing foreign executables.
Because Sun and then Oracle never though the web would kick off. Sun had the ball of gold in its hands with the HotJava browser. But they thought the web was a fad and abandoned it. They should have continued developing HotJava and hard-pushed for the JVM inside the web-browser as a public standard and then Java would have been the absolute dominant language of Planet Earth today - the rest would be crying in a dark corner.
Another problem was the 2001 dotcom bubble burst. That crash made a lot of senior executives and investors think that the web was merely hype-technology and de-invest in most front-end efforts. Google proved them completely wrong later.
You used to have to put everything in one giant class to work around this.
(This situation was so frustrating)
https://developer.mozilla.org/en-US/docs/Web/API/FileReaderS...