ОПРЕДЕЛЕНИЕ ПОРЯДКА ИНИЦИАЛИЗАЦИИ СТАТИСТИЧЕСКИХ ОБЪЕКТОВ
DETERMINING THE ORDER OF INITIALIZATION OF STATIC OBJECTS

[0001] Настоящее изобретение относится в общем к программированию, а в частности к компиляции кода программы.
Уровнь техники
[0002] Каждая программа на языке С или С++ компилируется из одного или нескольких исходных файлов. Каждый файл может содержать статические объекты (объекты существующие в течение всего времени исполнения программы), которые инициализируются при запуске программы или при загрузке динамической библиотеки. Инициализация - это процесс вычисления и установки в объект некоторого значения. Компилятор создает объектные файлы из исходных файлов, имеющих расширение .obj в операционных системах (ОС) DOS и Windows (WINDOWS является зарегистрированным товарным знаком корпорации Microsoft) и расширение .о в системах Linux (LINUX является зарегистрированным товарным знаком Линуса Торвальдса), которые затем передаются линкеру. Линкер соединяет части кода и создает исполняемый модуль (который в Windows, например, имеет расширение.com или.ехе) или динамическую библиотеку (например, с расширением.dll в Windows и расширением.so в Linux).
[0003] Иногда код написан так, что для инициализации статического объекта из файла А требуется значение другого статического объекта из файла В. В таком случае объект из файла В должен быть уже инициализирован в момент инициализации объекта из файла А.
РАСКРЫТИЕ ИЗОБРЕТЕНИЯ
[0004] При портировании, т.е. при переносе кода в рамках большого проекта, состоящего из десятков и сотен исходных файлов, требуется удостовериться, чтобы все глобальные объекты и статические члены классов инициализировались в правильном порядке. В противном случае скомпилированная программа может выполняться неправильно. Например, предположим, что файл А.срр содержит строку:
int a=10;
[0005] Пусть другой файл того же проекта (файл В.срр) содержит строку:
int b=a+100;
[0006] Предположим, что переменные а и b находятся в разных файлах, при этом стандарт С++ не определяет порядок их инициализации. Если сначала инициализируется объект а, а затем объект b, то объект а будет равен 10, а объект b=объект а+10=110. Если объекты инициализируются в обратном порядке, то на момент инициализации объекта b неявно «предшествующий» ему по смыслу объект А еще не будет инициализирован. Поэтому почти наверняка объект b будет иметь неправильное значение, что может привести к неправильной работе программы.
[0007] Порядок инициализации не задается явно, обычно его определяет линкер. Как правило, порядок компоновки объектных файлов определяется тем порядком, в котором линкер получает их. Обычно команда запуска линкера имеет следующий синтаксис:
linker.exe file.obj another_file.obj one_more_file.obj
[0008] На практике порядок инициализации объектов в исполняемом модуле связан с порядком, в каком объектные файлы передаются линкеру. Это обычно либо прямой порядок (т.е. объекты первого подаваемого линкеру файла инициализируются первыми), либо обратный порядок (т.е. объекты последнего полученного линкером файла инициализируются первыми).
[0009] В дополнение к указанной проблеме стандарт С++ определяет, что все статические объекты инициализируются нулевым значением. При этом простые типы инициализируются нулевым значением, а составные типы инициализируются конструктором по умолчанию. В результате объекту может быть присвоено правильное значение (если порядок инициализации случайно оказался правильным) или нуль.
[0010] При этом если в рассмотренном выше примере объект b инициализирован раньше объекта а, то объект а будет иметь нулевое значение, а не ожидаемое значение 10, а значение объекта b будет равно 100, а не 110. Итак, инициализация нулевыми значениями приводит к появлению ошибок, которые практически невозможно найти и диагностировать. С точки зрения пользователя такая программа будет работать неправильно. С точки зрения программиста, участвующего в портировании кода, не только эта программа будет работать некорректно, но и ни один инструмент программирования или утилита не покажут, где локализована ошибка и в чем она состоит.
[0011] Для решения указанных выше проблем применяются хорошо известные стандартные решения. Например, применяются функции-геттеры или так называемые «nifty counters)) или счетчики Шварца. Другим решением является перенос всех статических объектов в один исходный файл. Еще одно решение заключается в использовании нестандартных (зависящих от компилятора) синтаксических конструкций, например, #pragma init, _attribute_((init_priority(XXX))).
[0012] Несмотря на то, что перечисленные выше способы могут давать удовлетворительные результаты, каждый из них требует ручной доработки, что приводит к чрезвычайно большим затратам времени и усилий при работе с сотнями исходных файлов. Более того, некоторые из этих способов не портируются (поскольку они предназначены для других компиляторов и/или ОС). Совершенно недостаточно просмотреть код на языке С++ в одном отдельном файле и найти конструкции, представляющие собой объявления и/или вызовы статических переменных. Необходимо последовательно открыть, изучить и проанализировать на предмет используемых переменных все остальные исходные файлы проекта.
[0013] Для удовлетворения указанных потребностей предлагаются различные варианты реализации раскрываемого изобретения. Например, в одном из вариантов реализации изобретения в качестве примера раскрывается связанный с использованием процессора способ определения порядка инициализации статических объектов, находящихся в нескольких объектных файлах. В каждом объектном файле объекты разделяются на определенные статические объекты и неопределенные объекты. На основе этих данных строится направленный граф объектных файлов. К направленному графу применяется какой-либо известный способ топологической сортировки для того, чтобы определить порядок объектных файлов, обеспечивающий корректную инициализацию объектов.
[0014] В дополнение к изложенному выше варианту реализации приводятся и другие примеры систем и вариантов реализации раскрываемого изобретения в виде компьютерных программ с указанием их преимуществ.
[0015] В изложенном выше кратком описании изобретения вводится набор понятий в упрощенной форме. Они будут более подробно раскрыты в детальном описании изобретения представленном ниже. Краткое описание изобретения не предназначено для определения основных признаков или важных признаков заявленного изобретения, защищаемого Формулой изобретения, или для определения объема заявленного изобретения. Заявленное изобретение не ограничивается вариантами реализации, которые решают некоторые указанные выше проблемы или все эти проблемы.
КРАТКОЕ ОПИСАНИЕ ЧЕРТЕЖЕЙ.
[0016] Для облегчения понимания всех перечисленных выше преимуществ изобретения в подробном описании будут использоваться ссылки на конкретные варианты его реализации, которые проиллюстрированы на прилагаемых чертежах. Эти чертежи демонстрируют лишь некоторые варианты реализации изобретения. Поэтому возможности применения этого изобретения не ограничиваются содержанием этих рисунков. Для наглядного описания и пояснения сути изобретения и отдельных деталей будут использоваться прилагаемые чертежи, на которых:
[0017] на Рис. 1 представлена блок-схема аппаратного обеспечения, в рамках которой аспекты настоящего изобретения могут быть реализованы;
[0018] на Рис. 2 представлена блок-схема памяти аппаратного обеспечения, показанного на Рис. 1, в рамках которой аспекты настоящего изобретения могут быть реализованы;
[0019] На Рис. 3 представлена блок-схема примера способа определения порядка инициализации статических объектов, расположенных в нескольких объектных файлах, в рамках которой различные аспекты настоящего изобретения могут быть реализованы;
[0020] На Рис. 4 представлена блок-схема, иллюстрирующая один из шагов способа определения порядка инициализации статических объектов, показанных на Рис. 3, в рамках которой аспекты настоящего изобретения могут быть реализованы;
[0021] На Рис. 5 представлена блок-схема, иллюстрирующая один из шагов способа, показанного на Рис. 4, в рамках которой аспекты настоящего изобретения могут быть реализованы; и
[0022] На Рис. 6 представлена блок-схема, иллюстрирующая другой шаг способа определения порядка инициализации статических объектов, показанного на Рис. 3, в рамках которой аспекты настоящего изобретения могут быть реализованы.
[0023] Рис. 7А представляет собой направленный граф, иллюстрирующий пример программного проекта, состоящего из 6 (шести) исходных файлов, в рамках которого аспекты настоящего изобретения могут быть реализованы.
[0024] Рис. 7В представляет собой таблицу, иллюстрирующую возможные варианты порядка объектных файлов, приведенных на Рис. 7А, гарантирующие корректную инициализацию объектов, в рамках которой аспекты настоящего изобретения могут быть реализованы
ОПИСАНИЕ ПРЕДПОЧТИТЕЛЬНЫХ ВАРИАНТОВ РЕАЛИЗАЦИИ
[0025] Как было упомянуто выше, текущие стандарты С и С++ по умолчанию не определяют порядок инициализации статических объектов в разных объектных файлах. Поэтому при разработке кода и портировании существующего кода на другие компиляторы (работающие на разных операционных системах) могут возникнуть проблемы. Иногда они возникают даже при портировании кода на другую версию того же компилятора. В итоге скомпилированная программа работает некорректно.
[0026] Для решения этой проблемы используются различные варианты реализации данного изобретения для определения порядка инициализации объектов в объектных файлах передаваемых линкеру при формировании исполняемого файла. В одном варианте реализации изобретения для каждого объектного файла определяется, какие объекты определены в данном объектном файле, и какие объекты не определены, но используются. Это решение выносится с использованием атрибутов объектов (типов объектов), которые могут быть автоматически прочитаны в каждом объектном файле. Типы объектов могут быть разделены на три основных категории: 1) объект является определенной статической переменной или константой, 2) объект является неопределенным объектом или 3) объект какого-либо другого типа, который потому не представляет интереса. Информация об определенных статических и неопределенных объектах может применяться для построения направленного графа объектных файлов. Используя топологическую сортировку графа, определяется порядок объектных файлов в соответствии с направленным графом, т.е. порядок передачи объектных файлов (.obj) линкеру.
[0027] На Рис. 1 в качестве примера реализации описываемого изобретения приведено аппаратное средство (100), которое может использоваться согласно одному из вариантов реализации данного изобретения. Аппаратное средство (100) обычно содержит по меньшей мере один процессор (102), соединенный с запоминающим устройством (104). Процессор (102) может представлять собой один или несколько процессоров (например, микропроцессоров), а память (104) может представлять собой устройства оперативной памяти (RAM), содержащие основное запоминающее устройство аппаратного средства (100), а также любые дополнительные уровни памяти (например, кэш-память, энергонезависимые или резервные запоминающие устройства, такие как программируемые запоминающие устройства или флэш-накопители), постоянные запоминающие устройства и т.д. Кроме того, память (104) может включать запоминающее устройство, физически расположенное в другом месте аппаратного средства (100), например любую кэш-память в процессоре (102), а также любое запоминающее устройство, используемое в качестве виртуальной памяти, например, запоминающее устройство большой емкости (110). Кроме того, обычно аппаратное средство (100) имеет несколько входов и выходов для обеспечения внешней связи. Для работы с пользователем или оператором аппаратное средство (100), как правило, содержит одно или несколько устройств пользовательского ввода (106), таких как клавиатура, мышь, сканер и дисплей (108) (например, жидкокристаллический дисплей) и/или устройства вывода (не показаны). В качестве дополнительной памяти аппаратное средство 100 может также включать одно или несколько запоминающих устройств большой емкости (110), например, накопитель на дискете или другом съемном диске, накопитель на жестком диске, запоминающее устройство с прямым доступом (DASD), накопитель на оптических дисках (например, накопитель на компакт-диске (CD), накопитель на универсальном цифровом диске формата DVD и т.д.) и/или накопитель на магнитной ленте и пр.
[0028] Кроме того, аппаратное средство (100) может включать интерфейс для взаимодействия с одной сетью или несколькими сетями (112) (например, с локальной сетью (LAN), глобальной сетью (WAN), беспроводной сетью и (или) сетью Интернет и т.д.) для обмена информацией с другими компьютерами, подключенными к этим сетям. Следует иметь в виду, что аппаратное средство (100) обычно включает соответствующие аналоговые и (или) цифровые интерфейсы между процессором (102) и каждым из компонентов (104), (106), (108) и (112), что хорошо известно специалистам в данной области.
[0029] Аппаратное средство (100) работает под управлением операционной системы (114), на нем выполняются различные программные приложения, компоненты, программы, объекты, модули и т.д., которые помечены в совокупности ссылкой номер 116 для реализации описанных выше способов.
[0030] На Рис. 2 приведена блок-схема памяти (104), которая обменивается данными с операционной системой (114) и обеспечивает ее программами для выполнения. Память (104) включает модуль компилятора (202), модуль сортировки (208) и модуль линкера (204). Модуль компилятора (202) обрабатывает исходные файлы для преобразования исходного кода с языка программирования на машинный код. В результате процесса компиляции для каждого исходного файла создается соответствующий объектный файл. Множество объектных файлов подается на модуль сортировки (208), который используя способ данного изобретения, описанного более подробно ниже, составляет список объектных файлов в порядке, гарантирующем корректную инициализацию объектов. Этот список подается в модуль линкера 204, который соединяет объектные файлы и формирует исполняемый файл или динамическую библиотеку. Затем скомпилированная программа (исполняемый файл или динамическая библиотека) может работать корректно.
[0031] На Рис. 3 с помощью блок-схемы представлен пример способа (300) определения порядка инициализации статических объектов, расположенных во множестве объектных файлов. На первом шаге модуль компилятора (202) компилирует исходные файлы в объектные файлы (т.е. файлы с расширением.obj в ОС Windows) (шаг (302)). Специалистами в данной области известно, что каждый исходный файл компилируется в объектный файл, содержащий ноль или более объектов.
[0032] Далее объекты, которые содержаться в объектных файлах, идентифицируются на шаге (304). Как будет более подробно описано ниже, объекты категоризируются на определенные статические и неопределенные объекты. Затем на шаге (306) с использованием классифицированных объектов из объектных файлов строится направленный граф. «Направленный граф» - это граф или множество соединенных ребрами вершин, причем эти ребра имеют направления. На Рис. 7 представлен направленный граф, построенный в качестве примера для проекта программы из 6 (шести) исходных файлов,. Он будет описан более подробно ниже. На шаге 308 направленный граф подвергается топологической сортировке. При этом создается список объектных файлов в порядке, который гарантирует корректную инициализацию объектов (шаг 310). После построения этого списка объектные файлы объединяются в исполняемые файлы или динамическую библиотеку (шаг 312).
[0033] Возвращаясь к шагу 304, каждый объектный файл анализируется для идентификации объектов. На Рис. 4 показана блок-схема примера способа (400) идентификации объектов в объектном файле. Объектный файл открывается на шаге 402. Далее создается список определенных статических объектов (шаг 404), например, в виде служебного файла в формате txt. Создается список неопределенных объектов (шаг 406), например, в виде служебного файла в формате txt. Несмотря на то, что шаг 404 показан предшествующим шагу 406, специалистам в данной области понятно, что шаги 404 и 406 могут производиться в обратном порядке или одновременно. В любом случае оба списка сохраняются на шаге (408). После создания списков определенных статических и неопределенных объектов на шаге (410) определяется, является ли объектный файл последним или нет. Если нет, то способ (400) возвращается к шагу (402) и производит ту же операцию со следующим объектным файлом. Если этот объектный файл является последним, то способ (400) завершает работу и уже готовы списки определенных статических и неопределенных объектов (шаг 412).
[0034] При формировании списков определенных статических и неопределенных объектов (шаги 404 и 406) проверяется каждый объект (от первого до последнего) в каждом объектном файле. На Рис. 5 в виде блок-схемы показан пример метода (500) составления таких списков в виде блок-схемы. На шаге (502), считываются атрибуты объекта в объектном файле, и сам объект определяется либо как определенный статический объект, либо как неопределенный объект, либо как ни то, ни другое. Если данный объект не является ни определенной статической переменной, ни неопределенным объектом (шаг 504), то он не принимается во внимание, и способ (500) переходит к обработке следующего объекта на шаге (506). Если объект определяется как статическая переменная (шаг 508), то он помещается в группу, содержащую другие такие же объекты, и, например, имя этого объекта (например, идентификатор объекта) вносится в список определенных объектов (шаг 510). Если данный объект не является определенным объектом, то он помещается в одну группу с другими неопределенными объектами и, например, его имя вносится в список неопределенных объектов на шаге (512). После внесения объекта в список неопределенных объектов или в список определенных статических объектов сохраняются оба файла со списком неопределенных объектов и со списком определенных статических объектов. Затем определяется, является ли данный объект последним в объектном файле (шаг 514). Если нет, то способ (500) возвращается на шаг (506), и шаг (502) применяется к следующему объекту в данном объектном файле. Иначе способ (500) переходит к обработке следующего объектного файла на шаге (516).
[0035] На Рис. 3 показано, что после анализа всех объектных файлов на основе списков неопределенных и определенных статических объектов строится направленный граф объектных файлов (шаг 304). Например, модуль сортировки (208) строит направленный граф объектных файлов согласно следующим правилам:
a. Вершинами направленного графа являются объектные файлы.
b. Ребро графа от вершины А к вершине В строится, если объект А содержит как минимум один неопределенный объект 01, а объектный файл В содержит определенный статический объект 01 (т.е. объект с тем же именем/идентификатором).
с. Ребро может соединять любые две вершины, если для этих двух вершин выполняется условие b, в том числе возможна пара вершин, которую соединяют два ребра, имеющие противоположные направления (т.е. разрешены циклические зависимости).
[0036] Построенный направленный граф в одном варианте реализации раскрываемого изобретения может использоваться для визуализации состояния переменных в проекте. Например, граф может быть выведен в окно приложения на дисплее (108), сохранен в файле в виде изображения, текста или в любом другом формате. Его можно отправить на печать на принтер, плоттер или любое другое периферийное устройство. Кроме этого, имена (идентификаторы) переменных можно использовать для обозначения ребер при визуализации графа, что позволяет сделать работу с ним наглядной.
[0037] В другом варианте реализации данного изобретения созданный направленный граф можно проанализировать на предмет обнаружения связанных и несвязанных областей, или любых других математических зависимостей. Результаты этого анализа (и сам граф) можно затем использовать прямо или опосредованно.
[0038] Соответственно, использование терминологии, относящейся к «построению», «формированию», «классификации», «идентификации», «созданию» и т.д., может относиться к шагам, обозначенным в электронным и/или физическим образом, поддерживаемым процессором (102).
[0039] Затем построенный направленный граф (шаг 308) подвергается топологической сортировке с помощью любого известного способа. Применение топологической сортировки может привести, а может не привести к формированию списка всех вершин графа (т.е. списка объектных файлов), которые не содержат дуг, идущих от более ранних вершин к более поздним вершинам. На Рис. 6 представлена блок-схема способа (600) построения типологически отсортированного списка объектных файлов. После применения топологической сортировки к построенному направленному графу (шаг 602) получившийся список используется для определения порядка объектных файлов, который гарантирует корректную инициализацию объектов на шаге 606. Это возможно, если список всех вершин графа не содержит ребер, идущих от более ранних вершин к более поздним вершинам (на шаге 604). В зависимости от конкретной операционной системы инициализация может производиться в прямом или обратном порядке в зависимости от порядка поступления объектных файлов в модуль линкера (204).
[0040] Если такой список невозможно построить (на шаге 604), то выполняется шаг для обнаружения (608) одной или нескольких циклических зависимостей или циклов в построенном направленном графе. В одном из способов реализации изобретения информация об обнаруженных циклических зависимостях (например, списки пар вершин, образующих циклические зависимости) может быть выведена в окно приложения на дисплее (108) в виде текста. В другом варианте реализации данного изобретения обнаруженные циклические зависимости могут графически изображены на всей схеме построенного направленного графа, могут быть выделены каким-либо цветом или обозначены иным способом. После обнаружения циклические зависимости исправляются на шаге 610. Например, в варианте реализации способа (600) списки обнаруженных циклических зависимостей могут впоследствии использоваться при автоматической обработке проекта. Например, для автоматической передачи соответствующих пар файлов программисту, ответственному за поиск и устранение проблем инициализации. Обычно число циклических зависимостей невелико (порядка 3-5 циклических зависимостей) даже в очень больших проектах (которые включают порядка 500-1000 объектных файлов). Поэтому их можно легко и полностью исправить вручную. Исправление циклической зависимости может заключаться в переносе одной переменной в другой исходный файл, использовании функции-геттера или какого-либо другого известного способа.
[0041] В некоторых случаях при применении описываемого способа обнаружения циклической зависимости в направленном графе возможно наличие «ложных» циклических зависимостей. То есть направленный граф может содержать цикл, но реальной циклической зависимости в инициализации статических переменных в коде при этом нет. Для разрешения таких ситуаций может применяться алгоритм, позволяющий безусловно задать направление ребра между двумя объектными файлами, например, «объектный файл А должен быть инициализирован прежде объектного файла В». В таком случае связь между вершинами строится не по правилу b (т.е. «ребро графа от вершины А к вершине В строится, если объектный файл А содержит как минимум один неопределенный объект 01, а объектный файл В содержит определенный статический объект 01»), а по правилу, явно заданному этим алгоритмом.
[0042] После исправления циклических зависимостей способ возвращается на шаг (604). Поскольку список должен составляться после исправления циклических зависимостей, способ (600) переходит к выполнению шага (606).
[0043] На Рис. 7А изображен направленный граф, построенный для небольшого проекта согласно варианту реализации данного изобретения. Исходный код небольшого проекта записан в 6 (шести) файлах. Вершины этого графа представляют собой объектные файлы А, В, С, D, Е и F, они получены в результате компиляции исходных файлов. Объектный файл А (701) содержит по меньшей мере один неопределенный объект, который определен в объектном файле В, на что указывает ребро (702), идущее от файла А к файлу В. Таким образом, в списке объектных файлов, полученном в результате топологической сортировки графа, объектный файл В будет находится перед файлом А, и статические объекты объектного файла В будут инициализированы раньше статических объектов из объектного файла А. В противном случае программа может работать некорректно. Объектный файл F является примером объектного файла, который не содержит никаких неопределенных объектов или определенных статических объектов, используемых в другом объектном файле. Поэтому объекты, определенные в объектном файле F, могут быть инициализированы в любой момент времени.
[0044] На Рис. 7В приведена таблица с возможными порядками объектных файлов, которые гарантируют корректную инициализацию объектов, т.е. запуск программы без ошибок. Двойные стрелки, расположенные вне таблицы, указывают на пары файлов, которые можно поменять местами в соответствующих последовательностях. Например, в варианте 1 можно поменять местами объектные файлы А и Е, а в варианте 2 можно провести поменять местами объектные файлы D и А. Перемена местами этих файлов не вызовет ошибок во время инициализации объектов при запуске программы.
[0045] Специалистам в данной области ясно, что аспекты раскрываемого изобретения могут быть реализованы в виде системы, способа или программного продукта для компьютера. Таким образом, аспекты данного изобретения могут иметь исключительно аппаратную реализацию, исключительно программную реализацию (включая встроенное программное обеспечение, резидентное программное обеспечение, микрокоманды и т.д.) либо вариант реализации, в котором сочетаются программные и аппаратные компоненты, что в целом может называться в этом документе «схемой», «модулем» или «системой». Кроме того, аспекты раскрываемого изобретения могут принимать форму программного продукта для компьютера, записанного на один машиночитаемый носитель или на несколько машиночитаемых носителей, содержащих машиночитаемый программный код.
[0046] Может использоваться любая комбинация одного машиночитаемого носителя или нескольких машиночитаемых носителей. Машиночитаемый носитель может представлять собой содержащую сигналы машиночитаемую среду или машиночитаемый носитель данных. Например, машиночитаемый носитель данных может, помимо прочего, представлять собой электронную, магнитную, оптическую, электромагнитную, инфракрасную или полупроводниковую систему, аппарат или устройство, либо любую подходящую комбинацию перечисленного выше. Более конкретные примеры машиночитаемых носителей включают следующее (неполный список): электрическое соединение, содержащее один проводник или более, портативный компьютерный гибкий диск, жесткий диск, оперативное запоминающее устройство (ОЗУ), постоянное запоминающее устройство (ПЗУ), перезаписываемое программируемое постоянное запоминающее устройство (ППЗУ или флэш-память), оптическое волокно, портативный компакт-диск для однократной записи данных (CD-ROM), оптическое запоминающее устройство, магнитное запоминающее устройство или любую подходящую комбинацию перечисленного выше. В контексте этого документа машиночитаемый носитель данных может быть любым материальным носителем данных, который может содержать или хранить программу для использования выполняющей команды системой, аппаратом или устройством, либо который можно подключить к выполняющей команды системе, аппарату или устройству.
[0047] Записанный в машиночитаемом носителе программный код может передаваться с использованием любой подходящей среды, включая, помимо прочего, следующие среды: беспроводная среда, проводная среда, оптоволоконный кабель, радиочастотная среда и т.д., либо с помощью любой подходящей комбинации перечисленных выше сред. Компьютерный программный код для выполнения операций для аспектов раскрываемого изобретения может быть написан в виде любой комбинации на одном или нескольких языках программирования, включая объектно-ориентированные языки программирования, такие как Java, Smalltalk, С++ и т.п., а также традиционные процедурные языки программирования, такие как язык программирования С или похожие языки программирования. Код программы может выполняться полностью на компьютере пользователя, частично на компьютере пользователя как автономный пакет программного обеспечения, частично на компьютере пользователя и частично на удаленном компьютере или полностью на удаленном компьютере или сервере. В последнем сценарии удаленный компьютер может быть соединен с компьютером пользователя по сети любого типа, в том числе по локальной сети (LAN) или по глобальной сети (WAN), либо может быть организовано соединение с внешним компьютером (например, по сети Интернет с использованием поставщика услуг Интернета).
[0048] Особенности раскрываемого изобретения были описаны выше со ссылкой на структурные схемы и/или блок-схемы способов, устройств (систем) и программных продуктов для компьютеров в соответствии с вариантами реализации изобретения. Следует понимать, что каждый блок на иллюстративной блок-схеме и/или комбинация блоков в иллюстративной блок-схеме и/или блок-схемах может быть осуществлен с помощью команд программы для компьютера. Эти команды программы для компьютера могут быть переданы процессору универсального компьютера, специализированного компьютера или другого программируемого устройства обработки данных для получения машины, таким образом, чтобы команды, которые выполняются в процессоре компьютера или в другом программируемого устройства обработки данных, создали средства для реализации функций или действий, указанных в блоках или блоках структурной схемы и/или блок-схемы.
[0049] Эти команды компьютерной программы также могут храниться в машиночитаемом носителе, который может заставить компьютер, другое программируемое устройство обработки данных или другие устройства работать определенным образом так, чтобы эти команды, хранящиеся в машиночитаемом носителе, производили изделие, в том числе команды, реализующие функцию или действие, предусмотренное в блоке или блоках структурной схемы и/или блок-схемы. Команды компьютерной программы также могут быть загружены на компьютер, на другое программируемое устройство обработки данных или на другие устройства, чтобы вызвать выполнение последовательностей рабочих этапов, которые должны выполняться в компьютере, другом программируемом устройстве или в других устройствах для выполнения реализованного в компьютере процесса таким образом, чтобы команды, которые выполняются на компьютере или на другом программируемом устройстве, предоставляли процессы для выполнения функций или действий, предусмотренных в блоке или блоках структурной схемы и/или блок-схемы.
[0050] Структурные схемы или блок-схемы, приведенные на рисунках, иллюстрируют архитектуру, функциональность и работу возможных вариантов реализации систем, способов и компьютерных программных продуктов в соответствии с различными вариантами реализации раскрываемого изобретения. В связи с этим каждый блок в структурной схеме или блок-схеме может представлять собой модуль, часть кода или сегмент, который содержит одну или более исполняемых команд для реализации указанной логической функции (указанных логических функций). Следует также отметить, что в некоторых альтернативных вариантах реализации отмеченные в блоке функции могут выполняться в порядке, отличном от того, который указан на рисунках. Например, два блока, которые показаны как последовательные, фактически могут выполняться по существу одновременно, либо иногда блоки могут выполняться в обратном порядке, в зависимости от используемой функциональности. Кроме того, следует отметить, что каждый блок структурной схемы и/или блок-схемы и комбинации блоков в структурных схемах и/или блок-схемах могут быть реализованы с помощью специальных систем аппаратного обеспечения, которые выполняют заданные функции или действия, или с помощью комбинации специализированного аппаратного обеспечения и компьютерных команд.