ru en

SLThree

SLThree (англ. Script Language 3 — Скриптовый язык 3, "третий скриптовый") — мультипарадигмальный интерпретируемый C-подобный язык программирования со строгой динамической типизацией, разработанный для платформы .NET. Смешивает императивный и функциональный подходы, а ООП реализуется единственным составным типом непосредственно языка — контекстом.

Основные особенности

  • Мощный интерпретатор
  • Возможность использовать все типы и их содержимое из платформы .NET
  • [Экспериментально] компиляция в IL (который впоследствии подхватывает JIT платформы .NET)
  • Интерполированные строки
  • Обобщённые методы
  • Контексты
  • Кортежи

Почему не DLR

Будучи динамическим языком на .NET платформе, SLThree использует не DLR, а собственное архитектурное решение. Исходя из данной статьи, DLR при работе с COM-типами (для межязыкового взаимодействие того же IronPython и C# используется COM API) может вызывать утечки памяти при передачи dynamic'ов. Кроме того, организовать, например, опциональную типизацию с DLR было бы невозможно.

Сравнение производительности

Измерения производительности проводились с помощью алгоритма гипотезы Коллатца в интервале от 0 до 1000000.

Тестовая машина
CPU Ryzen 7 4700U 8-Core CPU 4.2 GHz
RAM DDR4 Dual-Channel 16 GB 3200 CL22
OS Windows 10 21H2
Результаты
Динамическая типизация
JavaScript 10984 ms
TypeScript 10960 ms
Python 3.12 8724 ms
SLThree 7824 ms
Статическая типизация
SLThree + JIT 240 ms
PascalABC.NET 3.9 226 ms
C# 212 ms
С++ 208 ms
Rust 185 ms
  1. calc = explicit (index) => {
  2.     step = 0;
  3.     while (index > 1)
  4.         if (index % 2 == 0) {
  5.             index = index / 2;
  6.             step = step + 1;
  7.         }
  8.         else {
  9.             index = (3 * index + 1) / 2;
  10.             step = step + 2;
  11.         }
  12.     return step;
  13. };
  14. using linq;
  15. 0..1_000_000 |> linq.max(calc);
Код на SLThree 0.6.0
  1. calc = (i64 index): i64 => {
  2.     i64 step = 0;
  3.     while (index > 1)
  4.         if (index % 2 == 0) {
  5.             index = index / 2;
  6.             step = step + 1;
  7.         }
  8.         else {
  9.             index = (3 * index + 1) / 2;
  10.             step = step + 2;
  11.         }
  12.     return step;
  13. };
  14. using jit;
  15. using dlinq;
  16. calc_opt = jit.opt(calc, self);
  17. <i64>0..1_000_000 |> dlinq.max<i64, i64>(calc_opt.CreateDelegate(@System.Func<i64, i64>));
Код на SLThree 0.7.0

В пределах версий SLThree

Так как в большинстве обновлений языка внедрялись оптимизации, производительность менялась от версии к версии.

Результаты
SLThree 0.1.0 Lovely 64 bits 48000 ms
SLThree 0.2.0 Unwrap the wrap 14000 ms
SLThree 0.3.0 Third time is lucky 7900 ms
SLThree 0.6.0 Functionalization Update 7824 ms
SLThree 0.7.0 Typing Update 240 ms

Ссылки