Nguồn gốc của thụt mã


31

Tôi quan tâm đến việc tìm ra ai đã giới thiệu thụt mã, cũng như khi nào và nơi nó được giới thiệu.

Nó có vẻ rất quan trọng đối với việc hiểu mã, nhưng nó không phải là phổ quát. Hầu hết mã Fortran và Basic là (không?) Không được cấp phép, và điều tương tự cũng xảy ra với Cobol.

Tôi khá chắc chắn rằng tôi thậm chí đã nhìn thấy mã Lisp cũ được viết dưới dạng văn bản liên tục, được xếp hàng. Bạn phải đếm dấu ngoặc trong đầu chỉ để phân tích nó, không bao giờ bận tâm đến việc hiểu nó.

Vì vậy, một sự cải tiến lớn như vậy đến từ đâu? Tôi chưa bao giờ thấy bất kỳ đề cập đến nguồn gốc của nó.

Ngoài các ví dụ ban đầu về việc sử dụng nó, tôi cũng đang tìm kiếm các cuộc thảo luận ban đầu về thụt đầu dòng.


Tôi không chắc nó có một điểm gốc. Ngoài ra, đối với một số mã ban đầu, không gian được chiếm bởi chính các khoảng trắng sẽ là một vấn đề.
Jack Aidley

1
Thật ra, FORTRAN đã bị thụt vào. Trong các loại. Nó được đặt trong các cột, đầu tiên được dành riêng cho Cnhân vật nếu bạn đang bình luận.
Jonathan Landrum

Các trường hợp chặn mà thụt lề được sử dụng để thay đổi ý nghĩa ngữ nghĩa của mã (nghĩa là khi thay đổi thụt lề sẽ đặt nó trong các vòng lặp hoặc là một phần của ifmột la F #), thụt lề không thực sự là một tính năng ngôn ngữ, đó là một tính năng IDE ( và một chút trong trình biên dịch, để bỏ qua khoảng trắng hàng đầu). @ Quyền của Jack - các chương trình ban đầu được bấm vào thẻ và thụt lề theo nghĩa đen không tồn tại trong bộ lưu trữ (và có lẽ bây giờ cũng không nên). RPG trụ cột không sử dụng thụt lề (và bạn chỉ có ~ 20 ký tự miễn phí trên mỗi dòng), nhưng IDE có thể "mềm" thụt mã cho bạn.
Đồng hồ-Muse

6
Nghĩ về điều này qua đêm, tôi nhận ra rằng ở một mức độ thụt đầu dòng có ý nghĩa có lẽ có trước lập trình. Lõm có thể được sử dụng trong danh sách hướng dẫn trước khi bất cứ ai viết chương trình máy tính. Tôi đang cố gắng săn lùng một ví dụ.
Jack Aidley

@ Clockwork-Muse Indentation là một tính năng ngôn ngữ trong COBOL cho đến khoảng 20 năm trước ("Khu vực", "Khu vực B", v.v. ).
Ross Patterson

Câu trả lời:


21

Nguồn gốc của mã thụt lề có thể được tìm thấy trong ALGOL :

ALGOL đã giới thiệu các khối mã và các cặp beginendđể phân định chúng và đó cũng là ngôn ngữ đầu tiên triển khai các định nghĩa hàm lồng nhau với phạm vi từ vựng.


Điều đó nghe có vẻ hợp lý, mặc dù tôi tự hỏi liệu tiên lượng của Lisp có thể không đến trước. Dù bằng cách nào, tôi thực sự sau khi cụ thể về việc giới thiệu thụt đầu dòng.
Daniel Mahler

4
@DanielMahler - Duyệt hướng dẫn lập trình LISP 1 và tự mình xem. Một số mã ví dụ được thụt lề, nhưng nó không phù hợp nhất. Hầu hết các mã ví dụ là tuôn ra bên trái.
David Hammen

@DavidHammen Đó phải là một trong những máy đánh chữ tồi tệ nhất ... Bạn sẽ nghĩ rằng họ chỉ viết tay toàn bộ.
Panzercrisis

6
Tôi không nghĩ rằng văn bản được trích dẫn thực sự hỗ trợ việc sử dụng / tồn tại của thụt lề . Đó là hỗ trợ cho mã phần. Java sử dụng ngoặc ( {}) để phân định các khối và bạn có thể định nghĩa các hàm lồng nhau, nhưng điều đó không cho tôi biết bất cứ điều gì về việc mã có thực sự được thụt lề hay không.
Đồng hồ-Muse

12

Mã thụt lề phải đến trước năm 1958, vì nó có mặt - nhưng không phổ biến - trong LISP và ALGOL. Đầu tiên tôi có thể định vị là COMTRAN được giới thiệu vào năm 1957, mặc dù tôi chỉ có thể tìm thấy hướng dẫn sử dụng năm 1960 (xem trang 90ish). Sự thụt lề này khác với quan niệm hiện đại vì COMTRAN thiếu cấu trúc khối của hầu hết các ngôn ngữ kể từ ALGOL nhưng tôi nghĩ nó vẫn nên được tính.

Tôi nghi ngờ rằng đây không thực sự là ví dụ đầu tiên nhưng tôi không thể xác định vị trí nào sớm hơn.

Đã cập nhật

Nó đã xảy ra với tôi rằng đến một mức độ thụt đầu dòng có ý nghĩa có lẽ trước khi lập trình. Lõm có thể được sử dụng trong danh sách hướng dẫn trước khi bất cứ ai viết chương trình máy tính. Thật không may, tôi không thể tìm thấy bất kỳ ví dụ tốt về điều này.


-1

Bản mở rộng về nhận xét của Ross Patterson - Trình biên dịch COBOL (hoặc ít nhất là trình biên dịch của IBM, mà tôi đã sử dụng trong sự nghiệp hệ thống mở trước của mình) đã thực thi thụt lề (khu vực "A" và "B" mà anh ấy đề cập). Nếu bất kỳ yếu tố nào được yêu cầu ở các khu vực này không được đặt chính xác, mã của bạn sẽ không được biên dịch. Tuy nhiên, ngoài ra không có sự thụt dòng cụ thể nào được yêu cầu - điều này thường dẫn đến việc kìm kẹp khi sửa đổi mã của một nhà phát triển khác có kiểu thụt đầu dòng khác với bạn - nghi thức sẽ đề nghị bạn tuân theo mô hình hiện có như hòa bình được bảo tồn giữa các đồng nghiệp; Ngoài ra, các phong cách khác nhau trong cùng một nguồn sẽ trở nên trầm trọng hơn khi nhìn, gần giống như Tetris.

Đã nhiều năm kể từ khi tôi nghĩ về COBOL và sự thụt vào của nó - cảm ơn vì đã đặt câu hỏi và cung cấp một chuyến đi nhỏ về quá khứ!

Marty

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.