[HN Gopher] Oxidizing OCaml: Locality
       ___________________________________________________________________
        
       Oxidizing OCaml: Locality
        
       Author : amatheus
       Score  : 173 points
       Date   : 2023-05-27 13:46 UTC (9 hours ago)
        
 (HTM) web link (blog.janestreet.com)
 (TXT) w3m dump (blog.janestreet.com)
        
       | Decabytes wrote:
       | Is Ocaml actually good or is it a meme that people use it and
       | become obsessed with it. How is the transition if you mostly code
       | imperatively? Are there things that are not ergonomic for it to
       | do like GUIs or games?
        
         | xixixao wrote:
         | Nowadays my primary concern is readability and
         | understandability. Thrown into a codebase, can I understand
         | what's going on?
         | 
         | OCaml (which at FB was used to write the Flow typechecker and
         | Hack compiler afair) favored higher order functions. I enjoyed
         | playing with these in my Haskel-based introduction course at
         | university, and I even wrote a similar language that favored
         | them.
         | 
         | But I now heavily dislike if `a b c` means "call to a with
         | functions b and c with unknown arguments". I need to read all
         | three (a, b, c) to really get what's going on.
         | 
         | This was my biggest gripe with OCaml as it was used at FB.
         | 
         | (purely syntactically compare this to `a(parent => b(parent),
         | child => c(child))`, for some verbosity I get a clearer syntax
         | - a is the callee, and I got some information about what b and
         | c possible do - this is a contrived example of course).
         | 
         | I think the strength of ML and Haskell got eroded as more
         | "mainstream"y languages got decent type systems (TS/Flow, Hack,
         | Kotlin, even Rust, Python is getting there).
        
           | hardwaregeek wrote:
           | Yeah I think it's kind of like how pg wrote about how using
           | lisp gave him a disproportionate advantage. Sure, when people
           | used fewer dependencies and the alternatives were C++, Python
           | v1, and Perl, but these days a lot of languages have Lisp
           | features and the cost of using a niche language is worse
           | dependencies and tooling.
        
           | yawaramin wrote:
           | Readability is very subjective and also people get used to
           | syntax. Elm is widely considered to be one of the most
           | readable syntaxes by its users.
        
         | faitswulff wrote:
         | I think it was Steve Klabnik who said that it's basically the
         | version of Rust with a garbage collector that people ask for.
         | Might have been this episode of Oxide and Friends:
         | https://oxide.computer/podcasts/oxide-and-friends/1208089
        
           | steveklabnik wrote:
           | Rust was originally described to me as "Rust and C have a
           | baby," so yeah I've been a fan of this kind of thinking for a
           | long time.
        
             | carlmr wrote:
             | Rust is its own father? I think the borrow checker will
             | make this difficult.
        
               | riwsky wrote:
               | Just need support for recursive lifetimes
        
               | steveklabnik wrote:
               | Lol, oops: I meant OCaml, if that wasn't obvious.
        
               | cpeterso wrote:
               | OCaml is quite literally a parent of Rust since the
               | original Rust compiler was written in OCaml. (I know you
               | know that; I'm just highlighting how apt the analogy was.
               | :)
               | 
               | https://github.com/rust-
               | lang/rust/tree/ef75860a0a72f79f97216...
        
         | moonchrome wrote:
         | Disclaimer : I didn't try Ocaml (weird numeric operators turned
         | me off of it a decade ago) but I did use F# which is supposedly
         | similar.
         | 
         | But I don't know what you mean by imperative - for loops and
         | stuff ? Most languages these days support functional
         | programming concepts. Unless you're coming from C it shouldn't
         | be that groundbreaking.
         | 
         | Note that Ocaml isn't lazy by default like Haskell - now that
         | makes things... interesting I guess.
        
         | yawaramin wrote:
         | You could always try it out and see for yourself :-)
         | 
         | Here's a pretty good article about the transition:
         | https://roscidus.com/blog/blog/2014/06/06/python-to-ocaml-re...
        
       | evmar wrote:
       | My understanding is that Go does a similar kind of optimization
       | (where locals that don't escape don't go on the heap) but it does
       | it automatically. This has the positive that you don't need
       | annotations but the negative that you can assume some code is
       | benefitting from the optimization when it isn't and there's no
       | warning about it.
       | 
       | I'm curious whether the authors here considered this. I didn't
       | see any discussion of related work in the post.
        
         | georgyo wrote:
         | My reading seems to be that the compiler can and will do it
         | automatically.
         | 
         | The annotations make enforcement. It's easy to make the
         | compiler put something on the heap by accident.
        
         | ianthehenry wrote:
         | From the post:
         | 
         | > Even without explicit mode annotations, the compiler can
         | statically determine which variables may escape their enclosing
         | region. Such variables are assigned the global mode; all others
         | are automatically inferred to be local.
         | 
         | There's a little more info about mode inference in the
         | proposal:
         | 
         | https://github.com/ocaml-flambda/ocaml-jst/blob/main/jane/do...
         | 
         | So arguments to "public functions" do require explicit
         | annotations in order to be local, but otherwise the compiler is
         | able to infer locality and this acts as a transparent
         | optimization.
        
       | malkia wrote:
       | I've been listening to Signals and Threads podcast, and I
       | remember listening to this episode -
       | https://signalsandthreads.com/memory-management/
       | 
       | (I don't know neither Ocaml, nor Haskell, or any ML language),
       | but the podcast is always fun to listen to (not only programming
       | also)
       | 
       | Now would relisten this, and may actually understand it!
        
         | [deleted]
        
       | pjmlp wrote:
       | This the best way, productivity of automatic memory management,
       | and low level features for when that extra performance actually
       | makes a difference.
        
       | hardwaregeek wrote:
       | I've been critical of OCaml, but I gotta hand it to them, it does
       | feel like the language is going through a renaissance. It'll be
       | interesting if 5-10 years down the line it manages to
       | significantly improve the usability story while also adding on
       | modes and unboxed types. I'm more focused on usability but these
       | features are compelling too.
        
       | daxfohl wrote:
       | Seems like nim could be a good replacement? GC when you need it
       | and explicit control when you need that.
        
         | amelius wrote:
         | From the article:
         | 
         | > Ideally, a language could provide a spectrum of allocation
         | strategies freely interoperable within a single application.
         | With modes, users can write OCaml with all the usual GC
         | guarantees--but when performance is paramount, opt into the
         | consideration of lifetimes, ownership, and concurrency.
        
         | nerdponx wrote:
         | Nim is such a nice language, I would really love to see some
         | high-visibility corporate adoption for it.
        
           | dlahoda wrote:
           | where it fits? it feels languages are alive as soon as it
           | fits somewhere. rust and zig for example. seems roc or bosque
           | too. go and ts had fit into some industry slot.
           | 
           | where nim fits? how it can compete with other new fits and
           | other old?
        
           | geodel wrote:
           | I think it is not getting enough usage because a lot of
           | people love that _others_ should adopt it first.
        
             | nerdponx wrote:
             | I can sneak it into a few scripts here and there at work,
             | and I can write my side projects in it, but there's only so
             | much I can do.
        
         | yawaramin wrote:
         | Not for Jane Street. They likely have millions of lines written
         | in OCaml and rely heavily on its type system safety guarantees.
        
           | [deleted]
        
       | Laaas wrote:
       | I believe this is an explanation (part of) of this proposal:
       | 
       | https://github.com/ocaml-flambda/ocaml-jst/blob/main/jane/do...
        
         | ReleaseCandidat wrote:
         | It's this proposal: https://github.com/ocaml-flambda/ocaml-
         | jst/blob/main/jane/do... and these problems:
         | https://github.com/ocaml-flambda/ocaml-jst/blob/main/jane/do...
        
           | TheNumbat wrote:
           | Yes - upcoming posts will cover the uniqueness and data-race-
           | freedom designs.
        
       | yafbum wrote:
       | This is a great idea, but I have questions
       | 
       | * Is there a process for upstreaming this into the mainline
       | language, or is this essentially JaneStML now?
       | 
       | * Why choose such an obscure word as `exclave` to indicate
       | return-value optimization? How about `return local` or something
       | similarly approachable?
        
         | lpw25 wrote:
         | Our long term aim is to upstream all of our work from our
         | branch of the OCaml compiler. Of course, that is contingent on
         | the ideas we're developing there being accepted by the
         | community. There are two main reasons we work on our own
         | branch:
         | 
         | 1. Language design is hard. At Jane Street we have a great
         | opportunity to design new features, test them extensively in a
         | realistic environment, and then change them. Because we have
         | access to the entire code base where the features are deployed,
         | we can even change concrete syntax relatively easily. So by
         | developing internally, releasing internally, and then
         | upstreaming with experience, we can be more confident that the
         | feature design is correct.
         | 
         | 2. We get a faster turnaround between idea conception and
         | internal deployment. Working solely with upstream, we would
         | develop an idea, go through a long design discussion with
         | upstream, implement, merge, wait for release, wait for the rest
         | of Jane Street to be ready to upgrade, and upgrade. Now, we can
         | implement an idea in parallel with its design, rolling it out
         | internally in stages (as appropriate), and then upstream later.
         | This is a big win for us, and well worth the extra time spent
         | moving changes back and forth.
         | 
         | > Why choose such an obscure word as `exclave`
         | 
         | We discussed a lot of possible choices and eventually decided
         | this was the best one. I personally think names should either
         | be self-explanatory or memorable -- so that once they have been
         | explained they aren't forgotten -- here we went with memorable.
         | As a word, exclave also captures what is going on in terms of
         | part of the parent region being contained within the child
         | region. `return local` was a strong contender, but it implies
         | that `exclave` is always about functions -- whereas the actual
         | feature is a bit more general than that. It is also a bit
         | easier, when adding new keywords, if you pick a word that isn't
         | used much, and `return` is used a lot.
        
           | c-cube wrote:
           | As someone from the community, I absolutely love this design
           | (and blog post). It would be especially great for returning
           | options, tuples, results, etc. with no overhead at all.
           | 
           | I suppose it could also be useful to allocate int64, floats,
           | and maybe even bigints on the data stack? I suppose it's more
           | difficult to put C blocks like bigints or bigarrays in a
           | region.
        
           | yawaramin wrote:
           | I was reading the post and thinking 'glocal' :-D
        
         | ReleaseCandidat wrote:
         | Exclave is also a (PPX - that's a kind of preprocessor for
         | generating the actual code) keyword: `[%exclave]`. Using this
         | avoids name clashes.
         | 
         | See: https://ocaml.org/docs/metaprogramming
        
         | ReleaseCandidat wrote:
         | They always had their own version of the compiler:
         | https://github.com/ocaml-flambda/ocaml-jst/tree/main
         | 
         | Many of their changes have been ported to the 'official' OCaml
         | compiler.
        
         | HyperSane wrote:
         | Using obscure works makes some people feel smart.
        
           | malkia wrote:
           | Explain std::launder then -
           | https://en.cppreference.com/w/cpp/utility/launder - it's
           | simple word, mostly used when talking about dirty money ;) -
           | but hey - I've still no idea how/when/why to use it...
           | 
           | ;)
        
             | saghm wrote:
             | Using simple words in confusing contexts also makes people
             | feel smart. Essentially any way of being technically
             | correct in confusing ways has this effect; "I'm so much
             | smarter that you can't even understand _why_ I'm right" is
             | too juicy a flex for some people to avoid.
        
       ___________________________________________________________________
       (page generated 2023-05-27 23:00 UTC)