1978년 Dijkstra가 통렬히 비판한 '자연어 프로그래밍'의 어리석음
The foolishness of "natural language programming" (1978)
1978년 Edsger W. Dijkstra는 EWD 667에서 자연어로 기계를 프로그래밍하자는 발상을 정면으로 반박한다. 그는 형식 기호 사용의 의무를 부담이 아니라 특권으로 봐야 한다고 주장한다. 인터페이스 변경은 양쪽의 작업량을 늘릴 수 있고, 그리스 수학과 이슬람 대수학이 쇠퇴한 역사가 이를 뒷받침한다. 자연어의 '자연스러움'은 결국 명백하지 않은 넌센스를 쉽게 만들어내는 능력일 뿐이다.
결국 우리가 모국어를 사용하는 '자연스러움'이란, 그 넌센스가 명백하지 않은 진술을 만드는 데 얼마나 쉽게 쓸 수 있는가로 귀결된다.
HN 토론
159- benrutter
이 글은 꽤 잘 늙은 것 같고 여전히 정확하다고 생각한다.
어떤 사람들은 에이전트 개발이 "자연어 프로그래밍"이라고 반박할지도 모르지만, 나는 그게 맞다고 생각하지 않는다. 그 경우 프로그래밍을 하는 것은 에이전트이고, 프로그래밍은 여전히 Rust/Python/Typescript 등과 같은 결정론적 언어로 항상 이루어진다. 아마 그게 바뀔 수도 있겠지만, 적어도 나에게는 반대 방향은 재앙일 것이다.
내가 아는 최고의 예외는 단연코 텍스트 어드벤처를 작성하기 위한 Inform 7 언어이다[0]. 많은 팬이 있고, 나는 깊이 파고들어 본 적은 없지만, 자연어와 프로그래밍을 독특한 방식으로 우아하게 결합하는 것 같다.
어쨌든, 자연어 프로그래밍에 관심 있는 언어 괴짜라면 반드시 확인해봐야 할 것이다.
- nickm12
나는 영어가 이제 고급 프로그래밍 언어이며, 기계어에서 <그들이 가장 좋아하는 언어>로 이어지는 추상화 사슬의 다음 단계라고 말하는 모든 사람에게 이 글을 보낸다. 이 비유는 대개 "대부분의 프로그래머가 어셈블리 코드를 보지 않는 것처럼, 고급 소스 코드를 보는 것도 소수만 하는 일이 될 것"이라는 말로 이어진다.
Dijkstra의 주장은 그들의 생각을 바꾸지 못하는 경향이 있다. 나는 이 비유가 자리 잡는 이유는 그 안에 진실의 핵심이 있기 때문이라고 생각한다. AI 모델은 이제 자연어로 프로그래밍할 수 있는 마법 같은 능력을 우리에게 주지만, AI 모델이 일종의 컴파일러라는 암시는 심각한 결함이 있다. AI 모델은 컴파일러를 대체하는 것이 아니라 소프트웨어 개발자를 대체한다. 소프트웨어 개발자가 어셈블리 코드를 거의 보지 않는 이유는 컴파일러(그리고 에뮬레이터와 VM)가 원래 프로그램의 의미를 정확하게 보존할 수 있기 때문이다.
자연어 명세는 프로그램이 아니며, 그 명세를 충족할 수 있는 프로그램은 여러 가지가 있다. 소프트웨어 엔지니어와 AI 모델은 명세를 코드로 바꾸지만, 그 코드는 명세가 아니다. 나는 이 비유가 컴퓨터가 해야 할 일을 형식적으로 기술하고, 인간이나 AI 모델 어느 쪽에도 맡겨서는 안 되는 프로그램의 속성을 강제하는 도구로서 프로그래밍 언어의 가치에 대한 우리의 사고를 흐리게 만든다고 생각한다.
- froh
나는 그 차이가 순전히 기계적인 존재와 의사소통하는 것과 지능적인 존재와 의사소통하는 것 사이에 있다고 생각한다. 순전히 형식 언어인 프로그램과 달리, 우리는 교과서와 논문을 인간 언어와 형식 언어를 섞어서 쓴다. 종종 "딱 필요한 만큼만 형식적인" 표기법을 도입한다. 그리고 지능적인 독자는 그 사이를 읽을 것이다. inter legere는 문자 그대로 "사이를 읽다"를 의미한다. 빈틈을 메우고 점을 연결하는 것이다.
그리고 실제로 나는 해당되는 경우 형식 언어로 핵심 아이디어를 표현하는 것이 _매우_ 효과적이라고 생각한다. 여기에는 약간의 EBNF, 저기에는 Python이나 Prolog 또는 다른 언어의 스니펫이 있다. 그리고 나는 LLM이 점을 채우고, 여기서의 주제인 우리의 반형식적 대화를 엄격한 형식 언어로 번역하는 데 훌륭하다고 생각한다.
그리고 한 걸음 더 나아가 감히 말하자면, 나는 또한 LLM이 기술 제안서를 공식화하고 다듬는 데 유용하다고 생각한다. 이는 인간 동료 검토와 LLM 기반 구현을 위한 것이며, 물론 이러한 제안서는 자연어 산문과 반형식적이고 형식적인 세부 사항을 혼합한다. PEP-12와 PEP-1 스타일을 생각해 보라. 그리고 이것들은 각각 SDD에서처럼 명세를 포함하는 작업 패키지로 이어진다.
지금까지는 아주 잘 작동하는 것 같다 :-)
- uriegas
코딩 에이전트가 등장한 이후로 같은 견해를 가지고 있다. LLM은 요약을 잘하므로 코드를 이해하는 데 사용하는 경향이 있다. 그러나 코드베이스를 더 많이 이해할수록 에이전트에게 더 까다로워지는 경향이 있다. 반면 코드베이스에 대해 덜 알수록 에이전트가 하고 싶은 대로 하도록 더 열린 마음을 가진다.
나는 에이전트가 '좋은' 코드를 작성하는 것이 아니라, 내가 기대하는 것에 대한 모호한 이해 때문에 그렇게 생각하게 된다는 것을 깨달았다. AI 코드를 보면 코드를 작성하기 전에 내려야 했던 더 많은 뉘앙스와 결정이 있다는 것을 알 수 있다. 명세만 있으면 충분하다고 말할 수도 있지만, 그때 나는 Leslie Lamport가 개발자들이 프로그램/알고리즘에 대해 비판적으로 생각하도록 돕기 위해 개발한 TLA+를 떠올린다. 앉아서 내가 하고 싶은 것을 형식적으로 작성하는 것은 문제를 더 잘 이해하고 모호하게 정의되지 않은 진짜 해결책을 내놓는 데 도움이 된다.
- GianFabien
자연어는 뉘앙스와 암묵적인 문화적, 도메인 특정적 함의로 가득하다. LLM이 작동하는 이유는 그러한 숨겨진 의미 중 일부(전부는 아님)를 인코딩한 방대한 자료 코퍼스로 훈련되었기 때문이다.
명세 주도 개발에서는 정확히 필요한 것을 생산하기 위해 프롬프트가 매우 상세해야 한다.
- imhoguy
오늘날의 자연어 프로그램은 자연어의 불안정한 특성 때문에 내일은 작동하지 않을 것이다.
의미의 자연스러운 진화 외에도, 일부 (클라우드) 모델이 부과하는 오웰적인 제한을 보라. 우리의 자연어 프로그램이 불법이 된다. 주제나 단어 조합 때문에 프로그램이 플래그 지정되고 곧 세 글자 기관에 보고될 가능성이 높다.
다음으로 RMS는 이렇게 물을 것이다. 처음부터 자신만의 자연어 프로그램 컴파일러를 만들 수 있습니까?
우리에게 (매우 비싼) 로컬 모델이 있다는 것을 알지만, GPU가 제대로 된 온라인 구독과 감시 도청을 받을 때까지 기다려 보라.
- mpweiher
관련 있을 수 있음:
자연어(영어와 일본어)를 닮은 언어를 설계하려는 실험은 성공적이지 못했다. -[1]- William R. Cook, AppleScript, HOPL IV
이제 우리의 새로운 LLM은 "자연어를 닮은 언어"를 사용하지 않고 실제 자연어를 사용하기 때문에 다르다. 그러나 그 교훈은 여전히 유익하다. 왜냐하면 Dijkstra의 이론적 주장과 비교할 수 있는 경험적 증거를 제공하기 때문이다.
그리고 그것은 자연어가 기껏해야 양날의 검이라는 것이다. 그렇다, 이점이 있지만 큰 단점도 있다. 그리고 한 가지 문제는 이점은 앞쪽에 집중되어 있고 단점은 장기적인 문제라는 것이다.
나에게 우리가 놓치고 있는 한 가지는 LLM이 우리를 위해 하는 일에 실제로 두 부분이 있다는 것이다.
1. 자연어를 사용할 수 있게 해주어 모호해질 수 있게 한다.
2. 평소보다 훨씬, 훨씬 높은 수준에서 원하는 것을 지정할 수 있게 한다.
우리의 LLM에서는 이 둘이 본질적으로 연결되어 있다. 나는 이 둘을 분리할 수 있다면 전체가 훨씬, 훨씬 더 가치 있을 것이라고 생각한다.
- riknos314
> 나는 우리 모국어(네덜란드어, 영어, 미국어, 프랑스어, 독일어, 스와힐리어 등)로 프로그래밍되는 기계는 사용하기 어려운 만큼 만들기도 지독히 어려울 것이라고 생각한다.
그는 여전히 상당히 정확하다. 나는 일반적으로 기계가 소스 제어에서 추적되는 무엇으로 "프로그래밍된다"고 본다. 따라서 git 저장소가 Java의 변경 사항을 추적하는 한, Java가 LLM의 도움으로 생성되었더라도 여전히 Java로 프로그래밍된 것이다. 이 글의 논제는 대부분의 저장소가 소프트웨어 동작을 정의하는 기본 아티팩트로 프로그래밍 언어 대신 자연어를 추적하기 시작할 때만 무효화된다고 볼 것이다.