Hacker News new | past | comments | ask | show | jobs | submit
I send this article to everyone who tells me how English is now a high-level programming language, the next level of abstraction up the chain from machine language to <their favorite language>. This analogy tends to be followed by "Just like most programmers never look at assembly code, looking at higher-level source code is going to become something only a few people do".

Dijkstra's arguments tend not to change their minds. I think the analogy takes hold because there is a kernel of truth in it. AI models now give us the magical ability to program in natural language, but the implication that an AI model is a form of compiler is deeply flawed. AI models don't replace compilers, they replace software developers. The reason software developers rarely look at assembly code is that compilers (and emulators and VMs) are able to precisely preserve the semantics of the original program.

A natural language spec is not a program, and there are many possible programs that can meet the spec. Software engineers and AI models turn specs into code, but the code is not the spec I think the analogy clouds our thinking about the value of programming languages as a tool for formally describing what the computer should do and enforcing properties of the program that should not be left to either humans or AI models to uphold.

Your acquaintances aren't changing their minds because the arguments are weak. Both the article and your comment assume that the only mode of interaction for natural language is a very high level description of programmer intent.

You can interact with AI and say "code me a calculator" or "now declare a array of booleans to map to each of the keys in the UI and set the corresponding array position to true when the key is pressed".

These commands are written in natural language at such different levels of abstraction that is hard to put them in the same bucket. It would be fair to call the latter an imperative language with the LLM in the role of a compiler. That's very similar to how I use AI.

loading story #50209597
loading story #50206033
loading story #50205850
loading story #50210048
> AI models don't replace compilers, they replace software developers.

No, they replace the need for a precise description of what you want the computer to do by a mechanism that's really good to fill in the gaps. But guesswork only takes you so far.

loading story #50205257
loading story #50207684
You mean the English to code layer is stochastic while code to assembly is not?

This stochastic nature existed before AI. Humans are stochastic too. Two engineers convert specs to code in two different ways. I would argue the distribution is wider among humans than among agents.

loading story #50203898
loading story #50204680
loading story #50205540
> Two engineers convert specs to code in two different ways

So? Two compilers convert source to binary in two different ways.

"Time flies like an arrow" is a valid English sentence that one person can find numerous ways to interpret. A programming language that has the kind of ambiguous syntax that natural languages have would not be useful.

What makes agents useful is not simply that they interpret natural language, it is that they are interactive and ambiguous instructions can be corrected when the agent's output is not what the programmer intended. That is not the same as writing out a spec and giving it to a developer to implement.

And does the "agent" say when the agent's output is not what the programmer intended?
No, the programmer does. Human beings are still in the loop.
So might be corrected if the agent's output is found not what the programmer intended.
loading story #50206676
loading story #50203797
The LLMs don't replace compilers, they challenge the next generation of compilers. And they don't replace software engineers, they shift them into yet another metasystem.
The LLMs use compilers, so I am not seeing the challenge here. Compilers do a lot of useful and important things like type checking and agents will typically check their output by invoking a compiler, then correcting errors reported by the compiler.

If anything what agents will mean is a move toward compilers for languages with more expressive type systems that can do more static checks for semantic correctness e.g. F*, which is an extension of F# that introduces dependent types.

loading story #50210460
loading story #50205441
loading story #50207994
I think this might be a false dichotomy, because for instance, I think LLMs are programmable in natural language, and they act as compilers, I even think they can replace programmers; but still I agree with Dijkstra, that programming in natural language is a bad idea.

But I am going in an opposite direction. Instead of rejecting formal languages in favor of natural ones, I think we should embrace formalism even on the level of specifications, requirements and our model of the world. Partly because that's what LLMs actually do - they de facto formalize these things.

> AI models don't replace compilers, they replace software developers

No, what agents do is expand the scope of problems software developers can solve. It is no different than the introduction of compilers, type checkers, garbage collection, and so forth. A programmer in the 1950s could not have imagined how anyone could build a software system like Hacker News, let alone the complex software systems we basically take for granted in this century. It is hard to imagine what kind of software future generations will take for granted because of how much more power programmers will have with things like agents (and whatever comes next -- this is hardly the end of the story).

It is all about definitions. Writing instructions for llms is a new activity and we can call it as we wish - but I like to think about it as a new type of programming language instead of thinking about it as something completely new, because many analogies do transfer and you can use them to reason about larger systems composed of prompts. It is after all a way to instruct a machine.

There are differences and the article highlights some of them - but there are difference between programming in a functional language and an imperative one, there are differences between programming for a RISC machine and a CISC machine, there a lots of different semantics that programming languages support. Now we have a language with underspecified semantics.

loading story #50217147
Thank you for articulating this!! This idea has been rolling around for a while but I haven't been able to put it into words.

I think "I'm working in a higher level of abstraction" is easier for some devs to say than "I asked somebody else to do the thinking and the work." I don't think there's anything wrong with asking an LLM to do the work. But pasting jira tickets into claude is not abstraction lmao.

I guess arguments on either side of this can get difficult for a reason that another commenter already mentioned: you can use LLMs on a wide spectrum of granularity. You can one-shot a whole project, or you can tell it to rename some vars in a single file. I guess there are uses that are probably closer to programming. But if you're not even looking at the code, I'd say that's closer to somebody else doing the work

loading story #50217201
loading story #50208017
It's applied to the programming language too - the given source can be compiled to unlimited number of possible machine code representations (it can different just by NOPs).
loading story #50217248
>Dijkstra's arguments tend not to change their minds.

Maybe they trust the practical results they see over what a professor wrote 50 years ago as an essay.

{"deleted":true,"id":50204185,"parent":50203552,"time":1792726324,"type":"comment"}
Agree. For me, that's exactly what happened. I work with the agents the way I'd work with a team of developers, not the way I use a compiler. Since the end of September, they've made about 970 commits to a project of mine, and I haven't read a line of its code.

And like with a team, many programs could meet what I asked for, but I check the behavior of what they built, not the code directly. I think of it as working on the level of an engineering director, who also doesn't review code directly. Each agent shows me its change running in the app, in a short narrated screen recording, like in a launch review for the director. When it's not what I meant, I say what, and it goes another round.

loading story #50213934
loading story #50205477
loading story #50206064
> The reason software developers rarely look at assembly code is that compilers (and emulators and VMs) are able to precisely preserve the semantics of the original program.

'Precisely' is doing a lot of work here. Depending on your language some things might be preserved and some not. Eg if you write stuff in Haskell, you don't really preserve much of anything about memory usage, you leave that to the runtime system to figure out, and exactly how the GC works isn't really specified in the language standard.

loading story #50217222