Skip to content

Нативный режим компиляции

Существует отдельный экспериментальный режим компиляции - Native. Его суть в том, что код компилируется в родной код машины .net и таким образом имеет производительность уровня .net.

Как обычно, есть нюанс: код должен быть строго-типизированным, а язык 1С не является таковым. В результате, код, который может быть скомпилирован в режиме native не является 100% совместимым с классическим режимом выполнения.

А в тех местах, где мы сохраняем все еще динамическую типизацию - код перестает быть очень быстрым и становится просто быстрым, как обычно.

Чтобы модуль скомпилировался в нативном режиме необходимо в начале модуля разместить директиву #native

Типизация известным типом

Пример несовместимости с классическим режимом: переменную нельзя перезаписать другим типом

bsl
#native

А = 8; // Переменная получит тип Число
Б = "Привет"; Переменная получит тип Строка

А = "Другой тип"; // Ошибка компиляции, тип Строка нельзя присвоить в тип Число

Потеря статической типизации

При вызове метода или возврате из метода переменная теряет информацию о типе. Это переключает рантайм в режим динамического выполнения и скорость выполнения теряется (пока, планируется работать над этим)

bsl
#native

Функция РаботаСЧислами()
    // Внутри цикла все работает с известными типами и типизация статическая.
    Для Сч = 1 По 10 Цикл
        Если Сч = 5 Тогда
            Возврат Сч;
        КонецЕсли;
    КонецЦикла;
КонецФункции

// Тип переменной ЧислоИзМетода на этапе компиляции неясен
// Она будет иметь универсальный тип, который обрабатывается динамически

ЧислоИзМетода = РаботаСЧислами();

А = ЧислоИзМетода + 8; // А тоже имеет универсальный тип, который не очень быстрый.

Аналогично тип теряется при работе с универсальными коллекциями. Мы планируем расширить синтаксис языка, чтобы можно было явно задавать типы и сохранять таким образом строгую типизацию.