Pull to refresh

Используем движок Javascript от IE9 без самого IE9

JavaScript *
    По следам моего хабратопика про тестирование ServerSide решил опубликовать небольшой информационный пост о том, как использовать движок Microsoft JScript 9.0 вне IE 9. А точнее самым доступным способом — через Windows Script Host.
     Какая от этого может быть польза? Да хотя бы для тестирования производительности исключительно JavaScript, вне зависимости от рендеринга HTML. Можно протестировать свою будущую <подставь свое>-killer JavaScript библиотеку в более приспособленном для автоматического тестирования окружении. Да мало ли применений может придумать хабрачитатель для свежей версии Javascript движка.
В общем, тем кто заинтересовался, добро пожаловать под кат.

    Для начала должен разочаровать пользователей Windows XP и ниже. Несмотря на то, что Microsoft аргументирует невозможность запуска IE9 под Windows XP тем, что там отсутствует поддержка Direct2D, движок IE9, которому на Direct2D грубо говоря «наплевать», под Windows XP работать все равно не будет. Быть может и возможно откомпилировать движок под Windows XP, но нам доступны только версии движка, которые будут работать лишь в Windows Vista и Windows 7.
Также хочу предостеречь читателей от необдуманных действий с системой. Если вы не понимаете, что и зачем делается — лучше этого не делать.

    Что, собственно, представляет из себя движок JScript от Microsoft? Это DLL модуль, который находится обычно по пути %WinDir%\System32\jscript.dll. Модуль содержит реализацию набора COM интерфейсов, согласно спецификации Microsoft Active Scripting Engine, а значит, он может использоваться не только в IE, но и в любом приложении, которое реализует COM интерфейсы Microsoft Active Scripting Host. По реализации всех этих интерфейсов существует довольно много примеров для различных языков программирования, поскольку технология относительно старая и развитая. Но нам не обязательно реализовывать эти интерфейсы, поскольку они уже реализованы в приложениях Windows Script Host, которые являются частью любой современной десктопной версии Windows. Это приложения wscript.exe и cscript.exe. Wscript.exe — это GUI приложение, а cscript.exe — это консольное приложение. Впрочем, сценарии поведения этих модулей могут меняться в зависимости от параметров командной строки.
Посмотреть все эти параметры можно, вызвав консольный командный интерпретатор Windows

cmd

и набрав в командной строке

wscript.exe /?

или

сscript.exe /?.

    Чтобы посмотреть какая версия движка используется у вас в системе, достаточно создать простой файл getversion.js с таким кодом:
  1.  
  2. WScript.Echo("Microsoft JScript "+ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion() + "." + ScriptEngineBuildVersion() );
  3.  


и выполнить команду:

сscript.exe getversion.js

    Из названия понятно, что технология Microsoft Active Scripting не ограничивается лишь движком JavaScript. Существуют реализации VBScript, PHP, Perl и другие. Какой движок использовать для конкретного файла скрипта, Windows Script Host определяет по расширению имени файла, который подается на исполнение. За расширением закрепляется определенный GUID(уникальный идентификатор) COM объекта-движка интерпретатора скриптов. Для JScript это:

{f414c260-6ac0-11cf-b6d1-00aa00bbbb58}

    Если поискать в реестре Windows эту строку, то можно увидеть, какой модуль зарегистрирован в качестве интерпретатора JScript в Windows. Обычно это %WinDir%\System32\jscript.dll. Но вы можете подменить эту ветку реестра, и зарегистрировать модуль другой версии. К сожалению, все версии JScript используют один и тот же GUID, поэтому нельзя использовать одновременно несколько версий JScript движков. В моем тесте производительности JavaScript я использовал модификации реестра через *.reg файлы, которые подменяли регистрацию модуля перед соответствующим тестом, а затем восстанавливали оригинальный движок.
    Какое это имеет отношение к использованию движка IE9? Поскольку IE9 еще официально не выпущен и доступен лишь в тестовой версии, инсталлятор IE9, судя по всему, не подменяет движок в системе, а IE9 использует свою версию движка, минуя регистрацию по умолчанию в реестре. Поэтому движок версии 9 не доступен в Windows Script Host. Мы можем исправить ситуацию при установленной тестовой версии IE9, подменив запись в реестре на:

  1.  
  2. [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{f414c260-6ac0-11cf-b6d1-00aa00bbbb58}\InprocServer32]
  3. @="C:\\Windows\\System32\\jscript9.dll" "ThreadingModel"="Both"
  4.  


и выполнив

сscript.exe getversion.js

убедиться, что теперь используется новый движок.

    Более того, совсем не обязательно устанавливать IE9. Достаточно «выдрать» соответствующую библиотеку из установочного пакета Microsoft и зарегистрировать ее в качестве движка JScript, что я и сделал.
Установочный пакет для своей версии Windows (~19 Мб) можно скачать тут:

http://windows.microsoft.com/ru-RU/internet-explorer/download/ie-9/worldwide

    Пакет открывается любым Zip архиватором. Я использовал 7-Zip. Находим в нем файл jscript9.dll — это интерпретатор JScript v9.0. Рядышком лежит jscript.dll — это интерпретатор JScript v5.8 от IE8. Почему такая чехарда с версиями — тоже очень интересный вопрос, ответа на который я не знаю. Неужто не дают покоя лавры Google V8?
    Понятно, что не стоит использовать новый движок в системе на постоянной основе — это может привести к проблемам с другими приложениями. Да и с лицензионной чистотой будет не все в порядке. Поэтому после тестов стоит вернуть настройки в реестре в первоначальный вид.

Ссылки:
Active Scripting в WikiPedia
Microsoft Windows Script Technologies
JavaScript for Internet Explorer 9 Beta
Мой топик: Тестирование ServerSide JavaScript
Tags:
Hubs:
Total votes 37: ↑31 and ↓6 +25
Views 3.8K
Comments Comments 13