eFusion 23 февраля 2020

V – значит... язык программирования!

С примерами кода рассказываем про характеристики языка программирования 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
Временная лента автора на 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

    
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.

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 с этими и другими языками, просмотрите эту страницу.

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

Источники

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

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