OCaml 4.10

(discuss.ocaml.org)

237 points | by pjmlp 1524 days ago

6 comments

  • dragonsh 1524 days ago
    Congratulations to the team and hope ML family languages become popular and mainstream.

    Rust compiler front-end was initially written in OCaml and later moved to rust and dependent on LLVM written in C++. Still Rust became more popular by following a simple imperative style of programming with some incremental improvements over C/C++.

    OCaml is confined mostly within Facebook with some use by Bloomberg and in Xen development. I hope functional programming languages become popular and also used for systems programming. OCaml indeed is used for system programming, like Mirage unikernel OS is written in it.

    Although OCaml can offer whatever is offered by Rust I believe Rust being imperative language along the lines of C++ will be more popular.

    • Yoric 1524 days ago
      Having coded a lot in both OCaml (I used to lead OCaml Batteries Included) and Rust (I'm a contributor to the Rust compiler and stdlib), I believe that they have very different targets.

      Rust is really, really good at systems-level programming, it has great concurrency, but closures are more restricted than OCaml and it doesn't have general garbage-collection.

      OCaml shines to implement really complicated algorithms. Anything that requires symbolic manipulation/pattern-matching, for instance, or manipulating large graphs, or maintaining extremely complex invariants. Garbage-collection that just works is invaluable but it doesn't play nicely with multicore yet.

      In other words, I believe that there's room for both in our world! I could see myself developing applications in which some components are implemented in Rust and others in OCaml.

      • polskibus 1524 days ago
        What's your opinion on F# ? Does it share enough of OCaml goodness to be worth using in .Net world or instead of OCaml?
        • gameswithgo 1524 days ago
          F# is very much like a .NET port of OCaml. It is very nice to use and offers (usually) low effort interop with all of the worlds C# libraries.

          We use it in production at Olo, and I used it in production at my last company.

          Since learning F#, languages where if statements aren't expressions and that don't have option types feel broken to me =)

          • polskibus 1524 days ago
            I can see that F# still does not support GADTs. Did you find it a serious limitation?
            • daxfohl 1523 days ago
              Depends on what you're trying to do. I've never found it to be a limitation but I don't do anything terribly intricate. Just web dev for work, and I wrote a toy language parser and type inferencer in it. There are maybe three lines of code that GADTs might have let me avoid casting in the type inferencer, but oh well. Different use cases that use GADTs to a greater extent, of course, you might miss them. What is your use case, and how much are you reliant on GADTs in your existing daily life?
            • amw-zero 1523 days ago
              You can go an entire lifetime without ever even knowing about GADTs. I don’t find their absence limiting at all.
        • Jorge1o1 1524 days ago
          I’ve used F# and USING it feels very similar to OCaml in all of the important ways.

          The lightweight type structure where you can easily make Union types and the pattern matching are pretty much identical to how OCaml does it.

          Of course, the big difference is going to be in how easily you can interop with the .Net stuff in each language, obviously much easier in F#. This is great if you happen to have some kind of weird C# code that generates an IEnumerable, just pop that into F# and start working with it.

          For example, I have C# classes to read files to an IEnumerable of strings, you can just call List.ofSeq on it, and then start doing some really elegant things in F# with it. You can pattern match log files based on how the line starts and then run different functions whether it’s an error, info, debug, etc

        • yawaramin 1524 days ago
          If you are in the .NET world, then definitely prefer F# to C#. However be aware that it differs in some significant ways from OCaml. E.g., it does not have a separate module language (module types, functors, first-class modules). Its design is in a different, more object-oriented direction, with support for classes and interfaces.

          Basically, if you do use F#, be aware that it has its own idioms that you must learn; it's not a drop-in replacement for e.g. OCaml/Haskell/etc.

        • nestorD 1524 days ago
          Having used both for years, nowadays I would recommend using F#.

          The syntax is very similar but it solves many of Ocaml's pain points and you will get better tooling and more libraries thanks to .Net.

          • polskibus 1523 days ago
            Could you elaborate on the pros of F# vs OCaml?
            • nestorD 1523 days ago
              In no particular order: - significant whitespace and no `let ... in` which makes for a more streamlined syntax - no +. vs + - a solid standard library - much improved tooling (see the ionide plugin for vscode) - you can use all the .Net libraries - multicore support - list comprehension and iterators - object support with a minimalistic syntax (I don't include type providers as I never had proper use cases for them)

              All of those either remove pain points (some of them arguably very small) or introduce improvements that are sensible in day to day life.

              With that and the fast that Ocaml and F# can (for the most part) easily be transpiled into one another, nowadays I see very little reason not to use F#.

              That being said, I find the fact that you basically never need explicit types in Ocaml very elegant (in F# the uniform syntax mean that you will need occasional types hints to disambiguate operations).

              • yawaramin 1523 days ago
                > list comprehension

                Are you referring to F#'s computation expressions? If so, OCaml has a similar-in-power let-syntax now: http://jobjo.github.io/2019/04/24/ocaml-has-some-new-shiny-s...

                > Ocaml and F# can (for the most part) easily be transpiled into one another,

                Actually they can't. They are quite different languages in practice.

                • nestorD 1523 days ago
                  No, I am referring to proper list comprehensions (as you would get in python): https://en.wikibooks.org/wiki/F_Sharp_Programming/Lists#Usin...

                  Its true that you can't literaly transpile very high order things such as GADT but the was majority of code is trivial to translate as both syntax and available constructs match.

                  I practice, I found translations between the two languages to be fairly easy (the same cannot be said for most language pairs).

                  (I was not aware of the new let-syntax, thats a nice addition (although computation expression did not make my list as they are more of an enabler for library authors than normal users). I will dig in to see what people build around it...)

                  • yawaramin 1523 days ago
                    > I am referring to proper list comprehensions

                    Oh cool, I'd forgotten F# had those (or maybe it got them recently?).

                    > Its true that you can't literaly transpile very high order things such as GADT but the was majority of code is trivial to translate

                    Would still have to disagree there; OCaml code heavily relies on modules/module types/functors, while F# code relies more on classes. In practice these are not trivially translateable.

                    > I will dig in to see what people build around it...

                    The major thing is getting an async/await-like syntax for concurrent operations. Super useful for literally everyone. E.g. my project https://github.com/yawaramin/re-web/blob/eb7ce8474d34c60f9f9...

              • abhijat 1523 days ago
                How do you transpile f# to ocaml? Does this mean you can get a native self contained binary out of f# code, by first converting it to ocaml code?
                • nestorD 1523 days ago
                  I was mentionning manually translating a code base from one language to the other. I am not aware of a tool to do that (which, as others have said, would be tricky to do automatically for some constructs).
                • yawaramin 1523 days ago
        • Yoric 1524 days ago
          I never seriously used F#, so I can't tell for sure, but it looks pretty good!
      • giornogiovanna 1524 days ago
        Besides GC and the lightweight syntax (relative to Rust), what is it about OCaml that makes it so wonderful for implementing complicated algorithms?
        • Yoric 1524 days ago
          Well, the big one is GC.

          Here are a few others:

          - both polymorphic variants and GADTs are extremely powerful mechanisms to let you keep track of invariants, in a manner that cannot be replicated readably in Rust so far;

          - OCaml's pattern-matching is a bit more flexible than Rust's ;

          - (thanks to the GC) OCaml's closures are much more flexible than Rust closures;

          - I guess OCaml's blindingly fast exceptions can be useful for some algorithms, although I haven't really experienced the need for them myself.

          Again, that's not to say that Rust doesn't have great stuff for it (affine types 4eva!) or that OCaml doesn't have its own limitations – Rust is currently my main language and I do not regret it.

          But there are some algorithms that I really don't want to write in Rust. Recently, for instance, I stumbled upon this: http://weblog.jamisbuck.org/2010/12/29/maze-generation-eller... . Trivial algorithm, trivial to write in OCaml, feasible but much less straightforward in Rust.

        • pjmlp 1524 days ago
          Exactly that, lock-free algorithms are specially hard to get a correct implementation without tracing GC support.
    • rvz 1524 days ago
      Jane Street also is a regular contributor and a heavily uses OCaml for their infrastructure and trading systems too. They have very technical blogs about how they use OCaml which is very interesting. [0]

      [0] https://blog.janestreet.com/

    • paulddraper 1524 days ago
      > I hope functional programming languages become popular and also used for systems programming

      My absolute favorite OCaml program is Unison [1], which is a cross-platform performant file watcher and sync tool.

      It's essential to a good VM or remote development experience, and the the principal technology behind docker-sync. (Mac users will thank me.)

      [1] https://github.com/bcpierce00/unison

      [2] http://docker-sync.io/

    • xvilka 1524 days ago
      Not only these, but I also recently noticed OCaml-written parts of Moby[1]. Another significant example is Tezos[2]. So far, OCaml became much more modern and usable in the last couple of years. The biggest missing parts are multicore[3] and solving the metaprogramming issues[4]. Both are being worked on, and, hopefully, will be ready in a couple years.

      [1] https://github.com/moby?utf8=%E2%9C%93&q=&type=&language=oca...

      [2] https://tezos.com/

      [3] https://discuss.ocaml.org/t/multicore-ocaml-january-2020-upd...

      [4] https://discuss.ocaml.org/t/the-future-of-ppx/3766

    • 7thaccount 1524 days ago
      You're forgetting that apparently almost everything at Jane Street is done in OCaml including some FPGA compiler work iirc.
    • noir_lord 1524 days ago
      Janestreet are incredibly heavy users of ocaml in production.

      They have some awesome talks on YouTube as well.

    • smabie 1524 days ago
      OCaml is also used by Jane Street and they are probably the biggest corporate users of it.
      • kryptiskt 1524 days ago
        Facebook uses it, as ReasonML and also in Infer (a static analyzer https://fbinfer.com).
      • rwmj 1524 days ago
        Used by Red Hat for miscellaneous virt tools.
      • Kalooo2020 1524 days ago
        Same name every OCAML or F# post.
        • exdsq 1524 days ago
          They are very involved with the ecosystem. They sponser a lot of the events, conferences, etc. In fact I'm attending OPLSS this year and even that is sponsered by them.

          I even saw someone compare OCaml build methods as 'Jane Street Way' vs 'Other Ways'. It's hard to ignore such an influential company like that when the question about who uses them comes up!

        • badfrog 1524 days ago
          What's wrong with that?
    • jfkebwjsbx 1524 days ago
      [replied to the wrong comment]
      • thosakwe 1524 days ago
        I think you might have misinterpreted the previous comment, because it wasn't implying that any one paradigm is better/worse.
    • jfkebwjsbx 1524 days ago
      > ...dependent on LLVM written in C++. Still Rust became more popular...

      "Still", as if non-pure functional languages are not worth it or "bad", even if just depending on a project that uses them.

      Sorry, but that gatekeeping attitude among functional languages proponents is very tiring.

      • uryga 1524 days ago
        how on earth is this gatekeeping? GP said nothing like "imperative programming isn't true programming and deserves to be looked down upon" or w/e, they just expressed a personal preference for FP. ("I hope functional programming languages become popular and also used for systems programming.")
      • eru 1524 days ago
        OCaml is impure and pragmatic. They even have for and while loops.
  • e12e 1524 days ago
    > Some preliminary runtime work for OCaml multicore

    Anyone have more information on a likely time-line for multicore? It feels like it's been comming for a long time. I suppose it's encouraging that some work is released in the mainline compiler though.

    • sadiq 1524 days ago
      There's an update to for January: http://discuss.ocaml.org/t/multicore-ocaml-january-2020-upda...

      Behind the scenes there's a lot of work happening. Retrofitting parallelism to an existing runtime while maintaining compatibility with existing code and keeping the kind of performance users are used to is difficult.

      There will be a lot more information out in the next month or two about how it all works, which should coincide with getting more of it upstream.

      I don't speak for OCaml or OCaml Labs but am a contributor to multicore if people have specific questions, I can try to answer them.

      • pdimitar 1523 days ago
        What are the top challenges? Why is it taking so long? What exactly will multicore OCaml cover? Native OS threads? Green threads? Actors like in Erlang/Elixir?

        I'm learning Rust and I'm doing so a bit begrudgingly at times. I like OCaml better but the lack of frictionless parallelism is a huge letdown. (And I don't think spawning several processes is an actual alternative, no.)

        Trust me, there is some amount of programmers out there who will very quickly adopt OCaml after it gains multicore abilities. They are eagerly awaiting and watching. And I'm one of them.

    • rwmj 1524 days ago
      Start here: https://github.com/ocaml-multicore/ocaml-multicore/wiki

      Mostly the work is slowly getting it upstream in a way that doesn't break existing code. (There are some changes which affect C extensions, although the changes so far have only had a very minor impact, things like fixing const-correctness).

  • a7b3fa 1524 days ago
    I'm reasonably competent in Haskell and am interested in checking out OCaml. Can anyone recommend any good resources (books, tutorials, etc.) for someone like me to get started?
  • fishmaster 1524 days ago
    Sometime in the future I would like to use ocaml, but I found the user experience from 0 so difficult that I just didn't bother at all. Haskell was much friendlier.
    • badfrog 1524 days ago
      I think the language is not especially hard to learn, but since it's relatively unpopular it's definitely hard to find good resources.
      • fishmaster 1524 days ago
        It wasn't even the language itself, just the materials like you said, the tools, etc.
    • yawaramin 1524 days ago
      Can you give any specifics?
  • walterbell 1524 days ago
    Does Ocaml support cross-compilation, e.g. x86->arm?
  • idbehold 1524 days ago
    Still no regular expression negative look-aheads?
    • yawaramin 1523 days ago
      Are you sure you're asking in the right thread? OCaml has a binding to the PCRE library: https://mmottl.github.io/pcre-ocaml/

      ...the question seems moot to me.

    • alharith 1523 days ago
      If you need a regex that complicated it’s probably better to be written as a parser. Not only will it be way more performant, it will be much more maintainable.
      • leoh 1523 days ago
        I agree that if you're designing a system from scratch this makes sense. Ocassionally you need to extend the syntax of an existing system that is written with regular expressions and would require a negative lookahead. Some sub-parser with negative lookahead functionality would be possible, but a regex would be more convenient in a pinch.