도널드 크 누스는 왜 어셈블리 언어를 사용하여 TAOCP를 작성합니까?


20

나는 os 코스에서 일부를 작성했기 때문에 어셈블리 언어를 사용하는 것을 싫어하지 않습니다. 그러나 어셈블리 언어에는 추상화가 없으므로 세부 사항에 더 많은주의를 기울여야합니다.

TAOCP를 작성하는 데 어셈블리 언어가 꼭 필요한가요?


6
세부 사항은 악마가있는 곳입니다.
Blrfl

5
@Blrfl 나는 악마를 믿지 않습니다. (나는 세부 사항을 믿지만 ... 떨다 )
Jimmy Hoffa

3
TAOCP의 첫 번째 책은 1968 년에 출판되었습니다. 더 높은 수준의 언어는 확실히 존재하지만 수작업 어셈블러가 훨씬 더 중요했으며, 메인 프레임의 컴퓨팅 리소스는 1980 년대 8 비트 마이크로와 같은 순서 일 수있었습니다. Knuth는 또한 일부 알고리즘을 비 효율성없이 중첩 된 제어 흐름 구조를 사용하여 작성할 수 없기 때문에 goto를 유지하기 위해 상당히 진지하게 주장했습니다. 그는 실제로 IIRC 이후에도 조기 최적화를 옹호하지 않았으며 최적화가 필요할 때 사용할 수있는 옵션을 원했습니다.
Steve314

3
@JimmyHoffa : 아, 글쎄, 세부 사항은 드 빌 이 있는 곳 입니다.
Blrfl

1
Jerry Coffin은 내가하고 싶은 일을 성공했으며 소스에서 그것을 찾았습니다. ;-). 나는 MIX와 MIXAL이 소개 된 장을 보았는데, 그러한 진술을 찾지 못했습니다 ... 어쩌면 언젠가는 전자 사본을 받아야합니다. 어쨌든 대답 태그 가이 경우 Jerry의 대답에 더 적합하다고 생각합니다.
Thomas

답변:


22

그는 MIX의 어셈블리 언어 인 MIXAL뿐만 아니라 60 년대에 사용 된 것과 같은 간단한 컴퓨터의 모델 인 MIX도 사용합니다. 이것은 그가 어느 정도 분야의 발전과 무관하게 가르치기위한 모형이다.

NPL (nifty programming language)은 다른 프로그래밍 언어를 사용했다면 (어쨌든 어느 언어가 적합하다고 생각하겠습니까?) MPL을 사용하거나 선택한 컴퓨터 언어의 컴파일러 (Vol 1에서 다루는 것보다 훨씬 복잡한 것). 그렇게하면 TAOCP가 아닌 TAONPLP가됩니다. 첫 번째는 그러한 선택과는 독립적이며, 이런 이유로 프로그래밍에 관한 몇 권의 책은 영원한 것입니다. 두 번째는 아마도 지금까지 잊어 버렸을 것입니다 ...

또한 컴퓨터가 원칙적으로 MIX와 같은 방식으로 작동하는 한 실제로 컴퓨터 사용 방법을 배우는 데 관심이 있다면이를 고려하는 것이 좋습니다.


"컴파일러 기술"은 공식적으로 계획된 7 권의 주제입니다. 여전히 일어날 있지만, Knuth가 컴파일러가 출판을 시작할 때까지 기다리지 않았다는 것은 모두가 기쁘다 고 생각합니다.
Kilian Foth

@KilianFoth 네, 알아요. 그러나 나는 그러한 책에서 인공 프로그래밍 언어가 사용될 것으로 기대합니다. MMIX (두 번째 M은 오타가 아님) 기반 컴퓨터를 타겟팅 할 수 있습니다. 그리고 ETA의 ETA. 5는 2020입니다 ....
토마스

56

당신은 젊은 whippersnappers가 때때로 나를 놀라게합니다. 당신은 너무 자주 학교를 시작하기 전에 무슨 일이 있었는지 전혀 모른다. (저도 같은 문제가 있습니다. 성인의 관점에서 15 년이 실제로 매우 짧은 시간이라는 사실을 이해하는 데 오랜 시간이 걸렸습니다. 히로시마에서 쿠바 미사일 위기까지의 기간은 제 2 차 세계 대전에 불과합니다. 역사는 있었지만 아버지는 그것에 싸웠고 어머니는 그 중반에있었습니다.)

TAOCP, vol. 1, "Fundamental Algorithms"(제 1 판)은 1968 년에 처음 인쇄되었습니다. 45 년 전입니다. Knuth는 그 전에 시리즈를 계획하기 시작했습니다.

참고로 인텔 8086은 10 년 후 1978 년에 처음 등장했습니다. PASCAL 언어는 1971 년에 처음 등장했습니다. C 언어의 두 번째 버전에 관한 Jensen & Wirth 책은 1974 년에 나왔습니다. C의 초기 개발은 1969-1973입니다. K & R은 1978 년에 출판되었습니다.

Knuth는이 시리즈가 현장을 덮도록 의도했습니다. 그는 스타일 THEN을 실무자 THEN에게 유용하도록 설정했습니다. 그는 그 시리즈가 문자 그대로 그의 인생의 작품이 될 것이라고 기대하지 않았으며, 마지막으로 끝내면 반세기가 넘게 될 것입니다.

어셈블리 언어는 오늘날만큼 중요하지는 않지만 Java / C ++ / Javascript / Python / Perl mavens가 여러분이 믿고 싶어하는 것보다 훨씬 더 중요합니다.

이제 내 법을 벗어 라!


Knuth는 1960 년에 ALGOL 컴파일러를 구현했으며 ALGOL은 알고리즘을 게시하는 데 적합하도록 설계되었으므로 이것이 실제로 질문에 대한 답변이라고 생각하지 않습니다.
피터 테일러

10
나는 추론이 시간의 가용성이라는 것을 확신하지 못한다. LISP는 수학과 같이 높은 추상화 수준을 원한다면 사용할 수있었습니다. 나는 그가 제목의 첫 단어 때문에 집회를 갔다고 생각한다. 기본적인. 간단한 어리석은 기계에 대한 단계별 지침보다 알고리즘에 더 근본적인 것은 없습니다. 그것은 책에서 그의 목적이 아닌 높은 수준에서 알고리즘 을 추론하기보다는 알고리즘을 완전히 분해하도록 강요합니다 .
Jimmy Hoffa

1
그렇기 때문에 우리 학교는 Altair와 일부 PDP를 프로그램 할 수있는 역사적인 컴퓨팅 수업을 제공했습니다.
Rig

@Rig-진심으로? 이제 나이가 들었습니다. 신입 사원에게 HPGL을 설명하고 펜 플로터를 보거나들은 적이 없다는 것을 발견 한 것만 큼 오래되지는 않았습니다!
Martin Beckett

6
재미있는 정보와 관련 정보로 인해 +1.
luser droog

43

Knuth는 서문에서 그의 추론에 대해 이야기합니다. 몇 가지 비트와 조각을 인용하겠습니다.

... ALGOL 또는 FORTRAN과 같은 대수 언어를 사용할지 또는이 목적으로 기계 지향 언어를 사용할지를 결정해야했습니다. 아마도 오늘날의 많은 컴퓨터 전문가들이 머신 지향 언어를 사용하기로 한 결정에 동의하지 않을 것입니다. 그러나 다음과 같은 이유로 나는 그것이 올바른 선택이라고 확신하게되었습니다.

  1. 대수 언어는 여기에서 고려 된 비 숫자 문제보다 수치 문제에 더 적합합니다. [...]
  2. ... 기계 지향 언어로 작성함으로써 프로그래머는 훨씬 더 효율적인 방법을 사용하는 경향이 있습니다. 현실에 훨씬 가깝습니다.
  3. 우리가 필요로하는 프로그램은 거의 예외가 없지만 모두 짧습니다 ...
  4. 컴퓨터에 부담없이 관심이있는 사람은 기계 언어를 잘 배워야합니다.
  5. 어쨌든 어떤 기계 언어가 필요할 것입니다 ...

그가 직접 지적하지는 않지만 ALGOL과 FORTRAN에 대한 언급은 그가 피할 수있는 또 다른 문제를 지적합니다. 그가 Algol을 선택했다고 가정 해 봅시다 (어쨌든 Fortran보다 비 숫자 프로그램에 더 적합). Algol은 아마도 그가 선택한 어셈블리 언어보다 오늘날의 프로그래머 대부분에게 훨씬 외국 적이라고 생각합니다.

세 번째 판에서는 현대적인 프로세서와 더 잘 맞도록 MIX를 다시 디자인하고 코드를 다시 작성해야했습니다. 그러나 나는 그가 더 높은 수준의 언어를 사용했다면 재 작성이 상당히 클 것이라고 주장했다. 그리고 그가 준 모든 이유는 여전히 남아있을 것이다.


또한, 그 당시 컴파일러는 일반적으로 비쌌습니다. TAOCP 1 권이 나온 지 몇 년 후, 나는 돈을 쓰고 싶지 않은 곳에서 인터뷰를했고 (솔직히 말해서 IBM 370 어셈블러는 그렇게 나쁘지 않았다) 아내는 어셈블리 언어 상점에서 일했다. 그로부터 꽤 몇 년.
David Thornley

2
포인트 4를 어떻게 표명 할 수 있습니까?
Javier

5
@Javier는 사본을 받아서 +1을 여백에 씁니다.
luser droog

29

크 누스는 그의 이론적 근거 도 업데이트했다 :

기계 언어가 왜 필요한가요?

``Knuth가 고급 프로그래밍 언어를 고수하는 대신 MIX를 다른 시스템으로 대체하는 이유는 무엇입니까? 요즘에는 아무도 어셈블러를 사용하지 않습니다. ''

그러한 사람들은 자신의 의견을들을 권리가 있으며, 제 책의 기계어 부분을 읽는 것을 귀찮게 할 필요가 없습니다. 그러나 1960 년대 초에 작성된 1 권 서문에서 기계 언어가 사용 된 이유는 오늘날에도 유효합니다.

  • 저의 책의 주요 목표 중 하나는 단순히 어떻게 적용되는지를 보여주는 것이 아니라 기계에서 실제로 고수준 구조가 어떻게 구현되는지를 보여주는 것입니다. 코 루틴 연결, 트리 구조, 난수 생성, 고정밀 산술, 기수 변환, 데이터 패킹, 조합 검색, 재귀 등을 처음부터 설명합니다.
  • 내 책에 필요한 프로그램은 일반적으로 너무 짧아서 주요 요점을 쉽게 파악할 수 있습니다.
  • 컴퓨터에 부담없이 관심이있는 사람들은 최소한 기본 하드웨어가 무엇인지에 대해 어느 정도 이해해야합니다. 그렇지 않으면 그들이 작성한 프로그램은 매우 이상합니다.
  • 내가 설명하는 많은 소프트웨어 프로그램의 출력으로 기계어가 필요합니다.
  • 기계 언어로 정렬 및 검색하기위한 알고리즘과 같은 기본 방법을 표현하면 캐시 및 RAM 크기 및 기타 하드웨어 특성 (메모리 속도, 파이프 라이닝, 다중 문제, lookaside 버퍼, 캐시 블록 크기, 등) 다른 체계를 비교할 때.

또한 고급 언어를 사용했다면 어떤 언어를 사용해야합니까? 1960 년대에는 아마도 Algol W를 선택했을 것입니다. 1970 년대에 나는 파스칼을 사용하여 나의 책을 다시 써야했을 것입니다. 1980 년대에 나는 모든 것을 C로 바꿨을 것이다. 1990 년대에는 C ++로 전환 한 다음 Java로 전환해야했을 것입니다. 2000 년대에 또 다른 언어는 의심 할 여지가 없습니다. 언어가 유행에 따라 책을 다시 쓸 시간이 없습니다. 언어는 내 책의 요점이 아니며 요점은 당신이 좋아하는 언어로 할 수있는 것입니다. 나의 책은 영원한 진리에 중점을 둡니다.

따라서 저는 TAOCP에서 영어를 계속해서 고급 언어로 사용하고 기계가 실제로 계산하는 방법을 나타 내기 위해 계속해서 저급 언어를 사용합니다. 최신 언어를 사용하여 이미 플러그인 방식으로 패키지 된 알고리즘 만보고 싶은 독자는 다른 사람의 책을 구입해야합니다.

좋은 소식은 RISC 기계가 깔끔한 디자인을 가지고있을 때 RISC 기계 프로그래밍이 즐겁고 간단하다는 것입니다. 그래서 나는 요점에서 산만하게되는, 간결하고 아주 작은 세부 사항에 대해 생각할 필요가 없습니다. 이와 관련하여 MMIX는 MIX보다 훨씬 낫습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.