Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
55 / 13 / 2
Регистрация: 26.10.2014
Сообщений: 1,107

Универсальный язык программирования

25.05.2021, 19:15. Показов 11913. Ответов 220
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравия!
Похоливарим?
Если деятельность разработчика имеет широкий спектр, то, скорее всего, он использует не один язык, не одну технологию.
К примеру, я вынужден использовать Python для BackEnd, но для Android я вынужден использовать C#.
Уверен, не только у меня возникает вопрос об универсальном языке программирования. Возможен ли он?
Посмотрите, что происходит. Python пытаются впихнуть, куда только можно. И что интересно, куда можно он и пролазит.
Однако Python не лишен проблем. Интерпритируемость. Пока на 100% не решена проблема с отладкой ошибок, я не стал бы использовать Python как основу для серьезного проекта.
Потому, нужно искать альтернативу универсальности.
JS, здесь без комментариев. Тот же пример, что с Python, пытаются впихнуть куда только можно, только вот он уже не впихивается
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2021, 19:15
Ответы с готовыми решениями:

Универсальный язык программирования
Видел много подобных тем у вас на форуме, но соседняя тема. "С чего начать?" мне не подходит. Год назад я программировал на Visual Basic...

Язык программирования
Какие самые востребовательные языки программирования?

Язык программирования Яр
Разрабатываю полностью русскоязычный язык программирования для профессионального применения (не учебный). Основные достоинства: -...

220
1401 / 859 / 92
Регистрация: 08.02.2017
Сообщений: 3,643
Записей в блоге: 2
18.01.2026, 04:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Классы в С не нужны, а вот "this" очень бы не помешал…
Классы не нужны, но вы, как я понял, делаете псевдо-классы - структуры с полями под псевдо-методы, которые надо "носить с собой" и в ручную инициализировать.

Добавлено через 4 минуты
Цитата Сообщение от voraa Посмотреть сообщение
В Go тоже нет классов. И тоже нормально живут. Так же передают первый параметр, вместо this. Правда такую функцию синтаксически можно вызывать как метод, через точку.
Это что-то типа трейтов в Rust только без this?

Добавлено через 2 минуты
Цитата Сообщение от voraa Посмотреть сообщение
Все равно остается проблема именования функций. Не получится сделать так, что бы у разных "классов" были "методы" с одинаковым названием.
А как у Go с этим?
0
Эксперт .NET
 Аватар для Usaga
14336 / 9429 / 1358
Регистрация: 21.01.2016
Сообщений: 35,554
18.01.2026, 04:32
Цитата Сообщение от testuser2 Посмотреть сообщение
В VS это не идет "искаропки"
И что?..

Добавлено через 32 секунды
Цитата Сообщение от testuser2 Посмотреть сообщение
А как у Go с этим?
Нормально.
0
1401 / 859 / 92
Регистрация: 08.02.2017
Сообщений: 3,643
Записей в блоге: 2
18.01.2026, 04:50
Цитата Сообщение от Usaga Посмотреть сообщение
И что?..
Ваши вопросы напоминают выдачу нейросети не усвоившей весь предыдущий контекст
0
Эксперт .NET
 Аватар для Usaga
14336 / 9429 / 1358
Регистрация: 21.01.2016
Сообщений: 35,554
18.01.2026, 04:57
testuser2, ладно. Перефразирую: и что, что в VS плюсовые проекты надо донастраивать, чтобы получить некую фичу? И вообще, причём тут VS?
0
1401 / 859 / 92
Регистрация: 08.02.2017
Сообщений: 3,643
Записей в блоге: 2
18.01.2026, 05:12
Цитата Сообщение от Usaga Посмотреть сообщение
причём тут VS?
VS это флагман в разработке на C++ под Win, но я привел VS только для примера. В VS не самое простой интерфейс настройки проекта. Допустим я использовал инкрементальную компиляцию в проекте, то у меня нет простой кнопки или галочки для этого. Наверняка, я не проверял это, но почему-то уже уверен. Тема ведь об универсальности. Если у какого-то языка/среды есть порог сложности определенной величины для исползования той или иной фичи это автоматически снижает его универсальность, потому что не все являются гиками и пожирателями кактусов, получается продукт не для всех (а только для избранных).
0
Эксперт .NET
 Аватар для Usaga
14336 / 9429 / 1358
Регистрация: 21.01.2016
Сообщений: 35,554
18.01.2026, 07:02
Какой-то странный разговор. PHP - C++ - VS, который оказывается "флагман"...
0
 Аватар для voraa
1295 / 1273 / 190
Регистрация: 21.01.2024
Сообщений: 5,900
18.01.2026, 11:18
Цитата Сообщение от testuser2 Посмотреть сообщение
А как у Go с этим?
Там довольно изящно сделано.
Классов нет. Но есть типы. У типов могут быть методы.
Типа такого
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type Vector struct {
    X, Y float64
}
 
func (v Vector) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
 
func (v *Vector) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}
 
 
v := Vector{3, 4}
v.Scale(10)
l := v.Abs())
Разумеется, что методы Abs и Scale могут иметь и другие типы.
0
1401 / 859 / 92
Регистрация: 08.02.2017
Сообщений: 3,643
Записей в блоге: 2
18.01.2026, 11:56
Цитата Сообщение от voraa Посмотреть сообщение
v.X = v.X * f
Внезапно равно без двоеточия, там же должно быть долбаное := !

Добавлено через 2 минуты
Цитата Сообщение от voraa Посмотреть сообщение
Там довольно изящно сделано.
Понятно, что у высокооплачиваемого языка все изящно, но это не изящно.
0
 Аватар для voraa
1295 / 1273 / 190
Регистрация: 21.01.2024
Сообщений: 5,900
18.01.2026, 12:10
Цитата Сообщение от testuser2 Посмотреть сообщение
Внезапно равно без двоеточия, там же должно быть долбаное :=
Это же Go!
Go
1
2
x := y // Заводим (объявляем) новую переменную x и присваиваем ей значение
x = z // Присваиваем значение существующей переменной x
Хотя по мне это идиотизм и источник ошибок.

Добавлено через 11 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
но это не изящно.
А что еще сделать, если классов нет, а методы хочется?
А вводить классы - думать о наследовании (разрешать ли множественное или только одиночное, тогда какие то миксы делать), опять таки приватные, публичные, защищенные члены классов... А так нет классов и голова не болит. А методы есть!
Вон в js ввели классы, но какие то недоклассы. И хочется использовать, но иногда геморройно - нет защищенных (protected) членов
1
1401 / 859 / 92
Регистрация: 08.02.2017
Сообщений: 3,643
Записей в блоге: 2
18.01.2026, 12:35
Вообще хорошо, когда есть классы-структуры - ооп на низком уровне, это большой плюс для языка и пвышает универсальность, я считаю.
0
 Аватар для voraa
1295 / 1273 / 190
Регистрация: 21.01.2024
Сообщений: 5,900
18.01.2026, 12:44
Цитата Сообщение от testuser2 Посмотреть сообщение
Вообще хорошо, когда есть классы-структуры - ооп на низком уровне,
Я не знаю, что такое на низком уровне.
Просто начинаешь делать проект - видно, что классы вроде хорошо ложатся. Но где классы - там и наследование - а если его нет, то какие же это классы. А если есть, то вроде как и приватные и публичные свойства должны быть. Объявил в базовом классе что то приватным, а оно внезапно в наследнике понадобилось... И вот полчаса думаешь, как поступить, если нет защищенных...
Хочется же все по фен-шую сделать.
0
1401 / 859 / 92
Регистрация: 08.02.2017
Сообщений: 3,643
Записей в блоге: 2
18.01.2026, 12:52
Цитата Сообщение от voraa Посмотреть сообщение
Я не знаю, что такое на низком уровне.
На низком уровне, это значит, что можно, допустим, создать класс для простого типа, например 32-битного целого с множеством интерфейсов, но в то же время, можно передать экземпляр класса в стек как 32-битное целое.
Цитата Сообщение от voraa Посмотреть сообщение
И вот полчаса думаешь, как поступить, если нет защищенных...
И где же самые правильные классы, в С++?
0
 Аватар для voraa
1295 / 1273 / 190
Регистрация: 21.01.2024
Сообщений: 5,900
18.01.2026, 13:01
Цитата Сообщение от testuser2 Посмотреть сообщение
На низком уровне, это значит, что можно, допустим, создать класс для простого типа, например 32-битного целого с множеством интерфейсов, но в то же время, можно передать экземпляр класса в стек как 32-битное целое.
Ну как типы в Go. типом же не только структура может быть
Цитата Сообщение от testuser2 Посмотреть сообщение
И где же самые правильные классы, в С++?
Не знаю. Я только с ними и работал (если не считать js). Про другие не знаю. А абстрактная теория - не очень мне интересна.
0
1401 / 859 / 92
Регистрация: 08.02.2017
Сообщений: 3,643
Записей в блоге: 2
18.01.2026, 15:08
Цитата Сообщение от voraa Посмотреть сообщение
А абстрактная теория - не очень мне интересна.
Ну.. может быть, но вся эта тема изначально имеет хороший задел на абстрактные рассуждеия, и вы тут один из самых активных участников.

Добавлено через 1 минуту
Цитата Сообщение от voraa Посмотреть сообщение
типом же не только структура может быть
Но любой тип можно представить как структуру..

Добавлено через 1 час 55 минут
Цитата Сообщение от voraa Посмотреть сообщение
А так нет классов и голова не болит
Я не сильно разбираюсь в наследовании, но мне нравится в классах автоматика, например, конструктор и десруктор. Допустим внутри функции нужно выделять какую-то память, инициализировать какие-то хедеры, и гарантированно освобождать все эти штуки при завершении функции. Дальше, сам я так пока не делал, просто абстрактное рассуждение. Допустим, создаем класс, через который мы будем выделять память, получать хедеры и т.д., класс (экземпляр класса) это все будет запоминать, а в деструкторе освобождать все эти хедеры (каждый по своему ест-но).
0
Модератор
Эксперт Java
 Аватар для alecss131
2889 / 1394 / 412
Регистрация: 11.08.2017
Сообщений: 4,455
Записей в блоге: 2
18.01.2026, 15:27
Цитата Сообщение от testuser2 Посмотреть сообщение
Допустим внутри функции нужно выделять какую-то память, инициализировать какие-то хедеры, и гарантированно освобождать все эти штуки при завершении функции.
Поздравляю с открытием идиомы RAII
1
1401 / 859 / 92
Регистрация: 08.02.2017
Сообщений: 3,643
Записей в блоге: 2
18.01.2026, 16:12
Попросил нейросеть сделать такой класс на С++, возможно есть оплошности, все-таки нейро но просто чтобы передать суть.
А основная мысль в том, что на языке, имеющем классы с авто-деструкторами можно такое реализовать, а на языке без таких классов наверное тоже можно, но хрен знает наверное как.. )
Кликните здесь для просмотра всего текста
Класс SimpleResourceManager
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <cstdlib>
#include <iostream>
 
class SimpleResourceManager {
private:
    struct Resource {
        void* header;
        void (*deleter)(void*);
    };
    
    Resource* resources;
    int count;
    int capacity;
 
public:
    // Конструктор
    SimpleResourceManager() : resources(nullptr), count(0), capacity(0) {}
    
    // Конструктор с одним ресурсом
    SimpleResourceManager(void* header, void (*deleter)(void*)) 
        : resources(nullptr), count(0), capacity(0) {
        addResource(header, deleter);
    }
    
    // Добавление ресурса
    void addResource(void* header, void (*deleter)(void*)) {
        if (!header || !deleter) return;
        
        // Увеличиваем емкость при необходимости с помощью realloc
        if (count >= capacity) {
            int newCapacity = capacity == 0 ? 4 : capacity * 2;
            
            // Используем realloc для изменения размера массива
            Resource* newResources = static_cast<Resource*>(
                std::realloc(resources, newCapacity * sizeof(Resource))
            );
            
            if (!newResources) {
                // Ошибка выделения памяти
                std::cerr << "Memory allocation failed in addResource\n";
                return;
            }
            
            resources = newResources;
            capacity = newCapacity;
        }
        
        // Добавляем новый ресурс
        resources[count].header = header;
        resources[count].deleter = deleter;
        count++;
    }
    
    // Удаление ресурса по индексу (освобождает и удаляет из массива)
    void removeResource(int index) {
        if (index < 0 || index >= count) return;
        
        // Освобождаем ресурс
        if (resources[index].header && resources[index].deleter) {
            resources[index].deleter(resources[index].header);
        }
        
        // Сдвигаем остальные элементы
        for (int i = index; i < count - 1; i++) {
            resources[i] = resources[i + 1];
        }
        
        count--;
    }
    
    // Освобождение всех ресурсов
    void releaseAll() {
        for (int i = 0; i < count; i++) {
            if (resources[i].header && resources[i].deleter) {
                resources[i].deleter(resources[i].header);
            }
        }
        count = 0;
    }
    
    // Освобождение всех ресурсов и освобождение памяти массива
    void clear() {
        releaseAll();
        std::free(resources);
        resources = nullptr;
        capacity = 0;
    }
    
    // Получение количества ресурсов
    int getResourceCount() const {
        return count;
    }
    
    // Получение текущей емкости
    int getCapacity() const {
        return capacity;
    }
    
    // Получение ресурса по индексу (без передачи владения)
    void* getResource(int index) const {
        if (index < 0 || index >= count) return nullptr;
        return resources[index].header;
    }
    
    // Получение функции освобождения по индексу
    void (*getDeleter(int index))(void*) {
        if (index < 0 || index >= count) return nullptr;
        return resources[index].deleter;
    }
    
    // Деструктор
    ~SimpleResourceManager() {
        releaseAll();
        std::free(resources);
    }
    
    // Запрещаем копирование (для простоты)
    SimpleResourceManager(const SimpleResourceManager&) = delete;
    SimpleResourceManager& operator=(const SimpleResourceManager&) = delete;
    
    // Перемещающий конструктор
    SimpleResourceManager(SimpleResourceManager&& other) noexcept 
        : resources(other.resources), count(other.count), capacity(other.capacity) {
        other.resources = nullptr;
        other.count = 0;
        other.capacity = 0;
    }
    
    // Перемещающий оператор присваивания
    SimpleResourceManager& operator=(SimpleResourceManager&& other) noexcept {
        if (this != &other) {
            // Освобождаем текущие ресурсы
            releaseAll();
            std::free(resources);
            
            // Перемещаем из other
            resources = other.resources;
            count = other.count;
            capacity = other.capacity;
            
            // Обнуляем other
            other.resources = nullptr;
            other.count = 0;
            other.capacity = 0;
        }
        return *this;
    }
};
Пример использования
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
 
// Пример функций освобождения
void freeIntArray(void* ptr) {
    int* arr = static_cast<int*>(ptr);
    delete[] arr;
    std::cout << "Freed int array of size 100\n";
}
 
void freeString(void* ptr) {
    char* str = static_cast<char*>(ptr);
    delete[] str;
    std::cout << "Freed string\n";
}
 
int main() {
    // Создаем менеджер
    SimpleResourceManager manager;
    
    // Добавляем несколько ресурсов
    int* data1 = new int[100];
    manager.addResource(data1, freeIntArray);
    
    char* text = new char[50];
    manager.addResource(text, freeString);
    
    std::cout << "Resources count: " << manager.getResourceCount() << "\n";
    std::cout << "Current capacity: " << manager.getCapacity() << "\n";
    
    // Добавляем еще больше ресурсов для проверки realloc
    for (int i = 0; i < 10; i++) {
        int* value = new int(i);
        manager.addResource(value, [](void* p) {
            delete static_cast<int*>(p);
        });
    }
    
    std::cout << "After adding 10 more resources:\n";
    std::cout << "Resources count: " << manager.getResourceCount() << "\n";
    std::cout << "Current capacity: " << manager.getCapacity() << "\n";
    
    // Удаляем ресурс по индексу 1 (текст)
    std::cout << "\nRemoving resource at index 1:\n";
    manager.removeResource(1);
    std::cout << "Resources count after removal: " << manager.getResourceCount() << "\n";
    
    // // Получаем ресурс по индексу
    // void* resource = manager.getResource(0);
    // std::cout << "Resource at index 0: " << resource << "\n";
    
    // Очищаем все вручную
    // manager.clear();
    
    // При выходе из области видимости деструктор освободит все оставшиеся ресурсы
    return 0;
}


Добавлено через 10 минут
Цитата Сообщение от alecss131 Посмотреть сообщение
Поздравляю с открытием идиомы RAII
Я ее какбы не то чтоб открыл, а постоянно видел ее в VB6/VBA, в стандартных классах C++ наверняка она тоже реализована , как я догадываюсь.
0
 Аватар для voraa
1295 / 1273 / 190
Регистрация: 21.01.2024
Сообщений: 5,900
18.01.2026, 17:35
Цитата Сообщение от testuser2 Посмотреть сообщение
а в деструкторе освобождать все эти хедеры (каждый по своему ест-но).
А можно вообще плюнуть на это и положиться на сборщик мусора, как в go, или js.
Деструкторы ведь тоже не особо помогают. Выделил память под объект. Потом куда то присвоил ссылку, на поле из этого объекта. Потом деструктором освободил память. А что со ссылкой на поле?
0
1401 / 859 / 92
Регистрация: 08.02.2017
Сообщений: 3,643
Записей в блоге: 2
18.01.2026, 17:51
voraa, а ссылку мы в манагер не помещали, мы её просто посмотреть взяли. В манагер помещается только то, что выделяется в куче либо какой-нибудь хендл в момент его получения. Если нужно раньше освободить хендл то освобождаем его с помощью менегера (конкретно это не было предусмотрено в коде)
0
 Аватар для voraa
1295 / 1273 / 190
Регистрация: 21.01.2024
Сообщений: 5,900
18.01.2026, 18:04
Цитата Сообщение от testuser2 Посмотреть сообщение
voraa, а ссылку мы в манагер не помещали,
Да я не про этот конкретный код. А в принципе.
Выделили память под массив (1000000 штук) структур. Ссылки на какие то отдельные структуры присвоили внешним указателям. А потом деструктор освободил эту память. И кто проконтролирует, что эти указатели уже указывают хрен знает на что?
А если функция захочет вернуть указатель на локальную переменную? Кто это проконтролирует?
(В go такое возможно. Просто компилятор следит за такими вещами и в таком случае сам разместит такую переменную не в стеке, а в куче)
0
1401 / 859 / 92
Регистрация: 08.02.2017
Сообщений: 3,643
Записей в блоге: 2
18.01.2026, 18:37
Просто, то, на что берутся ссылки должно само иметь ссылочный тип, со счетчиком ссылок), наверное так. Все остальное хардкор, который программист сам должен разруливать, если он это создал на свою голову.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2026, 18:37
Помогаю со студенческими работами здесь

мощный язык программирования
Часто слышу фразу &quot;мощный язык&quot; относительно C++, Java и некоторых других языков программирования. Интуитивно я примерно понимаю что это...

Свой язык программирования
Если бы вы пришли к власти создали свой (безусловно, самый лучший) язык программирования, что бы вы в него включили? Понятно, что нужно...

Какой язык программирования лучше?
Какой на ваш взгляд самый универсальный(т.е. одинаково хорош во всех сферах программирования: веб, приложения и т.д.), лучший?

Язык программирования для Backend
Здравствуйте. Халивар неизбежен, однако, мне следует задать этот вопрос. Что сейчас лучше использовать для Backend? Конкретнее: 1)...

Какой язык программирования лучше? (3)
Продолжение темы


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

Или воспользуйтесь поиском по форуму:
220
Ответ Создать тему
Новые блоги и статьи
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru