Câu trả lời ngắn: không, vì Turing tương đương.
Câu trả lời dài: Anh chàng này là một kẻ troll. Mặc dù đúng là các hệ thống kiểu "giới hạn bạn trong một tập hợp con", nhưng những thứ bên ngoài tập hợp con đó, theo định nghĩa, là những thứ không hoạt động.
Bất cứ điều gì bạn có thể làm trong bất kỳ ngôn ngữ lập trình hoàn chỉnh Turing nào (ngôn ngữ được thiết kế cho lập trình đa năng, cộng với nhiều thứ không phải là một thanh khá thấp để xóa và có một số ví dụ về hệ thống trở thành Turing- hoàn toàn không chủ ý) bạn có thể thực hiện bằng bất kỳ ngôn ngữ lập trình Turing-Complete nào khác. Điều này được gọi là "Turing tương đương", và nó chỉ có nghĩa chính xác những gì nó nói. Điều quan trọng, điều đó không có nghĩa là bạn có thể làm điều khác dễ dàng như ngôn ngữ kia - một số người sẽ cho rằng đó là toàn bộ quan điểm tạo ra một ngôn ngữ lập trình mới ngay từ đầu: để cho bạn cách làm tốt hơn những thứ mà các ngôn ngữ hiện có hút vào.
Ví dụ, một hệ thống loại động có thể được mô phỏng trên hệ thống loại OO tĩnh bằng cách chỉ khai báo tất cả các biến, tham số và trả về giá trị làm Object
loại cơ sở và sau đó sử dụng phản xạ để truy cập dữ liệu cụ thể bên trong, vì vậy khi bạn nhận ra điều này bạn thấy rằng thực sự không có gì bạn có thể làm trong một ngôn ngữ động mà bạn không thể làm bằng ngôn ngữ tĩnh. Nhưng làm theo cách đó sẽ là một mớ hỗn độn, tất nhiên.
Anh chàng trong đoạn trích dẫn chính xác là các kiểu tĩnh hạn chế những gì bạn có thể làm, nhưng đó là một tính năng quan trọng, không phải là vấn đề. Các dòng trên đường giới hạn những gì bạn có thể làm trong xe của bạn, nhưng bạn có thấy chúng hạn chế, hoặc hữu ích? (Tôi biết rằng tôi sẽ không muốn lái xe trên một con đường phức tạp, bận rộn, nơi không có gì bảo những chiếc xe đi ngược chiều để đi về phía họ và không đi qua nơi tôi đang lái xe!) Bằng cách thiết lập các quy tắc phân định rõ ràng những gì xem xét hành vi không hợp lệ và đảm bảo rằng điều đó sẽ không xảy ra, bạn sẽ giảm đáng kể khả năng xảy ra sự cố khó chịu.
Ngoài ra, anh ấy đã nhầm lẫn ở phía bên kia. Không phải là "tất cả các chương trình thú vị mà bạn muốn viết sẽ hoạt động như các loại", mà là "tất cả các chương trình thú vị mà bạn muốn viết sẽ yêu cầu các loại." Một khi bạn vượt qua một mức độ phức tạp nhất định, sẽ rất khó để duy trì cơ sở mã mà không có hệ thống loại để giữ cho bạn phù hợp, vì hai lý do.
Đầu tiên, bởi vì mã không có chú thích kiểu rất khó đọc. Hãy xem xét Python sau:
def sendData(self, value):
self.connection.send(serialize(value.someProperty))
Bạn mong đợi dữ liệu trông như thế nào mà hệ thống ở đầu kia của kết nối nhận được? Và nếu nó nhận được một cái gì đó trông hoàn toàn sai, làm thế nào để bạn tìm ra những gì đang xảy ra?
Tất cả phụ thuộc vào cấu trúc của value.someProperty
. Nhưng nó trông như thế nào? Câu hỏi hay! Gọi là sendData()
gì? Nó đang trôi qua là gì? Biến đó trông như thế nào? Nó từ đâu đến? Nếu nó không phải là cục bộ, bạn phải theo dõi toàn bộ lịch sử value
để theo dõi những gì đang diễn ra. Có thể bạn đang vượt qua một thứ khác cũng có một someProperty
tài sản, nhưng nó không làm những gì bạn nghĩ nó làm?
Bây giờ chúng ta hãy xem nó với các chú thích kiểu, như bạn có thể thấy trong ngôn ngữ Boo, sử dụng cú pháp rất giống nhau nhưng được gõ tĩnh:
def SendData(value as MyDataType):
self.Connection.Send(Serialize(value.SomeProperty))
Nếu có điều gì đó không ổn, đột nhiên công việc sửa lỗi của bạn trở nên dễ dàng hơn: tìm kiếm định nghĩa MyDataType
! Ngoài ra, cơ hội có hành vi xấu vì bạn đã vượt qua một số loại không tương thích cũng có một thuộc tính có cùng tên đột nhiên bằng không, vì hệ thống loại sẽ không cho phép bạn mắc lỗi đó.
Lý do thứ hai được xây dựng dựa trên lý do thứ nhất: trong một dự án lớn và phức tạp, rất có thể bạn có nhiều người đóng góp. (Và nếu không, bạn sẽ tự xây dựng nó trong một thời gian dài, về cơ bản là giống nhau. Hãy thử đọc mã bạn đã viết 3 năm trước nếu bạn không tin tôi!) Điều này có nghĩa là bạn không biết điều gì đã xảy ra đi qua người đứng đầu đã viết gần như bất kỳ phần nào của mã vào thời điểm họ viết nó, bởi vì bạn không ở đó, hoặc không nhớ đó có phải là mã của chính bạn từ lâu không. Có khai báo kiểu thực sự giúp bạn hiểu ý định của mã là gì!
Những người như anh chàng trong đoạn trích dẫn thường xuyên hiểu sai về lợi ích của việc gõ tĩnh như là "giúp trình biên dịch" hoặc "tất cả về hiệu quả" trong một thế giới nơi mà tài nguyên phần cứng gần như không giới hạn làm cho nó ngày càng ít liên quan hơn qua mỗi năm. Nhưng như tôi đã chỉ ra, trong khi những lợi ích đó chắc chắn tồn tại, lợi ích chính là ở các yếu tố con người, đặc biệt là khả năng đọc và bảo trì mã. (Tuy nhiên, hiệu quả được thêm vào chắc chắn là một phần thưởng tuyệt vời!)