[HN Gopher] Show HN: I spent my vacation writing a modern JVM as...
       ___________________________________________________________________
        
       Show HN: I spent my vacation writing a modern JVM assembler
        
       Author : noone_youknow
       Score  : 113 points
       Date   : 2022-06-02 19:40 UTC (3 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | tornadofart wrote:
       | Impressive
        
         | noone_youknow wrote:
         | Thanks :)
        
       | noone_youknow wrote:
       | I had a lot of fun doing this, and along the way I learned a lot
       | about writing Gradle and IntelliJ plugins, and I hope others
       | might find this fun too :)
        
       | jpgvm wrote:
       | This is awesome.
       | 
       | I have been toying with writing my own little JVM language (for
       | education purposes) and this could go a long way to making that a
       | bunch easier.
       | 
       | Thanks for sharing!
        
         | hashmash wrote:
         | For the code generation phase, it might be easier to bypass
         | emitting a text-based assembly format and just use the ASM
         | library directly. If you want something easier, I wrote a code
         | generation library specifically for that purpose:
         | https://github.com/cojen/Maker It also includes an example
         | "Mini-C" language compiler.
        
         | noone_youknow wrote:
         | Awesome! I started this for educational purposes too, but if it
         | turns out to be useful then I'll be very happy! Hope it turns
         | out that way (and let me know if there's anything else you need
         | to make it useful! :) )
        
         | kjeetgill wrote:
         | If you haven't heard of it already check out Truffle/graalvm
        
           | jpgvm wrote:
           | I have but Truffle was a bit further than I wanted to go for
           | now. If I wanted to build a production ready language it
           | would likely be my first choice though.
        
         | [deleted]
        
       | donsupreme wrote:
       | Bravo! you and I have very different way to decompress during a
       | vacation
        
         | noone_youknow wrote:
         | Haha yes, I'll admit there are probably better ways to
         | decompress :D
        
       | pdpi wrote:
       | I implemented a .class disassembler a while back by literally
       | reading the spec. It's surprisingly accessible.
        
         | noone_youknow wrote:
         | It really is. We've Sun to thank for that I think.
        
         | shrimpx wrote:
         | I built a .class interpreter for a college course (minus
         | reflection features). It was a ton of fun and ultimately
         | straightforward and simple.
        
       | dvt wrote:
       | Very cool! Reminds me of a little toy (and very unfinished)
       | project I worked on almost a decade ago (jeez, can't believe it's
       | been that long): https://github.com/dvx/jssembly
       | 
       | Even our syntax is somewhat similar, though you're using plugins
       | for cleaner code which is an awesome idea.
        
         | noone_youknow wrote:
         | Awesome, I'm gonna have to take a good look at your project,
         | it's very interesting! Thanks :)
        
       | recursivedoubts wrote:
       | amazing!
       | 
       | I will definitely discuss this in my compilers class, which
       | targets JVM bytecode as a back end!
        
         | noone_youknow wrote:
         | Awesome, thanks! Would love to hear if it turns out to be
         | interesting (or maybe even useful!)
        
       | tstack wrote:
       | I used to use jasmin to generate invalid code to test an old JVM.
       | I assume this has the same relaxed attitude that will let you
       | generate invalid code?
        
         | noone_youknow wrote:
         | It sure will, as an assembler it only does the bare minimum of
         | validation, so you should totally be able to generate "dodgy"
         | code and see if it works on older JVMs :)
        
       | ElijahLynn wrote:
       | These are the type of posts that make some of us noobs feel like
       | imposters, lol. (been coding webstack-ish for 10 years, fwiw,
       | can't even begin to write an assembler though :shrug:)
       | 
       | Good on you though, we need inspiration too! And you definitely
       | should feel great about pulling that off! I am imaging it must
       | have been some really fantastic "flow" time! How did you feel
       | while writing it? Did you have family or friend distractions? Did
       | you feel super focused? What is that story?
       | 
       | What are some of your focus patterns that you have identified?
       | What gets you motivated when you feel stuck?
        
         | brailsafe wrote:
         | If you had the skill and wherewithal to do something like this,
         | would you want to spend vacation doing it? I think it's neat,
         | but I'd probably want to get the hell away from my screen
        
         | [deleted]
        
       | cbm-vic-20 wrote:
       | "Let's just get this out of the way, shall we?
       | 
       | {code here} "
       | 
       | Thanks for doing that; I can't stand it when I go to a site for
       | something new and can't find what it actually looks like without
       | digging around.
        
         | [deleted]
        
         | noone_youknow wrote:
         | I couldn't agree more, I'm a big fan of "show me the code"
         | myself.
        
       | Strs2FillMyDrms wrote:
       | My question (if I may), When people say the bytecode is "platform
       | independent" I ask, exactly what platform is it being freed from?
       | 
       | The compiler? The "cloud"?
       | 
       | And this goes back to my lack of understanding of what
       | "publishing" a package means to Oracle and the ecosystem in
       | general.
       | 
       | If I publish something on Maven, my guess is that it is
       | transformed into bytecode directly, so that when I pull my
       | package from a diff device the code can run. In this case if the
       | entire "internet" collapses then the only way to run my code
       | would be a flashdrive with the .java file run via a compiler...
       | unless there is a machine that has the JVM installed WITHOUT the
       | compiler... THEN the bytecode is useful... Am I correct?
        
         | wrs wrote:
         | It is independent of the processor architecture, and to a large
         | extent the operating system. (As opposed to an ordinary binary
         | executable, which depends on both.)
         | 
         | The compiler turns Java source into bytecode. The JVM runs the
         | bytecode. The JVM doesn't need the compiler to run.
        
           | Strs2FillMyDrms wrote:
           | Thanks for your response.
           | 
           | What I get from this is that the processor arch. Is dictated
           | by the compiler at compile time, and by writing to bytecode
           | directly we are skipping this.
           | 
           | I thought the proc. arch. was established by the manufacturer
           | and was unavoidably implemented by the jni at runtime...
           | unless there is an interface on top of the jn-interface to
           | deal with the proc. But it seems absurd... why do this at
           | compile time?
        
       | playing_colours wrote:
       | Can anyone recommend a good source (book, articles) to learn Java
       | Bytecode?
        
         | noone_youknow wrote:
         | There's a "cookbook" document in the repo, but it's not very
         | comprehensive - I'd be more than happy to take PRs :)
         | https://github.com/roscopeco/jasm/blob/develop/docs/cookbook...
        
         | jfengel wrote:
         | There's a very old but still pretty effective book called
         | Programming for the Java Virtual Machine. Byte code is
         | remarkably stable.
         | 
         | (Disclaimer: author)
        
         | topbanana wrote:
         | https://docs.oracle.com/javase/specs/jvms/se17/html/index.ht...
         | 
         | and for .Net CIL https://www.ecma-
         | international.org/publications-and-standard...
        
         | rzzzt wrote:
         | The JVM spec is a bit dry but readable:
         | https://docs.oracle.com/javase/specs/jvms/se17/html/index.ht...
        
       | oh_sigh wrote:
       | I enjoyed reading about doing some things with the jvm which are
       | not possible through the java language - can anyone recommend a
       | page that goes further into that concept?
        
       | eternalban wrote:
       | ...         checkcast java/lang/String         areturn
       | 
       | Looks like a typo.
        
         | newobj wrote:
         | no, areturn is a jvm opcode.
        
           | eternalban wrote:
           | ah. TIL.
        
       ___________________________________________________________________
       (page generated 2022-06-02 23:00 UTC)