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

Новое направление в программировании - "Кортежно-ориентированное программирование"

25.12.2021, 16:06. Показов 6249. Ответов 72
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Эта тема предназначена для обсуждения предполагаемого будущего программирования. Приглашаю Shamil1 и Элд Хасп присоединиться.
Я уже когда-то упоминал о новой парадигме "кортежно-ориентированного программирования" (КорОП, неформально "коробка", англ. TuOP). Теперь я хочу развить эту теорию. Вот основные тезисы КорОП:
1. Как можно понять из названия, основной элемент новой парадигмы - кортеж (англ. tuple). Он записывается так:
Code
1
(Type1, Type2, ..., TypeN) tuple = (value1, value2, ..., valueN);
Вся соль кортежа - в том, что и последовательность типов, и последовательность значений записываются именно в круглых, а не в каких-либо других скобках. Этот тип скобок - самый удобный вследствие естественных причин (почему-то он является основным в большинстве естественных письменных языков и в математике, значит, наверное же он удобнее?). И компилятор должен уметь отличать последовательность типов от последовательности значений. А еще бывает, что один идентификатор является одновременно и типом, и значением...
2. Также кортежно-ориентированный язык должен реализовывать сингулярный кортеж - последовательность значений одного типа, например, вместо (int, int, int, int, int) можно написать int[5]. В отличие от списка, длину сингулярного кортежа нельзя изменить. Сингулярный кортеж - это не массив и не список. Более того, одна часть кортежа может быть мультиплексной, а другая - сингулярной:
Code
1
(bool, int[3], real) tuple = (false, 5, 10, 15, 2.71828);
Сингулярный кортеж может иметь в том числе и достаточно большую длину, например, int[1000000].
3. Список записывается так же, как кортеж (я имею в виду значения). Компилятор должен уметь различать их по типу переменной. В случае использования var или в другой ситуации, когда тип переменной не различает список и кортеж, последовательность считается кортежом. При этом должны быть преобразования из кортежа в список и обратно (а вообще оптимально будет, если преобразование из сингулярного кортежа в список этого же или неявно-совместимого типа будет неявным) (а при преобразовании списка в кортеж несоответствующие элементы автоматически добавляются или удаляются). Также не ключевым, но желательным элементом КорОП являются автоматические преобразования из списка в список в случае, если возможно преобразование каждого элемента этого списка в нужный тип (опять же, оптимальный вариант - неявное преобразование list() int в list() real или аналогичных случаев).
4. И наоборот предыдущему пункту, в кортеже должно быть возможно получить элемент по индексу так же, как в списке. Если индекс является константным, тип получаемого элемента должен автоматически определяться компилятором, иначе элемент имеет тип, являющийся необходимым и достаточным для совместимости с типами всех элементов кортежа.
5. КорОП считает, что объекты - это... ну, не то чтобы зло, но чем их меньше - тем лучше. Оптимально - три: кортеж, список и словарь. Ну, иногда можно добавить еще три: множество, дерево и список бит. И уже совсем редко - еще шесть: стек, очередь, связной список, отсортированный словарь, отсортированное множество и бинарное дерево. Все остальные объекты - ненужный мусор, многократная уборка которого заставляет программу виснуть. Вместо пользовательских объектов рекомендуется использовать другие конструкции: структуры и рекурсивные типы, да и то только тогда, когда вложенность типов становится уже трудночитаемой, например, как в следующем коде:
Code
1
[(Stack[BlockType, string, int], string), [string, ()(()(bool, ()(string, ()(string, ()string)), Stack[BlockType, string, int], string), Stack[BlockType, string, int], ()(string, ()(string, ()string)), FunctionAttributes, ()(Stack[BlockType, string, int], string, ()(string, ()(string, ()string)), ParameterAttributes, string))]] variable = ...;
Этот код можно упростить так:
Code
1
2
3
4
5
6
7
8
typename Block = (BlockType, string, int);
typename ExtraTypes = ()(string, ExtraTypes);
typename TemplateParameters = ()(bool, ExtraTypes, Stack[Block], string);
typename MethodParameter = (Stack[Block], string, ExtraTypes, ParameterAttributes, string);
typename MethodParameters = ()MethodParameter;
typename MethodOverloads = ()(TemplateParameters, Stack[Block], ExtraTypes, FunctionAttributes, MethodParameters);
typename TypeMethods = [string, MethodOverloads];
[(Stack[Block], string), TypeMethods] variable = ...;
Вместо одной строки длиной 345 символов получилось восемь строк суммарной длиной 513 символов, но зато насколько улучшилась читаемость! Конечно, она и во втором примере не идеальна, но я сомневаюсь, что ее можно еще больше улучшить.
(Дисклеймер: прошу не требовать от меня реальных примеров применения этого кода. Я сам ума не приложу, для чего он может применяться. Это просто демонстрация правильного использования КорОП.)
6. А вот массивы в КорОП - это уже настоящее зло! Такое же, как и goto. В кортежно-ориентированном языке их не должно быть в принципе. Кортежно-ориентированный язык должен быть ультра-высокоуровневым, а массивы - слишком низкоуровневая конструкция для того, чтобы применяться в ультра-высокоуровневых языках. Список содержит все те возможности, которые содержит массив, и некоторые из тех, которые у массива отсутствуют. И отказаться от массива как раз легче, чем отказаться от goto, так как в случае с ним как раз наоборот - goto содержит много возможностей, которые иначе можно реализовать только через сложные костыли или вообще нельзя (например, переход к произвольному месту другой функции). И ничего, как-то же отказались от него настолько, что у многих неиспользование goto стало догмой, переступание через которую приводит к расстрелу без суда и следствия... (Если честно, я считаю, что такое отношение - это уже перебор. Я против вообще любой догматичной веры, и считаю, что категорически запрещено только убивать, воровать и пропагандировать коммунизм или фашизм, а все остальное, в том числе и goto, если в этом есть необходимость в данной ситуации, можно и применять.)
Вот таблица основных способов организации последовательности значений в зависимости от уровня языка:
Класс языков (экземпляр этого класса)Конструкции
Низкоуровневые (Assembler)Только указатель
Среднего уровня (C++)Указатель и массив
Высокоуровневые (Java)Массив и список
Ультра-высокоуровневые (C# .NStar)Список и кортеж
(Примечание: в C++ хоть и присутствует список, но я не знаю, чтобы он часто использовался. Возможно, у меня просто мало опыта по этому языку. С учетом того, что основные для меня средства программирования - это C# и Blueprints.)
7. В КорОП-языке обязательна возможность группового присваивания - присваивания кортежу, сформированному "на лету" из несвязанных переменных, другого такого же, причем в правом кортеже могут смешиваться несвязанные переменные и произвольные выражения, в том числе и с использованием старых значений переменных из левого кортежа. Например, вот так:
Code
1
2
3
(a, b) = (b, a); //Обмен значениями
(x, y, z, t) = (y, t, y - x, (x + z) * (t - y));
(a1, a2, a3) = (a2, a3, a2 + a3); //Фибоначчи
8. Если в ООП всё - объект, то в КорОП далеко не всё - кортеж. Например, строка - это не кортеж. (Хотя список символов - можно сказать, что кортеж.) Делегат - это тоже не кортеж. И стек, очередь, словарь и прочие - не кортежи. Хотя абсолютное большинство того, что раньше было классами - кортежи.
Всё вышенаписанное - вымышлено, все совпадения с реальными событиями случайны. Я не призываю что-либо свергать или обрушивать. Но считаю, что КорОП - следующий этап после ООП. Кто хочет, может высказываться против.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2021, 16:06
Ответы с готовыми решениями:

Какое направление в программировании выбрать?
Посоветуйте пожалуйста, какое направление в программировании будет актуальным на сегодняшний день? Вроде самые популярные JS, C, Python,...

Направление в программировании нетребовательные к глубокому знанию математики
Имеются базовые знания математики. Школьные по сути, 11 классов и всё. Какие направления в программировании не будут требовать знаний в...

Какое нынче самое сложное и мозголомное направление в программировании?
Какое нынче самое сложное и мозголомное направление в программировании?

72
фрилансер
 Аватар для Алексей1153
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
25.12.2021, 20:48
Студворк — интернет-сервис помощи студентам
Etyuhibosecyu, а я насчитал разницу по скорости в 5000 раз (и это в дебаге!)
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
25.12.2021, 20:49  [ТС]
Алексей1153, про скорость компьютера забыли?
0
фрилансер
 Аватар для Алексей1153
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
25.12.2021, 20:50
к слову, не-в-дебаге оптимизатор выкинет весь цикл и заменит загрузкой константы в переменную ))
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
25.12.2021, 20:55  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
к слову, не-в-дебаге оптимизатор выкинет весь цикл и заменит загрузкой константы в переменную ))
Я же написал, я тоже могу сделать такой компилятор, ничего принципиально невозможного тут нет, но это потребует, может быть, месяц чистого времени.
0
фрилансер
 Аватар для Алексей1153
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
25.12.2021, 21:01
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
но это потребует, может быть, месяц чистого времени.
я сделаю вид, что не видел это сообщение
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
25.12.2021, 21:11  [ТС]
Алексей1153, а как поступит этот оптимизатор в таком случае:
C++
1
2
3
4
5
6
int n = 0, len = 0;
std::cin >> len;
for (int i = 0; i < len; i++) {
    n++;
}
std::cout << n;
А в таком, где n++; заменено на n += sin(i);?

Добавлено через 49 секунд
Цитата Сообщение от Алексей1153 Посмотреть сообщение
я сделаю вид, что не видел это сообщение
Я чем-то обидел вас?

Добавлено через 5 минут
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
n += sin(i);
Да, протупил. Не скомпилируется из-за невозможности неявно преобразовать double в int.
0
фрилансер
 Аватар для Алексей1153
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
25.12.2021, 21:16
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Я чем-то обидел вас?
конечно же нет! С чего ты это взял?

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
а как поступит этот оптимизатор в таком случае:
в первом случае, я полагаю, произойдёт просто присваивание n=len;

а во втором - сложно сказать. Может, прогонит в компайлтайме, а, может, и нет

Добавлено через 2 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
из-за невозможности неявно преобразовать double в int.
преобразует, даже не пикнет )
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
25.12.2021, 21:18  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
конечно же нет! С чего ты это взял?
А почему тогда вы не желаете видеть #24?

Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
преобразует, даже не пикнет )
Ну, не знаю, C# не преобразовывает.
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
26.12.2021, 09:09
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
я тоже могу сделать такой компилятор
Не сможете. Уже проверено.
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,826
26.12.2021, 10:58
Кортеж - это такая структура (в понимании С++ struct{}), в которой элементы имеют не только имена, но и пронумерованы?
0
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
26.12.2021, 12:16
Цитата Сообщение от Mikhaylo Посмотреть сообщение
имеют не только имена
Они только пронумерованы и имеют тип. Что-то типа:

tuple my_tuple = ( int, string, float )

my_tuple = ( 10, "Вася", 3.1415 )

print( my_tuple[2] )
Вася

При этом как у структуры размер фиксирован.

my_tuple = ( 10, "Вася", 3.1415, 12345 ) -- ошибка

ps: я честное слово не знаю, для чего может быть нужна эта конструкция.

Добавлено через 2 минуты
pps: в Питоне, утверждается, кортежи весят меньше списков.

Добавлено через 15 минут
ppps: впрочем, был такой язык - Рапира. В ней кортежами назывались фактически динамические массивы с разнородными элементами. Причем можно было к примеру спокойно их объединять через операнд сложения. Такие вот выкрутасы...
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,826
26.12.2021, 13:30
Я в Пайтоне иногда использую кортежи. Например, координаты (x, y). Очень удобно, когда пишешь:
[(x1, y1), (x2, y2)] - координаты двух точек отрезка.
В Пайтоне разница между кортежом и списком - только в том, что круглые скобки вместо квадратных и нельзя удалять или добавлять элементы. Но удобно. Правило простое: если можно использовать кортеж, то сделай это!

Я просто думал, тут КорОП - это что-то новое в программировании.

Но я хочу сказать, что по возможности нужно использовать структуры вместо кортежей. Разница: в кортеже доступ к элементу по целочисленному индексу (числовая адресацию), а в структуре - доступ по имени (символьная адресация). Не знаю, есть ли аналог структур из С++ в Пайтоне? Я думал КорОП предлагает совместить числовую и символьную адресации/индексации.

P.S. А что делают вместо динамических массивов в КорОП?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
26.12.2021, 14:05  [ТС]
Цитата Сообщение от Mikhaylo Посмотреть сообщение
В Пайтоне разница между кортежом и списком - только в том, что круглые скобки вместо квадратных
В КорОП одинаковые скобки, разница только в типе целевой переменной с приоритетом на кортеж.
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Я думал КорОП предлагает совместить числовую и символьную адресации/индексации.
И вы в общем не ошиблись. В кортеже из будущего C# .NStar можно обращаться к элементам по индексу, а можно присвоить им имя.
Цитата Сообщение от Mikhaylo Посмотреть сообщение
А что делают вместо динамических массивов в КорОП?
Списки.
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,826
26.12.2021, 18:34
В C++ используйте структуры вместо кортежей. Только проблема, наверное, в том, что отсутствует операция присвоения, которая позволяет назначить значения сразу нескольким полям структуры. Вот и все.

Можно сделать так:

C++
1
2
struct1.member1 = 0;
struct1.member2 = 'abc';
Но, действительно, прикольно было бы:

C++
1
struct1 = (0, 'abc');
Но язык С++ изначально не в той области применения....

Добавлено через 7 минут
Если говорить о новом в программировании, то прикольно было следующее: все программные объекты (кортежи, списки, массивы) должны иметь одновременно три вида индексации: символьную (struct1.member1), числовую (struct1[0]) и физическую (struct1[0x00000000]). Последнее - это про указатели.
0
фрилансер
 Аватар для Алексей1153
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
26.12.2021, 18:34
Цитата Сообщение от Mikhaylo Посмотреть сообщение
прикольно было бы
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
 
int main(void)
{
    struct
    {
        int member1{};
        std::string member2;
    }struct1;
    
    struct1={0,"abc"};
}
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,826
26.12.2021, 18:36
Ну значит претензии товарища Etyuhibosecyu к языку С++ несколько притянуты за уши.

Не сработает только присвоение:
C++
1
{a, b} = {0, 0}
0
фрилансер
 Аватар для Алексей1153
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
26.12.2021, 18:46
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Не сработает только присвоение
пост #10 - аналог имеется
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
27.12.2021, 07:06
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
В кортеже из будущего C# .NStar можно обращаться к элементам по индексу
Зачем? Откуда такая потребность? Опять подгоняете язык под свои специфичные хотелки?
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,913
27.12.2021, 10:14
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Но считаю, что КорОП - следующий этап после ООП. Кто хочет, может высказываться против.
А что нового по сравнению с Python или C#?

Добавлено через 8 минут
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Список содержит все те возможности, которые содержит массив, и некоторые из тех, которые у массива отсутствуют.
Строго говоря, в списке отсутствует возможность обращения по индексу. А то, что Вы имеете ввиду, называется "вектор".

Реализация изменяемого вектора довольно проста. Но в большинстве случаев лучше подходит неизменяемый вектор. Замечательная реализация неизменяемого вектора есть в Cloujure.

з.ы. В C# вектор сначала назвали ArrayList, а позже (в момент добавления обобщённых типов) сократили до List.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
27.12.2021, 11:37  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
А что нового по сравнению с Python или C#?
Только пункты 1 и 7 - не новые. Все остальное - новое.
Цитата Сообщение от Shamil1 Посмотреть сообщение
А то, что Вы имеете ввиду, называется "вектор".
Из Википедии (есть и другие значения, но это основное и самое известное):
Ве́ктор — в простейшем случае математический объект, характеризующийся величиной и направлением. Например, в геометрии и в естественных науках вектор есть направленный отрезок прямой в евклидовом пространстве (или на плоскости).
Кроме того, "список" - слово "из жизни", а "массив" и "вектор" - слова, способные сразу отпугнуть новичка - одно при одном контакте с глазом создает впечатление чего-то большого и сложного (например, лесной массив), а другое сразу "отбрасывает" своей высоконаучностью тех, кто еще не учился в старшей школе. (Помню себя в детстве, как тема с названием "Массивы" казалась мне чем-то запредельным, и я ее просто... пролистывал. А потом заставил себя прочитать и удивился, что ничего сложного там нет.) Простите за такие рассуждения, но мой язык - для масс, и в первую очередь для молодежи, поэтому там всяким "векторам" не место. И именно по этой причине я отказался, например, от классического цикла for, заменив его на repeat и аналог foreach. А что касается "неизменяемого вектора" - это для новичка вообще пустой звук.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2021, 11:37

ПРОГРАММИСТ на новое направление
Senior developer (не менее 3 лет) 1. Server: Php: Symfony2, Zend2, Laravel (возможно Python) 2. Client: Фрэймворк AngularJS/EmberJS или...

Объектно-ориентированный анализ, Объектно-ориентированное проектирование, Объектно-ориентированное программирование
Моё задание: Система Авиакомпания. Авиакомпания имеет список рейсов. Диспетчер формирует летную Бригаду (пилоты, штурман, радист,...

Вывести на экран новое направление движения корабля
С клавиатуры вводится направление движения корабля: ...

Определить и печатать всякий раз новое направление танка
Подскажите, наведите на путь, я реально не могу сообразить как она должна работать!! Танк в компьютерной игре может двигаться в одном из...

Объектно - ориентированное программирование
Разработать пользовательский модуль, содержащий данные и методы об объекте телефонный номер (поля: фамилия владельца, имя владельца,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru