2010-11-07 77 views
6

我有一個非常簡單的問題,我無法在互聯網上的任何地方找到答案。OOP vs運行時的程序

所以,我的問題是,在程序編程中,代碼位於代碼段,它進入只讀存儲區。變量在堆棧或堆上。

但OOP表示該對象是在內存中創建的。那麼,這是否意味着即使功能被寫入R/W存儲區?

而且,Os是否需要一些內置的OOP程序支持?例如,如果OS允許在只讀代碼段之外讀取指令。謝謝。

+0

它依賴於語言 - 更重要的是,該語言的運行時間。當前的CLR可能會在堆棧上創建對象(大多數情況下,值類型除非被解除)。 OOP或「prodcedural」都不會說使用「數據段」的固有內容 - 但只讀內存在任何情況下都是隻讀的。結局很混亂我甚至不知道如何迴應。我認爲這個問題試圖將40個問題歸結爲一個問題。同時關注一件事。 – 2010-11-07 22:51:33

回答

6

通常,OOP和程序編程都是隻存在於源代碼級別的抽象。一旦程序被編譯成可執行的機器碼,這些抽象就不復存在了。因此,不論某種特定語言是面向對象還是程序化的,對於它使用的內存區域或執行過程中放置​​的指令都沒有影響。

操作系統本身通常不知道或在意某個特定的可執行文件是否以OOP或過程語言編寫。它只關心可執行文件使用與其本機指令集兼容的二進制操作碼,並且可執行文件具有它理解的ABI(二進制接口)。

+0

好的,但是,例如MS Windows允許您跳轉到將存儲在例如.data區域中的函數嗎?畢竟系統沒有線索,它是一些數據或instructios。而且,還有什麼有趣的,甚至爲什麼程序代碼會進入只讀部分? – 2010-11-07 23:12:36

+0

@ B.Gen.Jack.O.Neill,這取決於架構。黑客一直在利用執行存儲在代碼段以外的代碼的能力。例如,大多數堆棧緩衝區溢出攻擊基本上是嘗試執行放置在堆棧緩衝區中的shell代碼。出於這個原因,如果指令指針結束於進程代碼段之外的地址,某些硬件體系結構將觸發故障。 – 2010-11-07 23:18:45

+0

只讀部分代碼的原因是爲了防止惡意注入代碼。系統沒有更多的數據或可執行命令的概念,而是知道你喜歡芝士漢堡或披薩,而只是接下來要執行的操作。這就是爲什麼編譯器可以創建可執行文件的原因。例如,我認爲你應該閱讀馮·諾伊曼體系結構。 – jcolebrand 2010-11-07 23:29:38

1

OOP不這樣說。如果你添加一個有用的報價,我不知道你在哪裏閱讀。

對象變量,所以你知道變量對於對象是正確的。在像C#這樣的語言(實際上.net框架)中,對象只能存儲在堆中,因爲它們被稱爲引用類型。在C++中,他們可以隨處居住。

但是OOP說對象是在內存中創建的。那麼,這是否意味着即使功能被寫入R/W存儲區?

從這我得出結論,你認爲功能是對象。遠非所有的OOP語言都是如此。它來自函數式語言,其中函數是第一類對象。函數在大多數情況下是不可變的,並且被放置在只讀段中。

像Windows,Linux和MacOsx這樣的常見操作系統不知道對象。這純粹是程序概念。 .net框架和java vm提供了抽象層。它們是構建對象支持的執行環境。

3

這是一個很好的問題。

而作爲對象構成功能數據爲放置在同一地點理論上,最實現拆分它。你這樣做的方式是將代碼拆分並存儲到RO部分。 RW區域中的對象然後可以返回RO區域中的代碼。代碼和數據的耦合只能由程序員和類型檢查器在概念上使用,以確保您不違反規則和原則。

通常會製作類似於Java/C#的語言,以便每個對象都有一個標記標識對象的類型。對象本身就是一個簡單的結構,其中包含按預設順序排列的所有字段。然後可以使用此標記查找RO區域中的哪個功能進行調用。RO區域中的功能被改變爲採用額外的參數,稱爲這個self通過它可以達到所述對象的內容。當方法需要引用字段時,它知道預先指定的順序,所以它可以做到這一點。請注意,解決繼承問題需要一些技巧,但這是這個想法的關鍵。

Python /類似Ruby的語言通常會使對象成爲哈希表,其中方法是指向RO區域中的代碼的指針(前提是該語言已編譯且不通過字節碼解釋器運行) 。函數調用是通過查找散列表內容和跟隨代碼指針來完成的。字段也在相同的哈希表中查找。

隨着這些基礎知識的減少,大多數實現技巧會避免指針跟隨的部分找到要調用的函數。他們試圖找出並縮小對單一功能的可能調用。然後他們可以直接調用正確的函數來取代查找,這是一個更快的解決方案。

tl; dr版本:語言語義將字段和方法視爲對象的一部分。 實現將它們分成RO和RW段。因此不需要操作系統支持。