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.

Временная лента автора на GitHub

Примеры кода

Не будем далеко ходить, посмотрим сразу на примеры кода. Протестировать их и примеры из документации можно, не устанавливая 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 с этими и другими языками, просмотрите эту страницу.

Важно, что язык развивается и не стоит на месте. В скором будущем можно ожидать расширения функциональности и исправления мелких недочетов.

Источники

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ