![](https://lemmy.hogru.ch/api/v3/image_proxy?url=https%3A%2F%2Fsopuli.xyz%2Fpictrs%2Fimage%2Ff9911f3b-9a17-4ee0-8914-c04d95fe5f35.webp)
![](https://lemmy.hogru.ch/api/v3/image_proxy?url=https%3A%2F%2Fprogramming.dev%2Fpictrs%2Fimage%2Faa43d40c-a1ab-48e1-bc89-2f60606741b9.png)
I’m going to steal this.
Physics, coding and black metal.
Vyssiikkaa, koodausta ja bläck metallia.
Apparently also politics when it doesn’t devolve into screaming into aether.
I’m going to steal this.
Circle is a bit weird, since instead of being a new language, it’s (or at least was when I last checked it out) technically a conforming C+±compiler, just with a lot of extensions. If we had interest, a lot of the stuff there could be standardised.
This is front and centre on the homepage…
I stand corrected.
It makes assumptions about the native architecture for the sake of performance, but it’s still portable because you can implement all that behaviour in a VM if necessary. The important thing is that the behaviour is well defined.
It doesn’t have to be native architecture, just the execution environment (i.e. you can emulate it).
But I don’t see why by that logic any turing-complete language wouldn’t be in the group “portable”, including any hardware-specific assembly. Because you can always implement a translator that has well defined-behaviour? e.g. is 6502 assembly now portable that C64 and NES emulators are commonplace? (And there even is transpiler from x86 asm to 6502 asm). I do not think many of us see this as a good definition for portability since it makes the concept meaningless, except in cases where the translation layer is not feasible due to available processing power or memory.
It’s not perfect but I don’t think the situation is any worse than in Java, C#, Lua, etc. If your hardware has non-standard floats you’re going to have a bad time with any VM.
I mostly agree here. But I think portable language is not the same thing as a portable VM, and that portability of a language target is different from VM portability.
That sounds interesting, I probably want to take a look at the book too.
It’s pretty much the only target that is open-ended, high performance, and portable.
I wouldn’t call wasm really portable. And webassembly doesn’t call itself portable either.
Limiting out everything non-little-endian, requiring IEEE754-floating points and forward-progress guarantees is not really portable anymore.
Good opener!
These toolchain are created for experts to create industrial-level compilers. Even if you think you got a syntactic design concept that is such hot shit that you can’t wait to get it bootstrapped, even if hell, it proves Rice’s theorem wrong, please, write a simple interpreter for it to prove your syntax works. In fact, I think one way you can test your language’s design is to have it mooch off an established VM like JVM, CPython’s VM or CLR.
I agree in principle, but mooching off established VMs will affect your overall language design since and significantly push you towards language “grammar” those VMs are built to deal with. Syntax is pretty irrelevant early on and should be made easy to change anyways.
But if you wanna ‘learn’ compiler design, I beg you to roll your own backend. You don’t need SSA or any of that shit. You don’t need to super-optimize the output at first try. Just make a tree-rewrite optimizer and that’s that.
I don’t think I really agree with this. Of course, if your goal is just to learn how everything works, rollng your own is the best option. But if you want to do more than that I think not taking advantage of tools available (such as LLVM) is suboptimal at best. It might be fine if you are unemployed or can slack off enough to spend copious amounts of time on your language, but you will spend your time on rewriting tiny details over and over that might be fun to make, but it won’t help with getting your language into usable state. There’s plenty of optimisations you can (and should) do even before you pass on anything to LLVM if the goal is to think about those.
Same is true with LP generators. From Yacc to ANTLR, they just make the experience harder and less rewarding. I know hand-rolling LP is hard in a language like C, in which case, don’t fucking use it lol. There’s honestly no inherent worth in using C in 2024 for compiler design.
I’m not sure I got your point correctly here, but if I did, I heavily disagree. Like it or not, unless you plan to write everything from hardware up from scratch in your language, you need to adhere to a lot of C stuff. Whatever your system C ABI is, that is the layer your language needs to be able to talk to. And that, for better or worse, requires to take C heavily into account.
But there’s still use for C in being the subject of your compiler. It’s a very simple, straightforward and more importantly, standardized language, you don’t need to write a runtime for it, because when it comes to both UNIX and Windows, runtime is OS itself! Just make sure you add a syscall interface and then C runtimes like glibc and CRT can be easily strapped.
Heavily disagree with C being either simple or straightforward, but totally agree with the important part that it is standardised.
I know my point about using LP generators is preaching to the choir and most people despise them — but I just don’t understand why people love to use IRs/ILs when doing so teaches you shit.
I recommend beginning to design your language with the IR – your IR.
Anyways tell me what you think about my ‘take’ on this. Of course I am not saying you are ‘less knowledgeable’ for using LLM or MLIR, I’m just saying, they don’t teach you stuff.
Still, some people just use LLVM and MLIR as a final ‘portable’ interface, having done the optimization on graphs and trees. i think there should be some sort of ‘retargatble assembly’ language. Like something with fixed number of registers which… oh wait that’s just a VM!
I mean, you answer your own questions here. People love to use IRs/ILs because things like LLVM IR are the closest thing we have to portable assembly we have, and it makes it simpler to get into running state. Most compilers have their own internal IR (maybe even more than one) anyways, regardless or not if they use something like LLVM. Understanding how LLVM/MLIR/whatever IR is designed is pretty important before you start rolling your own if you want it to be useful.
Also you don’t need to necessarily translate to a super super low-level language. Just target C. GNU C to be exact. Cyclone does that, in fact, I am planning to bootstrap my functional language, which I named ‘Xeph’, based on Zephyr ASDL, into GNU C as a test. Or I might use JVM. I dunno. JVM languages are big these days.
Targeting C is completely valid. Though I see no reason to use GNU C – just use the actual standardised versions. And I think what you target should be part of your language design and suit what your language’s purpose is, not stuff to pick at random whenever.
PS: Do you guys know any cool VMs I can target beside CPython and JVM? Something with AoT perhaps?
Besides BEAM VM that was already mentioned, Lua VM is pretty interesting to target (not AoT though) if that’s your thing.
I’ve tried all of them except Zrythm. In fact, REAPER is my DAW of choice. But while that works on Linux, a lot of the plugins I require do not (or well, I guess it depends on how people define “work”), and REAPER in itself is not FOSS.
I guess that list could be helpful for some, but for me (and IMO, music production in general), it’s woefully inadequate to the point of hilarity.
Pro audio has been a complete mess in Linux for ages, and it’s not even close to where it should be in order to be generally usable. Every 7-8 years or so when my old music computer starts to die I try and check if it has made substantial improvement, but apart from Musescore actually being good, it is hard to find any tangible progress from 15 years ago. Pipewire gives me some hope, but it’s far from production-ready in Pro audio world. And I’m not really going to get rid of all the VST stuff I’ve bought in the last 20 years (all of which still works out of the box on a new computer!)
In addition, making music is the one hobby I have to get me away from tinkering with computers. I am not interested if I could make my Linux setup equally good if I spent weeks tinkering on it, when it’s literally easier for me to work for a week and buy a Macbook Air (or whatever crappy windows PC), where I get all of my old work ready for action in under a day, and I can trust that everything I do will just work, and work well at that. And it does it while allowing me to work remotely with other musicians since we can all use the same stuff.
I’m pretty sure I’ll be in my grave before FOSS Pro Audio ever gets there, unfortunately.
Edit: Ironically, the one FOSS thing I would love to use in my audio stuff is Guitarix, which is then the thing that doesn’t interop well with anything else. And I would love to have easy way to do all that I do on (Win/Mac Os) on Linux, but 20 years of disappointment is pretty hard to overcome at this point.
Well I have separate computer for music production which I don’t think has any FOSS software on it, so everything that has to do with that.
You don’t even need to go to the 90’s. E.g. RSS feeds were pretty much killed by EEE in mid-2000s. XMPP is another more recent victim.
A lot of cleanup and refactoring and redesign to enable easier lsp support. Finally finishing the core components of the language (getting branches to work) for the VM. Then I guess it’s time to start plugging LLVM back in and start writing a transpiler from my IR to LLVM IR.
…also should update the language blog, it’s been a while.
Most of the “reasons” apply to pretty much any language.
I don’t know. I read this more like “excuses why I still cling to this one dying thing I already know and not learn anything new” than an actual valid reasoning. There might be more valid reasons to stick to PHP than what is proposed, but I’d say if you use the ones in the post, you are most likely lying to yourself.
Yeah, MLIR is more or less an “IR with Dialects”, a lot of IR language spec share a lot in common with one another, so MLIR try to standardize that similarity between IR
Oh, shit, that sounds like C all over again, just for GPUs this time.
But that note aside, definitely sounds like something I need to learn more about.
Interesting, I definitely need to check out MLIR stuff more. I’ve always been a bit dissuaded that it’s one more step in my IR -> MLIR -> LLVM chain, but ability to compile it to multiple GPUs is a very good selling point.
That page makes Firefox’s Reader mode really worth its weight in gold, but the content is interesting.
Has anyone used MLIR for anything yet?
There is no meaningful debate if static or dynamic systems are better. It’s a tradeoff. And as such, arguments either for or against make little sense if the context about the situation they were designed for is ignored or left ambiguous.
I have mixed feelings about the blog post. I don’t think it is wrong per se, but I think this text conflates language features that are orthogonal too much. The initial description of the problem is good, explaining what is meant by inconsistency and feature biformity. But there’s a lot of things after that I just don’t agree with. Maybe there’s some different core assumptions to start with we disagree on.
But in the end, different tools require different features. Programming languages are tools. There’s no one-size-fits-all solution to every use case.
I do not understand “counterargument” here either. Counterargument for what? I don’t think anyone suggests that choice of typesystem isn’t a tradeoff.
Bytecode format. It’s a bit hard to design since it needs to have some stablility guarantees, be decently fast to run and be somewhat easily convertable to LLVM. Third revision going on.
Very interesting. I’ve been struggling to figure out how I want to handle references in my language and if I read this a couple of times through, I might get some more insight.
I do not really agree with cppfront being the same, given that it basically needs a full transpiler in front. A lot of the stuff there though is something that could be standardised though (and some of it absolutely shouldn’t, I’m looking at you UFCS), but I don’t think there’s much support for changing any of the core syntax.
I kinda understand the r/cpp stance, because it’s a bit difficult to draw the line there, but yeah, it feels a bit unfair. I think the first step of getting circle-like stuff into the language would be to standardise the
#feature
somehow.