Làm thế nào để một hệ thống kiểu tĩnh ảnh hưởng đến việc thiết kế ngôn ngữ dựa trên nguyên mẫu?


15

Các bài viết trên Wikipedia về ngôn ngữ dựa trên nguyên mẫu có chứa các đoạn như sau:

Hầu như tất cả các hệ thống dựa trên nguyên mẫu đều dựa trên các ngôn ngữ được giải thích và đánh máy động. Tuy nhiên, các hệ thống dựa trên các ngôn ngữ gõ tĩnh là khả thi về mặt kỹ thuật.

Theo cách nào thì một hệ thống kiểu tĩnh áp đặt các hạn chế hoặc đưa ra sự phức tạp trong ngôn ngữ dựa trên nguyên mẫu và tại sao lại có các ngôn ngữ nguyên mẫu được gõ động hơn?


2
+1 và fav'd: Tôi đã suy nghĩ về bản thân mình trong một thời gian dài và không tìm thấy bất kỳ vấn đề cực kỳ khó khăn nào với một hệ thống loại cấu trúc . Trên thực tế, điều này làm phiền tôi rất nhiều đến mức tôi muốn đi trước và cố gắng tạo ra một ngôn ngữ dựa trên nguyên mẫu được gõ tĩnh chỉ để xem có vấn đề gì ...

Tôi chỉ bắt đầu quá trình đó vì lý do tương tự :)
Joe

Câu trả lời:


6

Ranh giới giữa một loại cơ bản và một đối tượng được làm mờ và thường được giới thiệu một cách giả tạo. Ví dụ, trong C, struct chỉ là một nhóm các bản ghi, chỉ là một loại phi đối tượng dẫn xuất. Trong C ++, struct là một lớp với tất cả các trường công khai, một đối tượng. Tuy nhiên, C ++ gần như hoàn toàn tương thích ngược với C ... đường viền thực sự mềm mại ở đây.

Để lập trình dựa trên nguyên mẫu, bạn cần có các đối tượng có thể thay đổi khi chạy. Chúng PHẢI được gõ mềm bởi vì mỗi thay đổi trong thời gian chạy, một lớp thuộc loại này thay đổi thành loại khác - loại của nó thay đổi.

Bạn có thể giữ các loại phi đối tượng cơ bản và dẫn xuất là tĩnh. Nhưng điều này giới thiệu một sự khác biệt kỳ lạ, các đối tượng được gõ mềm, các đối tượng không được gõ tĩnh và một barier cứng phải được thiết lập giữa hai. Bạn có thể biến hình một cấu trúc? Một chuỗi? Số nên là một lớp hoặc một loại cơ bản, hoặc một tập hợp các loại cơ bản, int / float / bignum / etc?

Nó chỉ là tự nhiên hơn và dễ học, sử dụng và viết để có đồng phục này, tất cả các loại đều có thể thay đổi hoặc không có loại nào có thể thay đổi khi chạy. Nếu bạn tuyên bố chỉ có một loại (Đối tượng) là có thể thay đổi, bạn sẽ bị đau đầu và các vấn đề của cả hai thế giới.

Gõ tĩnh là:

  • dễ thực hiện hơn
  • nhanh hơn / hiệu quả hơn
  • an toàn hơn
  • dễ dàng hơn để duy trì / tài liệu các hệ thống lớn do sự trừu tượng.

Gõ động là:

  • viết nhanh hơn
  • súc tích hơn
  • ngôn ngữ dễ học hơn
  • tha thứ nhiều hơn cho các lỗi thiết kế.

Bằng cách pha trộn cả hai, bạn hy sinh rất nhiều.

  • Việc thực hiện trở nên khó khăn hơn bất kỳ hai điều trước.
  • tốc độ phụ thuộc vào việc bạn có sử dụng các loại mềm hay không ... Nếu bạn làm thế, nó sẽ thấp, nếu bạn không, tại sao lại chọn ngôn ngữ?
  • loại an toàn là ra khỏi cửa sổ cho tất cả các loại đối tượng.
  • theo cách một kiểu biến hình thành một kiểu khác là một nhiệm vụ khá khó khăn. Tài liệu về nó - rất khó.
  • Bạn vẫn cần phải thực hiện tất cả các sổ sách kế toán với các loại cơ bản, giúp giết chết sự đồng nhất và tốc độ viết
  • Độ phức tạp của ngôn ngữ cao hơn (khó học hơn) so với bất kỳ ngôn ngữ "cụ thể" nào,
  • "Tha thứ" cho một kiểu gõ động được thay thế bằng xu hướng một số lỗi rất khó hiểu ở các loại thuộc tính không khớp.

1
Lưu ý để cung cấp một ví dụ tại sao các đối tượng cần phải "có thể thay đổi" (tôi giả sử bạn có nghĩa là thêm và loại bỏ các thuộc tính, không thay đổi các thuộc tính, vì điều đó thường không liên quan đến việc gõ).

@delnan: không thực sự, trong lập trình dựa trên nguyên mẫu, bạn có thể khai thác can đảm của một đối tượng khi bạn thấy phù hợp, loại bỏ, thêm, thay thế, bao trùm, cả phương thức và thuộc tính trên một ví dụ trực tiếp. Đó là toàn bộ vấn đề và một sự thay thế linh hoạt, rất thuận tiện để sửa đổi các đối tượng thông qua các quy tắc cứng nhắc của kế thừa cổ điển. Nếu một ngôn ngữ sử dụng Lớp làm Loại, bạn không thể sửa đổi cấu trúc của ngôn ngữ đó nếu loại không mềm.
SF.

1
Tôi không nghĩ vậy. Theo cùng một logic, người ta có thể lập luận rằng lập trình dựa trên lớp cần các quyền tự do giống như các ngôn ngữ dựa trên lớp động cho phép điều này. Không, các nguyên mẫu tĩnh với hệ thống kiểu cấu trúc sẽ chú thích các đối tượng với danh sách các thành viên của nó và đệ quy các kiểu của chúng và kiểm tra tĩnh xem các thành viên này có tồn tại (và có đúng loại không) bằng cách yêu cầu tất cả các thành viên được cung cấp khi tạo đối tượng hoặc hiện diện trong nguyên mẫu và đơn giản là không bao gồm một cách để loại bỏ các thành viên. Kết quả vẫn có vẻ khá nguyên mẫu đối với tôi và đảm bảo rằng mỗi thành viên đều có mặt mọi lúc.

@delnan: Bạn vừa mô tả sự kế thừa cổ điển thông qua thành phần. Vâng, nó trông khá nguyên mẫu và là một cách (rất mọt sách) để thực hiện lập trình dựa trên nguyên mẫu trong một ngôn ngữ mô hình thừa kế cổ điển. Nó chỉ loại bỏ pb.p của 90% niềm vui, giết chết những lợi thế lớn nhất của nó (và đồng thời loại bỏ những nguy hiểm lớn nhất). Vâng, trong tương tự chụp chân cũ, pb.p đầy đủ tính năng sẽ giúp bạn bắn cả hai chân bằng một muỗng trà. Nếu bạn không thích loại sức mạnh này, tốt hơn hết bạn nên gắn bó với sự kế thừa cổ điển.
SF.

1
Bạn nhầm lẫn giữa "động" với "nguyên mẫu". Các quyền tự do này không kết hợp tốt với các hệ thống kiểu tĩnh không phải là các tính năng của nguyên mẫu, chúng là các tính năng của tính năng động. Tất nhiên, việc thêm kiểu gõ tĩnh sẽ ngăn chúng, nhưng chúng không phải là một phần của nguyên mẫu (đó là chủ yếu là IMGO thiếu các lớp để ủng hộ các đối tượng nhân bản để đóng vai trò là cha mẹ). Sự năng động đó là trực giao với các nguyên mẫu. Tất cả các ngôn ngữ nguyên mẫu phổ biến xảy ra bao gồm chúng, nhưng chúng độc lập với các nguyên mẫu như đã nêu trước đây. Xem xét đoạn trích này bằng ngôn ngữ hư cấu: pastebin.com/9pLuAu9F . Làm thế nào nó không phải là nguyên mẫu?

3

Khó khăn là khá đơn giản để xem: Lấy các đối tượng làm từ điển của các phương thức, hoặc như những thứ phản hồi lại các thông điệp, quan sát những điều sau đây về các ngôn ngữ OO được gõ tĩnh phổ biến:

  • Tất cả các khóa / tin nhắn từ điển thường được khai báo trước, sử dụng các định danh khai báo tĩnh.

  • Một số bộ thông báo nhất định được khai báo trước và các đối tượng được liên kết với các bộ này để xác định tin nhắn nào chúng phản hồi.

  • Mối quan hệ bao gồm của một tập hợp các thông điệp là tập hợp con khác được khai báo tĩnh và rõ ràng; không khai báo nhưng tập hợp con không hợp lệ.

  • Các nỗ lực kiểm tra loại để đảm bảo rằng tất cả các tin nhắn chỉ được gửi đến các đối tượng phản hồi lại chúng.

Mỗi một trong số những xung đột ở một mức độ nào đó với một hệ thống dựa trên nguyên mẫu:

  • Tên tin nhắn có thể được khai báo trước, dưới dạng "nguyên tử" hoặc chuỗi nội bộ hoặc không có gì, nhưng ít khác; độ dẻo của các đối tượng có nghĩa là việc gán các kiểu cho các phương thức là khó xử.

  • Có thể nói đó là tính năng thiết yếu của một hệ thống dựa trên nguyên mẫu, tập hợp các thông điệp được xác định bởi những gì đối tượng phản hồi, thay vì ngược lại. Sẽ là hợp lý khi gán bí danh cho các kết hợp cụ thể tại thời gian biên dịch, nhưng các bộ thông báo được xác định trong thời gian chạy phải có thể.

  • Tác động thực sự của hai lần nhấn ở trên với các mối quan hệ bao gồm, trong đó các tuyên bố rõ ràng là hoàn toàn không thể thực hiện được. Kế thừa theo nghĩa tĩnh, phân nhóm danh nghĩa là đối nghịch với một hệ thống dựa trên nguyên mẫu.

Điều này đưa chúng ta đến điểm cuối cùng, mà chúng ta không thực sự muốn thay đổi. Chúng tôi vẫn muốn đảm bảo rằng các tin nhắn chỉ được gửi đến các đối tượng phản hồi lại chúng. Tuy nhiên:

  • Chúng ta không thể biết tĩnh những thông điệp nào có thể được nhóm lại với nhau.
  • Chúng tôi không thể biết nhóm nào là tập hợp con của người khác.
  • Chúng tôi không thể biết nhóm nào là có thể.
  • Chúng tôi thậm chí không thể chỉ định loại đối số nào được gửi cùng với một tin nhắn.
  • Về cơ bản, chúng tôi thấy rằng chúng tôi không thể chỉ định nhiều thứ trong trường hợp hoàn toàn chung.

Vì vậy, làm thế nào điều này có thể được làm việc xung quanh? Bằng cách nào đó giới hạn toàn bộ tính tổng quát bằng cách nào đó (điều này gây khó chịu và có thể nhanh chóng tiêu diệt bất kỳ lợi ích nào khi sử dụng hệ thống dựa trên nguyên mẫu), hoặc làm cho hệ thống loại trở nên linh hoạt hơn và thể hiện các ràng buộc hơn là các loại chính xác .

Hệ thống loại dựa trên ràng buộc nhanh chóng dẫn đến khái niệm gõ phụ cấu trúc , theo nghĩa rất lỏng lẻo có thể được coi là tương đương tĩnh của "gõ vịt". Những trở ngại lớn nhất ở đây là các hệ thống như vậy phức tạp hơn nhiều để kiểm tra loại, và ít được biết đến (có nghĩa là ít nghiên cứu trước khi nghiên cứu).

Tóm lại: Có thể, nó khó thực hiện hơn hệ thống kiểu tĩnh danh nghĩa hoặc hệ thống động dựa trên siêu dữ liệu thời gian chạy, và do đó ít người bận tâm.


1

Tôi tin rằng một cách để đạt được một ngôn ngữ dựa trên nguyên mẫu, được gõ tĩnh sẽ là dựa trên ngôn ngữ xung quanh Mẫu và Khái niệm.

Các khái niệm đã từng là một tính năng được lên kế hoạch cho C ++ 0x. Mã chung trong các mẫu C ++ đã thực tế "gõ tĩnh". Ý tưởng của các khái niệm là có thể nói một số điều về các thành viên bắt buộc và đặc điểm của các loại, mà không yêu cầu hoặc ngụ ý một mô hình thừa kế lớp dựa trên mối quan hệ đó (vì nó phải làm việc với mã mẫu hiện có đã được "gõ tĩnh" ).

Trong ngôn ngữ dựa trên nền tảng của Mẫu và Khái niệm, đó sẽ là các Khái niệm dựa trên nguyên mẫu và Mẫu sẽ giải phóng bạn khỏi việc quan tâm đến bất kỳ mô hình lớp nào có thể hoặc không được sử dụng để triển khai các loại giá trị.

Ngoài các thủ thuật sử dụng biên dịch theo giai đoạn để cho phép ngôn ngữ trở thành ngôn ngữ meta của riêng nó, các dẫn xuất nguyên mẫu này của các khái niệm sẽ nhất thiết phải là bất biến khi được tạo. Tuy nhiên, sự phản đối rằng không dựa trên nguyên mẫu là cá trích đỏ. Nó chỉ đơn giản là một ngôn ngữ chức năng. Một ngôn ngữ cơ sở nguyên mẫu động cũng có chức năng ít nhất đã được thử .

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.