Re[8]: Вы пользуетесь constexpr?
От: so5team https://stiffstream.com
Дата: 30.11.24 07:33
Оценка:
Здравствуйте, Shmj, Вы писали:

S>>Да я вам даже больше скажу: class и struct, да что там, даже int или float -- это только и исключительно времени компиляции. Потом никаких классов и структур как run-time сущностей нет.


S>Есть разница где и когда происходит калькуляция, т.е. компьютинг — в момент компиляции на машине разработчика или в момент запуска на машине пользователя.


Есть разница где и когда происходит определение типов сущностей -- вот в compile-time мы определяем типы и компилятор обрабатывает наши декларации class и struct, а в run-time, на машине пользователя, мы не можем определить в коде новый class.

A-A-A! Два разных языка! Какой ужос! Мы все умрем!
Re[8]: Вы пользуетесь constexpr?
От: rg45 СССР  
Дата: 30.11.24 11:38
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Разница есть?


Ну, очевидно, есть. Только как ты приходишь к выводу о существовании двух разных языков, я всё равно не понимаю.

Я могу привести похожий пример.

Вот так нельзя сделать исполняемый файл:

http://coliru.stacked-crooked.com/a/072e31b52904a97e

struct A
{
    virtual void foo() = 0;

    ~A() {foo();} // error: pure virtual 'virtual void A::foo()' called from destructor [-Werror]
};


А вот так можно:

http://coliru.stacked-crooked.com/a/d7da1b6232ed6c8b

struct A
{
    virtual void foo() = 0;

    void bar() {foo();}

    ~A() {bar();} // OK
};


Здесь тоже два разных языка?

P.S. Всё-таки удалось тебе втянуть меня в свой флуд
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 30.11.2024 11:49 rg45 . Предыдущая версия .
Re: Вы пользуетесь constexpr?
От: vopl Россия  
Дата: 30.11.24 11:59
Оценка: 80 (3)
Здравствуйте, cppguard, Вы писали:

C>Заметил, что значительная часть нескольких последних стандартов иделяется этой части языка. Даже вот consteval появился. А насколько это реально нужно на практике?


Зависит от типа практики. Если у тебя какой ни будь одноуровневый домен-специфик, в рамках которого ты монотонно пилишь исключительно бизнесовую прикладуху без капитализации нарабатываемой кодовой базы — то все эти consteval нафик не нужны. А если капитализация таки имеет место то они становятся довольно востребованными.

C>Точнее, у вас есть реальный пример, когда это было настолько нужно, что эквивалентоное единовременное вычисление на стадиции инициализации программы сильно проигрывает?


Как то раз пришлось озаботиться собственным автоматом для разводки событий, аля boost::signals, но со своим блекджеком. И вот чтобы достигать zero-cost в максимальном количестве вариантов использования, применяется вся эте чертыхня с constexpr/шаблонами и прочей метапрограммирование-шнягой. То что получилось в итоге я бы оценил как "охренительно великолепно", удалось добиться быстродействия, сравнимого с наивными виртуальными вызовами с одной стороны и занчительного удобства для прикладного использования с другой. Тут можно посмотреть код

это было на уровне реализации, а вот на уровень выше — прикладное использовние в комплексе:
Re[9]: Вы пользуетесь constexpr?
От: Shmj Ниоткуда  
Дата: 30.11.24 12:08
Оценка:
Здравствуйте, rg45, Вы писали:

R>Вот так нельзя сделать исполняемый файл:

R>А вот так можно:

R>Здесь тоже два разных языка?


Ключевое слово — калькуляция. Язык нужен чтобы что-то вычислять — иначе смысла нет.

Так вот — C++ умеет вычислять в двух режимах: обычный режим в момент исполнения на компе пользователя. И второй режим вычисления — в момент компиляции.

Тот же голый С если и может что вычислять в момент сборки, то достаточно примитивные вещи — как то примитивные арифметические операции. У C++ возможности намного шире.

Ну можно еще иначе назвать: конструкции языка C++, которые поддерживают вычисления в момент компиляции. Т.е. грубо говоря то, что можно написать внутри функции constexpr (которая используется в режиме компиляции).

#include <iostream>

constexpr int fun1(int x)
{
    // Какие конструкции мы можем использовать тут?
    return 100 / x;
}

int main()
{
    constexpr int result = fun1(0);
    std::cout << "Result: " << result << std::endl;

    return 0;
}


— а конструкций не так уж много, получается. Ни выделение памяти с помощью new, ни reinterpret_cast/dynamic_cast/const_cast. Т.е. совсем другой ограниченный язык, совсем другие возможности. Ну да, во многом похож на C++.
Re[10]: Вы пользуетесь constexpr?
От: rg45 СССР  
Дата: 30.11.24 12:10
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ключевое слово — калькуляция. Язык нужен чтобы что-то вычислять — иначе смысла нет.


Это кто так постановил?

И что ты понимаешь под калькуляцией? Давай-ка вначале дадим определения, потом будем манипулировать, хорошо?

Например, из чего должно быть понятно, что операции с числами относятся к "калькуляциям", а операции с типами — нет? И что там с объектами составных типов, которые также могут создаваться во время компиляции — это подпадает под понятие "калькуляции", или нет?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 30.11.2024 12:26 rg45 . Предыдущая версия . Еще …
Отредактировано 30.11.2024 12:21 rg45 . Предыдущая версия .
Отредактировано 30.11.2024 12:14 rg45 . Предыдущая версия .
Отредактировано 30.11.2024 12:12 rg45 . Предыдущая версия .
Re[10]: Вы пользуетесь constexpr?
От: rg45 СССР  
Дата: 30.11.24 13:07
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ну можно еще иначе назвать: конструкции языка C++, которые поддерживают вычисления в момент компиляции. Т.е. грубо говоря то, что можно написать внутри функции constexpr (которая используется в режиме компиляции).


Ну вот здесь
Автор: so5team
Дата: 29.11 14:00
тебе говорили про struct, class, int, float — всё это можно написать внутри функции constexpr. Так с чем ты не согласен?
--
Справедливость выше закона. А человечность выше справедливости.
Re[11]: Вы пользуетесь constexpr?
От: Shmj Ниоткуда  
Дата: 30.11.24 13:12
Оценка:
Здравствуйте, rg45, Вы писали:

S>>Ключевое слово — калькуляция. Язык нужен чтобы что-то вычислять — иначе смысла нет.

R>Это кто так постановил?

В этом смысл компьютера — производить вычисления, т.е. преобразование входящих данных в исходящие.

R>И что ты понимаешь под калькуляцией? Давай-ка вначале дадим определения, потом будем манипулировать, хорошо?


Преобразование данных по неким правилам.

R>Например, из чего должно быть понятно, что операции с числами относятся к "калькуляциям", а операции с типами — нет? И что там с объектами составных типов, которые также могут создаваться во время компиляции — это подпадает под понятие "калькуляции", или нет?


Создание типа — это лишь подготовка к калькуляции. Тип может упростить калькуляцию, когда мы некий набор данных рассматриваем как единое целое.
Re[11]: Вы пользуетесь constexpr?
От: Shmj Ниоткуда  
Дата: 30.11.24 13:13
Оценка:
Здравствуйте, rg45, Вы писали:

R>Ну вот здесь
Автор: so5team
Дата: 29.11 14:00
тебе говорили про struct, class, int, float — всё это можно написать внутри функции constexpr. Так с чем ты не согласен?


Совершенно верно — в C++ возможности калькуляции в компил-тайм режиме — огромны. Но все же во многом ограничены — не все операторы работают, нет доступа к системным функциям.
Re[12]: Вы пользуетесь constexpr?
От: rg45 СССР  
Дата: 30.11.24 13:17
Оценка:
Здравствуйте, Shmj, Вы писали:

S>В этом смысл компьютера — производить вычисления, т.е. преобразование входящих данных в исходящие.


Ну то есть, вместо того, чтобы пояснить тезис, ты просто его повторил. Ну ОК, смотрим дальше.

S>Преобразование данных по неким правилам.


Поподробнее пожалуйста. Получение размера кортежа можно считать "преобразованием данных по неким правилам"?

S>Создание типа — это лишь подготовка к калькуляции. Тип может упростить калькуляцию, когда мы некий набор данных рассматриваем как единое целое.


Ну то есть, ты продолжаешь манипулировать термином, так и не предоставив его определения. Почему-то я не удивлён.
--
Справедливость выше закона. А человечность выше справедливости.
Re[12]: Вы пользуетесь constexpr?
От: rg45 СССР  
Дата: 30.11.24 13:17
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Совершенно верно — в C++ возможности калькуляции в компил-тайм режиме — огромны. Но все же во многом ограничены — не все операторы работают, нет доступа к системным функциям.


И? Как из этого следует существование двух языков? И почему только двух?

Типа, первый язык — это всё то, что напоминает тебе твой любимый "приятный" язык, а второй — это всё остальное?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 30.11.2024 13:23 rg45 . Предыдущая версия . Еще …
Отредактировано 30.11.2024 13:20 rg45 . Предыдущая версия .
Re[13]: Вы пользуетесь constexpr?
От: Shmj Ниоткуда  
Дата: 30.11.24 18:12
Оценка:
Здравствуйте, rg45, Вы писали:

R>Поподробнее пожалуйста. Получение размера кортежа можно считать "преобразованием данных по неким правилам"?


Конечно.

R>Ну то есть, ты продолжаешь манипулировать термином, так и не предоставив его определения. Почему-то я не удивлён.


А чем словарное определение вам не угодило: https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5
Re[13]: Вы пользуетесь constexpr?
От: Shmj Ниоткуда  
Дата: 30.11.24 18:14
Оценка:
Здравствуйте, rg45, Вы писали:

R>И? Как из этого следует существование двух языков? И почему только двух?

R>Типа, первый язык — это всё то, что напоминает тебе твой любимый "приятный" язык, а второй — это всё остальное?

То что при вычислениях разный список слов — делает языки разными. Диалекты, если хотите.
Re[14]: Вы пользуетесь constexpr?
От: rg45 СССР  
Дата: 30.11.24 18:51
Оценка:
Здравствуйте, Shmj, Вы писали:


R>>Поподробнее пожалуйста. Получение размера кортежа можно считать "преобразованием данных по неким правилам"?

S>Конечно.

Отлично, преобразование типа в число — это "калькуляция". А числа в тип и типа в тип, стало быть, тоже?

S>А чем словарное определение вам не угодило: https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5


А как я должен был понять, что под "калькуляциями" ты имеешь в виду "вычисление" из википедии.

Ну, хорошо. И как из этого определения выводится, что С++ заключает в себе два разных языка? Можно посмотреть всю цепочку рассуждений целиком?
--
Справедливость выше закона. А человечность выше справедливости.
Re[14]: Вы пользуетесь constexpr?
От: rg45 СССР  
Дата: 30.11.24 19:01
Оценка:
Здравствуйте, Shmj, Вы писали:

S>То что при вычислениях разный список слов — делает языки разными. Диалекты, если хотите.


Об этом кто-нибудь знает, кроме тебя?
--
Справедливость выше закона. А человечность выше справедливости.
Re[15]: Вы пользуетесь constexpr?
От: Shmj Ниоткуда  
Дата: 30.11.24 19:01
Оценка:
Здравствуйте, rg45, Вы писали:

R>А как я должен был понять, что под "калькуляциями" ты имеешь в виду "вычисление" из википедии.

R>Ну, хорошо. И как из этого определения выводится, что С++ заключает в себе два разных языка? Можно посмотреть всю цепочку рассуждений целиком?

C++ можно использовать для вычислений в двух режимах:

1. В момент компиляции. На машине разработчика/билд-сервера.
2. В момент исполнения. Уже на машине конечного пользователя.

Для сравнения возьмите более православный C. Какие вычисления вы там сможете сделать в режиме компиляции и какие конструкции доступны? Ну разве что const int c = a + b; Макросы не беру, с ними отдельная история.

C++ же значительно расширяет возможности вычислений при компиляции, добавляет новые конструкции и делает доступными часть конструкций из режима исполнения (но не все).
Re[16]: Вы пользуетесь constexpr?
От: rg45 СССР  
Дата: 30.11.24 19:14
Оценка:
Здравствуйте, Shmj, Вы писали:

S>C++ можно использовать для вычислений в двух режимах:


S>1. В момент компиляции. На машине разработчика/билд-сервера.

S>2. В момент исполнения. Уже на машине конечного пользователя.

Ну, это для меня что-то новое. А можно поподробнее, каким образом С++ участвует в моменте исполнения на машине конечного пользователя?

А то в стандарте языка врут, что последняя фаза работы C++ это:

https://timsong-cpp.github.io/cppwp/lex.phases#1.9

All external entity references are resolved. Library components are linked to satisfy external references to entities not defined in the current translation. All such translator output is collected into a program image which contains information needed for execution in its execution environment.

--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 30.11.2024 19:31 rg45 . Предыдущая версия . Еще …
Отредактировано 30.11.2024 19:17 rg45 . Предыдущая версия .
Отредактировано 30.11.2024 19:17 rg45 . Предыдущая версия .
Re[17]: Вы пользуетесь constexpr?
От: Shmj Ниоткуда  
Дата: 30.11.24 20:41
Оценка:
Здравствуйте, rg45, Вы писали:

S>>1. В момент компиляции. На машине разработчика/билд-сервера.

S>>2. В момент исполнения. Уже на машине конечного пользователя.

R>Ну, это для меня что-то новое. А можно поподробнее, каким образом С++ участвует в моменте исполнения на машине конечного пользователя?


Придираетесь к словам.

Ясно же что речь о тех инструкциях машинного кода, которые порождает C++. Часть инструкций им порождаемых исполняется сразу в момент компиляции. А другая часть инструкций будет выполнена лишь потом, когда бинарник будет запущен на машине пользователя.

Так вот та часть языка, которая умеет порождать выполняющиеся в момент компиляции инструкции — отличается от другой части языка, которая порождает инструкции для времени выполнения.
Re[18]: Вы пользуетесь constexpr?
От: rg45 СССР  
Дата: 30.11.24 20:47
Оценка:
Здравствуйте, Shmj, Вы писали:

S>>>1. В момент компиляции. На машине разработчика/билд-сервера.

S>>>2. В момент исполнения. Уже на машине конечного пользователя.

R>>Ну, это для меня что-то новое. А можно поподробнее, каким образом С++ участвует в моменте исполнения на машине конечного пользователя?


S>Придираетесь к словам.


А, то есть, это я виноват, что ты не можешь изложить мысль? Ну, ОК.

S>Ясно же что речь о тех инструкциях машинного кода, которые порождает C++. Часть инструкций им порождаемых исполняется сразу в момент компиляции. А другая часть инструкций будет выполнена лишь потом, когда бинарник будет запущен на машине пользователя.


Да. И где тут два языка С++? Ну да, С++ порождает очень разнообразный код. И?

S>Так вот та часть языка, которая умеет порождать выполняющиеся в момент компиляции инструкции — отличается от другой части языка, которая порождает инструкции для времени выполнения.


Да. А та часть языка, которая умеет обрабатывать конструкторы, отличается от той части языка, которая умеет обрабадывать деструкторы. А Волга впадает в Каспийское море. Так а где два языка С++?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 30.11.2024 21:01 rg45 . Предыдущая версия . Еще …
Отредактировано 30.11.2024 20:52 rg45 . Предыдущая версия .
Отредактировано 30.11.2024 20:50 rg45 . Предыдущая версия .
Re[19]: Вы пользуетесь constexpr?
От: Shmj Ниоткуда  
Дата: 30.11.24 21:13
Оценка:
Здравствуйте, rg45, Вы писали:

S>>Ясно же что речь о тех инструкциях машинного кода, которые порождает C++. Часть инструкций им порождаемых исполняется сразу в момент компиляции. А другая часть инструкций будет выполнена лишь потом, когда бинарник будет запущен на машине пользователя.


R>Да. И где тут два языка С++? Ну да, С++ порождает очень разнообразный код. И?


Критерий ГДЕ и КОГДА исполняется код — очень важен.

То ли на машине разработчика и сразу, в момент компиляции. Это одно. Совсем другое дело когда порожденные инструкции исполняются при исполнении. Это очень четкий критерий.

Обычно языки не умеют ничего выполнять в момент компиляции/сборки. Ну как, примитивные некие конструкции арифметические и не более того, что бы значение константы писать более понятным образом (как то 24*7). С++ же в этом отношении отличается от других языков и весьма сильно — тут возможность компил-тайма огромны.

Если вы попытаетесь составить табличку что можно в компил-тайм а чего нельзя — поймете что это совсем другой язык.
Отредактировано 30.11.2024 21:14 Shmj . Предыдущая версия .
Re[20]: Вы пользуетесь constexpr?
От: rg45 СССР  
Дата: 30.11.24 21:24
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Критерий ГДЕ и КОГДА исполняется код — очень важен.


Важен для кого/чего? Обоснуй?

S>То ли на машине разработчика и сразу, в момент компиляции. Это одно. Совсем другое дело когда порожденные инструкции исполняются при исполнении. Это очень четкий критерий.


Критерий чего?

S>Обычно языки не умеют ничего выполнять в момент компиляции/сборки.


Ну, это уже от языков зависит. В C++ эти возможности были изначально (sizeof, например).

S>Ну как, примитивные некие конструкции арифметические и не более того, что бы значение константы писать более понятным образом (как то 24*7). С++ же в этом отношении отличается от других языков и весьма сильно — тут возможность компил-тайма огромны.


Ну, допустим, С++ сильно отличается от других языков. Откуда берется два С++ — это по-прежнему не понятно.

S>Если вы попытаетесь составить табличку что можно в компил-тайм а чего нельзя — поймете что это совсем другой язык.


Я думаю, что уж как-нибудь получше тебя представляю, что можно в компайл-тайм, а чего нельзя. Но это по-прежнему меня не убеждает в существовании двух языков С++.
--
Справедливость выше закона. А человечность выше справедливости.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.