Sự khác biệt về kiến ​​trúc giữa ngôn ngữ động và ngôn ngữ tĩnh


22

Có sự khác biệt lớn về kiến ​​trúc khi thiết kế các ứng dụng sẽ được xây dựng trên các ngôn ngữ tĩnh (như C # hoặc Java) và các ngôn ngữ động (như Ruby hoặc Python) không?

Những khả năng thiết kế nào có thể là một lựa chọn tốt cho một loại mà là một loại xấu cho loại kia? Có bất kỳ tính năng hữu ích nào có thể đạt được với một loại không phải với loại kia (tất nhiên là về thiết kế và kiến ​​trúc) không?

Ngoài ra, có bất kỳ mẫu thiết kế năng động cụ thể?


1
Cho dù những khác biệt về kiến ​​trúc là gì, các ngôn ngữ động - IronRuby và IronPython - dễ dàng khen ngợi các ngôn ngữ tĩnh của Net.
Tôi chấp nhận

3
Tôi không chắc chắn, nhưng nếu siêu lập trình dễ dàng hơn trong các ngôn ngữ động (chắc chắn trong Ruby có vẻ dễ hơn so với Java, lần trước tôi đã xem), điều đó có thể có ảnh hưởng đến các quyết định về kiến ​​trúc. Tôi không chắc loại ảnh hưởng nào vì tôi chưa bao giờ thực sự làm việc với bất cứ thứ gì to lớn trong các ngôn ngữ động này.
Thất vọngWithFormsDesigner

Câu trả lời:


14

Hãy nói thẳng một vài điều:

  1. Kịch bản tương tác và ngôn ngữ tĩnh không loại trừ lẫn nhau. Cả F # và Haskell đều có giao diện REPL.
  2. Ngôn ngữ động và hiệu suất cao không loại trừ lẫn nhau, mặc dù một số tối ưu hóa là. JavaScript chạy khá nhanh trên hầu hết các trình duyệt hiện nay.
  3. Ngay cả trong các ngôn ngữ động, bạn vẫn cần ghi lại, ghi nhớ và suy nghĩ về các loại.
  4. Do sự phổ biến ngày càng tăng của suy luận kiểu, rất nhiều ngôn ngữ tĩnh không phải thường xuyên ghi chú các loại nữa. Trong các ngôn ngữ tĩnh với suy luận kiểu mạnh, trình biên dịch sẽ tìm ra các loại từ mã của bạn sao cho hầu hết thời gian và cho bạn biết nếu bạn đã từng làm điều gì đó vi phạm định nghĩa loại. Theo như cú pháp, điều này cung cấp tốt nhất của cả hai thế giới.
  5. OOP và ngôn ngữ động không loại trừ lẫn nhau. PHP bây giờ hỗ trợ các lớp và thậm chí thừa kế.

Tất cả những điểm tương đồng đáng ngạc nhiên đó, có một số khác biệt thực tế có ảnh hưởng đến quá trình phát triển:

  1. Các ngôn ngữ động cho phép các cách thú vị để truyền dữ liệu xung quanh trong phạm vi nhỏ .
  2. Ngôn ngữ tĩnh cho phép bạn giảm số lượng thử nghiệm bạn phải thực hiện bằng cách thực hiện nhiều loại lỗi không thể.
  3. Cũng vậy, các ngôn ngữ tĩnh cho phép xác thực thú vị và các tính năng chuyển đổi tự động, như các đơn vị đo lường trong F # .
  4. Được thực hiện đến mức cực đoan, các ngôn ngữ tĩnh cho phép ký hợp đồng mã và xác minh chính thức, có thể ghi lại và ngăn chặn những thứ như chia số tiềm năng, vòng lặp vô hạn, tham chiếu null, kích thước danh sách không hợp lệ, lỗi phạm vi và trạng thái không hợp lệ khác mà bạn có thể định nghĩa.
  5. Đi xa hơn nữa, tối ưu hóa CPU có thể được thực hiện dựa trên các ràng buộc tĩnh này, mang lại hiệu suất thậm chí tốt hơn.

Ngoài ra còn có một loại chương trình không bao giờ có thể được thực hiện nếu không gõ tĩnh: Singularity , HĐH không có ranh giới xử lý phần cứng. Nó được viết bằng một lượng nhỏ C, một số C # và một phương ngữ của C # được gọi là Spec #, hỗ trợ các hợp đồng mã.

Mặc dù được viết bằng ngôn ngữ được thu gom rác, nhưng hiệu năng giao tiếp đa nhiệm và xử lý trên hệ điều hành này thực tế tốt hơn bất kỳ thứ gì khác ngoài đó, do thực tế là tất cả các quy trình chạy trong một không gian bộ nhớ và do tối ưu hóa xác minh chính thức tôi đã đề cập ở trên. Bạn không thể làm điều này mà không cần gõ tĩnh, vì để các chương trình không thể thỏa hiệp với phần còn lại của hệ thống, các đối tượng giao tiếp cần phải được xác minh tĩnh.

Hầu hết thời gian, mặc dù, kiến ​​trúc nên trông rất giống nhau. Ngôn ngữ tĩnh có thể làm cho các chương trình dễ dàng suy luận hơn trong nhiều trường hợp vì các loại được xác định rõ, nhưng một chương trình ngôn ngữ động được viết tốt cũng sẽ có các loại, ít nhất, được xác định rõ ràng trong tâm trí của nhà phát triển.


Singularity có thể cung cấp đảm bảo độ trễ tối đa nhận biết thời gian thực không?
Eonil

@Eonil Không thực sự là lĩnh vực của tôi, nhưng tôi nghĩ bạn đang hỏi liệu nó có thể làm khó thời gian thực không. Tôi không nghĩ vậy, vì nó sử dụng bộ sưu tập rác khắp nơi. Theo tôi biết, Singularity đã không được cập nhật trong một thời gian, nhưng có lẽ ai đó đã tạo ra thứ gì đó tương tự với trình thu gom rác thời gian thực.
Rei Miyasaka

Cảm ơn. Tôi chỉ muốn kiểm tra. Tôi đã nghe nói có một số triển khai GC thời gian thực, nhưng tôi chưa nghe thấy chúng được sử dụng thực tế như thế nào trong ngành
Eonil

2

Có một sự khác biệt đáng kể về kiến ​​trúc. Hiệu suất.

Tùy thuộc vào ngân sách phần cứng của bạn, khối lượng công việc dự kiến ​​và thỏa thuận cấp độ dịch vụ, có thể không thể đáp ứng các yêu cầu với ngôn ngữ động.

Thông thường tốc độ phát triển và tính linh hoạt được cung cấp bởi các ngôn ngữ động bù cho thời gian đáp ứng chậm hơn mức tiêu thụ cpu và bộ nhớ cao hơn. Nhưng đối với các hệ thống lớn hơn với hạn chế về ngân sách hoặc hiệu suất, chi phí chung của ngôn ngữ động có thể cao.


1

Tôi chưa bao giờ nghĩ dọc theo những dòng này. Vì vậy, khi Google làm, blog của Peter Norvig là một trong những trang nổi tiếng nhất. Nó nói rằng một số mẫu thiết kế dễ thực hiện hơn trong các ngôn ngữ động so với các ngôn ngữ hướng đối tượng truyền thống như C ++. Tôi nghĩ rằng cũng nên có sự khác biệt về thiết kế / kiến ​​trúc vì ông lưu ý rằng việc thực hiện dễ dàng hơn trong các ngôn ngữ động. Tôi sẽ cố gắng thêm nhiều hơn vào câu trả lời khi tôi nghiên cứu thêm.


1

Có sự khác biệt lớn về kiến ​​trúc khi thiết kế các ứng dụng sẽ được xây dựng trên các ngôn ngữ tĩnh (như C # hoặc Java) và các ngôn ngữ động (như Ruby hoặc Python) không?

Không.

Dễ dàng hơn để viết các khung ưa thích cho các ngôn ngữ động. Nhưng đó không phải là một điều ứng dụng.

Những khả năng thiết kế nào có thể là một lựa chọn tốt cho một loại mà là một loại xấu cho loại kia?

Không, thực sự.

Bạn có thể viết những điều tốt đẹp bằng một trong hai ngôn ngữ.

Có bất kỳ tính năng hữu ích nào có thể đạt được với một loại không phải với loại kia (tất nhiên là về thiết kế và kiến ​​trúc) không?

Không.

Sự khác biệt là các ngôn ngữ động là "viết, chạy, sửa". Bạn có thể thử nghiệm và sửa chữa nhanh chóng.

Ngôn ngữ tĩnh là "viết, biên dịch, xây dựng, chạy, sửa chữa". Bạn không thể thử nghiệm dễ dàng.

Ngoài ra, chúng gần như giống nhau về khả năng của chúng.

Có bất kỳ mẫu thiết kế năng động cụ thể?

Có lẽ. Python eval()và các execfile()hàm - theo một cách nào đó - chỉ ra một tính năng ngôn ngữ động rất khó (nhưng không thể thực hiện được) bằng ngôn ngữ tĩnh. Sẽ là rất nhiều dòng mã để biên dịch và thực thi mã trong cùng một không gian quy trình.

Đó không phải là ngôn ngữ động cụ thể. Nó chỉ dễ dàng hơn.


2
"Bạn không thể thử nghiệm dễ dàng như vậy." - Đúng, sự cân bằng là trình biên dịch giúp bạn tìm ra lỗi trong khi với các ngôn ngữ được dịch, bạn có thể không tìm thấy lỗi cho đến khi người dùng thực thi dòng mã đó.
Doug T.

4
@Doug T.: "Trình biên dịch giúp bạn tìm lỗi". Đôi khi. Không thường xuyên đủ. Các lỗi thú vị không thể được tìm thấy bởi một trình biên dịch. Đó là những gì đơn vị thử nghiệm dành cho.
S.Lott

2
@ S.Lott Tôi thấy rằng các API được viết bằng các ngôn ngữ động đòi hỏi nhiều tài liệu hơn một chút. Trong một ngôn ngữ tĩnh, chữ ký phương thức cho bạn biết các loại đối số được yêu cầu. Trong ngôn ngữ động, bạn không thể nói dễ dàng - tài liệu API phải cho bạn biết những đối tượng nào được mong đợi.
tử

1
@quanticle: Đó không phải là kiến ​​trúc, phải không?
S.Lott

2
"Bạn không thể thử nghiệm dễ dàng." - F # và Haskell đều là ngôn ngữ tĩnh và chúng có REPL chính thức và hiếm khi hỏi bạn về loại định danh hoặc loại biểu thức.
Rei Miyasaka
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.