Tại sao các BASIC cũ (và có thể các ngôn ngữ khác) sử dụng số dòng làm một phần của mã nguồn?
Ý tôi là, những vấn đề nào đã làm nó (cố gắng) giải quyết?
Tại sao các BASIC cũ (và có thể các ngôn ngữ khác) sử dụng số dòng làm một phần của mã nguồn?
Ý tôi là, những vấn đề nào đã làm nó (cố gắng) giải quyết?
Câu trả lời:
BASIC cần được đưa vào bối cảnh với các ngôn ngữ đương đại của nó: fortran sớm, cobol và lắp ráp.
Quay lại khi tôi đang lắp ráp 6502 mà không có nhãn, điều này có nghĩa là khi bạn thấy rằng bạn cần thêm một hướng dẫn ở đâu đó ở giữa mã được đóng gói chặt chẽ (sau này tôi đã thêm NOP ) bạn cần phải thực hiện và làm lại tất cả các bước nhảy địa chỉ. Điều này đã tốn thời gian.
Fortran là một hệ thống dựa trên số được đánh số trước BASIC. Trong Fortran, các cột 1-5 là số dòng được sử dụng cho các mục tiêu để phân nhánh. Điều quan trọng với Fortran là các trình biên dịch có xu hướng thông minh hơn một chút so với trình thông dịch BASIC và thêm một vài hướng dẫn chỉ là vấn đề đấm một số thẻ và đặt chúng vào đúng vị trí.
BASIC, mặt khác phải giữ tất cả các hướng dẫn của nó được ra lệnh. Không có nhiều khái niệm về "sự tiếp nối của dòng trước". Thay vào đó, trong Applesoft BASIC (một trong những phương ngữ được sử dụng rộng rãi mà tôi quen thuộc và có thể tìm thấy thông tin trên) mỗi dòng trong bộ nhớ được biểu diễn dưới dạng:
NN NN TT TT AA BB CC DD .. .. 00
Nó có hai byte cho địa chỉ của dòng tiếp theo ( NN NN
). Hai byte cho số dòng của dòng này ( TT TT
) và sau đó là danh sách các mã thông báo ( AA BB CC DD .. ..
) theo sau là dấu cuối dòng ( 00
). (Đây là từ trang 84-88 của Inside the Apple // e )
Một điểm quan trọng để nhận ra khi nhìn vào biểu diễn bộ nhớ đó là các dòng có thể được lưu trữ trong bộ nhớ không theo thứ tự. Cấu trúc của bộ nhớ là danh sách được liên kết với con trỏ 'dòng tiếp theo' trong cấu trúc. Điều này giúp dễ dàng thêm các dòng mới giữa hai dòng - nhưng bạn phải đánh số từng dòng để nó hoạt động chính xác.
Nhiều khi làm việc với BASIC, bạn thực sự đã làm việc trong BASIC. Cụ thể, một chuỗi đã cho là số dòng và hướng dẫn BASIC hoặc lệnh cho trình thông dịch cơ bản đến RUN
hoặc LIST
. Điều này giúp dễ dàng phân biệt mã với các lệnh - tất cả mã bắt đầu bằng số.
Hai mẩu thông tin này xác định lý do tại sao các số được sử dụng - bạn có thể nhận được rất nhiều thông tin trong 16 bit. Nhãn dựa trên chuỗi sẽ tốn nhiều không gian hơn và khó đặt hàng hơn. Các số dễ làm việc, dễ hiểu và dễ trình bày hơn.
Các phương ngữ BASIC mà bạn không có trong trình thông dịch mọi lúc có thể loại bỏ mọi dòng được đánh số và thay vào đó chỉ cần đánh số các dòng là mục tiêu nhánh. Trong hiệu lực, nhãn.
] PRINT "FOO"
được điều hành bởi trình thông dịch BASIC ngay lập tức. Đó là một tuyên bố. Nếu bạn muốn chạy nó sau, bạn sẽ làm ] 10 PRINT "FOO"
và sau đó ] RUN
. Trong môi trường AppleSoft BASIC, mọi câu lệnh BASIC có thể được chạy ngay lập tức hoặc bị trì hoãn - chỉ có một vài lệnh được cung cấp bởi DOS không phải là câu lệnh BASIC hợp lệ. Sự khác biệt giữa một tuyên bố bây giờ và một tuyên bố sau đó là số dòng. Bạn cũng có thể sửa đổi một câu lệnh bị trì hoãn bằng cách nhập lại số dòng tương ứng. Bạn cũng có thể đặt nhiều câu lệnh trên một dòng::
Trên máy vi tính sớm, chỉnh sửa dựa trên dòng. Bạn không thể tự do di chuyển xung quanh trong mã nguồn và chỉnh sửa. Bạn có một dòng duy nhất ở cuối màn hình nơi bạn có thể nhập lệnh và nhập mã. Phần còn lại của màn hình là danh sách mã chỉ đọc và đầu ra lệnh. Nếu bạn muốn chỉnh sửa dòng 90 trong chương trình bạn đã viết " EDIT 90
" và nội dung của dòng 90
đã vào bộ đệm chỉnh sửa một dòng. Khi bạn đã chỉnh sửa dòng bạn nhấn enter và danh sách chương trình đã được cập nhật. Vì vậy, bạn cần số dòng để có thể chỉnh sửa chương trình.
Khi trình chỉnh sửa mã trở nên nâng cao hơn và cho phép bạn di chuyển con trỏ xung quanh trong danh sách mã, bạn không cần số dòng nữa.
Nếu bạn đang nghĩ về phương ngữ BASIC của máy vi tính gia đình 8 bit của thập niên 80, thì những máy tính đó không có trình soạn thảo văn bản (trừ khi bạn mua một số ứng dụng xử lý văn bản). Không có cách nào để có toàn bộ mã nguồn chương trình BASIC "mở trong trình chỉnh sửa", giống như bạn sẽ có khi lập trình ngày hôm nay. Lập trình viên thậm chí sẽ không nghĩ về chương trình như một tệp mã nguồn, hoặc văn bản, thực sự.
Vì vậy, giả sử bạn có một chương trình đơn giản không có số dòng trong đầu:
FOR I=1 TO 42
PRINT I
NEXT I
Bạn khởi động máy tính của bạn. Bạn có một dấu nhắc "sẵn sàng" hoặc đại loại như thế và con trỏ ngồi ở dòng tiếp theo. Điều này giống như môi trường REPL ngày nay của các ngôn ngữ kịch bản khác nhau, mặc dù không thực sự dựa trên dòng, giống như dựa trên màn hình. Vì vậy, không hoàn toàn giống như REPL của ngày hôm nay, nhưng gần gũi.
Bây giờ nếu bạn bắt đầu tham gia chương trình, bạn có thể gặp lỗi sau dòng đầu tiên, bởi vì trình thông dịch BASIC cố gắng thực thi ngay lập tức (và quên) nó, và nó không có nghĩa gì nếu không có NEXT để kết thúc vòng lặp. Đây không phải là trình soạn thảo văn bản nơi bạn chỉnh sửa văn bản, đây là nơi bạn đưa ra lệnh cho máy tính!
Vì vậy, bạn cần một số cách để nói, đây là dòng chương trình, lưu trữ nó! Bạn có thể có một lệnh đặc biệt hoặc chỉ là một biểu tượng cho biết rằng, đây là dòng chương trình, lưu trữ nó. Hãy tưởng tượng điều này:
#FOR I=1 TO 42
#PRINT I
#NEXT I
Ok, bây giờ trình thông dịch BASIC tưởng tượng của chúng tôi đã lưu trữ chương trình và bạn có thể chạy nó. Nhưng bây giờ bạn muốn chỉnh sửa dòng IN. Bạn làm nó như thế nào? Bạn không ở trong trình soạn thảo văn bản, bạn không thể di chuyển con trỏ đến dòng và chỉnh sửa nó. Hoặc bạn muốn thêm một dòng khác như LET COUNT=COUNT+1
trong vòng lặp. Làm thế nào để bạn chỉ ra nơi dòng mới nên được chèn?
Số dòng giải quyết điều này một cách rất dễ dàng, nếu khá klunky. Nếu bạn nhập một dòng chương trình với một số đã tồn tại, dòng cũ sẽ được thay thế. Bây giờ môi trường REPL dựa trên màn hình trở nên hữu ích, bởi vì bạn chỉ cần di chuyển con trỏ đến danh sách chương trình trên màn hình, chỉnh sửa dòng trên màn hình và nhấn ENTER để lưu trữ. Điều này có vẻ như bạn đang chỉnh sửa dòng, trong thực tế, bạn đang chỉnh sửa văn bản trên màn hình và sau đó thay thế toàn bộ dòng bằng dòng mới từ màn hình. Ngoài ra, chèn các dòng mới trở nên dễ dàng nếu bạn để các số không sử dụng ở giữa. Để lam sang tỏ:
10 FOR I=1 TO 42
20 PRINT I
30 NEXT I
Sau khi nhập lại dòng 20 với các thay đổi và thêm dòng mới, nó có thể là
5 LET COUNT=0
10 FOR I=1 TO 42
20 PRINT "Index", I
25 LET COUNT=COUNT+1
30 NEXT I
Có lợi ích (hoặc lời nguyền, vì nó cho phép mã spaghetti BASIC nổi tiếng) có thể sử dụng số dòng làm cấu trúc ngôn ngữ, ít nhất là mục tiêu của các lệnh GOTO
AND GOSUB
. Điều này có thể được thay thế bằng nhãn, nhưng sử dụng số dòng đơn giản hơn nhiều để thực hiện trong trình thông dịch BASIC, đây vẫn là phần thưởng nhất định trong máy tính gia đình 8 bit thông thường của thập niên 80.
Quan trọng hơn, từ góc độ trải nghiệm người dùng, số dòng thực sự là một giao diện hoàn toàn dễ dàng nhưng hoàn chỉnh để chỉnh sửa mã. Chỉ cần gõ một dòng bắt đầu bằng một số để chèn mã mới. Sử dụng LIST 100-200
để hiển thị các dòng 100-200. Để chỉnh sửa một dòng, liệt kê nó trên màn hình, chỉnh sửa văn bản trên màn hình và nhập lại dòng. Để xóa một dòng, chỉnh sửa nó thành trống, chỉ đơn giản là cung cấp số dòng không có gì sau nó. Một đoạn để mô tả điều này. So sánh việc cố gắng mô tả việc sử dụng các trình soạn thảo văn bản cũ như edlin của DOS, hoặc ed hoặc ex của Unix: bạn cần một đoạn (chỉ một cường điệu nhẹ) chỉ để giải thích cách người dùng có thể thoát chúng, khi bắt đầu vô tình!
Các câu trả lời khác giải thích làm thế nào số dòng đến. Tôi đang cố gắng trình bày ở đây, tại sao các số dòng vẫn tồn tại miễn là chúng làm như thế nào, chúng tiếp tục giải quyết vấn đề trong thế giới thực như thế nào: Chúng đưa ra một cách để lập trình thực tế mà không cần một trình soạn thảo thực sự, theo một cách rất đơn giản. Khi các trình soạn thảo văn bản toàn màn hình phù hợp, dễ sử dụng trở thành cách chính để chỉnh sửa mã, cả hai giới hạn phần cứng đều biến mất và khi quán tính của những người thích nghi với những điều mới được khắc phục, thì phương ngữ BASIC dựa trên số dòng khá nhanh chóng biến mất khi sử dụng, bởi vì vấn đề khả năng sử dụng cốt lõi mà họ đã giải quyết không còn là vấn đề nữa.
Trong thời đại và thời đại khi Basic được phát triển, thiết bị I / O tốt nhất hiện có là một loại teletype. Chỉnh sửa một chương trình được thực hiện bằng cách in (trên giấy) một danh sách toàn bộ chương trình, hoặc phần thú vị của chương trình, sau đó nhập các dòng thay thế bằng số dòng.
Đó cũng là lý do tại sao việc đánh số dòng mặc định là 10, vì vậy sẽ có các số không được sử dụng giữa các dòng hiện có.
ren
lệnh '', để đánh số lại. Một điển hình gọi là ren 10, 10
(ghi số lại bắt đầu từ mười, incrementing bởi mười - hành vi mặc định nếu người ta chỉ đánh máy ren
. Các goto
và gosub
và then (linenumber)
. Các lệnh sẽ được tự động cập nhật Nhưng điều này là chắc chắn không có sẵn trong những điều cơ bản đầu tiên Nhưng IIRC, đã có sẵn trong Apple. Integer Basic, Applesoft FP basic, TI Basic / Extended Basic, MS Basic / GW Basic, v.v.
"Số dòng" có nghĩa là một vài điều khác nhau.
Trước hết, hãy nhớ rằng khái niệm "đường" không tồn tại mãi mãi. Nhiều ngôn ngữ lập trình trong thời đại này đã sử dụng thẻ đục lỗ và có số thứ tự (thường là trong một vài cột cuối cùng của thẻ) đã giúp bạn khôi phục bộ bài của mình theo đúng thứ tự nếu bạn đánh rơi nó, hoặc điều gì đó khủng khiếp đã xảy ra trong đầu đọc thẻ. Có máy móc để làm điều này tự động.
Số dòng để sử dụng làm mục tiêu của GOTO
báo cáo là một khái niệm hoàn toàn khác. Trong FORTRAN IV, chúng là tùy chọn và đi trước câu lệnh (trong các cột 1-5). Ngoài việc dễ thực hiện hơn nhãn dạng tự do, còn có khái niệm về GOTO được tính toán và gán , cho phép bạn chuyển sang số dòng tùy ý. Đây là thứ mà hầu hết các ngôn ngữ lập trình hiện đại không có (mặc dù các switch
câu lệnh đã gần), nhưng là một mẹo quen thuộc đối với các lập trình viên.
BASIC có nguồn gốc từ FORTRAN, và dự định đơn giản hơn để thực hiện và hiểu, do đó, buộc mọi "dòng" phải có số dòng (cả để giải trình tự và làm mục tiêu của GOTO
/ GOSUB
tuyên bố) có lẽ là một quyết định thiết kế được đưa ra vì lý do đó.
goto array_of_labels[some_computation()];
GOTO
(hoặc ASSIGN
) và số nguyên gốc aka số học aka ba chiều IF
, và (hiếm khi được sử dụng) trả lại thay thế CALL
và sắp xếp các mục tiêu (có thể phân định mục tiêu) DO
và các FORMAT
câu lệnh. Trên các báo cáo khác, họ là tùy chọn.
GOTO 1000+N*100
để mô phỏng một switch
câu lệnh.
Tôi bắt đầu lập trình trong COBOL, sử dụng số dòng trong các cột 1-6 của mỗi dòng. Bởi vì không có IDE trong những năm 1970, mọi thứ được thực hiện thông qua thẻ đục lỗ và số dòng được sử dụng để xác định dòng nào trong nguồn ban đầu sẽ được thay thế và dòng nào mới được thêm vào. Chúng tôi đã sử dụng để tăng số dòng lên 100 để cung cấp cho chúng tôi chỗ để thêm nhiều dòng hơn.
BASIC xuất hiện muộn hơn FORTRAN, trong kỷ nguyên thiết bị đầu cuối. Nó có môi trường đọc-exe-print-loop tương tác nhiều hơn một cỗ bài.
Tôi đã học lập trình, trong BASIC, trên màn hình một dòng chứa 24 ký tự. Số dòng là một cách tự nhiên để xác định nơi bạn muốn một dòng đi, cho dù chỉnh sửa một hoặc chèn giữa những người khác.
Tôi thực sự không thể tưởng tượng bạn sẽ làm điều đó như thế nào.
Một điểm chưa ai nhắc đến là người mới bắt đầu dễ dàng suy luận về luồng chương trình nơi các mục tiêu chi nhánh rõ ràng. Vì vậy, thay vì phải khớp các câu lệnh BEGIN / END (có thể lồng nhau) (hoặc bất kỳ dấu phân cách khối nào được sử dụng), thì rõ ràng là dòng điều khiển đi qua. Điều này có lẽ hữu ích với đối tượng mục tiêu của BASIC (rốt cuộc đó là Mã hướng dẫn tượng trưng cho mọi mục đích của người mới bắt đầu ).
Hệ thống chia sẻ thời gian Dartmouth sử dụng giao diện teletype. Do đó, nó sử dụng một giao diện dựa trên lệnh. Ban đầu, số dòng chỉ được sử dụng như một phương tiện để chỉnh sửa chương trình. Bạn có thể chèn, thay thế hoặc xóa bằng cách sử dụng số dòng. Có vẻ như phiên bản đầu không sử dụng số dòng cho câu lệnh goto, nhưng đây là phần bổ sung sau cho ngôn ngữ.