С Новым годом! Форум программистов, компьютерный форум, киберфорум
Теория и практика программирования
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/37: Рейтинг темы: голосов - 37, средняя оценка - 4.68
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
1

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

12.01.2021, 18:09. Показов 7048. Ответов 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
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 13:14  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Shamil1 Посмотреть сообщение
Какую задачу Вы хотите решить? (пример использования)
Пример использования такой:
C#
1
MyFunc((new() { 1, 2, 3 }, new() { "A", "B", "C" }), (new() { 5, 10, 15 }, new() { "X", "Y", "Z" }), (x, y) => x.AddRange(y));
Так, чтобы третий список добавился к первому, а четвертый - ко второму, и чтобы одну и ту же функцию не писать два раза.
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 13:18 22
Цитата Сообщение от vantfiles Посмотреть сообщение
...то получит старый добрый Forth
Условно, можно считать, что мощность языка складывается из трёх факторов:
1. Гибкость (универсальность, расширяемость) языка
2. Лаконичность языка (хотя тут ещё зависит от компилятора)
3. Мощность системы типов

Далее субъективно (мало знаю):
1. Lisp, Fort
2. Haskel, J, K
3. ??? Coq ... в каких языках на данный момент, например, исчисление конструкций реализовано?
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 13:21  [ТС] 23
Цитата Сообщение от Shamil1 Посмотреть сообщение
Лаконичность языка
Помню, как кто-то (возможно, не вы) писал, что краткость кода - это не преимущество языка, и что операторы в стиле ⚵ - это зло.
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 13:31 24
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Так, чтобы третий список добавился к первому, а четвертый - ко второму, и чтобы одну и ту же функцию не писать два раза.
Без проблем:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Main()
{
    var res = MyFunc((new List<int> { 1, 2, 3 }, new List<string> { "A", "B", "C" }), (new List<int> { 5, 10, 15 }, new List<string> { "X", "Y", "Z" }), (x, y) => x.AddRange(y));
    res.Dump();
}
 
private (List<T1>, List<T2>) MyFunc<T1,T2>((List<T1>, List<T2>) x, (List<T1>, List<T2>) y, Func<(List<T1>, List<T2>), (List<T1>, List<T2>), (List<T1>, List<T2>)> f)
{
    return f(x, y);
}
 
public static class Helper
{
    public static (List<T1>, List<T2>) AddRange<T1,T2>(this (List<T1>, List<T2>) x, (List<T1>, List<T2>) y)
    {
        x.Item1.AddRange(y.Item1);
        x.Item2.AddRange(y.Item2);
        return x;
    }
}
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 13:39  [ТС] 25
Цитата Сообщение от Shamil1 Посмотреть сообщение
Без проблем:
Я получил, наверное, уже под десяток решений с помощью убогих костылей. Но факт то, что все эти решения являются "одноразовыми", конкретно для данной постановки, а нужного уровня универсальности для всех возможных случаев в C# нет.
0
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
13.01.2021, 14:37 26
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
а нужного уровня универсальности для всех возможных случаев в C# нет
В таких случаях нужно создавать интерфейс с методом Add, вашим х и у имплементировать этот интерфейс, а делегат параметризовать интерфейсом. По крайней мере, так можно было бы сделать в java, думаю и в сишарпе тоже. И сделано это было намеренно, для строгости проверки типов.
В плюсах с их "утиной" типизацией шаблонов вроде можно было бы сделать так, как вы хотите. Так что учите плюсы, может это и есть бесконечно гибкий язык в ваших терминах? Проверяли?
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 14:41  [ТС] 27
Цитата Сообщение от Катафалк Посмотреть сообщение
Так что учите плюсы, может это и есть бесконечно гибкий язык в ваших терминах?
Плюсы я учил раньше, но 1 - они тоже не бесконечно гибкие, а 2 - это язык хоть и более гибкий, но сам себя позиционирует как язык "среднего" уровня, а Шарп - ультра-высокоуровневый.
0
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
13.01.2021, 14:46 28
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
они тоже не бесконечно гибкие
Вы так и не ответили, что вы считаете "бесконечно гибким" языком? Какой такой гибкости вам в плюсах может не хватать
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 14:52 29
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
нужного уровня универсальности для всех возможных случаев в C# нет
Кажется, я понял, что Вы хотите. Что-то типа:
F#
1
2
let myFunc (a, b) (c, d) f = (f a c, f b d)
let z = myFunc x y addRange
Но это в принципе невозможно при разных типах a и b. Этот код нужно скомпилировать. После этого, в myFunc будет передаваться конкретная функция f - набор инструкций. И эта функция не может одновременно быть для int и для string. Поэтому нужно передавать две разные функции. Но при этом не придётся писать функцию два раза.
F#
1
2
3
4
5
6
7
8
9
10
11
let addRange a b = List.append a b
 
//let myFunc (a, b) (c, d) f = (f a c, f b d) !!! это в принципе не может компилироваться
let myFunc (a, b) (c, d) f1 f2 = (f1 a c, f2 b d)
 
let x = ([1; 2; 3], ["A"; "B"; "C"])
let y = ([5; 10; 15], ["X"; "Y"; "Z"])
 
let z = myFunc x y addRange addRange
 
printfn "%A" z
Добавлено через 2 минуты
з.ы. Это возможно в языках с утиной типизацией.
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 14:54  [ТС] 30
Цитата Сообщение от Катафалк Посмотреть сообщение
Какой такой гибкости вам в плюсах может не хватать
Например, ни в плюсах, ни в Шарпе нельзя написать так:
Код
private static void F(typename T)
{
	if (T == int)
	...
}
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 15:01 31
Цитата Сообщение от Катафалк Посмотреть сообщение
В таких случаях нужно создавать интерфейс с методом Add, вашим х и у имплементировать этот интерфейс, а делегат параметризовать интерфейсом.
Скорее всего, не получится.
Пусть у нас есть функция "MyClass f(MyClass x) { return x; } ".
Эту функцию нельзя использовать для наследников MyClass, так как возвращаемое значение нельзя преобразовать от MyClass к классу наследнику.
Эту функцию нельзя использовать для предков MyClass, так как аргумент нельзя преобразовать от класса предка к классу MyClass.
То есть, в одном случае нам требуется ковариантность, а в другом - инвариантность.

Возможно, с использованием новых модификаторов in out можно придумать какую-нибудь громоздкую конструкцию.
0
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
13.01.2021, 15:01 32
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Например, ни в плюсах, ни в Шарпе нельзя написать так:
Вообще то, даже в шарпе такое можно - с помощью typeof https://docs.microsoft.com/ru-... f-operator
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 15:05 33
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Например, ни в плюсах, ни в Шарпе нельзя написать так
Это синтаксис:
C#
1
2
3
4
5
6
7
private static void F(Type T)
{
    if (T == typeof(int))
    {
        
    }
}
или так
C#
1
2
3
4
5
6
7
private static void F<T>(T x)
{
    if (typeof(T) == typeof(int))
    {
        
    }
}
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 15:08  [ТС] 34
Цитата Сообщение от Катафалк Посмотреть сообщение
Вообще то, даже в шарпе такое можно
А если так:
Код
private static T F<T>(MyClass obj)
{
	if (T == int)
	{
		return obj.Number;
	}
	else if (T == string)
	{
		return obj.String;
	}
	...
}
0
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
13.01.2021, 15:09 35
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
А если так:
Вы доку по ссылке прочитали? Именно так можно.
0
фрилансер
5846 / 5376 / 1103
Регистрация: 11.10.2019
Сообщений: 14,368
13.01.2021, 15:09 36
Etyuhibosecyu, в C++11 можно, читай про is_same
0
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
13.01.2021, 15:21 37
Цитата Сообщение от Shamil1 Посмотреть сообщение
Скорее всего, не получится.
Получится вот так
Java
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
/******************************************************************************
 
                            Online Java Compiler.
                Code, Compile, Run and Debug java program online.
Write your code in this editor and press "Run" button to execute it.
 
*******************************************************************************/
import java.util.function.*;
 
interface Addable<T extends Addable> {
    T add(T other);
}
 
class Int implements Addable<Int> {
    private int value;
    
    Int(int value) {
        this.value = value;
    }
    
    public Int add(Int other) {
        return new Int(this.value + other.value);
    }
    
    public String toString() {
        return String.valueOf(value);
    }
}
 
class AString implements Addable<AString> {
    private String value;
    
    AString(String value) {
        this.value = value;
    }
    
    public AString add(AString other) {
        return new AString(this.value + other.value);
    }
    
    public String toString() {
        return value;
    }
}
 
        
public class Main
{
    public static Addable outerFunction(Addable a1, Addable a2, 
                            BiFunction<Addable, Addable, Addable> delegate) {
        return delegate.apply(a1, a2);
    }
    
    public static void main(String[] args) {
        
        BiFunction<Addable, Addable, Addable> delegate = (a1, a2)->a1.add(a2);
        
        System.out.println(outerFunction(new Int(2), new Int(2), delegate));
        System.out.println(outerFunction(new AString("hello "), new AString("world"), delegate));
    }
}
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 15:22  [ТС] 38
Цитата Сообщение от Катафалк Посмотреть сообщение
Вы доку по ссылке прочитали? Именно так можно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    class MyClass
    {
        public int Number;
        public string String;
    }
...
        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;
            }
        }
Действительно ли высокоуровневые языки программирования не позволяют определенных действий умышленно?
0
Модератор
Эксперт функциональных языков программирования
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
13.01.2021, 15:38 39
Цитата Сообщение от Катафалк Посмотреть сообщение
Получится вот так
Это не то. Вы написали:
F#
1
let outerFunction a b f = f a b
а ТС хочет
F#
1
let outerFunction a b c d f = f a b, f c d
что в принципе невозможно, если a и c - разные типы

В функцию передаётся ссылка на код, который работает либо с типом a, либо с типом c. Нельзя преобразовать Func<T1,T1> в Func<T2,T2>, как нельзя преобразовать List<T1> в List<T2>. Например, List<string> нельзя преобразовать в List<object>, так как мы не можем доставать строки из списка объектов (будет исключение, если объект не строка). И наоборот нельзя, так как мы не можем положить объекты в список строк.
0
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
13.01.2021, 15:43  [ТС] 40
Shamil1, возможно, немного оффтоп, но не болтовня, надеюсь, вы не удалите. Является ли преимуществом или недостатком языка отсутствие универсального оператора явного преобразования? То есть, например, можно преобразовать целое число в действительное с помощью суффикса, в редких случаях можно преобразовать с помощью функции, а 95% преобразований неявные. Есть какие-то серьезные недостатки у такого подхода?
0
13.01.2021, 15:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2021, 15:43
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

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