Подтвердить что ты не робот

Возможно ли новый язык программирования JIT-ed в Windows 8 metro/winRT?

Предположим, что я хочу создать новый язык программирования или использовать какой-либо язык, который не поддерживается MS (Haskell, Java... что угодно), но хочет иметь возможность кодировать протокол windows 8 metro/winRT.

Я знаю, что все приложения в Metro UI изолированы. Я знаю, что я могу программировать на родном С++, поэтому я предполагаю, что могу это сделать и в C или сборке.
Но:

  • Возможно ли создать JIT, который будет генерировать ассемблерный код на лету, например CLR JIT, без ограничений на песочницу?
  • Предполагая, что я использую только API, разрешенный в песочнице Metro, возможно ли использовать XAML в качестве интерфейса интерфейса? - Можно ли напрямую использовать Direct2D/DirectX?
4b9b3361

Ответ 1

Насколько я могу судить, слишком рано делать вызов. Я лично не знаю, как писать дрожание, не используя VirtualProtect(), основную функцию winapi, которая позволяет превратить кусок памяти с машинным кодом, генерируемым джиттером, в исполняемый код.

В WinRT-приложение доступно несколько встроенных функций winapi. Список блаженных системных функций доступен здесь. Связанная с памятью apis довольно ограничена, VirtualQuery является единственным в списке, который близок.

Итак, как это делают текущие прогнозы языка? Давайте посмотрим. CLR имеет проекцию, она загружается в любое приложение Metro, которое вы пишете на управляемом языке, таком как С#. Запуск dumpbin.exe/import в c:\windows\microsoft.net\framework\v4.0.30319\clr.dll создает довольно большой список зависимостей от DLL Windows. Отрывок из этого дампа:

Dump of file clr.dll

File Type: DLL

  Section contains the following imports:

    KERNEL32.dll
...

              430 RaiseException
              581 VirtualAlloc
              584 VirtualFree
              589 VirtualQuery
              587 VirtualProtect          <=== here!
              339 HeapDestroy
              336 HeapAlloc
              342 HeapValidate
              540 SleepEx
              547 SwitchToThread
              ... etc

Другая языковая проекция для javascript, реализованная в движке "Chakra". Трудно понять, что именно DLL реализует этот движок, это просто кодовое имя. Запуск проекта Javascript с неуправляемой отладочной поддержкой показывает, что загружен "jscript9.dll". Давайте сделаем dumpbin.exe/import на этом:

  ....
  6898F4D5    10D DebugBreak
  6891FDA1    55E TerminateProcess
  6898EF9E    57E UnhandledExceptionFilter
  6891FD58    43C RaiseException
  68903BB7    59E VirtualProtect                 <=== here!
  6A218590    366 InterlockedPushEntrySList
  6A2185A9    365 InterlockedPopEntrySList
  6A2195AA    35C InitializeSListHead
  689026F9    598 VirtualAlloc
  68902852    59B VirtualFree
  6890603E    4A2 ResetWriteWatch
  ...etc

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

Это необходимо для тушения, по крайней мере до тех пор, пока не станет доступен настоящий WinRT, тот, который работает на ядрах ARM. Не только тот, который работает поверх Win32, который теперь запущен в Windows 8 Consumer Preview. И может легко воспользоваться существующими функциями winapi, а не только упорядоченным списком. Вероятно, это будет ближе к концу года. Реальное оборудование не будет в ваших руках до лета следующего года.

Ответ 2

Да, на WinRT можно писать проекцию для других языков программирования. Это даже поощряло. В начале этого месяца в кампусе Microsoft состоялась конференция под названием Lang.Next, и все это касалось дизайна языка. Одна из сессий была специально посвящена этой теме, и вы можете посмотреть ее (я): http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/The-Windows-Runtime и прочитать комментарии по страница тоже. Позвольте мне привести следующее:

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

Итак, начните!: -)

Ответ 3

Вот трюк, который я нашел, чтобы получить доступ к этим отсутствующим API (VirtualAlloc, VirtualProtect), которые необходимы для реализации джиттера ( Отказ от ответственности: Это мой блог).

Играя с небезопасным кодом С#, вы можете обойти ограничения, наложенные на отражение .NET, и вызвать внутренний метод P/Invoke Win32Native.GetProcAddress. Когда у вас есть эта функция, вы автоматически получаете доступ к любой функции Win32, включая VirtualAlloc.

Ответ 4

1) Помимо браузеров, которые могут иметь доступ к некоторому ограниченному API (и могут быть способны интегрировать их JIT, но афаик, авторизированные API для браузеров еще не опубликованы), стандартное приложение Win8 Metro не будет иметь никакого доступа к функциям как "VirtualAlloc/VirtualProtect" (используется для создания/изменения страниц чтения/записи/исполняемой памяти): Это означает, что JIT, разработанный на С++ в приложении Windows 8 Metro, не пройдет сертификацию. Вы уже можете проверить свое приложение с помощью инструментария сертификации, доступного с помощью бета-версии Visual Studio 11.

Кто-то может сказать: "Я собираюсь взломать раздел PE, чтобы заставить читать + писать + исполняемый", без использования функций VirtualAlloc/VirtualProtect, но, к сожалению, этот хак тоже не будет работать, поскольку вы вынуждены скомпилируйте среду Windows 8 Metro exe с опцией /NXCOMPAT: YES, что означает, что она включает "Предотвращение выполнения данных" (DEP).

У другого может возникнуть соблазн генерировать DLL "на лету" и загружать их с диска с помощью новой "LoadPackagedLibrary", но эта функция фактически заблокирована, если DLL не была частью первоначального развертывания (на самом деле, я не смог чтобы он работал правильно)

Единственный доступный JIT - это .NET JIT. Все динамические языки .NET, такие как IronPython/IronRuby (если они обновлены для Win8 Metro), которые используют DLR (Dynamic Language Runtime в .NET) или даже отражение Emit, будут разбиты. Поэтому, если вы нацеливаете байт-код .NET CLR, вы можете записать свой код.

Например, IKVM.Net, способный запускать Java-код внутри .NET CLR, может работать под управлением приложения Windows 8 Metro (при условии, что он будет реорганизован для использования только сертифицированного API Win8 Metro).

2) Да, можно записать приложение Direct2D/Direct3D11 без использования XAML.

Проверьте образцы Windows 8 Metro http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples. Например, большинство образцов Direct2D не используют XAML.

Класс CoreWindow, являющийся API нижнего уровня для системы Metro Window, является точкой входа для чистого приложения Direct2D/Direct3D11.

Ответ 5

Стоит отметить, что даже если вам удастся запустить JIT, возможно, испустив байт-код CLR вместо собственного машинного кода, возможно, или даже если вы просто внедрили интерпретатор без JIT, вы могли бы только запустить код, который был включен в вашем первоначальном пакете приложений. Если вы загрузили script/bytecode/etc... извне приложения и попытались запустить/JIT/интерпретировать его в "локальном контексте" (т.е. С прямым доступом к библиотекам WinRT), вы бы (с возможным исключением - см. примечание ниже) будут нарушать раздел 3.9 требований к сертификации приложений:

3.9. Вся прикладная логика должна произойти из пакета приложений и находиться в нем. Приложение не должно пытаться изменять или расширять упакованный контент в любой форме динамического включения кода или данных, которые изменяют взаимодействие приложения с Windows Runtime или ведут себя в отношении политики Store. Не допустимо, например, загружать удаленный script и впоследствии выполнять это script в локальном контексте вашего пакета приложений.

Трудная формулировка здесь содержится в этом предложении "локального контекста". Неясно, что именно это означает. Например, если у вас есть элемент управления веб-браузера с открытым для сайта веб-сайтом (или iframe в приложении html, который работает в "веб-контексте" ), этот веб-браузер/iframe "запускает" JITed код javascript, но он будет работать в другом "контексте" и не имеет прямого доступа к WinRT apis. Не ясно, является ли это исключение только для браузера IE в XAML или iframe w/web context в html-приложениях, или вы можете реализовать свой собственный "веб-контекст" в вашем интерпретаторе или динамической среде выполнения.

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