I think this is all true. Though with regard to your earlier example, it should be noted that Nim, too, has an extraordinarily powerful compile-time programming system: but it takes the form of typed macros and generics (as opposed to Zig's dislike for such abstractions).
It will not emit warnings saying it did that. The static analysis is not very transparent. (If you can get the right incantation of flags working to do so and it works, let me know! The last time I did that it was quite bugged.)
Writing an equivalent program is a bit weird because: 1) Nim does not distinguish between owned and borrowed types in the parameters (except wrt. lent which is bugged and only for optimizations), 2) Nim copies all structures smaller than $THRESHOLD regardless (the threshold is only slightly larger than a pointer but definitely includes all integer types - it's somewhere in the manual) and 3) similarly, not having a way to explicitly return borrows cuts out much of the complexity of lifetimes regardless, since it'll just fall back on reference counting. The TL;DR here though is no, unless I'm mistaken, Nim will fall back on reference counting here (were points 1 and 2 changed).
For clarity as to Nim's memory model: it can be thought of as ownership-optimized reference counting. It's basically the same model as Koka (a research language from Microsoft). If you want to learn more about it, because it is very neat and an exceptionally good tradeoff between performance/ease of use/determinism IMO, I would suggest reading the papers on Perseus as the Nim implementation is not very well-documented. (IIRC the main difference between Koka and Nim's implementation is that Nim frees at the end of scope while Koka frees at the point of last use.)
Oh, that's interesting. I think not distinguishing between owned and borrowed types clears things up for me; it makes a lot more sense for copying to be an optimization here if reference-ness is not (directly?) exposed to the programmer.
Thanks for the explanation and the reading suggestions! I'll see about taking a look.
I cannot see how BlueSky's moderation system can ever work. Decoupling moderation and hosting means there's no onus to do the moderation that they describe: which makes me think it will be BlueSky Inc., and only other corporations, that have resources to throw employees at a now thankless, Facebook-style moderation job. And instances have to moderate anyway, in order to not host illegal content.
I hear you on some level. That said, we are already seeing people creating blocklists, and tools to share them with others. That is happening alongside the company's investment in paying people to work on T&S related issues on their instance.
I am not sure if it will succeed or fail, but I am interested to see how it plays out.
That relies upon the benevolence of corporations to much more of an extent than I am comfortable with. 20 years of social media has convinced me that that's a bad idea. And, I think, it removes much of the benefits of federation: if the only way to sustainably moderate is to rely upon gifts from BlueSky Inc., moderation is going to be necessarily dependent upon them.
To me, the company moderating their instance feels like additional moderation capacity, rather than replacing it.
I don't believe I subscribe to any blocklists on BlueSky. If I end up doing so, it is much more likely to be one run by someone I trust than by a company. Having the option of either seems worthwhile to me.
> Decoupling moderation and hosting means there's no onus to do the moderation that they describe:
I'm not sure this follows. There is a similarity to the reddit model of moderation. The host provides some base amount of moderation but supplemental moderation comes from members of the community. In the Bluesky model, a 'subreddit' is analagous to an indexer/aggregator (aka Relay/AppView) that provides a moderated and/or weighted feed of content. The same incentives for volunteer mods on Reddit will exist for volunteer mods on Bluesky.
One of difficulties with content moderation is it's been targeted by some as a tool available for the few to control and shape public opinions to far narrower degrees than legally required, which is harmful to free speech. I'm not completely sure but externalizing that part probably mitigates that issue a bit.
EU is moving towards requiring all social media obey EU laws, under loose notion that their laws is the least restrictive and most reasonable. No one is, and the sum of all ethical standards on Earth is not going to be something very popular, so that's nonsense. OTOH, it's perfectly reasonable that content served at scale in a region will have to be lawful; "this content you want removed is lawful in MY country" is sort of nonsense too. So moderation decoupling and, ahem, moderation localization is going to be necessary for social media. I suppose that's where they're going.
Interesting that you have picked EU, while sites like Twitter are already blocking or removing content on request of countries like Turkey, China or Russia.
I remember Turkey and China pressuring on political sides, and Russia as well as Germany kind of ignoring jurisdiction as well, but EU is the most recent and formalized approach of that so that came to mind first.
Communities are built on shared values and expectations of what is or isn't acceptable conduct. If a guest to your club house starts pooping on the carpet, you throw them out not only because you don't want that to happen in your club house but also because throwing them out demonstrates to the other people in your club house that they can expect there to be actual consequences to that kind of behavior, allowing them to feel safe knowing that they won't have to worry about it. Bluesky's solution apparently boils down to just telling everyone to ignore the poop guy and giving them the option to not be able to see him.
The problem with censorship isn't the enforcement of rules. The problem with censorship is the enforcement of rules the individual that has to enforce them doesn't agree with. Free speech absolutism on social media is often argued for with appeals to "the town square" but the difference between social media and an actual town square is that if you make a complete ass out of yourself in an actual town square, eventually someone will punch you.
wtf. The problem with censorship is censors are subservient to his nation and don't get to pick victims at his will? "demonstrates ... that they can expect there to be actual consequences" ? You really must hate the concept of a modern nation and social contract.
Post 18th century world started with peasants beheading kings and gutting his body into pieces so no single individual shall have any meaningful parts of it. The fact that kings had the power to throw anyone out of "his" club, deemed no longer his simply by volume of peasants within, at his king's discretion without the newly established ultrabureaucratic people's approval processes, was the problem they had enough of.
I'm not even sure in which part in the history of humanity your definition of free speech and censorship problems could come from. I don't think even ancient Roman Senate honored that kind of view as I've never heard they held sessions with bags of stones around. That isn't an anarchist view either, since it will lead to their minority views alone justify such "consequences".
Sure, telling people who openly advocate for the death of people in your group to take their opinions elsewhere is exactly like peasants beheading kings or kings throwing people they didn't like into the pit. I'm not even sure how to begin responding to such a creative interpretation of what I said.
> throwing them out demonstrates to the other people in your club house that they can expect there to be actual consequences to that kind of behavior, allowing them to feel safe knowing that they won't have to worry about it.
> telling people who openly advocate for the death of people in your group to take their opinions elsewhere
These parts of your comments imply your default model of safety is a safe haven in a barbarian land with perimeter walls and armed guards and a benevolent property owner. Clearly your thinking is privatized violence is integral to safety. You might be thinking that's what freedom of speech is, as in freedom implemented in speech domain, but that is wrong. Freedom of speech as this phrase is used is something different from that.
Freedom of speech means speech is always taken as unserious as practically possible. Absolute freedom of speech would mean even advocating for death, or however terrible the messaging might be, are taken as weird jokes until an action is taken.
This is not the matter of thresholds and analogies, your model of freedom is just wrong.
Some context: dom96 here was the BDFL-in-2nd-command of Nim for quite some time. There is personal beef between dom96 and some of the primary nimskull contributors, which mostly involved a lot of name-calling, personal insults, and critiques of leadership and leadership effectiveness, that eventually lead to dom96 banning one of the aforementioned contributors, stalling quite a lot of interesting compiler work and partially sparking nimskull. It's all quite boring stuff.
dom96 eventually had a falling out with the Nim BDFL too (which I'm surprised did not happen earlier: the BDFL is... brusque, charitably) and so has been inactive in either Nim community because, well, obviously. But: in all my years involved with Nim, I have seen the nimskull developers to be pretty consistently great to work with? I think they handle things professionally, are not rude, and treat other's work with care (you will maybe notice they have a code of conduct exposing an explicit intent to do so). Which makes what happened between them and dom96 all the stranger in my eyes, but I was less active back then, and there is certainly context I am missing.
It's no big reveal that I was involved and optimistic about Nim for a long time, though "BDFL-in-2nd-command" is a stretch for someone who couldn't even get the community to instate a Code of Conduct. That's one of the many many reasons I left.
My many years of involvement with Nim is what I believe qualifies me to speak on the individuals in the forked project. That being said, I am no longer involved with Nim. I don't want to get reinvolved. I just want to warn people about individuals who were abusive to me (and others) for many years.
I banned very few people during my time in the Nim community, and never without good reason. I don't know who you could be referring to here. I'm sure you left this comment with the best of intentions, but you say it yourself, you were less active back then and have had minimal interactions with me on the subject.
Ah, I was referring to disruptek. I don't know why you two hated each other's guts, mostly due to being less active back then indeed. For what it's worth I didn't think the banning was undeserved: but the interactions you two had always struck me as strangely animus, and not anything like anything I've ever seen between him and anybody else, and certainly not between any other nimskull developers and anyone, ever.
It is perhaps notable that the nimskull project has a Code of Conduct (and a rather good one at that). I think it is indicative of serious intention to make a welcoming community, and I don't think that contributing members having had in the past what really struck me as personal grievances turning into open-air malice undermines that: particularly, such behavior would fall under the Code of Conduct itself. But again, I have not seen such behavior - quite the opposite! - outside of what happened between you two.
I don't hate anybody's guts and never have. There was a time when I could not post in the Nim community without an aggressive response from the person you mention - and would often enter the space to find many unprompted aggressive messages about me from him in what amounted to a harassment campaign. Contrary to your experiences, I have seen him frequently interact with others in the same way (and some have left the community because of it).
I'm glad that their community has a code of conduct. It is unfortunate that members there have never applied those rules to their interactions with and about me, nor with many others they targeted in the Nim community.
For your clarity going forward: I did not ban him, though I was one of the people who advised and agreed with that course of action. All decisions on whether to ban someone or not were taken by Araq (at the time at least).
It surprises me to hear you say you have never seen him engage that way with anybody else, given that you acknowledge that his banning was deserved. If I recall he was banned for aggressive behaviour towards _multiple_ members of the community.
I'd be a little interested to hear what you like about C++'s syntax! As a non-C++ programmer, I mostly think of the language as a pile of mistakes that kinda had to happen for other languages to learn from them, very much including syntax (ex. types preceding declarations, necessitating `auto` and complicating parsing) - and I actually think the ugliest parts of Rust copy those mistakes (ex. using <> for generics, which are ambiguous with less-than greater-than when used with no whitespace, necessitating the turbofish).
(I've heard plenty of complains about Rust syntax, so I'm less so interested in that than what C++ syntax gets right. Unless it's just a familiarity thing...)
It's pretty much familiarity. If I'd learned Rust back in the day, I'd probably not want to learn C++ for syntax reasons as well.
One thing I think Rust gets wrong is classes. I absolutely don't understand why you would require a separate `impl` block to provide methods. C++ has a reasonable syntax of providing methods in the class.
Well, they're not classes, they're interfaces, and so you can implement multiple interfaces for multiple types, and so you have to implement them separately from the type declaration. There's not too much of a way around that, I think.
Nim is particularly C-like. The automatic memory management is optional and exposes destructors, it exposes pointers and is quite usable on embedded systems (see: Futhark, Ratel), there are a wide variety of design decisions made to ease interop with C... I do not know about D.
Koka is garbage collected. There are several terminology ambiguities in play: the documentation takes "garbage collection" to refer to tracing garbage collection as opposed to runtime cost of any sort, which while common in some circles seems less so common as a whole (this is extremely confusing, all the time). This runtime overhead is reference counting and so is going to be a whole lot nicer to deal with (especially re: C FFI) than tracing, but it does exist.
The reason Koka's GC is interesting despite being based on reference counting is that its ownership system eliminates most of these reference checks at compile time - and additionally can tell whether to use atomic RC (slow but threadsafe for shared data) or non-atomic RC (fast but only threadsafe when data is moved across threads, not shared). This ownership analysis is very similar to what some other languages like Nim do (except Nim differs in not allowing atomic RC at all).
The other strange terminology that is occasionally tossed around in Koka documentation is "garbage free": Koka takes this to mean that at any given point in the program, there is no memory waiting to be freed. This is because the ownership analysis lets the compiler know exactly where the last use (or possible last use) is and insert destructors accordingly. All of that has made Koka's GC algorithm fast and low-overhead enough that it's competitive with state-of-the-art tracing GCs (specifically, OCaml's GC). I haven't seen benchmarks comparing it to manual memory management or strict ownership systems but that's not terribly the point - manual memory management is unsafe and strict ownership is complicated + inexpressive on occasion. Koka's system might just be the best you can get, with those tradeoffs in mind.
Anyway, this doesn't answer your question at all. Sorry. I hope it's interesting, though.
I’m on their side of this semantics issue - I don’t consider reference counting to be garbage collection, to me it’s a stand alone group of memory management techniques, even if there is some overlap in implementation techniques with (tracing) GC sometimes. It’s in the same category as Swift, right? No runtime, different thing.
Well, it has a runtime. Checking and updating the reference count (more so the latter) is not zero-cost. This runtime is just deterministic. Of course, then do we have the same definition of runtime (I would take it to mean any extra memory or processor overhead at runtime that is not strictly necessary)... naming and consistent naming is an extremely hard problem in computer science.
It's in the same category as Swift, yes, but much improved: Swift does not do ownership analysis to get rid of counts (though I've heard they're looking at alternative region-based approaches), and their counts across threads are always atomic (and thus slow).
Reference counting has traditionally led to worse performance than tracing. So even though I get the desire to think of it as separate because it's just transparently replacing your allocator / deallocator with one that does a little bit more instead of having a whole separate tracing collector program, I'd still probably refer to both tracing and reference counting as "garbage collection", and then refer to them + ownership systems (+ regions + everything else new) as "memory management techniques".
The downsides of this approach are unfortunately that it makes wrapping certain low-level libraries an absolute pain in the ass (especially anything to do with keyboards). But overall it's a non-issue, tooling recognizes both styles and you don't notice it.