Programming languages windows 8 metro/winRT中是否可能使用新的JIT-ed编程语言?

Programming languages windows 8 metro/winRT中是否可能使用新的JIT-ed编程语言?,programming-languages,windows-8,microsoft-metro,jit,windows-runtime,Programming Languages,Windows 8,Microsoft Metro,Jit,Windows Runtime,假设我想创建一种新的编程语言,或者使用一些MS不支持的语言(Haskell、Java…等等),但希望能够针对Windows8Metro/winRT进行编码 我知道Metro UI中的所有应用程序都是沙盒。 我知道我可以用C++编程,所以我假设我也可以用C或汇编来做。 但是: 有没有可能创建一个JIT,在不打破沙箱限制的情况下,像CLR JIT一样动态生成汇编代码 假设我只使用XAML,是否可以不使用XAML作为UI接口我可以直接使用Direct2D/DirectX吗 是的,可以为其他编程语言将投

假设我想创建一种新的编程语言,或者使用一些MS不支持的语言(Haskell、Java…等等),但希望能够针对Windows8Metro/winRT进行编码

我知道Metro UI中的所有应用程序都是沙盒。
我知道我可以用C++编程,所以我假设我也可以用C或汇编来做。 但是:

  • 有没有可能创建一个JIT,在不打破沙箱限制的情况下,像CLR JIT一样动态生成汇编代码
  • 假设我只使用XAML,是否可以不使用XAML作为UI接口我可以直接使用Direct2D/DirectX吗

  • 是的,可以为其他编程语言将投影写入WinRT。它甚至被鼓励。本月早些时候,在微软校园举行了一场名为Lang.Next的会议,会议的主题是语言设计。其中一节课是专门讨论这个话题的,你可能想看一看(我已经看过了):并阅读页面上的评论。让我引述一点:

    Martyn明确表示,我们不仅需要语言设计师和 实现者将WinRT添加到他们的目标平台列表中,以便 语言和工具链,但我们将提供帮助和建议


    那就开始吧!:-)

    据我所知,现在打这个电话还为时过早。我个人不知道如何在不使用VirtualProtect()的情况下编写抖动,VirtualProtect()是winapi的核心函数,它允许您将包含抖动生成的机器代码的内存块转换为可执行代码

    WinRT应用程序有许多本机winapi函数可用。系统功能列表如下所示。与内存相关的API非常有限,VirtualQuery是列表中唯一接近的API

    那么,当前的语言投射是如何做到这一点的呢?让我们看看。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
    
    文件clr.dll的转储
    文件类型:DLL
    节包含以下导入内容:
    内核32.dll
    ...
    430上升异常
    581 VirtualAlloc
    584虚拟自由
    589虚拟查询
    587 VirtualProtect1)除了可以访问某些受限API(并且可以集成其JIT,但afaik,浏览器的授权API尚未发布)的浏览器外,标准Win8 Metro应用程序将无法访问诸如“VirtualAlloc/VirtualProtect”之类的功能(用于创建/更改读/写/可执行内存页):这意味着在Windows 8 Metro应用程序下在C++开发的JIT将无法通过认证。您已经可以使用VisualStudio 11 beta版的验证工具包检查应用程序。
    有人可能会说“我将对PE部分进行黑客攻击,以强制执行读+写+可执行”部分,而不必使用VirtualAlloc/VirtualProtect函数,但不幸的是,这种黑客攻击也不会起作用,因为您必须使用选项/NXCOMPAT:YES编译Windows 8 Metro exe,这意味着它正在启用“数据执行预防”(副署长)

    另一个可能会尝试动态生成DLL,并使用新的“LoadPackagedLibrary”从磁盘加载它们,但如果DLL不是原始部署的一部分,则此函数实际上被锁定(实际上,我无法使其正常工作)

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

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

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

    检查Windows 8 Metro示例。例如,大多数Direct2D示例未使用XAML


    CoreWindow类是Metro窗口系统的较低级别API,是纯Direct2D/Direct3D11应用程序的入口点。

    值得注意的是,即使您成功地实现了JIT,也可能通过发出CLR字节码而不是本机代码,或者即使您只是实现了一个没有JIT的解释器,您也可以您只能运行原始应用程序包中包含的代码。如果您从应用程序外部下载脚本/字节码/等,并尝试在“本地上下文”(即直接访问WinRT库)中运行/JIT/解释它,您会(可能有例外-请参阅下面的注记)违反app认证要求第3.9节:

    3.9所有应用程序逻辑必须源自并驻留在您的应用程序包中 您的应用程序不得试图通过任何形式的动态包含代码或数据来更改或扩展打包内容,这些代码或数据会更改应用程序与Windows运行时的交互方式,或更改应用程序在存储策略方面的行为。例如,不允许下载远程脚本,然后在本地上下文中执行该脚本你的应用程序包的t

    这里棘手的措辞是在这个“本地上下文”句子中。不清楚这到底是什么意思。例如,如果您有一个web浏览器控件,其门户打开到一个网站(或在“web上下文”中运行的html应用程序中的iframe),则该web浏览器/iframe正在“运行”JITed javascript代码,但它将在不同的“上下文”中运行,并且不能直接访问WinRT API。不清楚此异常是否仅适用于XAML中的IE浏览器控件或html ap中的iframe w/web上下文
      ....
      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