절대 이진으로 프로그래밍하기
첫 프로그래머들은 절대 이진으로 작성했습니다: 모든 명령어 & 모든 주소가 원시 이진 숫자로. 단일 명령어는 01100101 00001010처럼 보일 수 있습니다 — 명령어 코드 & 메모리 주소가 이진으로.
스파게티 코드 문제
오류가 새로운 명령어를 삽입하도록 요구했을 때, 프로그래머들은 딜레마에 직면했습니다. 제자리에 삽입하면 모든 후속 명령어 주소가 하나씩 이동합니다 — 프로그래머가 전체 프로그램의 모든 주소 참조를 업데이트해야 합니다. 치명적입니다.
해결책: 삽입 지점 바로 앞의 명령어를 빈 메모리로의 점프로 교체합니다. 그 빈 위치에서: 덮어씌워진 명령어를 작성하고, 새 명령어를 추가한 다음, 다시 점프합니다. 수정에서 오류가 나타나면, 다른 빈 메모리를 사용하여 같은 트릭을 다시 적용합니다.
결과: 프로그램을 통한 실행 경로는 무작위로 보이는 위치로 점프했습니다. 해밍은 이를 '스파게티 캔'이라고 불렀습니다. 종이에 그린 제어 흐름 경로는 정확히 얽힌 스파게티처럼 보였습니다.
탈출 경로
두 가지 즉각적인 개선: 8진법 표기법(이진 숫자를 3세트로 그룹화) & 16진법(4개 그룹화, 9보다 큰 값에 A–F 사용). 이들은 작성 오류를 줄였지만 근본적인 주소 문제를 해결하지 못했습니다.
기호 어셈블리(예: IBM의 SAP — Symbolic Assembly Program — & SOAP — IBM 650의 Symbolic Optimizing Assembly Program)는 프로그래머들이 이진 대신 명령어 이름(ADD, MOVE) & 기호 주소 레이블을 작성할 수 있게 했습니다. 어셈블러는 입력 시간에 이진으로 변환하여 주소 할당을 자동으로 관리했습니다.
SOAP는 추가 최적화를 수행했습니다: 회전 드럼의 명령어를 정렬하여 다음 명령어가 이전 명령어가 완료된 바로 그때 읽기 헤드에 도착하도록 했습니다 — 최소 지연 시간 코딩. SOAP는 자신을 컴파일했습니다: 프로그램 A는 데이터로 처리되어 B를 생성하고, B는 A에서 실행되어 자체 컴파일이 얼마나 개선되었는지 측정합니다.
라이브러리 & 재배치 가능 코드
해밍은 재사용 가능한 소프트웨어(수학 라이브러리) 아이디어가 매우 일찍 나왔다고 지적했습니다 — Babbage가 생각해냈습니다. 문제: 절대 주소 라이브러리는 매번 사용될 때마다 모든 루틴이 동일한 메모리 위치를 차지해야 했습니다. 전체 라이브러리가 너무 커지면 프로그램들이 동일한 주소를 놓고 경쟁했습니다.
해결책: 재배치 가능 코드. 어셈블러는 절대 주소 대신 메모리를 상대적으로 참조하는 명령어를 생성합니다 — 기본 주소로부터의 오프셋. 링커는 로드 시간에 최종 주소를 해결합니다.
폰 노이만의 미발표 보고서(광범위하게 유포됨)는 필요한 프로그래밍 트릭을 설명했습니다. 첫 출판된 프로그래밍 책(Wilkes, Wheeler & Gill, EDSAC, 1951)은 이러한 기법을 성문화했습니다.
언어 설계 분기
FORTRAN(1957, IBM) & ALGOL(1958, 국제 위원회)은 급진적으로 다른 결과를 낳은 두 가지 설계 철학을 나타냅니다.
FORTRAN
John Backus는 IBM에서 FORTRAN(FORmula TRANslation) 프로젝트를 주도했습니다. 설계 목표: 과학자 & 엔지니어가 사용하기 쉬운 언어를 만드는 것입니다. FORTRAN은 사용자에게 자연스러운 수학 표기법을 수락했습니다: ADD B, C; STORE T; MULTIPLY T, D; STORE A 대신 A = B + C * D.
FORTRAN은 60년 이상 생존했습니다. 과학 컴퓨팅, 유체 역학, 기후 모델링, & 계산 물리학에서 활발히 사용되고 있습니다. 해밍은 이 내구성을 성공적인 설계의 증거로 지적했습니다.
ALGOL
ALGOL(ALGOrithmic Language)은 수학적 엄밀함을 목표로 하는 논리학자 & 컴퓨터 과학자 위원회에 의해 설계되었습니다: 논리적으로 깔끔하고 형식적으로 정의 가능한 언어. 문법을 설명하기 위한 Backus-Naur Form(BNF) 표기법은 ALGOL을 지정하기 위해 발명되었습니다.
ALGOL은 실제로 실패했습니다. 논리적 우아함 & 후속 언어 설계에 미친 엄청난 영향(Pascal, C, & 거의 모든 현대 언어는 ALGOL의 문법 개념에서 유래됨)에도 불구하고, ALGOL 자체는 광범위하게 배포된 적이 없습니다. 해밍의 판결: 논리적으로 설계되었지만 인간적으로 사용 불가능합니다.
언어의 계층 구조
해밍은 기계 코드에서 어셈블리, 고수준 언어, & 궁극적으로 실무자들이 자신의 문제 영역을 생각하는 방식에 가까운 '문제 지향 언어'까지의 자연스러운 계층 구조를 설명했습니다. 각 수준은 기계 효율성을 대가로 인간 가독성을 추가합니다.
해밍의 네 가지 언어 설계 기준
해밍은 FORTRAN vs ALGOL의 교훈을 성공적인 프로그래밍 언어를 위한 네 가지 기준으로 추출했습니다:
1. 배우기 쉬움 — 초보자가 빠르게 생산성을 높일 수 있습니다
2. 사용하기 쉬움 — 일상적인 작업에 최소한의 의식이 필요합니다
3. 디버깅하기 쉬움 — 오류는 의미 있고 찾을 수 있는 메시지를 생성합니다
4. 서브루틴을 사용하기 쉬움 — 재사용 & 추상화가 영웅적인 노력을 요구하지 않습니다
그는 구조적 관찰을 추가했습니다: 인간 언어는 약 60% 중복성을 가집니다; 서면 언어는 약 40%. 낮은 중복성 언어(APL 같은)는 전문가는 아름답다고 생각하고 초보자는 불투명하다고 생각하는 우아한 한 줄짜리를 생성합니다 — & 단일 문자가 의미를 변경할 때 감지 불가능한 오류를 포함합니다.
함의: 논리적 우아함을 위해 설계된 언어는 잘못된 독자를 위해 최적화합니다. 프로그래머는 인간입니다; 인간은 오류를 잡고 의도를 전달하기 위해 중복성이 필요합니다.
심리학적 vs 논리적 언어 설계
해밍은 FORTRAN/ALGOL 대조를 언어 설계뿐만 아니라 제도적 & 인간 역학의 교훈으로 돌아왔습니다.
FORTRAN은 심리학적으로 설계되었습니다 — 이를 사용할 인간을 위해, 특히 수학 표기법으로 생각하는 과학자들을 위해. ALGOL은 논리적으로 설계되었습니다 — 형식적 정확성 & 이론적 우아함을 위해.
해밍이 식별한 역설: 인간이 저항하는 논리적으로 정확한 언어는 실패합니다; 인간이 채택하는 실용적으로 설계된 언어는 성공합니다, 논리적으로 더 지저분하더라도.
그는 APL을 극단적인 경우로 언급했습니다: 논리적으로 우아하고, 한 줄로 표현 가능하며, 자체 특수 문자 집합을 가지고 있습니다. 전문가들은 그것을 좋아했습니다. 일반 프로그래머들은 그것을 읽을 수 없다고 생각했습니다. 단일 문자 변경으로 프로그램의 의미를 조용히 변환할 수 있습니다. APL은 작은 헌신적 커뮤니티 & 거의 0 주류 사용을 가집니다.
인간 중복성 주장: 음성 언어는 ~60% 중복입니다(반복된 맥락, 명확히 하는 단어, 예측 가능한 구조). 이 중복성은 오류 감지에 사용됩니다 — 인간은 신뢰할 수 없으므로 언어는 오류를 잡고 수정하기 위해 충분한 반복된 정보를 전달하도록 진화했습니다. 낮은 중복성 언어는 이 안전 장치를 제거합니다.
컴파일러 계층 구조
해밍은 컴파일러/인터프리터 계층화를 설명했습니다: 프로그램은 더 높은 수준의 언어로 읽고 더 낮은 수준의 언어로 변환할 수 있습니다. 이러한 계층을 쌓으십시오 — 각각은 한 수준 아래로 변환합니다. 맨 위: 필드의 전문가들(생물학, 금융, 물리학)이 자연스럽게 작성하는 도메인 특정 언어. 맨 아래: 기계 코드. 각 전환은 컴파일러 또는 인터프리터입니다.
언어 생존 예측
1993년까지 해밍은 많은 언어가 성공하고 실패하는 것을 봤습니다. FORTRAN(1957) 생존했습니다. ALGOL(1958) 실패했습니다. COBOL(1959) 비즈니스 컴퓨팅에서 수십 년 생존했습니다. LISP(1958) AI 연구에서 생존했습니다. PL/I(1964) 모든 것을 통합하려고 시도했지만 실패했습니다.
반복되는 패턴
해밍의 소프트웨어 역사 장은 반복되는 구조를 포함합니다:
1. 고통스러운 제한이 존재합니다(절대 주소, 이진 표기법, 유지 불가능한 코드)
2. 누군가 제한을 숨기는 추상화 계층을 발명합니다
3. 추상화는 새로운 규모를 가능하게 하여 새로운 고통스러운 제한을 생성합니다
4. 반복
이진 → 8진/16진 → 기호 어셈블리 → FORTRAN → 구조화된 프로그래밍 → 객체 지향 언어 → 도메인 특정 언어. 각 계층은 선행자의 가장 심각한 고통을 해결하면서 새로운 문제 클래스를 도입합니다.
스파게티 코드 문제(절대 주소)는 기호 어셈블리로 이어졌습니다. 큰 어셈블리 프로그램은 FORTRAN으로 이어졌습니다. 큰 FORTRAN 프로그램은 구조화된 프로그래밍 & 그 다음 객체 지향으로 이어졌습니다. 해밍의 강의는 이러한 나중 전환 전에 끝났지만 패턴은 계속됩니다.
엔지니어를 위한 그의 교훈: 당신은 항상 이전 추상화에 의해 노출된 고통을 해결하고 있습니다. 현재 있는 계층을 이해하려면 그 아래 계층이 왜 존재하는지 알아야 합니다.