Сверхбыстрый код 1С. Анонс функциональности 1Script.Native с JIT на борту

  Рет қаралды 7,740

Веселый1С

Веселый1С

3 жыл бұрын

В 1Script 2.0 появится новый компилятор, позволяющий превращать код 1С в статически типизированный байткод .NET с поддержкой JIT-трансляции в железный машинный код.
В этом видео я покажу его возможности на примере уже знакомого вам Решета Эратосфена. Это пушка, ребята!

Пікірлер: 78
@user-vl7bh7gd3l
@user-vl7bh7gd3l 3 жыл бұрын
Молодцы ребята! Так держать!
@invertriver
@invertriver 2 жыл бұрын
Здорово, спасибо что ты это делаешь!)
@shootnicktm9445
@shootnicktm9445 3 жыл бұрын
компоненты для 1с на 1с это огонь =)
@maksymartomenko7633
@maksymartomenko7633 3 жыл бұрын
Очень круто! Как бы там ни было, но вк на 1С существенно сократят себестоимость разработки самих вк
@pbabincev
@pbabincev 2 жыл бұрын
Красавчики!
@channel30495
@channel30495 3 жыл бұрын
Молодцы парни! Не бросайте это дело
@serj0peleng
@serj0peleng 3 жыл бұрын
Круто!!! Поздравляю с очередным успехом! Конечно большие алгоритмы таким путем не слишком удобно будет делать, но чаще всего это и не потребуется, только очень прожорливые куски можно будет оптимизировать... Мне кажется, что вместо специального объекта можно было бы сделать специального вида функцию... тогда не пришлось бы код строкой задавать, что было бы гораздо удобнее, особенно в части превращения обычной функции в компилируемую в случае необходимости... а в целом здорово! Скоро Односкрипт сделает мою Перфоленту совсем не нужной :), хотя мне кажется они подружатся...
@mevgen8
@mevgen8 3 жыл бұрын
Надо б такую полезную фичу в иссусы запилить
@asoneas
@asoneas 2 жыл бұрын
В браузере есть WebAssembly (WASM) , а в 1С предлагаете 1СAssembly? Жалко что само 1С ушло в JVM и совместимости подходов нельзя достичь.
@user-yu4ws2ou8y
@user-yu4ws2ou8y Жыл бұрын
WebAssembly сила, но почему-то пока никак не задействовано для серверной стороны. Впрочем JS тоже долго это обходил - а потом пришёл Node.js. А так да - для WEB'а уже однозначно надо 1С в WASM компилить
@user-yu4ws2ou8y
@user-yu4ws2ou8y Жыл бұрын
А Перфолента ещё жива? - последняя новость, как и последний релиз пробной версии Перфоленты, на сайте вендора от 2021 года! А то, вот хотел на Перфоленте фреймворк для инфраструктуры 1С написать - но застой в обновлении проекта меня отпугнул - теперь смотрю в строну C# Roslyn с апдейтом на русские ключевые слова (не ищите - такого нет - это пока фантазия)
@serj0peleng
@serj0peleng Жыл бұрын
@@user-yu4ws2ou8y жива! но сначала меня подкосил ковид, а потом войнушка... когда за окном бахает, плохо думается... проверено :) а серьёзно, планы похерены больше, чем на год, но новый релиз скоро выйдет...
@korableg
@korableg 3 жыл бұрын
Браво! ждем строгую типизацию от 1С) надеюсь их это видео замотивирует.
@aleksandr_sp7721
@aleksandr_sp7721 3 жыл бұрын
Через лет 20 может будет)
@medvejonokolympic5412
@medvejonokolympic5412 2 жыл бұрын
1С - это уже лет как 18 - 20 тормозное минестерство.
@kuzja_87
@kuzja_87 3 жыл бұрын
Интересно сравнить что будет быстрее. На СУБД выполнить алгоритм или через ваш пример?
@Alexandr_Pu
@Alexandr_Pu 3 жыл бұрын
Очень круто! Скинул видео в несколько групп по франчайзи - разработчики заинтересовались.
@user-zr4uw5ng3r
@user-zr4uw5ng3r 3 жыл бұрын
Они еще не знали про 1Script? А они точно профпригодны?
@dmitryk.4286
@dmitryk.4286 3 жыл бұрын
В общем недалек тот час, когда 1Script будет обязательным в стеке программиста 1С, круто, что сказать
@user-zr4uw5ng3r
@user-zr4uw5ng3r Жыл бұрын
Это уже так
@user-yu4ws2ou8y
@user-yu4ws2ou8y Жыл бұрын
Круто! Но ожидал от 2-ой версии всё-таки хотя бы поддержки асинхронного программирования, а лучше ещё и полноценного многопоточного программирования и Тасков .NET. А так же лямбда функций и LINQ-подобных запросов к БД (хотя бы через Entity Framework) и к объектной модели. Не говоря уже о пользовательском ООП и Кортежах. Но это я, наверное, слишком размечтался...
@yuriybylinkin
@yuriybylinkin 3 жыл бұрын
Круто!
@ilm1967
@ilm1967 3 жыл бұрын
Непонятно, но интересно.
@Asakra-irk
@Asakra-irk 3 жыл бұрын
Хех. Надо добавить директиву в начале файла и тогда все что внутри файла должно исполнятся, как внутри класса скомпилированный фрагмент. Программист естественно должен учитывать типизацию.
@ktoeto8094
@ktoeto8094 3 жыл бұрын
Ещё более быстрый! Куда уже)
@0ut10w
@0ut10w 2 жыл бұрын
А можно будет Фрагмент.Скомпилировать() положить в Макет как двоичные данные, а затем загрузить их и Выполнить(Н, Массив); ? :-)
@user-nd9cv4pd5m
@user-nd9cv4pd5m 2 жыл бұрын
Сейчас нет, байткод не сериализуется. Потенциально можно будет прямо в dll сохранять, но это тоже не реализовано
@user-yu4ws2ou8y
@user-yu4ws2ou8y Жыл бұрын
Круто. Но, всё-таки, самое больше лукавство - это оставленное вне учета затрат - время на накладные расходы компиляции - наверное имело смысл вывести в отдельную колонку такие тесты. Слукавили и на тесте со 100 элементами - частенько как раз тут бывают самые неожиданные отличия (и именно тут 1Script уже в 5 раз проигрывал 1С Предприятие 8) - а это не какие-то редкие случаи - а вполне обыденные. Оставлена за кадром и директива #native (кстати у неё будет русский синоним?) для авто компиляции всего модуля (секция инициализации компилируется? хотелось бы отдельные и аннотации для функций) - тут бы пояснения по режиму работы - в какой момент идёт компиляция модуля - при инициализации (хотел сказать при статической компиляции скрипта - но тут же понял - что это всё-таки скрипт) или при первом (каждом) обращении к его содержимому. Странно, что проблему смены типа значения переменной не решили (по крайней мере на первой стадии) просто через приведение к единому типу object (или структуре со значением типа object и описанием типа; да и вообще можно было бы задействовать уже имеющийся тип для хранения значений в 1Script для стековой машины). И что там будет происходить, если в таком скомпилированном коде будут вызываться внешние пользовательские функции (не из модуля native) - они-то не скомпилированы в машинный код?
@user-zr4uw5ng3r
@user-zr4uw5ng3r Жыл бұрын
На момент создания видео, никакой директивы native еще не существовало. Это первое. Второе, никакого лукавства не было, а расходы на компиляцию включены в тест, а не оставлены за кадром, не надо вот тут утверждать, чего не знаете. И да, если у вас есть тест, который показывает, что 1Скрипт медленнее 1С, да еще и в 5(!) раз - мы такие случаи считаем ошибкой. Поделитесь примером такого кода и мы будем исправлять такое замедление
@user-yu4ws2ou8y
@user-yu4ws2ou8y Жыл бұрын
Тогда про #naitive стоит ещё видео записать, наверное позже (как минимум после финального релиза), с отдельным тестом. Ну а время, всё-таки компиляции никак не учтено замер времени начинается внутри компилируемого блока в после начала вызова и завершается перед окончанием вызова так же внутри текстового блока. Получается не совсем чистый замер. Понятно, что компиляцию можно выполнить один раз - а потом делать многократные вызовы - но именно в таком примере как в приведённом тест (и вероятно наиболее распространённом в случаях без #native директивы) компиляция и вызов будут идти всегда вместе. 1Script медленнее 1С в 5 раз у Вас в видео при 100 элементах массива без native-компиляции (0.005 против 0.001 у 1С, может, конечно погрешность измерений, тест то один раз запущен - а не 1000 раз с вычислением средне-статистического - лучше взять общее суммарное чистое время и поделить на количество запусков), с native - этот случай Вы вообще не замерили; неплохо было бы ещё рассмотреть 1000 или 10000 элементов - для снижения погрешности замера быстро завершающихся процессов. Ну и всё-таки нужны отдельные тесты с выполнением циклических вызовов функций - как находящихся внутри того же скомпилированного native блока (если это поддерживается), так внутри #native модуля, так и вне native-компиляции (если это всё поддерживается). И как реагирует native-блок на обращение внутри к объекту "СкомпилированныйФрагмент" (в т.ч. переданный из внешнего блока в качестве переменной)? Если позволяет - то внутри тоже можно было бы вызвать функцию из внешнего скомпилированного native-блока. Хотелось бы знать и во что обходится сам чистый вызов "Действие.Выполнить()"?
@user-zr4uw5ng3r
@user-zr4uw5ng3r Жыл бұрын
Да, можно придумать еще много разных тестов. Исходники, показанные в видео - открыты, можно обмазать их любыми требумыми счетчиками, велкам
@Tavalik
@Tavalik 3 жыл бұрын
Вы, конечно, большие молодцы, но боюсь представить, что вы такого на ОСкрипте делаете, что вам так скорость важна? Или это все ради спортивного интереса?
@user-nd9cv4pd5m
@user-nd9cv4pd5m 3 жыл бұрын
Академический интерес, и более гладкое встраивание скриптов на 1С в процессы .net
@PupaVaskin
@PupaVaskin 3 жыл бұрын
Таки осталось не совсем понятно, код компилирутся прямо в машинный код или в код .нета, а там уже как пойдет?
@user-nd9cv4pd5m
@user-nd9cv4pd5m 3 жыл бұрын
Код компилируется в лямбда-функции дотнета. А они по сути - и есть код дотнета. А там - как и любой другой .net код - как пойдет )
@uppinua
@uppinua 3 жыл бұрын
Очередное изобретение велосипеда от 1С. Что мешает на С++ рисовать dll и выносить логику расчетов туда? Обычно люди делающие сложные расчета (расчет окон как пример) именно так и делает
@user-nd9cv4pd5m
@user-nd9cv4pd5m 3 жыл бұрын
Это не "от 1С", в 1С такого нет
@uppinua
@uppinua 3 жыл бұрын
@@user-nd9cv4pd5m уже увидел, что это такое . Смутило в названии 1S. Но в любом случае прослойка для ускорения нигде не пригодится. dll рисуется на коленке быстро и после компиляции будет быстрее в сложных расчетах.
@user-nd9cv4pd5m
@user-nd9cv4pd5m 3 жыл бұрын
C++ и "на коленке" в одном предложении - быстрый путь разломать кластер. Плюсы - не очень удобный язык для написания вообще чего-либо, а уж ВК для 1с его тонной ограничений и скудным апи - и подавно.
@user-fz1cv8fq6w
@user-fz1cv8fq6w 3 жыл бұрын
Вы там живы?
@user-vy5kq1hu6k
@user-vy5kq1hu6k 3 жыл бұрын
какая область применения для 1с?
@shootnicktm9445
@shootnicktm9445 3 жыл бұрын
как ты пишешь в интернет без интернета?)
@8tshk8
@8tshk8 2 жыл бұрын
@@maxumka548 особенно внедрение маркировки (сарказм) Да. Большая часть изменений законодательства оперативно отражается в учетных системах. Но я бы не сказал что бухгалтерия. Правильней было бы сказать учет.
@asoneas
@asoneas 3 жыл бұрын
1C OneScript (Х)? .Net на машине требуется?
@user-zr4uw5ng3r
@user-zr4uw5ng3r 3 жыл бұрын
В версии 2.0 - нет
@asoneas
@asoneas 2 жыл бұрын
@@user-zr4uw5ng3r Спасибо большое. В 1С Ваш проект как глоток свежего воздуха, хотя сам и дотнетчик ;)
@user-vu3vb8bz8i
@user-vu3vb8bz8i 2 жыл бұрын
У меня только один вопрос, зачем это делать? Зачем вообще что то делать на 1с? Чтобы потом придумывать такие алгоритмы? Здесь много умных людей. Поясните пожалуйста..
@user-nd9cv4pd5m
@user-nd9cv4pd5m 2 жыл бұрын
Because it's fucking awesome!
@жек-петрушевич
@жек-петрушевич 2 жыл бұрын
не совсем понятно зачем писать на 1с для дотнета, если уж есть большая потребность в оптимизации скорости то возможно логичней разработать отдельный сервис на дотнете.
@user-nd9cv4pd5m
@user-nd9cv4pd5m 2 жыл бұрын
Чтобы реализовать отдельный сервис на дотнете, нужно знать какой-либо дотнет-язык
@жек-петрушевич
@жек-петрушевич 2 жыл бұрын
@@user-nd9cv4pd5m это безусловно так, но ведь и язык 1с покроет только базовые возможности дотнета. получается от 1с только текст программы.
@user-nd9cv4pd5m
@user-nd9cv4pd5m 2 жыл бұрын
Для производительной числодробилки что-то кроме языка редко нужно. Для сервиса (если мы говорим про веб-сервис) нужен веб-сервер и mvc-фрэймворк. А это в оскрипте тоже есть в виде OneScript.Web. Так что... Не такая уж и безумная идея :)
@жек-петрушевич
@жек-петрушевич 2 жыл бұрын
@@user-nd9cv4pd5m идея как раз интересная, продолжайте исследования, я уверен это будет полезно!
@ZloGleb
@ZloGleb Жыл бұрын
Лично мне абсолютно не понятно: зачем нужна строка "Действие = Фрагмент.Скомпилировать". Мне гораздо привычнее было бы работь с новым типом СкомпилированныйФрагмент() как с типом Запрос(): Фрагмент.УстановитьПараметр("Н", Н); Фрагмент.Выполнить();. Для чего тип параметра указывать вручную, если этот тип статичен и 1Script может сам определить тип через ТипЗнч() непосредственно перед Фрагмент.Выполнить()?
@user-nd9cv4pd5m
@user-nd9cv4pd5m Жыл бұрын
В момент вызова "Скомпилировать" типы должны быть уже известны, т.к. код, который будет внутри метода формируется с учетом этих типов. Можете привести пример кода, как бы вы хотели видеть API класса СкомпилированныйФрагмент? Пример, как вы его бы применяли в вашем случае?
@ZloGleb
@ZloGleb Жыл бұрын
@@user-nd9cv4pd5m Мое мнение, что нужно стремиться к единственному вызову для класса "СкомпилированныйФрагмент" функции "Фрагмент.Выполнить(Алгоритм, ПараметрыАлгоритма )". Лямбда функций пока не завезли в 1С, поэтому 2й параметр сделать исключительно с типом "[Фиксированная]Структура", что обеспечит уникальность и правильность наименований параметров в этой структуре. Пока этого нет, я бы сделал такую обертку в отдельном os файле: // Возврат результата действия алгоритма через объект СкомпилированныйФрагмент(). // // Параметры: // Алгоритм - Строка - Текст выполняемого алгоритма. // Параметры - Массив, Структура, Соответствтвие - входящие параметры алгоритма. // Если тип = массив, то элементами должны быть структурами или соответствиями. // // Возвращаемое значение: // Произвольное - Результат действия алгоритма. // Функция РезультатДействияАлгоритма(Знач Алгоритм, Знач ПараметрыАлгоритма = Неопределено) РезультатАлгоритма = Неопределено; Если НЕ ЗначениеЗаполнено(Алгоритм) Тогда Возврат РезультатАлгоритма; КонецЕсли; Фрагмент = Новый СкомпилированныйФрагмент(); Фрагмент.ФрагментКода = Алгоритм; НаборПараметров = Новый Массив; Если ЗначениеЗаполнено(ПараметрыАлгоритма) Тогда Если ТипЗнч(ПараметрыАлгоритма) = Тип("Массив") Тогда НаборПараметров = ПараметрыАлгоритма; Иначе НаборПараметров.Добавить(ПараметрыАлгоритма); КонецЕсли; КонецЕсли; СтрокаЗначенияПараметров = ""; СтрокаПараметров = ""; Индекс = 0; Для каждого ТекПараметрАлгоритма Из НаборПараметров Цикл ТипЗнчТекПараметрАлгоритма = ТипЗнч(ТекПараметрАлгоритма); Если ТипЗнчТекПараметрАлгоритма = Тип("Структура") ИЛИ ТипЗнчТекПараметрАлгоритма = Тип("Соответствие") ИЛИ ТипЗнчТекПараметрАлгоритма = Тип("ФиксированнаяСтруктура") ИЛИ ТипЗнчТекПараметрАлгоритма = Тип("ФиксированноеСоответствие") Тогда Для каждого ТекПараметрАлгоритма Из ПараметрыАлгоритма Цикл НаименованиеПараметра = Строка(ТекПараметрАлгоритма.Ключ); Если Фрагмент.Параметры.Свойство(НаименованиеПараметра) Тогда ВызватьИсключение СтрШаблон(нСтр("ru='Задублирован по имени параметр ""%1"" входящего параметра ""ПараметрыАлгоритма"".'") , НаименованиеПараметра ); Иначе Фрагмент.УстановитьЗначениеПараметра(НаименованиеПараметра, ТипЗнч(ТекПараметрАлгоритма.Значение)); СтрокаПараметров = СтрокаПараметров + НаименованиеПараметра + ", "; СтрокаЗначенияПараметров = НаименованиеПараметра + " = НаборПараметров[" + Строка(Индекс) + "].Значение; "; Индекс = Индекс + 1; КонецЕсли; КонецЦикла; // Удаление последних символов ", ". СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 2); Иначе ВызватьИсключение СтрШаблон(нСтр("ru='Не допустимый тип ""%1"" входящего параметра ""ПараметрыАлгоритма"".'") , Строка(ТипЗнчТекПараметрАлгоритма)); КонецЕсли; КонецЦикла; Попытка // Типы параметров известны, так как были вычислены через ТипЗнч. Действие = Фрагмент.Скомпилировать(); Исключение Сообщить(нСтр("ru='Ошибка компиляции:'") + " " + ОписаниеОшибки(), СтатусСообщения.Важное); Действие = Неопределено; КонецПопытки; Если НЕ Действие = Неопределено Тогда // Восстановление значений входящих параметров в локальном контексте. Выполнить(СтрокаЗначенияПараметров); Попытка РезультатАлгоритма = Вычислить("Действие.Выполнить(" + СтрокаПараметров +");"); Исключение Сообщить(нСтр("ru='Ошибка выполнения действия:'") + " " + ОписаниеОшибки(), СтатусСообщения.Важное); КонецПопытки; КонецЕсли; Возврат РезультатАлгоритма; КонецФункции
@user-ff7ei4ob8b
@user-ff7ei4ob8b Жыл бұрын
осталось для ещё большего ускорения и упрощения работы заменить java на c# под капотом, чтобы не нужно было устанавливать этот мусор
@user-zr4uw5ng3r
@user-zr4uw5ng3r Жыл бұрын
А в чем принципиальная разница? Что java надо устанавливать, что dotnet
@user-ff7ei4ob8b
@user-ff7ei4ob8b Жыл бұрын
@@user-zr4uw5ng3r java имеет целую кучу производителей которые добавляют туда свой кривокод, дотнет разрабатывает конкретно микромягкие и свои языки достойно сопровождает
@user-ff7ei4ob8b
@user-ff7ei4ob8b Жыл бұрын
а вообще можно просто переписать опен сорсный компилятор roslin конкретно под onescript и вообще убрать посредников ввиде других языков
@user-nd9cv4pd5m
@user-nd9cv4pd5m Жыл бұрын
Кажется, это религия
@bluxer4225
@bluxer4225 3 жыл бұрын
Если не махать руками, чудо не произойдёт.
@axe-capital
@axe-capital 3 жыл бұрын
Столько дурачков пролайколо... ни чо что основная брешь 1С это СУБД????
@user-zr4uw5ng3r
@user-zr4uw5ng3r 3 жыл бұрын
Хорошо, что есть такие умные комментаторы, как вы!
@user-tw9bi8mg1s
@user-tw9bi8mg1s 3 жыл бұрын
И чё?
@user-zr4uw5ng3r
@user-zr4uw5ng3r 3 жыл бұрын
@@user-tw9bi8mg1s Отличный универсальный ответ! Можно использовать вообще для всего: "Мы научились лечить рак! И чё?" "Мы создали телепорт! И чё?"
@8tshk8
@8tshk8 2 жыл бұрын
Это которая СУБД?
@herfishq
@herfishq 2 жыл бұрын
Такой умный, но даже не понял, что речь вообще не про платформу 1с. "Не читал, но осуждаю".
НРАВИТСЯ ЭТОТ ФОРМАТ??
00:37
МЯТНАЯ ФАНТА
Рет қаралды 8 МЛН
A little girl was shy at her first ballet lesson #shorts
00:35
Fabiosa Animated
Рет қаралды 16 МЛН
Каха заблудился в горах
00:57
К-Media
Рет қаралды 10 МЛН
Чего ожидать от HTTP/3 + Go
51:07
Нина Пакшина
Рет қаралды 9 М.
Docker для 1С-ников. Введение
29:01
Веселый1С
Рет қаралды 18 М.
Первый скрипт на OneScript!
26:30
ФТО
Рет қаралды 9 М.
Техружок #5: OneScript & VSC (Visual Studio Code) 1С
56:58
Артем Пластинин
Рет қаралды 4,7 М.
Новые iPhone 16 и 16 Pro Max
0:42
Romancev768
Рет қаралды 2,3 МЛН
Запрещенный Гаджет для Авто с aliexpress 2
0:50
Тимур Сидельников
Рет қаралды 978 М.