Node.Net: Integrado sistema de templates con herencia y de caché asíncronos #nodenet #async

Módulos asíncronos actuales integrados en Node.Net:

Templates (introducción)

Acabo de portear mi sistema de templates similar a Django y Twig a asíncrono. El sistema de templates lo hice inicialmente para CSharpUtils y era síncrono (aunque empecé a soportar asíncrono, pero no llegué a terminarlo en su momento).

AsyncCache

https://github.com/soywiz/NodeNet/blob/master/NodeNetAsync.Tests/Utils/AsyncCacheTest.cs

También he añadido un sistema de caché asíncrono AsyncCache<TKey, TValue>. Lo utilizo en el filtro para servir estáticos y ahora también en el sistema de templates.
El funcionamiento es muy sencillo: se instancia el objeto y se lanzan peticiones GetAsync con una clave y un delegado que generará el valor a cachear en el caso de que no esté ya en la caché. La ventaja que tiene es que si la clave ya se está generando, el GetAsync espera a que el otro generador termine, evitando race conditions y evitando ejecutar el generador varias veces.

Leer más...

Novedades en Node.Net : Websockets, Redis y más #nodenet #dotnet #async

He estado haciendo más cosas en Node.Net.

Cliente de Redis:

Por lo pronto he añadido un cliente de Redis (junto al que ya hice de MySQL):
Aquí podéis ver un ejemplo: https://github.com/soywiz/NodeNet/blob/master/NodeNetAsync.Examples/RedisTestProgram.cs

Soporte para WebSockets:

(Conexión bidireccional que permite hacer push desde el server en vez de tener que hacer polling desde el cliente.)

Y por otro lado he añadido soporte parcial de WebSockets. Por ahora únicamente he probado con Google Chrome y únicamente soporta la versión 13 de las especificaciones. He implementado un servidor de chat con alguna cosilla interesante.

https://github.com/soywiz/NodeNet/blob/master/NodeNetAsync.Examples/WebSocketTestProgram.cs](https://github.com/soywiz/NodeNet/blob/master/NodeNetAsync.Examples/WebSocketTestProgram.cs)

Leer más...

Presento: Node.Net alternativa real a Node.JS (¡Video Tutorial incluído!) #csharp #nodejs #dotnet #async

Ya expliqué los principales ventajas e inconvenientes de Node.JS, PHP y .NET en otro post: http://blog.cballesterosvelasco.es/2012/01/comparativa-entre-php-nodejs-y-net-php.html
Llevo un par de días montando Node.Net. Una alternativa a Node.Js que hace uso de las nuevas características de .NET 4.5.

Poned el vídeo a 720p y a pantalla completa para que se vea bien.

Proyecto: https://github.com/soywiz/nodenet

¿Qué sentido tiene montar otra cosa como Node.JS?

Aquí es donde entran los inconvenientes de Node.JS:

  • Tipado completamente dinámico (los IDEs lo tienen difícil con el autocompletado) y generalmente se trabaja sin autocompletado y detectando los errores al ejecutar o al depurar en vez de detectarlos mientras se escribe el código
  • No hay un IDE en condiciones
  • Flujo orientado a eventos
  • Javascript no tiene clases ni muchísimas cosas que se echan en falta.
  • La forma en la que en Javascript se extienden cosas es muy problemática (en .NET con los extension methods es mucho mejor)
  • La propagación de excepciones de penosísima y es prácticamente inexistente (precisamente porque los eventos no mantienen un estado restaurable)

Leer más...

Tutorial: Cómo hacer un compilador de PHP. Cosas básicas expresiones y sentencia IF #php #compiladores #dotnet

En relación a “Tutorial: Cómo hacer un compilador de PHP. Proyecto NPhp : Introducción #php #compiladores #dotnet

Lo básico:

Partes:

NPhp está separado actualmente en 3 partes fundamentales:

Entry Point

Para ejecutar un archivo PHP lo primero que se hace es instanciar Php54Runtime

var Runtime = new Php54Runtime(InteractiveErrors: false);

https://github.com/soywiz/nphp/blob/master/irony/NPhp/NPhp/Runtime/Php54Runtime.cs

El Runtime se encarga de instanciar una gramática que permitirá parsear el código, también se instancian varios ámbitos: ámbito de funciones, ámbito de variables globales y ámbito de constantes globales.

Posteriormente se le añaden las funciones globales nativas de forma lazy: Runtime.FunctionScope.LoadAllNativeFunctions();

El runtime permite generar un método nativo de .NET que se podrá ejecutar posteriormente:

var Function = Runtime.CreateMethodFromPhpFile(File.ReadAllText(args[0]), File: args[0], DumpTree: false, DoDebug: false);

Function es un Php54Function con un delegado de .NET generado dinámicamente on the fly.

Ejecutamos dicha función con un ámbito concreto, que para el caso de un archivo será el ámbito global:

Function.Execute(Runtime.GlobalScope);

Finalizamos el runtime, que finalizará los bufferes ob_ y que lanzará los callbacks de register_shutdown_function:

finally Runtime.Shutdown();

Leer más...

Tutorial: Cómo hacer un compilador de PHP. Proyecto NPhp : Introducción #php #compiladores #dotnet

Este es el primer post sobre una serie de posts que quiero escribir sobre creación de compiladores y generación de código.

Para esta serie de posts he creado un proyecto en github con una pequeña implementación de PHP que permite ejecutar algunos programas pequeños.

Proyecto en github:

Submódulos míos usados:

Proyectos externos usados:

Para inventar pegarme una matada con parsers y lexers como ya ha hecho muchas veces: https://github.com/soywiz/as3evalhttps://github.com/soywiz/csharputils/tree/master/CSharpUtils/CSharpUtils.Templateshttps://github.com/soywiz/atpl.js he decidido usar Irony, un proyecto genial que permite definir gramáticas de una forma muy sencilla. Así que este tutorial irá dedicado a usar Irony y a la generación de código.

Inicialmente iba a usar goldparser que era el que conocía (y que además permitía importar las sintaxis del YACC), pero los tiempos de compilación que vi eran nefastos y probé irony, que es muy rápido (aunque la inicialización es algo lenta la verdad). Conservo las pruebecitas del goldparser aquí: https://github.com/soywiz/nphp/tree/master/sandbox

Leer más...

Suscribirse via RSS