V , también conocido como vlang , es un lenguaje de programación compilado y tipado estático creado por Alexander Medvednikov a principios de 2019. [4] Se inspiró en el lenguaje Go y otras influencias, incluidas Oberon , Swift y Rust . [5] [6] [7] Es un software gratuito y de código abierto publicado bajo la Licencia MIT y actualmente en versión beta . [8]
Los objetivos de V incluyen facilidad de uso, legibilidad y mantenimiento. [9] [10]
Según uno de los desarrolladores, el nuevo lenguaje fue creado como resultado de la frustración con los lenguajes existentes que se usaban para proyectos personales. [11] El lenguaje fue originalmente pensado para uso personal, pero después de que se mencionó públicamente y ganó interés, se decidió hacerlo público. V fue creado inicialmente para desarrollar un cliente de mensajería de escritorio conocido como Volt. [6] Tras el lanzamiento público, el compilador fue escrito en V y podía compilarse a sí mismo. [4] Los objetivos de diseño clave detrás de la creación de V fueron que fuera fácil de aprender y usar, mayor legibilidad, compilación rápida, mayor seguridad, desarrollo eficiente, usabilidad multiplataforma, interoperabilidad mejorada con C, mejor manejo de errores, características modernas y software más fácil de mantener. [12] [13] [10] [14]
V se lanza y desarrolla a través de GitHub [15] [6] y es mantenido por desarrolladores y colaboradores de la comunidad. [4]
V tiene políticas para facilitar la seguridad de la memoria, la velocidad y el código seguro. [7] [17] El lenguaje tiene varias características predeterminadas para una mayor seguridad del programa. [7] [17] [6] [9] Emplea la comprobación de límites , para protegerse contra el uso fuera de los límites de las variables. Se utilizan tipos?
de opción/resultado, donde el tipo de opción ( ) puede representarse por none
(entre las posibles opciones) y el tipo de resultado ( !
) puede manejar cualquier error devuelto. Para garantizar una mayor seguridad, la comprobación de errores es obligatoria en V. De forma predeterminada, entre los siguientes se encuentran inmutables : variables, estructuras y argumentos de función. Esto incluye valores de cadena que son inmutables, por lo que los elementos no se pueden mutar. Otras protecciones, que son predeterminadas para el lenguaje, son: no usar valores indefinidos , no sombrear variables , no usar null (a menos que el código esté marcado como inseguro) y no usar variables globales (a menos que se habilite mediante un indicador).
V utiliza tipos de valores y buffers de cadenas para reducir las asignaciones de memoria. [18] [19] [17] El lenguaje se puede compilar a C legible para humanos [4] [20] y se considera de alto rendimiento. [17]
Las 4 opciones admitidas por el lenguaje para la gestión de memoria son las siguientes: [21] [6] [22] [20]
-gc none
).-autofree
).-prealloc
).V admite un compilador de código fuente a código fuente (transpilador) y puede traducir código C a V. [23] [24] [10]
También se están desarrollando traductores funcionales para Go, JavaScript y WebAssembly . [25] [26]
El programa “¡Hola, mundo!” en V: [17]
fn main () { println ( "¡Hola, mundo!" ) }
Las variables son inmutables de forma predeterminada y se definen mediante :=
y un valor. Utilice la mut
palabra clave para hacerlas mutables. Las variables mutables se pueden asignar mediante =
: [27]
a := 1 mut b := 2 b = 3
No se permite redeclarar una variable, ya sea en un ámbito interno o en el mismo ámbito: [27]
a := 1 { a := 3 // error: redefinición de a } a := 2 // error: redefinición de a
Ejemplo de estructura: [12]
estructura Punto { x int y int } mut p := Point { x: 10 y: 20 } println ( p . x ) // Se accede a los campos de estructura usando un punto // Sintaxis literal alternativa para estructuras con 3 campos o menos p = Point { 10 , 20 } assert p . x == 10
Las estructuras se asignan en la pila de forma predeterminada. Para asignar una estructura en el montón y obtener una referencia a ella, &
se puede utilizar el prefijo: [12]
estructura Punto { x int y int } p := & Point { 10 , 10 } // Las referencias tienen la misma sintaxis para acceder a los campos println ( p . x )
Los métodos en V son funciones definidas con un argumento receptor. El receptor aparece en su propia lista de argumentos entre la palabra clave fn y el nombre del método. Los métodos deben estar en el mismo módulo que el tipo de receptor.
El método is_registered tiene un receptor de tipo Usuario llamado u. La convención es no utilizar nombres de receptor como self o this, sino preferiblemente un nombre corto. Por ejemplo: [9] [12]
estructura Usuario { edad int } fn ( u Usuario ) está_registrado () bool { return u . age > 16 } usuario := Usuario { edad: 10 } println ( usuario . está_registrado ()) // "falso" usuario2 := Usuario { edad: 20 } println ( usuario2 . está_registrado ()) // "verdadero"
Los tipos opcionales son aquellos que pueden representar a ninguno. Los tipos de resultado pueden representar un error devuelto por una función.
Los tipos de opción se declaran anteponiendo ?
al nombre del tipo: ?Type. Los tipos de resultado utilizan !
: !Type. [9] [7] [21]
fn do_something ( s cadena ) ! cadena { si s == "foo" { devolver "foo" } devolver error ( "cadena inválida" ) } a := do_something ( "foo" ) o { "default" } // a será "foo" b := do_something ( "bar" ) o { "default" } // b será "default" c := do_something ( "bar" ) o { panic ( "{err}" ) } // sale con el error "cadena inválida" y un seguimiento impresiónln ( a ) impresiónln ( b )