Таким образом программа имеет возможность влиять на состояние системы в целом, и в то же время обеспечивается контроль над этим влиянием со стороны операционной системы.
red_warg, а почему, кстати, не буквально?
red_warg
Потому что, мир работает по-другому.
nick
А в чем принципиальная разница? Мне сравнение с компьютерной программой кажется вполне логичным.
lfxor
Некоторые особенности исполнения программ.
Рассмотрим программу, вычисляющую S из входных переменных a, b, e и f:
01 c = a+b
02 d = a-b
03 R = c*d
04 a = R*e
05 b = R*f
06 S = R+a+b
Программа простая. Ее особенность в том, что команды 01 и 02 могут исполняться в любом порядке или одновременно. На современных процессорах это так и произойдет - порядок исполнения будет определяться готовностью вычислительных устройств, а при надлежащем их количестве команды будут выполнены одновременно. Это же касается и команд 04 и 05. А команды 03 и 06 - "узловые" в том смысле, что исполняться одновременно с ними не может ни одна другая.
Мы привыкли думать о программах как о последовательных, но на деле нарушается либо порядок исполнения команд, либо некоторые исполняются параллельно. Это осуществляется таким образом, чтобы результат получался одним и тем же, т.е. с точки зрения программы система ведет себя так, будто команды исполняются последовательно.
Более общий вид программы следующий: есть набор т.н. А-блоков, которые представляют собой операцию (ассемблерную команду). С каждым А-блоком могут быть связаны входные переменные и выходные. Операция вычисляет выходные из входных. А-блоки могут срабатывать не в произвольном порядке, а только тогда, когда готовы все входные переменные. Срабатывание А-блоков может происходить одновременно.
Множество готовых к исполнению А-блоков по мере исполнения то увеличивается, то уменьшается. В "узловой" точке, например, будет только один А-блок.
Теперь вернемся к обычному представлению.
Вернемся во времена DOS'а. Программа могла состоять из ассемблерных команд и вызовов к операционной системе. Если программа получала управление, то могла сделать все что угодно. Операционная система служила для обеспечения различных сервисов - работа с файлами, строками и т.п. Все это можно сделать и напрямую с помощью ассемблерных команд.
Теперь все чуть чуть иначе - есть защищенный режим работы процессора и программа, получив управление, работает уже не напрямую, а "в песочнице" - может обращаться только с определенными адресами в памяти, не может напрямую обращаться к диску и т.п. - теперь она может только отправлять запросы операционке, которая делает это за него, а заодно и проверяет, дозволено ли ему это делать. В "прямом" владении остаются только безобидные процессорные команды вроде арифметических операций.
Вторая степень защиты - в ООП: методы не могут быть вызваны, если они protected или private. То же касается и атрибутов объекта. Некоторые системные функции окружения сами вызывают определенные методы объектов, например по таймеру. Можно сказать, что вызовом методов управляет система, и управление среди методов может передаваться в рамках дозволенных вызовов.
Интересный момент - эти рамки определяет компилятор! То есть, в конечном счете код преобразовывается в обычные ассемблерные команды и вызовы ОС. Если в этот момент код подменить, то можно безо всяких ограничений вызывать защищенные методы и использовать чужие закрытые переменные.
nick
lfxor, я кстати читал, что некоторые процессоры пытаются в определенных точках сделать как бы "задел на будущее", предугадать выполнение кода, выполяя параллельно несколько наиболее вероятных ветвей, и потом выбирая из них ту, которая оказалась верной.
И кстати, ты затронул интересную тему - времени в компьютере. Получается что у нас есть одновременно операции, которые не зависят от компьютерного времени - выполнение не связанных со временем инструкций в процессоре, например, и, в то же время, код, который специально спрограммирован так чтобы слушать системные прерывания таймера от железа, и таким образом быть связанным со временем (если я правильно понимаю реализацию системного таймера).
Ligth
Если мы имеем огромный массив программ, подпрограмм, подподпрограмм и т.д., взаимосвязанных между собой точками вызова/возврата, такой конгломерат, который представляет собой наш мир, то человек будет тоже неким конгломератом поменьше, взаимодействующий с собой и с окружающим полем команд.
Читать дальше