Открыты исходные тексты языка программирования V

24 июня 2019 года

Переведён в разряд открытых компилятор для языка V. V представляет собой компилируемый в машинный код язык со статической типизацией, сосредоточенный на решении задач по упрощению сопровождения разработки и обеспечению очень высокой скорости компиляции. Код компилятора, библиотек и сопутствующих инструментов открыт под лицензией MIT.

Синтаксис V во многом походит на язык Go с заимствованием некоторых конструкций из Oberon, Rust и Swift. Язык максимально упрощён и, по заявлению разработчика, для изучения базовых основ достаточно 30 минут на изучение документации. При этом язык остаётся достаточно мощным и может применяться для выполнения тех же задач, что и при использовании других языков программирования (например, доступны библиотеки для 2D/3D графики, создания GUI и web-приложений).

К созданию нового языка побудило желание добиться сочетания свойственных языку Go простоты синтаксиса, скорости компиляции, простоты распараллеливания операций, переносимости и сопровождаемости кода с производительностью С/C++, защищённостью Rust и генерацией машинного кода на этапе компиляции Zig. Также хотелось получить компактный и быстрый компилятор, способный работать без внешних зависимостей, избавиться от глобальной области видимости (глобальных переменных) и обеспечить возможность "горячей" перезагрузки кода.

По сравнению с C++ новый язык существенно проще, обеспечивает более высокую скорость компиляции (до 400 раз), практикует приёмы безопасного программирования, избавлен от проблем с неопределённым поведением и предоставляет встроенные средства для распараллеливания операций. По сравнению с Python язык V быстрее, проще, безопаснее и удобнее в сопровождении. По сравнению с Go в V нет глобальных переменных, нет null, все значения переменных всегда обязательно должны быть определены, все объекты по умолчанию являются неизменяемыми (immutable), поддерживается только один вид присвоений ("a := 0"), существенно более компактный runtime и размер итоговых исполняемых файлов, наличие прямой переносимости с Си, отсутствие сборщика мусора, более быстрая сериализация, возможность интерполяции строк ("println('$foo: $bar.baz')").


fn main() {
	areas := ['game', 'web', 'tools', 'science', 'systems', 'GUI', 'mobile']
	a := 10
	if true {
		a := 20
	}
	for area in areas {
		println('Hello, $area developers!')
	}
}	

Особенности проекта:

  • Компактный и быстрый компилятор, который вместе со стандартной библиотекой занимает около 400 КБ. Высокая скорость компиляции достигается благодаря прямой генерации машинного кода и модульности. Скорость компиляции составляет примерно 1.2 млн строк кода в секунду на одном ядре CPU (отмечается, что в процессе работы V может использовать Си, тогда скорость падает до 100 тысяч строк в секунду). Самосборка компилятора, который также написан на языке V (также имеется эталонный вариант на Go), занимает примерно 0.4 сек. К концу года ожидается завершение работы над дополнительными оптимизациями, которые позволят уменьшить время сборки компилятора до 0.15 сек. Судя по проведённым разработчиком тестам самосборка Go требует 512 Мб дискового пространства и выполняется за полторы минуты, Rust требует 30 Гб и 45 минут, GCC - 8 ГБ и 50 минут, Clang - 90 Гб и 25 минут,

Swift - 70 ГБ и 90 минут;

  • Программы компилируются в исполняемые файлы без внешних зависимостей. Размер исполняемого файла простого http-сервера после сборки составляет всего 65 КБ;
  • Производительность скомпилированных приложений находится на уровне сборок программ на языке Си;
  • Возможность бесшовного взаимодействия с Си-кодом, без дополнительных накладных расходов. Из кода на языке V могут вызываться функции на языке Си и наоборот, код на языке V может вызываться в любых языках, совместимых с Си;
  • Поддержка трансляции проектов на C/C++ в представление на языке V. Для трансляции используется парсер от Clang. Не все возможности стандарта Си пока поддерживаются, но текущих возможностей транслятора уже достаточно для перевода на язык V игры DOOM. Транслятор с C++ пока находится на начальной стадии развития;
  • Встроенная поддержка сериализации, без привязки к runtime;
  • Минимизация операций распределения памяти;
  • Обеспечение безопасности: отсутствие NULL, глобальных переменных, неопределённых значений и переопределения переменных. Встроенные средства для проверки выхода за границы буфера. Поддержка обобщённых функций (Generic). Не изменяемые по умолчанию объекты и структуры;
  • Возможность "горячей" перезагрузки кода (отражения изменений в коде на лету без перекомпиляции);
  • Средства для обеспечения многопоточности. Как и в языке Go, для запуска нового потока выполнения используется конструкция вида "run foo()" (по аналогии с "go foo()"). В будущем планируется поддержка goroutines и планировщика потоков;
  • Поддержка операционных систем Windows, macOS, Linux, *BSD. До конца года планируется добавить поддержку Android и iOS;
  • Управление памятью на этапе компиляции (как в Rust), без применения сборщика мусора;
  • Наличие многоплатформенного тулкита для вывода графики, использующего для отрисовки GDI+/Cocoa и OpenGL (в планах поддержка API DirectX, Vulkan и Metal). Имеются средства для работы с 3D-объектами, скелетной анимацией и управления камерой;
  • Наличие библиотеки для формирования графических интерфейсов с родными для каждой ОС элементами оформления. В Windows используется WinAPI/GDI+, в macOS - Cocoa, в Linux - собственный набор виджетов. Библиотека уже используется при разработке Volt - клиента для Slack, Skype, Gmail, Twitter и Facebook;

Планируется создание похожего на Delphi приложения для проектирования интерфейса, предоставление декларативного API, похожего на SwiftUI и React Native, и обеспечение поддержи создания мобильных приложений для iOS и Android;

  • Наличие встроенного web-фреймворка, который использован для создания сайта, форума и блога разработчиков проекта. Поддерживается предкомпиляция HTML-шаблонов, без их обработки при каждом запросе;
  • Поддержка кросс-компиляции. Для сборки исполняемого файла для Windows достаточно запустить "v -os windows", а для Linux - "v -os linux" (поддержка кросс-компиляции для macOS ожидается позднее). Кросс-компиляция в том числе работает и для графических приложений;
  • Встроенный менеджер зависимостей, пакетный менеджер и инструментарий сборки. Для сборки программы достаточно запустить "v .", без использования make и внешних утилит. Для установки дополнительных библиотек достаточно выполнить, например, "v get sqlite";
  • Наличие плагинов для разработки на языке V в редакторах VS Code и Vim.

Разработка воспринята сообществом со скептицизмом, так как опубликованный код показал, что не все заявленные возможности пока реализованы и для воплощения всех планов требуется выполнить очень большой объём работы. Кроме того, изначально в репозитории был размещён неработающий код, в котором наблюдаются проблемы со сборкой и выполнением. Предполагается, что автор ещё не достиг стадии, на которой начинают замечать закон Парето, в соответствии с которым 20% усилий дают 80% результата, а остальные 80% усилий — лишь 20% результата.

Тем временем, в трекере ошибок проекта V было удалено около 10 сообщений с демонстрацией низкого качества кода, например, указано на применение Си-вставок и использование в библиотеке функций для удаления каталога команды rm через вызов os.system("rm -rf $path"). Автор проекта заявил, что он лишь удалил сообщения, опубликованные троллем (при этом изменения, подтверждающие обоснованность критики, остались в истории правок).

Источники править


 
 
Creative Commons
Эта статья содержит материалы из статьи «Открыты исходные тексты языка программирования V», опубликованной OpenNET и распространяющейся на условиях лицензии Creative Commons Attribution (CC BY) — указание автора, источник и лицензию.
 
Эта статья загружена автоматически ботом NewsBots в архив и ещё не проверялась редакторами Викиновостей.
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.

Комментарии

Викиновости и Wikimedia Foundation не несут ответственности за любые материалы и точки зрения, находящиеся на странице и в разделе комментариев.