WebAssembly from the Ground Up
145 points
5 days ago
| 12 comments
| wasmgroundup.com
| HN
ethin
28 minutes ago
[-]
Wasm is such a cool technology. The spec though for me leaves a lot to be desired. Oh, the first few chapters are fine, but when you get to the binary and text formats that's when it all breaks down for me.

For whatever reason, Wasm loves OCaml. This wouldn't really be a bad thing if they didn't come up with their own custom language to denote syntactic elements of both formats instead of using EBNF or similar. I discussed this with them (because before this change they were using raw MathML for all the productions, and screen readers and MathML are... Erm... Hit and miss) and they noted that they needed an attribute grammar instead of just either BNF or an extension of it. So what they have now (SpecTec) is better than what they did have, and I like that I can now just open the raw grammar files and dive in. The problem is the way they chose to express it. And it could just be me, because ML languages (and functional languages in general) don't really come all that easy to me. (they're just... Really difficult for me to mentally follow, which is odd since I can follow most others just fine.)

reply
pdubroy
5 hours ago
[-]
Hi HN! Co-author of the book here, happy to answer any questions you have.

Beyond the sample chapters which are linked from the landing page, we also have a couple blog posts which may be interesting:

- A WebAssembly Interpreter: https://wasmgroundup.com/blog/wasm-vm-part-1/

- An older blog post, "A WebAssembly compiler that fits in a tweet" (https://wasmgroundup.com/blog/wasm-compiler-in-a-tweet), was also on HN earlier this year: https://news.ycombinator.com/item?id=42814948

reply
dboon
4 hours ago
[-]
It looks good! I may pick up a copy. Besides the convenience, why do you recommend your book over reading the WASM spec as you implement your basic compiler? I find that WASM has a beautifully readable spec. One of its best features!

Either way, I’ll likely buy a copy to support the hard work on a piece of tech that I am very fond of

reply
vanderZwan
2 hours ago
[-]
> I find that WASM has a beautifully readable spec. One of its best features!

Disclaimer: I'm one of the guys whose face is advertising this book, as someone who bought the early access version and loved it enough to help a bit with proofreading.

I'm a self-taught programmer who essentially started from the lowest level with Z80 assembly on the TI-83+. I just wanted to know how to fit the bytes together directly without dealing with the rest of the toolchain.

I've tried reading the spec multiple times and what it revealed to me is that my lack of formal training in the subject matter is really holding me back here. I feel like I can follow 90% of it, but that doesn't matter really. It's the remaining 10% I don't understand that does.

The spec is written as a reference and gives you all the pieces, but doesn't really do a great job at fitting all the pieces together.

Everyone I know who does have some relevant background to compiler writing agrees with you though. So I think that for them it's obvious how to fit the pieces together.

Speaking for myself though, this is the first book that made the bytecode "click" as a whole.

Having said that, I think this book and the spec together are the real combo to go for. The book covers the core, and understanding that foundation makes all the extensions easy to grasp from spec alone.

reply
pdubroy
4 hours ago
[-]
Thank you!

I would 100% agree that the spec is quite readable. At the top of our Minimum Viable Compiler chapter, we say:

> The binary module format is defined in the WebAssembly Core Specification. You’ll notice that we back up many of our explanations with reference to the relevant part of the spec. One of our goals with this book is to convince you that the spec is a valuable resource that’s worth getting familiar with.

I think the spec is great as reference material, but we wrote the book to be more of a tutorial. We've talked to many people who say they've looked at the spec, but find it too overwhelming. For those people, we hope the book provides a good structure that ultimately helps them become comfortable with the spec!

reply
dmpk2k
4 hours ago
[-]
Doing is a far better way to learn than just reading.
reply
akst
2 hours ago
[-]
And is there anything you’ve done that has helped you learn WebASM?
reply
AndruLuvisi
2 hours ago
[-]
Does it cover tail calls?
reply
pdubroy
2 hours ago
[-]
Edit: changed slightly to provide a more useful answer.

No, it doesn't — not this version of the book at least. We only cover WebAssembly 1.0.

That said, as my co-author says below, there's really not much to tail calls. Once you've worked through the book, you'd be able to grok tail calls pretty quickly.

As an aside — 2.0 was announced just a few weeks after we launched the book, and 3.0 a few months ago. And with 3.0 (which added tail calls), the spec has more than doubled in size vs 1.0, so it would be hard to cover everything.

We've talked about doing a new chapter to cover some of the interesting parts of 2.0 (e.g. SIMD), but covering everything in 3.0 (garbage collection, typed reference, exception handling, tail calls…) feels almost like an entire 2nd book!

reply
marianoguerra
2 hours ago
[-]
Co-author here.

if you are interested in tail calls you just need to understand the call instruction which we cover in the book and then replace it with either:

- return_call <funcidx>, the tail-call version of call

- return_call_indirect <tableidx> <typeidx>, the tail-call version of call_indirect

More info here: https://github.com/WebAssembly/tail-call/blob/main/proposals...

reply
RhinoDevel
45 minutes ago
[-]
reply
marianoguerra
31 minutes ago
[-]
yes, a nice way to contribute is to add the table instructions to the reference: https://developer.mozilla.org/en-US/docs/WebAssembly/Referen...
reply
superjose
1 hour ago
[-]
Just went and bought it!

I'm in a process where application-level programming isn't cutting it anymore (I still have a lot to learn, but it's in the diminishing returns).

I've been looking to understand the entire stack at a deeper level (from how requests are made to how they're parsed), and this seems like the next natural step!

Thanks a bunch!

reply
pdubroy
1 hour ago
[-]
Awesome! You're exactly the kind of person we were thinking of when we wrote the book…experienced programmers who are interested in understanding things at a lower level.

Let us know how it goes! You can find us in the book Discord, or email us at hello@wasmgroundup.com.

reply
akst
2 hours ago
[-]
As much as I love a free resource, I’ll happily pay for a high quality complete resource. Looking forward to reading this
reply
fooker
2 hours ago
[-]
What's the state of wasm for porting multi-process code?

I want to run something that execs a command line tool, both in the browser. Doable yet?

reply
flohofwoe
1 hour ago
[-]
> I want to run something that execs a command line tool, both in the browser. Doable yet?

If it's not possible from Javascript, it's also not possible from WASM, it's as easy as that.

If your command line tool can be compiled to WASM and works within the restrictions of the browser sandbox, it's trivial. But if you want to start a native command line tool from within the browser, it's pretty much impossible (and for good readons).

There's also a grey zone if you need it to work in a specific runtime environment. For instance VSCode extensions allow to run POSIX command line tools compiled to WASI, and those can safely access parts of the filesystem (like reading and writing files in the current project directory).

reply
fooker
44 minutes ago
[-]
I meant: I want a program compiled to wasm capable of running in the sandbox calling another command line tool also compiled to wasm.

Right now the call is through an exec system call, but that can be changed.

reply
marianoguerra
1 hour ago
[-]
most of that is happening above the WebAssembly spec: https://wasi.dev/

More specifically for command line tools:

- https://wasi.dev/interfaces#presentation

- https://github.com/WebAssembly/wasi-cli

reply
koolala
1 hour ago
[-]
Is wasi .3 still planned to finish soon like the roadmap said? so wasi 1.0 is the the next goal?

wasi 1.0 feels like when it will take off after all these years of dev

timeline at the bottom of this page: https://wasi.dev/roadmap

reply
gurjeet
6 hours ago
[-]
I don't remembering submitting it today; it must be from the second-chance pool. Good to see my submission on the frontpage, though :-)
reply
gurjeet
6 hours ago
[-]
Yup, as suspected, I had submitted it 5 days ago [1], but here it shows as submitted 2 hours ago. But I don't see it in the second-chance pool [2], perhaps because it has graduated out of there to the frontpage.

[1]: https://news.ycombinator.com/submitted?id=gurjeet [2]: https://news.ycombinator.com/pool

reply
kyranjamie
4 hours ago
[-]
Great work, would love to learn more about Wasm.

I can't help but notice that in the editor screenshots there's type information in *.js files.

reply
pdubroy
4 hours ago
[-]
Ah, good catch! I see them in one of the screenshots. Those are just inlay hints, they're not in the source code. (The editor is https://zed.dev)
reply
chasil
6 hours ago
[-]
I like PHP because it allows access to core system calls on any platform.

I see runtime interpreters as constraining when a system call is needed, but proscribed.

reply
boomskats
4 hours ago
[-]
> I like PHP because it allows access to core system calls on any platform.

Lots of people _love_ PHP precisely because of the size of its attack surface.

Do you have any examples of something you've built in PHP which benefitted from direct syscall access?

reply
dilawar
3 hours ago
[-]
I keep hearing about this. I occasionally use PHP8 and so far I'm pretty happy with it. Is there any resource that teaches about security issues with modern PHP (version 8.x)?
reply
haykuro
5 hours ago
[-]
You don't want to use PHP (a server-sided language) to solve a client-side problem.
reply
vbezhenar
2 hours ago
[-]
I know a person who wrote Linux X Desktop Environment using PHP. Worked for them. It is general purpose programming language.
reply
xpe
21 minutes ago
[-]
> [PHP] is general purpose programming language.

To be charitable, yes — PHP has access to low-level system details like the file system, sockets, and processes.

> I know a person who wrote Linux X Desktop Environment using PHP. Worked for them.

However: (a) "Worked for them" is an anecdote, not evidence of comparative suitability; (b) Don't confuse possibility with empirical fitness for purpose. Virtually all decisions are relative to alternatives [1]; (c) Even PHP describes itself as only a "general purpose scripting programming language" [2].

Note that "scripting language" itself can hide important differences. PHP 8 introduced JIT compilation [3], which narrows the performance gap with compiled languages—but doesn't resolve the architectural mismatch with desktop environment requirements.

[1] In negotiation terms, your BATNA (Best Alternative to a Negotiated Agreement). When evaluating technologies, don't forget the human cost, so consider your BATSHIT: Best Alternative To Shackling Humans In Tedium (or whatever expansion you prefer).

[2] https://www.php.net/

[3] https://upsun.com/blog/php-just-in-time-compiler/

reply
folkhack
5 hours ago
[-]
PHP devs: "hold my beer."
reply
skybrian
5 hours ago
[-]
Is there a Github repo for code associated with this book?
reply
pdubroy
5 hours ago
[-]
Yes, it can all be found here: https://github.com/wasmgroundup/code

Over the course of the book, we also build up a small library for creating Wasm modules and emitting bytecode; that's available as an NPM package (https://www.npmjs.com/package/@wasmgroundup/emit) and the code is here: https://github.com/wasmgroundup/emit

reply
James_K
3 hours ago
[-]
Personally, I learned Web Assembly by reading through the spec. Can't recommend it more. It's extremely well written.
reply
pdubroy
2 hours ago
[-]
I agree, it really is quite approachable.
reply
patrick4urcloud
5 hours ago
[-]
nice job
reply