Có rất nhiều ý kiến mạnh mẽ xung quanh cuộc tranh luận nhưng rõ ràng đây không thực sự là vấn đề quan điểm, đó là vấn đề thực tế . Vì vậy, chúng ta nên nhìn vào nghiên cứu thực nghiệm . Và bằng chứng từ đó là rõ ràng:
Có , gõ tĩnh là giá trị thương mại-offs - và không chỉ bởi một chút, nhưng trên thực tế đáng kể . Trên thực tế, bằng chứng vững chắc cho thấy việc gõ tĩnh có thể giảm ít nhất 15% lỗi trong mã (và đây là ước tính thấp, tỷ lệ thực tế gần như chắc chắn lớn hơn). Đó là một con số cao đáng kinh ngạc : Tôi nghĩ rằng ngay cả hầu hết những người đề xuất kiểu gõ tĩnh sẽ không nghĩ rằng nó tạo ra sự khác biệt lớn như vậy.
Hãy xem xét điều này: nếu ai đó nói với bạn rằng có một cách đơn giản để giảm 15% lỗi trong dự án của bạn chỉ sau một đêm, thì đó là một việc không có trí tuệ. 1 Nó gần như là viên đạn bạc tục ngữ.
Bằng chứng được trình bày trong bài báo Loại hay không gõ: Định lượng lỗi phát hiện trong JavaScript của Zheng Gao, Christian Bird và Earl T. Barr. Tôi khuyến khích mọi người đọc nó, đó là một bài viết tốt trình bày nghiên cứu mẫu mực.
Thật khó để tóm tắt ngắn gọn về việc các tác giả đã thực hiện phân tích chặt chẽ như thế nào nhưng đây là một phác thảo (rất thô sơ):
TypeScript và Flow là hai ngôn ngữ lập trình dựa trên JavaScript, trong khi vẫn tương thích với nhau, thêm gợi ý kiểu và kiểm tra kiểu tĩnh. Điều này cho phép tăng mã hiện có theo loại và sau đó gõ kiểm tra nó.
Các nhà nghiên cứu đã thu thập các dự án nguồn mở được viết bằng JavaScript từ GitHub, xem xét các báo cáo lỗi đã giải quyết và cố gắng giảm từng lỗi được báo cáo thành một đoạn mã sẽ bị trình kiểm tra loại tĩnh của TypeScript hoặc Flow bắt được. Điều này cho phép họ ước tính giới hạn thấp hơn về tỷ lệ lỗi có thể được sửa bằng cách sử dụng kiểu gõ tĩnh.
Các nhà nghiên cứu đã thực hiện các biện pháp phòng ngừa nghiêm ngặt để đảm bảo rằng phân tích của họ sẽ không coi một lỗi không liên quan đến loại là có liên quan đến các loại. 2
So với các nghiên cứu trước đây, nghiên cứu mới này có những điểm mạnh đặc biệt:
- Có một so sánh trực tiếp giữa gõ tĩnh và gõ động, với một vài yếu tố gây nhiễu (nếu có), vì sự khác biệt duy nhất giữa JavaScript và TypeScript / Flow là cách gõ.
- Chúng thực hiện sao chép trên nhiều thứ nguyên bằng cách kiểm tra cả TypeScript và Flow (tức là các hệ thống loại khác nhau) và bằng cách cho những người khác nhau tái tạo chú thích loại (thủ công) để sửa lỗi. Và họ thực hiện điều này trên một số lượng lớn các cơ sở mã từ các dự án khác nhau.
- Bài viết đo lường tác động trực tiếp của việc gõ tĩnh lên các lỗi có thể sửa chữa (thay vì một số chất lượng mơ hồ hơn).
- Các tác giả định nghĩa một mô hình nghiêm ngặt về những gì cần đo, và làm thế nào, lên phía trước. Hơn nữa, mô tả của họ cực kỳ rõ ràng và giúp dễ dàng phân tích các sai sót (thật tốt khi một bài nghiên cứu mở ra các cuộc tấn công: nếu không có cuộc tấn công nào có thể làm xáo trộn lập luận của nó, thì nó còn mạnh hơn nữa). 3
- Họ thực hiện phân tích công suất phù hợp để kích thước mẫu của họ là đủ, và phân tích thống kê tiếp theo của họ là kín khí.
- Họ quá bảo thủ để loại trừ những giải thích gây nhiễu, và chỉ đo một phần chuyển động duy nhất. Hơn nữa, họ hạn chế phân tích của họ đối với các lỗi có thể sửa được ngay lập tức bằng cách bao gồm các loại và loại trừ mọi thứ có thể yêu cầu tái cấu trúc nâng cao hơn để phù hợp với việc gõ. Vì vậy, trong thực tế, hiệu ứng lớn hơn rất nhiều, nhưng chắc chắn không nhỏ hơn những gì họ báo cáo.
- Và cuối cùng, họ không tìm thấy một hiệu ứng nhỏ nhưng sự khác biệt đáng kinh ngạc . Mặc dù thủ tục bảo thủ quá mức của họ, ngay cả ở mức thấp của khoảng tin cậy 95%, họ thấy rằng có ít nhất 10% lỗi sẽ biến mất chỉ với các kiểm tra loại được thêm tối thiểu.
Trừ khi có một lỗ hổng cơ bản trong bài báo mà chưa ai phát hiện ra, bài báo cho thấy một lợi ích lớn của việc gõ tĩnh, gần như không mất phí. 4
Trên một ghi chú lịch sử, nghiên cứu về việc gõ các môn học trong lập trình đã có một khởi đầu mạnh mẽ bởi vì, trong một thời gian dài, bằng chứng không rõ ràng. Lý do cho điều này là vì thực hiện các thử nghiệm có hệ thống để kiểm tra hiệu quả của việc gõ tĩnh so với gõ động không dễ dàng: một thử nghiệm có hệ thống phải cô lập hiệu ứng mà chúng tôi đang nghiên cứu. Và thật không may, chúng tôi không thể cô lập hiệu ứng của môn học đánh máy, vì nó gắn liền với các ngôn ngữ lập trình.
Thực tế đã có các ngôn ngữ lập trình cho phép gõ cả tĩnh và động trong các phương ngữ khác nhau (ví dụ VB có Option Strict
On
hoặc Off
, hoặc gõ tĩnh Lisp). Tuy nhiên, những điều này không phù hợp để so sánh trực tiếp, quan trọng nhất là vì không có cơ sở mã đủ lớn hiện có cho phép so sánh trực tiếp. Tốt nhất chúng ta có thể so sánh chúng trong các thiết lập trong phòng thí nghiệm của Cameron, trong đó các đối tượng thử nghiệm giải quyết ngẫu nhiên một nhiệm vụ trong biến thể gõ tĩnh hoặc động của ngôn ngữ.
Thật không may, các bài tập lập trình nhân tạo này không mô hình hóa việc sử dụng trong thế giới thực. Cụ thể, nhiều trong số chúng có phạm vi nhỏ và giải quyết một vấn đề được xác định rõ có thể tóm tắt trên nửa trang văn bản.
May mắn thay, trong quá khứ, bởi vì TypeScript, Flow và JavaScript thực sự là cùng một ngôn ngữ ngoại trừ việc gõ tĩnh và vì có một bộ dữ liệu mã và lỗi trong thế giới thực rộng lớn để lấy mẫu.
1 Lấy cảm hứng từ một trích dẫn từ bài báo gốc.
2 Tôi không hoàn toàn hài lòng với điều này: một trong những thế mạnh chính của các ngôn ngữ được gõ tĩnh là các vấn đề không liên quan đến kiểu có thể được xử lý theo cách có thể được kiểm tra kiểu tĩnh. Điều này biến đổi nhiều lỗi logic thành lỗi loại, làm tăng đáng kể tỷ lệ lỗi có thể bị bắt bằng cách gõ tĩnh. Trên thực tế, bài báo phân loại một cách thô sơ các lỗi không liên quan đến loại và tôi cho rằng một tỷ lệ lớn trong số đó thực tế có thể bị bắt bằng cách gõ tĩnh.
3 Tôi mời bất cứ ai, đặc biệt là những người ủng hộ việc gõ động, cố gắng tìm ra những sai sót không được giải quyết trong phân tích. Tôi không nghĩ có nhiều (nếu có), và tôi tin rằng không có lỗ hổng tiềm năng nào làm thay đổi nghiêm trọng kết quả.
4 Tôi nghi ngờ rằng chi phí thực tế của việc gõ tĩnh trong các dự án thực tế, quy mô lớn là không có, vì sau đó nó trở thành một phần tự nhiên của kiến trúc và thậm chí có thể đơn giản hóa việc lập kế hoạch. Sửa lỗi loại tĩnh cần có thời gian, nhưng ít hơn nhiều so với lỗi được phát hiện sau này. Điều này đã được nghiên cứu rộng rãi theo kinh nghiệm và đã được biết đến trong nhiều thập kỷ (xem ví dụ Code Complete ).