Ý nghĩa của những gì không làm sáng tạo ra là gì?


35

Tôi thấy rất nhiều văn bản, đặc biệt là các văn bản lập trình chức năng, cho rằng các khái niệm CS nhất định "không sáng tác" . Ví dụ: khóa không sáng tác, đơn nguyên không sáng tác.

Tôi đã có một thời gian khó khăn để theo dõi chính xác ý nghĩa của cụm từ này. Khi tôi nghĩ về thành phần, tôi nghĩ đến thành phần chức năng hoặc tập hợp đối tượng (như trong "thành phần ưu tiên hơn sự kế thừa"), nhưng dường như đó không phải là ý nghĩa mà mọi người đang sử dụng nó ở đây.

Ai đó có thể giải thích cụm từ này có nghĩa là gì khi được sử dụng trong các biểu thức như hai ví dụ trên (nghĩa là khóa và đơn nguyên) không?


Nó gần nghĩa với thành phần chức năng hơn là tập hợp đối tượng.
Andres F.

Một cách thô sơ và không chính thức, nếu bạn có hai thứ riêng biệt sử dụng khóa, thật khó để gắn chúng lại với nhau. (trong trường hợp ổ khóa, thật khó để làm mà không giới thiệu deadlocks; trong trường hợp của monads, các loại có thể bị phức tạp)
user253751

Câu trả lời:


35

Khi mọi người nói "X không soạn", ý nghĩa của chúng bằng cách "soạn" thực sự chỉ có nghĩa là "đặt lại với nhau", và những gìnhư thế nào bạn đặt chúng lại với nhau có thể rất khác nhau, tùy thuộc vào những gì chính xác "X" là.

Ngoài ra, khi họ nói "không sáng tác", họ có thể có nghĩa là một số điều hơi khác nhau:

  1. Bạn không thể đặt hai chữ X cùng nhau.
  2. Bạn có thể đặt hai X cùng nhau, nhưng kết quả có thể không phải là X (IOW: X không được đóng trong chế phẩm .)
  3. Bạn có thể đặt hai X cùng nhau, nhưng kết quả X có thể không hoạt động theo cách bạn mong đợi.

Một ví dụ cho # 1 là các trình phân tích cú pháp với máy quét / lexers. Bạn có thể nghe thấy cụm từ "máy quét / từ vựng không sáng tác". Điều đó không thực sự đúng. Ý họ là "trình phân tích cú pháp sử dụng một giai đoạn từ vựng riêng biệt không sáng tác".

Tại sao bạn muốn soạn thảo trình phân tích cú pháp? Chà, hãy tưởng tượng bạn là một nhà cung cấp IDE như JetBrains, Eclipse Foundation, Microsoft hoặc Embarcadero và bạn muốn xây dựng một IDE cho một khung web. Trong phát triển web điển hình, chúng tôi thường trộn lẫn các ngôn ngữ. Bạn có tệp HTML với <script>các thành phần có chứa ECMAScript và<style>các phần tử chứa CSS. Bạn có các tệp mẫu có chứa HTML, một số ngôn ngữ lập trình và một số metasyntax ngôn ngữ mẫu. Bạn không muốn viết các công cụ tô sáng cú pháp khác nhau cho "Python", "Python được nhúng trong một mẫu", "CSS", "CSS trong HTML", "ECMASCript", "ECMAScript trong HTML", "HTML", "HTML trong một mẫu ", vân vân và vân vân. Bạn muốn viết một cú pháp tô sáng cho Python, một cho HTML, một cho ngôn ngữ mẫu, sau đó kết hợp ba thành một cú pháp tô sáng cho một tệp mẫu.

Tuy nhiên, một lexer phân tích toàn bộ tệp thành một luồng mã thông báo, điều này chỉ có ý nghĩa đối với một ngôn ngữ đó. Trình phân tích cú pháp cho ngôn ngữ khác không thể hoạt động với mã thông báo mà trình từ vựng chuyển nó. Ví dụ: các trình phân tích cú pháp Python thường được viết theo cách mà trình từ chối theo dõi thụt lề và tiêm giả INDENTDEDENTmã thông báo vào luồng mã thông báo, do đó cho phép trình phân tích cú pháp không có ngữ cảnh mặc dù cú pháp của Python thực sự không. Tuy nhiên, một lexer HTML sẽ hoàn toàn bỏ qua khoảng trắng, vì nó không có ý nghĩa gì trong HTML.

Tuy nhiên, một trình phân tích cú pháp không quét, chỉ đơn giản là đọc các ký tự, có thể chuyển luồng ký tự sang một trình phân tích cú pháp khác, sau đó có thể đưa nó trở lại, do đó làm cho chúng dễ soạn hơn nhiều.

Một ví dụ cho # 2 là các chuỗi có các truy vấn SQL trong đó. Bạn có thể có hai chuỗi, mỗi chuỗi có truy vấn SQL đúng về mặt cú pháp, nhưng nếu bạn nối hai chuỗi đó, kết quả có thể không phải là truy vấn SQL chính xác về mặt cú pháp. Đó là lý do tại sao chúng ta phải truy vấn đại số như ARel, mà làm soạn.

Khóa là một ví dụ về # 3. Nếu bạn có hai chương trình có khóa và bạn kết hợp chúng thành một chương trình duy nhất, bạn vẫn có một chương trình có khóa, nhưng ngay cả khi hai chương trình gốc hoàn toàn chính xác, không có bế tắc và cuộc đua, chương trình kết quả không nhất thiết phải có bất động sản. Việc sử dụng đúng khóa là một thuộc tính toàn cầu của toàn bộ chương trình và là một thuộc tính không được bảo tồn khi bạn soạn chương trình. Điều này khác với, ví dụ, giao dịch, mà làm soạn. Một chương trình sử dụng chính xác các giao dịch có thể được soạn thảo với một chương trình khác như vậy và sẽ mang lại một chương trình kết hợp sử dụng đúng các giao dịch.


1
Nói cách khác, không có khả năng soạn thảo, có nghĩa là không thành lập nhóm semigroup (hoặc, mạnh hơn một chút, là một hình đơn sắc).
Jon Purdy

Tôi không chắc chắn về sự hấp dẫn là bắt buộc, vì vậy giống như một Magma (mà tôi đã học về nghĩa đen 3 giây trước :-D)
Jörg W Mittag

Tuy nhiên, nếu bạn hỏi ai đó về ý nghĩa của họ khi họ nói "khóa không sáng tác", tôi chắc chắn họ sẽ không trả lời "Ý tôi là tập hợp các chương trình đồng thời chính xác có khóa và thao tác sáng tác tạo thành Magma" .
Jörg W Mittag

Hah, tất nhiên là không. Chỉ là một cụm từ thay thế. Tôi có cảm giác rằng sự kết hợp là cần thiết để duy trì cảm giác sáng tác phẳng, nhưng không có lý lẽ mạnh mẽ nào để ủng hộ điều đó.
Jon Purdy

20

Khả năng tương thích có nghĩa là bạn có thể dễ dàng và đáng tin cậy kết hợp các thành phần chương trình lại với nhau để tạo ra các thành phần lớn hơn và chức năng phức tạp hơn.

Một số điều giúp làm cho các thành phần dễ kết hợp hơn:

  1. Vô tư. Hàm idempotent sẽ luôn tạo ra cùng một hiệu ứng đầu ra hoặc tác dụng phụ, nếu được gọi nhiều lần với cùng các giá trị tham số. Điều này cải thiện khả năng kết hợp vì kết quả của một cuộc gọi chức năng là có thể dự đoán được.

  2. Minh bạch tham khảo. Một biểu thức minh bạch tham chiếu sẽ luôn luôn đánh giá cho cùng một kết quả. Điều này cải thiện khả năng kết hợp bằng cách cho phép các biểu thức giống hệt nhau được thay thế cho nhau và bằng cách cho phép các biểu thức được tính toán độc lập với nhau (tức là trên các luồng khác nhau) mà không cần sử dụng khóa.

  3. Bất biến. Trạng thái của một đối tượng bất biến không thể thay đổi một khi nó được tạo. Điều này cải thiện khả năng kết hợp bởi vì bạn có thể dựa vào giá trị ổn định của đối tượng, mà không phải lo lắng nếu một số chức năng hoặc đối tượng ở đâu đó đã thay đổi trạng thái của đối tượng sau khi nó được tạo.

  4. Độ tinh khiết. Chức năng thuần túy không có tác dụng phụ. Chúng chỉ có đầu vào và đầu ra, điều này làm cho chúng dễ kết hợp hơn vì bạn có thể đặt đầu ra của một chức năng vào đầu vào của chức năng khác mà không cần lo lắng về việc liệu bên ngoài chức năng có thay đổi hay không.

Khóa không sáng tác vì chúng là một yếu tố bên ngoài mà bạn phải dựa vào khi kết hợp hai thao tác với nhau có chung một số trạng thái và vì tất cả các lý do liên quan đến sự phức tạp vốn có khi sử dụng khóa.

Cụm từ "đơn nguyên không sáng tác" không có ý nghĩa nhiều đối với tôi. Toàn bộ quan điểm của một đơn nguyên là lấy một số trạng thái như đầu vào bàn phím hoặc đầu ra màn hình, và biến nó thành một dạng toán học thuần túy hơn, trên thực tế, có thể ghép lại được nhiều hơn.


4
Tôi nghĩ stackoverflow.com/questions/7040844/ từ thực hiện tốt công việc giải thích "đơn vị không sáng tác" có nghĩa là gì, mặc dù tôi đồng ý rằng các đơn vị có thể ghép được nhiều hơn so với khóa.
Ixrec

Các gạch đầu dòng của bạn cho "tính minh bạch tham chiếu" và "độ tinh khiết" thực sự là hai yêu cầu về độ tinh khiết . Nên tránh thuật ngữ "minh bạch tham chiếu" vì nó không được xác định rõ .
BlueRaja - Daniel Pflughoeft 18/07/2015

1
Một đơn nguyên là một cấu trúc đại số với các hoạt động nhất định. Những gì bạn mô tả trong đoạn cuối cùng của bạn là IOloại ghi lại "hành động trạng thái" như nhập bàn phím. Các giá trị của IOloại thực sự sáng tác, nhưng đó là toàn bộ loại IO là một đơn nguyên. Loại này không kết hợp với các loại khác là các đơn nguyên như kiểu danh sách. Đó là, chúng ta không thể tạo ra một loại hệ thống IO . Listgiống như cả hai IOListđồng thời. Điều đó có ý nghĩa? Tôi không chắc là tôi đã giải thích nó tốt.
Tikhon Jelvis
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.