ООП против процедурного во время выполнения - PullRequest
6 голосов
/ 08 ноября 2010

У меня очень простой вопрос, я не могу найти ответ нигде в интернете.

Итак, мой вопрос в том, что в процедурном программировании код находится в разделе кода, который входит в область памяти только для чтения.Переменные находятся либо в стеке, либо в куче.

Но ООП говорит, что объект создается в памяти.Итак, означает ли это, что даже функции записываются в область памяти R / W?

И должна ли Os иметь поддержку некоторых встроенных программ ООП?Например, если OS doesent разрешено читать инструкцию за пределами раздела кода только для чтения.Благодарю.

Ответы [ 3 ]

6 голосов
/ 08 ноября 2010

Как правило, ООП и процедурное программирование - это абстракции, которые существуют только на уровне исходного кода.Как только программа скомпилирована в исполняемый машинный код, эти абстракции перестают существовать.Так что, является ли конкретный язык ООП или процедурным, не имеет никакого отношения к тем областям памяти, которые он использует, или к тому, где размещаются инструкции во время выполнения.

Сама ОС обычно не знает и не заботится, был ли конкретный исполняемый файл написан на ООП или процедурном языке.Он заботится только о том, чтобы исполняемый файл использовал двоичные коды операций, совместимые с его собственным набором команд, и чтобы исполняемый файл имел ABI (двоичный интерфейс), который он понимал.

3 голосов
/ 08 ноября 2010

Это хороший вопрос.

В то время как объект представляет собой функции и данные , которые теоретически помещаются в одно и то же место, большинство реализаций разделяют его. То, как вы это делаете, заключается в том, что код разделяется и сохраняется в сегменте RO. У объекта в области RW есть способ обратиться к этому коду в области RO. Соединение кода и данных только концептуально используется программистом-человеком и средством проверки типов, чтобы гарантировать, что вы не нарушаете правила и принципы.

Java / C # -подобный язык обычно создается так, что у каждого объекта есть тег , идентифицирующий тип объекта. Сам объект - это просто структура, содержащая все поля, расположенные в заданном порядке. Затем этот тег можно использовать для поиска, какую функцию в области RO вызывать. Функция в области RO изменяется для получения дополнительного параметра, называемого this или self , посредством которого может быть достигнуто содержимое указанного объекта. Когда метод должен ссылаться на поля, он знает заранее заданный порядок, поэтому он может сделать это правильно. Обратите внимание, что для решения наследования требуются некоторые приемы, но в этом суть идеи.

Python / Ruby-подобный язык обычно делает объект хеш-таблицей, где метод является указателем на код в области RO (при условии, что язык скомпилирован и не выполняется через интерпретатор байт-кода). Вызовы функций выполняются путем поиска содержимого хеш-таблицы и следования указателю кода. Поля также ищутся в той же хеш-таблице.

С этими основами большинство реализаций делают трюки, чтобы избежать той части, где указатель используется для поиска вызываемой функции. Они пытаются выяснить и сузить возможный вызов одной функции. Затем они могут заменить поиск прямым вызовом нужной функции, гораздо более быстрого решения.

версия tl; dr: язык семантика рассматривает поля и методы как часть объекта. Реализация разделяет их на сегменты RO и RW. Таким образом, поддержка ОС не требуется.

1 голос
/ 08 ноября 2010

ООП не говорит этого. Я понятия не имею, где вы читаете это, если вы добавите цитату, которая поможет.

Объекты являются переменными, поэтому то, что вы знаете о переменных, верно для объектов. В таких языках, как C # (фактически, .net Framework), объекты могут храниться только в куче, потому что они являются так называемыми ссылочными типами. В C ++ они могут жить где угодно.

Но ООП говорит, что объект создается в памяти. Так значит ли это, что даже функции записываются в область памяти R / W?

Из этого я пришел к выводу, что вы думаете, что функции являются объектами. Это верно далеко не во всех языках ООП. Это из функциональных языков, где функции являются первоклассными объектами. В большинстве случаев функции являются неизменяемыми и размещаются в разделах только для чтения.

Обычные ОС, такие как Windows, Linux и MacOsx, не знают об объектах. Это чисто программная концепция. .net Framework и Java VM обеспечивают уровень абстракции. Это среды выполнения, в которые встроена поддержка объектов.

...