А вы знаете что C++ может порождать не только инструкции, включаемые в исполняемый файл (и исполняемые на машине пользователя), но так же и инструкции, который исполняются в момент компиляции.
В принципе, почти во всех ЯП есть кое-что (обычно по мелочи), что исполняется в момент компиляции/сборки на машине разработчика. Как минимум всегда можно написать 24*7 и оно вычислит.
Но C++ пошел дальше — там можно почти все, но с ограничениями! Такие ограничения C++ времени компиляции:
1. Нет обращения к изменяемым глобальным переменным, нет статических переменных внутри функции и пр. (в т.ч. нет const_cast).
2. Нет динамического выделения памяти и связанного с ним (в т.ч. полноценного полиморфизма).
3. Нет reinterpret_cast.
4. Нет вызова системных функций.
5. ?
Зато все остальное — можно юзать.
Хотя вот эти 4 пункта накладывают такие ограничения, что язык изменяется до неузнаваемости. К примеру, вот так выглядит счетчик
Здравствуйте, Shmj, Вы писали:
S>А вы знаете что C++ может порождать не только инструкции, включаемые в исполняемый файл (и исполняемые на машине пользователя), но так же и инструкции, который исполняются в момент компиляции.
S>В принципе, почти во всех ЯП есть кое-что (обычно по мелочи), что исполняется в момент компиляции/сборки на машине разработчика. Как минимум всегда можно написать 24*7 и оно вычислит.
S>Но C++ пошел дальше — там можно почти все, но с ограничениями! Такие ограничения C++ времени компиляции:
S>1. Нет обращения к изменяемым глобальным переменным, нет статических переменных внутри функции и пр. (в т.ч. нет const_cast). S>2. Нет динамического выделения памяти и связанного с ним (в т.ч. полноценного полиморфизма). S>3. Нет reinterpret_cast. S>4. Нет вызова системных функций. S>5. ?
Вот пример с глобальными переменными, динамической памятью, полиморфизмом, reinterpret_cast, доступом к системной функции (получения текущей даты) https://gcc.godbolt.org/z/6jz7sar8z
Давать в компайл-тайм больше системных функций в принципе можно было бы, если не ошибаюсь, Расте так сделали однажды. И получили дыру в безопасности, программы в компайл-тайме начали форматировать диск на компьютере несчастного программиста .
Здравствуйте, Shmj, Вы писали:
S>А вы знаете что C++ может порождать не только инструкции, включаемые в исполняемый файл (и исполняемые на машине пользователя), но так же и инструкции, который исполняются в момент компиляции.
А можно по подробнее про инструкции времени, включенные в исполняемый файл? Звучит как лютая дичь.
Здравствуйте, Shmj, Вы писали:
S>Так вот, часть инструкций, которые порождает C++ — исполняются процессором в момент компиляции, причем эти инструкции могут быть достаточно сложны.
Значит, они всё-же не попадают в исполняемый файл. Я не правильно понял первое предложение.
Здравствуйте, Shmj, Вы писали:
S>Так вот, часть инструкций, которые порождает C++ — исполняются процессором в момент компиляции, причем эти инструкции могут быть достаточно сложны.
То как это сделано в C++ вызывает "лёгкое беспокойство" за тех кто это использует. Особенно если сравнить с тем как это делают другие языки: https://youtu.be/YXrb-DqsBNU?t=2138
Здравствуйте, Shmj, Вы писали:
S>И сам вопрос. А что если снять ограничения? Какие риски? Вот будет компил-тайм полноценным C++ языком. И что плохого случится?
Если коротко, то с C++ случится JavaScript.
JavaScript — это пример объединения времён компиляции, сборки и выполнения: там всё это возможно уже сейчас.
Думаю, что для C++ такое станет ещё большим кошмаром и тут требуется какой-то новый подход к языкам программирования.