Những loại đối tượng lý thuyết tương ứng với một khái niệm C ++?


8

Tôi đang thiếu một nền tảng về khoa học máy tính lý thuyết nhưng tôi muốn hiểu về loại đối tượng lý thuyết mà các khái niệm C ++ tương ứng với. Về cơ bản, các khái niệm C ++ cho phép xác định một tập hợp các loại thỏa mãn một danh sách các ràng buộc. Vì vậy, từ quan điểm lý thuyết, các khái niệm C ++ tương ứng, hoặc gần tương ứng (và trong trường hợp đó là sự khác biệt), là gì?


1
Các chương trình C ++ giống như các máy Turing. Chức năng giống như nhà tiên tri, họ chỉ mất nhiều thời gian hơn. C ++, giống như nhiều ngôn ngữ lập trình, giống như phép tính lambda. Việc tạo các hàm thời gian chạy rõ ràng là mới đối với C ++ 11.
Philip White

6
@PhilipWhite Tôi nghĩ bạn bỏ lỡ điểm của câu hỏi. OP không yêu cầu một lời giải thích lý thuyết về các khái niệm khác nhau của C ++ mà là một lời giải thích lý thuyết về việc xây dựng C ++ được gọi là khái niệm. Tôi không đủ kiến ​​thức về PL để trả lời câu hỏi nhưng từ những gì tôi hiểu, các khái niệm là một loại cơ chế để hạn chế tính đa hình. Tôi không biết nếu các cơ chế như vậy đã được nghiên cứu chính thức nhưng có vẻ như một cơ chế hợp lý để thêm vào một hệ thống loại.
holf

Lỗi của tôi ... Tôi đã theo liên kết nhưng không đọc nó quá chặt chẽ. (Bản thân tôi chưa bao giờ thấy cần phải học / sử dụng các khái niệm trong C ++.)
Philip White

Câu trả lời:


11

Từ góc độ lý thuyết ngôn ngữ lập trình, trái ngược với quan điểm tính toán, các câu trả lời và nhận xét khác đã đưa ra, các mẫu C ++ kết hợp với các khái niệm tương ứng với tính đa hình bị ràng buộc hoặc tính tổng quát bị ràng buộc . Các khái niệm tương ứng với các ràng buộc hoặc giới hạn được đặt trên một loại.

Mẫu là hàm cấp độ loại, được tham số hóa theo loại bị ràng buộc bởi một khái niệm để thực hiện một giao diện cụ thể. Khi mẫu được áp dụng cho một loại thỏa mãn khái niệm đó, một loại kết quả mới.

Các mẫu + khái niệm tương tự như khái quát trong Java, Scala hoặc Eiffel. Chúng khác với các mẫu trong C ++ trước đó vì chúng cho phép các ràng buộc về các tham số loại được chỉ định và kiểm tra, trong khi các mẫu C ++ không cho phép điều đó. Lợi ích là kiểm tra tĩnh tốt hơn rằng chương trình sau khi áp dụng mẫu sẽ được gõ tốt.

Một tài liệu tham khảo tốt là Pierce, Benjamin C. (2002). Chủng loại và Ngôn ngữ lập trình . MIT Press, Chương 26: Định lượng giới hạn.


3
Các mẫu C ++ có các hạn chế kiểu được tích hợp sẵn trong chúng, tạo ra một dạng gõ cấu trúc, bởi vì một kiểu chỉ phải có một số tập hợp các hoạt động được xác định (ẩn trong định nghĩa mẫu) để đáp ứng trình kiểm tra kiểu. Các khái niệm dường như làm nhiều việc tương tự nhưng cho phép các tên được liên kết với các tập hợp hành vi đó (một dạng gõ danh nghĩa) và do đó cung cấp một cách để tạo ra các thông báo lỗi sớm hơn và tốt hơn. Tôi cũng không nghĩ các khái niệm là loại để gõ chức năng. Mô tả được liên kết mô tả chúng như các vị từ kiểu - hoặc kiểu cho các hàm boolean.
oconnor0

@ oconnor0: Bạn nói đúng. Các khái niệm + mẫu cho đa hình giới hạn. Tôi sẽ cập nhật câu trả lời của tôi.
Dave Clarke

Tôi không chắc chắn tôi đồng ý với điều này. Ngay cả các khái niệm sans, các mẫu C ++ và đa hình tham số dường như chỉ liên quan rất mơ hồ với tôi. Một thuật ngữ polytyped là loại được kiểm tra để đảm bảo rằng nó sẽ hoạt động trên tất cả các trường hợp có thể. Java generic có điều đó (mặc dù Java phá vỡ tham số). Thay vào đó, các mẫu C ++ sử dụng "SFINAE", trong đó các loại không được kiểm tra cho đến thời gian khởi tạo, điều này làm cho chúng khác xa với các loại phổ quát đối với tôi.
chi

-3

Khái niệm C ++ ánh xạ tới các ngôn ngữ đệ quy. Vì hệ thống loại C ++ đã hoàn tất Turing, nên mọi thuộc tính của các loại có thể được thẩm vấn trong quá trình khởi tạo mẫu (kích thước, tham số, v.v.) có thể được chạy qua một chương trình tùy ý được mô phỏng trong hệ thống loại.


1
Tôi đã đọc thêm một chút về các khái niệm. (Rõ ràng các khái niệm là mới trong C ++.) Tất nhiên bất kỳ hàm C ++ nào cũng sẽ chấp nhận một ngôn ngữ đệ quy đệ quy; Điều đó thật tầm thường. Bạn có đang khẳng định rằng việc ánh xạ từ các khái niệm sang các ngôn ngữ lại là một sự lựa chọn? Điều này rõ ràng là sai; nếu bạn nhìn vào phần khái niệm, nó nói rằng các khái niệm hàm "chỉ bao gồm một câu lệnh return, đối số của nó phải là một biểu thức ràng buộc", trong khi nói đến các khái niệm biến, "bộ khởi tạo phải là một biểu thức ràng buộc." Vì vậy, những khái niệm này không có vẻ hoàn hảo đối với tôi.
Philip White

1
Biểu thức không đổi là Turing hoàn chỉnh, vì vậy, có: đó là một sự lựa chọn. Chính thức hóa đòi hỏi phải rõ ràng về mã hóa các loại; một tuyên bố không phải là tập hợp các khái niệm đại diện cho các tập hợp con của các loại void, C <void>, C <C <void >>, ... đại diện cho các số nguyên trong unary chính xác là các ngôn ngữ RE.
Geoffrey Irving

1
Tất nhiên, các trình biên dịch thực tế có các giới hạn tính toán khi đánh giá các biểu thức hằng, nhưng nếu những cân nhắc đó được tính đến thì câu trả lời là có một tập hợp các khái niệm hữu hạn. Có lẽ đó không phải là câu trả lời được yêu cầu.
Geoffrey Irving

1
Bạn có nghĩa là biểu thức ràng buộc. Theo tài nguyên, có 9 loại biểu thức ràng buộc và mỗi khái niệm chỉ có thể sử dụng một biểu thức ràng buộc. Ngoài ra, đại diện cho các số nguyên trong unary không phải là một mệnh đề có ý nghĩa giữa các ngôn ngữ re và các khái niệm C ++. Đặc biệt, nó không bảo tồn tương đương ngữ nghĩa.
Philip White

1
Không, tôi có nghĩa là biểu thức liên tục. Theo liên kết trong câu hỏi, đây là mục 4 trong danh sách 9 loại ràng buộc. Tuy nhiên, hầu hết 9 cái còn lại cũng hoàn thành Turing: ví dụ: Turing hoàn tất để quyết định xem một loại có thể chuyển đổi sang loại khác trong C ++ hay không.
Geoffrey Irving
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.