Scaevolus 18 hours ago

The absolutely easiest way to write a JIT is to use Javascript and eval() (or "new Function()", which is just eval in a Java-shaped tuxedo). You can quite easily speed up little matching functions, especially arithmetic heavy ones, by just filling in some templates at runtime!

Here's an example used in PuzzleScript: https://github.com/increpare/PuzzleScript/blob/dc1e0fc979365...

  • hodgehog11 17 hours ago

    This is true, and is why I think Javascript is underrated for emulation.

    For example, this PSX emulator: https://github.com/kootstra-rene/enge-js

    It has decent compatibility and good speed. Furthermore, I challenge anyone to find a PSX emulator with fewer lines of code with competitive speed and accuracy. To my knowledge, this is by far the simplest such implementation, and is able to do this by taking advantage of Javascript JIT compilation.

    • mcosta 9 hours ago

      > To my knowledge, this is by far the simplest such implementation

      Are you taking into account the complexity of v8?

      • hodgehog11 5 hours ago

        No I do not, in the same way that I would not take into account the complexity of the Python interpreter for Python emulator projects or the compiler for C or Rust projects. I would also not take into account the complexity of Retroarch for libretro-based emulator cores, because all of the actual challenging parts that effectively document the console still remain.

        These are general-purpose tool chains. The real question is, using those tools, how easily can you make an emulator for a device with as much complexity as the PSX?

        • yjftsjthsd-h 46 minutes ago

          > in the same way that I would not take into account the complexity of the Python interpreter for Python emulator projects or the compiler for C or Rust projects.

          I'm less inclined to care about compile dependencies, but I think it's absolutely worth caring about how heavy of runtime dependencies you're pulling into your project.

mikepurvis 23 hours ago

I've always really enjoyed Andrew Kelley's article about trying to statically recompile NES code from 2013 [1]. Basically he makes a ton of progress but gets hung up not just on the realities of the handwritten assembler of the era just not being all that great at mapping to higher level LLVM IR. In the conclusion he specifically calls out a JIT-type methodology as probably being the way to go, where you live-recompile the hot paths when you have the runtime data required to actually understand them, and don't worry about the parts you can't.

Very cool to see something like that in action.

[1]: https://andrewkelley.me/post/jamulator.html

bawolff 22 hours ago

> Dolphin isn’t on iOS, because you can’t do JIT compilation on iOS....Well, Apple has one exception to its JIT restrictions: web browsers. JavaScriptCore, WebKit’s JS engine, uses JIT compilation for its higher-performance tiers. So, if a JS function is called enough times, eventually it’ll be optimised and compiled into native machine code. The same is true for WebAssembly.

I was wondering about the why of the headline, and this is a really interesting answer. Such a beautiful way to get around restrictions. I wonder how applicable it is to other projects.

dag100 1 day ago

This is an incredible project for an undergraduate. Very impressive. Interesting to note that Firefox is 25% slower than Chrome/Safari, I wonder why.

tancop 12 hours ago

> Apple has one exception to its JIT restrictions: web browsers

i wonder if they ever let native apps compile and run wasm directly instead of opening a browser window.

ahartmetz 1 day ago

Of course it beats a native interpreter. WASM overhead is about 20%, interpreter overhead is about 1000%.

What's cool here is to have a GameBoy JIT runtime at all.

  • grashalm 1 day ago

    It's two jits in total.

    • ahartmetz 21 hours ago

      True, but the WASM JIT is pretty low overhead because WASM seems to be a good design for what it needs to do. It's what I was referring to with the 20% overhead figure.

jcmfernandes 18 hours ago

Very cool! I did something similar using Dolphin and LLVM, 16 years ago during my masters, for a course on virtual machines. I compiled the interpreter to LLVM bitcode and then used it that to build basic blocks. It was super slow, but it worked, and I had lots of fun working on it.

milch 1 day ago

Very interesting article. Would've been fun to see the comparison between native interpreter & JIT-on-WASM on iOS as well

jhatemyjob 21 hours ago

The author's base assumption, and stated motivation for doing this project, is wrong.

https://github.com/StephenDev0/StikDebug

For an undergrad project, I suppose it's fine to conveniently forget about the existence of this solution for the sake of getting a good grade.

  • jrmg 21 hours ago

    It’s wrong ‘for sideloaded apps that have the get-task-allow entitlement.’

    It’s right for ‘regular’ apps.

  • saagarjha 20 hours ago

    I would not expect the average undergraduate to understand the intricacies of how iOS does dynamic codesigning enforcement. There are plenty of people who have graduated with advanced degrees and work at Apple who don't really understand how it works, either.

  • kmeisthax 15 hours ago

    In order to use this, you need another device to initiate a debugging session on the given process. This is fine for sideloading Dolphin using your developer credentials but is not an acceptable solution for other kinds of apps. Some people might not want their app to be debuggable by randos, and requiring a tether to kickstart the app - even if it's just another iPhone - is cumbersome and user-hostile.

    In contrast, spinning up a WebView works everywhere and App Review probably won't even notice or care what you're doing.

jonny_eh 1 day ago

So it's a JIT-in-JIT? JiJIT?

lightedman 23 hours ago

Still doesn't beat a natively-coded emulator. I got several that run faster on a 166MHz non-MMX Pentium than this emulator does on my Core Ultra i9.

  • anthk 12 hours ago

    On Mednafen I can speed up the emulator up to 4x while compiling c++ under an n270 netbook. With GCC, not Clang. Without compiling I might yield 16x speeds and more with ease.

iberator 1 day ago

yet on real old hardware it would be 20x slower in real life. same as all native javascript junk - its fast, but non usuable on older hardware

  • switchbak 1 day ago

    Good thing I'm not running games on my 4gb Pentium 4 then.

    • jonhohle 22 hours ago

      Your code running on other people’s hardware is a privilege. Treat it with respect.

      • saagarjha 20 hours ago

        You can also like not run the Gameboy emulator

  • qweqwe14 1 day ago

    Here's a nickel kid. Go buy yourself a real computer.

    • rixed 23 hours ago

      How much RAM would a nickel buy me?

      • wifipunk 21 hours ago

        based on the tracked average of $12.65/gb from rampricesusa you could get about 4mb of ddr5