Tại sao Donald Knuth viết TAOCP bằng ngôn ngữ lắp ráp?


20

Tôi không ghét sử dụng ngôn ngữ lắp ráp, vì tôi đã viết một số trong khóa học os của mình. Nhưng rõ ràng, ngôn ngữ lắp ráp thiếu trừu tượng, bạn phải chú ý nhiều hơn đến các chi tiết.

Là ngôn ngữ lắp ráp thực sự cần thiết để viết TAOCP?


6
Các chi tiết là nơi quỷ dữ.
Blrfl

5
@Blrfl Tôi không tin vào ma quỷ. (Tôi tin vào các chi tiết mặc dù ... rùng mình )
Jimmy Hoffa

3
Tập đầu tiên của TAOCP đã được xuất bản vào năm 1968. Mặc dù các ngôn ngữ cấp cao hơn chắc chắn đã tồn tại, trình biên dịch viết tay quan trọng hơn nhiều sau đó, và tài nguyên điện toán trên các máy tính lớn trở lại có thể có cùng thứ tự như một số máy vi tính 8 bit của thập niên 1980. Knuth cũng từng tranh luận khá nghiêm túc về việc giữ goto vì một số thuật toán không thể được viết bằng cách sử dụng các cấu trúc dòng điều khiển lồng nhau mà không có hiệu quả. Anh ta thực sự không ủng hộ việc tối ưu hóa sớm ngay cả sau đó là IIRC, anh ta chỉ muốn tùy chọn có sẵn khi cần tối ưu hóa.
Steve314

3
@JimmyHoffa: Ồ, trong trường hợp của bạn, các chi tiết là nơi de Ville đang ở.
Blrfl

1
Jerry Coffin đã thành công trong việc làm những gì tôi muốn làm, anh ấy đã tìm nó trong nguồn ;-). Tôi đã xem các chương nơi MIX và MIXAL được giới thiệu, nơi tôi không tìm thấy những tuyên bố như vậy ... có lẽ tôi nên lấy một bản sao điện tử một ngày nào đó. Dù sao, tôi nghĩ thẻ câu trả lời sẽ phù hợp hơn với câu trả lời của Jerry trong trường hợp này.
Thomas

Câu trả lời:


22

Anh ta không chỉ sử dụng MIXAL, ngôn ngữ lắp ráp của mình cho MIX, mà còn là MIX, một mô hình cho một máy tính đơn giản (giống như một ngôn ngữ được sử dụng vào những năm sáu mươi). Đây là một mô hình cho việc giảng dạy mà ở một mức độ nào đó, ông không phụ thuộc vào sự phát triển trong lĩnh vực này.

Nếu anh ấy đã sử dụng một ngôn ngữ lập trình khác (nhân tiện, bạn nghĩ sẽ phù hợp với ngôn ngữ nào?), Nói NPL (ngôn ngữ lập trình tiện lợi), anh ấy đã phải từ bỏ ý tưởng sử dụng MIX hoặc để giới thiệu trình biên dịch của một số ngôn ngữ máy tính được lựa chọn (đó là một điều phức tạp hơn nhiều so với những gì anh ta đang giải quyết trong Vol 1). Theo cách đó, nó sẽ không trở thành TAOCP mà là TAONPLP. Cuốn đầu tiên độc lập với lựa chọn như vậy và, vì lý do này, vượt thời gian theo cách mà một vài cuốn sách về lập trình sẽ trở thành. Cái thứ hai có lẽ sẽ bị lãng quên ...

Ngoài ra, miễn là máy tính hoạt động theo nguyên tắc theo cách MIX của anh ấy, thì nên tính đến điều đó nếu bạn thực sự quan tâm đến việc học cách làm việc với chúng.


Lưu ý rằng "Kỹ thuật trình biên dịch" chính thức là chủ đề của tập 7. Dự kiến ​​nó vẫn có thể xảy ra, nhưng tôi nghĩ mọi người đều mừng vì Knuth đã không đợi đến khi anh ta có trình biên dịch để bắt đầu xuất bản.
Kilian Foth

@KilianFoth vâng tôi biết. Nhưng tôi hy vọng ngôn ngữ lập trình nhân tạo sẽ được sử dụng trong một cuốn sách như vậy. Có lẽ nhắm mục tiêu một MMIX (M thứ hai không phải là một máy tính dựa trên lỗi đánh máy :-). Và ETA của tập. 5 là năm 2020 ....
Thomas

56

Đôi khi những người trẻ tuổi làm tôi ngạc nhiên. Tất cả các bạn thường không có manh mối rằng bất cứ điều gì xảy ra trước khi bạn bắt đầu đi học. (Tôi có cùng một vấn đề. Tôi đã mất một thời gian dài để hiểu rằng 15 năm thực sự là một khoảng thời gian rất ngắn, theo quan điểm của người lớn. Lịch sử, nhưng cha tôi đã chiến đấu trong đó, và mẹ tôi học cấp hai trong thời gian đó.)

TAOCP, tập. 1, "Thuật toán cơ bản", ấn bản đầu tiên, được in lần đầu tiên vào năm 1968. Đó là 45 năm trước. Knuth bắt đầu lên kế hoạch cho loạt phim trước đó.

Để tham khảo: Intel 8086 xuất hiện lần đầu tiên vào năm 1978, mười năm sau. Ngôn ngữ PASCAL xuất hiện lần đầu tiên vào năm 1971; cuốn sách Jensen & Wirth, về phiên bản thứ hai của ngôn ngữ, được phát hành vào năm 1974. Sự phát triển ban đầu của C là 1969-1973: K & R được xuất bản năm 1978.

Knuth dự định loạt bài để bao gồm các lĩnh vực. Ngài thiết lập phong cách, THÌ, có ích cho các học viên THÌ. Anh ấy đã không bao giờ nghĩ rằng bộ truyện đó sẽ trở thành tác phẩm hoàn toàn theo nghĩa đen của anh ấy, hoặc tác phẩm của nó sẽ trải dài hơn nửa thế kỷ khi cuối cùng anh ấy kết thúc.

Ngôn ngữ hội được cho là không quá quan trọng như ngày nay, nhưng nó vẫn quan trọng hơn nhiều so với các mavens Java / C ++ / Javascript / Python / Perl muốn tất cả các bạn tin.

Bây giờ có được ra bãi cỏ của tôi!


Knuth đã triển khai trình biên dịch ALGOL vào năm 1960 và ALGOL được dự định là phù hợp để xuất bản các thuật toán, vì vậy tôi không nghĩ rằng điều này thực sự trả lời câu hỏi.
Peter Taylor

10
Tôi thực sự không tin rằng lý do là có sẵn thời gian. LISP đã có sẵn nếu anh ta muốn nó có mức độ trừu tượng cao như toán học. Tôi nghĩ rằng anh ấy đã đi với hội đồng vì từ đầu tiên của tiêu đề; Cơ bản. Không có gì cơ bản hơn cho các thuật toán hơn các hướng dẫn từng bước cho một cỗ máy ngu ngốc đơn giản; nó buộc bạn phải phá vỡ thuật toán hoàn toàn thay vì lý do về nó ở mức cao, đó không phải là mục đích của anh ấy trong cuốn sách.
Jimmy Hoffa

1
Đây là lý do tại sao trường tôi cung cấp một lớp học máy tính lịch sử nơi bạn có thể lập trình Altair và một số PDP.
Rig

@Rig - nghiêm túc chứ? Bây giờ tôi cảm thấy già. Mặc dù không cũ như giải thích HPGL cho một người thuê mới và phát hiện ra họ chưa bao giờ nhìn thấy hoặc nghe thấy về một máy vẽ bút!
Martin Beckett

6
+1 vì những lời tán dương thú vị cũng như thông tin liên quan.
luser droog

43

Knuth thảo luận về lý luận của mình trong Lời nói đầu. Tôi sẽ trích dẫn chỉ một vài bit và miếng:

... Tôi cần phải quyết định nên sử dụng ngôn ngữ đại số như ALGOL hoặc FORTRAN hay sử dụng ngôn ngữ hướng máy cho mục đích này. Có lẽ nhiều chuyên gia máy tính ngày nay sẽ không đồng ý với quyết định sử dụng ngôn ngữ định hướng máy móc của tôi, nhưng tôi đã bị thuyết phục rằng đó chắc chắn là lựa chọn chính xác, vì những lý do sau:

  1. Các ngôn ngữ đại số phù hợp với các vấn đề số hơn so với các vấn đề không số lượng được xem xét ở đây. [...]
  2. ... Bằng cách viết bằng ngôn ngữ hướng máy, lập trình viên sẽ có xu hướng sử dụng phương pháp hiệu quả hơn nhiều; nó gần với thực tế hơn nhiều
  3. Các chương trình chúng tôi yêu cầu, với một vài ngoại lệ, tất cả đều khá ngắn ...
  4. Một người quan tâm nhiều hơn đến máy tính nên được học tốt về ngôn ngữ máy ...
  5. Một số ngôn ngữ máy sẽ là cần thiết dù sao ...

Mặc dù anh ấy không chỉ ra điều đó trực tiếp, tôi nghĩ rằng việc anh ấy nhắc đến ALGOL và FORTRAN chỉ ra một vấn đề khác mà anh ấy tránh được có thể còn quan trọng hơn. Giả sử anh ta đã chọn Algol (rõ ràng phù hợp hơn với các chương trình phi số so với Fortran). Tôi sẽ khẳng định rằng Algol có lẽ sẽ còn xa lạ hơn với hầu hết các lập trình viên ngày nay so với ngôn ngữ lắp ráp mà anh ta đã chọn.

Đối với phiên bản thứ ba, ông đã thiết kế lại MIX để phù hợp hơn với các bộ xử lý hiện đại và phải viết lại mã cho nó. Tuy nhiên, tôi khẳng định rằng anh ta đã sử dụng ngôn ngữ cấp cao hơn, việc viết lại sẽ đáng kể hơn - và tất cả những lý do anh ta đưa ra cũng sẽ vẫn như vậy.


Ngoài ra, trình biên dịch thường đắt tiền trong những ngày đó. Nhiều năm sau khi tập 1 TAOCP ra mắt, tôi đã phỏng vấn tại một nơi không muốn chi tiền cho một người (và thành thật mà nói, nhà lắp ráp IBM 370 không tệ lắm) và vợ tôi làm việc tại một cửa hàng ngôn ngữ lắp ráp Một vài năm sau đó.
David Thornley

2
Làm thế nào tôi có thể upvote điểm 4 ??
Javier

5
@Javier lấy một bản sao và viết +1 trong lề.
luser droog

29

Knuth cũng đã cập nhật lý do của mình :

Tại sao có ngôn ngữ máy?

Nhiều độc giả không nghi ngờ gì khi nghĩ, 'Tại sao Knuth thay thế MIX bằng một máy khác thay vì chỉ sử dụng ngôn ngữ lập trình cấp cao? Hầu như không ai sử dụng trình biên dịch những ngày này. ''

Những người như vậy có quyền với ý kiến ​​của họ và họ không cần phải đọc các phần ngôn ngữ máy trong sách của tôi. Nhưng những lý do cho ngôn ngữ máy mà tôi đã đưa ra trong lời nói đầu của Tập 1, được viết vào đầu những năm 1960, vẫn còn hiệu lực cho đến ngày nay:

  • Một trong những mục tiêu chính của những cuốn sách của tôi là chỉ ra cách thức thực hiện các công trình cấp cao thực sự trong máy móc, không chỉ đơn giản là chỉ ra cách chúng được áp dụng. Tôi giải thích liên kết coroutine, cấu trúc cây, tạo số ngẫu nhiên, số học có độ chính xác cao, chuyển đổi cơ số, đóng gói dữ liệu, tìm kiếm tổ hợp, đệ quy, v.v., từ đầu.
  • Các chương trình cần thiết trong sách của tôi thường ngắn đến mức các điểm chính của chúng có thể được nắm bắt dễ dàng.
  • Những người quan tâm nhiều hơn đến máy tính nên có ít nhất một số ý tưởng về phần cứng cơ bản là như thế nào. Nếu không các chương trình họ viết sẽ khá kỳ lạ.
  • Ngôn ngữ máy là cần thiết trong mọi trường hợp, như đầu ra của nhiều chương trình phần mềm tôi mô tả.
  • Thể hiện các phương pháp cơ bản như thuật toán để sắp xếp và tìm kiếm bằng ngôn ngữ máy cho phép thực hiện các nghiên cứu có ý nghĩa về tác động của bộ đệm và kích thước RAM và các đặc điểm phần cứng khác (tốc độ bộ nhớ, đường ống, nhiều vấn đề, bộ đệm tìm kiếm, kích thước của khối bộ đệm, v.v.) khi so sánh các sơ đồ khác nhau.

Hơn nữa, nếu tôi đã sử dụng một ngôn ngữ cấp cao, thì nó nên là ngôn ngữ nào? Trong những năm 1960, có lẽ tôi đã chọn Algol W; vào những năm 1970, sau đó tôi đã phải viết lại những cuốn sách của mình bằng Pascal; vào những năm 1980, tôi chắc chắn đã thay đổi mọi thứ thành C; vào những năm 1990, tôi đã phải chuyển sang C ++ và sau đó có lẽ là Java. Trong những năm 2000, một ngôn ngữ khác sẽ không còn nghi ngờ gì nữa. Tôi không thể dành thời gian để viết lại sách của mình khi ngôn ngữ đi vào và ra khỏi thời trang; ngôn ngữ không phải là điểm của sách của tôi, vấn đề là những gì bạn có thể làm trong ngôn ngữ yêu thích của mình. Sách của tôi tập trung vào những sự thật vượt thời gian.

Do đó, tôi sẽ tiếp tục sử dụng tiếng Anh làm ngôn ngữ cấp cao trong TAOCP và tôi sẽ tiếp tục sử dụng ngôn ngữ cấp thấp để chỉ ra cách các máy tính thực sự tính toán. Những độc giả chỉ muốn xem các thuật toán đã được đóng gói theo cách bổ trợ, sử dụng ngôn ngữ hợp thời trang, nên mua sách của người khác.

Tin tốt là lập trình cho các máy RISC rất dễ chịu và đơn giản, khi máy RISC có thiết kế sạch đẹp. Vì vậy, tôi không cần phải chú ý đến những chi tiết phức tạp, nhỏ nhặt mà làm sao lãng những điểm chính. Về mặt này MMIX sẽ tốt hơn đáng kể so với MIX.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.