Cách đột phá ngôn ngữ lập trình năm 1989 vận hành JavaScript hiện đại

Nhóm Cộng đồng BigGo
Cách đột phá ngôn ngữ lập trình năm 1989 vận hành JavaScript hiện đại

Trong thế giới ngôn ngữ lập trình, những ý tưởng cách mạng thường phải mất nhiều thập kỷ để được chấp nhận rộng rãi. Ngôn ngữ SELF, được phát triển vào cuối những năm 1980, đã giới thiệu các khái niệm mà vào thời điểm đó có vẻ mang tính đột phá nhưng giờ đây lại tạo nền tảng cho các engine JavaScript hiện đại. Mặc dù có sự xuất sắc về mặt kỹ thuật, SELF vẫn chủ yếu bị giới hạn trong các phòng thí nghiệm nghiên cứu trong khi những ý tưởng của nó âm thầm biến đổi web như chúng ta biết ngày nay.

Cuộc cách mạng nguyên mẫu suýt thành hiện thực

SELF xuất hiện như một thử nghiệm táo bạo trong lập trình hướng đối tượng, loại bỏ hoàn toàn các class để ủng hộ các prototype. Trong mô hình này, các đối tượng kế thừa trực tiếp từ các đối tượng khác thay vì từ các định nghĩa class trừu tượng. Cách tiếp cận này hứa hẹn tính linh hoạt và đơn giản hơn, cho phép các lập trình viên sửa đổi hệ thống mà không bị ràng buộc bởi các hệ thống phân cấp kiểu cứng nhắc. Ngôn ngữ này cũng truy cập trạng thái hoàn toàn thông qua các message, tạo ra một mô hình nhất quán tuyệt vời nơi mọi thứ hoạt động theo cùng một cách.

JavaScript nợ Self rất nhiều, không chỉ trong thời gian chạy mà còn trong thiết kế đối tượng dựa trên nguyên mẫu của nó.

Trong khi JavaScript tiếp nhận khái niệm prototype của SELF, nhiều người cho rằng nó đã bỏ lỡ sự thanh lịch của bản triển khai gốc. Phiên bản của JavaScript đã trở thành thứ mà một bình luận viên mô tả là một hệ thống giả-class kỳ quặc khiến các nhà phát triển bối rối cho đến ngày nay. Sự tương phản này làm nổi bật việc các cân nhắc về tiếp thị thường lấn át thiết kế kỹ thuật thuần túy trong việc áp dụng ngôn ngữ.

Các Đổi Mới Chính Của Ngôn Ngữ SELF:

  • Mô hình đối tượng dựa trên nguyên mẫu (không có lớp)
  • Truy cập trạng thái chỉ thông qua thông điệp
  • Kế thừa động đa hình
  • Nội tuyến hóa phương thức tích cực
  • Bộ nhớ đệm nội tuyến đa hình
  • Khử tối ưu hóa động để gỡ lỗi
  • Biên dịch lại gia tăng minh bạch

Những đột phá về hiệu suất đã thay đổi mọi thứ

Điều kỳ diệu thực sự của SELF không chỉ nằm ở mô hình lập trình của nó — mà còn ở hiệu suất đáng kinh ngạc đạt được thông qua các kỹ thuật biên dịch mang tính cách mạng. Nhóm phát triển SELF đã phát triển thứ mà họ gọi là implementation-level maps để nhóm các đối tượng một cách minh bạch, cung cấp thông tin kiểu quan trọng cho trình biên dịch. Quan trọng hơn, họ đã tiên phong trong việc biên dịch động nhiều phiên bản phương thức, mỗi phiên bản được tùy chỉnh cho các kiểu đối tượng khác nhau.

Cách tiếp cận này cho phép trình biên dịch thực hiện inlining tích cực, về cơ bản là nhúng các hàm được gọi trực tiếp vào mã đang gọi. Hệ thống thậm chí có thể tái tạo lại các khung ngăn xếp đã được inline cho mục đích gỡ lỗi, làm cho các tối ưu hóa này hoàn toàn minh bạch với các lập trình viên. Những kỹ thuật này đã giúp hiệu suất của SELF tăng gấp đôi so với các triển khai Smalltalk đương thời, bất chấp bản chất năng động hơn của SELF.

Thành tựu về Hiệu suất:

  • Chạy nhanh gấp đôi so với phiên bản Smalltalk nhanh nhất (1989)
  • Đạt được hiệu suất cao mặc dù sử dụng kiểu dữ liệu động
  • Loại bỏ chi phí không gian rõ ràng của các hệ thống nguyên mẫu

Di sản sống mãi trong JavaScript hiện đại

Mối liên hệ giữa nghiên cứu của SELF và các engine JavaScript ngày nay là trực tiếp và sâu sắc. Các trình biên dịch just-in-time (JIT) hiện đại trong các engine như V8 sử dụng các chiến lược tối ưu hóa có nguồn gốc từ SELF. Các kỹ thuật polymorphic inline cache, biên dịch lại động và deoptimization từng giúp SELF chạy nhanh giờ đây đang vận hành các ứng dụng web mà chúng ta sử dụng hàng ngày.

Điều đặc biệt thú vị là cách các kỹ thuật biên dịch tiên tiến này cuối cùng đã tìm được đường vào các hệ thống thực tế. Như một thành viên cộng đồng nhận xét, những người tạo ra Self đã không nghĩ rằng nó sẽ chạy nhanh, cho đến khi nó thực sự làm được. Điều này chứng minh rằng các dự án nghiên cứu có thể mang lại những lợi ích thực tiễn bất ngờ nhiều năm sau đó.

Tại sao cú pháp quan trọng hơn ngữ nghĩa

Cuộc thảo luận xung quanh di sản của SELF tiết lộ một sự thật khó chịu về việc áp dụng công nghệ: trải nghiệm của nhà phát triển thường lấn át tính ưu việt về kỹ thuật. Trong khi SELF có cú pháp thanh lịch kiểu Smalltalk, JavaScript lại chấp nhận cú pháp kiểu C cảm thấy quen thuộc hơn với đông đảo đối tượng lập trình viên. Lựa chọn thiết kế này, kết hợp với vị trí của JavaScript trong mọi trình duyệt web, đã đảm bảo sự thống trị của nó bất chấp những thỏa hiệp về kỹ thuật.

Cộng đồng phản ánh về sự trớ trêu này — những đổi mới xuất sắc nhất của SELF đã được sử dụng rộng rãi thông qua JavaScript, nhưng chính ngôn ngữ này lại tương đối ít người biết đến. Thị trường đã tưởng thưởng cho ngôn ngữ được thiết kế dễ tiếp cận và thực tế hơn là ngôn ngữ thuần túy về mặt kỹ thuật.

So sánh JavaScript và SELF:

  • JavaScript đã tiếp nhận khái niệm prototype từ SELF nhưng với cách triển khai khác biệt
  • JavaScript sử dụng constructor functions thay vì pure prototype delegation
  • SELF có mô hình đối tượng đồng nhất hơn mà không phân biệt các kiểu dữ liệu nguyên thủy
  • Các JavaScript engine hiện đại triển khai các kỹ thuật JIT compilation lấy cảm hứng từ SELF

Bài học cho tương lai của thiết kế ngôn ngữ

Câu chuyện về SELF mang đến những bài học lâu dài về sự tiến hóa của ngôn ngữ lập trình. Hệ thống này đã chứng minh rằng sự đơn giản triệt để trong thiết kế có thể mang lại cả sức mạnh biểu đạt và hiệu suất cao. Sự phát triển của nó cho thấy các môi trường lập trình tương tác có thể cùng tồn tại với các tối ưu hóa tinh vi — một sự cân bằng mà các công cụ phát triển hiện đại vẫn đang phấn đấu để đạt được.

Các kỹ thuật do nhóm SELF tiên phong tiếp tục ảnh hưởng đến các triển khai ngôn ngữ mới ngày nay. Khi các nhà phát triển tìm kiếm hiệu suất tốt hơn cho các ngôn ngữ động, họ khám phá lại và xây dựng dựa trên các khái niệm lần đầu tiên xuất hiện trong nghiên cứu đột phá này từ năm 1989.

Hành trình từ phòng thí nghiệm nghiên cứu đến việc được áp dụng rộng rãi có thể dài và quanh co, nhưng di sản của SELF chứng minh rằng những ý tưởng tuyệt vời cuối cùng sẽ tìm được vị trí của chúng — ngay cả khi chúng xuất hiện với một cú pháp khác và những cái tên khác.

Tham khảo: An Efficient Implementation of SELF, a Dynamically-Typed Object-Oriented Language Based on Prototypes