Это хороший вопрос.
В то время как объект представляет собой функции и данные , которые теоретически помещаются в одно и то же место, большинство реализаций разделяют его. То, как вы это делаете, заключается в том, что код разделяется и сохраняется в сегменте RO. У объекта в области RW есть способ обратиться к этому коду в области RO. Соединение кода и данных только концептуально используется программистом-человеком и средством проверки типов, чтобы гарантировать, что вы не нарушаете правила и принципы.
Java / C # -подобный язык обычно создается так, что у каждого объекта есть тег , идентифицирующий тип объекта. Сам объект - это просто структура, содержащая все поля, расположенные в заданном порядке. Затем этот тег можно использовать для поиска, какую функцию в области RO вызывать. Функция в области RO изменяется для получения дополнительного параметра, называемого this или self , посредством которого может быть достигнуто содержимое указанного объекта. Когда метод должен ссылаться на поля, он знает заранее заданный порядок, поэтому он может сделать это правильно. Обратите внимание, что для решения наследования требуются некоторые приемы, но в этом суть идеи.
Python / Ruby-подобный язык обычно делает объект хеш-таблицей, где метод является указателем на код в области RO (при условии, что язык скомпилирован и не выполняется через интерпретатор байт-кода). Вызовы функций выполняются путем поиска содержимого хеш-таблицы и следования указателю кода. Поля также ищутся в той же хеш-таблице.
С этими основами большинство реализаций делают трюки, чтобы избежать той части, где указатель используется для поиска вызываемой функции. Они пытаются выяснить и сузить возможный вызов одной функции. Затем они могут заменить поиск прямым вызовом нужной функции, гораздо более быстрого решения.
версия tl; dr: язык семантика рассматривает поля и методы как часть объекта. Реализация разделяет их на сегменты RO и RW. Таким образом, поддержка ОС не требуется.