Релиз-кандидат №1 версии 2.0.0
Версия 2.0 представляет собой переход на современную версию .NET (бывший .Net Core) с глубоким рефакторингом ядра
Основные отличия от версии 1.х
- Имеет 2 режима компиляции и выполнения кода: классический (стековая машина) и native - компиляция в код машины .net
- Потенциально, режим native может быть строго типизированным и по производительности не отличаться от C#. На данный момент компиляция в строготипизированный код ограничена возможностями класса
СкомпилированныйФрагмент
- Имеется ряд несовместимых изменений (breaking-changes) по сравнению с версией 1.х. Они перечислены в отдельном разделе
- Не требует среды исполнения Mono и является кросс-платформенным изначально
- Изменен состав дистрибутивов, их расшифровка описана в отдельном разделе
- За счет рефакторинга компилятора, потенциально имеет возможность получения синтаксического сахара (в будущем), несовместимого с языком 1С, но дающего удобство написания кода
Нативная компиляция
Модуль, имеющий в начале директиву #native
будет скомпилирован новым компилятором и выполнен новой средой исполнения. Этот код - будет строго типизированным, поэтому, далеко не все привычные конструкции языка 1С будут работать. Например, не всегда можно записывать в одну и ту же переменную значения разных типов.
Синтаксические конструкции указания типов пока в язык не включены, поэтому типы выводятся по мере умственных возможностей компилятора. Иногда он не справляется, в этом случае нужно понять, простить, и зарегистрировать ошибку.
#native
Процедура МояПроцедура(Параметр1)
// Параметр1 - это "универсальный тип" в него можно записывать любое значение
А = 1; // Переменная А получает тип Число и в него уже нельзя присвоить строку
Параметр1 = А; // Ошибки нет, т.к. Параметр1 это универсальный тип
Б = "Значение А равняется " + А; // Переменная Б получает тип Строка и в нее уже нельзя присвоить что-то еще
Массив = Новый Массив;
Массив.Добавить(А); // Коллекции нетипизированы. Все что в них попадет, приводится к универсальному типу
Массив.Добавить(Б);
ЗначениеИзМассива = Массив[0]; // ЗначениеИзМассива - это универсальный тип
Массив[0] = 8; // Число 8 приводится к универсальному типу
// Переменная А это Число, универсальное значение из Массива попытается привестись к Числу
// во время выполнения кода (и выдаст ошибку, если этого нельзя сделать)
А = Массив[0];
КонецПроцедуры
Правила конверсии типов, а также языковые средства для явного указания типов планируются в будущих версиях
Зачем нужны типы и все эти сложности?
- Для высоконагруженных случаев (контроллеры веб-приложений), часто вызываемые классы, интенсивная работа с вводом-выводом
- Для экспериментов с типизацией старого-доброго bsl
- Потому что это зашибись!
Потеря совместимости
- Не поддерживается упаковка скрипта в единый exe файл (особенности netcore, возможно, что-то придумаем позже)
- Внешние компоненты от версии 1.x не будут работать без перекомпиляции/адаптации кода
- Не тестировалась работоспособность внешних компонент NativeAPI платформы 1С:Предприятие
- Не поставляется инсталлятор setup.exe (ставка на ovm)
Как выбрать дистрибутив
Дистрибутивы делятся по разрядности и типу поставки. С разрядностью все понятно, это x86 для 32битных сценариев, и x64 для всех прочих. Основным является 64-битный дистрибутив и применять следует именно его в большинстве случаев.
Тип поставки
- FDD (Framework Dependent Deployment) - Зависящая от фреймворка поставка. Требует наличия .net нужной версии (на данный момент 5-й) на целевой машине. Имеет маленький размер. Не зависит от операционной системы (один и тот же ZIP будет работать на Linux и Windows, при условии наличия на машине фреймворка .NET)
- SCD (Self Contained Deployment) - Самодостаточная поставка. Содержит фреймворк в себе, поэтому не требует наличия версии .net на машине, более того, если на машине стоит 50 различных версий .net, 1script будет использовать свою собственную, не порождая конфликта совместимости. Зависит от операционной системы, поэтому, разбивается на версию для windows и версию для linux.
Короче, Склихасофский
- Я хочу поставить и забыть: бери версию для конкретной ОС нужной разрядности
- Я хочу маленький размер дистрибутива и заморочусь отдельно с установкой .NET: бери версию fdd
- Я строю докер-образ, в базе которого возьму готовый образ от microsoft с готовым дотнетом: бери версию fdd