Pregunta

Nikhil Kothari Guion# Es posiblemente uno de los conceptos más sorprendentes que he visto en el campo de JavaScript en bastante tiempo.Esta pregunta no trata sobre JavaScript, sino sobre la compilación del lenguaje en el tiempo de ejecución de .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 y al mismo tiempo permitirá que el compilador original genere resultados para la misma fuente durante la misma operación de compilación, mientras hace referencia/utiliza la salida del otro compilador también.

No estoy del todo seguro de entender el proceso lo suficientemente bien como para hacer la pregunta con los detalles correctos, pero así es como veo el proceso actualmente, según los diagramas en los documentos del Script#.He pensado en muchas cosas relacionadas con el diseño y la compilación de lenguajes complejos que pueden aprovechar conceptos como este y estoy interesado en lo que otras personas piensan sobre los conceptos.

--

Editar:Gracias por comentar, hasta ahora;Su información es, por derecho propio, muy intrigante y me gustaría investigarla más, pero mi pregunta en realidad es sobre cómo podría escribir mis propios compiladores que puedan ejecutarse en la misma fuente al mismo tiempo. produciendo múltiples tipos diferentes de resultados (potencialmente) interdependientes utilizando el CLR.Script# sirve como ejemplo ya que genera JavaScript y un ensamblado utilizando la misma fuente de C#, al mismo tiempo que hace que el ensamblado compilado coopere con JavaScript.Tengo curiosidad por saber cuáles son los diversos enfoques y conceptos teóricos al diseñar algo de esta naturaleza.

¿Fue útil?

Solución

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

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

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

Otros consejos

Entonces digamos que desea compilar C# en Javascript.¿Se pregunta si puede aprovechar los compiladores de C# existentes, por lo que en lugar de compilar C# en Javascript directamente, en realidad convierte el MSIL generado por el compilador de C# en Javascript?

Claro, puedes hacer eso.Una vez que tengas el binario MSIL, puedes hacer lo que quieras con él.

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

Un conjunto de herramientas de desarrollador para construir aplicaciones web de varios niveles que utilizan herramientas, técnicas y patrones existentes y familiares.La división declarativa de nivel de Volta permite a los desarrolladores posponer las decisiones arquitectónicas sobre la distribución hasta el último momento responsable posible.Además, gracias a un modelo de programación compartido en múltiples niveles, Volta permite nuevos perfiles y pruebas de extremo a extremo para mayores niveles de rendimiento de la aplicación, robustez y confiabilidad.Usando la división de nivel declarativo, los desarrolladores pueden refinar las decisiones arquitectónicas basadas en estos datos 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 aplicaciones de software+servicios, utilizando herramientas y técnicas existentes y familiares.

Usted arquita y crea su aplicación como una aplicación de cliente .NET, asignando las partes de la aplicación que se ejecutan en el nivel del servidor y el nivel de cliente al final del proceso de desarrollo.Puede dirigirse a los navegadores web o al CLR como clientes y Volta maneja las complejidades de la división de nivel.El compilador crea JavaScript de navegador cruzado para el nivel del cliente, los servicios web para el nivel del servidor y toda la comunicación, serialización, sincronización, seguridad y otro código básico para unir los niveles.En efecto, Volta ofrece una experiencia de mejor esfuerzo en múltiples entornos sin requerir la adaptación de la aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top