A combination of a good and restrictive language compiler (Rust, OCaml, Haskell) and an amazing runtime (Erlang) is the sweet spot that everyone should be aiming at.
If anything, I am very tired of seeing yet another LISP dialect -- or any other language really, come to think of it now -- being announced. Many of us the programmers love to play and going to check on these languages is IMO taking away precious mind-share.
If anything, in my eyes it's exactly because programming languages matter is the reason why we should have less of them. We should start folding some languages inside others. (Or abandon them.)
As a counterpoint, the programming industry is vast, so the opportunity cost of using tools that are not as good as they could be is also very high. If we don’t continue to explore new possibilities, how will we make those tools better? How can we learn what is worth keeping, what to combine, what to abandon?
I believe there is huge potential in finding better programming languages and better programming models for them to describe. We are still at the stage where we are worrying about whether our programs are even behaving correctly. Sometimes we get as far as worrying about performance. There is a lot of talk about productivity but it is relatively rare that we consider language design as a way of expressing our ideas more efficiently or making it easier for someone else to understand them later.
If we look at languages like Haskell or Erlang or Rust, these have certainly been used professionally, but in the long term their most important contribution might be the ideas they introduced to wider audiences rather than anything written in those languages themselves.
...And I've never seen your sentiment work. Nobody is really learning anything, people just want to tinker with stuff and never read history or even best practices. All I see are people going in circles forever.
Maybe there's a smaller percentage of much clever programmers out there. I wouldn't know because I never (so far) attempted to do anything beyond web apps (though I do regret that a lot and might yet change it). And maybe these people are truly evolving the art. I mean we have Golang, Rust, WASM, and others so I know these people exist.
But somehow that almost never penetrates the broader programming community. Maybe Rust is the only true example because people started wanting to have sum types in their day-job languages -- which I view as a good thing. Such sentiments have the potential to gain enough critical mass to have language designers reconsider their initial choices (f.ex. Elixir is working on an optional type checker, one that's stricter and more descriptive and correct than the one coming with Erlang).
So I don't know. I wish you are correct but after 22 years in the sidelines the only true improvements I've seen are Elixir / Golang (in terms of transparent parallelism where Elixir wins over Golang but Golang is still much better than almost everything else out there as well) and Rust (for the aforementioned compile-time guarantees and other ones like memory safety).
Outside of that though? Nope. "Hey let's have one more JS framework, we didn't have a new one this month" is something I've seen a lot of, not to mention the eternally growing list LISP interpreters because apparently that's the peak of our collective intelligence and ambition. :(
I just get sad. HN is a place where a supposed intellectual elite gathers but they don't seem to be interested in anything beyond their pet language that will never have even 1% of the goodness that a much-derided language like Golang has. And I view that as a waste of energy and time, and as a very sad thing in general.
Not so long ago, there were plenty of FE people who would argue to the end of time that JavaScript was fine and building ever larger frontend applications wouldn’t benefit from static types that just take more work to write. Today, it seems TypeScript has almost entirely displaced JavaScript for that kind of work.
Not so long ago, we were trying to build those web frontends by manually tracking state implicit in HTML form elements and maybe doing a bit of automatic binding. Then React came along, the frontend world finally realised that immediate mode is a thing, and today building web UIs in a more declarative style from some kind of components is common to almost all of the popular libraries and frameworks.
Each of those changes must have saved millions of hours of developer effort already compared to how we did things before, as well as avoiding countless bugs. Now imagine what we could do if, just as a thought experiment, we could all use a language for frontend web work that didn’t have the legacy baggage that TS/JS have, did have a much more comprehensive and well-designed standard library, and provided better control over side effects and by extension safer and more readable code for all the interactions with remote APIs and state management and interactive DOM elements that modern web apps do all the time. I don’t know where such a language might come from today, but if we can shift such a large part of the industry to TypeScript and declarative/component-based rendering within a few years, it doesn’t seem an impossible dream.
People eventually got around to things like restricting bytes to be eight bits, using a standard character set, and so on. Eventually we will find some language factors that “stick” (e.g. abandon the stupid distinction between statements and expressions) which will become baseline and the space of variation will diminish.
I'm not saying that every existing language has solved it, I mean that it's been shown by modern non-research languages (ex. Rust) that the problem need not exist. Something to be excited about, not bitter
So many ideas from Lisp have slowly become mainstream (lambdas, closures, GC, interpreters with dynamic typing, languages both interpreted and compiled...) that I feel like any convergence is far off.
> We should start folding some languages inside others. (Or abandon them.)
Who's "we" though? No one decides what we work on unless they pay us for that privilege.
I don’t understand how the argument about LISP would imply that programming languages matter “not as much as many people think”
And even though I am eating down votes I will keep saying it: fangirling over LISP I view as a collective drag and to the detriment of the entire programming area.
Obviously I am not a world dictator saying what should people spend their time on. I am saying that if you want to truly move the art forward, well, we have 5000 other problems that are at least 100x more important than "oh look I can code a basic LISP interpreter".
My opinion, obviously, but it's also one that I would not be easily dissuaded from.
How does one "move the art forward" without understanding the landscape first? That is, an individual can't know what "forward" means without understanding where they currently are. There isn't a finite number of people over a fixed period of time doing all this. Just because something "is known" to humanity doesn't mean it's known by every individual presently. Each generation must rediscover what previous generations knew, either through raw insight or by knowledge transfer. People aren't born with computing knowledge :)
Viewed this way, how many people in the world, presently, have sufficient knowledge to "move the art forward"? How many have the means? I'd put it at a few hundred. Maybe you're one of them?
You explicitly say you can't be easily disuaded from your opinion, so maybe I'm just spitting into the wind. However, rather than talk down on people doing the hard work of learning where they're at in history, being excited my genuinely exciting things, and taking the necessary steps to "move the art forward", maybe you could assist them by sharing your experience? Or, simply move the art forward yourself :)
PS: Play is exactly what's needed. That's how humans learn and discover :) But maybe we need to play more efficiently? ;)
IMO we the programmers scatter ourselves too much.
(slap)
(wake-up sleepy)
common lisp has actors for a while now
STM: https://cs.brown.edu/~mph/HerlihyM93/herlihy93transactional....
Region based memory management: https://en.wikipedia.org/wiki/Region-based_memory_management
Rust lifetimes, originally from Cyclone: https://en.wikipedia.org/wiki/Cyclone_%28programming_languag...
Mutable value semantics: https://arxiv.org/pdf/2106.12678.pdf
Region based memory management was first conceived in 1967 and is achievable by any programming language that lets you manage memory yourself.
Mutable value semantics in native code have been available since at least 1980 with Ada.
Lifetimes in Cyclone seem the best example of PL research in the last 50 years you have there, as it’s only 20 years old.
Overall, I’m still unsure if this list proves the point that there is active useful research in the PL space or if it proves that there’s very little in the PL space to research. More research is probably required.
As others have pointed out, there's STM research in PL, it's not entirely about hardware. (The link I gave wasn't great, sorry.)
> Mutable value semantics in native code have been available since at least 1980 with Ada.
Could you link to the relevant docs? I wasn't aware Ada had anything like this.
Is this implemented under the hood with deep copying? Because if so, that would explain why it hasn't started to catch on anywhere until now. Swift and Hylo have much more efficient implementations that "copy all the time".
https://www.jot.fm/issues/issue_2022_02/article2.pdf
> Region based memory management was first conceived in 1967
There's active research in this general space. I met someone who was working in it on a train, though I forget the details.
> and is achievable by any programming language that lets you manage memory yourself
Sure. I mean Rust lifetime discipline is "achievable" in C too, so long as you're very very careful.
> Lifetimes in Cyclone seem the best example of PL research in the last 50 years you have there, as it’s only 20 years old.
It typically takes 10+ years for PL research to go from papers to research languages to being incorporated into"real" languages.
> More research is probably required.
Always.
STM is not about hardware, it's literally "software transactional memory" and is meant to be implemented in software without hardware support (beyond a CAS instruction or a similar set of instructions, perhaps). As a software component it could be part of libraries or part of a programming language as part of that language's general concurrency model.
See Rayon.
This is like when I hear people claim that physics has not advanced in the last 50-70 years.
As I understand it, Futhark aims to leverage GPUs in particular, and that approach seems to be what makes it unique within the category of FP languages?
Also, just think about all the optimizations your "serial" programming language does -- are your yourself really write all those mutations? Or is that the compiler, that in many cases can do a much better job? Now what if the language's semantics allowed even more freedom for the compiler in exchange for more restrictions on the language? Sure, we still don't have "sufficiently advanced compilers" that would replace programmers, but FP languages absolutely trade blows with most imperative languages in many different kinds of problems. Very visibly when parallelism comes to the picture, as it turns out, a smart parallel-aware data structure will easily beat out their serial counterparts here.
FP is also particularly well suited for cloud computing and parallel computation.
And it's not like every academic idea that worked in a paper has worked as well as hoped when someone tried to turn it into a production-quality ecosystem.
I've always assumed that, by now, I would be able to write code, in a semi mainstream language, and it would be made somewhat parallel, by the compiler. No need for threads, or me thinking of it.
There's projects like https://polly.llvm.org, but I guess I assumed there would be more progress through the decades.
The other big impossible task is that most code isn't written to be able to take advantage of theoretical autoparallelization--you really want data to be in struct-of-arrays format, but most code tends to be written in array-of-struct format. This means that vectorization cost model (even if proven, whether by user assertion or sufficiently smart compiler, legal) sees it needs to do a lot of gathers and scatters and gives up on a viable path to vectorization really quickly.
And the majority of software we've inherited is written this way.
In the 90s this didnt matter, since dereferencing a pointer was comparably expensive to arithmetical operations. But with modern CPUs with massive caches and more native parallelisation, the difference is dramatic.
So, even now, the majority of languages we're using; and almost all code we've inherited today, are as far away as you can get from efficiently using modern CPUs.
The task is first to change all these languages to enable ergonomic programming without tons of indirection -- we're very far away from even providing basic tools for performant code
As you noted, polyhedral compilers work on a pretty restricted subset of programs, but are fairly impressive in what they do. There has been research on distributed code generation [1] as well as GPUs [2]. While there has been work on generalizing the model [3], I think the amount of parallelization that a compiler can do is still very limited by its ability to analyze the code (which is to say, highly restricted).
Then you've got a large class of data-parallel-ish constructs like Rayon [4] as well as executors which may work their way into the C++ standard at some point [5]. How much safety these provide depends greatly on the underlying language. Generally speaking, the constructs here are usually pretty restricted (think parallel map), but often you can write more-or-less arbitrary code inside, which is often not the case in the polyhedral compilers.
If you don't care so much about safety and just want access to every parallel programming construct under the sun, Chapel [6] may be interesting to you. There is no attempt here, as best I can tell, to offer any sort of safety guarantees, but maybe that's fine.
On the other end of the spectrum you have languages like Pony [7] that do very much care about safety, but (I assume, haven't looked deeply) this comes with tradeoffs in expressiveness.
(I work in this area too [8].)
Overall, there are some very stringent tradeoffs involved in parallelizing code and while it certainly has been and continues to be a very active area of research, there's only so much you can do to tackle fundamentally intractable analysis problems that pop up in the area of program parallelization.
[1]: https://www.csa.iisc.ac.in/~udayb/publications/uday-sc13.pdf
[2]: https://arxiv.org/pdf/1804.10694.pdf
[3]: https://inria.hal.science/file/index/docid/551087/filename/B...
[4]: https://docs.rs/rayon/latest/rayon/
[5]: https://github.com/NVIDIA/stdexec (disclaimer: I did a quick Google search on this, not 100% sure this is the best link)
Mutation (and other effects) makes the order of computations important. If you're writing to and reading from variables, the compiler is not free to move those operations around, or schedule them simultaneously.
And you probably don't want to be rid of all mutation. So what if you separated the mutating from the non-mutating? Well you'd need a sufficiently powerful type system. Likely one without nulls - as they can punch a hole through any type checking.
If you want this stuff in the mainstream, you at least have to get all the nulls and mutation out of the mainstream, which I don't think will happen.
The industry for the most part heeded "goto considered harmful" (1968), but hasn't done so with "the null reference is my billion dollar mistake (2009)". Maybe we just have to wait.
* Go, with goroutines and heavy use of channels.
* Rust which is free of data races and generally improves the safety of multithreaded programming via Sync, Send and just safer APIs (e.g. Mutex).
* Chapel, which is a language designed primarily for multithreaded and multiprocess computing.
Those are just the ones I know about. There's obviously way more.
[1] https://en.wikipedia.org/wiki/Embarrassingly_parallel#:~:tex....
Some of the SIMD operations feel very reminicent of APL primitives
I was told Rice and UIUC provide the best compiler program, though not necessarily AI related, should be similar though.
Missing the last letter