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 |
- calc = explicit (index) => {
- step = 0;
- while (index > 1)
- if (index % 2 == 0) {
- index = index / 2;
- step = step + 1;
- }
- else {
- index = (3 * index + 1) / 2;
- step = step + 2;
- }
- return step;
- };
- using linq;
- 0..1_000_000 |> linq.max(calc);
- calc = (i64 index): i64 => {
- i64 step = 0;
- while (index > 1)
- if (index % 2 == 0) {
- index = index / 2;
- step = step + 1;
- }
- else {
- index = (3 * index + 1) / 2;
- step = step + 2;
- }
- return step;
- };
- using jit;
- using dlinq;
- calc_opt = jit.opt(calc, self);
- <i64>0..1_000_000 |> dlinq.max<i64, i64>(calc_opt.CreateDelegate(@System.Func<i64, i64>));
В пределах версий 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 |