2010-11-07 4 views
6

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

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

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

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

+0

Это зависит от языка, а тем более, от времени выполнения указанного языка. Текущая среда CLR может создавать объекты в стеке (типы значений в большинстве случаев, если они не подняты). Ни OOP, ни «prodcedural» не говорят ничего, что связано с использованием «секции данных», но только в режиме «чтение» только в режиме «только для чтения». Окончание настолько запутано, что я даже не уверен, как ответить. Я думаю, проблема состоит в том, чтобы решить 40 вопросов как один. Сосредоточьтесь на одной вещи за раз. – 2010-11-07 22:51:33

ответ

6

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

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

+0

ОК, но, например, MS Windows позволяет вам перейти к функции, которая будет храниться, например, в области .data? В конце концов система не имеет понятия, это некоторые данные или инструкции. И, что интересно, почему даже программный код переходит в раздел только для чтения? –

+0

@ B.Gen.Jack.O.Neill, это зависит от архитектуры. Возможность выполнения кода, хранящегося где-то, кроме сегмента кода, исторически использовалась хакерами. Например, большинство попыток переполнения стека-буфера в основном представляют собой попытку выполнить код оболочки, помещенный в буфер стека. По этой причине некоторые аппаратные архитектуры вызовут ошибку, если указатель инструкции заканчивается по адресу вне сегмента кода процесса. –

+0

причина только для чтения разделов кода заключается в предотвращении вредоносной инъекции кода. система не имеет больше понятия о том, что такое данные или исполняемая команда, чем она знает, что вам нравятся чизбургеры или пицца, только то, что операторы должны выполнить дальше. Вот почему компиляторы могут, например, создавать CREATE исполняемые файлы. Я думаю, вы должны, например, прочитать об архитектуре фон Неймана. – jcolebrand

1

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

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

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

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

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

3

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

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

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

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

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

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

Смежные вопросы