H: Tôi thường nghe tuyên bố rằng các ngôn ngữ được gõ động có năng suất cao hơn các ngôn ngữ được nhập tĩnh. Những lý do cho tuyên bố này là gì? "
Điều này có lý do lịch sử. Nếu bạn quay trở lại một vài thập kỷ, các ngôn ngữ động có năng suất cao hơn nhiều so với các ngôn ngữ tĩnh (trong khi cũng chậm hơn đáng kể). Perl rõ ràng có năng suất cao hơn nhiều so với C nếu bạn biết cả hai và nhiệm vụ trong tay cho phép. Nhưng theo thời gian, các ngôn ngữ đã vay mượn rất nhiều lẫn nhau và các ngôn ngữ mới hơn đang thu hẹp khoảng cách (cả về năng suất và hiệu suất).
Dưới đây là một số điểm cần xem xét:
Thu gom rác : Thu gom rác là một sự tăng năng suất rất lớn . Tôi tin rằng Java là ngôn ngữ tĩnh chính đầu tiên với GC. Trước đây, tĩnh về cơ bản có nghĩa là quản lý bộ nhớ thủ công. (Lưu ý: Ở đây và sau đây tôi chỉ xem xét các ngôn ngữ chính. Có rất nhiều ngôn ngữ thử nghiệm và ngôn ngữ thích hợp sẽ cung cấp các mẫu đối với bất kỳ điểm nào tôi thực hiện.)
An toàn bộ nhớ : Đó là một cải tiến năng suất mà bạn không phải lo lắng về việc tự bắn vào chân mình. Trước các ngôn ngữ tĩnh "được quản lý" như Java, tĩnh thường có nghĩa là truy cập bộ nhớ trực tiếp. Gỡ lỗi cũng là một phần của năng suất và truy cập bộ nhớ không an toàn có thể dẫn đến các lỗi thực sự tối nghĩa.
Hệ thống loại cồng kềnh. Trước khi giới thiệu các loại tham số hóa (như mẫu hoặc tổng quát) trong các ngôn ngữ tĩnh, các hạn chế của hệ thống loại tĩnh thường là một gánh nặng. Ví dụ, trong Java, bạn phải downcast rõ ràng mỗi khi bạn chọn một mục từ bộ sưu tập. Vì vậy, bạn có chi phí cú pháp của một diễn viên và không có loại an toàn. Xem xét các bộ sưu tập phổ biến trong lập trình như thế nào, đây là một nhược điểm lớn.
Phải khai báo kiểu của mọi thứ là rất nhiều kiểu gõ thừa, nhưng với suy luận kiểu hiện đại, điều này có thể được giảm đáng kể.
Thư viện tiêu chuẩn lớn. Python nổi tiếng được quảng cáo là "bao gồm pin" vì thư viện tiêu chuẩn lớn. Điều này so với C có một thư viện tiêu chuẩn rất tối giản. Nhưng với các nền tảng như Java và .net, một thư viện tiêu chuẩn rộng lớn đang trở thành tiêu chuẩn và các ngôn ngữ mới hơn như Scala và F # đang kế thừa "miễn phí" này.
Cấu trúc dữ liệu hạng nhất. Các ngôn ngữ động như Perl và Python có các cấu trúc dữ liệu hạng nhất như danh sách và bản đồ với các phím tắt cú pháp thuận tiện cho các hoạt động chung. So với điều này, C không có bộ sưu tập dựng sẵn ngoại trừ mảng có kích thước cố định.
Các cú pháp đóng và cú pháp lambda - các ngôn ngữ động thường có từ đầu, nhưng các ngôn ngữ tĩnh đã áp dụng điều này, gần đây nhất là Java.
REPL khả năng nhanh chóng kiểm tra các đoạn mã tương tác là một lợi ích rất lớn. Nhưng mặc dù các công cụ IDE, như cửa sổ "ngay lập tức" trong Visual Studio, các ngôn ngữ tĩnh có thể mô phỏng điều này ở một mức độ nào đó.
Công cụ nâng cao - ngoài những điểm trên mà ngôn ngữ tĩnh đang tiến gần hơn đến sự tiện lợi của ngôn ngữ động, các biên tập viên hiện đại đang tận dụng phân tích tĩnh theo cách mà ngôn ngữ động có thời gian phù hợp. Ví dụ, các biên tập viên có thể cung cấp các phép tái cấu trúc tự động an toàn, một điều hoàn toàn không thể nói bằng ngôn ngữ động.
Điểm mấu chốt: Trong lịch sử là đúng, nhưng ngày nay câu trả lời ít rõ ràng hơn.
Q: Vậy: có gì để nói về năng suất với kiểu gõ động thực sự là một lợi thế của chính kiểu máy?
Thật khó để tách mô hình gõ động khỏi các ngôn ngữ động, nhưng như một ví dụ C # đã áp dụng nhiều tính năng động hơn theo thời gian, mặc dù cốt lõi của nó là ngôn ngữ tĩnh. Đây thực sự là một bằng chứng về lợi ích của mô hình kiểu động. Ví dụ:
Reflection
Reflection về cơ bản là một tính năng gõ động. Bạn kiểm tra các loại đối tượng tại thời gian chạy hơn thời gian biên dịch. Khi được giới thiệu, nó đã hơi nhăn mặt, nhưng trong C #, việc sử dụng sự phản chiếu ngày càng phổ biến hơn, ví dụ, ASP.Net MVC sử dụng sự phản chiếu rất nhiều.
Các thuộc tính Các thuộc
tính là một ví dụ về kiểu gõ động. Bạn có thể thêm các thuộc tính tùy ý vào một lớp tại thời gian biên dịch và sau đó bạn kiểm tra tại thời gian chạy (thông qua sự phản chiếu) và thao tác với các đối tượng dựa trên nó. Một cái gì đó giống như MEP về cơ bản là một khung mở rộng dựa trên mô hình kiểu động.
Linq sang SQL, EF mv.
Các biến áp Linq khác nhau kiểm tra các truy vấn như các đối tượng thời gian chạy và tạo sql một cách nhanh chóng. Nó không có được năng động hơn kiểm tra mã trong thời gian chạy. CodeDom là mặt khác của đồng tiền, nơi mã có thể được tạo khi chạy
Roslyn
Roslyn về cơ bản thực hiện eval
, đã từng được coi là tính năng xác định của một ngôn ngữ thực sự năng động.
Động
Các dynamic
kiểu là tính năng một cách rõ ràng năng động nhất trong C #, và được quảng cáo tại làm cho sự tương tác với các đối tượng bên ngoài và ngôn ngữ đơn giản và hiệu quả hơn. Nhưng nó cũng được sử dụng trong Asp.net MVC để thuận tiện.
Lợi ích của tất cả các tính năng trên cho thấy mô hình động có các lợi thế nhất định ngay cả trong một ngôn ngữ tĩnh với các kiểu tham số, kiểu cấu trúc và suy luận kiểu.