나는 os 코스에서 일부를 작성했기 때문에 어셈블리 언어를 사용하는 것을 싫어하지 않습니다. 그러나 어셈블리 언어에는 추상화가 없으므로 세부 사항에 더 많은주의를 기울여야합니다.
TAOCP를 작성하는 데 어셈블리 언어가 꼭 필요한가요?
나는 os 코스에서 일부를 작성했기 때문에 어셈블리 언어를 사용하는 것을 싫어하지 않습니다. 그러나 어셈블리 언어에는 추상화가 없으므로 세부 사항에 더 많은주의를 기울여야합니다.
TAOCP를 작성하는 데 어셈블리 언어가 꼭 필요한가요?
답변:
그는 MIX의 어셈블리 언어 인 MIXAL뿐만 아니라 60 년대에 사용 된 것과 같은 간단한 컴퓨터의 모델 인 MIX도 사용합니다. 이것은 그가 어느 정도 분야의 발전과 무관하게 가르치기위한 모형이다.
NPL (nifty programming language)은 다른 프로그래밍 언어를 사용했다면 (어쨌든 어느 언어가 적합하다고 생각하겠습니까?) MPL을 사용하거나 선택한 컴퓨터 언어의 컴파일러 (Vol 1에서 다루는 것보다 훨씬 복잡한 것). 그렇게하면 TAOCP가 아닌 TAONPLP가됩니다. 첫 번째는 그러한 선택과는 독립적이며, 이런 이유로 프로그래밍에 관한 몇 권의 책은 영원한 것입니다. 두 번째는 아마도 지금까지 잊어 버렸을 것입니다 ...
또한 컴퓨터가 원칙적으로 MIX와 같은 방식으로 작동하는 한 실제로 컴퓨터 사용 방법을 배우는 데 관심이 있다면이를 고려하는 것이 좋습니다.
당신은 젊은 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는 서문에서 그의 추론에 대해 이야기합니다. 몇 가지 비트와 조각을 인용하겠습니다.
... ALGOL 또는 FORTRAN과 같은 대수 언어를 사용할지 또는이 목적으로 기계 지향 언어를 사용할지를 결정해야했습니다. 아마도 오늘날의 많은 컴퓨터 전문가들이 머신 지향 언어를 사용하기로 한 결정에 동의하지 않을 것입니다. 그러나 다음과 같은 이유로 나는 그것이 올바른 선택이라고 확신하게되었습니다.
- 대수 언어는 여기에서 고려 된 비 숫자 문제보다 수치 문제에 더 적합합니다. [...]
- ... 기계 지향 언어로 작성함으로써 프로그래머는 훨씬 더 효율적인 방법을 사용하는 경향이 있습니다. 현실에 훨씬 가깝습니다.
- 우리가 필요로하는 프로그램은 거의 예외가 없지만 모두 짧습니다 ...
- 컴퓨터에 부담없이 관심이있는 사람은 기계 언어를 잘 배워야합니다.
- 어쨌든 어떤 기계 언어가 필요할 것입니다 ...
그가 직접 지적하지는 않지만 ALGOL과 FORTRAN에 대한 언급은 그가 피할 수있는 또 다른 문제를 지적합니다. 그가 Algol을 선택했다고 가정 해 봅시다 (어쨌든 Fortran보다 비 숫자 프로그램에 더 적합). Algol은 아마도 그가 선택한 어셈블리 언어보다 오늘날의 프로그래머 대부분에게 훨씬 더 외국 적이라고 생각합니다.
세 번째 판에서는 현대적인 프로세서와 더 잘 맞도록 MIX를 다시 디자인하고 코드를 다시 작성해야했습니다. 그러나 나는 그가 더 높은 수준의 언어를 사용했다면 재 작성이 상당히 클 것이라고 주장했다. 그리고 그가 준 모든 이유는 여전히 남아있을 것이다.
크 누스는 그의 이론적 근거 도 업데이트했다 :
기계 언어가 왜 필요한가요?
``Knuth가 고급 프로그래밍 언어를 고수하는 대신 MIX를 다른 시스템으로 대체하는 이유는 무엇입니까? 요즘에는 아무도 어셈블러를 사용하지 않습니다. ''
그러한 사람들은 자신의 의견을들을 권리가 있으며, 제 책의 기계어 부분을 읽는 것을 귀찮게 할 필요가 없습니다. 그러나 1960 년대 초에 작성된 1 권 서문에서 기계 언어가 사용 된 이유는 오늘날에도 유효합니다.
- 저의 책의 주요 목표 중 하나는 단순히 어떻게 적용되는지를 보여주는 것이 아니라 기계에서 실제로 고수준 구조가 어떻게 구현되는지를 보여주는 것입니다. 코 루틴 연결, 트리 구조, 난수 생성, 고정밀 산술, 기수 변환, 데이터 패킹, 조합 검색, 재귀 등을 처음부터 설명합니다.
- 내 책에 필요한 프로그램은 일반적으로 너무 짧아서 주요 요점을 쉽게 파악할 수 있습니다.
- 컴퓨터에 부담없이 관심이있는 사람들은 최소한 기본 하드웨어가 무엇인지에 대해 어느 정도 이해해야합니다. 그렇지 않으면 그들이 작성한 프로그램은 매우 이상합니다.
- 내가 설명하는 많은 소프트웨어 프로그램의 출력으로 기계어가 필요합니다.
- 기계 언어로 정렬 및 검색하기위한 알고리즘과 같은 기본 방법을 표현하면 캐시 및 RAM 크기 및 기타 하드웨어 특성 (메모리 속도, 파이프 라이닝, 다중 문제, lookaside 버퍼, 캐시 블록 크기, 등) 다른 체계를 비교할 때.
또한 고급 언어를 사용했다면 어떤 언어를 사용해야합니까? 1960 년대에는 아마도 Algol W를 선택했을 것입니다. 1970 년대에 나는 파스칼을 사용하여 나의 책을 다시 써야했을 것입니다. 1980 년대에 나는 모든 것을 C로 바꿨을 것이다. 1990 년대에는 C ++로 전환 한 다음 Java로 전환해야했을 것입니다. 2000 년대에 또 다른 언어는 의심 할 여지가 없습니다. 언어가 유행에 따라 책을 다시 쓸 시간이 없습니다. 언어는 내 책의 요점이 아니며 요점은 당신이 좋아하는 언어로 할 수있는 것입니다. 나의 책은 영원한 진리에 중점을 둡니다.
따라서 저는 TAOCP에서 영어를 계속해서 고급 언어로 사용하고 기계가 실제로 계산하는 방법을 나타 내기 위해 계속해서 저급 언어를 사용합니다. 최신 언어를 사용하여 이미 플러그인 방식으로 패키지 된 알고리즘 만보고 싶은 독자는 다른 사람의 책을 구입해야합니다.
좋은 소식은 RISC 기계가 깔끔한 디자인을 가지고있을 때 RISC 기계 프로그래밍이 즐겁고 간단하다는 것입니다. 그래서 나는 요점에서 산만하게되는, 간결하고 아주 작은 세부 사항에 대해 생각할 필요가 없습니다. 이와 관련하여 MMIX는 MIX보다 훨씬 낫습니다.