是否可以在Windows 8 metro/winRT中使用新的JIT编程语言?

See*_*eeR 20 jit programming-languages microsoft-metro windows-8 windows-runtime

让我们说我想创建一种新的编程语言或者使用MS不支持的某种语言(Haskell,Java ......等等),但希望能够对Windows 8 metro/winRT进行编码.

我知道Metro UI中的所有应用都是沙盒.
我知道我可以用原生C++编程,所以我假设我也可以在C或汇编中完成.
但:

  1. 是否有可能创建一个可以动态生成汇编代码的JIT - 比如CLR JIT-而不会破坏沙盒限制?
  2. 假设我只使用Metro沙箱中允许的API,是否可以不使用XAML作为UI界面? - 我可以直接使用Direct2D/DirectX吗?

Han*_*ant 14

尽管我已经知道了,但要对此进行调用还为时过早.我个人不知道如何在不使用VirtualProtect()的情况下编写抖动,VirtualProtect是一个核心winapi函数,它允许您将一大块内存与抖动生成的机器代码转换为可执行代码.

WinRT应用程序可以使用许多本机winapi功能.这里提供了受祝福的系统功能列表.与内存相关的apis非常有限,VirtualQuery是列表中唯一接近的版本.

那么目前的语言预测如何做到呢?我们来看一下.CLR有一个投影,它被加载到你用C#这样的托管语言编写的任何Metro应用程序中.在c:\ windows\microsoft.net\framework\v4.0.30319\clr.dll上运行dumpbin.exe/imports会在Windows DLL上生成相当大的依赖项列表.来自该转储的片段:

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
Run Code Online (Sandbox Code Playgroud)

另一种语言投影用于javascript,在"Chakra"引擎中实现.很难弄清楚DLL实现了什么引擎,它只是一个代码名称.运行启用了非托管调试的示例Javascript项目会显示"jscript9.dll"已加载.让我们在这个上做dumpbin.exe/imports:

  ....
  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
Run Code Online (Sandbox Code Playgroud)

好吧,它就在那里.它必须是.麻烦的是,现在不能调用这个功能.它肯定不会通过Store验证器的审查.

这需要炖,至少在真正的 WinRT可用之前,就是在ARM内核上运行的那个.不仅仅是运行在Win32之上的那个,你现在已经在Windows 8 Consumer Preview中运行了.并且可以轻松利用现有的winapi功能,而不仅仅是修剪列表.这可能是在今年年底左右.直到明年夏天,真正的硬件才会掌握在您手中.

  • WinRT 在这里几乎充当沙箱,因此不会更改对 VirtualAlloc/VirtualProtect 的 API 访问,因为 API 几乎已准备好用于 OEM。基本上,除了 .NET CLR/JIT(以及所有可以 jitted 的动态 .NET 语言),将无法实现 JIT。 (2认同)

Kat*_*ory 8

是的,可以在WinRT上为其他编程语言编写投影.它甚至受到鼓励.本月早些时候在微软校园召开了一次名为Lang.Next的会议,这一切都与语言设计有关.其中一个会议专门针对这个主题,你可能想看一下(我有):http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/The-Windows-Runtime and阅读页面上的评论也.让我引用一句话:

Martyn明确表示,我们不仅希望语言设计人员和实施者将WinRT添加到他们的语言和工具链的目标平台列表中,而且我们将提供帮助和建议.

所以开始吧!:-)


小智 7

这是我发现的一个技巧,可以访问这些缺失的API(VirtualAlloc,VirtualProtect),这些API是实现抖动所必需的(免责声明:这是我的博客).

通过使用不安全的C#代码,您可以绕过对.NET反射的限制并调用内部P/Invoke方法Win32Native.GetProcAddress.一旦拥有该功能,您就可以自动访问任何Win32功能,包括VirtualAlloc.


xoo*_*ofx 5

1)除了可以访问某些受限API的浏览器(并且能够集成他们的JIT,但afaik,浏览器的授权API尚未发布)之外,标准的Win8 Metro App将无法访问"VirtualAlloc"等功能/ VirtualProtect"(用于创建/更改读/写/可执行内存页):这意味着在Windows 8 Metro App下使用C++开发的JIT不会通过认证.您已经可以使用Visual Studio 11 Beta提供的认证工具包检查您的应用程序.

有人可以说"我要破解PE部分强制读取+写入+可执行"部分,而不必使用VirtualAlloc/VirtualProtect函数,但不幸的是,这个hack也不会工作,因为你被迫编译Windows 8带有选项/ NXCOMPAT的Metro exe:YES,表示它正在启用"数据执行保护"(DEP).

另一个可能会动态生成DLL并使用新的"LoadPackagedLibrary"从磁盘加载它们但是如果DLL不是原始部署的一部分,实际上该函数被锁定(实际上,我无法做到好好工作)

唯一可用的JIT是.NET JIT.使用DLR(.NET中的动态语言运行时)甚至反射Emit的所有.NET动态语言(如IronPython/IronRuby(如果它们为Win8 Metro更新)都将被jitted.因此,如果您以.NET CLR字节码为目标,则可以使用代码进行搜索.

例如,能够在.NET CLR中运行Java代码的IKVM.Net可以在Windows 8 Metro App下运行(但条件是它将被重构为仅使用经过认证的Win8 Metro API).

2)是的,可以在不使用XAML的情况下编写Direct2D/Direct3D11应用程序.

检查Windows 8 Metro示例http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples.例如,大多数Direct2D样本不使用XAML.

CoreWindow类是Metro Window系统的低级API,是纯Direct2D/Direct3D11应用程序的入口点.