English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

khách
1 / ?
trở lại bài học

Lập Trình Bằng Nhị Phân Tuyệt Đối

Những lập trình viên đầu tiên viết bằng nhị phân tuyệt đối: mọi lệnh & mọi địa chỉ ở dạng chữ số nhị phân thô. Một lệnh duy nhất có thể trông giống như 01100101 00001010 — mã lệnh & địa chỉ bộ nhớ ở dạng nhị phân.

Vấn Đề Mã Spaghetti

Khi một lỗi yêu cầu chèn một lệnh mới, các lập trình viên gặp phải tình thế khó xử. Chèn tại chỗ có nghĩa là mỗi địa chỉ lệnh sau đó dịch chuyển đi một vị trí — yêu cầu lập trình viên cập nhật mọi tham chiếu địa chỉ trong toàn bộ chương trình. Thảm họa.

Giải pháp: thay thế lệnh ngay trước điểm chèn bằng một bước nhảy đến bộ nhớ trống. Tại vị trí trống đó: viết lệnh bị ghi đè, thêm các lệnh mới, rồi nhảy trở lại. Khi lỗi xuất hiện trong các sửa chữa, áp dụng cùng một thủ thuật bằng cách sử dụng bộ nhớ trống khác. Kết quả: con đường thực thi qua chương trình nhảy đến những vị trí dường như ngẫu nhiên. Hamming gọi đây là 'một can spaghetti'. Con đường điều khiển, vẽ trên giấy, trông hoàn toàn giống như spaghetti rối tung.

Những Con Đường Thoát Nước

Hai cải tiến tức thời: ký hiệu bát phân (nhóm chữ số nhị phân theo bộ 3) & thập lục phân (nhóm 4 chữ số, sử dụng A–F cho các giá trị lớn hơn 9). Những cải tiến này giảm lỗi viết nhưng không giải quyết được vấn đề địa chỉ cơ bản.

Hội đủng biểu tượng (ví dụ: SAP của IBM — Symbolic Assembly Program — & SOAP — Symbolic Optimizing Assembly Program trên IBM 650) cho phép các lập trình viên viết tên lệnh (ADD, MOVE) & nhãn địa chỉ biểu tượng thay vì nhị phân. Trình ghép chèn dịch nhị phân vào lúc nhập, tự động quản lý các phân bổ địa chỉ.

SOAP thực hiện một tối ưu hóa bổ sung: nó sắp xếp các lệnh trên trống quay sao cho lệnh tiếp theo đến đầu đọc ngay khi lệnh trước đó hoàn thành — mã hóa độ trễ tối thiểu. SOAP thậm chí còn biên dịch chính nó: chương trình A được xử lý dữ liệu để tạo ra B, chương trình B chạy trên A để đo lường bao nhiêu tự biên dịch cải thiện nó.

Parse Tree & Language Hierarchy

Thư Viện & Mã Có Thể Tái Định Vị

Hamming lưu ý rằng ý tưởng về phần mềm có thể tái sử dụng (thư viện toán học) ra đời rất sớm — Babbage đã hình dung nó. Vấn đề: một thư viện địa chỉ tuyệt đối yêu cầu mỗi thường trình chiếm cùng các vị trí bộ nhớ mỗi lần được sử dụng. Khi thư viện tổng cộng trở nên quá lớn, các chương trình cạnh tranh cho cùng các địa chỉ.

Giải pháp: mã có thể tái định vị. Trình ghép chèn tạo ra các lệnh tham chiếu bộ nhớ một cách tương đối — độ lệch từ địa chỉ cơ sở — thay vì địa chỉ tuyệt đối. Một bộ liên kết giải quyết các địa chỉ cuối cùng vào lúc tải.

Các báo cáo chưa xuất bản của Von Neumann (được lưu hành rộng rãi) mô tả các thủ thuật lập trình cần thiết. Cuốn sách lập trình xuất bản đầu tiên (Wilkes, Wheeler & Gill, EDSAC, 1951) đã kiến tạo những kỹ thuật này.

Giải thích tại sao thư viện địa chỉ tuyệt đối tạo ra vấn đề khả năng mở rộng, & mã có thể tái định vị giải quyết nó như thế nào. Thuộc tính cụ thể nào của địa chỉ tuyệt đối gây ra sự va chạm, & 'có thể tái định vị' có nghĩa kỹ thuật là gì?

Lựa Chọn Thiết Kế Ngôn Ngữ

FORTRAN (1957, IBM) & ALGOL (1958, ủy ban quốc tế) đại diện cho hai triết lý thiết kế tạo ra các kết quả cực kỳ khác nhau.

FORTRAN

John Backus dẫn dắt dự án FORTRAN (FORmula TRANslation) tại IBM. Mục tiêu thiết kế: làm cho ngôn ngữ dễ sử dụng cho các nhà khoa học & kỹ sư. FORTRAN chấp nhận ký hiệu toán học cảm thấy tự nhiên cho người dùng của nó: A = B + C * D thay vì ADD B, C; STORE T; MULTIPLY T, D; STORE A.

FORTRAN tồn tại hơn 60 năm. Nó vẫn được sử dụng tích cực trong tính toán khoa học, động lực chất lỏng, mô hình hóa khí hậu, & vật lý tính toán. Hamming lưu ý sự bền vững này như bằng chứng của thiết kế thành công.

ALGOL

ALGOL (ALGOrithmic Language) được thiết kế bởi một ủy ban các nhà logic học & nhà khoa học máy tính nhằm mục đích nghiêm ngặt toán học: một ngôn ngữ sạch sẽ về mặt logic, có thể định nghĩa chính thức. Ký hiệu Backus-Naur Form (BNF) để mô tả ngữ pháp được phát minh để chỉ định ALGOL.

ALGOL thất bại trong thực tế. Bất chấp sự thanh lịch logic & ảnh hưởng to lớn của nó đối với thiết kế ngôn ngữ tiếp theo (Pascal, C, & gần như mọi ngôn ngữ hiện đại đều xuất phát từ các khái niệm ngữ pháp của ALGOL), chính ALGOL không bao giờ được triển khai rộng rãi. Phán quyết của Hamming: được thiết kế logic, không thể sử dụng được từ mặt nhân sự.

Hệ Thống Phân Cấp của Các Ngôn Ngữ

Hamming mô tả một hệ thống phân cấp tự nhiên từ mã máy lên qua hội đủng, các ngôn ngữ bậc cao hơn, & cuối cùng là một 'ngôn ngữ định hướng vấn đề' gần với cách chuyên gia trong một lĩnh vực suy nghĩ về vấn đề của họ. Mỗi cấp độ tăng khả năng đọc cho con người với chi phí hiệu quả máy.

Bốn Tiêu Chí Thiết Kế Ngôn Ngữ của Hamming

Hamming đã chắt lọc bài học từ FORTRAN vs ALGOL thành bốn tiêu chí cho một ngôn ngữ lập trình thành công:

1. Dễ học — một người mới bắt đầu có thể trở thành năng suất nhanh chóng

2. Dễ sử dụng — các tác vụ thường lệ yêu cầu độ phức tạp tối thiểu

3. Dễ gỡ lỗi — lỗi tạo ra các thông báo có ý nghĩa, dễ xác định vị trí

4. Dễ sử dụng các chương trình con — tái sử dụng & trừu tượng hóa không yêu cầu nỗ lực anh hùng

Ông thêm một nhận xét có cấu trúc: ngôn ngữ con người mang khoảng 60% dự phòng; ngôn ngữ viết khoảng 40%. Các ngôn ngữ dự phòng thấp (như APL) tạo ra các dòng một lệnh thanh lịch mà các chuyên gia tìm thấy đẹp & người mới bắt đầu tìm thấy không thể đọc được — & chứa các lỗi không thể phát hiện được khi một ký tự duy nhất thay đổi ý nghĩa.

Hàm ý: một ngôn ngữ được thiết kế để thanh lịch logic tối ưu hóa cho độc giả sai. Lập trình viên là con người; con người cần dự phòng để bắt lỗi & truyền đạt ý định.

Áp dụng bốn tiêu chí của Hamming cho một ngôn ngữ lập trình bạn biết rõ. Cho mỗi tiêu chí điểm từ 1–5 (5=xuất sắc). Sau đó xác định tiêu chí nào, nếu được tăng cường, sẽ cải thiện nhất ngôn ngữ — & giải thích một thay đổi cụ thể sẽ như thế nào.

Thiết Kế Ngôn Ngữ Tâm Lý vs Logic

Hamming quay lại cuộc so sánh FORTRAN/ALGOL như một bài học về động lực thể chế & con người, không chỉ là thiết kế ngôn ngữ.

FORTRAN được thiết kế tâm lý — cho các con người sẽ sử dụng nó, cụ thể là các nhà khoa học suy nghĩ bằng ký hiệu toán học. ALGOL được thiết kế logic — để đạt được tính chính xác hình thức & sự thanh lịch lý thuyết.

Điều mâu thuẫn Hamming xác định: một ngôn ngữ được thiết kế logic chính xác mà con người chống lại thất bại; một ngôn ngữ được thiết kế thực dụng mà con người áp dụng thành công, ngay cả khi nó lộn xộn hơn về mặt logic.

Ông trích dẫn APL như trường hợp cực đoan: thanh lịch về mặt logic, có thể biểu hiện trong một dòng lệnh, với bộ ký tự đặc biệt của riêng nó. Các chuyên gia yêu thích nó. Các lập trình viên bình thường tìm thấy nó không thể đọc được. Một thay đổi ký tự duy nhất có thể âm thầm biến đổi ý nghĩa của chương trình. APL có một cộng đồng nhỏ tận tâm & gần như không sử dụng chính thống.

Đối số dự phòng con người: ngôn ngữ nói ~60% dự phòng (ngữ cảnh lặp lại, các từ làm rõ, cấu trúc dự đoán được). Ngôn ngữ viết ~40% dự phòng. Dự phòng này phục vụ phát hiện lỗi — con người không đáng tin cậy, vì vậy ngôn ngữ đã phát triển để mang đủ thông tin lặp lại để bắt & sửa lỗi. Một ngôn ngữ dự phòng thấp loại bỏ mạng an toàn này.

Hệ Thống Phân Cấp Trình Biên Dịch

Hamming mô tả tầng lớp trình biên dịch/thông dịch viên: một chương trình có thể đọc vào một ngôn ngữ bậc cao hơn & dịch nó thành một ngôn ngữ bậc thấp hơn. Xếp chồng những lớp này — mỗi lớp dịch một cấp độ xuống dưới. Ở trên cùng: một ngôn ngữ định hướng vấn đề mà các chuyên gia trong một lĩnh vực (sinh học, tài chính, vật lý) viết một cách tự nhiên. Ở dưới cùng: mã máy. Mỗi quá trình chuyển đổi là một trình biên dịch hoặc thông dịch viên.

Dự Đoán Sự Tồn Tại của Ngôn Ngữ

Vào năm 1993, Hamming đã chứng kiến nhiều ngôn ngữ thành công & thất bại. FORTRAN (1957) tồn tại. ALGOL (1958) thất bại. COBOL (1959) tồn tại hàng thập kỷ trong tính toán kinh doanh. LISP (1958) tồn tại trong nghiên cứu AI. PL/I (1964) cố gắng thống nhất mọi thứ & thất bại.

Sử dụng sự phân biệt thiết kế tâm lý vs logic của Hamming & bốn tiêu chí của ông, giải thích tại sao một ngôn ngữ bạn biết thịnh vượng & một ngôn ngữ thất bại (hoặc đang thất bại). Lời giải thích của bạn nên xác định các yếu tố con người cụ thể thúc đẩy áp dụng hoặc từ chối — không chỉ các thuộc tính kỹ thuật.

Mô Hình Tái Diễn

Chương lịch sử phần mềm của Hamming chứa một cấu trúc tái diễn:

1. Một giới hạn đau đớn tồn tại (địa chỉ tuyệt đối, ký hiệu nhị phân, mã không thể bảo trì)

2. Ai đó phát minh ra một lớp trừu tượng che giấu giới hạn

3. Sự trừu tượng hóa cho phép quy mô mới, tạo ra các giới hạn đau đớn mới

4. Lặp lại

Nhị phân → bát phân/thập lục phân → hội đủng biểu tượng → FORTRAN → lập trình có cấu trúc → ngôn ngữ hướng đối tượng → ngôn ngữ định hướng vấn đề. Mỗi lớp giải quyết vấn đề cấp bách nhất của người tiền nhiệm trong khi giới thiệu một lớp vấn đề mới.

Mã spaghetti (địa chỉ tuyệt đối) dẫn đến hội đủng biểu tượng. Các chương trình hội đủng lớn dẫn đến FORTRAN. Các chương trình FORTRAN lớn dẫn đến lập trình có cấu trúc & sau đó định hướng đối tượng. Bài giảng của Hamming kết thúc trước những quá trình chuyển đổi sau này, nhưng mô hình tiếp tục.

Bài học của anh ấy cho các kỹ sư: bạn luôn giải quyết nỗi đau được phơi bày bởi sự trừu tượng hóa trước đó. Hiểu lớp bạn hiện đang ở yêu cầu biết tại sao lớp bên dưới tồn tại.

Xác định một lớp trừu tượng phần mềm mà bạn thường xuyên làm việc. Giới hạn đau đớn nào trong lớp dưới nó mà nó che giấu? & những gì lớp hiện tại của bạn giới thiệu — những nỗi đau nào mà lớp tiếp theo ở trên sẽ cần giải quyết?