[HN Gopher] Wasmer 2.0
___________________________________________________________________
Wasmer 2.0
Author : jeltz
Score : 193 points
Date : 2021-06-17 09:02 UTC (13 hours ago)
(HTM) web link (wasmer.io)
(TXT) w3m dump (wasmer.io)
| lenkite wrote:
| Can some one explain the difference between the Wasmer and
| Wasmtime projects ?
| arcatek wrote:
| - Not the same bakers (wasmtime is supported by the Bytecode
| Alliance nonprofit, which is behind the wasm specs, whereas
| wasmer is a startup)
|
| - Not the same implementations, so not the same optimizations
| performances everywhere (you can see that a bit like clang vs
| GCC).
|
| So which one to use depends on your tradeoffs. For me
| personally, I saw firsthand what an ecosystem tool could become
| once owned by a startup, and I would be very careful about this
| path.
|
| There are more technical comparisons here and there if you look
| a bit (for example in /r/rust).
| syrusakbary wrote:
| I'll not enter on the technical comparisons but more on the
| philosophical view of your comment.
|
| Somehow you are not wary of an organization that is 90%
| directed by one entity. It might be useful to know that 95%+
| of the code changes in wasmtime are by people working in
| Fastly.
|
| Google is the main pusher to Chrome, the fact that Google is
| a commercial entity doesn't make good or bad on how they move
| the ecosystem forward. It makes it more effective.
|
| I'm usually wary and careful when people advise for software
| and commercial value to be separated.
| arcatek wrote:
| > Somehow you are not wary of an organization that is 90%
| directed by one entity. It might be useful to know that
| 95%+ of the code changes in wasmtime are by people working
| in Fastly.
|
| I'm not overly worried about some companies investing more
| in communities than others, that's true, as long as there's
| some level of oversight (those 5% you mention).
|
| I also suspect that a lot of those Fastly employees you
| mention came after the Mozilla layoffs we heard about a
| year ago, which I think invalidates a bit your point as the
| responsibilities were then shared before being
| unfortunately moved in to Fastly in short notice. It makes
| sense it would take time to address that perfectly,
| considering the context.
|
| > Google is the main pusher to Chrome, the fact that Google
| is a commercial entity doesn't make good or bad on how they
| move the ecosystem forward. It makes it more effective.
|
| That's not a great example - Chrome famously pushes changes
| without any oversight, which leads to useless APIs in the
| best cases to downright harm to their users in the worsts.
| syrusakbary wrote:
| It's funny because the oversight in a startup is usually
| much bigger than in a big organization (the 5% mentioned
| is usually much, much bigger).
|
| Their success depends so much on community that if fails
| to deliver, it dies. Thus it usually listens much more
| carefully. While other big organizations don't have that
| issue (in fact, they can go on much bigger losses just to
| capture markets).
|
| What I wanted to showcase is that at the end, power
| (which usually means a stronger monetary input, which
| translates to how many people can work and experiment on
| new stuff) is what leads most of the changes, even if
| those changes are masked as organizations pushes or what
| not.
|
| And to reinforce, its great to see Fastly pushing forward
| and doubling down on WebAssembly. Same as is great seeing
| Google pushing forward on the W3C standards. The
| advancements doesn't make it good or bad per se just
| because it's lead by one organization or another. It's
| what is delivered what matters.
| follower wrote:
| > Somehow you are not wary of an organization that is 90%
| directed by one entity.
|
| _I 'm_ wary about building on a project from a company
| whose CEO doesn't disclose they have a pre-existing
| grievance with the Bytecode Alliance related to:
|
| 1) Attempting to trademark "WebAssembly";
|
| 2) Inappropriate behaviour.
|
| And who has previously:
|
| 3) Used sock-puppet accounts on HN in an attempt to Boost
| their project.
|
| All of which I learned as a result of reading this thread:
| https://news.ycombinator.com/item?id=24900186
| syrusakbary wrote:
| Being wary about one thing should not make you less wary
| about another, imho.
|
| In any case, context matters. I will be very happy the
| day that we no longer need gaslighting as a way to push
| certain projects or ideas forward :)
| cylon13 wrote:
| The impression that I get is that wasmer is more targeted
| towards people who want to embed a wasm runtime inside an
| existing application that they're building, whereas wasmtime is
| more meant to be used as a standalone program that runs WASI
| binaries directly. I think both projects support both use
| cases, but they seem to be geared that way.
| mamcx wrote:
| ASIDE:
|
| Any suggestion for ways to generate programatically with Rust?
|
| https://www.reddit.com/r/rust/comments/nvxh12/for_building_a...
| gpm wrote:
| For what it's worth, I spent a bit of time setting up
| assemblyscript (basically typescript) compilation driven by a
| rust program (with the actual compilation happening in a js vm)
| not too long ago for an (unpublished) side project.
|
| If that's something you'd be interested in I could see about
| reviving it and refactoring it out, or you could probably do
| the same from scratch, but it is a bit janky, and it sounds
| like you really want a backend for a homegrown compiler not an
| entire compiler.
|
| I also think you _might_ be able to use cranelift as the sort
| of backend you are looking for, but I haven 't tried.
| hardwaregeek wrote:
| Walrus is great although because it was intended for editing
| existing WASM binaries and not being a WASM compiler backend,
| it has some limitations. For instance it can't easily generate
| recursive functions cause you need the function id before
| generating the function body and that's not easy in Walrus.
| matheuss-leonel wrote:
| Its just me or it seems that Java is being reinvented again? With
| improvements, off course, but the whole thing looks like just
| another virtual machine, but this time directly connected to the
| web.
|
| Everything old, is new again...
| [deleted]
| mden wrote:
| Even if that's the case, it doesn't explain why that's bad?
| Generally that's how progress is made, exceedingly rare is the
| core of an idea original.
| matheuss-leonel wrote:
| Yes, I agree with you. Its not bad, its just "curious" how
| things evolve
| mbStavola wrote:
| Not really.
|
| The JVM and JVM bytecode was written with Java in mind, whereas
| WASM wasn't designed for a single language.
| mattgreenrocks wrote:
| Congrats to the team, looks like some more fun things to play
| with!
|
| > [floating point math is faster] thanks to optimal management of
| NaNs
|
| Curious what's involved here if someone from the team can chime
| in.
| syrusakbary wrote:
| Handling NaNs (Not a Number, usually referring to operations
| that trigger non arithmetic numbers, such as 0/0) was not
| optimally handled by Wasmer LLVM compiler.
|
| We had a custom NaN "canonicalizer" that was always
| canonicalizing NaNs (that means: making sure the NaN bits were
| always the same in any chipset) regardless of use case and
| need. We took a look on how other runtimes were doing it more
| optimally and realized we could use LLVM intrinsic calls for
| math operations so LLVM would handle it directly.
|
| If you are curious about the tech details, here's the PR!
| https://github.com/wasmerio/wasmer/pull/2161
| tgb wrote:
| > NaNs (Not a Number, usually referring to positive/negative
| Infinite values in floats and integers)
|
| Huh? This sounds totally incorrect to me.
| syrusakbary wrote:
| Sorry about that! I was trying to explain it so people with
| little understanding could see how NaNs are
| handled/generated in a Wasm context (for example: 0/0 will
| trigger a NaN), but it's true that Infinite and NaNs are
| not the same. I'll correct my comment :)
| simooooo wrote:
| Read the site, still don't know what it is
| puohufgh wrote:
| Quick question about Wasmer and C programming: can I use Wasmer
| to compile a simple Hello World C program only once and then run
| this program on all supported architectures like I can use
| Cordova with Javascript to do the same?
|
| Quickly exploring the wasmer-c-api examples just now[1], this
| does not appear to be the case: I get the impression one must
| write a bunch of high-friction boilerplate code to
| load/unload/configure/run wasm in order to do a simple hello
| world program. I have recently converted from being a C
| programmer to a Javascript programmer because I just can't deal
| with complicated C build systems and cross-compiling anymore:
| CMake, Gradle, etc. I spend more time trying to get a dependency
| to compile and learning the CMake language than I do actually
| solving my problem. People say "Electron is cancer" but at least
| I can get Cordova quickly working to ship an app for
| Windows/Mac/Linux/Android/iOS. I'd love to go back to
| lightweight, fast C programs though if I had the option. I tried
| using SDL2 but many of the examples will run fine on one platform
| but then fail to run on a different platform (say iOS or Android)
| and as a lone indie dev I don't have the time to investigate such
| issues. (I tried and managed to fix a few broken builds, but grew
| frustrated and gave up.) Cordova with Javascript so far is the
| only thing I've tried that just works for universal cross-
| platform dev.
|
| [1] https://github.com/wasmerio/wasmer-c-api
| jedisct1 wrote:
| The easiest way to compile C code to WebAssembly is by using
| Zig (https://ziglang.org): zig cc -target=wasm32-wasi and
| you're done. Nothing else to install. It is equally easy to
| cross-compile to another platform, against without installing
| anything else.
| puohufgh wrote:
| Thanks! I see that Zig is much more than just a programming
| language then; it has its own C compiler that addresses much
| of the toil of cross compiling C code.
| rad_gruchalski wrote:
| Looks awesome. Any examples for calling host golang functions?
| syrusakbary wrote:
| I'd recommend to check Wasmer Go integration [1].
|
| More specifically, here's how you can call Go host functions:
| https://github.com/wasmerio/wasmer-go/blob/master/examples/e...
|
| [1] https://github.com/wasmerio/wasmer-go
| irq-1 wrote:
| NB: there's no passing strings to/from the wasm vm.
| rad_gruchalski wrote:
| But byte arrays would work?
| hardwaregeek wrote:
| I'm very curious why Wasmer 2.0 can't deserialize modules that
| are serialized by Wasmer 1.0. Are they serializing to a non-spec
| complaint format? Are there extra custom sections that Wasmer 2.0
| expects? This seems like a relatively small problem but I'm
| curious why it's there.
| syrusakbary wrote:
| We use a custom serializer for serializing the metadata related
| to the WebAssembly module and other compilation information. We
| changed the serialization mechanism to speed up startup speed
| and with that the incompatibility came.
| cylon13 wrote:
| Awesome, I just upgraded our project! We're using wasmer in a
| browser-based multiplayer game in order to get cross-platform
| floating point determinism so we can send only input packets over
| the wire confidently without worrying about state drift. The
| client and server run the exact same wasm bundle instead of just
| being compiled from the same source, and the wasm spec guarantees
| that as long as you don't touch NaN and stick to one thread,
| you'll get the same results in any runtime [1].
|
| [1]
| https://github.com/WebAssembly/design/blob/main/Nondetermini...
| jacobolus wrote:
| > _as long as you don 't touch NaN_
|
| Note: this says NaNs one place will be NaNs everywhere, just
| the precise choice of NaN bit pattern is unspecified.
|
| So there is no issue "touching NaN"; the issue would be trying
| to pack some additional information into the fraction bits of
| the NaN, and expecting every implementation to treat it the
| same.
| cylon13 wrote:
| Yeah, that's a good point actually.
| astlouis44 wrote:
| Interested in hearing more about your browser game. Another dev
| and I are working on a next gen HTML5 gaming platform using
| WebGL/WASM, and we're looking to back developers creating
| interesting titles. We provide access to our suite of devtools
| for optimizingprojects for the browser, and deploying on our
| platform.
|
| Link to our Discord if you're interested in discussing this
| further: https://discord.gg/zUSZ3T8
| wiqar wrote:
| Hi, I'm Wiqar, product manager for Wasmer. We would love to
| hear more about your application and use case. Is the app in
| production?
| cylon13 wrote:
| The game using Wasmer is currently fairly early in
| development, but we have a few games in production built
| using various technologies, with the most recent one that I
| worked on done entirely in typescript. Both this previous
| game and the upcoming game are fast-paced action games. As
| much as I enjoy typescript, there are lots of annoying things
| that crop up in game dev in particular with regards to memory
| management, such as needing to pool instances of small
| classes, etc, so I figured it's time to switch to rust+wasm
| since the ecosystem seems mature enough now for it and Rust
| is a joy to program in.
|
| The architecture of the games are such that the main game
| logic runs both on the client and the server. The server runs
| the logic to provide the authoritative game state and send it
| out to all the clients, and the clients run the logic to
| predict where they're going to be immediately after you press
| an input to compensate for the network latency. Since the
| client is predicting what will happen using the same code
| paths, the game logic need to be completely deterministic so
| that it desynchronizes from the server as little as possible.
|
| With the TS/JS game we essentially just hope that running the
| same JS bundle in node and any client browser produces the
| same results for all the collision/gameplay math, and it
| seems to luckily not cause us any problems. For the game in
| rust though, compiled and optimized native rust floating
| point math would drift from our client webassembly builds
| surprisingly quickly, so we decided to pack all the shared
| logic in to a wasm bundle that gets loaded on both the server
| and the client, and we're using Wasmer to do that :)
|
| The Wasmer API is super ergonomic and it's been a pleasure to
| work with. I think the only thing that would make our lives
| better that I can think of is being able to ignore imports
| and have them auto-bind to noop functions or functions that
| immediately return zero in the case of non-void imports.
| Since we're using the same wasm bundle for the client and
| server, there's a bunch of client-only rendering bindings
| that we just ignore and never call from the server-only and
| shared wasm code in the bundle, and currently we're using a
| hacky script that uses wasm-objdump to generate a rust module
| with a bunch of noops in imports!{}.
| kiliancs wrote:
| Congrats on the release and thanks for the detailed post. I
| thought I'd share that, reading through it, I found that the 3D
| in the charts made them harder to read. You can still figure it
| out, but it's harder to understand at a glance.
| methyl wrote:
| > If you're new to the Wasmer community, you'll be delighted with
| the incredible performance that you can achieve with Wasmer 2.0,
| bringing your Wasm programs and libraries very close to native
| speeds.
|
| Is there any set of benchmarks comparing Wasmer to native at a
| larger scale, real-life based examples?
| jedisct1 wrote:
| https://00f.net/2021/02/22/webassembly-runtimes-benchmarks/
|
| A new round will be made soon.
| the_duke wrote:
| Suggestion: add Deno for the next round. [1]
|
| It would also be great to have a benchmark in there that
| measures host <-> guest interaction with lots of guest ->
| host and host -> guest calls.
|
| [1] https://deno.land/manual/getting_started/webassembly
| jedisct1 wrote:
| That's a good idea, thanks!
|
| Deno is using the V8 engine, so is the performance expected
| to differ from Node?
|
| Probably not but there's one way to find out
| the_duke wrote:
| Probably not, no. It would just be interesting to see if
| the wrapper code makes a difference.
|
| I actually started working on a benchmark suite for
| various runtimes a while ago. I didn't get too far in,
| maybe you'd like to collaborate?
|
| As wasm grows it would be great to have a comprehensive
| set of benchmarks to refer to.
|
| Especially also for things that are unique to
| Webassembly, like reference types, cross calls, module
| instantiation time, ...
| zzyzxd wrote:
| > Can't wait to try it? Go ahead!
|
| > curl https://get.wasmer.io -sSfL | sh
|
| No, thanks.
|
| I looked at the docs and running this shell script from internet
| is the only mentioned installation method.
|
| Then I took a look at the script, it only supports bash, zsh and
| fish and will try to inject stuff in my shell config, add a new
| executable directory, and download and run an executable without
| even verify file checksum
| syrusakbary wrote:
| There are also more ways to install Wasmer!
|
| You can use cargo (it will compile from source):
| cargo install wasmer-cli --features singlepass,cranelift
|
| Or a package manager: brew install wasmer
|
| You can check all available methods here. Hope this helps!
|
| https://github.com/wasmerio/wasmer-install#install-via-packa...
| zzyzxd wrote:
| I am sure there are many ways to install it securely. But why
| aren't any of them mentioned in the documentation? Besides
| searching the entire github organization, how can people
| discover these alternative installation methods?
| syrusakbary wrote:
| We showcase them already on the main repo (see other
| installation options):
| https://github.com/wasmerio/wasmer#install
|
| Do you think it will be useful to be showcased more
| prominently somewhere else?
| dlojudice wrote:
| I didn't know SIMD was supported in WASM spec. Is it custom
| binary or they've improved WASM?
| Lev1a wrote:
| You can see "Standardized features" and "In-progress proposals"
| in this table here: https://webassembly.org/roadmap/
| espadrine wrote:
| The SIMD proposal is in stage 4. It is released in V8, and
| behind a flag in Firefox.
|
| https://v8.dev/features/simd
| CryZe wrote:
| It is also released in Firefox (x86 only, ARM is in the next
| release iirc)
| devwastaken wrote:
| It's a spec in addition to the initial we assembly spec. It's
| supported by clang/llvm, V8, firefox, and some standalone
| runtimes like wasmer.
|
| SIMD for wasm is all 128bit operations. I've been working with
| it and so far it works pretty fast, but there's missing support
| for some operations. Namely lack of support for
| saturation/truncation operations.
| [deleted]
| xstefen wrote:
| This entire thing reads like a UltronBrowser commercial
___________________________________________________________________
(page generated 2021-06-17 23:01 UTC)