+38/050/370-3627
+38/093/220-0872
+38/044/257-2444
Новини

Відкрито вихідні тексти мови програмування V. Код компілятора, бібліотек та супутніх інструментів відкритий під ліцензією MIT

Відкрито вихідні тексти мови програмування V. Код компілятора, бібліотек та супутніх інструментів відкритий під ліцензією MIT

Переведений в розряд відкритих компілятор для мови 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 "). Автор проекту заявив, що він лише видалив повідомлення, опубліковані тролем (при цьому зміни, що підтверджують обґрунтованість критики, залишилися в історії правок).

Інші новини