Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
1

Действительно ли высокоуровневые языки программирования не позволяют определенных действий умышленно?

12.01.2021, 18:09. Показов 7051. Ответов 94
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Речь идет не о низкоуровневых действиях, таких как прямое управление памятью, а наоборот, об ультра-высокоуровневых конструкциях. В этой теме я наткнулся на реальную ограниченность самого мощного языка современности - C# - далеко не в низкоуровневых действиях. И господин uzhsoft написал:
Цитата Сообщение от uzhsoft Посмотреть сообщение
ограничен и очень сильно... но это больше для того, чтобы в ногу не стрелять
Как написано на другом форуме по поводу выражения "выстрелить себе в ногу":
Это означает, что на языке можно написать команду или конструкцию, которая сломает нормальное поведение программы или системы (или будет выполняться совершенно не так, как можно было бы логически предположить), и при этом компилятор/интерпретатор это скомпилирует и не ругнется.
Каким способом возможно, например, с помощью такого кода (допустим, я напишу язык, похожий на C#, но в котором типизировать универсальным типом функцию, передаваемую в качестве параметра в другую функцию, является возможным):
Код
closed static [(typename T1, typename T2), null Function((() T1, () T2) list1, (() T1, () T2) list2, [typename TInner, Action[() TInner, () TInner]] inner_func)] MyFunc =
{
	(() T1 left_list1, () T2 right_list1) = list1;
	(() T1 left_list2, () T2 right_list2) = list2;
	inner_func(left_list1, left_list2);
	inner_func(right_list1, right_list2);
};
(() int, () string) list1 = ((1, 2, 3), ("A", "B", "C")), list2 = ((5, 10, 15), ("X", "Y", "Z"));
MyFunc(list1, list2, (x, y) => x.Add(y));
- сломать нормальное поведение программы или системы? (Вот таблица соответствий условного языка и C#.)
closedprivate
typenameРекурсивный тип, все другие типы являются его значениями
[A, B] (без типа впереди)Dictionary<A, B>
null Function(...)void(...) (функция, не возвращающая значения)
() TList<T>
Type[...]Type<...>
[A, B] = somethingЭто значение доступно по всем ключам словаря
list.AddМожет добавить как одно значение, так и список
(Эта тема - НЕ презентация возможностей языка. Ее суть - вопрос об ограничениях на некоторые действия в языках программирования в принципе.)
Я понимаю, что какое-то явное издевательство над программированием - нужно запрещать. Но в данном коде я не вижу ничего такого, что нарушает принципы высокоуровневого языка (как, например, goto, подстановка абсолютно любого кода в макрос с любым алфавитно-цифровым именем (таким, как if) или уже упомянутое прямое управление памятью), даже наоборот - это является не просто высокоуровневой, а ультра-высокоуровневой возможностью. Но почему же тогда эта возможность запрещена? И это в Шарпе, который должен давать другим языкам пример для подражания в плане высокоуровневости! Или, может, такая могучая корпорация Microsoft по какой-то причине не может сделать то, что, скорее всего, может любой быдлокодер, нужно только время? Или там сидят такие лентяи, которые не делают себе труда реализовать это? Или такие бездарные люди, которые не представляют себе, что так можно сделать, зато умеют воровать идеи, и пройдет пара лет после того, как я это здесь написал - и эта возможность появится? Или вы хотите сказать, что это по каким-то объективным причинам, которых я не знаю, не получится ни у кого, в том числе и у меня? Нет, мне кажется, что это ограничение было введено умышленно. Но для чего? Прошу ответить.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2021, 18:09
Ответы с готовыми решениями:

Высокоуровневые методы информатики и программирования
Составить программу, имеющую графический интерфейс и окна для ввода/отображения данных. Программа...

Создание условия: при определенных значениях переменной выполнения определенных арифметических действий
Имеется переменная w2 при значении 1 -происходит вычитание 2 - сложение 3 - умножение 4 - деление...

Есть ли вообще аналогичные языки программирования только с уровнем изучения легкий чем язык программирования С
Язык программирования С очень сложный есть ли вообще аналогичный язык программирования только...

языки программирования
На каких языках программирования сейчас в основном пишится весь софт

94
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 15:50 41
Author24 — интернет-сервис помощи студентам
Etyuhibosecyu,
Действительно, забавно. Зато можно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private static T F<T>(MyClass obj)
{
    if (typeof(T).Equals(typeof(int)))
    {
        return (T)(object)obj.Number;
    }
    else if (typeof(T).Equals(typeof(string)))
    {
        return (T)(object)obj.String;
    }
    else
    {
        return default;
    }
}
1
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 15:52 42
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Является ли преимуществом или недостатком языка отсутствие универсального оператора явного преобразования?
Неявное преобразование типов - это зло. А универсального преобразования не существует. С помощью каких инструкций процессора Вы преобразуете тип А в тип Б для любых А и Б?
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 16:02  [ТС] 43
Цитата Сообщение от Shamil1 Посмотреть сообщение
Неявное преобразование типов - это зло.
Аргументировать можете?
Цитата Сообщение от Shamil1 Посмотреть сообщение
А универсального преобразования не существует.
Я имею в виду не преобразование между абсолютно любыми типами, а единый оператор, такой как (T)a.
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 16:30 44
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
единый оператор, такой как (T)a
Нет универсального алгоритма преобразования одного типа в другой. Но есть универсальные алгоритмы по преобразованию типа в object и обратно.

Теоретически, можно было написать оператор (T)a = (T)(object)a.
Плюсы - в тех случаях, когда это требуется, писать чуть меньше.
Минусы - в тех случаях, когда программист написал "(T)a" или (MyType1)myType2 по ошибке (или забыл добавить в MyType1 оператор преобразования из типа MyType2), компилятор не ругнётся.
Видимо, создатели C# решили, что в данном случае минусы перевешивают плюсы.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Аргументировать можете?
Да. Аж на несколько экранов. Перемежая аргументы с нецензурной лексикой.
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 16:31  [ТС] 45
Цитата Сообщение от Shamil1 Посмотреть сообщение
Да. Аж на несколько экранов. Перемежая аргументы с нецензурной лексикой.
А серьезно? Неужели модератор будет опускаться до нецензурной лексики? Что плохого, например, в таких командах (в стиле C#):
Код
int n = "5";
string s = 3.14;
List<string> list = "ABC"; //Преобразуется в список с единственным элементом
string s2 = new List<List<int>> { new() { 1, 2, 3 }, new() { 4, 5, 6 }, new() { 7, 8, 9 } }; //Преобразуется в "{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }"
double n2 = null;
Я считаю, такой язык - огромная мощь.
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 16:35 46
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
А серьезно?
Если кратко, то очень сложно искать ошибку/опечатку.
Например, вот две одинаковые функции, которые на самом деле совсем разные:
PowerShell
1
2
3
4
5
6
7
8
function f1($x) {
    return $x + 1
}
 
 
function f2([int]$x) {
    return $x + 1
}
Добавлено через 2 минуты
Вы опечатались/ошиблись в одном месте, а ошибка будет происходить в другом. Либо ошибки вообще не будет, но ответ будет неправильный.
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 16:41  [ТС] 47
Цитата Сообщение от Shamil1 Посмотреть сообщение
Вы опечатались/ошиблись в одном месте, а ошибка будет происходить в другом.
Как, например, так можно опечататься? Неужели нормальный программист может написать вместо "5" - "A"?
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 16:43 48
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Неужели нормальный программист может написать вместо "5" - "A"?
Вместо "5" - 5. Или вместо x - y.

Вот ещё пример:
PowerShell
1
2
3
4
5
6
7
8
function f1([timespan]$x) 
{
    $x
}
 
f1(10)      # 10 ticks
f1("10")    # 10 days 
f1("10:0") # 10 hours
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 16:46  [ТС] 49
Цитата Сообщение от Shamil1 Посмотреть сообщение
Вот ещё пример:
То есть, вы считаете, язык PowerShell - это воплощение зла?
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 16:56 50
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
То есть, вы считаете, язык PowerShell - это воплощение зла?
Конечно.
Вызвал по ошибке не тот метод (или просто по названию неправильно понял, что делает метод) - а оно работает. В смысле - не падает. Но делает что-то не то. И хорошо, если сразу можно будет заметить, что не то.

Добавлено через 2 минуты
PowerShell
1
2
3
4
5
function f1($x) {
    return $x.Length
}
 
f1(10) # print 1
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 17:00  [ТС] 51
Цитата Сообщение от Shamil1 Посмотреть сообщение
Вызвал по ошибке не тот метод (или просто по названию неправильно понял, что делает метод) - а оно работает. В смысле - не падает. Но делает что-то не то. И хорошо, если сразу можно будет заметить, что не то.
Спасибо, я подумаю над вашими словами. Но думаю, расширяющие преобразования, такие как T в List<T>, а также преобразования в строку могут быть и неявными, так как если в таком случае вызвать не тот метод, не пройдет обратное преобразование.
0
958 / 576 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
13.01.2021, 17:49 52
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
private static T F<T>(MyClass obj)
        {
            if (typeof(T).Equals(typeof(int)))
            {
                return (T)obj.Number;
            }
            else if (typeof(T).Equals(typeof(string)))
            {
                return (T)obj.String;
            }
            else
            {
                return default;
            }
        }
C#
1
2
3
4
5
6
7
8
             if (typeof(T).Equals(typeof(int)))
            {
                return (T)Convert.ChangeType(obj.Number, typeof(T));
            }
            else if (typeof(T).Equals(typeof(string)))
            {
                return (T)Convert.ChangeType(obj.String, typeof(T));
            }
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 18:08 53
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Но думаю, расширяющие преобразования, такие как T в List<T>, а также преобразования в строку могут быть и неявными, так как если в таком случае вызвать не тот метод, не пройдет обратное преобразование.
Ради чего? И какой ценой?

Не по теме:

Случай из жизни. Прапорщик послал солдата (водителя грузовика) на другой конец города купить мешок цемента, так там на 50 рублей дешеле. Солдат купил цемент дороже, но рядом. Сэкономленный бензин слил и продал - покрыл разницу в цене и еще на пиво осталось.




PowerShell
1
$x.Length
Что делает эта строка кода? Подробное описание займет несколько страниц текста. Более того, не исключено, что на одном компьютере этот код будет выводить количество пользователей в группе "Администраторы", а на другом тот же самый код будет выводить длину имени пользователя Administrator. Потому что неявные преобразования.
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 18:14  [ТС] 54
Shamil1, а такое в Шарпе возможно? Чтобы уже полный комплект?
Код
private static typename F(string basic_type)
{
	...
}
typename T = F("int");
T a = (T)(object)5;
0
958 / 576 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
13.01.2021, 18:48 55
Etyuhibosecyu, вам такое нужно?
C#
1
2
3
4
5
6
7
static T1 GetValue<T1, T2>(T2 value)
{
  return (T1)Convert.ChangeType(value, typeof(T1));
}
 
int x = GetValue<int,string>("5");
double y = GetValue<double,string>("5");
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 18:50  [ТС] 56
uzhsoft, нет, мне нужно создать переменную с типом, определенным на основе строки или любого другого значения.
0
958 / 576 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
13.01.2021, 19:02 57
Etyuhibosecyu,
C#
1
2
var t = Convert.ChangeType("5", Type.GetType("System.Int32"));
Console.WriteLine(t);
0
Эксперт .NET
12512 / 8698 / 1311
Регистрация: 21.01.2016
Сообщений: 32,672
14.01.2021, 06:35 58
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
мне нужно создать переменную с типом, определенным на основе строки или любого другого значения.
Что? Зачем? Это опять какой-то транслятор пишется?
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
14.01.2021, 09:15 59
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
мне нужно создать переменную с типом, определенным на основе строки или любого другого значения
Если строка известна на момент компиляции, то проще явно написать нужный тип. Если строка не известна на момент компиляции, то это уже динамическая типизация получается. При этом теряется основной смысл статической типизации - проверка корректности программы на этапе компиляции.

Зачем вообще может понадобится преобразование типов? По моему опыту, очень редко возникает такая необходимость (тем более, в небезопасных преобразованиях).
0
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
14.01.2021, 09:20 60
Etyuhibosecyu, возьмите уже жабаскрипт, шпарьте везде eval и не мучайтесь
0
14.01.2021, 09:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2021, 09:20
Помогаю со студенческими работами здесь

Языки программирования
Пройдите, пожалуйста, гугл опрос по поводу языков программирования...

Языки программирования
Здравствуйте. Пишу вам сюда,так как не знаю куда обратится. Есть несколько вопросов. Надеюсь тут...

Языки программирования
Мои знания на данный момент ограничиваются на довольно хорошем уровне html, css, и совсем немного...

Языки программирования
Как вы считаете который из языков программирование легче и лучше изучать? Дельфи,С++ и т.д

Языки программирования
Вопрос, собственно, вот в чем: плюсы и минусы Java относительно других языков. (Ну, очевидно,...

Языки программирования
Есть код программы #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; int...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru