V – значит... язык программирования!
С примерами кода рассказываем про характеристики языка программирования V и его преимущества перед другими компилируемыми языками. Сравниваем производительность и показываем примеры приложений.
Несмотря на свою простоту, язык V может использоваться практически во всех областях разработки: системное программирование, веб, разработка игр, GUI, мобильные приложения и научные исследования.
V представляет собой компилируемый в машинный код язык со статической типизацией, сосредоточенный на решении задач по упрощению сопровождения разработки и обеспечению максимальной высокой скорости компиляции. Код компилятора, библиотек и сопутствующих инструментов открыт под лицензией MIT.
В этой публикации мы рассмотрим основные характеристики языка, примеры кода и как установить средства работы с языком на вашей операционной системе.
Основные характеристики
Вот как характеризуют язык автор проекта и те, кто им успели воспользоваться:
- Простота: при знакомстве с другими языками, изучить V можно выучить менее, чем за час
- Быстрая компиляция: от 100 тыс. до 1,2 млн строк кода в секунду на одном ядре CPU (данные приведены для Intel i5-7500 @ 3.40GHz, SM0256L SSD, без оптимизации). Самосборка компилятора: от 0.15 – 0.6 с
- Безопасность: нет
null
иglobals
, никакого неопределенного поведения, иммутабельный по умолчанию - Возможность бесшовного взаимодействия с C-кодом
- Трансляция проектов на C/С++
- Кроссплатформенная UI-библиотека
- Встроенная графическая библиотека
- Легкая кросс-компиляция
- Программы компилируются в исполняемые файлы без внешних зависимостей
- Поддержка hot reload: при внесении изменений не требуется компилировать код заново
- Есть интерактивная среда (REPL)
- Встроенный ORM (объектно-реляционное отображение)
- Встроенный веб-фреймворк
- Нет сборщика мусора или подсчета ссылок. Очистка происходит во время компиляции. Если V-программа компилируется, в ней нет утечек памяти.
- Язык имеет модульную структуру, есть менеджер пакетов vpm. Установка пакетов выглядит так:
v install sqlite
- Чтобы вызвать функцию
foo()
в новом потоке, достаточно написатьgo foo()
Александр Медведников начал работу над языком для решения собственных задач, и постоянно его совершенствует. В проекте сейчас 200 контрибьюторов, код распространяется по лицензии MIT.
Примеры кода
Не будем далеко ходить, посмотрим сразу на примеры кода. Протестировать их и примеры из документации можно, не устанавливая V – на онлайн-площадке Playground.
Расширенный "Hello world"
fn main() { areas := ['game', 'web', 'tools', 'science', 'systems', 'GUI', 'mobile'] for area in areas { println('Hello, $area developers!') } }
Hello, game developers! Hello, web developers! Hello, tools developers! Hello, science developers! Hello, systems developers! Hello, GUI developers! Hello, mobile developers!
Числа Фибоначчи
fn fib(n int) int { if n <= 1 { return n } return fib(n - 1) + fib(n - 2) } fn main() { for i := 0; i < 10; i++ { println(fib(i)) } }
0 1 1 2 3 5 8 13 21 34
Числа Фибоначчи + мемоизация
const ( MAX = 15 ) struct Fib { nums []int } fn (fib mut Fib) calc(n int) int { if n <= 1 { return n } if fib.nums[n] != 0 { return fib.nums[n] } fib.nums[n] = fib.calc(n - 1) + fib.calc(n - 2) return fib.nums[n] } fn main() { mut fib := Fib { nums: [0].repeat(MAX) } for i := 0; i < MAX; i++ { println(fib.calc(i)) } }
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
JSON кодирование/декодирование
import json struct User { name string age int mut: is_registered bool } fn main() { s := '[{ "name":"Frodo", "age":25}, {"name":"Bobby", "age":10}]' mut users := json.decode( []User, s) or { eprintln('Failed to parse json') return } for user in users { println('$user.name: $user.age') } println('') for i, user in users { println('$i) $user.name') if !user.can_register() { println('Cannot register $user.name, they are too young') continue } users[i].register() // `user` is immutable, we have to modify the array } // Let's encode users again just for fun println('') println(json.encode(users)) } fn (u User) can_register() bool { return u.age >= 16 } fn (u mut User) register() { u.is_registered = true }
Перегрузка операторов
struct Vec { x int y int } pub fn (a Vec) str() string { return '{$a.x, $a.y}' } fn (a Vec) + (b Vec) Vec { return Vec { a.x + b.x, a.y + b.y } } fn (a Vec) - (b Vec) Vec { return Vec { a.x - b.x, a.y - b.y } } fn main() { a := Vec{2, 3} b := Vec{4, 5} println(a + b) println(a - b) }
{6, 8} {-2, -2}
Обновленная копия struct
struct User { name string age int } fn main() { user1 := User{'Bob', 20} user2 := { user1 | name: 'Peter' } println(user1.name) println(user1.age) println(user2.name) println(user2.age) }
Bob 20 Peter 20
Установка V
Средства работы с языком можно установить из сборок (Linux, macOS, Windows) или из исходников, клонировав репозиторий с GitHub:
git clone https://github.com/vlang/v cd v make
Это уже полностью готовый V, который доступен по адресу [путь к V repo]/v
. На
Windows следует через командную строку использовать make.bat
.
Язык постоянно обновляется. Чтобы сделать апдейт, используем простую команду:
v up
Компилятор C. Для работы с языком V вам также понадобится C-компилятор – можно использовать такие средства, как Clang, GCC или Visual Studio. Если у вас нет компилятора, воспользуйтесь инструкциями для своей платформы.
- macOS: Установите XCode из App Store или запустите
xcode-select --install
для установки инструментов XCode. - Debian/Ubuntu: в терминале
sudo apt install build-essential
- CentOS/RHEL:
sudo yum groupinstall "Development Tools"
- Fedora:
sudo dnf install @development-tools
- Arch Linux: V можно найти в AUR vlang или vlang-git.
На Windows можно использовать MinGW-w64, Visual Studio или llvm-mingw. Visual Studio занимает гораздо больше места, но если вы планируете использовать UI-библиотеку, эта среда предпочтительнее. Язык V использует функции Windows: поддержка вывода цвета в консоли, IPv6, TLS на сокетах и др.
Симлинк. Можно создать символьную ссылку /usr/local/bin/v
, чтобы V был доступен глобально: sudo ./v symlink
Docker. Средства языка также доступны в виде образа Docker:
git clone https://github.com/vlang/v cd v docker build -t vlang . docker run --rm -it vlang:latest
Docker на Alpine/musl:
git clone https://github.com/vlang/v cd v docker build -t vlang --file=Dockerfile.alpine . docker run --rm -it vlang:latest /usr/local/v/v
Тестируем!
Убедимся, что V может сам себя скомпилировать:
v -o v2 cmd/v $ v V 0.1.x Use Ctrl-C or `exit` to exit >>> println('hello world') hello world >>>
Проверим, что работают примеры:
cd examples v hello_world.v && ./hello_world # или проще v run hello_world.v # так можно собрать и запустить код v word_counter.v && ./word_counter cinderella.txt v run news_fetcher.v v run tetris/tetris.v
Чтобы с помощью графического модуля создать тетрис или что-то подобное, вам также потребуются библиотеки glfw
и freetype
.
Если вы планируете использовать пакет http
, то на системах, отличных от Windows, необходимо установить
OpenSSL
:
macOS: brew install glfw freetype openssl Debian/Ubuntu: sudo apt install libglfw3 libglfw3-dev libfreetype6-dev libssl-dev Arch/Manjaro: sudo pacman -S glfw-x11 freetype2 Fedora: sudo dnf install glfw glfw-devel freetype-devel Windows: git clone --depth=1 https://github.com/ubawurinna/freetype-windows-binaries [path to v repo]/thirdparty/freetype/
Графический интерфейс V
V UI – это кроссплатформенный инструментарий, написанный на V для Windows, macOS, Linux (скоро будет для Android, iOS и JS/WASM). Графический интерфейс V использует нативные виджеты на Windows и macOS, а на других платформах они написаны сразу на V.
ui.window({ width: 600 height: 400 title: 'V UI Demo' }, [ ui.row({ stretch: true margin: {10, 10, 10, 10} }, [ ui.column({ width: 200 spacing: 13 }, [ ui.textbox({ max_len: 20 width: 200 placeholder: 'First name' }) ui.textbox({ max_len: 50 width: 200 placeholder: 'Last name' }) ]) ]) ]);
Установка:
v up v install ui
Запуск:
cd examples v run users.v v run temperature.v v run ...
Библиотеке предстоит еще долгий процесс роста, многие функции пока отсутствуют.
Бинарники, созданные с помощью V UI, не имеют зависимостей. Для того чтобы начать разработку V UI-приложений необходимо установить V
, glfw
и freetype
(glfw
скоро будет изъята из списка необходимых).
macOS: brew install glfw freetype Debian/Ubuntu: sudo apt install libglfw3 libglfw3-dev libfreetype6-dev Arch/Manjaro: sudo pacman -S glfw-x11 freetype2 Fedora: sudo dnf install glfw glfw-devel freetype-devel ClearLinux: sudo swupd bundle-add devpkg-libX11 devpkg-mesa devpkg-freetype devpkg-glfw3 Windows: git clone --depth=1 https://github.com/ubawurinna/freetype-windows-binaries [path to v repo]/thirdparty/freetype/
Что уже написано на языке V
Большинство из следующих программ имеют открытый исходный, так что вы можете посмотреть примеры рабочего кода:
- Компилятор языка и средства работы с языком: V UI, транслятор из C/C++ на V и др.
- Volt – легковесный десктопный клиент для работы со Slack, Skype, Gmail, Twitter, Facebook, Telegram, Twitch и другими ресурсами
- Vid – небольшой и быстрый текстовый редактор для кода
- Gitly – open source альтернатива GitHub/GitLab
- vgram – библиотека для написания телеграм-ботов
Заключение
Язык программирования V является интересной альтернативой популярным языкам с компиляцией кода быстрее, чем в C++. По сравнению с Go, в V поддерживается только один вид
присваиваний, отсутствует null
и глобальные переменные. Если вам интересно сопоставить V с этими и другими языками, просмотрите эту страницу.
Важно, что язык развивается и не стоит на месте. В скором будущем можно ожидать расширения функциональности и исправления мелких недочетов.