How is Erlang/OTP Runtime compared to ChromeV8/NodeJS?

If any of you knows a resource (website, docs, articles) where I can access to see a comparison of how both of these ecosystems works, it would be great.

Delving into NodeJS a bit, I feel like there is a lot of similarities:

  1. npm <-> hex
  2. Chrome V8 (Javascript -> C++ -> machine code) <-> Erlang Runtime (Elixir -> Erlang -> machine code)
  3. As far as my research can tell both ecosystems can run asynchronous code but would love to read more resources about this topic if exists.
  4. NodeJS speed depends on asynchronous processing whereas Erlang depends on ultra lightweight synchronous processing (optionally asynchronous).

One thing I am trying to get my head around is a missing layer. NodeJS is not a framework, but isn’t it doing a lot of the work that a phoenix web server is doing, or is it more fair to compare Elixir with NodeJS and Phoenix with ExpressJS?

The purpose of the comparison is not to see what is superior as obviously the use cases may be different, but it’s more like to understand where they are similar and where they are different. I am just brainstorming with you!

Chrome V8 doesn’t goes from javascript to C++ to machine code. It compiles directly to machine code according to the wikipedia.

As far as my research can tell both ecosystems can run asynchronous code but would love to read more resources about this topic if exists.

NodeJS runs on one giant event loop last time I check. I believe there is a threading library API over yonder. So the programmers themselves are doing to “thread logic” when they do async stuff and catching all those error and weird logic cases.

Erlang you can just create bunch of Erlang’s processes. The whole concurrency concept is built into the language unlike Javascript so it’s pretty nice to write logic in Erlang/Elixir. The actor model that Erlang/Elixir uses is imo easier to reason with and easier to mentally model than NodeJS async style. But then again you’re asking in an Elixir forum…

One thing I am trying to get my head around is a missing layer. NodeJS is not a framework, but isn’t it doing a lot of the work that a phoenix web server is doing, or is it more fair to compare Elixir with NodeJS and Phoenix with ExpressJS?

NodeJS is just this technology that enable programmer to do javascript backend using V8. It also push for this async style concurrency paradigm.

You can compare Javascript to Elixir (they’re both languages).

Phoenix to ExpressJS (web framework).

NodeJS’s concurrency model (Async) to Elixir/Erlang’s concurrency model (Actor Model).

V8 vs BEAM VM I guess.

You can read about Erlang/Elixir’s VM here: http://ds.cs.ut.ee/courses/course-files/To303nis%20Pool%20.pdf

It’s a paper what makes Erlang’s VM unique and why it’s suited for concurrency.


For an overview of Erlang’s/Elixir’s Concurrency model try this:

https://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency

6 Likes

As it was said earlier V8 do not translate JS to C++ but rather uses its’ own internal representation that then is converted to the machine code. This is called JIT.

This isn’t true either, at least not in general case. IIRC Erlang do not have JIT compiler right now (but there is work in progress to allow that) and it always interpreted intermediate language which is low-level description of instructions, something like WASM. However there is HiPE compiler that is ahead-of-time compiler of Erlang code to native code which enables performance boost but with cost (barrier between HiPE and non-HiPE code is slow and it disables few Erlang features).

Node/V8 cannot process data in parallel within single VM instance, BEAM does that natively. It is worth remembering that Node/V8 is single-threaded environment that runs big event loop (kqueue/epool/etc.).

Yes, in Node everything depends how few cycles you spend in the JS and instead you will allow everything to spend in wait. BEAM in that manner do not care that much as it allows you to run things in parallel when possible.


Comparison to be fair should be made between:

  • V8/NodeJS vs BEAM as an virtual machine - and to make it even more fair it should be Nx NodeJS + IPC (where N is the amount of CPU cores available) vs BEAM, or NodeJS vs BEAM with 1 scheduler enabled.
  • Elixir vs JavaScript/NodeJS - as a language and a “standard library”
  • Phoenix vs ExpressJS/whatever other web framework there is
5 Likes

Wow, this topic seems more complex than I thought, but I am thankful for all your detailed responses!

1 Like