Well hello there. I am not going to make another thread to do that. It was just bait to get everyone’s attention. It seems everyone has a stance on Io. I’m gonna start by saying that seeing embedded people cry about a vtable, when if you look into any standard bootstrap for any microcontroller on the planet you see an interrupt descriptor table (which has 256 of them, BOO!), is honestly a bit disappointing. I think, stances like “Run! A vtable! We were taught to hate those!” lack critical thinking. While I will not diminish the benefit that compile time polymorphism provides, interfaces are a standard part of any … well … interface. All the better that Zig is so explicit in their formulation, it forces restraint. Said that, I question what precedent does this set in the design of user applications. The standard library is the holy grail of any language, at least from the perspective of many newcomers, and the usual way to learn idiomatic approaches is to look at the standard library.
Looking at the os level hackers having an issue with it is even more laughable, because how are you going to say that a constant dispatch table adds overhead to a system when you have dynlib calls and kernel syscalls on the other end of them. The icache is a thing, it’s much more important what’s in it than whether it’s comptime known, this is not 2016 and we are not the standards comittee.
Now that everyone is properly in their place and pissed off, here is my story time:
I wake up, update my zig, start migrating to all the shiny new io interfaces (which I shoulda done a long time ago anyways). Okay, reasons, reasons, …; cross compatibility, centralized, extensible, hotswap your implementations during runtime, deterministic, testing, simulations, The Matrix, Martha Steward, whatever, think of the reasons… Ooooookay. I get to a part of the code that uses a kernel32 API call, and it’s… not there?!
THIS IS OUTRAGEOUS!
Here is the actual message:
I can see why migrating higher level library APIs to use NTDLL would be of interest to the team, I love that there is a non-libc linux implementation for everything imaginable, but for the love of me I can not possibly understand about why a systems level programming language that had a mature and perfectly working native wrappers around system interfaces removed bindings. It’s like, here is all the work we have put into building this lower level APIs to allow people to interact with standardized OS-level stuff, nobody on the market except the original vendors has or even attempts this, it’s already finished, but we will remove it. It’s, and I say it as humbly as I can, a bad move. In the words of a great poet: “I will use your Io, please don’t take away my posix!”.
On the other side of that argument is, well, if we want to keep the library lean and mean, we should probably only keep the lower level abstraction layers that it actually needs, and I can perfectly see that reasoning, I just really dislike the outcome. Unless I am missing something with compilation times, that stuff should have stayed. Posix targets without libc? Eh? Is that even a thing? I don’t know? But they are not synonymous, so I presume there is some merit to keeping them separate, again, not enough information on my part to see if that’s an appropriate decision. Unless there is some replacement for the posix interfaces it’s again a miss.
That said, the bindings are still in the tree, nobody is forcing you to leave them erased *wink wink* and I think “selling” Io to disbelievers could be much easier if it wasn’t followed immediately by “oh btw, the rest? it’s all gone”. I don’t think the feedback is a bad thing, I think it’s great to see a community so invested into a piece of technology that it really worries them when it is taking a turn they do not see as positive. I think a self hosted compiler is amazing, what you have done around the build system and the language is absolutely phenomenal, and I have my greatest hopes that we are in the end going to end up in the right place. I also hope you will resist the evil temptations of *spits in disgust* Rustaciean script-kiddies, who want to turn everything and their mothers into a language feature, will iterate fast and hard, keep it lean and mean, not fear God nor failure, pivot when you see you made a bad move, and continue building on a trajectory so phenomenally engineer.
I’m going to be mad if you don’t take back the kernel32 bindings, I’m going to make this thread, but that’s as much as I’m going to do about it; Please figure out how to approach this, give it some more thought, keep being awe-sauce, don’t give up on your dreams.
I want to send all my warmest regards to Andrew, the team, and everyone working hard on making this the best software project I’ve seen since Linux and/or hand-writing assembly instructions with a sharpie on a piece of hanckerchief in a cigarette-smoke filled train coupé.