Hacker News new | past | comments | ask | show | jobs | submit login
RISC-V 64-bit Linux in JavaScript (bellard.org)
98 points by mbroncano on Jan 21, 2017 | hide | past | favorite | 22 comments



This was discussed last month. https://news.ycombinator.com/item?id=13210711


Except this is the JavaScript version.


Which was already available at that time, as you can see some commenters discussing it in that story.


Wow, I'm running Linux on top of RISC-V in an emulator in my browser on my phone!


Babel tower reemerges from the memories of Boole


Our hubris will be our undoing.



Silly question, but is there an x86 instruction set emulator written in JavaScript? Not even Linux, just something that takes x86 instructions into a "virtual CPU" and lets you run the assembly statements?


Yep, v86 [0] is what you're looking for!

There's even a demo with Linux 3. [1]

[0] https://github.com/copy/v86 [1] https://copy.sh/v86/?profile=linux3


Not a silly question at all. I would also like to know this. Would be a fun way to play around with assembly without the need of a tool chain etc. Maybe even on your phone while on the train. If this doesn't exist already, I'd be happy to start working on something like this.


You could probably start from here: x86 Linux running in a web browser, also by Fabrice Bellard. http://bellard.org/jslinux/


Well, each and every PC emulator implemented in Javascript contains an x86 instruction emulator.

For example: http://copy.sh/v86/

And many others...


So, how do you do 64-bit arithmetic in JavaScript? Emulate with two 32-bit number? Won't that be a huge performance bottleneck, one that cannot be optimized by JIT?


Yes, you emulate them with 32-bit numbers. It is a huge performance bottleneck if you do it naively, which most compile-to-JS languages that support 64-bit integers do. Emscripten even has a flag to let you choose between correct-but-slow 64-bit integers and fast-but-incorrect (drops to 53 bits).

It is possible to get fast longs in JS, though, if you push your optimizer far enough. This is what we have done in Scala.js. I wrote a paper about this, but it is still under submission so I cannot disclose it just yet. However, I can point to the implementation:

* The user-land implementation of `Long`s in Scala.js: https://github.com/scala-js/scala-js/blob/master/library/src...

* The PR that made the performance breakthrough in the optimizer, by stack-allocating all instances of `RuntimeLong`: https://github.com/scala-js/scala-js/pull/2488


I just had to look this up, the limitation is that JS has a max int of 2^53?

Do you know what the reasons were for JS not implementing full 2^64?

Also I noticed theres a JS C-types that has 64 bit ints, would that not help here?


All numbers in Javascript are IEEE 754 64-bit double precision floating point numbers. The significand precision is 53 bits (see here https://en.wikipedia.org/wiki/Double-precision_floating-poin...).


Thanks for the clarifications.


Re ctypes, I assume you are talking about https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes. On that page you can read:

> js-ctypes is only available from chrome code; that is, ctypes is not available to websites, only application and extension code.

Basically `js-ctypes` won't work in an actual browser. So you cannot use it. There are other Node.js-specific native packages that give a representation for 64-bit integers, but not arithmetic operations. Besides, even if they had arithmetic operations, they would be heap-allocated, and since the JIT cannot understand them, it would not be able to optimize them as well as what we built for Scala.js.


  ~# date

  Thu Jan 1 00:03:09 UTC 1970


Tangentially related this is a great talk about RISC-V architecture:

https://www.youtube.com/watch?v=vB0FC1DZqUM&feature=youtu.be


Architeture doesn't have kernel memory protection? Seems risky...


There is a specification of privileged extensions, I think it was stabilised fairly recently:

https://people.eecs.berkeley.edu/~krste/papers/riscv-priv-sp...

The rocket chip generator https://github.com/ucb-bar/rocket-chip and boom both have support for it, as far as I know.




Consider applying for YC's Spring batch! Applications are open till Feb 11.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: