2010-07-06 33 views
8

Tôi hiện đang chuẩn bị cho kỳ thi. Một trong những câu hỏi tôi tìm thấy trong một kỳ thi cũ là:
"Tại sao hầu hết các ngôn ngữ hướng đối tượng không hỗ trợ các coroutines?" (Gợi ý: Không phải vì chúng hỗ trợ chủ đề) "

Vấn đề là, tôi không thể tìm một câu trả lời hay. Tất nhiên bạn không cần coroutines nếu bạn có định hướng đối tượng, nhưng nó sẽ vẫn rất hữu ích để có chúng trong một số trường hợp.Tại sao hầu hết các ngôn ngữ hướng đối tượng không hỗ trợ coroutines?

+1

* Tất nhiên bạn không cần coroutines nếu bạn có hướng đối tượng. * Sai. Đối tượng chỉ cần gói dữ liệu với chức năng. – mcandre

Trả lời

6

Tôi nghĩ đó là vì lý do ý thức hệ. Trong thực thể chính OOP đại diện cho trạng thái là đối tượng. Không có gì khác phải có trạng thái . Trong thế giới của coroutines họ trở thành một tàu sân bay của nhà nước và hơi mâu thuẫn với OOP. Trong C# có một phiên bản nhỏ của coroutine: statement yield, nhưng nó hoàn toàn là tính năng của C#, không phải CLR và .net, trong khi biên dịch tất cả các biến trạng thái trở thành các trường của lớp ẩn. Đó là bởi vì không có gì ngoại trừ đối tượng có thể có một trạng thái trong .net.

+2

... trừ khi bản thân coroutine là một đối tượng. – Felixyz

2

Đây chỉ là một phỏng đoán:

Một coroutine sử dụng trạng thái của chương trình con để thay đổi giá trị trả về của nó, trong khi một phương thức trên một đối tượng có thể sử dụng tượng trạng thái để thay đổi giá trị trả về của nó.

0

Điều này nghe với tôi giống như câu hỏi lousy cho kỳ thi - nó rất chủ quan và không có câu trả lời đúng hoặc thậm chí là câu trả lời hay nhất. Để làm cho một câu chuyện dài ngắn, tôi không nghĩ rằng bất cứ ai có thể làm nhiều hơn so với dự đoán này.

Đoán của riêng tôi là hầu hết các ngôn ngữ đã bao gồm coroutines (ví dụ, đồng thời Pascal, đồng thời C (thực sự hỗ trợ C++) và Ada Task cũng tương tự như vậy, chưa bao giờ trở nên đặc biệt phổ biến. Từ quan điểm kỹ thuật, các thiết kế này đã là cực kỳ tốt đẹp, nhưng chúng chưa bao giờ trở nên đặc biệt phổ biến. Ở một mức độ, đó có thể là vấn đề thời gian nhiều như bất cứ điều gì khác. Bởi thời gian máy tính đa xử lý trở nên có sẵn để làm cho tính toán song song một mục tiêu thực sự cho hầu hết các lập trình viên, những ngôn ngữ này hầu như đã bị lãng quên. Theo quan điểm kỹ thuật, tôi không chắc ai có nhiều tính năng mới để thêm vào - hầu hết những gì cần là một "sân bán hàng" tốt để tạo ra âm thanh đồng thời C hoặc Ada 95 (v.v.) giống như một cái gì đó mới mẻ và sáng tạo đủ để khiến mọi người ít nhất là thử chúng. Tất nhiên, việc triển khai từ nhiều thập kỷ trước thường đơn luồng dưới mui xe - điều đó sẽ cần cập nhật. Tuy nhiên, đối với một ví dụ, tôi chắc chắn rằng các triển khai Ada 95 đã được cập nhật để chúng có thể sử dụng nhiều lõi hoàn toàn độc đáo. Điều đó dường như đã không làm được nhiều sự nổi tiếng của nó mặc dù (ví dụ, ở đây trên SO, thẻ ada hiện chỉ được sử dụng 90 lần).

4

Mục đích của câu hỏi như thế này trong bài kiểm tra không phải là để xem bạn có biết câu trả lời hay không. (Không cần phải trả lời đúng.) Thay vào đó, nó là để xác định xem học sinh đã phát triển khả năng suy nghĩ và lý do trong lĩnh vực chủ đề.

Nếu tôi trả lời câu hỏi này, tôi sẽ quan sát: a) Mô hình diễn viên là sự kết hợp hướng đối tượng với coroutines, theo nghĩa là các tác nhân (tác nhân) có thể nhận và xử lý đồng thời. b) Các coroutine lý do thực sự không thường xuyên trong các ngôn ngữ OOP cũng giống như lý do coroutines thường không có trong bất kỳ ngôn ngữ chính thống nào, tức là. coroutines rất khó thực hiện trong sự hiện diện của một ngăn xếp thông thường.

Phản hồi của tôi gần như chắc chắn sẽ đến muộn để giúp áp phích gốc. Tôi nghĩ rằng tôi sẽ trả lời anyway như coroutines và các hình thức khác của concurrency hiện đang là một chủ đề phổ biến.

0

Ý tưởng về một đối tượng là cách ly trạng thái. Tất cả mọi thứ bạn cần phải có mặt trong đối tượng đó. Một coroutine sẽ 'phá vỡ' ý tưởng này bởi vì bây giờ một đối tượng không còn là một trạng thái cô lập nữa, mà là nó phụ thuộc vào một đối tượng khác.

0

Vâng, trên thực tế cả Simula 67 và Smalltalk 80 - các ngôn ngữ OO dứt khoát và cuối cùng - đã hỗ trợ hoàn hảo cho coroutines. Vì vậy, tôi nghi ngờ ý tưởng về coroutines về cơ bản là không tương thích với OOP. Đó là nhiều khả năng là một sự trùng hợp ngẫu nhiên, đó là loại câu hỏi như "tại sao điều X mát mẻ không được hỗ trợ trong các ngôn ngữ chính/hệ điều hành/etc".

Các vấn đề liên quan