[HN Gopher] Natalie: An early-stage Ruby implementation that com...
       ___________________________________________________________________
        
       Natalie: An early-stage Ruby implementation that compiles to C++
        
       Author : ksec
       Score  : 69 points
       Date   : 2021-12-23 11:37 UTC (11 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | netule wrote:
       | I'm genuinely curious: why would I use this over something like
       | Crystal, which is pretty much Ruby, but native?
       | 
       | https://crystal-lang.org/
        
         | pjmlp wrote:
         | Ideally, access to the existing Ruby ecosystem.
         | 
         | Crystal makes sense in the context of writing stuff from
         | scratch or wanting to contribute to the ecosystem.
        
           | 999900000999 wrote:
           | I sincerely doubt a tool like this will give you access to
           | the full Ruby ecosystem.
           | 
           | I definitely love the idea though, I struggle with lower
           | level languages, although I consider myself fairly decent
           | with both Python and JavaScript.
        
             | pjmlp wrote:
             | This one in particular probably not, since it is in early
             | stages.
             | 
             | RubyMotion on the contrary is quite advanced and an AOT
             | compiler to go to, when one wants to use Ruby for mobile
             | development.
             | 
             | http://www.rubymotion.com/
        
               | _3u10 wrote:
               | RubyMotion is probably as good as it gets for AOT. Ruby
               | depends on dynamic dispatch and thankfully objc is very
               | similar the needs of a Ruby-like language.
               | 
               | Truffle might work even better as it's able to recompile.
               | 
               | Any C++ port will likely need to reimplement half of the
               | objc runtime to support all of Ruby. Not sure if
               | clangs/gcc objc support includes the runtime, but I'm
               | imagining it would... so maybe it's reusable that way.
        
               | cmer wrote:
               | Is RubyMotion something we can actually use to build non-
               | toy apps in 2021? I thought it was dead, but perhaps it
               | is not!
        
         | chrisseaton wrote:
         | > which is pretty much Ruby
         | 
         | Crystal looks similar, but really has very different semantics,
         | and so can't run existing Ruby.
        
           | ksec wrote:
           | I was going to suggest adding Natalie to Ruby Compiler List
           | [1], turns out Natalie is already on the list and started in
           | 2019!
           | 
           | [1]https://ruby-compilers.com
        
             | chrisseaton wrote:
             | Yeah I need to do the deep dive on it!
        
         | vidarh wrote:
         | Crystal is _superficially similar_ but it pretty much ends
         | there, and many off the differences feels pretty arbitrary.
        
       | adamrt wrote:
       | Andreas Kling (of SerenityOS) recently did a Natalie contribution
       | video that I found interesting.
       | https://www.youtube.com/watch?v=b4PZgvPYkP4
        
         | akling wrote:
         | And if you'd like to see Tim (original author of Natalie)
         | working on Natalie, he has a YouTube channel with lots of great
         | content here:
         | https://www.youtube.com/channel/UCgWip0vxtqu34rZrFeCpUow :^)
        
       | ModernMech wrote:
       | I'm a little confused about this project. I'm trying to build the
       | most complete list of programming languages out there (currently
       | working on it via my favorites, it you want to have a look), and
       | I'm trying to figure out if this qualifies.
       | 
       | Usually it's pretty easy to get on my list: if you call your
       | project a language I add it to the list.
       | 
       | But this one gives me a little pause, because it seems like this
       | language is not distinct from Ruby at all. Rather this is a
       | straight up Ruby -> C++.
       | 
       | Is it fair to call this a language rather than a compiler? To me,
       | a language is more than syntax and semantics, but includes an
       | library ecosystem, tooling, and community. Does Natalie aim to
       | grow a community, or will it exist fully within the Rudy
       | ecosystem?
        
         | pmontra wrote:
         | In the JavaScript world this would be called a transpiler.
         | Instead of compiling a newer version of JS into an older one
         | this compiles Ruby in a totally different language, C++.
         | However the Ruby interpreter (MRI) is written in C so C++ is
         | less far away from it than, let's say, Java. I didn't check the
         | code but I wonder if they inlined some code from MRI.
        
         | alekq wrote:
         | It is Ruby implementation if I got it right, not a Ruby-like
         | language.
         | 
         | Not the first and probably not the last one (jRuby, Rubinius,
         | MacRuby etc.).
        
         | chrisseaton wrote:
         | > because it seems like this language is not distinct from Ruby
         | at all
         | 
         | I don't think it claims to be - it's a compiler for Ruby.
        
           | ModernMech wrote:
           | The domain is Natalie-lang.org and the header on that page is
           | "Natalie Programming Language", so that's where I'm a little
           | confused. Maybe the goal isn't to be a Ruby compiler but to
           | transition into something more, so I was wondering if anyone
           | had any idea.
        
         | saghm wrote:
         | This isn't the first time something like this has been done;
         | for a while Facebook used a PHP to C++ compiler before
         | switching to compiling it directly to native code via a JIT:
         | 
         | https://en.wikipedia.org/wiki/HipHop_for_PHP
         | https://en.wikipedia.org/wiki/HHVM
        
       | sitkack wrote:
       | This is cool, it looks conceptually similar to Shedskin. A Python
       | to C++ compiler.
       | 
       | https://shedskin.github.io/
        
       | racl101 wrote:
       | Ugh, these names.
        
       | turbinerneiter wrote:
       | I always wonder why you would target another language with your
       | compiler, instead of an IR.
       | 
       | What is the benefit of transpiling to C++ over using LLVM?
       | 
       | (not meant as a criticism, genuinely curious)
        
         | pjmlp wrote:
         | It is easier to deal with, going one step further requires
         | dealing with more low level coding and can be demotivating for
         | some.
         | 
         | However I would advise to target an IR instead.
         | 
         | Doesn't need to be LLVM, if the purpose is only learning about
         | compilers, do as follows:
         | 
         | 1 - Create an IR, preferably stack based as they are quite easy
         | to target
         | 
         | 2 - Basic IR interpreter for testing the workflow
         | 
         | 3 - With a macro assembler, convert the IR into machine code in
         | a dumb way
         | 
         | Now you have a workable compiler, even if it won't win any
         | prizes.
         | 
         | If still interesting, then proceed to improve the code
         | generation in a proper way.
        
           | sitkack wrote:
           | Ribbit is an R4RS implementation that is extremely compact.
           | The video is only 15 minutes and worth a watch.
           | 
           | https://github.com/udem-dlteam/ribbit
           | 
           | https://www.iro.umontreal.ca/~feeley/papers/YvonFeeleyVMIL21.
           | ..
           | 
           | https://www.youtube.com/watch?v=A3r0cYRwrSs
        
             | pjmlp wrote:
             | Thanks for sharing.
        
         | afranchuk wrote:
         | "It depends", as always :)
         | 
         | Some people may do it because it's more approachable to them
         | (and/or others). Others may have language models/runtimes that
         | align closely with the target language. Or they may want to
         | "stand on the shoulders of giants", benefiting from the higher-
         | level optimizations of the target language. Also, for example,
         | LLVM still doesn't target as many architectures as gcc (though
         | I'm not saying that's necessarily very relevant for most
         | users).
         | 
         | That's just what comes to mind. I can't say for certain
         | anything about this particular language though!
        
         | sesuximo wrote:
         | One reason is that c++ is a stable "api" whereas llvm ir is a
         | somewhat moving target
        
         | rurban wrote:
         | Most importantly you get immediate startup. No need to parse
         | and compile. Then you'll also need less memory.
         | 
         | And third and less important you can add more expensive offline
         | optimizations, which are too heavy at run-time. Like escape
         | analysis, and inlining.
         | 
         | Esp for the static parts. The dynamic parts just call into the
         | shared ruby runtime.
        
           | chrisseaton wrote:
           | > Most importantly you get immediate startup. No need to
           | parse and compile.
           | 
           | Compiling to an IR doesn't mean 'and then interpret or JIT
           | it'. Can can use an IR to compile to native. GCC, Clang, Rust
           | etc all an IR, for example.
        
       | kdasme wrote:
       | I was under impression this can already be achieved via
       | TruffleRuby compilation into a native image? Not that I used it,
       | but thought this is doable, and the process is well tested.
        
       | tambre wrote:
       | autconf in 2021 instead of something more humane like CMake,
       | Meson, Bazel, build2. Why?
        
         | whyareyoul wrote:
         | Whys it matter? Its solid, exists everywhere and works and
         | contributors dont have to learn $buildsystem of the month
        
       ___________________________________________________________________
       (page generated 2021-12-23 23:00 UTC)