[HN Gopher] Onyx, a new programming language powered by WebAssembly ___________________________________________________________________ Onyx, a new programming language powered by WebAssembly Author : bkolobara Score : 87 points Date : 2023-12-01 17:22 UTC (5 hours ago) (HTM) web link (wasmer.io) (TXT) w3m dump (wasmer.io) | kemitchell wrote: | Clearly Wasmer wants to do WebAssembly. But for a whole new, | general-purpose programming language, what's the case for that | target, versus, say, LLVM intermediate representation? | brendanfh wrote: | Onyx is entirely independent from Wasmer. It is a separate | project developed by me, over the past 3 years. It does however | use Wasmer for running on Windows, MacOS, and optionally on | Linux. | | I started making Onyx because I simply wanted to create my own | programming language for the fun of it. I choose WebAssembly as | the target for my compiler because it was relatively easy to | write my own full-stack solution, instead of relying on | something like LLVM. That language evolved over the years until | I had something I felt was worth sharing. When the Wasmer team | reached out to see if I wanted to do a collaboration blog post, | I said yes. | | The main reason I didn't go with LLVM was simply because I | wanted to write everything myself (for fun) and to have a | super-fast compiler. LLVM is not the fastest backend, but it is | understandable for all the optimizations that it does. | IshKebab wrote: | Looks neat. Some obvious basic questions that I imagine most | people would wonder: | | 1. Is it value based (C++, Rust, Go, TCL) or reference based | (basically everything else). | | 2. How is memory freed? GC? | | 3. If GC how do you deal with the fact that Wasm GC is still in | progress? | | 4. What about concurrency? Is it single threaded? | | 5. How does error handling work? | | 6. Does it support modern type features - Option<>, sum types, | etc. | | 7. It's imperative, does that mean things that should be | expressions (e.g. if/else) are statements? | norir wrote: | 8. What does blazingly-fast build times mean quantitatively? | How does it scale with project size? | brendanfh wrote: | The largest project I have in Onyx is currently around 30000 | lines (not all that large I know). That project on my Intel | i7-1165G7 laptop compiles in about 80ms. | | There are currently no large Onyx projects that can really | test how this number scales, but I would guess the growth is | not linear. So for an off the cuff estimated, I would say a | million line project could compile in about 4-5 seconds. | | Also worth noting that the entire compiler is currently | single-threaded. So that number could get much better. | titzer wrote: | That's impressively fast. Well done! | brendanfh wrote: | Those are all great questions. I will add to the docs to | explain more details later, but for now: | | 1. It is value based, like C. There is obviously passing by | pointer, but you do that explcitly. | | 2/3. Memory is manually managed. To make this easier, like Zig | and Odin, everything that allocates should take an allocator as | a parameter. This allocator can be the general purpose heap | allocator, or it can be an arena, ring buffer, or even tracked | allocations that can be freed all at once. More details on that | to follow in the documentation. | | 4. It does have multi-threading support, thanks to the atomics | WASM proposal. The standard library currently has support for | basic multi-threaded primitives like mutexes, semaphores, and | condition variables. Note, there is currently not async/await | or any kind of concurrent execution. | | 5/6. It does have modern type features like sum types. It has | Optional(T) and Result(Ok, Err) out of the box. That is the | preferred method of error handling. | | 7. It is mostly statement oriented, but there are features like | Elixir's pipe operator (|>) and if/else (value if condition | else otherwise) expressions. | koube wrote: | nit: seamless not seemless. | | Actually TIL seemless is actually a word but it's a synonym for | unseemly. | ivanjermakov wrote: | I have irrational anger towards := assignment operator, probably | because of Pascal course in high school. | | Interesting if anyone else have such stories regarding language | syntax and features. | topikk wrote: | I also have this irrational anger, but as a result of PL/SQL. | It's also an objectively hideous operator that is inconvenient | to type. | acheong08 wrote: | Coming from Go, I got used to :=. I would've preferred if it | defaulted to const though | CooCooCaCha wrote: | It bugs me too. Mainly because I don't see anything wrong with | "=", plus it's shorter and more intuitive. | brendanfh wrote: | The example in the blog post could have been written a little | bit better, but in Onyx ":=" is actually a combination of two | operations: defining a new variable with ':', and assigning | the value with '='. If the type can be inferred on the right | hand-side of the assignment, you can leave out the type | between the ':' and the '=' and it effectively becomes a | single operator. An alternative way to write that could have | been 'input: str = "111 110 121 120";'. | | To assign in Onyx, you only have to use '='. | royjacobs wrote: | How optimized is the generated code? One of the benefits of using | LLVM is the amazing set of optimization passes, after all. Will | Onyx have to reimplement a lot of these optimizations? | brendanfh wrote: | The compiler does not have many optimizations currently | implemented. Currently, the compilers just uses constant | folding and generally reducing unneeded operations if possible. | There are plans to do function inlining and better tree- | shaking, but those are a ways out. | | The "nice" thing about WebAssembly is that the job of | generating optimized machine-instructions is up to the WASM | embedder, which Wasmer is doing very well right now. Onyx does | have a second runtime that is currently only implemented for | x86_64 Linux, that does have some more optimizations, but it | does not compile to native code; just to an interpreted byte- | code. | ipsum2 wrote: | Not to be confused with Onnx, a popular language for machine | learning models, that is also commonly used with WebAssembly. | Even the logo looks similar. | | https://onnx.ai/ | | https://cloudblogs.microsoft.com/opensource/2021/09/02/onnx-... | FireInsight wrote: | Not to be confused with Fedora Onyx, the budgie version of | atomic Fedora. | | https://fedoraproject.org/onyx/ | ketralnis wrote: | Not to be confused with Onix | https://bulbapedia.bulbagarden.net/wiki/Onix_(Pokemon) | tripdout wrote: | Not to be confused with Onyx, the son of rappers Playboi | Carti and Iggy Azalea. | JoshStrobl wrote: | Funny to see Onyx be mentioned in the wild! :D | mike_hock wrote: | Not to be confused with Onyx the clothing store. | bnchrch wrote: | I'm in no way against a new language! Love programming languages, | particularly ones that push boundaries and challenge assumptions! | | (Great work on that front btw Onyx Team) | | But! When I see powered by WebAssembly. I can't see a good reason | to choosing a unique language when any language in theory can | target WASM/WASI. | | In other words Javascript/Python is looking at your lunch and is | very hungry. | orangea wrote: | When I see "powered by WebAssembly", I take it as a sign that | the language is going to be designed around WebAssembly's VM | interface rather than the implicit standard of the C memory | model and POSIX-like API which basically all popular | programming languages are designed for. Even languages like | Python have the concepts of stdin/stdout/stderr, a filesystem, | threads, and a single globally accessible heap baked into their | design. It would take a lot of work to amend Python's design to | be able to easily use features that are somewhat unique to | WebAssembly like the various things a .wasm file can import or | export. As it stands, languages like Python can be run on WASM, | but they use inelegant hacks in order to be able to replicate | the execution environment features that their interpreters | require such as malloc, and usually it is assumed that the | target will be WASI. A language that is designed for WASM from | the ground up would make it so that WASM can be used to its | fullest potential as a lightweight execution environment that | makes extremely minimal assumptions about what interfaces are | going to be provided to the program. | brendanfh wrote: | That is exactly the way that I see it too. | | While Onyx does have core library support for doing standard | POSIX things like stdin/stdout/stderr, file operations, and | networking, Onyx can be used in an entirely different | environment without any of these things. In fact, the | standard libraries are (almost) entirely separate from the | compiler (i.e. the compiler makes no assumptions about what | the standard library is), so if the standard library does not | suite your use case for one reason or another, you can write | your own. It will be a bit of work, but there would be | nothing in your way. | gumballindie wrote: | Add syntax to the list - it's horrible. The target audience is | more used to the basic syntax of javascript. | CyberDildonics wrote: | I'm not sure a specific compilation target that is meant to be as | simple and generic as possible makes a new language a good idea. | | New languages mean you start all over and wipe away decades of | tools, knowledge, libraries, development environments, package | managers, workflows and now people are in the wild west again. To | justify that you have to have some enormous benefits. | onyxlangfanboy wrote: | Wow, this project is insane! Very well done to the creator, keep | up the good work. Reading the comments all I gotta say: haters | gnna hate | kettlecorn wrote: | Can Onyx's compiler be compiled to Wasm to itself run in the | browser? | | It's niche, but I've thought it'd be cool if there were a mini | Wasm-based game building tool in the browser, but that requires a | Wasm language with a compiler that can run in the browser. ___________________________________________________________________ (page generated 2023-12-01 23:00 UTC)