2010-11-07 35 views
6

Tôi có câu hỏi rất đơn giản Tôi không thể tìm thấy câu trả lời ở bất cứ đâu trên internet.OOP so với thủ tục trong thời gian chạy

Vì vậy, câu hỏi của tôi là, trong lập trình thủ tục, mã nằm trong phần mã, đi vào vùng bộ nhớ chỉ đọc. Các biến nằm trên stack hoặc heap.

Nhưng OOP nói rằng đối tượng được tạo trong bộ nhớ. Vì vậy, nó có nghĩa là ngay cả chức năng được viết vào khu vực bộ nhớ R/W?

Và, Os có phải hỗ trợ một số chương trình OOP sẵn có không? Ví dụ: nếu OS OS được phép đọc hướng dẫn bên ngoài phần Read only code. Cảm ơn.

+0

Tùy thuộc vào ngôn ngữ - và hơn thế nữa, thời gian chạy cho ngôn ngữ đã nói. CLR hiện tại có thể tạo các đối tượng trên ngăn xếp (các kiểu giá trị trong hầu hết các trường hợp, trừ khi được dỡ bỏ). Cả OOP hoặc "prodcedural" đều nói bất cứ điều gì vốn có về việc sử dụng "phần dữ liệu" - nhưng bộ nhớ chỉ đọc là chỉ đọc trong mọi trường hợp. Kết thúc quá bối rối đến nỗi tôi thậm chí còn không biết phải trả lời như thế nào. Tôi nghĩ rằng vấn đề đang cố gắng giảm 40 câu hỏi là một. Tập trung vào một điều duy nhất tại một thời điểm. –

Trả lời

6

Nói chung, cả OOP và lập trình thủ tục đều là trừu tượng chỉ tồn tại ở cấp mã nguồn. Khi một chương trình được biên dịch thành mã máy thực thi, những trừu tượng này sẽ không tồn tại. Vì vậy, có hay không một ngôn ngữ cụ thể là OOP hoặc thủ tục không có mang về những khu vực của bộ nhớ nó sử dụng, hoặc nơi hướng dẫn được đặt trong khi thực hiện.

Bản thân hệ điều hành thường không biết hoặc quan tâm liệu một tập tin thực thi cụ thể có được viết bằng OOP hay ngôn ngữ thủ tục hay không. Nó chỉ quan tâm rằng tệp thực thi sử dụng các mã nhị phân nhị phân tương thích với tập lệnh gốc của nó và thực thi có một ABI (giao diện nhị phân) mà nó hiểu được.

+0

OK, nhưng, ví dụ MS Windows cho phép bạn chuyển đến chức năng sẽ được lưu trữ ví dụ trong khu vực .data? Sau khi tất cả các hệ thống không có đầu mối thì đó là một số dữ liệu hoặc instructios. Và, điều gì cũng thú vị, tại sao ngay cả mã chương trình cũng đi vào phần chỉ đọc? –

+0

@ B.Gen.Jack.O.Nó, điều đó phụ thuộc vào kiến ​​trúc. Khả năng thực thi mã được lưu trữ ở đâu đó khác với phân đoạn mã đã bị hacker khai thác trong lịch sử. Ví dụ, hầu hết các cuộc tấn công tràn bộ đệm stack-về cơ bản là một nỗ lực để thực thi mã shell được đặt trong một bộ đệm ngăn xếp. Vì lý do này, một số kiến ​​trúc phần cứng sẽ kích hoạt một lỗi nếu con trỏ hướng dẫn kết thúc tại một địa chỉ nằm ngoài phân đoạn mã của một tiến trình. –

+0

lý do chỉ đọc các phần mã là để ngăn chặn việc tiêm mã độc. hệ thống không có khái niệm gì về dữ liệu hoặc lệnh thực thi hơn là bạn biết rằng bạn thích cheeseburgers hay pizza, chỉ những gì các op sẽ thực hiện tiếp theo. Đây là lý do tại sao trình biên dịch có thể CREATE thực thi, ví dụ. Tôi nghĩ rằng bạn nên đọc lên trên kiến ​​trúc von Neumann, ví dụ. – jcolebrand

1

OOP không nói điều này. Tôi không biết bạn đọc nó ở đâu, nếu bạn thêm một câu trích dẫn có thể giúp ích.

Đối tượng biến, vì vậy, những gì bạn biết về các biến là chính xác cho các đối tượng. Trong các ngôn ngữ như các đối tượng C# (.net framework thực sự) chỉ có thể được lưu trữ trong heap, bởi vì chúng được gọi là các kiểu tham chiếu. Trong C++ họ có thể sống ở bất cứ đâu.

Nhưng OOP cho biết đối tượng đó được tạo trong bộ nhớ. Vì vậy, nó có nghĩa là ngay cả chức năng được viết vào khu vực bộ nhớ R/W?

Từ đây tôi kết luận rằng bạn cho rằng các hàm là đối tượng. Điều đó đúng với mọi ngôn ngữ OOP. Nó là từ các ngôn ngữ chức năng mà các hàm là các đối tượng lớp đầu tiên. Chức năng là trong phần lớn các trường hợp không thay đổi và được đặt trong các phần chỉ đọc.

Các hệ điều hành phổ biến như Windows, Linux và MacOsx không biết các đối tượng. Đây hoàn toàn là khái niệm chương trình. .net framework và java vm cung cấp lớp trừu tượng. Chúng là các môi trường thực thi đã xây dựng trong hỗ trợ đối tượng.

3

Đây là một câu hỏi hay.

Trong khi đó như đối tượng chiếm chức năngdữ liệu như đang được đặt ở vị trí tương tự về mặt lý thuyết, hầu hết triển khai chia nó. Cách bạn làm điều đó, là mã được tách ra và được lưu trữ trong phân khúc RO. Một đối tượng trong khu vực RW sau đó có một cách để tham khảo lại mã đó trong khu vực RO. Việc ghép nối mã và dữ liệu chỉ được sử dụng khái niệm bởi lập trình viên con người và trình kiểm tra loại để đảm bảo rằng bạn không vi phạm các quy tắc và nguyên tắc.

Ngôn ngữ Java/C# -like thường được thực hiện sao cho mỗi đối tượng có một thẻ xác định loại đối tượng. Bản thân đối tượng chỉ đơn giản là một cấu trúc chứa tất cả các trường được trình bày theo thứ tự đã được định trước. Thẻ này sau đó có thể được sử dụng để tìm kiếm chức năng nào trong vùng RO để gọi.Chức năng trong khu vực RO được thay đổi để lấy thêm thông số, được gọi là hoặc tự thông qua đó nội dung của đối tượng đó có thể đạt được. Khi phương thức cần tham chiếu đến các trường, nó biết thứ tự được chỉ định trước, vì vậy nó có thể thực hiện điều đó. Lưu ý rằng có một số thủ thuật cần thiết để giải quyết thừa kế, nhưng đây là điểm mấu chốt của ý tưởng.

Ngôn ngữ giống Python/Ruby thường sẽ tạo đối tượng là bảng băm trong đó phương thức là con trỏ tới mã trong khu vực RO (miễn là ngôn ngữ được biên dịch và không chạy thông qua trình thông dịch bytecode) . Các cuộc gọi hàm được thực hiện bằng cách tra cứu nội dung bảng băm và theo con trỏ mã. Các trường cũng được tra cứu trong cùng một bảng băm.

Với những kiến ​​thức cơ bản này, hầu hết các triển khai thực hiện các thủ thuật để tránh phần mà con trỏ được theo sau để tìm hàm cần gọi. Họ cố gắng tìm ra và thu hẹp cuộc gọi có thể thành một chức năng duy nhất. Sau đó, họ có thể thay thế tra cứu bằng một cuộc gọi trực tiếp đến đúng chức năng, một giải pháp nhanh hơn nhiều.

phiên bản tl; dr: Ngôn ngữ ngữ nghĩa xem các trường và phương thức như một phần của đối tượng. Việc triển khai chia chúng thành các phân đoạn RO và RW. Vì vậy không cần hỗ trợ hệ điều hành.

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