throwaway17_17
There are some arguments that do carry water in favor of using a client/server protocol transmitting JSON, in particular, the ability for a nearly complete decoupling of analysis of code and the displaying and editing of that code. Also, LSP was (to my knowledge) the first language/platform/usecase agnostic protocol intended for use in code editors.
I get why this is where a big chunk of developers have ended up, but I do bemoan the lost potential for a language to grab mindshare and popularity on the usability and performance of its tooling and developer experience via-a-vis a custom designed and hyper specific code editor. I mean, Rust and Elm received endless praise for their error messages as a massive boon to developer experience, so it is a facet of language design and implementation that can act as great advertisement. I just hate that the prevalence of LSP at this point precludes custom editors as a first choice in the current zeitgeist.
It also could be one of the most terrifying talks I’ve ever heard, but since it is eight years old, I am going to just pretend all of the research he mentions fell through and I have nothing worry about.
Although I am not interested in using LLMs for much of anything, the theory and implementation (where the implementation is not just use some prepackaged library code) in a comprehensive presentation is not something I’ve seen before.
Is there somewhere that async/await is implemented as a different concurrency mechanism?
However, if you mean ST in Idris 1.0, there is a definite correlation. The mechanism that ST used for enabling local mutations was very similar to the mechanism that the typestate pattern in Rust is using. ST was a framework for formalizing State Machines in dependent types which is the mechanism TFA is analyzing.
How do you find the feature useful in this instance, I can’t quite picture how that works for typestate pattern functions.
I too am nearly certain that the positive benefits are approaching nil, but I still feel it should be helpful.
Obviously if you are operating in a wide, concurrent async system then the Ticket and separate function calls is the better mechanism for the ordering.
As a separate point, I think this is an excellent example of making invalid states unrepresentable.
I was talking with a junior at the office today about LLM output and mentioned em dashes, to which responded “oh, I thought that was just where formatting for hyphens was going, I guess I learned something from the AI writing instead of the other way around” and god, his acceptance of it was just deprrsssing.
I think the Buddhist reply would be that living without craving and without yearning leads to truly being ‘alive’ and enables one to feel, to touch, and to experience the world as it is and in the immeasurably short time a person is alive within it. An existence where the present is experienced and cherished in the moment of having it, while knowing and accepting the inevitability of this moments ending. Such a life, in the Buddhist tradition, embodies the knowing and accepting of the ultimate emptiness of reality and then proceed to live, not in spite of the emptiness, but in the full appreciation of the act of living.
A lot of discussions I’ve seen, and taken part in, when focusing on Camus and his cadre of fellows lead to a comparison between Buddhist thought and existentialist thought. I tend to side closer to the Buddhist outlook and acceptance of the ground truth of sunyata (often translated ‘emptiness’) versus the more modern tendency toward western Nihilism as a response to the Absurd. The depths of response in people and their dealings with these thoughts and feelings interest me, but I also like to watch people choosing between descriptions of Absurdity to try and make it a completely different concept to the Buddhist ideas.
I’m not sure I agree that ‘Camus couldn’t conceive of’ the Buddhist response to the inherent tension arising from craving ultimate meaning where none is possible; however, he and the other existentialists certainly went to great written lengths to seemingly avoid finding the Buddha’s answer.
With all the “AI” has made coding/learning to code a dead end and unnecessary crud being peddled currently I don’t know if people who want to actually learn to program are going to find resources that can be as motivating as this and other articles from `the before times`. It leaves me slightly bummed out, but in my less pessimistic moments I think motivated learners are going to see through the hype and find these types of resource anyway.
On a side note, the Norvig’s articles about implementing a Scheme in Python were my first foray into designing and implementing programming languages, compilers, and interpreters which really shaped my interest all the way through to today.
I certainly think there is was inflection point for Unreal’s inherent complexity moving to 5 that made it exponentially more difficult to customize when compared to 4 as far as implementing highly customized renderers (in particular) and overall customization in general.
- infrastructure development like Docker and Kubernetes
- general utilities programming like grep, terminal emulators, compilers, etc
- performance sensitive artifacts like OS kernels, video/audio codecs, hardware interaction layers
and more in common usage. Without some sort of communal understanding of the taxonomy of development areas discussing things like GC in systems programming becomes tedious and often prone to arguing past people due to conflicting understanding of terminology.I do think there are genuinely ripe areas of research and development for performance and determinism sensitive memory management and subsequent outreach to make sure the potentially effected developers and language designers actually have a chance to evaluate any advancements. But it sure seems like it would take an act of ‘developer congress’ to make sure people were talking about the same things.
But, maybe this is a terminology issue conflating an embeddable language with a language used for embedded programming. I think this is one of those CS issues prevalent for non-native English speakers (especially when those devs are relying on translations of text without LLM style semantic analysis of the source).
The first refers to the shipping of a language interpreter within the executable of a program, where that interpreter then processes “scripts”, data files, high level non-programmer editable object attributes or behaviors, etc. The most prevalent example of this is shipping a Lua interpreter inside a video game for interpreting hot reloadable asset scripts. The second usage of embedded is the implication that code is being run on a microcontroller or SoC ‘embedded’ within some other product or device.
TL;DR Green threads are on a library feature for low level languages.
1 - Threads Cannot Be Implemented as Libraries (Boehm 2005), https://dl.acm.org/doi/10.1145/1064978.1065042
I read through a segment of your language’s docs when it was on the front page a couple of days ago ago. Since you’re talking safety’s is there a link (or just a suggested starting point) to read about Ü’s safety mechanisms and guarantees?
I feel like I sit along a different axis in the safe versus unsafe discourse, so I don’t discount languages like Zig or Mach for not providing opt-out safety for certain areas of concern and I don’t give extra credit to languages like Rust or Ü for having those features. What I am interested in is what choices where made and why, then what do those choices mean for me as a potential user of a language.
As the developer, where do you land on meta-programming for the language? I applaud the straight up nature of ‘the battery will never be included’ and the reminder to consider the possibility of a feature being a library instead of a syntax or language feature. I certainly don’t think meta-programming is essential, but the ability can contribute to the ease of use for library code.
And I’ll ask now since it always comes up, where does Mach stand on ‘advanced’ type theory uses for ‘low-level’ programming? I noticed the admonition that safety is the developers job which is sure to bring some ‘heat’ from the memory-safety-is-table-stakes crowd, in light of that, where does Mach stand regarding ways to ensure ‘safety’?
I wonder if the argument for the do notation’s usage being better along several metrics can stand generalization. There are sometimes discussions about the merits of named argument to functions and data constructors versus the much more common positional syntax, the arguments made in favor of more ‘broad spectrum’ named arguments reflect the more specific pro’s being argued in TFA.
It would be interesting to see what types of syntax additions, and the accompanying weight of those additions throughout an entire code base, would prove an acceptable trade off for moving away from positional arguments being the default. I almost assume the extra line noise and extra name selection would be the most negative effects, but the most positive effects are harder for me to guess at. But overall, the reaction of devs to more ‘book keeping’ in there code is hardly ever positive.
In the context of an article about C++’s coroutines for building concurrency I think structured concurrency is out of scope. Structured concurrency is an effective and, reasonably, efficient idiom for handling a substantial percentage of concurrent workloads (which in light of your parent’s comment is probably why you brought up structured concurrency as a solution); however, C++ coroutines are pitched several levels of abstraction below where structured concurrency is implemented.
Additionally, there is the implementation requirements to have Trio style structured concurrency function. I’m almost certain a garbage collector is not required so that probably isn’t an issue, but, the implementation of the nurseries and the associated memory management required are independent implementations that C++ will almost certainly never impose as a base requirement to have concurrency. There are also some pretty effective cancelation strategies presumed in Trio which would also have to be positioned as requirements.
Not really a critique on the idiom, but I think it’s worth mentioning that a higher level solution is not always applicable given a lower level language feature’s expected usage. Particularly where implementing concurrency, as in the C++ coroutines, versus using concurrency, as in Trio.