2013-05-19 20 views
5

Mã oop chính xác như thế nào tôi viết bằng C++ hoặc C# ví dụ dịch sang mã máy hoặc trong trường hợp C# thành bytecode? Ý tôi là, làm thế nào để các đối tượng dịch?Mã hướng đối tượng chuyển thành mã máy như thế nào?

Trong lập trình thủ tục, nó khá rõ ràng nó trông như thế nào sau khi biên dịch bởi vì có một cách thực sự hỗ trợ cho các chức năng trong ngôn ngữ máy. Nhưng trong trường hợp lập trình oop thì không có đối tượng nào trong ngôn ngữ máy.

Lý thuyết của tôi là nó biên dịch đối tượng thành một kiểu C như struct chỉ chứa dữ liệu (không có hàm thành viên) và khi hàm memeber được gọi, nếu chấp nhận tham số addional là cấu trúc dữ liệu của đối tượng chinh no. Tôi có đúng không?

Trả lời

1

Đó là thực hiện phụ thuộc. Nhưng trong thực tế, điều phổ biến là sử dụng một bảng ảo ("vtable"). Có một bảng ảo cho mỗi lớp, trong đó có một danh sách các con trỏ để thực hiện chức năng mỗi thành viên. Mỗi đối tượng được một con trỏ đến vtable thích hợp.

Tùy thuộc vào ngôn ngữ và cờ trình biên dịch, con trỏ thích hợp trong vtable có thể được tra cứu bằng chữ ký hàm (tên và đối số) hoặc đơn giản bằng chỉ mục.

Khi hàm thành viên được gọi thông qua con trỏ vtable của nó, chắc chắn nó cần một con trỏ đến dữ liệu đối tượng. Nhưng điều đó có thể được chuyển vào ngăn xếp hoặc trong sổ đăng ký.

2

Không cần phải đoán, chỉ cần nhìn vào "lắp ráp" được tạo ra (MSIL, trên thực tế) mã:

How can I view MSIL/CIL generated by C# compiler? Why is it called assembly?

+0

Và còn trường hợp C++ thì sao? Cả hai người trong số họ nên nhìn vào cùng một cấu trúc hoặc bộ nhớ bố trí cuối cùng không? Có thể có nhiều cách để làm điều này? Bởi vì ví dụ bạn có thể có cấu trúc này với các chức năng là tốt nhưng tôi không chắc vì nó tốn nhiều bộ nhớ hơn nếu các đối tượng trùng lặp các chức năng giống nhau trên một lần nữa. – UnTraDe

+0

Viết chương trình "thế giới ảo". Biên dịch nó với gcc -o hw hw.c. Vấn đề objdump -d hw. Đó là cùng một câu chuyện, những thay đổi chỉ là tên công cụ và hướng dẫn cụ thể. IOW cpu mục tiêu là khác nhau: nó ảo trong .net, thực trong C++. –

0

Tất cả các định hướng đối tượng trong OOP chỉ là cấu trúc lập trình cấp cao hơn để cho phép nhà phát triển viết mã mô-đun và tổ chức trong một mô hình chứa nguyên mẫu và các thể hiện của chúng. Mã oop không có mã tương đương trong mã máy.

Nó giống như cách chúng ta có giao diện trong bản đánh số mà sau đó dịch sang javascript vốn không có khái niệm về giao diện. (đây có thể không phải là một ví dụ rất tốt)