2008-09-16 12 views
7

Nikhil Kothari's Script# es posiblemente uno de los conceptos más sorprendentes que he visto en JavaScript desde hace bastante tiempo. Esta pregunta no se trata de JavaScript, sino de la compilación de lenguaje en el tiempo de ejecución de .NET.Cómo hacer un compilador paralelo para .NET

He estado bastante interesado en cómo, usando la plataforma .NET, uno puede escribir un compilador para un lenguaje que ya tiene un compilador (como C#) que generará resultados separados del compilador original al tiempo que permite el compilador original para generar resultados para la misma fuente durante la misma operación de compilación, al mismo tiempo que hace referencia/usa la salida del otro compilador también.

No estoy completamente seguro de que incluso entiendo el proceso lo suficientemente bien como para hacer la pregunta con los detalles de la derecha, pero esta es la forma en que actualmente veo el proceso, de acuerdo con los diagramas en el guión # docs. He pensado en muchas cosas relacionadas con el diseño de un lenguaje complejo y la compilación que pueden aprovechar conceptos como este y estoy interesado en lo que otras personas piensan sobre los conceptos.

-

Edit: Gracias por sus comentarios, hasta el momento; su información es, por derecho propio, muy intrigante y me gustaría investigar más, pero mi pregunta es sobre cómo podría escribir mis propios compiladores que se pueden ejecutar en la misma fuente al mismo tiempo produciendo múltiples tipos diferentes de salida (potencialmente) interdependiente usando el CLR. El script # sirve como un ejemplo, ya que genera JavaScript y un ensamblado que usa la misma fuente de C#, al tiempo que hace que el ensamblado compilado coopere con JavaScript. Tengo curiosidad por conocer los diversos enfoques y conceptos teóricos al diseñar algo de esta naturaleza.

Respuesta

2

Es importante darse cuenta de que todo un compilador hace es tomar un idioma de origen (C# en este caso), analizarlo por lo que el compilador tiene una representación que tenga sentido para él y no humanos (este es el árbol de sintaxis abstracta), y luego genera un código ingenuo en el idioma de destino (msil es el destino para los lenguajes que se ejecutan en el tiempo de ejecución de .NET).

Ahora, si el código del script # se convierte en un ensamblado e interactúa con otro código .NET, significa que este compilador debe generar msil. script # usa csc.exe para esto, que es solo el comandante estándar de C#. Ahora para generar el javascript, debe tomar C# o msil, analizarlo y generar javascript para enviar al navegador. Los documentos dicen que tiene un compilador personalizado C# -> js llamado ssc.exe.

Para hacer que las cosas interactúen consistentemente tanto del lado del cliente como del lado del servidor, tiene un conjunto de ensamblajes de referencia escritos en .NET pero también compilados para javascript. Sin embargo, este no es un problema específico del compilador, esos ensambles de referencia son el script # runtime. Sin embargo, el tiempo de ejecución probablemente sea el responsable de gran parte de la magia del guión que estás percibiendo.

+0

La magia que me interesa es lo que hace en el proceso de compilación para hacer que el ensamblaje que genera a partir de su código haga referencia al javascript se genera a partir de tu código. Puede simplemente alterar la fuente antes de pasarla a CSC o quizás a CodeDOM para compilar un gráfico basado en la fuente pero con cambios. – TheXenocide

+0

Muchas gracias por una respuesta real a la pregunta, he estado esperando que alguien llegue a esto. Si puedes aclarar si existe algo para realizar esta magia o si es solo un poco de mano, estoy preparado para aceptar esta respuesta. (La clave: una fuente - dos salidas interdependientes) – TheXenocide

0

Digamos que quiere compilar C# en Javascript. Usted pregunta si puede aprovechar los compiladores de C# existentes, entonces, en lugar de compilar C# en Javascript directamente, ¿realmente convierte el MSIL generado por el compilador de C# en Javascript?

Claro, puedes hacer eso. Una vez que tenga el binario MSIL, puede hacer lo que quiera.

0

Microsoft tiene un proyecto de investigación llamado Volta que, entre otras cosas, compila msil a JavaScript.

un conjunto de herramientas de desarrollo para construir aplicaciones web de múltiples niveles usando herramientas familiares existente y, técnicas y patrones. La división de niveles declarativa de de Volta permite a los desarrolladores posponer las decisiones arquitectónicas sobre la distribución hasta el último posible momento responsable. Además, gracias a un modelo de programación compartida través-de múltiples niveles, Volta permite a los nuevos perfiles de extremo a extremo y pruebas para los niveles más altos de rendimiento aplicación, robustez, fiabilidad y . Mediante la separación de niveles declarativa , los desarrolladores pueden refinar las decisiones de arquitectura basadas en estos datos de generación de perfiles . Esto ahorra tiempo y costos asociados con la refactorización manual . En efecto, Volta extiende la plataforma .NET para habilitar aún más el desarrollo de las aplicaciones de software + servicios , utilizando las herramientas y técnicas familiares existentes y .

Es arquitecto y construir su aplicación como una aplicación cliente .NET , la asignación de las porciones de la aplicación que se ejecuta en el servidor y el cliente tier tier tarde en el proceso de desarrollo . Puede orientar navegadores web o CLR como clientes y Volta maneja las complejidades de división de niveles. El compilador crea entre navegadores JavaScript para que el nivel de cliente, web servicios para el nivel de servidor, y todos la comunicación, la serialización, sincronización, seguridad y otros códigos repetitivo para atar los niveles juntos. En efecto, Volta ofrece una experiencia de mejor esfuerzo en múltiples entornos sin requerir la adaptación de la aplicación a .

+0

No es exactamente lo que estaba buscando aquí (ver arriba), pero aprecio la información sobre Volta, ya que esta es otra implementación emocionante en esta línea de la que me gustaría obtener más información. – TheXenocide

+0

MS desechó Volta, pero puede hacer cosas similares con http://jsc.sourceforge.net/ – mcintyre321

Cuestiones relacionadas