Как код хранится и выполняется на абстрактной машине C++?
В первой книге о C++, которую я прочитал, я немного рассказал о том, как код на самом деле выполняется на машине (в нем упоминается счетчик программ, стек вызовов, адреса возврата и т. Д.). Мне было очень интересно узнать, как это работает, хотя я знаю, что для написания хорошего кода не обязательно знать, как работает компьютер.
Читая по тем же темам на этом сайте вопросов и ответов, я обнаружил, что это ни в коем случае не должно быть таким, как я узнал раньше, потому что то, о чем я читал, было только определенной реализацией C++, в зависимости от конкретного компьютера. архитектура и некий компилятор. Код C++ также может работать на чем-то совершенно другом, если у вас есть совместимый компилятор, который ведет себя "правильным" образом. Тогда какой правильный путь определяется стандартом и поведением "абстрактной машины" (надеюсь, что до сих пор я понял это правильно).
Конечно, мне все еще хотелось бы знать, являются ли такие понятия, как сегмент кода памяти или счетчик программ, все еще "как-то" в стандарте, и если да, то в какой степени они изображены? Как в абстрактной машине описывается концепция последовательного выполнения фрагментов кода?
Поскольку в комментарии меня спросили, хочу ли я, чтобы стандарт повторился мне: я не смог достаточно хорошо понять стандарт, чтобы точно определить, что он говорит об абстрактной машине / ИЛИ, какие утверждения стандарта могут можно интерпретировать как утверждения об абстрактной концепции "счетчика программ", "хранилища кода" ... и т. д. Так что да, из-за невозможности, я прошу сообщество интерпретировать то, что написано в стандарте. Ожидаемый результат этой интерпретации - наиболее подробная концепция внутренней структуры абстрактной машины, которая все еще соответствует критерию "абстрактности".
3 ответа
Короткий ответ: нет.
На самом деле мы не выполняем код на абстрактной машине спецификации C++ (или на любой другой абстрактной машине - другие языки также определяют их). Мы выполняем код на реальных машинах, реализованных на транзисторах, или в программном обеспечении, работающем на транзисторах. Абстрактная машина в спецификации языка используется для определения границ того, что будет делать код на реальной машине - он должен работать "так, как если бы" он был запущен на абстрактной машине, по крайней мере, насколько это возможно в среде речь идет об определении абстрактной машины.
Соответствующая цитата из стандарта:
Соответствующая реализация, выполняющая правильно сформированную программу, должна производить такое же наблюдаемое поведение, как одно из возможных выполнений соответствующего экземпляра абстрактной машины с той же программой и теми же входными данными.
Однако нет реального твердого определения того, что такое "наблюдаемое поведение".
Так зачем вообще определять эти абстрактные машины? Ну, в основном потому, что существует много разных реальных машин, и вы хотите сказать, что ваш код будет работать одинаково на любой из них. Настоящие машины тоже очень сложны, и о них трудно рассуждать. Итак, спецификация языка определяет абстрактную машину, которая является упрощением тех типов реальных машин, на которых она должна работать. В частности, что касается деталей того, как код хранится и выполняется, эти детали в основном "абстрагируются" в абстрактной машине - она не указывает, поэтому реализация может использовать любые механизмы, которые предоставляет реальная цель, и при этом быть совместимой с спец.
Стандарт не определяет, как абстрактная машина работает внутри, в этом весь смысл. Эта концепция используется для абстрагирования от внутренней работы физических машин.
кодовый сегмент памяти или счетчик программ по-прежнему "как-то" изображены в стандарте
Нет. Стандарт просто говорит (грубо говоря), что операторы выполняются последовательно, объясняет порядок оценки и т. Д. В нем нет понятия инструкций процессора или счетчика программ. Указатели функций описываются как полностью непрозрачные, указывающие на "функции", а не на отдельные инструкции. Это даже не гарантирует, что функции хранятся в той же памяти, что и данные.
Стандарт также не вводит понятия стека и кучи. Он только описывает время жизни объектов, созданных разными способами. Указатели тщательно описаны, чтобы не ограничивать их скалярами. Нет понятия регистров, кеша,...
Абстрактная машина: Абстрактная машина - это не что иное, как комбинация «процессора, оперативной памяти и регистров».