C++ времени компиляции - про ограничения
От: Shmj Ниоткуда  
Дата: 01.12.24 17:15
Оценка:
А вы знаете что C++ может порождать не только инструкции, включаемые в исполняемый файл (и исполняемые на машине пользователя), но так же и инструкции, который исполняются в момент компиляции.

В принципе, почти во всех ЯП есть кое-что (обычно по мелочи), что исполняется в момент компиляции/сборки на машине разработчика. Как минимум всегда можно написать 24*7 и оно вычислит.

Но C++ пошел дальше — там можно почти все, но с ограничениями! Такие ограничения C++ времени компиляции:

1. Нет обращения к изменяемым глобальным переменным, нет статических переменных внутри функции и пр. (в т.ч. нет const_cast).
2. Нет динамического выделения памяти и связанного с ним (в т.ч. полноценного полиморфизма).
3. Нет reinterpret_cast.
4. Нет вызова системных функций.
5. ?

Зато все остальное — можно юзать.

Хотя вот эти 4 пункта накладывают такие ограничения, что язык изменяется до неузнаваемости. К примеру, вот так выглядит счетчик
Автор: rg45
Дата: 27.11 18:42
(да, оказывается можно ухитриться).

И сам вопрос. А что если снять ограничения? Какие риски? Вот будет компил-тайм полноценным C++ языком. И что плохого случится?
Отредактировано 01.12.2024 17:19 Shmj . Предыдущая версия . Еще …
Отредактировано 01.12.2024 17:17 Shmj . Предыдущая версия .
Re: C++ времени компиляции - про ограничения
От: vopl Россия  
Дата: 01.12.24 17:50
Оценка: 8 (2)
Здравствуйте, 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

Давать в компайл-тайм больше системных функций в принципе можно было бы, если не ошибаюсь, Расте так сделали однажды. И получили дыру в безопасности, программы в компайл-тайме начали форматировать диск на компьютере несчастного программиста .
Re: C++ времени компиляции - про ограничения
От: kov_serg Россия  
Дата: 01.12.24 18:18
Оценка:
Здравствуйте, Shmj, Вы писали:

S> А что если снять ограничения?


Не нравятся ограничения — вот вам nim:
https://youtu.be/JMkEJ__2Meg?t=66
https://youtu.be/yu6SC2vd3qM?t=605
Re: C++ времени компиляции - про ограничения
От: Doom100500 Израиль  
Дата: 02.12.24 06:44
Оценка:
Здравствуйте, Shmj, Вы писали:

S>А вы знаете что C++ может порождать не только инструкции, включаемые в исполняемый файл (и исполняемые на машине пользователя), но так же и инструкции, который исполняются в момент компиляции.


А можно по подробнее про инструкции времени, включенные в исполняемый файл? Звучит как лютая дичь.
Спасибо за внимание
Re[2]: C++ времени компиляции - про ограничения
От: Shmj Ниоткуда  
Дата: 02.12.24 09:04
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>А можно по подробнее про инструкции времени, включенные в исполняемый файл? Звучит как лютая дичь.


Нужно начать с понятия вычисление.

Вычисления производит центральный процессор (не уточняем видеокарты и пр. — не важно). Чтобы процессор что-то вычислил — ему нужно дать инструкции.

Так вот, часть инструкций, которые порождает C++ — исполняются процессором в момент компиляции, причем эти инструкции могут быть достаточно сложны.

Другая же часть инструкций как положенно включатеся в исполняемый файл (либу) и исполняются процессором при исполнении программы.
Re[3]: C++ времени компиляции - про ограничения
От: Doom100500 Израиль  
Дата: 02.12.24 09:58
Оценка:
Здравствуйте, Shmj, Вы писали:

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


Значит, они всё-же не попадают в исполняемый файл. Я не правильно понял первое предложение.
Спасибо за внимание
Re[3]: C++ времени компиляции - про ограничения
От: kov_serg Россия  
Дата: 02.12.24 19:31
Оценка:
Здравствуйте, Shmj, Вы писали:

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

То как это сделано в C++ вызывает "лёгкое беспокойство" за тех кто это использует. Особенно если сравнить с тем как это делают другие языки:
https://youtu.be/YXrb-DqsBNU?t=2138
Re: C++ времени компиляции - про ограничения
От: F3V  
Дата: 04.12.24 16:38
Оценка:
Здравствуйте, Shmj, Вы писали:

S>И сам вопрос. А что если снять ограничения? Какие риски? Вот будет компил-тайм полноценным C++ языком. И что плохого случится?


Если коротко, то с C++ случится JavaScript.

JavaScript — это пример объединения времён компиляции, сборки и выполнения: там всё это возможно уже сейчас.

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