ОТЛАДКА МАШИННОГО КОДА ПУТЕМ ПЕРЕХОДА ОТ ИСПОЛНЕНИЯ В СОБСТВЕННОМ РЕЖИМЕ К ИСПОЛНЕНИЮ В ИНТЕРПРЕТИРУЕМОМ РЕЖИМЕ Российский патент 2018 года по МПК G06F11/36 

Описание патента на изобретение RU2668973C2

УРОВЕНЬ ТЕХНИКИ

[0001] Компилятор может создавать исполняемый код путем компилирования исходного кода в код, который может исполняться конкретным процессором. Этот тип процессорно-зависимого кода называется "машинным кодом", машинными инструкциями, которые могут исполняться конкретным типом процессора, но не любым типом процессора. Другой тип компилятора может принимать исходный код и создавать промежуточный код или байт-код виртуальной машины, который не зависит от процессора. Промежуточный код обычно принимается компилятором промежуточного языка (например, оперативным (JIT) компилятором) и компилируется в машинный код прямо перед исполнением программы. Промежуточный код не является платформо-зависимым.

[0002] Интерпретатор считывает исходный код или промежуточный код и исполняет код оператор за оператором без транслирования кода в машинный код. Как правило, интерпретирование кода медленнее, чем исполнение машинного кода. Интерпретирование кода обычно медленнее JIT-компилирования промежуточного кода в машинный код и исполнения машинного кода.

[0003] Реализация отладчика для интерпретируемого кода обычно менее сложна, чем реализация отладчика для машинного кода. Однако время отклика обычно короче для отладчика для машинного кода, чем для отладчика для интерпретируемого кода. Отладчик обычно предоставляет пользователю возможность управлять исполнением программы путем захода или выхода из функции, обхода функции, приостановки и возобновления исполнения, проверки текущего значения переменной или ячейки стека, и так далее.

СУЩНОСТЬ ИЗОБРЕТЕНИЯ

[0004] Двухрежимный отладчик, который описан в этом документе, может отлаживать машинный код, представляющий программу. В ответ на обнаружение заданного условия ухода из отладки в отлаживаемой программе отладчик может прекратить отладку машинного кода, представляющего программу, и может перейти к отладке соответствующего интерпретируемого кода, представляющего программу. В собственном режиме отладчик может отлаживать машинный код, представляющий программу. Операции отладки, которые обеспечивают проверку и/или модификацию текущих значений переменных программы и/или информации стека, могут исполняться в собственном режиме. При отладке в собственном режиме каждый раз, когда переменная сохраняется в регистр (например, когда переменная задается в программе), значение также можно сохранить в ячейку стека для функции. Переменные для отлаживаемой функции можно сохранять в конкретной локализованной области стека, зарезервированной для отлаживаемой программы. Та же самая область стека может использоваться во время компиляции в машинный код для сброса (то есть, когда имеется больше активных переменных, чем регистров у вычислительного устройства, переменные можно "сбрасывать" из регистров в память). Ячейки стека могут использоваться отладчиком для получения и изменения значений переменных.

[0005] В ответ на обнаружение условия ухода можно прекратить отладку машинного кода, представляющего программу. Интерпретатор может принимать интерпретируемый код, представляющий программу, причем принятый интерпретируемый код соответствует отлаживаемому машинному коду, и может возобновлять отладку интерпретируемого кода для программы, работая в интерпретируемом режиме. Например, операции отладки, которые управляют исполнением отлаживаемой программы, могут выполняться в интерпретируемом режиме. Операции управления исполнением можно реализовать с помощью операций асинхронного останова, пошагового выполнения, точки останова и/или останова по исключению. Отладка в режиме интерпретатора может использоваться для отладки самой верхней функции (функции, чьи значения переменных располагаются в самом верхнем кадре стека), наряду с использованием собственного режима для отладки других частей программы.

[0006] Отладчик может переходить от отладки в собственном режиме к отладке в интерпретируемом режиме в заданных точках ухода. Обработчик ухода, ассоциированный с отладчиком, может принимать запись ухода, содержащую текущее состояние машинного кода, исполняющегося согласно отладчику. Обработчик ухода может создавать экземпляр интерпретатора, создавать кадр стека интерпретатора для экземпляра интерпретатора и может заполнять кадр стека интерпретатора, созданный для экземпляра интерпретатора, значениями из записи ухода. Отладка программы может возобновляться в аналогичном соответствующем интерпретируемом коде для программы. Точки ухода из отладки являются местами в программе, в которых отладка в собственном режиме может переходить к отладке в интерпретируемом режиме при условии, что выполняются некоторые условия ухода. Для программы можно задать точки ухода из отладки, например в начале функции, на обратной петле цикла, когда возвращается функция, когда возвращается вызов вспомогательной функции или библиотеки или когда встречается оператор отладчика. Когда точка ухода из отладки встречается в сеансе отладки, состояние флагов отладки во время выполнения и проверки глубины стека у кадров стека можно использовать для определения, выполняются ли условия ухода из отладки. Если выполняются условия ухода из отладки, то код, соответствующий исполняющемуся в отладчике машинному коду, можно отправить в интерпретатор, и отладка может продолжаться в соответствующем интерпретируемом коде.

[0007] Данная Сущность изобретения предоставляется, чтобы представить набор идей в упрощенном виде, которые дополнительно описываются ниже в Подробном описании. Данная Сущность изобретения не предназначена для определения ключевых признаков или существенных признаков заявленного предмета изобретения, и также не предназначена для использования в ограничении объема заявленного предмета изобретения.

КРАТКОЕ ОПИСАНИЕ ЧЕРТЕЖЕЙ

[0008] На чертежах:

Фиг. 1a иллюстрирует пример системы 100, которая включает в себя приложение обозревателя, которое визуализирует страницы из принятых документов;

Фиг. 1b иллюстрирует пример системы 200, содержащей среду выполнения, которая может переходить от исполнения компилированного кода к интерпретированию кода в соответствии с аспектами предмета изобретения, раскрытого в этом документе;

Фиг. 1c иллюстрирует пример системы 300, содержащей среду выполнения, которая может переходить от исполнения компилированного кода к интерпретированию кода в соответствии с аспектами предмета изобретения, раскрытого в этом документе;

Фиг. 1d иллюстрирует пример системы 400, которая может отлаживать код путем перехода из собственного режима в интерпретируемый режим в соответствии с аспектами предмета изобретения, раскрытого в этом документе;

Фиг. 2 иллюстрирует пример способа 250, который переходит от отладки машинного кода к отладке интерпретируемого кода в соответствии с аспектами предмета изобретения, раскрытого в этом документе;

Фиг. 3 – блок-схема примера вычислительной среды в соответствии с аспектами предмета изобретения, раскрытого в этом документе; и

Фиг. 4 – блок-схема примера интегрированной среды разработки (IDE) в соответствии с аспектами предмета изобретения, раскрытого в этом документе.

ПОДРОБНОЕ ОПИСАНИЕ

Обзор

[0009] Программу можно отлаживать путем ее компилирования в машинный код и отладки машинного кода. В заданных точках в программе отладка может переходить из собственного режима в интерпретируемый режим, и отладка может продолжаться в интерпретируемом коде. Отладочные операции, которые включают в себя управление исполнением: приостановка исполнения, продолжение исполнения, заход, выход или обход участка кода и так далее, могут происходить в интерпретируемом режиме. Отладочные операции, которые включают в себя проверку и модификацию переменных, могут происходить в собственном режиме. Двухрежимный отладчик может объединять скорость отладки в собственном режиме с простотой отладки в интерпретируемом режиме.

Отладка машинного кода путем перехода от исполнения в собственном режиме к исполнению в режиме интерпретатора

[0010] Фиг. 1a иллюстрирует пример среды 100 просмотра веб-страниц в соответствии с некоторыми аспектами предмета изобретения, раскрытого в этом документе. Как показано на фиг. 1a, среда 100 может включать в себя одно или несколько из: вычислительного устройства 102, сервера 104, сети 106 и приложения 108 обозревателя. Среда 100 просмотра веб-страниц может включать в себя другие компоненты, известные в данной области техники.

[0011] Вычислительное устройство 102 может быть любым типом стационарного или мобильного вычислительного устройства, включая настольный компьютер (например, персональный компьютер и т. п.), мобильный компьютер или вычислительное устройство (например, устройство Palm®, устройство RIM Blackberry®, персональный цифровой помощник (PDA), переносной компьютер, блокнотный компьютер, планшетный компьютер (например, Apple iPad™), нетбук и т. п.), мобильный телефон (например, сотовый телефон, смартфон, такой как Apple iPhone, телефон Google Android™, телефон Microsoft Windows® и т. п.) или другой тип мобильного устройства. Сервер 104 можно реализовать в одной или нескольких компьютерных системах, включающих в себя один или несколько серверов, которые могут быть любым типом вычислительного устройства, описанного в этом документе или известного иным образом, которое допускает соответствующие функциональные возможности, описанные в этом документе.

[0012] Вычислительное устройство 102 и сервер 104 можно коммуникационно соединять с помощью сети 106. Сеть 106 может включать в себя одну или несколько линий связи и/или сетей связи, например PAN (личная сеть), LAN (локальная сеть), WAN (глобальная сеть) или сочетание сетей, например Интернет. Вычислительное устройство 102 и сервер 104 можно коммуникационно соединять с сетью 106 с использованием различных линий связи, включая проводные и/или беспроводные линии связи, например беспроводные линии связи по беспроводной LAN (WLAN) IEEE 802.11, линии связи по Общемировой совместимости для микроволнового доступа (Wi-MAX), линии связи по сотовым сетям, линии связи по беспроводной персональной сети (PAN) (например, линии связи по Bluetooth™), линии связи по Ethernet, линии связи по USB и т. п.

[0013] Приложение 108 обозревателя может быть программой, которая может исполняться в вычислительном устройстве 102. Приложение 108 обозревателя может предоставлять возможность извлечения, представления и просмотра информационных ресурсов сети. Информационный ресурс или объект можно извлекать с помощью приложения 108 обозревателя, используя сетевой адрес, например унифицированный идентификатор ресурса (URI). Примеры информационных ресурсов включают в себя веб-страницы, изображения, видео и другие виды контента. Гиперссылки, которые присутствуют в информационных ресурсах, дают пользователям возможность свободно направлять обозреватель на связанные ресурсы. Примеры приложения 108 обозревателя включают в себя, но не ограничиваются, Internet Explorer®, разработанный Microsoft Corp. из Редмонда, Вашингтон, Mozilla Firefox®, разработанный Mozilla Corp. из Маунтин-Вью, Калифорния, Safari®, разработанный Apple Inc. из Купертино, Калифорния, и Google® Chrome из Маунтин-Вью, Калифорния.

[0014] Приложение 108 обозревателя может извлекать документ 112 из сервера 104 по сети 106. Документ 112 может быть веб-документом, который включает в себя код на языке разметки, например языке гипертекстовой разметки (HTML), динамическом HTML (DHTML), расширяемом HTML (XHTML), расширяемом языке разметки (XML) и т. п. Документ 112 может включать в себя объекты 114 DOM (объектная модель документов) и один или несколько сценариев 116. Объекты 114 DOM могут включать в себя один или несколько объектов, представленных в документе 112 в соответствии с соглашением DOM, которое является межплатформенным и независимым от языка соглашением для представления и взаимодействия с объектами. Объекты 114 DOM могут включать в себя объекты, которые непосредственно включены в документ 112, и/или на которые ссылается документ 112 и которые отдельно извлекаются из сервера 104 или другого сервера. Сценарий (сценарии) 116 включает в себя код, форматированный в соответствии с динамическим языком (например, JavaScript, VBScript, AJAX, Python, Perl и т. п.), который дает возможность внесения изменений в объекты 114 DOM, включая изменения на основе таких факторов, как пользовательский ввод, условия окружающей среды (например, время дня или другие переменные), и т. п. Код сценария (сценариев) 116 может обращаться и модифицировать объекты 114 DOM оперативно без возврата серверу 104.

[0015] Приложение 108 обозревателя может принимать (например, загружать) документ 112. Приложение 108 обозревателя может включать в себя механизм обозревателя (например, механизм макета или механизм визуализации), который форматирует информацию документа 112 и отображает форматированную информацию. Например, как показано на фиг. 1a, приложение 108 обозревателя может формировать страницу 118 на основе документа 112, который отображается дисплеем 110 вычислительного устройства 102. Приложение 108 обозревателя может конфигурироваться для исполнения одного или нескольких сценариев 116, которые внедрены в документ 112 или которые отделены от документа 112, но ассоциированы с ним.

[0016] Фиг. 1b иллюстрирует блок-схему системы 200 в соответствии с некоторыми аспектами предмета изобретения, раскрытого в этом документе. Система 200 может включать в себя один или несколько компьютеров или вычислительных устройств, например вычислительное устройство 102, включающих в себя один или несколько процессоров, например процессор 143 и т. п., память 145, контроллер 309 исполнения, интерпретатор 311, компилятор, например JIT-компилятор 313 (оперативный), хранилище 315, исполнитель 317 машинного кода и обработчик 337 ухода. Контроллер 309 исполнения, интерпретатор 311, компилятор, например JIT-компилятор 313, хранилище 315, исполнитель 317 машинного кода и обработчик 337 ухода можно реализовать в виде одного или нескольких программных модулей, которые при загрузке в память 145 побуждают один или несколько процессоров 143 и т. п. выполнить действия, приписываемые соответственно контроллеру 309 исполнения, интерпретатору 311, компилятору, например JIT-компилятору 313, исполнителю 317 машинного кода и обработчику 337 ухода. Система 200 может включать в себя другие компоненты, известные в данной области техники, которые не показаны.

[0017] Контроллер 309 исполнения, интерпретатор 311 и/или JIT-компилятор 313 могут принимать байт-код, сформированный из исходного кода. Исходный код может быть любым исходным кодом, написанным на языке программирования, например, но не только, динамических языках сценариев, например, но не только, JavaScript, VBScript, Python и так далее. Исходный код можно проанализировать, и можно сформировать байт-код из проанализированного исходного кода. На основе байт-кода 325 и информации профиля, эвристической или другой информации контроллер 309 исполнения может предоставить одному из интерпретатора 311 и JIT-компилятора 313 возможность работать с байт-кодом 325. Интерпретатор 311 может конфигурироваться для интерпретирования байт-кода 325, когда задействован управляющим сигналом интерпретатора, принятым от контроллера 309 исполнения. JIT-компилятор 313 может конфигурироваться для компиляции байт-кода 325, когда задействован управляющим сигналом компилятора, принятым от контроллера 309 исполнения.

[0018] Когда интерпретатор 311 задействован управляющим сигналом интерпретатора, интерпретатор 311 может интерпретировать и исполнять байт-код 325. Интерпретатор 311 можно реализовать в виде интерпретатора JavaScript, интерпретатора VBScript, интерпретатора Python или в виде интерпретатора для другого динамического языка или динамического языка сценариев, упомянутого в другом месте в этом документе или известного иным образом. Таким образом, исходный код может, по меньшей мере частично, исполняться в результате работы интерпретатора 311. Аналогичным образом в ответ на прием разрешающего управляющего сигнала компилятора JIT-компилятор 313 может компилировать байт-код 325. JIT-компилятор 313 можно реализовать в виде компилятора JavaScript, компилятора VBScript, компилятора Python или в виде компилятора для другого динамического языка или динамического языка сценариев, упомянутого в другом месте в этом документе или известного иным образом. JIT-компилятор 313 называется "оперативным" компилятором, потому что конкретные части байт-кода можно компилировать JIT-компилятором 313, когда нужен компилированный байт-код (например, обязательно будет исполнен), вместо предварительного компилирования байт-кода 325 полностью перед исполнением. JIT-компилятор 313 может формировать компилированный байт-код 333, имеющий вид исполняемого машиной кода или команд.

[0019] JIT-компилятор 313 может выполнять оптимизации кода на основе предположений, как описано выше. JIT-компилятор 313 может вставлять в компилированный байт-код, который он формирует, одну или несколько заранее установленных точек ухода. Для каждой точки ухода можно создать таблицу ухода, например таблицу 303 ухода и т. п., в которой может записываться местоположение переменных, местоположение в байт-коде 325 или в исходном коде, соответствующее местоположению точки ухода, и другая информация. Таблица 303 ухода и т. п. может описывать, где искать переменные – в стеке или в регистре. JIT-компилятор 313 может формировать одну или несколько таблиц ухода и может сохранять их вместе с оптимизированным компилированным байт-кодом (например, в виде машинного кода). Таблицу ухода можно оптимизировать путем предотвращения излишнего увеличения времени существования переменных с помощью кодирования информации в таблице ухода. Например, если известно, что значением переменной x является постоянная 10, то в момент ухода можно кодировать x=10 в таблице ухода, чтобы значение 10 не нужно было "возрождать" в памяти или в регистре. Аналогичным образом, когда более одной переменной имеют одинаковое значение (например, x=y) в точке ухода, то в таблице ухода может использоваться одинаковое местоположение для всех переменных, имеющих одинаковое значение, если эта информация кодируется в таблице ухода (например, для x и y может использоваться одинаковое местоположение в таблице ухода). Эти методики могут повысить эффективность распределения регистров. Оптимизированный компилированный байт-код может храниться в хранилище 315 в виде компилированного байт-кода 333 для обращения во время последующего исполнения программы системой 200.

[0020] Когда исполняется оптимизированный компилированный байт-код, оптимизированный компилированный байт-код 333 может приниматься исполнителем 317 машинного кода (который может быть одним или несколькими процессорами, например процессором 143 и т. п.). Исполнение компилированного байт-кода может ассоциироваться с кадром 341 компилятора в стеке 335. Лежащее в основе предположение или предположения, на которых основывались оптимизации, можно определять верными или неверными в каждой точке ухода. В ответ на определение, что предположение (предположения) является верным, можно продолжать исполнение оптимизированного компилированного кода. В ответ на определение, что предположение (предположения) является неверным, исполнение оптимизированного компилированного кода можно прекратить. Таблицу ухода для той точки ухода можно передавать обработчику 337 ухода. Обработчик 337 ухода может восстанавливать состояние (например, значение) переменных, необходимых интерпретатору. Обработчик ухода может создавать новый кадр (например, кадр 339 интерпретатора) для стека 335. Если необходимая интерпретатору переменная стала неактивной, то обработчик 337 ухода может "возрождать" переменную путем переключения состояния переменной с неактивного на активное. Обработчик 337 ухода может создавать экземпляр интерпретатора 311, передавать интерпретатору местоположение в байт-коде, соответствующее точке ухода в оптимизированном компилированном коде, и вновь созданный кадр интерпретатора, включающий в себя значения всех восстановленных активных переменных. Поэтому исходный код, из которого формировался байт-код 325, может таким образом частично исполняться в результате работы JIT-компилятора 313 и исполнителя 317 машинного кода, и частично исполняться интерпретатором 311.

[0021] Фиг. 1c иллюстрирует другой пример системы – системы 300 в соответствии с аспектами предмета изобретения, раскрытого в этом документе. Система 300 может включать в себя вычислительное устройство, например вычислительное устройство 102, содержащее один или несколько процессоров, например процессор 142 и т. п., память 144 и среду выполнения, которая включает в себя одно или несколько из следующего: интерфейс 302 со средой, средство 304 синтаксического анализа, генератор 306 байт-кода, контроллер 308 исполнения, интерпретатор 310, компилятор, например, но не только, JIT-компилятор 312 (оперативный), хранилище 314, исполнитель 316 машинного кода, обработчик 336 ухода и библиотеку 318 сценариев. Система 300 может включать в себя другие компоненты, известные в данной области техники, которые не показаны.

[0022] Как показано на фиг. 1c, интерфейс 302 со средой может принимать исходный код 208 сценария. Интерфейс 302 со средой может присутствовать или отсутствовать. Средство 304 синтаксического анализа может конфигурироваться в качестве интерфейса со средой выполнения вместо присутствия интерфейса 302 со средой. Когда присутствует, интерфейс 302 со средой может быть интерфейсом связи, который предоставляет один или несколько способов для сопряжения некоторого узла со средой выполнения из фиг. 1c. В соответствии с некоторыми аспектами предмета изобретения, раскрытого в этом документе, интерфейс 302 со средой можно реализовать в соответствии с IActiveScript, разработанным Microsoft Corporation из Редмонда, Вашингтон. Интерфейс 302 со средой может предоставлять исходный код 208 средству 304 синтаксического анализа.

[0023] Средство 304 синтаксического анализа может принимать и анализировать исходный код 208. Средство 304 синтаксического анализа может выполнять формирование лексем или лексический анализ над исходным кодом 208, чтобы форматировать исходный код 208 в символы или лексемы. Средство 304 синтаксического анализа может выполнять проверку ошибок над лексемами для определения, образуются ли допустимые выражения, что отсутствуют синтаксические ошибки, и т. п. Средство 304 синтаксического анализа может выводить проанализированный исходный код в виде проанализированного исходного кода (не показан). Проанализированный исходный код может иметь любой подходящий вид, включая формируемый средством 304 синтаксического анализа в виде кода AST (дерево абстрактного синтаксиса), который включает в себя древовидное представление абстрактной синтаксической структуры исходного кода 208, которое было бы известно специалистам в соответствующей области (областях) техники.

[0024] Генератор 306 байт-кода может принимать проанализированный исходный код. Генератор 306 байт-кода может конфигурироваться для преобразования проанализированного исходного кода в байт-код, который включает в себя наборы команд, сконфигурированные для эффективного исполнения интерпретатором, а также для дальнейшей компиляции в машинный код. Сформированный байт-код может представлять собой проанализированный исходный код в виде числовых кодов и соответствующих необязательных параметров. Генератор 306 байт-кода может выводить сформированный байт-код (не показано). Байт-код может иметь любой подходящий вид, включая формируемый генератором 306 байт-кода в виде p-кода (переносимый код), который был бы известен специалистам в соответствующей области (областях) техники.

[0025] Каждый из контроллера 308 исполнения, интерпретатора 310 и JIT-компилятора 312 может принимать сформированный байт-код. Интерпретатор 310 или исполнитель 316 машинного кода может включать в себя генератор 204 профиля. Генератор 204 профиля может конфигурироваться для анализа сформированного байт-кода, чтобы собирать статистику и дополнительную информацию об исходном коде 208. Генератор 204 профиля может формировать информацию 320 профиля, которая может включать в себя накопленную информацию и которая может храниться в хранилище 314.

[0026] Контроллер 308 исполнения может обращаться к информации 320 профиля и может быть коммуникационно соединен с интерпретатором 310 и JIT-компилятором 312. На основе сформированного байт-кода и информации 320 профиля контроллер 308 исполнения может предоставить одному из интерпретатора 310 и JIT-компилятора 312 возможность работать со сформированным байт-кодом. Интерпретатор 310 может конфигурироваться для интерпретирования сформированного байт-кода, когда задействован управляющим сигналом интерпретатора, принятым от контроллера 308 исполнения. JIT-компилятор 312 может конфигурироваться для компиляции сформированного байт-кода, когда задействован управляющим сигналом компилятора, принятым от контроллера 308 исполнения. Например, во время первого исполнения исходного кода 208 может еще отсутствовать информация 320 профиля. В таком случае контроллер 308 исполнения может предоставить интерпретатору 310 возможность интерпретировать сформированный байт-код и сформировать информацию 320 профиля. Во время последующего исполнения исходного кода 208 (например, позже во время того же первого исполнения исходного кода 208 и/или во время последующего исполнения исходного кода 208) контроллер 308 исполнения на основе информации 320 профиля может предоставить интерпретатору 310 возможность интерпретировать части исходного кода 208 и может предоставить JIT-компилятору 312 возможность компилировать другие части исходного кода 208.

[0027] Когда интерпретатор 310 задействован управляющим сигналом интерпретатора, интерпретатор 310 может интерпретировать и исполнять сформированный байт-код. Интерпретатор 310 можно реализовать в виде интерпретатора JavaScript, интерпретатора VBScript, интерпретатора Python или в виде интерпретатора для другого динамического языка, упомянутого в другом месте в этом документе или известного иным образом. Таким образом, исходный код 208 может, по меньшей мере частично, исполняться в результате работы интерпретатора 310.

[0028] Когда JIT-компилятор 312 задействован управляющим сигналом компилятора, JIT-компилятор 312 может компилировать сформированный байт-код. JIT-компилятор 312 можно реализовать в виде компилятора JavaScript, компилятора VBScript, компилятора Python или в виде компилятора для другого динамического языка, упомянутого в другом месте в этом документе или известного иным образом. JIT-компилятор 312 называется "оперативным" компилятором, потому что конкретные части байт-кода можно компилировать JIT-компилятором 312, когда нужен компилированный байт-код (например, обязательно будет исполнен), вместо предварительного компилирования байт-кода полностью перед исполнением. JIT-компилятор 312 может формировать компилированный байт-код 332, который может иметь вид исполняемого машиной кода или команд.

[0029] JIT-компилятор 312 может выполнять оптимизации кода на основе предположений, как описано выше. JIT-компилятор 312 может вставлять в компилированный байт-код, который формирует, одну или несколько заранее установленных точек ухода. Для каждой точки ухода можно создать таблицу ухода, например таблицу 303 ухода и т. п., в которой может записываться состояние переменных, местоположение в сформированном байт-коде, соответствующее местоположению точки ухода. Таблица ухода может описывать, где искать переменные – в стеке или в регистре машинного кода. JIT-компилятор 312 может формировать таблицы и сохранять их вместе с оптимизированным компилированным байт-кодом 332 (например, машинным кодом). Оптимизированный компилированный байт-код 332 может храниться в хранилище 314 в виде компилированного байт-кода 332 для обращения во время последующего исполнения программы системой 300.

[0030] Когда исполняется оптимизированный компилированный байт-код, оптимизированный компилированный байт-код 332 может приниматься исполнителем 316 машинного кода (который может быть одним или несколькими процессорами, например процессором 142 и т. п.). Лежащее в основе предположение или предположения, на которых основывались оптимизации, можно проверять на верность или неверность в каждой точке ухода. В ответ на определение, что предположение (предположения) является верным, можно продолжать исполнение оптимизированного компилированного байт-кода 332. В ответ на определение, что предположение (предположения) является неверным, исполнение оптимизированного компилированного кода можно прекратить. Таблицу ухода для той точки ухода можно передавать обработчику 336 ухода. Обработчик 336 ухода может восстанавливать состояние (например, значение) переменных, необходимых интерпретатору. Если необходимая интерпретатору переменная стала неактивной, то обработчик 336 ухода может "возрождать" переменную путем переключения состояния переменной с неактивного на активное. Обработчик 336 ухода может создавать экземпляр интерпретатора 310, передавать интерпретатору местоположение в байт-коде, соответствующее точке ухода в оптимизированном компилированном коде, переменные и их местоположения. Поэтому исходный код, из которого формировался байт-код, может таким образом частично исполняться в результате работы JIT-компилятора 312 и исполнителя 316 машинного кода, и может частично исполняться интерпретатором 310.

[0031] Использование уходов может обеспечить некоторое количество оптимизаций. Переменная во многих динамических языках программирования может быть датой, строкой, массивом, целым числом и так далее. В некоторых динамических языках для переменной создается объект, и сохраненное в регистре и впоследствии в таблице местоположение содержит указатель на тот объект. Сам объект может хранить описание объекта и данные для объекта. Таким образом, если переменная a является строкой, то можно создать объект для строки, можно сохранить указатель на объект, и сам объект может распознать, что переменная a является строкой, и может сам задать строку (например, "Hello World"). Одной оптимизацией для этой схемы для случая, в котором переменная предполагается целым числом на основе данных профиля, является сохранение самого целого числа в переменной вместо указателя на объект, созданного для целого числа, или кодированного значения для представления и описания того целочисленного объекта. Одной схемой для непосредственного кодирования целочисленных объектов является использование одного из разрядов слова для хранения индикатора, который обозначает, что значение является целым числом. Таким образом, в случае 32-разрядного процессора один разряд из 32 разрядов может указывать, что содержимое остальных 31 разрядов представляет целочисленное значение, или может указывать, что содержимое остальных 31 разрядов не представляет целочисленное значение.

[0032] Фиг. 1d иллюстрирует пример системы 400, которая может отлаживать машинный код путем перехода от исполнения в собственном режиме к исполнению в интерпретируемом режиме в соответствии с аспектами предмета изобретения, раскрытого в этом документе. Вся система 400 или ее части могут постоянно находиться на одном или нескольких компьютерах или вычислительных устройствах, например компьютерах, описанных ниже по отношению к фиг. 3. Система 400 может содержать систему, которая проиллюстрирована на фиг. 1b и/или фиг. 1c, к которой добавлен отладчик и т. д., который описан в этом документе. Система 400 или ее части могут предоставляться в виде автономной системы или в виде подключаемого модуля либо надстройки. Система 400 может полностью или частично исполняться на компьютере для разработки программного обеспечения, например, компьютере для разработки программного обеспечения, описанном по отношению к фиг. 4. Всей системой 400 или ее частями можно оперировать с помощью инструментов разработки программ. Например, всю систему 400 или ее части можно исполнять в интегрированной среде разработки (IDE), например IDE, которая полнее описана по отношению к фиг. 4, или может быть другой IDE. Систему 400 можно полностью или частично исполнять вне IDE. Система 400 может работать в обозревателе или ассоциироваться с ним, например, Microsoft Internet Explorer®, Mozilla’s Firefox или любом обозревателе, известном в настоящий момент или разработанном в будущем. Следует понимать, что система 400 не ограничивается работой в обозревателе или совместно с ним.

[0033] Система 400 или ее части могут включать в себя информацию, полученную от некой услуги (например, в облаке), или могут работать в облачной вычислительной среде. Облачная вычислительная среда может быть средой, в которой вычислительными услугами не владеют, а предоставляют по требованию. Например, информация может постоянно находиться на нескольких устройствах в сетевом облаке, и/или данные могут храниться на нескольких устройствах в облаке.

[0034] Система 400 может включать в себя один или несколько процессоров, например процессор 142 и т. п., память 144 и одно или несколько из следующего: компилятор 404 языка, JIT-компилятор 408, обработчик 414 ухода, отладчик 416, интерпретатор 418 и/или дисплей 420 отладчика, который может отображать информацию отладки. Компилятор 404 языка, JIT-компилятор 408, обработчик 414 ухода, отладчик 416 и интерпретатор 418 можно реализовать в виде одного или нескольких программных модулей, которые при загрузке в память 144 побуждают один или несколько процессоров 142 и т. п. выполнить действия, приписываемые соответственно компилятору 404 языка, JIT-компилятору 408, обработчику 414 ухода, отладчику 416 и/или интерпретатору 418. Система 400 может включать в себя другие компоненты, известные в данной области техники, которые не показаны.

[0035] Как показано на фиг. 1d, система 400 может включать в себя компилятор языка, например компилятор 404 языка. Компилятор 404 языка может быть компилятором, который принимает исходный код, написанный на конкретном языке программирования, и формирует из него промежуточный язык, например промежуточный язык (IL) 406. Части или весь исходный код можно обрабатывать компилятором 404 языка для создания кода на промежуточном языке, например IL 406. Компилятор 404 языка может принимать исходный код, например исходный код 402 или его части. Исходный код 402 можно написать на любом языке программирования. Исходный код 402 или его части можно интерпретировать путем отправки исходного кода 402 в интерпретатор 418. Таким образом, можно компилировать части исходного кода 402. Части исходного кода 402 можно интерпретировать. То, компилируется или интерпретируется часть программы, может основываться на эвристике производительности: если конкретная часть программы работает быстрее в собственном режиме, то ее можно компилировать в собственном режиме, а если конкретная часть программы работает быстрее в интерпретируемом режиме, то ее можно интерпретировать.

[0036] Как показано на фиг. 1d, система 400 может включать в себя JIT-компилятор, например JIT-компилятор 408. JIT-компилятор 408 может принимать промежуточный язык, например IL 406, и может формировать из него машинный код, например машинный код 410. Машинный код 410 для исполнения можно загружать в процесс, например процесс 412. JIT-компилятор 408 можно реализовать в виде компилятора JavaScript, компилятора VBScript, компилятора Python или в виде компилятора для другого динамического языка или динамического языка сценариев, упомянутого в другом месте в этом документе или известного иным образом. JIT-компилятор 408 называется "оперативным" компилятором, потому что конкретные части программы можно компилировать JIT-компилятором 408, когда нужен компилированный машинный код (например, обязательно будет исполнен), вместо предварительного компилирования машинного кода полностью перед исполнением. JIT-компилятор 408 может формировать компилированный машинный код, имеющий вид исполняемого машиной кода или команд.

[0037] JIT-компилятор 408 может выполнять оптимизации кода на основе предположений, как описано выше. JIT-компилятор 408 может вставлять в компилированный код, который формирует, одну или несколько заданных точек ухода из отладки. Точки ухода из отладки являются местами в программе, в которых отладка в собственном режиме может переходить к отладке в интерпретируемом режиме при условии, что выполняются некоторые условия ухода из отладки. Для программы можно задать точки ухода из отладки, например в начале функции, на обратной петле цикла, когда возвращается функция, когда возвращается вызов вспомогательной функции или библиотеки или когда встречается оператор отладчика. Когда происходит уход из отладки, можно прекратить исполнение машинного кода. Текущее состояние программы, исполняющейся в собственном режиме, можно зафиксировать в записи ухода из отладки, которая может записывать текущую точку исполнения, местоположение в исходном коде 402, соответствующее местоположению точки ухода из отладки, значения переменных и то, где в регистре располагаются значения переменных, и/или то, где в стеке располагаются значения переменных. Запись ухода из отладки для той точки ухода из отладки можно передавать обработчику ухода.

[0038] Как показано на фиг. 1d, система 400 может включать в себя обработчик ухода, например обработчик 414 ухода. Обработчик 412 ухода может принимать одну или несколько записей ухода из отладки. Обработчик 414 ухода может восстанавливать состояние (например, значение) переменных, необходимых интерпретатору. Обработчик 414 ухода может создавать новый кадр для стека. Если необходимая интерпретатору переменная стала неактивной, то обработчик 414 ухода может "возрождать" неактивную переменную путем переключения состояния переменной с неактивного на активное. Обработчик 414 ухода может создавать экземпляр интерпретатора 418, передавать интерпретатору местоположение в исходном коде, соответствующее точке ухода из отладки в машинном коде, и вновь созданный кадр интерпретатора, включающий в себя значения всех восстановленных активных переменных. Если местоположение ухода из отладки находится в участке кода, например функции, то точка, в которой возобновляется отладка в интерпретируемом режиме, может находиться в начале участка кода (например, отладка может возобновляться в начале функции вместо точки, в которой встретилась точка ухода из отладки).

[0039] Когда инициируется уход из отладки, можно прекратить отладку машинного кода. Можно прекратить исполнение машинного кода. Состояние можно фиксировать в записи ухода из отладки, которая записывает текущую точку исполнения, значения переменных и то, где располагаются значения переменных. Значения переменных можно хранить в регистрах CPU или можно хранить в собственном стеке. Запись ухода из отладки для той точки ухода можно передавать обработчику 414 ухода. Обработчик 414 ухода может восстанавливать состояние (например, значение) переменных, необходимых интерпретатору, в созданном для интерпретатора стеке. Обработчик 414 ухода может создавать новый кадр интерпретатора для стека. Если необходимая интерпретатору переменная стала неактивной, то обработчик 414 ухода может "возрождать" переменную путем переключения состояния переменной с неактивного на активное. Обработчик 414 ухода может создавать экземпляр интерпретатора 418, передавать интерпретатору местоположение в исходном коде, соответствующее точке ухода из отладки в машинном коде, и вновь созданный кадр интерпретатора, включающий в себя значения всех восстановленных активных переменных.

[0040] Как показано на фиг. 1d, отладчик, например отладчик 416, может принимать машинный код для отладки. Отладчик, который описан в этом документе, может работать в собственном режиме, означающем, что отладчик может выполнять операции отладки над машинным кодом. Отладчик в соответствии с некоторыми аспектами предмета изобретения, описанного в этом документе, может предоставлять текущие значения переменных программы и информацию стека для отображения на дисплее отладчика. Отладочные операции, включающие в себя проверку переменных, вычисление выражений и модификацию значений, могут использовать собственный кадр в стеке вызова. Всякий раз, когда переменная сохраняется в регистр (например, когда переменная задается в программе), значение также можно сохранить в ячейку стека для функции. Чтобы отслеживать местоположение значения конкретной локальной переменной, в соответствии с аспектами предмета изобретения, описанного в этом документе, каждый раз, когда задается локальная переменная (то есть локальной переменной присваивается значение), ее можно записывать в ячейку стека. Ячейки стека, используемые для локальных переменных для функции, можно группировать, чтобы была одна область стека, в которой можно найти локальные переменные для функции. Таким образом, текущее значение любой локальной переменной для конкретной функции всегда находится в соответствующей ячейке стека, даже если машинный код использует регистр для переменной. Та же самая область стека может использоваться для сброса (то есть, когда имеется больше активных переменных, чем регистров у вычислительного устройства, переменные можно "сбрасывать" из регистров в память). Ячейки стека могут использоваться отладчиком для получения и изменения значений переменных. Для поддержки модификации значений в отладчике рядом с областью стека, в которой сохраняются локальные переменные, может располагаться индикатор. Индикатор может быть флагом, который, будучи установленным, указывает, что локальная переменная в отлаживаемой функции была изменена пользователем. Отлаживаемая функция может быть функцией в самом верхнем кадре стека или функцией в кадре стека под ним. Например, предположим, что встречается точка останова. Пользователь может изменять значение локальной переменной, которая принадлежит функции, ассоциированной с кадром стека, который не является текущим кадром стека, исполняя при этом функцию в собственном режиме. Флаг, указывающий, что изменена локальная переменная в функции, будет устанавливаться в кадре стека, ассоциированном с функцией, чья локальная переменная была изменена пользователем.

[0041] Метаданные функции включают в себя информацию о том, сколько локальных переменных используется в функции. В соответствии с некоторыми аспектами предмета изобретения, описанного в этом документе, для получения значения локальной переменной отладчик может определять значение локальной переменной путем считывания значения в ячейках стека, которые постоянно находятся со смещением от начального местоположения в стеке, равным идентификатору локальной переменной. Для изменения значения локальной переменной отладчик может записывать новое значение в соответствующую ячейку стека и может устанавливать флаг измененной локальной переменной (расположенный в стеке рядом с областью, в которой можно хранить локальные переменные) для указания, что изменена локальная переменная в функции.

[0042] Когда исполнение возвращается в функцию, работающую в собственном режиме, обработчик ухода может проверять флаг измененной локальной переменной. В случае, когда значение локальной переменной изменялось для кадра стека, соответствующего функции, в которую возвращается исполнение, будет установлен флаг, и будет инициирован уход в интерпретируемый режим. Во время ухода значения локальных переменных можно восстанавливать из ячеек стека (вместо регистров), и работающий в интерпретируемом режиме отладчик примет значение, на которое была изменена модифицированная локальная переменная.

[0043] Отладчик может переходить от исполнения в собственном режиме к исполнению в интерпретируемом режиме в заданных точках в программе, называемых точками ухода из отладки. Точки ухода из отладки включают в себя следующее, но не ограничиваются им: в начале функции, на обратной петле цикла (например, после того, как увеличивается счетчик, и счетчик проверен на выход из диапазона), при возврате из вызова функции, при возврате из вызова библиотеки, при возврате из вызова вспомогательной функции, когда встречается оператор языка отладчика, и так далее. Отладчик, который описан в этом документе, может работать в интерпретируемом режиме. Отладчик в интерпретируемом режиме может отлаживать интерпретируемый код. Например, операции отладки, которые управляют исполнением отлаживаемой программы, могут выполняться в интерпретируемом режиме. Операции управления исполнением можно реализовать посредством операций асинхронного останова, пошагового выполнения, точки останова и/или останова по исключению.

[0044] Асинхронный останов может возникать, например, когда пользователь в сеансе отладки приостанавливает исполнение (например, путем активизации возможности приостановки в интерфейсе пользователя отладчика). Приостановка может происходить в любое время. Предполагается, что отладчик останавливает исполнение программы в разумный срок после действия пользователя. Предоставление своевременного отклика на действие пользователя может выполняться путем вставки проверок в местоположения в коде, включающие в себя, но не только: в начале функции, в цикле и т. д. В ответ отладчик может установить флаг перехода, который, будучи установленным, вызывает переход от отладки в собственном режиме к отладке в интерпретируемом режиме. Можно предоставить один флаг перехода для каждого потока в процессе. Когда исполнение машинного кода входит в функцию или переходит в начало цикла, можно проверить флаг перехода. Если флаг перехода установлен, то можно инициировать уход из отладки, и исполнение может перейти от отладки в собственном режиме к отладке в интерпретируемом режиме. Аналогичный функции исходный код можно извлекать и отправлять в интерпретатор. Отладчик может обнаруживать асинхронный останов и может сбрасывать флаг перехода. Асинхронный останов можно завершать путем остановки (прекращения) исполнения и отображения текущего состояния программы на дисплее отладчика.

[0045] Пошаговая работа может быть управляемым пользователем действием, которое заходит в функцию, выходит из функции или обходит функцию или команду. В начале каждой операции пошаговой отладки отладчик может устанавливать флаг типа шага и флаг базы кадра шага. Флаг базы кадра шага можно устанавливать в базу кадра стека текущей функции. Флаг кадра шага можно использовать для проверки глубины стека, чтобы обнаруживать рекурсию. В соответствии с некоторыми аспектами предмета изобретения, раскрытого в этом документе, переход в режим интерпретатора не выполняется, когда исполнение оставляет ту же функцию наверху кадра, что и в начале пошаговой работы в стеке. Например, полагаем, что текущее местоположение находится в функции A, и пользователь намеревается выйти, что вернуло бы вызывающего функцию A в функцию B. Если функция A вызывает другую функцию, которая могла бы быть функцией A или функцией B, когда управление возвращается обратно в функцию A, или функцию B, или в другую функцию, в то время как исходный кадр стека у функции A, когда начинается шаг, по-прежнему находится в стеке, уход из отладки не инициируется.

[0046] Для операции выхода отладчик может установить флаг типа шага в выход. Можно возобновить исполнение программы. Когда исполнение возвращается из текущей функции в другую функцию, исполняющуюся в собственном режиме, обработчик ухода может определить, установлены ли флаг типа шага и флаг кадра шага. Если это так, то базу текущего кадра стека можно сравнить со значением, сохраненным во флаге кадра шага. Если база текущего кадра стека больше, чем значение, сохраненное во флаге кадра шага, то глубина стека уменьшилась, полагая, что стек растет к младшим адресам. В ответ на уменьшение глубины стека можно инициировать уход в режим интерпретатора. Отладчик может перейти к отладке интерпретируемого кода. Исполнение можно прекратить, и текущее состояние программы можно отобразить на дисплее отладчика.

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

[0048] Для операций отладки с обходом функцию для обхода не обязывают выполняться в режиме интерпретатора, а выполняют обычно в собственном режиме. Уход можно инициировать, только когда пошаговая работа проводилась на последнем операторе текущей функции и приводит к возврату из функции. В ответ на уменьшение глубины стека инициируется уход в отладку в режиме интерпретатора. Отладчик может отображать текущее состояние программы на дисплее отладчика.

[0049] Когда пользователь устанавливает точку останова в функции, отладчик может обновить метаданные функции путем увеличения счетчика, который отслеживает количество точек останова в функции. Когда исполняется функция (функция начинает исполнение либо функция вызывает другую функцию, и вызванная функция возвращается обратно в вызывающую функцию), проверяются условия, инициирующие уход из отладки. Если подсчет точек останова для текущей функции больше нуля, то можно инициировать уход из отладки, и отладчик может перейти к исполнению в интерпретируемом режиме. Отладчик может остановиться на операторе, на котором установлена точка останова, и может отобразить текущую точку исполнения на дисплее отладчика.

[0050] Если встречается точка останова по исключению/продолжению после исключения, то работающая в отладчике программа может сообщить о событии исключения отладчику и может продолжить исполнение со следующего оператора после оператора, который вызывает исключение, или может задать возобновление исполнения на конкретном операторе и продолжить с того оператора. Для уведомления отладчика машинный код может использовать "выдающую вспомогательную" функцию, чтобы все выдачи направлялись через нее. Отладчик может остановиться на операторе, который выдал исключение, и может отобразить значения переменных на дисплее отладчика.

[0051] Для перехода к следующему оператору (если программа работала в собственном режиме, когда было выдано исключение) компилятор может идентифицировать все места в программе, где может возникнуть исключение. Исключения могут выдаваться явным оператором генерации исключения, когда выполняется вызов вспомогательной функция или когда выполняется вызов библиотечной функции. Например, оператор удаления JavaScript, который удаляет свойство из объекта, может выдать исключение, если объект является пустым или неопределенным. Исключение выдается, потому что пустой или неопределенный объект не имеет никаких свойств. Здесь "вспомогательная" относится к функции, реализованной на языке (например, в механизме JavaScript), обычно в машинном коде, и используется для выполнения некоторых операций или языковых конструкций, например, удалить свойство из объекта. "Библиотечная функция" относится к функции, которая реализует библиотечную подпрограмму. Например, JavaScript имеет некоторое количество библиотечных объектов, например "строка". Объект "строка" имеет некоторое количество операций, включая, например, string.concat. String.concat не является подпрограммой языка в чистом виде. В некоторых языках может быть нецелесообразно различать библиотечную функцию и вспомогательную функцию, но в некоторых языках, например JavaScript, но не только, они отличаются в следующем смысле: вызов библиотеки технически является тем же самым, что и вызов функции сценария (то есть пользователя), и соответственно может быть перехвачен. Например, пользователь может назначить функцию сценария для string.concat. Следующий раз, когда вызывается string.concat, механизм вызовет переназначенную функцию пользователя вместо исходной функции string.concat. Вспомогательные функции нельзя перехватить, и они обычно вызываются непосредственно в машинном/компилированном коде.

[0052] Чтобы продолжить после возникновения исключения в машинном коде, каждый вызов вспомогательной функции и каждый вызов библиотеки можно оформить в виде блока операторов try-catch. В части "try" блока try-catch можно вызывать вспомогательную функцию. Значения, возвращенные исходной вспомогательной функцией, можно сохранить в локальную переменную. В части "catch" блока try-catch, если вариант "продолжить после исключения" разрешен в отладчике интерпретируемого режима, то можно установить флаг исключения и продолжения. После части "catch" блока try-catch можно вернуть значение исходной вспомогательной функции. Проверку ухода из отладки для продолжения после исключения можно вставлять после каждого возврата из каждого вызова вспомогательной функции или после каждого возврата из вызова библиотеки. Проверка ухода из отладки может проверять флаг исключения и продолжения и может инициировать уход из отладки в режим интерпретатора, если флаг установлен. Отладчик может перейти в режим интерпретатора, обеспечивающий продолжение управления исполнением в отладчике. Например, если бы ответом пользователя на "останов по исключению" был обход команды, то отладчик перешел бы к следующему оператору. Если бы ответом пользователя на "останов по исключению" было продолжение, то отладчик продолжил бы исполнение оставшейся части функции в интерпретируемом режиме.

[0053] Отладчик может отображать информацию отладки на устройстве отображения отладчика, например дисплее 420 отладчика. Отладчик может отображать на дисплее отладчика информацию из стека вызова, значения локальных переменных и т. п.

[0054] Фиг. 2 иллюстрирует способ 250, который может переходить от отладки в собственном режиме к отладке в интерпретируемом режиме в соответствии с аспектами предмета изобретения, раскрытого в этом документе. Описанный на фиг. 2 способ можно применить на практике с помощью системы, например, но не только, описанной по отношению к фиг. 1d. Хотя способ 250 описывает последовательность операций, которые выполняются последовательно, нужно понимать, что способ 250 не ограничивается порядком той последовательности. Например, некоторые операции могут происходить в порядке, отличном от описанного. К тому же одна операция может происходить одновременно с другой операцией. В некоторых случаях выполняются не все описанные операции.

[0055] Во время работы система, например описанная на фиг. 1d система, может работать следующим образом. На этапе 251 можно задать точки ухода из отладки для программы. Точки ухода из отладки являются точками в программе, где может происходить переход от отладки в собственном режиме к отладке в интерпретируемом режиме. Точки ухода из отладки включают в себя следующее, но не ограничиваются им: в начале функции, на обратной петле цикла (например, после того, как увеличивается счетчик, и счетчик проверен на выход из диапазона), при возврате из вызова функции, при возврате из вызова библиотеки, при возврате из вызова вспомогательной функции, когда встречается оператор языка отладчика, и так далее. Когда программа компилируется, можно вставлять отладочную обработку в точки ухода из отладки.

[0056] На этапе 252 можно инициировать сеанс отладки. Когда инициируется сеанс отладки, можно отбросить любой машинный код, ранее сформированный для программы, работающей в процессе, к которому подключен отладчик. На этапе 254 можно сформировать машинный код режима отладки из программы, к которой подключен отладчик. Машинный код режима отладки может включать в себя обработку, ассоциированную с переходом от отладки машинного кода к отладке интерпретируемого кода. Машинный код режима отладки можно загружать в процесс. Когда функция компилируется в машинный код в режиме отладки, в каждой точке ухода в функции можно вставлять в машинный код одну или несколько проверок условий ухода. Проверки условий ухода можно вставлять во время фазы компиляции, которая формирует внутреннее собственное представление программы. Проверки условий ухода можно вставлять в код, когда фиксируются данные для записи ухода. Проверки условий ухода могут включать в себя проверку состояния (установлено или сброшено) или значений различных флагов либо индикаторов, управляемых отладчиком.

[0057] Индикаторы или флаги ухода из отладки могут включать в себя, но не ограничиваются: индикатор, который, будучи установленным, указывает, что отладчик должен перейти из собственного режима в интерпретируемый режим, индикатор, который, будучи установленным, указывает, что функция содержит в себе точку останова, индикатор, который задает адрес стека для обнаружения рекурсии, индикатор, который указывает тип пошаговой работы для выполнения, индикатор, который, будучи установленным, указывает тип пошаговой работы (заход, выход, обход), которую выполняет отладчик, индикатор в стеке, который, будучи установленным, указывает, что в текущем кадре стека изменилось поле, и индикатор, который, будучи установленным, используется для вставки явного безусловного ухода.

[0058] На этапе 256 машинный код может исполняться в режиме отладки. Когда исполнение достигает точки ухода из отладки, могут проверяться различные условия ухода. Условия ухода, проверяемые для одного типа сценария ухода из отладки, могут отличаться от условий ухода, проверяемых для других типов уходов. Например, предположим, что пользователь приостанавливает исполнение программы, работающей в отладчике, в начале функции или на обратной петле цикла (когда увеличивается счетчик цикла, и счетчик проверяется на нахождение в диапазоне). Отладчик может установить флаг, который вынуждает машинный код уйти в режим интерпретатора, когда машинный код, вставленный в начале функции или на обратной петле цикла, выясняет, установлен ли флаг, который вынуждает машинный код уйти в режим интерпретатора. Вместо этого предположим, что пользователь выбирает в UI отладчика вариант, который заходит в функцию. Отладчик может устанавливать флаг шага, который указывает, какой тип пошаговой работы был запрошен. Проверка, выполняемая машинным кодом, может уйти в ответ на определение, что значение флага шага устанавливается в "заход". Предположим, что действие пользователя ставит точку останова где-то в функции. Отладчик может увеличить флаг, который следит за количеством точек останова в функции. Если подсчет точек останова в текущей функции больше нуля, то инициируется уход, и исполнение переходит в интерпретируемый режим.

[0059] Когда исполнение достигает кадра, который содержит точку останова, исполнение программы в машинном коде прекращается, обработчик ухода принимает запись ухода из отладки, функция отправляется в интерпретатор, и отладка интерпретируемой функции продолжается с начала функции. На этапе 260 в ответ на определение, что выполнено по меньшей мере одно условие ухода на этапе 258, можно прекратить отладку в собственном режиме, и отладка может перейти в интерпретируемый режим. Переход от отладки машинного кода к отладке соответствующего интерпретируемого кода можно инициировать пользовательским действием или можно инициировать, когда встречается явный безусловный уход.

[0060] На этапе 262 можно восстанавливать переменные интерпретатора из записи ухода. Если выполняется какое-нибудь условие ухода, то можно сделать снимок состояния исполнения (местоположение и значение переменных, местоположение и значение временных переменных и значения стека) и сохранить в записи ухода из отладки. Запись ухода из отладки можно отправить обработчику ухода. Обработчик ухода может создать экземпляр интерпретатора и может настроить кадр стека интерпретатора для интерпретатора. На этапе 264 можно возобновить отладку в интерпретируемом режиме. На этапе 266, если никакое условие ухода не обнаруживается на этапе 258, то можно продолжить отладку в собственном режиме.

Пример подходящей вычислительной среды

[0061] Чтобы предоставить контекст для различных аспектов предмета изобретения, раскрытого в этом документе, фиг. 3 и нижеследующее обсуждение предназначены для предоставления краткого общего описания подходящей вычислительной среды 510, в которой можно реализовать различные варианты осуществления предмета изобретения, раскрытого в этом документе. Хотя раскрытый в этом документе предмет изобретения описывается в общем контексте исполняемых компьютером инструкций, например программных модулей, исполняемых одним или несколькими компьютерами или другими вычислительными устройствами, специалисты в данной области техники признают, что части раскрытого в этом документе предмета изобретения также можно реализовать совместно с другими программными модулями и/или с сочетанием аппаратных средств и программного обеспечения. Как правило, программные модули включают в себя процедуры, программы, объекты, физические объекты, структуры данных и так далее, которые выполняют конкретные задачи или реализуют конкретные типы данных. Как правило, функциональные возможности программных модулей могут быть объединены или распределены по желанию в различных вариантах осуществления. Вычислительная среда 510 является лишь одним примером подходящей операционной среды и не предназначена для ограничения области применения или функциональных возможностей раскрытого в этом документе предмета изобретения.

[0062] Со ссылкой на фиг. 3 описывается вычислительное устройство в виде компьютера 512. Компьютер 512 может включать в себя по меньшей мере один блок 514 обработки, системную память 516 и системную шину 518. По меньшей мере один блок 514 обработки может исполнять команды, которые сохраняются в памяти, например в системной памяти 516, но не только. Блок 514 обработки может быть любым из различных доступных процессоров. Например, блок 514 обработки может быть блоком обработки графики (GPU). Команды могут быть командами для реализации функциональных возможностей, осуществляемых одним или несколькими рассмотренными выше компонентами или модулями, или командами для реализации одного или нескольких описанных выше способов. В качестве блока 514 обработки также могут применяться сдвоенные микропроцессоры и другие многопроцессорные архитектуры. Компьютер 512 может использоваться в системе, которая поддерживает визуализацию графики на экране дисплея. В другом примере по меньшей мере часть вычислительного устройства может использоваться в системе, которая содержит блок графический обработки. Системная память 516 может включать в себя энергозависимую память 520 и энергонезависимую память 522. Энергонезависимая память 522 может включать в себя постоянное запоминающее устройство (ROM), программируемое ROM (PROM), электрически программируемое ROM (EPROM) или флэш-память. Энергозависимая память 520 может включать в себя оперативное запоминающее устройство (RAM), которое может действовать как внешняя кэш-память. Системная шина 518 соединяет физические объекты системы, включая системную память 516, с блоком 514 обработки. Системная шина 518 может быть любым из нескольких типов, включая шину памяти, контроллер памяти, периферийную шину, внешнюю шину или локальную шину, и может использовать любую разновидность доступных шинных архитектур. Компьютер 512 может включать в себя хранилище данных, доступное блоку 514 обработки посредством системной шины 518. Хранилище данных может включать в себя исполняемые команды, 3D-модели, материалы, текстуры и так далее для визуализации графики.

[0063] Компьютер 512 обычно включает в себя ряд считываемых компьютером носителей, например энергозависимых и энергонезависимых носителей, съемных и несъемных носителей. Считываемые компьютером носители можно реализовать по любому способу или технологии для хранения информации, такой как считываемые компьютером инструкции, структуры данных, программные модули и другие данные. Считываемые компьютером носители включают в себя считываемые компьютером носители информации (также называемые компьютерными носителями информации) и средства связи. Компьютерные носители информации включают в себя физические (материальные) носители, например, но не только, RAM, ROM, EEPROM, флэш-память или другую технологию памяти, компакт-диск, цифровые универсальные диски (DVD) или другой накопитель на оптических дисках, магнитные кассеты, магнитную ленту, накопитель на магнитных дисках или другие магнитные запоминающие устройства, которые могут хранить нужные данные и к которым может обращаться компьютер 512. Средства связи включают в себя средства, например, но не только, сигналы связи, модулированные несущие или любые другие неосязаемые средства, которые могут использоваться для передачи нужной информации и к которым может обращаться компьютер 512.

[0064] Следует понимать, что фиг. 3 описывает программное обеспечение, которое может действовать как посредник между пользователями и ресурсами компьютера. Это программное обеспечение может включать в себя операционную систему 528, которая может храниться в накопителе 524 на дисках и которая может распределять ресурсы компьютера 512. Накопитель 524 на дисках может быть накопителем на жестком диске, подключенным к системной шине 518 посредством интерфейса несъемного запоминающего устройства, например интерфейса 526. Системные приложения 530 пользуются управлением ресурсами посредством операционной системы 528 через программные модули 532 и программные данные 534, сохраненные либо в системной памяти 516, либо в накопителе 524 на дисках. Следует понимать, что компьютеры можно реализовать с различными операционными системами или сочетаниями операционных систем.

[0065] Пользователь может вводить команды или информацию в компьютер 512 посредством устройства (устройств) 536 ввода. Устройства 536 ввода включают в себя, но не ограничиваются, указательное устройство, например мышь, шаровой манипулятор, перо, сенсорную панель, клавиатуру, микрофон, системы распознавания речи и распознавания жестов и т. п. Эти и другие устройства ввода подключаются к блоку 514 обработки посредством системной шины 518 через интерфейсный порт (порты) 538. Интерфейсный порт (порты) 538 может представлять последовательный порт, параллельно порт, универсальную последовательную шину (USB) и т. п. Устройство (устройства) 540 вывода может использовать такой же тип портов, что и устройства ввода. Выходной адаптер 542 предоставляется для иллюстрации, что имеются некоторые устройства 540 вывода типа монитора, динамиков и принтеров, которые требуют конкретные адаптеры. Выходные адаптеры 542 включают в себя, но не ограничиваются, видеоплаты и звуковые платы, которые обеспечивают соединение между устройством 540 вывода и системной шиной 518. Возможности ввода и вывода могут обеспечивать другие устройства и/или системы либо устройства, например удаленный компьютер (компьютеры) 544.

[0066] Компьютер 512 может работать в сетевой среде с использованием логических соединений с одним или несколькими удаленными компьютерами, например удаленным компьютером (компьютерами) 544. Удаленный компьютер 544 может быть персональным компьютером, сервером, маршрутизатором, сетевым ПК, одноранговым устройством или другим общим узлом сети, и обычно включает в себя многие или все элементы, описанные выше по отношению к компьютеру 512, хотя на фиг. 3 проиллюстрировано только запоминающее устройство 546. Удаленный компьютер (компьютеры) 544 может логически подключаться посредством соединения (соединений) 550 связи. Сетевой интерфейс 548 включает в себя сети связи, например локальные сети (LAN) и глобальные сети (WAN), но также может включать в себя другие сети. Соединение (соединения) 550 связи относится к аппаратным средствам/программному обеспечению, применяемым для подключения сетевого интерфейса 548 к шине 518. Соединение (соединения) 550 связи может быть внутренним или внешним по отношению к компьютеру 512 и включает в себя внутренние и внешние технологии, например модемы (телефонные, кабельные, DSL и беспроводные) и адаптеры ISDN, платы Ethernet и так далее.

[0067] Следует понимать, что показанные сетевые соединения являются лишь примерами, и может быть использовано другое средство установления линии связи между компьютерами. Средний специалист в данной области техники может понять, что компьютер 512 или другое клиентское устройство можно развернуть как часть компьютерной сети. В этой связи раскрытый в этом документе предмет изобретения может относиться к любой компьютерной системе, имеющей любое количество памяти или запоминающих устройств и любое количество приложений и процессов, происходящих между любым количеством запоминающих устройств или томов. Аспекты раскрытого в этом документе предмета изобретения могут применяться к среде с серверами и клиентами, развернутыми в сетевой среде, имеющей удаленное или локальное хранилище. Аспекты раскрытого в этом документе предмета изобретения также могут применяться к автономному вычислительному устройству, обладающему функциональными возможностями языка программирования, возможностями интерпретации и исполнения.

[0068] Фиг. 4 иллюстрирует интегрированную среду 600 разработки (IDE) и общеязыковую среду 602 выполнения. IDE 600 может позволять пользователю (например, разработчику, программисту, проектировщику, кодеру и т. п.) проектировать, кодировать, компилировать, тестировать, запускать, редактировать, отлаживать или собирать программу, набор программ, веб-сайты, веб-приложения и веб-службы в компьютерной системе. Компьютерные программы могут включать в себя исходный код (компонент 610), созданный на одном или нескольких языках исходного кода (например Visual Basic, Visual J#, C++, C#, J#, Java Script, APL, COBOL, Pascal, Eiffel, Haskell, ML, Oberon, Perl, Python, Scheme, Smalltalk и т. п.). IDE 600 может предоставлять среду разработки машинного кода или может обеспечивать разработку управляемого кода, который выполняется в виртуальной машине, или может предоставлять их сочетание. IDE 600 может предоставлять среду разработки управляемого кода с использованием платформы Microsoft.NET™. Компонент 650 промежуточного языка можно создать из компонента 610 исходного кода и компонента 611 машинного кода с использованием ориентированного на конкретный язык компилятора 620 исходного кода, использующего инструмент 652 моделирования и хранилище 653 моделей, а компонент 611 машинного кода (например, исполняемые машиной инструкции) создается из компонента 650 промежуточного языка с использованием компилятора 660 промежуточного языка (например, оперативного (JIT) компилятора), когда исполняется приложение. То есть, когда исполняется приложение на промежуточном языке (IL), оно компилируется при исполнении в подходящий машинный язык для платформы, на которой оно исполняется, посредством этого создавая переносимый код для нескольких платформ. В качестве альтернативы в других вариантах осуществления программы можно компилировать в машинный язык машинного кода (не показан), подходящий для предназначенной платформы.

[0069] Пользователь посредством интерфейса 640 пользователя и редактора 651 исходного кода в IDE 600 может создавать и/или редактировать компонент исходного кода в соответствии с известными методиками разработки программного обеспечения и определенными логическими и синтаксическими правилами, ассоциированными с конкретным исходным языком. После этого компонент 610 исходного кода можно компилировать посредством компилятора 620 исходного кода, при помощи чего можно создать представление программы на промежуточном языке, например сборку 630. Сборка 630 может содержать компонент 650 промежуточного языка и метаданные 642.

Архитектуру приложения можно проверить перед развертыванием.

[0070] Различные методики, описанные в этом документе, можно реализовать применительно к аппаратным средствам или программному обеспечению либо к их сочетанию, где это целесообразно. Таким образом, описанные в этом документе способы и устройство или некоторые их аспекты либо части могут принимать вид программного кода (то есть команд), воплощенного в материальных носителях, например гибких дисках, компакт-дисках, жестких дисках или любом другом считываемом компьютером носителе информации, где, когда программный код загружается в машину и исполняется машиной, например компьютером, машина становится устройством для применения на практике аспектов раскрытого в этом документе предмета изобретения. При использовании в данном документе термин "считываемый компьютером носитель информации" следует понимать исключающим любой механизм, который предоставляет (то есть хранит и/или передает) любой вид распространяемых сигналов. В случае исполнения программного кода на программируемых компьютерах вычислительное устройство, как правило, будет включать в себя процессор, читаемый процессором носитель информации (включая энергозависимую и энергонезависимую память и/или запоминающие элементы), по меньшей мере одно устройство ввода и по меньшей мере одно устройство вывода. Одну или несколько программ, которые могут использовать создание и/или реализацию аспектов моделей программирования предметной области, например, посредством использования API обработки данных или т. п., можно реализовать на высокоуровневом процедурном или объектно-ориентированном языке программирования, чтобы осуществлять связь с компьютерной системой. Однако программу (программы) при желании можно реализовать на языке ассемблера или машинном языке. В любом случае язык может быть компилируемым или интерпретируемым языком, объединенным с аппаратными реализациями.

[0071] Несмотря на то, что предмет изобретения описан на языке, характерном для структурных признаков и/или методологических действий, необходимо понимать, что предмет изобретения, определенный в прилагаемой формуле изобретения, не обязательно ограничивается описанными выше конкретными признаками или действиями.

Похожие патенты RU2668973C2

название год авторы номер документа
КОМПИЛЯЦИЯ ИСПОЛНЯЕМОГО КОДА В МЕНЕЕ ДОВЕРЯЕМОМ АДРЕСНОМ ПРОСТРАНСТВЕ 2007
  • Райтон Дэвид Чарльз
  • Юноки Роберт Садао
RU2439665C2
РЕАЛИЗАЦИЯ КОМПЬЮТЕРНОЙ МНОГОЗАДАЧНОСТИ ЧЕРЕЗ ВИРТУАЛЬНУЮ ОРГАНИЗАЦИЮ ПОТОЧНОЙ ОБРАБОТКИ 2001
  • Файнберг Мэттью А.
RU2286595C2
СПОСОБ ПРЕДОТВРАЩЕНИЯ ОБРАТНОГО ИНЖИНИРИНГА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, НЕАВТОРИЗОВАННОЙ МОДИФИКАЦИИ И ПЕРЕХВАТА ДАННЫХ ВО ВРЕМЯ ВЫПОЛНЕНИЯ 2006
  • Асипов Керен
  • Асипов Борис
RU2439669C2
КЭШИРОВАНИЕ ГЕНЕРИРУЕМОГО ВО ВРЕМЯ ВЫПОЛНЕНИЯ КОДА 2009
  • Херринг Натан
  • Райтон Дэвид К.
RU2520344C2
СПОСОБ КОМПОНОВКИ (СБОРКИ) ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ 2005
  • Шагов Георгий Михайлович
RU2306597C2
СИСТЕМА И СПОСОБ ДЕКЛАРАТИВНОГО ОПРЕДЕЛЕНИЯ И ИСПОЛЬЗОВАНИЯ ПОДКЛАССОВ ВНУТРИ РАЗМЕТКИ 2003
  • Рамани Сандарам
  • Релая Роберт А.
  • Богдан Джеффри Л.
RU2347269C2
СИСТЕМА И СПОСОБ РАСПРЕДЕЛЕННЫХ ВЫЧИСЛЕНИЙ 2010
  • Богданов Александр Яковлевич
RU2554509C2
СПОСОБ ЭМУЛЯЦИИ ВЫЗОВОВ СИСТЕМНЫХ ФУНКЦИЙ ДЛЯ ОБХОДА СРЕДСТВ ПРОТИВОДЕЙСТВИЯ ЭМУЛЯЦИИ 2012
  • Белов Сергей Юрьевич
RU2514141C1
СИСТЕМЫ И СПОСОБЫ УПРАВЛЕНИЯ ДРАЙВЕРАМИ В ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЕ 2002
  • Уилт Николас П.
  • Миллер Джеймс
RU2304305C2
КОДИРОВАНИЕ И ИНИЦИАЛИЗАЦИЯ СЛУЖЕБНЫХ МЕТАДАННЫХ ПРИЛОЖЕНИЙ 2020
  • Трепаков, Иван Сергеевич
  • Павлов, Павел Евгеньевич
RU2827021C1

Иллюстрации к изобретению RU 2 668 973 C2

Реферат патента 2018 года ОТЛАДКА МАШИННОГО КОДА ПУТЕМ ПЕРЕХОДА ОТ ИСПОЛНЕНИЯ В СОБСТВЕННОМ РЕЖИМЕ К ИСПОЛНЕНИЮ В ИНТЕРПРЕТИРУЕМОМ РЕЖИМЕ

Изобретение относится к области вычислительной техники. Техническим результатом является обеспечение перехода от отладки машинного кода к отладке интерпретируемого кода для программы. Двухрежимный отладчик может отлаживать машинный код или интерпретируемый код. Переход между режимами можно инициировать по заданным условиям ухода. Программу можно отлаживать путем подключения отладчика и компилирования программы в машинный код согласно отладчику. В заданных точках в программе отладка может переходить из собственного режима в интерпретируемый режим. Можно прекращать отладку машинного кода, можно фиксировать текущее состояние и можно создавать экземпляр интерпретатора. Можно создавать стек интерпретатора и можно заполнять его зафиксированным текущим состоянием. Отладочные операции, которые включают в себя управление исполнением: приостановка исполнения, продолжение исполнения, заход, выход или обход участка кода и так далее, могут происходить в интерпретируемом режиме, что обычно проще реализовать. Отладочные операции, которые включают в себя проверку и модификацию переменных, могут происходить в собственном режиме. 3 н. и 7 з.п. ф-лы, 7 ил.

Формула изобретения RU 2 668 973 C2

1. Вычислительная система, содержащая:

по меньшей мере один процессор вычислительного устройства;

память вычислительного устройства; и

байт-код (325), сформированный из исходного кода;

отладчик, содержащий по меньшей мере один программный модуль, загруженный в память, побуждающий упомянутый по меньшей мере один процессор:

в режиме отладки вставить в машинный код, сформированный компилятором из байт-кода, по меньшей мере одну точку ухода, при этом упомянутая по меньшей мере одна точка ухода является местоположением в машинном коде, в котором отладка в собственном режиме может переходить к отладке в интерпретируемом режиме при условии, что выполняются некоторые условия ухода;

исполнить машинный код; и

в ответ на обнаружение в точке ухода, что по меньшей мере одно условие ухода отладки выполнено, перейти от отладки машинного кода в собственном режиме к отладке интерпретируемого кода, соответствующего подвергаемому отладке машинному коду, в интерпретируемом режиме.

2. Система по п. 1, дополнительно содержащая:

по меньшей мере один программный модуль, загруженный в память, побуждающий упомянутый по меньшей мере один процессор:

принять текущее состояние машинного кода, исполняющегося согласно отладчику;

создать экземпляр интерпретатора;

создать кадр стека интерпретатора для экземпляра интерпретатора; и

заполнить кадр стека интерпретатора для созданного экземпляра интерпретатора текущим состоянием машинного кода.

3. Система по п. 1, дополнительно содержащая:

по меньшей мере один программный модуль, загруженный в память, побуждающий упомянутый по меньшей мере один процессор:

принять заданные местоположения ухода для программы, содержащие по меньшей мере одно из:

в начале функции, на обратной петле цикла, когда осуществляется возврат функции, когда осуществляется возврат вызова вспомогательной функции, когда осуществляется возврат вызова библиотеки или когда встречается оператор отладчика.

4. Система по п. 1, дополнительно содержащая:

по меньшей мере один программный модуль, загруженный в память, побуждающий упомянутый по меньшей мере один процессор:

перейти к отладке интерпретируемого кода, представляющего программу, в ответ на прием операции управления исполнением.

5. Система по п. 1, дополнительно содержащая:

по меньшей мере один программный модуль, загруженный в память, побуждающий упомянутый по меньшей мере один процессор:

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

6. Способ отладки машинного кода, содержащий этапы, на которых:

формируют байт-код (325) из исходного кода;

с помощью процессора вычислительного устройства принимают по меньшей мере одну точку ухода отладки для байт-кода, причем по меньшей мере одна точка ухода отладки является местоположением в машинном коде, сформированном из байт-кода, в котором отладка переходит от отладки машинного кода в собственном режиме к отладке интерпретируемого кода для программы в интерпретируемом режиме в ответ на определение, что по меньшей мере одно условие ухода отладки выполнено;

инициируют сеанс отладки для программы;

формируют с помощью компилятора машинный код из байт-кода для отладки;

исполняют (256) сформированный машинный код согласно отладчику;

продолжают (260) исполнение байт-кода, соответствующего подвергаемому отладке машинному коду, в интерпретируемом режиме согласно отладчику, в ответ на определение, что по меньшей мере одно условие ухода отладки, ассоциированное с точкой ухода, выполнено;

восстанавливают (262) переменные интерпретатора, соответствующие переменным, ассоциированным с исполняемым машинным кодом; и

возобновляют (264) отладку программы в интерпретируемом режиме в точке, в которой отладка машинного кода прекращена.

7. Способ по п. 6, дополнительно содержащий этап, на котором:

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

8. Способ по п. 6, дополнительно содержащий этап, на котором:

переходят к отладке в интерпретируемом режиме в ответ на прием операции отладки, содержащей операцию управления исполнением, содержащую одну из операции асинхронного останова, пошаговой работы, точки останова или операции останова по исключению.

9. Способ по п. 6, дополнительно содержащий этап, на котором:

определяют, в ответ на уменьшение глубины стека, что условие ухода отладки было выполнено, причем определение содержит сравнение базы текущего кадра стека с флагом кадра шага, установленным отладчиком.

10. Считываемый компьютером носитель информации, содержащий исполняемые компьютером команды, которые при исполнении побуждают по меньшей мере один процессор вычислительного устройства выполнить по меньшей мере один из способов по пп. 6-9.

Документы, цитированные в отчете о поиске Патент 2018 года RU2668973C2

Изложница с суживающимся книзу сечением и с вертикально перемещающимся днищем 1924
  • Волынский С.В.
SU2012A1
US 6249907 B1, 19.06.2001
Пломбировальные щипцы 1923
  • Громов И.С.
SU2006A1
СПОСОБ ДИНАМИЧЕСКОЙ ИНСТРУМЕНТАЦИИ 2008
  • Геренков Алексей Анатольевич
  • Комков Леонид Владимирович
RU2390821C1

RU 2 668 973 C2

Авторы

Колтачев, Михаил

Ханделвал, Никхил

Ганди, Акрош

Даты

2018-10-05Публикация

2014-06-03Подача