programming-languages - sirve - programar en go
¿Es posible el nuevo lenguaje de programación JIT-ed en Windows 8 metro/winRT? (5)
Sí, es posible escribir una proyección en WinRT para otros lenguajes de programación. Incluso se anima. Una conferencia llamada Lang.Next se llevó a cabo en el campus de Microsoft a principios de este mes, y se trataba de diseño de lenguaje. Una de las sesiones fue específicamente sobre este tema, y es posible que desee verla (tengo): http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/The-Windows-Runtime y lee los comentarios en la página también. Déjame citar uno:
Martyn dejó en claro que no solo queremos que los diseñadores e implementadores de idiomas agreguen WinRT a su lista de plataformas de destino para su lenguaje y sus cadenas de herramientas, sino que les ayudaremos y asesoraremos.
¡Entonces comienza! :-)
Digamos que quiero crear un nuevo lenguaje de programación o usar algún lenguaje que no sea compatible con MS (Haskell, Java ... lo que sea) pero quiero poder codificar contra windows 8 metro / winRT.
Sé que todas las aplicaciones en la interfaz de usuario de Metro son de espacio aislado.
Sé que puedo programar en C ++ nativo, así que supongo que puedo hacerlo también en C o en ensamblaje.
Pero:
- ¿Es posible crear un JIT que produzca código ensamblador sobre la marcha, como CLR JIT, sin romper las restricciones del espacio aislado?
- Suponiendo que usaré solo la API permitida en la zona de pruebas de Metro, ¿ es posible no usar XAML como interfaz de la interfaz de usuario? - ¿Puedo usar Direct2D / DirectX directamente?
Por lo que puedo decir, es demasiado pronto para hacer un llamado a esto. Personalmente, no sé cómo escribir un jitter sin utilizar VirtualProtect (), la función core winapi que le permite convertir un trozo de memoria con código máquina generado por el jitter en código ejecutable.
Hay una serie de funciones de winapi nativas disponibles para una aplicación WinRT. La lista de funciones del sistema bendito está disponible aquí . Las apis relacionadas con la memoria son bastante limitadas, VirtualQuery es el único en la lista que se acerca.
Entonces, ¿cómo lo hacen las proyecciones de lenguaje actuales? Echemos un vistazo. El CLR tiene una proyección, se carga en cualquier aplicación Metro que escriba en un lenguaje administrado como C #. Ejecutar dumpbin.exe / imports en c: / windows / microsoft.net / framework / v4.0.30319 / clr.dll genera una lista bastante grande de dependencias en las DLL de Windows. Un fragmento de ese vertedero:
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
Otra proyección de idioma es para javascript, implementado en el motor "Chakra". Difícil averiguar exactamente qué DLL implementa ese motor, es solo un nombre de código. La ejecución de un proyecto de ejemplo de JavaScript con la depuración no administrada habilitada revela que se cargó "jscript9.dll". Hagamos dumpbin.exe / imports en este:
....
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
Bueno, está ahí. Tendría que serlo. El problema es que ahora mismo no puedes llamar a esta función. Ciertamente no pasaría el escrutinio del validador de la Tienda.
Esto necesita guisarse, al menos hasta que el WinRT real esté disponible, el que se ejecuta en núcleos ARM. No solo el que se ejecuta sobre Win32 que ahora tiene ejecutado en la Vista previa del consumidor de Windows 8. Y puede aprovechar fácilmente las funciones winapi existentes, no solo la lista recortada. Eso será alrededor de fin de año, probablemente. El hardware real no estará en tus manos hasta el verano del próximo año.
1) Además de los navegadores que podrían tener acceso a alguna API restringida (y podrían integrar su JIT, pero afaik, las API autorizadas para navegadores aún no se publicaron), la aplicación estándar Win8 Metro no tendrá acceso a funciones como "VirtualAlloc". / VirtualProtect "(usado para crear / cambiar páginas de memoria de lectura / escritura / ejecutables): Significa que JIT desarrollado en C ++ bajo una aplicación Metro de Windows 8 no pasará la certificación. Ya puede verificar su aplicación con el kit de herramientas de certificación disponible con Visual Studio 11 Beta.
Alguien podría decir "Voy a hackear la sección de PE para forzar la sección de lectura + escritura + ejecutable" sin tener que usar las funciones de VirtualAlloc / VirtualProtect, pero desafortunadamente, este truco tampoco funcionará, ya que estás obligado a compilar un Windows 8 Metro exe con la opción / NXCOMPAT: SÍ, lo que significa que habilita la "Prevención de ejecución de datos" (DEP).
Otro podría tener la tentación de generar DLL sobre la marcha y cargarlos desde el disco utilizando la nueva "LoadPackagedLibrary", pero esta función está bloqueada si el archivo DLL no era parte de la implementación original (en realidad, no he podido hacerlo) trabajando apropiadamente)
El único JIT que está disponible es .NET JIT. Todos los lenguajes dinámicos .NET como IronPython / IronRuby (si se actualizan para Win8 Metro) que están utilizando el DLR (Dynamic Language Runtime en .NET) o incluso el Emit de reflexión serán jitted. Por lo tanto, si segmenta el bytecode de .NET CLR, puede hacer que se modifique su código.
IKVM.Net, por ejemplo, que puede ejecutar código Java dentro de .NET CLR podría ejecutarse bajo una aplicación Metro de Windows 8 (pero con la condición de que se refacturará para usar solo Win8 Metro API certificada).
2) Sí, es posible escribir una aplicación Direct2D / Direct3D11 sin usar XAML.
Consulte las muestras de Metro de Windows 8 http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples . Por ejemplo, la mayoría de las muestras de Direct2D no usan XAML.
La clase CoreWindow que es una API de nivel inferior para el sistema Metro Window es el punto de entrada para una aplicación Direct2D / Direct3D11 pura.
Vale la pena señalar que, incluso si logró obtener un JIT funcionando, tal vez emitiendo bytecode CLR en lugar de código de máquina nativo tal vez, o incluso si acaba de implementar un intérprete sin JIT, solo podría ejecutar el código que estaba incluido en su original paquete de aplicaciones. Si descargó script / bytecode / etc ... desde fuera de la aplicación y trató de ejecutar / JIT / Interpret it en un "contexto local" (es decir, con acceso directo a las bibliotecas WinRT), lo haría (con una posible excepción - vea la nota a continuación ) estar en violación de la sección 3.9 de los requisitos de certificación de la aplicación:
3.9 Toda la aplicación lógica debe originarse y residir en su paquete de aplicación. Su aplicación no debe intentar cambiar o extender el contenido empaquetado a través de cualquier forma de inclusión dinámica de código o datos que cambie la forma en que la aplicación interactúa con Windows Runtime, o se comporta con respecto a la política de la tienda. No está permitido, por ejemplo, descargar un script remoto y ejecutarlo posteriormente en el contexto local del paquete de su aplicación.
La fraseología difícil aquí está en esta oración del "contexto local". No está claro lo que eso significa exactamente. Por ejemplo, si tiene un control de navegador web con un portal abierto a un sitio web (o un iframe en una aplicación html que se ejecuta en el "contexto web"), ese navegador web / iframe está "ejecutando" el código JavaScript JIT, pero se ejecutará en un "contexto" diferente, y no tiene acceso directo a apis WinRT. No está claro si esta excepción es solo para el control del navegador IE en XAML o el contexto iframe w / web en aplicaciones html, o si podría implementar su propio "contexto web" en su intérprete o tiempo de ejecución dinámico.
Dicho esto, puede precompilar cualquier tipo de código de aplicación como una forma de obtener ese código en una aplicación y certificarlo, de forma similar a como se hace en iOS, excepto que tiene la opción de precompilar a .NET , código máquina nativo o javascript.
Aquí hay un truco que encontré para obtener acceso a estas API faltantes (VirtualAlloc, VirtualProtect), que son necesarias para implementar un jitter (Descargo de responsabilidad: este es mi blog).
Al jugar con el código inseguro C #, puede evitar las restricciones impuestas a la reflexión .NET e invocar el método interno P / Invoke Win32Native.GetProcAddress
. Una vez que tenga esa función, obtendrá automáticamente acceso a cualquier función de Win32, incluido VirtualAlloc
.