English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

게스트
1 / ?
수업 목록으로

절대 이진으로 프로그래밍하기

첫 프로그래머들은 절대 이진으로 작성했습니다: 모든 명령어 & 모든 주소가 원시 이진 숫자로. 단일 명령어는 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 같은)는 전문가는 아름답다고 생각하고 초보자는 불투명하다고 생각하는 우아한 한 줄짜리를 생성합니다 — & 단일 문자가 의미를 변경할 때 감지 불가능한 오류를 포함합니다.

함의: 논리적 우아함을 위해 설계된 언어는 잘못된 독자를 위해 최적화합니다. 프로그래머는 인간입니다; 인간은 오류를 잡고 의도를 전달하기 위해 중복성이 필요합니다.

해밍의 네 가지 기준을 잘 알고 있는 프로그래밍 언어에 적용하십시오. 각 기준을 1–5(5=우수)로 채점하십시오. 그런 다음 강화되면 언어를 가장 많이 개선할 기준을 식별하고 구체적인 변경이 어떻게 보일지 설명하십시오.

심리학적 vs 논리적 언어 설계

해밍은 FORTRAN/ALGOL 대조를 언어 설계뿐만 아니라 제도적 & 인간 역학의 교훈으로 돌아왔습니다.

FORTRAN은 심리학적으로 설계되었습니다 — 이를 사용할 인간을 위해, 특히 수학 표기법으로 생각하는 과학자들을 위해. ALGOL은 논리적으로 설계되었습니다 — 형식적 정확성 & 이론적 우아함을 위해.

해밍이 식별한 역설: 인간이 저항하는 논리적으로 정확한 언어는 실패합니다; 인간이 채택하는 실용적으로 설계된 언어는 성공합니다, 논리적으로 더 지저분하더라도.

그는 APL을 극단적인 경우로 언급했습니다: 논리적으로 우아하고, 한 줄로 표현 가능하며, 자체 특수 문자 집합을 가지고 있습니다. 전문가들은 그것을 좋아했습니다. 일반 프로그래머들은 그것을 읽을 수 없다고 생각했습니다. 단일 문자 변경으로 프로그램의 의미를 조용히 변환할 수 있습니다. APL은 작은 헌신적 커뮤니티 & 거의 0 주류 사용을 가집니다.

인간 중복성 주장: 음성 언어는 ~60% 중복입니다(반복된 맥락, 명확히 하는 단어, 예측 가능한 구조). 이 중복성은 오류 감지에 사용됩니다 — 인간은 신뢰할 수 없으므로 언어는 오류를 잡고 수정하기 위해 충분한 반복된 정보를 전달하도록 진화했습니다. 낮은 중복성 언어는 이 안전 장치를 제거합니다.

컴파일러 계층 구조

해밍은 컴파일러/인터프리터 계층화를 설명했습니다: 프로그램은 더 높은 수준의 언어로 읽고 더 낮은 수준의 언어로 변환할 수 있습니다. 이러한 계층을 쌓으십시오 — 각각은 한 수준 아래로 변환합니다. 맨 위: 필드의 전문가들(생물학, 금융, 물리학)이 자연스럽게 작성하는 도메인 특정 언어. 맨 아래: 기계 코드. 각 전환은 컴파일러 또는 인터프리터입니다.

언어 생존 예측

1993년까지 해밍은 많은 언어가 성공하고 실패하는 것을 봤습니다. FORTRAN(1957) 생존했습니다. ALGOL(1958) 실패했습니다. COBOL(1959) 비즈니스 컴퓨팅에서 수십 년 생존했습니다. LISP(1958) AI 연구에서 생존했습니다. PL/I(1964) 모든 것을 통합하려고 시도했지만 실패했습니다.

해밍의 심리학적 vs 논리적 설계 구분 & 그의 네 가지 기준을 사용하여, 당신이 알고 있는 한 언어가 왜 번성했고 한 언어가 실패했는지(또는 실패하고 있는지) 설명하십시오. 당신의 설명은 채택 또는 거부를 촉발한 특정 인간 요소를 식별해야 합니다 — 단지 기술적 속성이 아닙니다.

반복되는 패턴

해밍의 소프트웨어 역사 장은 반복되는 구조를 포함합니다:

1. 고통스러운 제한이 존재합니다(절대 주소, 이진 표기법, 유지 불가능한 코드)

2. 누군가 제한을 숨기는 추상화 계층을 발명합니다

3. 추상화는 새로운 규모를 가능하게 하여 새로운 고통스러운 제한을 생성합니다

4. 반복

이진 → 8진/16진 → 기호 어셈블리 → FORTRAN → 구조화된 프로그래밍 → 객체 지향 언어 → 도메인 특정 언어. 각 계층은 선행자의 가장 심각한 고통을 해결하면서 새로운 문제 클래스를 도입합니다.

스파게티 코드 문제(절대 주소)는 기호 어셈블리로 이어졌습니다. 큰 어셈블리 프로그램은 FORTRAN으로 이어졌습니다. 큰 FORTRAN 프로그램은 구조화된 프로그래밍 & 그 다음 객체 지향으로 이어졌습니다. 해밍의 강의는 이러한 나중 전환 전에 끝났지만 패턴은 계속됩니다.

엔지니어를 위한 그의 교훈: 당신은 항상 이전 추상화에 의해 노출된 고통을 해결하고 있습니다. 현재 있는 계층을 이해하려면 그 아래 계층이 왜 존재하는지 알아야 합니다.

정기적으로 작업하는 소프트웨어 추상화 계층을 식별하십시오. 그 아래 계층의 어떤 고통스러운 제한을 숨깁니까? & 당신의 현재 계층이 소개하는 새로운 문제 클래스는 무엇입니까 — 그 위의 다음 계층이 해결해야 할 고통은 무엇입니까?