V , также известный как vlang , — статически типизированный , компилируемый язык программирования, созданный Александром Медведниковым в начале 2019 года. [4] Он был вдохновлён языком Go и другими языками, включая Oberon , Swift и Rust . [5] [6] [7] Это бесплатное программное обеспечение с открытым исходным кодом, выпущенное под лицензией MIT и в настоящее время находящееся в стадии бета-тестирования . [8]
Цели V включают простоту использования, читаемость и удобство обслуживания. [9] [10]
По словам одного из разработчиков, новый язык был создан в результате разочарования в существующих языках, используемых для личных проектов. [11] Изначально язык предназначался для личного использования, но после того, как он был упомянут публично и вызвал интерес, было решено сделать его публичным. V изначально был создан для разработки настольного клиента обмена сообщениями, известного как Volt. [6] После публичного выпуска компилятор был написан на V и мог компилировать себя сам. [4] Ключевыми целями проектирования, лежащими в основе создания V, были простота изучения и использования, более высокая читаемость, быстрая компиляция, повышенная безопасность, эффективная разработка, кроссплатформенное использование, улучшенная совместимость с C, лучшая обработка ошибок, современные функции и более простое в обслуживании программное обеспечение. [12] [13] [10] [14]
V выпускается и разрабатывается через GitHub [15] [6] и поддерживается разработчиками и участниками сообщества. [4]
V имеет политики для обеспечения безопасности памяти, скорости и защищенного кода. [7] [17] В языке есть различные функции по умолчанию для большей безопасности программы. [7] [17] [6] [9] Он использует проверку границ для защиты от использования переменных за пределами границ. Используются типы?
параметров/результатов, где тип параметра ( ) может быть представлен none
(среди возможных вариантов), а тип результата ( !
) может обрабатывать любые возвращаемые ошибки. Для обеспечения большей безопасности проверка ошибок является обязательной в V. По умолчанию среди следующих неизменяемыми являются : переменные, структуры и аргументы функций. Это включает строковые значения, которые являются неизменяемыми, поэтому элементы не могут быть изменены. Другие защиты, которые являются стандартными для языка, это: не использовать неопределенные значения , не затенять переменные , не использовать null (если код не помечен как небезопасный) и не использовать глобальные переменные (если они не включены с помощью флага).
V использует типы значений и строковые буферы для сокращения выделения памяти. [18] [19] [17] Язык может быть скомпилирован в понятный человеку C [4] [20] и считается производительным. [17]
Ниже перечислены четыре поддерживаемых языком варианта управления памятью: [21] [6] [22] [20]
-gc none
).-autofree
).-prealloc
).V поддерживает компилятор исходного кода (транспилятор) и может транслировать код C в V. [23] [24] [10]
Также разрабатываются рабочие трансляторы для Go, JavaScript и WebAssembly . [25] [26]
Программа «Hello, World!» на языке V: [17]
fn main () { println ( "Привет, мир!" ) }
Переменные по умолчанию неизменяемы и определяются с помощью :=
и значения. Используйте mut
ключевое слово, чтобы сделать их изменяемыми. Изменяемые переменные могут быть назначены с помощью =
: [27]
а := 1 мут б := 2 б = 3
Повторное объявление переменной, будь то во внутренней области видимости или в той же области видимости, не допускается: [27]
a := 1 { a := 3 // ошибка: переопределение a } a := 2 // ошибка: переопределение a
Пример структуры: [12]
структура Point { x int y int } mut p := Point { x: 10 y: 20 } println ( p . x ) // Доступ к полям структуры осуществляется с помощью точки // Альтернативный литеральный синтаксис для структур с 3 полями или меньше p = Point { 10 , 20 } assert p . x == 10
Структуры по умолчанию размещаются в стеке. Чтобы разместить структуру в куче и получить ссылку на нее, &
можно использовать префикс: [12]
структура Point { x int y int } p := & Point { 10 , 10 } // Ссылки имеют тот же синтаксис для доступа к полям println ( p . x )
Методы в V — это функции, определенные с аргументом-получателем. Получатель появляется в своем собственном списке аргументов между ключевым словом fn и именем метода. Методы должны находиться в том же модуле, что и тип получателя.
Метод is_registered имеет получателя типа User с именем u. Соглашение заключается в том, чтобы не использовать имена получателей, такие как self или this, но предпочтительнее короткое имя. Например: [9] [12]
структура User { age int } fn ( u Пользователь ) is_registered () bool { return u . age > 16 } пользователь := Пользователь { возраст: 10 } println ( пользователь . is_registered ()) // "ложь" пользователь2 := Пользователь { возраст: 20 } println ( пользователь 2 . is_registered ()) // "истина"
Необязательные типы предназначены для типов, которые могут не представлять ничего. Типы результатов могут представлять ошибку, возвращаемую функцией.
Типы опций объявляются путем добавления ?
к имени типа: ?Type. Типы результатов используют !
: !Type. [9] [7] [21]
fn do_something ( s string ) ! string { if s == "foo" { return "foo" } return error ( "недопустимая строка" ) } a := do_something ( "foo" ) или { "default" } // a будет "foo" b := do_something ( "bar" ) или { "default" } // b будет "default" c := do_something ( "bar" ) или { panic ( "{err}" ) } // завершается с ошибкой "invalid string" и трассировкой println ( а ) println ( б )