StaDyn es un lenguaje de programación orientado a objetos de propósito general para la plataforma .NET que admite tanto tipado estático como dinámico en el mismo lenguaje de programación.
El compilador StaDyn recopila información de tipo para el código de tipado dinámico. Esta información se utiliza para detectar errores de tipo en tiempo de compilación y para realizar optimizaciones significativas. Para ello, proporciona reconstrucción de tipos (inferencia), tipos sensibles al flujo, tipos de unión e intersección, tipado basado en restricciones, análisis de alias y especialización de métodos. Su primer prototipo apareció en 2007, como una modificación de C# 3.0. La inferencia de tipos se admitió incluyendo varcomo un nuevo tipo, a diferencia de C#, que solo ofrece vardefinir variables locales inicializadas. Los tipos sensibles al flujo de varlas referencias son inferidos por el compilador, proporcionando tipado pato seguro de tipos. [ 4 ] Cuando el programador requiere un enfoque más permisivo, dynamicse puede usar el tipo en lugar de var. Aunque la inferencia de tipos todavía se realiza, dynamiclas referencias se comportan más cerca de las de los lenguajes dinámicos.
StaDyn fue diseñado por Francisco Ortin [ 1 ] de la Universidad de Oviedo . El lenguaje ha sido implementado por diferentes miembros del grupo de investigación de Reflexión Computacional, [ 2 ] incluyendo a Miguel García, José Baltasar García Pérez-Schofield y José Quiroga, además de Francisco Ortin.
El nombre StaDyn es una combinación de las palabras "estático" y "dinámico", lo que denota su objetivo de proporcionar las ventajas tanto de la tipificación estática como de la dinámica.
Ejemplos de código
Variables con diferentes tipos
Al igual que en los lenguajes dinámicos, las variables pueden contener diferentes tipos dentro del mismo ámbito:
using System ; class Program { public static void Main () { Console . Write ( "Número: " ); var age = Console . In . ReadLine (); Console . WriteLine ( "Dígitos: " + age . Length );edad = Convertir.ToInt32 ( edad ) ; edad ++ ;Console.WriteLine ( "Feliz cumpleaños, ahora tienes " + age + " años." ) ; int length = age.Length ; // * Error del compilador } }La agevariable se infiere primero como cadena, por lo que es seguro obtener su Lengthpropiedad. Luego, contiene un entero, por lo que age++es una expresión válida. El compilador detecta un error en la última línea, ya que Lengthya no es proporcionado por age.
El código generado no utiliza una sola Objectvariable para representar la edad, sino dos variables diferentes cuyos tipos son cadena y entero. Esto se logra mediante una modificación del algoritmo para calcular el formulario SSA . [ 5 ] Esto hace que el código generado sea más eficiente, ya que no se requieren conversiones de tipo en tiempo de ejecución.
Tipos sensibles al flujo
vary dynamiclas variables pueden contener tipos sensibles al flujo:
using System ; class Program { public static void Main ( String [] args ) { var exception ; if ( args.Length > 0 ) exception = new ApplicationException ( " Una excepción de la aplicación." ) ; else exception = new SystemException ( " Una excepción del sistema." ) ; Console.WriteLine ( exception.Message ) ; } }Es seguro obtener la Messagepropiedad exceptionporque tanto ApplicationExceptioncomo SystemExceptionproporcionan dicha propiedad. De lo contrario, se mostrará un error de compilación. De esta forma, StaDyn proporciona un sistema de tipado estático seguro.
En el siguiente programa:
using System ; class Program { public static void Main ( String [] args ) { var exception ; switch ( args.Length ) { case 0 : exception = new ApplicationException ( " Una excepción de aplicación." ) ; break ; case 1 : exception = new SystemException ( "Una excepción del sistema." ) ; break ; default : exception = "Esto no es una excepción." ; break ; } Console.WriteLine ( exception.Message ) ; // * Error de compilación con var, pero no con dynamic Console.WriteLine ( exception.Unknown ); // * Error de compilación } }La Messagepropiedad no es proporcionada por String, por lo que se muestra un error de compilación para exception.Message. Sin embargo, si declaramos exceptioncomo dynamic, el programa anterior es aceptado por el compilador. dynamices más indulgente que var, siguiendo la tendencia de los lenguajes dinámicos. Sin embargo, aún se realiza la comprobación de tipos estática. Esto se muestra en la última línea de código, donde el compilador muestra un error para exception.Unknownincluso si exceptionse declara como dynamic. Esto se debe a que ninguno de los tres tipos posibles ( ApplicationException, SystemExceptiony String) admite el Unknownmensaje. [ 6 ]
Aunque dynamiclos vartipos se pueden usar explícitamente para obtener una comprobación de tipos más segura o más permisiva, el dinamismo de varlas referencias individuales también se puede modificar con opciones de línea de comandos, archivos de configuración XML y un complemento para Visual Studio. [ 7 ]
Inferencia de tipos de campos
vary dynamiclos tipos se pueden usar como campos de objeto:
clase Wrapper { atributo de variable privada ;public Wrapper ( var attribute ) { this . attribute = attribute ; }public var get () { return atributo ; }public void set ( var attribute ) { this . attribute = attribute ; } }clase Test { public static void Main () { string aString ; int aInt ; Wrapper wrapper = new Wrapper ( "Hello" ); aString = wrapper . get (); aInt = wrapper . get (); // * Error del compiladorenvoltorio.set ( 3 ) ; aString = envoltorio.get ( ); // * Error del compilador aInt = envoltorio.get ( ) ; } }La Wrapperclase puede encapsular cualquier tipo. Cada vez que llamamos al setmétodo, el tipo attributese infiere como el tipo del argumento. Cada objeto tiene un tipo potencialmente diferente attribute, por lo que su tipo se almacena para cada instancia individual en lugar de para toda la clase. De esta manera, las dos líneas indicadas en el código anterior informan errores de compilación. Se implementa un algoritmo de análisis de alias basado en tipos para admitir este comportamiento. [ 8 ]
Tipos basados en restricciones
Analicemos el siguiente método:
public static var superior ( parámetro var ) { parámetro de retorno . Arriba (); }parameterEl compilador infiere el tipo y el valor de retorno de la función. Para ello, se añade una restricción al tipo del uppermétodo: el argumento debe proporcionar un ToUppermétodo sin parámetros. En cada invocación, se comprobará esta restricción. Además, el tipo de retorno upperse inferirá como el tipo de retorno del ToUppermétodo correspondiente implementado por el argumento. [ 9 ]
El programador puede usar varo dynamicpara declarar parameter, cambiando la forma en que se realiza la comprobación de tipos al invocar el método. Supongamos que el argumento pasado a uppercontiene un tipo sensible al flujo (por ejemplo, la variable ApplicationException, SystemExceptiono Stringexceptionen el código anterior). Con var, todos los tipos posibles del argumento deben proporcionar ToUpper; con dynamic, al menos un tipo debe proporcionar ToUpper.
Rendimiento en tiempo de ejecución
La información de tipos recopilada por StaDyn se utiliza para realizar optimizaciones significativas en el código generado: [ 10 ] se reduce el número de inspecciones de tipos y conversiones de tipos, se evita la reflexión, se almacenan en caché los tipos frecuentes y se especializan los métodos con restricciones. El objetivo de todas las optimizaciones es reducir el número de operaciones de verificación de tipos realizadas en tiempo de ejecución, que es la principal penalización de rendimiento de la mayoría de los lenguajes dinámicos. Muchas de estas verificaciones de tipos las realiza previamente el compilador StaDyn. Una evaluación detallada del rendimiento en tiempo de ejecución de StaDyn se describe en [ 4 ] .
Véase también
Referencias
- 1 2 «Francisco Ortín» . uniovi.es . Consultado el 17 de mayo de 2022 .
- 1 2 "Grupo de Investigación de Reflexión Computacional" . uniovi.es . Consultado el 17 de mayo de 2022 .
- ↑ "Descargar StaDyn" . uniovi.es . Consultado el 17 de mayo de 2022 .
- 1 2 Francisco Ortin; Miguel Garcia; Sean McSweeney (2019). "Especialización de programas basada en reglas para optimizar código tipado gradualmente". Knowledge-Based Systems . 179 : 145– 173. doi : 10.1016/j.knosys.2019.05.013 . hdl : 10651/53505 . S2CID 182002303 .
- ↑ Jose Quiroga; Francisco Ortin (2017). "SSA Transformations to Facilitate Type Inference in Dynamically Typed Code". The Computer Journal . doi : 10.1093/comjnl/bxw108 . hdl : 10651/53507 .
- ↑ Francisco Ortin; Miguel Garcia (2011). "Tipos de unión e intersección para admitir tipado dinámico y estático". Information Processing Letters . 111 (6): 278– 286. doi : 10.1016/j.ipl.2010.12.006 . hdl : 10651/8732 .
- ↑ Francisco Ortin; Francisco Morero; Anton Morant (2014). "Información de tipo estático para mejorar las características del IDE de lenguajes híbridos de tipado dinámico y estático". Journal of Visual Languages & Computing . 25 (4): 346– 362. doi : 10.1016/j.jvlc.2014.04.002 . hdl : 10651/28429 .
- ↑ Francisco Ortin; Daniel Zapico; JBG Perez-Schofield; Miguel Garcia (2010). "Incluye tipado estático y dinámico en el mismo lenguaje de programación". IET Software . 4 (4): 268. doi : 10.1049/iet-sen.2009.0070 . hdl : 10651/9769 .
- ↑ Francisco Ortin (2011). "Inferencia de tipos para optimizar un lenguaje híbrido de tipado estático y dinámico". The Computer Journal . 54 (11): 1901– 1924. doi : 10.1093/comjnl/bxr067 . hdl : 10651/11411 .
- ↑ Miguel García; Francisco Ortín; José Quiroga (2016). "Diseño e implementación de un lenguaje de tipado híbrido dinámico y estático eficiente". Software: Practice and Experience . 46 (2): 199– 226. doi : 10.1002/spe.2291 . hdl : 10651/29465 . S2CID 2065468 .
Enlaces externos
- Sitio web oficial
- Repositorio de GitHub
- Grupo de investigación de reflexión computacional
- Lenguajes de programación
- Lenguajes de programación .NET
- Lenguajes de programación basados en clases
- Compiladores libres y de código abierto
- Lenguajes de programación orientados a objetos
- Lenguajes de programación creados en 2007
- Software que utiliza la licencia MIT.
- Lenguajes de programación de tipado estático
- Lenguajes de programación de tipado dinámico
- Software de 2007
- Inventos españoles