Здравствуйте, Shmj, Вы писали:
S>>Да я вам даже больше скажу: class и struct, да что там, даже int или float -- это только и исключительно времени компиляции. Потом никаких классов и структур как run-time сущностей нет.
S>Есть разница где и когда происходит калькуляция, т.е. компьютинг — в момент компиляции на машине разработчика или в момент запуска на машине пользователя.
Есть разница где и когда происходит определение типов сущностей -- вот в compile-time мы определяем типы и компилятор обрабатывает наши декларации class и struct, а в run-time, на машине пользователя, мы не можем определить в коде новый class.
A-A-A! Два разных языка! Какой ужос! Мы все умрем!
Здравствуйте, cppguard, Вы писали:
C>Заметил, что значительная часть нескольких последних стандартов иделяется этой части языка. Даже вот consteval появился. А насколько это реально нужно на практике?
Зависит от типа практики. Если у тебя какой ни будь одноуровневый домен-специфик, в рамках которого ты монотонно пилишь исключительно бизнесовую прикладуху без капитализации нарабатываемой кодовой базы — то все эти consteval нафик не нужны. А если капитализация таки имеет место то они становятся довольно востребованными.
C>Точнее, у вас есть реальный пример, когда это было настолько нужно, что эквивалентоное единовременное вычисление на стадиции инициализации программы сильно проигрывает?
Как то раз пришлось озаботиться собственным автоматом для разводки событий, аля boost::signals, но со своим блекджеком. И вот чтобы достигать zero-cost в максимальном количестве вариантов использования, применяется вся эте чертыхня с constexpr/шаблонами и прочей метапрограммирование-шнягой. То что получилось в итоге я бы оценил как "охренительно великолепно", удалось добиться быстродействия, сравнимого с наивными виртуальными вызовами с одной стороны и занчительного удобства для прикладного использования с другой. Тут можно посмотреть код
Здравствуйте, 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++.
Здравствуйте, Shmj, Вы писали:
S>Ключевое слово — калькуляция. Язык нужен чтобы что-то вычислять — иначе смысла нет.
Это кто так постановил?
И что ты понимаешь под калькуляцией? Давай-ка вначале дадим определения, потом будем манипулировать, хорошо?
Например, из чего должно быть понятно, что операции с числами относятся к "калькуляциям", а операции с типами — нет? И что там с объектами составных типов, которые также могут создаваться во время компиляции — это подпадает под понятие "калькуляции", или нет?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Shmj, Вы писали:
S>Ну можно еще иначе назвать: конструкции языка C++, которые поддерживают вычисления в момент компиляции. Т.е. грубо говоря то, что можно написать внутри функции constexpr (которая используется в режиме компиляции).
Здравствуйте, rg45, Вы писали:
S>>Ключевое слово — калькуляция. Язык нужен чтобы что-то вычислять — иначе смысла нет. R>Это кто так постановил?
В этом смысл компьютера — производить вычисления, т.е. преобразование входящих данных в исходящие.
R>И что ты понимаешь под калькуляцией? Давай-ка вначале дадим определения, потом будем манипулировать, хорошо?
Преобразование данных по неким правилам.
R>Например, из чего должно быть понятно, что операции с числами относятся к "калькуляциям", а операции с типами — нет? И что там с объектами составных типов, которые также могут создаваться во время компиляции — это подпадает под понятие "калькуляции", или нет?
Создание типа — это лишь подготовка к калькуляции. Тип может упростить калькуляцию, когда мы некий набор данных рассматриваем как единое целое.
тебе говорили про struct, class, int, float — всё это можно написать внутри функции constexpr. Так с чем ты не согласен?
Совершенно верно — в C++ возможности калькуляции в компил-тайм режиме — огромны. Но все же во многом ограничены — не все операторы работают, нет доступа к системным функциям.
Здравствуйте, Shmj, Вы писали:
S>В этом смысл компьютера — производить вычисления, т.е. преобразование входящих данных в исходящие.
Ну то есть, вместо того, чтобы пояснить тезис, ты просто его повторил. Ну ОК, смотрим дальше.
S>Преобразование данных по неким правилам.
Поподробнее пожалуйста. Получение размера кортежа можно считать "преобразованием данных по неким правилам"?
S>Создание типа — это лишь подготовка к калькуляции. Тип может упростить калькуляцию, когда мы некий набор данных рассматриваем как единое целое.
Ну то есть, ты продолжаешь манипулировать термином, так и не предоставив его определения. Почему-то я не удивлён.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Shmj, Вы писали:
S>Совершенно верно — в C++ возможности калькуляции в компил-тайм режиме — огромны. Но все же во многом ограничены — не все операторы работают, нет доступа к системным функциям.
И? Как из этого следует существование двух языков? И почему только двух?
Типа, первый язык — это всё то, что напоминает тебе твой любимый "приятный" язык, а второй — это всё остальное?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>И? Как из этого следует существование двух языков? И почему только двух? R>Типа, первый язык — это всё то, что напоминает тебе твой любимый "приятный" язык, а второй — это всё остальное?
То что при вычислениях разный список слов — делает языки разными. Диалекты, если хотите.
Здравствуйте, rg45, Вы писали:
R>А как я должен был понять, что под "калькуляциями" ты имеешь в виду "вычисление" из википедии. R>Ну, хорошо. И как из этого определения выводится, что С++ заключает в себе два разных языка? Можно посмотреть всю цепочку рассуждений целиком?
C++ можно использовать для вычислений в двух режимах:
1. В момент компиляции. На машине разработчика/билд-сервера.
2. В момент исполнения. Уже на машине конечного пользователя.
Для сравнения возьмите более православный C. Какие вычисления вы там сможете сделать в режиме компиляции и какие конструкции доступны? Ну разве что const int c = a + b; Макросы не беру, с ними отдельная история.
C++ же значительно расширяет возможности вычислений при компиляции, добавляет новые конструкции и делает доступными часть конструкций из режима исполнения (но не все).
Здравствуйте, Shmj, Вы писали:
S>C++ можно использовать для вычислений в двух режимах:
S>1. В момент компиляции. На машине разработчика/билд-сервера. S>2. В момент исполнения. Уже на машине конечного пользователя.
Ну, это для меня что-то новое. А можно поподробнее, каким образом С++ участвует в моменте исполнения на машине конечного пользователя?
А то в стандарте языка врут, что последняя фаза работы C++ это:
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.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
S>>1. В момент компиляции. На машине разработчика/билд-сервера. S>>2. В момент исполнения. Уже на машине конечного пользователя.
R>Ну, это для меня что-то новое. А можно поподробнее, каким образом С++ участвует в моменте исполнения на машине конечного пользователя?
Придираетесь к словам.
Ясно же что речь о тех инструкциях машинного кода, которые порождает C++. Часть инструкций им порождаемых исполняется сразу в момент компиляции. А другая часть инструкций будет выполнена лишь потом, когда бинарник будет запущен на машине пользователя.
Так вот та часть языка, которая умеет порождать выполняющиеся в момент компиляции инструкции — отличается от другой части языка, которая порождает инструкции для времени выполнения.
Здравствуйте, Shmj, Вы писали:
S>>>1. В момент компиляции. На машине разработчика/билд-сервера. S>>>2. В момент исполнения. Уже на машине конечного пользователя.
R>>Ну, это для меня что-то новое. А можно поподробнее, каким образом С++ участвует в моменте исполнения на машине конечного пользователя?
S>Придираетесь к словам.
А, то есть, это я виноват, что ты не можешь изложить мысль? Ну, ОК.
S>Ясно же что речь о тех инструкциях машинного кода, которые порождает C++. Часть инструкций им порождаемых исполняется сразу в момент компиляции. А другая часть инструкций будет выполнена лишь потом, когда бинарник будет запущен на машине пользователя.
Да. И где тут два языка С++? Ну да, С++ порождает очень разнообразный код. И?
S>Так вот та часть языка, которая умеет порождать выполняющиеся в момент компиляции инструкции — отличается от другой части языка, которая порождает инструкции для времени выполнения.
Да. А та часть языка, которая умеет обрабатывать конструкторы, отличается от той части языка, которая умеет обрабадывать деструкторы. А Волга впадает в Каспийское море. Так а где два языка С++?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
S>>Ясно же что речь о тех инструкциях машинного кода, которые порождает C++. Часть инструкций им порождаемых исполняется сразу в момент компиляции. А другая часть инструкций будет выполнена лишь потом, когда бинарник будет запущен на машине пользователя.
R>Да. И где тут два языка С++? Ну да, С++ порождает очень разнообразный код. И?
Критерий ГДЕ и КОГДА исполняется код — очень важен.
То ли на машине разработчика и сразу, в момент компиляции. Это одно. Совсем другое дело когда порожденные инструкции исполняются при исполнении. Это очень четкий критерий.
Обычно языки не умеют ничего выполнять в момент компиляции/сборки. Ну как, примитивные некие конструкции арифметические и не более того, что бы значение константы писать более понятным образом (как то 24*7). С++ же в этом отношении отличается от других языков и весьма сильно — тут возможность компил-тайма огромны.
Если вы попытаетесь составить табличку что можно в компил-тайм а чего нельзя — поймете что это совсем другой язык.
Здравствуйте, Shmj, Вы писали:
S>Критерий ГДЕ и КОГДА исполняется код — очень важен.
Важен для кого/чего? Обоснуй?
S>То ли на машине разработчика и сразу, в момент компиляции. Это одно. Совсем другое дело когда порожденные инструкции исполняются при исполнении. Это очень четкий критерий.
Критерий чего?
S>Обычно языки не умеют ничего выполнять в момент компиляции/сборки.
Ну, это уже от языков зависит. В C++ эти возможности были изначально (sizeof, например).
S>Ну как, примитивные некие конструкции арифметические и не более того, что бы значение константы писать более понятным образом (как то 24*7). С++ же в этом отношении отличается от других языков и весьма сильно — тут возможность компил-тайма огромны.
Ну, допустим, С++ сильно отличается от других языков. Откуда берется два С++ — это по-прежнему не понятно.
S>Если вы попытаетесь составить табличку что можно в компил-тайм а чего нельзя — поймете что это совсем другой язык.
Я думаю, что уж как-нибудь получше тебя представляю, что можно в компайл-тайм, а чего нельзя. Но это по-прежнему меня не убеждает в существовании двух языков С++.
--
Справедливость выше закона. А человечность выше справедливости.