Форум программистов, компьютерный форум, киберфорум
Бета-тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14

Очередной маленький проект: язык программирования Unvariable

31.05.2026, 18:19. Показов 4267. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Существует популярное заблуждение, что я только за гигантские проекты хватаюсь, которые не осиливаю, а маленьких якобы нет. На самом деле у моей компании было уже много маленьких проектов, и многие из них имели несколько страниц обсуждения: игрушечный язык программирования HQRCS, морской бой (собственного названия не имел), Cards II, Exlaroveen, демонстрация возможностей C#.NStar Threes, и вот теперь очередной игрушечный язык программирования, который, возможно, разовьется в большой проект, а может быть, так и останется маленьким. Язык называется Unvariable и содержит всего две операции: создание константы и возврат. Скачать можно на сайте (мы существенно обновили главную страницу, поэтому ссылка на нее, оттуда не сложно перейти на нужную).

Наш стиль


1. В этом языке нет переменных, только константы (потому и Unvariable).
2. Нет циклов, только рекурсия.
3. Значение функции зависит только от аргументов, не нужно каждый раз воссоздавать внешнее состояние, чтобы проверить, работает ли функция.

Наши главные достижения


1. Результат выполнения функции кэшируется, повторный вызов с теми же параметрами занимает десятки-сотни наносекунд.

Наши главные планы


1. Ввод-вывод.
2. Параллельное выполнение не связанных операций.
3. "Ленивое" выполнение операций, результат которых не используется.

Преимущества Unvariable


1. Технически переполнение стека возможно, но если захотите вызвать его специально, вряд ли дождетесь.
2. Пока в разработке...

Почти полное описание синтаксиса


Объявление константы:
Code
1
T x = value;
Можно также вместо явного типа использовать var. Можно объявить новую константу с тем же именем:
Code
1
x op= y;
Это не присваивание, это объявление новой константы. Если вы выполните одно из нескольких таких действий в зависимости от условия (об условиях ниже), в каждой ветке создастся своя константа, а после завершения условия вообще будет использована последняя объявленная до условия. Поддерживаемые типы:
byte - беззнаковое целое число от 0 до 255.
short int - знаковое целое от -32768 до 32767.
unsigned short int - беззнаковое целое от 0 до 65535.
int - знаковое целое от ~-2 млрд до ~2 млрд.
unsigned int - беззнаковое целое от 0 до ~4 млрд.
long int - знаковое целое от ~-9 ктлн до ~9 ктлн.
unsigned long int - беззнаковое целое от 0 до ~18 ктлн.
long long - произвольно большое знаковое целое.
unsigned long long - произвольно большое беззнаковое целое.
real - с плавающей точкой от ~1E-312 до ~1E+308 в плюс и в минус, а также ноль, плюс-минус бесконечность и NaN (аналог неопределенности).
char - не тестировался.
(T1, T2, T3, ...) - кортеж.
() T - список. Доступны только функции проверки, добавления в конец (Add, AddRange, AddSeries) и создающие новый список, изменение и удаление не поддерживается.
(n) T - многомерный список.
string - строка. Такой же критерий доступности функций, как и для списка.
System.Func[TResult, T1, T2, T3, ...] - делегат с возвращаемым типом TResult и одним или несколькими параметрами. Используются квадратные, а не угловые скобки.
Исключения: System.ArgumentException, System.IndexOutOfRangeException, System.NullReferenceException, System.OverflowException.
Поддерживаемые бинарные операторы: + - * / % & | ^ && || ^^ (N-арный XOR, возвращает true, только если ровно один операнд равен true) << >> <<< (циклический сдвиг) >>> (беззнаковый сдвиг) pow (возведение в степень) == != >= <= > < = += -= *= /= %= &= |= ^= <<= >>= pow=.
Унарные: + - ! (префиксный - отрицание, постфиксный - факториал) ~ ^ (индекс с конца).
Тернарные: x ? y : z, x ?= y : z, x ?!= y : z, x ?>= y : z, x ?<= y : z, x ?> y : z, x ?< y : z (все, кроме первого, эквивалентны x op y ? x : z (?== сокращается до ?=)). Тернарные операторы - вообще одни из главных операторов в Unvariable, так как в обычных условиях имеет смысл только возврат.
Возврат:
Code
1
return x;
На этом можно было бы закончить, но есть еще несколько конструкций, унаследованных от C#.NStar и явно не удаленных. Например, условие:
Code
1
2
3
4
5
6
7
8
if (condition1)
    ...
else if (condition2)
    ...
else if (...)
    ...
else
    ...
В каждом условии рекомендуется сделать возврат, так как если только создать константы, при выходе из условия они удалятся. Выражение switch (оператор switch упразднен):
Code
1
2
3
4
5
6
7
8
var result = x switch
{
    pattern1 => value1,
    pattern2 => value2,
    pattern3 => value3,
    ...
    _ => defaultValue,
};
Запятая после последнего значения обязательна. В качестве pattern1, pattern2 и т. д. используется сопоставление шаблонов, подробнее читайте здесь. Поддерживаются шаблон-константа, шаблон-тип, тип с объявлением переменной, var с объявлением переменной, шаблон сравнения (больше/меньше), пустой шаблон (_) и составной шаблон - несколько шаблонов, объединенных операторами and, or, not. Можно воспользоваться теми же шаблонами и без выражения switch - x is pattern.
Циклов, как уже упоминалось, нет, для этого используется рекурсия. Функция:
Code
1
2
3
4
5
TResult Function Name(T1 param1, T2 param2, T3 param3, ...)
{
    DoSomething();
    return result;
}
А также в виде лямбда-выражения:
Code
1
System.Func[TResult, T1, T2, T3, ...] = (param1, param2, param3, ...) => result;
Можно также не писать каждый раз System, только Func[...], если в начале кода написать:
Code
1
using System;
Теоретически есть и другие пространства имен, но в них мало полезного.
Обработка исключений:
Code
1
2
3
4
5
6
7
8
9
try
{
    () int a = (1, 2);
    return a[5];
}
catch (System.IndexOutOfRangeException ex)
{
    return false;
}
Классы, структуры, коллекции, DateTime, GUI, файлы и пакетный менеджер временно отключены для дальнейшей переработки. На этом, похоже, и все.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.05.2026, 18:19
Ответы с готовыми решениями:

На чем лучше всего писать маленький проект (такой как тетрис)?
1) На Шарпе. 2) На Game Maker. 3) На Game Maker Studio 2. 4) На Unreal Engine. 5) Пытаться...

Сверх-язык программирования
Мне кажется довольно странным, что за 40 лет, человечество почти не продвинулось в плане...

Новый язык программирования
исходный код и сам язык: https://github.com/RedL-Offiziel-Deutschland/RedL

59
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
01.06.2026, 16:48  [ТС]
Студворк — интернет-сервис помощи студентам
Компилятор - это то, что делает машинный код.
Просто создать исполнимый файл недостаточно: это может быть интерпретируемый псевдокод, "прицепленный" к исполняющему его ядру (этакая виртуальная машина с программой под нее, засунутые в один файл).
В таком случае у любого управляемого языка нет компилятора. Думаю, последнее утверждение абсурдно. Unvariable генерирует исполняемый файл той же виртуальной машины, что и C#.
0
 Аватар для Pphantom
2491 / 1641 / 746
Регистрация: 17.03.2022
Сообщений: 5,362
01.06.2026, 17:15
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
В таком случае у любого управляемого языка нет компилятора.
Да, именно так. Стараниями MS об этом сейчас не часто вспоминают, но...
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Думаю, последнее утверждение абсурдно.
Тем не менее общепринятую терминологию полезно соблюдать, хотя бы чтобы не вводить читателей в заблуждение.

К тому же в данном случае это еще и характеристика сложности задачи: написать компилятор в общепринятом смысле этого слова существенно сложнее, чем "компилятор" в байт-код виртуальной машины.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
01.06.2026, 17:32  [ТС]
Тем не менее общепринятую терминологию полезно соблюдать, хотя бы чтобы не вводить читателей в заблуждение.
А я считаю, что у управляемых языков именно компилятор, а у нативных, таких как C++ не в Visual Studio - высокоуровневый ассемблер (тот, который не язык ассемблера). Если транслятор генерирует машинный код, то это ассемблер, а не компилятор. Да, мое мнение не общепринятое. И да, писать ассемблер я не собираюсь.
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
01.06.2026, 17:45
Цитата Сообщение от Pphantom Посмотреть сообщение
написать компилятор в общепринятом смысле этого слова существенно сложнее, чем "компилятор" в байт-код виртуальной машины.
А в чём тут разница? Я в упор не понимаю. Процесс же тот же самый - перегон рукописного текста в байты. Какая разница, что конечный результат не процессором сразу исполняется, а через JIT проходит?
0
 Аватар для Pphantom
2491 / 1641 / 746
Регистрация: 17.03.2022
Сообщений: 5,362
01.06.2026, 18:28
Цитата Сообщение от Usaga Посмотреть сообщение
А в чём тут разница? Я в упор не понимаю. Процесс же тот же самый - перегон рукописного текста в байты. Какая разница, что конечный результат не процессором сразу исполняется, а через JIT проходит?
В целевом уровне, у JVM и т.п. он существенно выше.

Нет регистров - есть стек. Есть типизация (кроме как тупо по размеру, "влезет/нет"). Есть автоматическое управление памятью. Есть контроль исключений. Нет привязки к конкретной архитектуре (и размышлений о том, как оно работает на ARM какой-то версии или еще где-нибудь). Заметная часть команд описывает одной командой то, что на машинном уровне делается десятками, а то и сотнями инструкций. Наконец, этих команд попросту меньше на порядок.

Где-то попадалась хорошая аналогия, что байт-код VM - это описание рецептов на уровне: "взять полкило картошки, почистить, отварить столько-то минут, растолочь...", а машинный код - уровня "вытянуть правую руку, опустить вниз, сжать пальцы, поднять руку с картофелиной вверх...". Действительно похоже.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
01.06.2026, 18:42  [ТС]
Цитата Сообщение от Pphantom Посмотреть сообщение
Нет регистров - есть стек. Есть типизация (кроме как тупо по размеру, "влезет/нет"). Есть автоматическое управление памятью. Есть контроль исключений. Нет привязки к конкретной архитектуре (и размышлений о том, как оно работает на ARM какой-то версии или еще где-нибудь). Заметная часть команд описывает одной командой то, что на машинном уровне делается десятками, а то и сотнями инструкций. Наконец, этих команд попросту меньше на порядок.
Что мешает тупо сохранить код на C++ в файл и закинуть в какой-нибудь open-source ассемблер? Будет машинный код без всего этого. В C++ есть стек, типизация и большинство остального. А файл потом можно удалить.
P. S. Только что нашел в Яндексе.
0
Модератор
Эксперт Java
 Аватар для alecss131
2903 / 1408 / 413
Регистрация: 11.08.2017
Сообщений: 4,514
Записей в блоге: 2
01.06.2026, 21:16
Цитата Сообщение от Usaga Посмотреть сообщение
особенность msbuild
Предположу это особенность параллельной сборки, другие потоки просто не знают что что то пошло не так, поэтому и кажется что нету остановки из-за первой ошибки.

А вообще на тему промежуточных кодов. С++ внутри Clang компилируется в байт код очень похожий на шарповый/джавовый, его можно оттуда вытащить и запускать на GraalVm как джаву. И так же джаву/котлин можно собьрать с помощью грааля в нативный код (правда размер ехе будет громадный). Знаю что у шарпа есть il2cpp, но помню из юнити вытаскивал из этой штуки шарповый байт код, так что похоже это нечто иное.
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
02.06.2026, 02:47
Цитата Сообщение от alecss131 Посмотреть сообщение
Знаю что у шарпа есть il2cpp
У шарпа есть публикация в режиме AOT. Правда бинарник получается очень большой.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
02.06.2026, 12:12  [ТС]
Royal_X, вот вы писали, что нельзя тестировать, если не знаком с синтаксисом. Тут синтаксис минималистичный, в шапке описан в деталях - не могли бы протестировать?
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
02.06.2026, 12:45
Etyuhibosecyu, в мире разработки такие вещи тестами покрывают. Чтобы автоматизировать процесс. Ты же не собрался на каждое изменение в своём языке мистера Royal_X просить всё перетестировать?
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6693 / 3086 / 1064
Регистрация: 01.06.2021
Сообщений: 11,922
02.06.2026, 14:22
Цитата Сообщение от alecss131 Посмотреть сообщение
Знаю что у шарпа есть il2cpp, но помню из юнити вытаскивал из этой штуки шарповый байт код, так что похоже это нечто иное.
в юнити тоже можно выбрать il2cpp. Движок позволяет выбирать между mono и il2cpp. В первом случае можно легко вытащить оригинальный шарповый код, во втором случае - нет. Если игра была на il2cpp, то можно увидеть только структуру проекта, названия функций и прочее, но внутри функций будет пусто. А вот само содержание увидеть никак. Т.е. это как попытаться увидеть код приложения на плюсах. Тут единственный вариант это реверс-инжиниринг в IDA, Ghidra, чтобы декомпилировать код. Но я более чем уверен, что многие не будут копаться в этом декомпилированном коде. Какие-то вещи поменять могут, но вот проект не смогут полностью восстановить.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
20.07.2026, 20:30  [ТС]

Unvariable (Pre-Pre-Alpha) 0.09


Ловите новую версию игрушечного языка программирования - Unvariable (Pre-Pre-Alpha) 0.09! Вот что изменилось:
- Разблокирован ввод-вывод, но для него требуется новое ключевое слово IO (см. в описании синтаксиса).
- Добавлено автоматическое форматирование, удаляющее точки с запятой и расставляющее отступы.
- Добавлен более предсказуемый синтаксис, в частности, следующие конструкции теперь не работают:
Code
1
2
3
4
5
if (a)
    if (b)
        DoSomething()
    else if (c)
        DoSomething2()
Code
1
2
3
4
5
if (a)
    DoSomething()
else if (b)
    if (c)
        DoSomething2()
(Без фигурных скобок разрешена или строго линия в глубину:
Code
1
2
3
4
if (a)
    if (b)
        if (c)
            DoSomething()
- или строго линия в ширину:
Code
1
2
3
4
5
6
7
if (a)
    DoSomething()
else if (b)
    DoSomething2()
else if (c)
    DoSomething3()
...
- иначе требуются фигурные скобки.)
Следующие конструкции также не работают:
Code
1
2
3
4
5
if (a)
    if (b) // Условие с блоком внутри условия без блока
    {
        DoSomething()
    }
Code
1
2
if (a & b == c) // Скобки обязательны
    DoSomething()
Code
1
2
if (a & b > c) // Скобки обязательны
    DoSomething()
Code
1
var a = x << n + k // Формально работает, но выдает предупреждение, рекомендуются скобки
- Папка с приложением теперь называется просто "Unvariable", теперь все версии будут устанавливаться одна поверх другой, в одну и ту же папку.

Замеченные, но не исправленные ошибки


- Возможны ошибки в автоматическом форматировании. Наша компания тестировала, насколько возможно, но всегда остается шанс, что где-то ошибки остались.
- Можно поймать вылет транслятора, если экспериментировать с действиями без присваивания и без вызова (например, со строками, состоящими только из "x + y", где x и y - некоторые выражения, но без знака '=' и без вызовов функций).
- В собранном EXE, после завершения приложения, выдается сообщение о "Необработанном исключении". На само приложение это не влияет.

Почти полное описание синтаксиса


Объявление константы:
Code
1
T x = value // Точка с запятой, как мы помним, не нужна
Можно также вместо явного типа использовать var. Можно объявить новую константу с тем же именем:
Code
1
x op= y
Это не присваивание, это объявление новой константы. Если вы выполните одно из нескольких таких действий в зависимости от условия (об условиях ниже), в каждой ветке создастся своя константа, а после завершения условия вообще будет использована последняя объявленная до условия. Поддерживаемые типы:
byte - беззнаковое целое число от 0 до 255.
short int - знаковое целое от -32768 до 32767.
unsigned short int - беззнаковое целое от 0 до 65535.
int - знаковое целое от ~-2 млрд до ~2 млрд.
unsigned int - беззнаковое целое от 0 до ~4 млрд.
long int - знаковое целое от ~-9 ктлн до ~9 ктлн.
unsigned long int - беззнаковое целое от 0 до ~18 ктлн.
long long - произвольно большое знаковое целое.
unsigned long long - произвольно большое беззнаковое целое.
real - с плавающей точкой от ~1E-312 до ~1E+308 в плюс и в минус, а также ноль, плюс-минус бесконечность и NaN (аналог неопределенности).
char - не тестировался.
(T1, T2, T3, ...) - кортеж.
() T - список. Доступны только функции проверки, добавления в конец (Add, AddRange, AddSeries) и создающие новый список, изменение и удаление не поддерживается.
(n) T - многомерный список.
string - строка. Такой же критерий доступности функций, как и для списка.
System.Func[TResult, T1, T2, T3, ...] - делегат с возвращаемым типом TResult и одним или несколькими параметрами. Используются квадратные, а не угловые скобки.
Исключения: System.ArgumentException, System.IndexOutOfRangeException, System.NullReferenceException, System.OverflowException.
Следующие типы требуют указания ключевого слова IO перед именем

DateTime (без пространства имен)
System.RedStarLinq
System.RedStarLinqDictionaries
System.RedStarLinqExtras
System.RedStarLinqParallel
System.RedStarLinqMath
System.RedStarLinqRemoveDoubles
System.Collections.BaseDictionary[TKey, TValue, TCertain]
System.Collections.BaseHashSet[T, TCertain]
System.Collections.BaseIndexable[T, TCertain]
System.Collections.BaseList[T, TCertain]
System.Collections.BaseSet[T, TCertain]
System.Collections.BaseSortedSet[T, TCertain]
System.Collections.BaseSumList[T, TCertain]
System.Collections.Buffer[T]
System.Collections.Comparer[T]
System.Collections.Dictionary[TKey, TValue]
System.Collections.EComparer[T]
System.Collections.Extents
System.Collections.FastDelHashSet[T]
System.Collections.Group[T, TKey]
System.Collections.G.LinkedList[T]
System.Collections.G.LinkedListNode[T]
System.Collections.LimitedQueue[T]
System.Collections.ListEComparer[T]
System.Collections.ListHashSet[T]
System.Collections.ListOfBigSums
System.Collections.Mirror[TKey, TValue]
System.Collections.ParallelHashSet[T]
System.Collections.Queue[T]
System.Collections.Slice[T]
System.Collections.SortedDictionary[TKey, TValue]
System.Collections.SortedSet[T]
System.Collections.Stack[T]
System.Collections.SumList
System.Collections.SumSet[T]
System.Collections.TreeHashSet[T]
System.Collections.TreeSet[T]
System.GUI.Animatable
System.GUI.AutoCompleteBox
System.GUI.AvaloniaObject
System.GUI.Bitmap
System.GUI.Border
System.GUI.Brush
System.GUI.Button
System.GUI.Canvas
System.GUI.CheckBox
System.GUI.Color
System.GUI.ColumnDefinition
System.GUI.ColumnDefinitions
System.GUI.ComboBox
System.GUI.Control
System.GUI.Controls
System.GUI.Decorator
System.GUI.DefinitionBase
System.GUI.DockPanel
System.GUI.Expander
System.GUI.Grid
System.GUI.GridLength
System.GUI.GridSplitter
System.GUI.GridUnitType
System.GUI.GUIWindow
System.GUI.HeaderedContentControl
System.GUI.HorizontalAlignment
System.GUI.IBrush
System.GUI.IImage
System.GUI.Image
System.GUI.ImageBrush
System.GUI.IResourceDictionary
System.GUI.ItemsControl
System.GUI.KeyEventArgs
System.GUI.Panel
System.GUI.PixelPoint
System.GUI.Point
System.GUI.PointerEventArgs
System.GUI.PointerPressedEventArgs
System.GUI.PointerReleasedEventArgs
System.GUI.RadioButton
System.GUI.RangeBase
System.GUI.RelativePanel
System.GUI.RoutedEventArgs
System.GUI.RowDefinition
System.GUI.RowDefinitions
System.GUI.ScrollViewer
System.GUI.SelectingItemsControl
System.GUI.Slider
System.GUI.SolidColorBrush
System.GUI.SplitView
System.GUI.StackPanel
System.GUI.TabControl
System.GUI.TemplatedControl
System.GUI.TextBlock
System.GUI.TextBox
System.GUI.Thumb
System.GUI.TileBrush
System.GUI.ToggleButton
System.GUI.ToolTip
System.GUI.UniformGrid
System.GUI.VerticalAlignment
System.GUI.Window
System.GUI.WrapPanel
System.GUI.ZoomBorder
System.IO.Directory
System.IO.DirectoryInfo
System.IO.DriveInfo
System.IO.DriveType
System.IO.File
System.IO.FileAccess
System.IO.FileAttributes
System.IO.FileInfo
System.IO.FileMode
System.IO.FileOptions
System.IO.FileShare
System.IO.FileStream
System.IO.FileSystemInfo
System.IO.IOException
System.IO.MemoryStream
System.IO.Path
System.IO.Stream
System.IO.UnixFileMode

Поддерживаемые бинарные операторы: + - * / % & | ^ && || ^^ (N-арный XOR, возвращает true, только если ровно один операнд равен true) << >> <<< (циклический сдвиг) >>> (беззнаковый сдвиг) pow (возведение в степень) == != >= <= > < = += -= *= /= %= &= |= ^= <<= >>= pow=.
Унарные: + - ! (префиксный - отрицание, постфиксный - факториал) ~ ^ (индекс с конца).
Тернарные: x ? y : z, x ?= y : z, x ?!= y : z, x ?>= y : z, x ?<= y : z, x ?> y : z, x ?< y : z (все, кроме первого, эквивалентны x op y ? x : z (?== сокращается до ?=)). Тернарные операторы - вообще одни из главных операторов в Unvariable, так как в обычных условиях имеет смысл только возврат.
Возврат:
Code
1
return x
Условие:
Code
1
2
3
4
5
6
7
8
if (condition1)
    ...
else if (condition2)
    ...
else if (...)
    ...
else
    ...
В каждом условии рекомендуется сделать возврат, так как если только создать константы, при выходе из условия они удалятся. Выражение switch (оператор switch упразднен):
Code
1
2
3
4
5
6
7
8
var result = x switch
{
    pattern1 => value1,
    pattern2 => value2,
    pattern3 => value3,
    ...
    _ => defaultValue,
}
Запятая после последнего значения обязательна. В качестве pattern1, pattern2 и т. д. используется сопоставление шаблонов, подробнее читайте здесь. Поддерживаются шаблон-константа, шаблон-тип, тип с объявлением переменной, var с объявлением переменной, шаблон сравнения (больше/меньше), пустой шаблон (_) и составной шаблон - несколько шаблонов, объединенных операторами and, or, not. Можно воспользоваться теми же шаблонами и без выражения switch - x is pattern.
Циклов нет, для этого используется рекурсия. Функция:
Code
1
2
3
4
5
TResult Function Name(T1 param1, T2 param2, T3 param3, ...)
{
    DoSomething()
    return result
}
А также в виде лямбда-выражения:
Code
1
System.Func[TResult, T1, T2, T3, ...] = (param1, param2, param3, ...) => result
Можно также не писать каждый раз System, только Func[...], если в начале кода написать:
Code
1
using System
Аналогично с другими пространствами имен: using System.GUI и т. д.
Обработка исключений:
Code
1
2
3
4
5
6
7
8
9
try
{
    () int a = (1, 2)
    return a[5]
}
catch (System.IndexOutOfRangeException ex)
{
    return false
}
Доступны коллекции:
Code
1
2
3
using System.Collections
IO Dictionary[TKey, TValue] dic = (key1: value1, key2: value2, key3: value3, ...) // IO указывать обязательно
IO ListHashSet[T] = new(capacity, item1, item2, item3, ...) // Можно без capacity, но только если не числа
Текущее время записывается так: (IO DateTime).Now. И вообще если нужно вызвать статический метод или вызвать статическое свойство у IO-типа, используется именно такая конструкция: (IO Type).Member.
Пример с GUI

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System.GUI
IO GUIWindow window = new()
window.Position = new(window.Position.X / 2, window.Position.Y * 2)
IO Grid grid = new()
window.Content = grid
grid.Width = grid.Height = 640
grid.RowDefinitions = new()
grid.RowDefinitions.Add(new IO RowDefinition((IO GridLength).Auto))
grid.ColumnDefinitions = new()
grid.ColumnDefinitions.Add(new IO ColumnDefinition((IO GridLength).Auto))
IO Button button = new()
button.Width = 128
button.Height = 32
button.Background = new IO SolidColorBrush(new IO Color(255, 223, 223, 223))
button.Resources["ButtonBackgroundPointerOver".ToUnsafeString()] = button.Background
button.Click += (s, e) => button.Background = new IO SolidColorBrush(new IO Color(255, 0, 255, 0))
grid.Children.Add(button)
IO TextBlock tb = new()
tb.Width = 120
tb.Height = 24
tb.Text = "Click me!"
tb.FontSize = 16;
button.Content = tb
window.Show()
return window.Width

Классы, структуры и пакетный менеджер все еще отключены.
0
HF
 Аватар для HF
1344 / 928 / 202
Регистрация: 09.09.2011
Сообщений: 2,757
Записей в блоге: 2
21.07.2026, 14:29
Давно не интересовался поделками Etyuhibosecyu. Заглянул, по репозиторию тоже пробежался чтобы наверняка убедиться во всём. Не помню, говорил ли я раньше это, поэтому возможно повторюсь.

Плюс только один - человек старается, опыт повышает в кодогенерации. Для собственной радости - это точно отлично.
"Всяко лучше, чем по подъездам валяться пьяным".

Но зачем Это? Или зачем это называть ультра-высоко-гипер-максимально-суперстар-технологичное... ?

1) Ни для одного проекта я так и не увидел применимости. Хоть одно бы подтверждение, кто-нибудь бы сказал что это нужная фича. Отсюда и постоянный вопрос "Зачем это?".

2) Что NStar, что RedStarMath. И вот теперь Это. Всё это "обёртка" уже существующего C# и его функционала. НИЧЕГО нового я так и не увидел. Только тонны непонятного, нечитабельного кода над уже идеально-"вылизанным" языком.

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

Ну и... если бы он был написан на С++ или ассемблере ну тогда да... другой язык. А так... обвешанный, утяжелённый C#.

С таким энтузиазмом, лучше бы направил деятельность на улучшения и оптимизацию. Да хоть чего. Проектов в гитхабе дохрена. В том числе и официальные. Помоги всем, сделай существующие библиотеки лучше - точно увидят, точно запомнят. Эх... столько энтузиазма пропадает.
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
21.07.2026, 15:24
HF, да ничего он не станет улучшать, принципиально. Нарциссизм знатно приправленный NIH’ом не позволят ему заниматься чем-то, где он не во главе угла. Да он и не сможет.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
21.07.2026, 18:33  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Всё это "обёртка" уже существующего C# и его функционала. НИЧЕГО нового я так и не увидел.
Я так и не понял: что такое НЕ обертка? Только инструкции процессора, или что-то другое? Так как любой новый функционал на высокоуровневом языке реализуется поверх уже существующих функций языка, мне кажется, это очевидно...
0
HF
 Аватар для HF
1344 / 928 / 202
Регистрация: 09.09.2011
Сообщений: 2,757
Записей в блоге: 2
21.07.2026, 19:26
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Я так и не понял: что такое НЕ обертка? Только инструкции процессора, или что-то другое? Так как любой новый функционал на высокоуровневом языке реализуется поверх уже существующих функций языка, мне кажется, это очевидно...
Если я пишу на C# код который данные из БД в коллекции перебирает и что-то там меняет - это просто код, написанный на C#, с использованием функций языка. Не претендующий на супер код и на библиотеку.
А если, для примера, IList класс назвали NStarList а внутри всё тоже самое - хранение коллекции, итератор, обход коллекции... а к этому ещё тонны кода, которые типа что-то полезное делают. Вот это и есть "обёртка" над существующей реализацией. Только если бы она давала реальные бонусы, имела понятные фичи - то это бы привлекало и можно было сказать что супер функционал и даже претендует на библиотеку.
А так, повторюсь, вообще не понятная хреновина. Выглядит как то что мы знаем, называется по новому, тяжелее, не понятнее и по пользе так и не доказано ничем.

Добавлено через 4 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Я так и не понял: что такое НЕ обертка? Только инструкции процессора, или что-то другое? Так как любой новый функционал на высокоуровневом языке реализуется поверх уже существующих функций языка, мне кажется, это очевидно...
С таким подходом философских диспутов, можно ещё проще пример привести.

Мы используем буквы. Но вы что-то написали и претендуете на бестселлер. Ну а я говорю что вы знаете буквы и слова и бумаги потратили много, но... читать это невозможно. Ни сюжета, ни героев. Вроде буквы теже и слова знакомые, но книга в макулатуру.
Щас понятно?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
21.07.2026, 19:30  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Щас понятно?
Но никто же не называет "Властелин Колец" оберткой над буквами (разве что в шутку). Поэтому, я считаю, и мой язык - не обертка, так как он добавляет существенный функционал, а не пару функций.
0
HF
 Аватар для HF
1344 / 928 / 202
Регистрация: 09.09.2011
Сообщений: 2,757
Записей в блоге: 2
21.07.2026, 20:05
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
так как он добавляет существенный функционал, а не пару функций.
Да гдееееее???
Три базовых "теста" существенности:
- это что-то из того что людям всегда нужно было и хотели бы видеть
- тесты или статистика показывающие преимущество а не деградацию скорости (любой, набора букв или скорости выполнения)
- ну и то как это используется. Если это выглядит так что ничего не понятно и даже после прочтения документации не понятно как это писать и выглядит не понятно и не очевидно. То это вызывает только отторжение.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
1. В этом языке нет переменных, только константы (потому и Unvariable).
Ну ок. В F# (если я правильно помню) вроде всё типизировано и назначено что уменьшает вероятность исключений.
Но есть объяснение, обоснование? Константа для чего? Чтобы не переназначить? То есть если внутри цикла будет переменная, то это будет ХХХ констант в цикле на ХХХ итераций? А если это переменная - тяжёлый объект?
Этому нужны объяснение о пользе, и тесты.
Вывод: польза не выявлена.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
2. Нет циклов, только рекурсия.
Если я пишу foreach то "под капотом" будет рекурсия? Ну тоже "ок". Но тесты есть, показывающие преимущество по памяти и скорости?
Мне вот вообще посрать как SDK написан, но если они обновляют и показывают что скорость увеличилась, а память не используется теперь вообще - я вижу что они молодцы и более уверенно использую функционал. При желании могу глянуть код и понять как они это делают. Но мне лично всё равно что там.
Вывод: польза не выявлена.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
3. Значение функции зависит только от аргументов, не нужно каждый раз воссоздавать внешнее состояние, чтобы проверить, работает ли функция.
"Чего бл...?" Вместо глупых примеров, лучше бы пример на этот пункт, где объясняется что за внешнее состояние функции.
Или кто-то "обернул" все функции в таски? Ну да... там можно состояние проверить.
"Значение зависит от аргументов". Ничего не понятно. Что такое "значение функции"? Результат? Или ссылка на функцию которая как таск, с состоянием?
Вывод: польза не выявлена.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
1. Результат выполнения функции кэшируется, повторный вызов с теми же параметрами занимает десятки-сотни наносекунд.
Учитывая предположение о тасках, это очень похоже на реиспользование тасков.
Сомневаюсь что код компилируется в бинарник и хранится в памяти и выполняется уже.... Стоп, именно так и работает компилированная программа. Откуда тогда новая скорость?
Вывод: польза не выявлена. тестов и примеров тоже.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
3. "Ленивое" выполнение операций, результат которых не используется.
Чего? Или описание кривое или опять функционал с непонятной целью.
Выглядит так словно операция выполняется даже если не используется. Опять таски? но зачем запускать не используемое?

Вообщем по кааждому пункту больше вопросов. А раз нет ни путных примеров, тестов и объяснений "А зачем это? Чем это круче того что мы имеем каждый день?" то и напрашиваются вышенаписанные выводы.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
21.07.2026, 20:17  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
- это что-то из того что людям всегда нужно было и хотели бы видеть
Это игрушечный язык, пока что.
Цитата Сообщение от HF Посмотреть сообщение
То есть если внутри цикла будет переменная, то это будет ХХХ констант в цикле на ХХХ итераций?
Ровно наоборот: в языке нет переменных, а в собранном коде они есть.
Цитата Сообщение от HF Посмотреть сообщение
Если я пишу foreach то "под капотом" будет рекурсия?
Опять же, в языке нет циклов, написать foreach нельзя.
Цитата Сообщение от HF Посмотреть сообщение
лучше бы пример на этот пункт, где объясняется что за внешнее состояние функции.
C#
1
2
int a = 0;
int GetIterationIndex() => a++;
Вот это внешнее состояние, функция GetIterationIndex() зависит от внешней переменной a. Если в момент прогона всех юнит-тестов переменная имела одно значение, а при индивидуальном запуске другое, то результат теста будет другим. Возможно, "плаваю" в терминологии.
Цитата Сообщение от HF Посмотреть сообщение
Выглядит так словно операция выполняется даже если не используется.
При "жадном" выполнении, как в C# - да. При "ленивом" - ровно наоборот, выполняется только то, что используется.
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,114
22.07.2026, 02:47
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Поэтому, я считаю, и мой язык - не обертка, так как он добавляет существенный функционал, а не пару функций.
Твой язык опирается на базовую библиотеку классов C#, на его рантайм и компилятор, повторяет синтаксис по-максимуму. Это и есть обёртка. Твоё "добавляет функционал" это именно что пристройка с боку.

И тут встаёт вопрос: а зачем нужна обёртка над нормальным языком, когда есть сам нормальный язык? Нужно что-то, чего "из каробки" нет? Ну, добро пожаловать в реестр NuGet-пакетов.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Ровно наоборот: в языке нет переменных, а в собранном коде они есть.
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Опять же, в языке нет циклов, написать foreach нельзя.
Т.е. все "добавления функций" это на самом деле урезания? Круто.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.07.2026, 02:47

Xana - язык программирования
Где-то месяц(или 2 недели) назад начал писать новый язык программирования, чтобы заменить свой...

Lugha - опять Язык Программирования
Привет. Да, понимаю что уже надоел со своими &quot;языками программирования&quot;. Но он лучше! Я начал...

XMM - мой язык программирования
Наконец-то я сделал первую версию. Она оооочень сырая. Из-за лени сделал только 2 команды -...

Создадим свой процессор, свою операционку, свой язык программирования и свое ПО!
Дисклеймер: я и сам пока не знаю, троллинг это или нет. Читать дальше или нет - решайте сами. ...

Очередная моя попытка сделать свой 2D движок
24 октября 2022 года мне пришла идея сделать свой 2D движок. Ну и я начал делать. До этого уже были...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru