Trình biên dịch C ban đầu, được viết bởi Dennis Ritchie (còn được gọi là dmr) vào đầu những năm 1970, đã trở thành một hiện vật lịch sử đáng chú ý đối với các lập trình viên và nhà khoa học máy tính. Mã nguồn nguyên thủy này, hiện được lưu giữ trong kho lưu trữ legacy-cc, mang đến cái nhìn thoáng qua về những khởi đầu khiêm tốn của thứ sau này sẽ phát triển thành một ngành công nghiệp trị giá hàng nghìn tỷ đô la.
Một Trình Biên Dịch Không Thể Được Biên Dịch
Kho lưu trữ chứa những phiên bản sớm nhất của trình biên dịch C, có từ khoảng năm 1972. Điều thú vị là, những tệp mã nguồn này không thể được biên dịch bằng các trình biên dịch C hiện đại như GCC. Mã nguồn lịch sử này đại diện cho một giai đoạn chuyển tiếp trong sự phát triển ngôn ngữ lập trình, với một số người bình luận lưu ý rằng trình biên dịch C đầu tiên thực sự được viết bằng B, với cơ sở mã dần dần phát triển thông qua những thay đổi lặp đi lặp lại cho đến khi nó trở thành thứ mà chúng ta hiện nay công nhận là C.
Có lẽ đây là một trong những phần mềm yêu thích nhất của tôi mọi thời đại. Tôi đã học được rất nhiều từ nó!
Cú Pháp Từ Một Kỷ Nguyên Khác
Mã nguồn cho thấy những khác biệt đáng kể giữa C ban đầu và phiên bản hiện đại của nó. Một người bình luận đã nhấn mạnh việc sử dụng khác thường các từ khóa như extern và auto - những thuật ngữ vẫn tồn tại trong C hiện đại nhưng hoạt động khác ngày nay. Trong những tệp ban đầu này, extern được sử dụng để đưa các biểu tượng toàn cục vào phạm vi hàm, và mọi thứ mặc định là kiểu int mà không cần khai báo rõ ràng. Khai báo mảng đôi khi chỉ định kích thước trong khi những khai báo khác thì không, với các mảng không có kích thước về cơ bản hoạt động như các con trỏ.
Cú pháp này đại diện cho cái mà nhiều người gọi là K&R C (Kernighan and Ritchie C), có trước C chuẩn hóa ANSI C/C89 mà hầu hết các lập trình viên sẽ nhận ra ngày nay. Mặc dù đã bị loại bỏ cách đây hàng thập kỷ, phong cách này đã được hỗ trợ bởi GCC với cờ -traditional cho đến gần đây.
Thông tin chính về legacy-cc
- Tác giả gốc: Dennis Ritchie (dmr)
- Thời kỳ: Khoảng năm 1972
- Phần cứng: Phát triển cho PDP-11
- Tính năng nổi bật:
- Khai báo hàm theo kiểu K&R
- Kiểu "int" mặc định
- Kỹ thuật quản lý bộ nhớ không thông thường
- Thiết kế trình biên dịch hai giai đoạn
Tài nguyên hữu ích
- Giả lập PDP-11: http://pdp11.aiju.de/
- Kho lưu trữ Research Unix: https://www.tuhs.org/Archive/Distributions/Research/
- Mã nguồn gốc: https://www.bell-labs.com/usr/dmr/www/primevalC.html
Quản Lý Bộ Nhớ Sáng Tạo
Có lẽ khía cạnh thú vị nhất của cơ sở mã là một hàm có tên waste() đã gây ra nhiều thảo luận đáng kể. Hàm này dường như cố tình tiêu thụ không gian thông qua các lệnh gọi đệ quy:
waste() /* waste space */
{
waste(waste(waste),waste(waste),waste(waste));
waste(waste(waste),waste(waste),waste(waste));
...
}
Mặc dù chú thích ngắn gọn chỉ nêu waste space (lãng phí không gian), phân tích của cộng đồng cho thấy đây thực sự là một kỹ thuật thông minh để dự trữ bộ nhớ. Một người bình luận giải thích rằng cả hai giai đoạn của trình biên dịch đều sử dụng cách tiếp cận này để đảm bảo các vùng bộ nhớ dành riêng có cùng địa chỉ qua các giai đoạn, cho phép các cây biểu thức với con trỏ được truyền giữa các giai đoạn một cách hiệu quả. Điều này cho thấy những hạn chế về phần cứng của thời đại đó buộc các lập trình viên phải phát triển những giải pháp sáng tạo có thể trông có vẻ kỳ lạ theo tiêu chuẩn ngày nay.
Tác Động Lịch Sử
Ý nghĩa của mã nguồn này vượt xa những điều kỳ lạ về mặt kỹ thuật. Như một người bình luận đã lưu ý, phiên bản đầu tiên của Oracle Database có sẵn công khai (v2, phát hành năm 1979) được viết bằng assembly cho PDP-11. Khi Oracle sau đó viết lại phiên bản 3 bằng C (1983) để tăng tính di động đa nền tảng, họ phát hiện ra rằng các máy tính lớn thiếu trình biên dịch C. Thay vì viết lại cơ sở dữ liệu của họ bằng COBOL hoặc một ngôn ngữ máy tính lớn khác, Oracle đã tạo ra trình biên dịch C riêng cho máy tính lớn.
Mô hình này lặp lại trên khắp ngành công nghiệp, với C trở thành ngôn ngữ phổ biến của lập trình hệ thống và cho phép tính di động của phần mềm trên các nền tảng phần cứng đa dạng. Chính hệ điều hành UNIX, ban đầu được phát triển cùng với C, đã được chuyển sang máy tính lớn System/370 của IBM vào năm 1980.
Suy Ngẫm về Tính Đơn Giản và Phức Tạp
Kho lưu trữ đã thúc đẩy những cuộc thảo luận sâu sắc về bản chất của C. Mặc dù nhiều lập trình viên đánh giá cao C vì vẻ đơn giản rõ ràng của nó, một số người bình luận lưu ý rằng sự đơn giản này phần nào là ảo tưởng. Ngôn ngữ có thể nhỏ gọn và gần với phần cứng, nhưng nó chứa đựng sự phức tạp đáng kể về mặt ngữ nghĩa thông qua các chuyển đổi kiểu ngầm định, quy tắc bí danh và yêu cầu quản lý bộ nhớ.
Như một người bình luận đã diễn đạt một cách hùng hồn, C nhỏ gọn, nhưng không đơn giản. Vẻ đơn giản được cảm nhận của nó đến từ việc buộc các chương trình phải giữ đơn giản bằng cách giới hạn các trừu tượng mạnh mẽ, không phải từ việc bản thân ngôn ngữ dễ dàng để triển khai hoặc hiểu đầy đủ.
Nhìn vào mã nguồn lịch sử này cung cấp góc nhìn quý giá về việc máy tính đã phát triển như thế nào trong khi nhắc nhở chúng ta rằng ngay cả những hệ thống hiện đại phức tạp nhất cũng có nguồn gốc từ những khởi đầu khiêm tốn này. Kho lưu trữ legacy-cc đứng như một minh chứng cho việc một phần mềm tương đối nhỏ, được tạo ra bởi một bộ óc xuất chúng, có thể đặt nền móng cho hàng thập kỷ tiến bộ công nghệ.
Tham khảo: legacy-cc