Открыты исходные тексты языка программирования 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"). Автор проекта заявил, что он лишь удалил сообщения, опубликованные троллем (при этом изменения, подтверждающие обоснованность критики, остались в истории правок).
Источники править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.