Здравствуйте, Shmj, Вы писали: S>Критерий ГДЕ и КОГДА исполняется код — очень важен.
Давай попробуем идти от частного к общему. Рассмотрим такой несложный пример:
#include <iostream>
int foo(int x) { return x * 10; }
int bar(int x) { return x * 100; }
int main()
{
int value = foo(3) + bar(5);
std::cout << value << std::endl;
}
Согласно твоим критериям, на каком языке написана данная программа?
Спойлер
В зависимости от опций компиляции, значение value может вычисляться как в компайл- так и в ран-тайме. И согласно твоим критериям, мы не можем определить, на каком языке написана программа, пока не изучим сгенерированный код, так получается?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, vopl, Вы писали:
V>без капитализации нарабатываемой кодовой базы
Что такое "капитализация нарабатываемой базы"? Получение выгоды раз за разом из единожды написанного кода?
V>Как то раз пришлось озаботиться собственным автоматом для разводки событий, аля boost::signals, но со своим блекджеком. И вот чтобы достигать zero-cost в максимальном количестве вариантов использования, применяется вся эте чертыхня с constexpr/шаблонами и прочей метапрограммирование-шнягой. То что получилось в итоге я бы оценил как "охренительно великолепно", удалось добиться быстродействия, сравнимого с наивными виртуальными вызовами с одной стороны и занчительного удобства для прикладного использования с другой. Тут можно посмотреть код
Выглядит сложно, но можно в двух словах о том, что там действительно происходит? Почему, скажем, на Java это должно работать медленее (без учёта времени на JIT и сборку мусора)?
Здравствуйте, cppguard, Вы писали:
C>Здравствуйте, vopl, Вы писали:
V>>без капитализации нарабатываемой кодовой базы C>Что такое "капитализация нарабатываемой базы"? Получение выгоды раз за разом из единожды написанного кода?
Да. К такому капитальному коду практически всегда относятся инструменты, которые сами по себе являются средствами производства — библиотеки/фреймворки, подобное. Почему в таком коде находит применение сабж — потому что пользователем данного кода является сам инженер, и его варианты использования лежат внутри инструмента а не снаружи, вот ему и требуются всякие "чтоб было посчитано в компайлтайме", "чтоб функцию с таким типом аргумента можно было вызвать а нестаким нет", "чтоб не писать ручками 100500 бойлерплейта а оно само чтобы сгенерировалось"...
V>>Как то раз пришлось озаботиться собственным автоматом для разводки событий, аля boost::signals, но со своим блекджеком. И вот чтобы достигать zero-cost в максимальном количестве вариантов использования, применяется вся эте чертыхня с constexpr/шаблонами и прочей метапрограммирование-шнягой. То что получилось в итоге я бы оценил как "охренительно великолепно", удалось добиться быстродействия, сравнимого с наивными виртуальными вызовами с одной стороны и занчительного удобства для прикладного использования с другой. Тут можно посмотреть код
C>Выглядит сложно, но можно в двух словах о том, что там действительно происходит? Почему, скажем, на Java это должно работать медленее (без учёта времени на JIT и сборку мусора)?
В двух словах — имеет место некая система, сложенная из множества подсистем (то есть сложная), полностью выполняющая свое предназначение (функционально полная) с хорошим уровнем быстродействия/удобства использования (эффективная), при этом она не разваливается под тяжестью собственной сложности (органичная), и как следствие, вполне устойчива при использовании/доработке (робастная в аспекте жизненной динамики). Всех этих показателей вряд ли можно достичь без использования метапрограмминга (constexpr, шаблоны, ...)
На Яве это будет работать не менее замечательно, при условии что в стандартной бибилиотеке Явы найдутся средства чтобы сделать это именно так. Если задача прецедентная — то такие средства с большой вероятностю там таки найдутся, и все будет хорошо. Но если задача не вполне прецедентная (со своим блекджеком), то таких средств в Яве не найдется, придется лепить костылями из доступных средств, вследствие чего быстродействие/удобство и прочие тактико-технические характеристики просядут. Собственно, в этом и есть сила C++, в нем ты можешь сам себе построить "средства производства" чтобы потом на их основе строить прикладуху как второй уровень. И вся система будет органична/эффективна. В Яве же средства производства поставляются центральным вендором, что в некотором смысле ограничивает разработчика.
Здравствуйте, rg45, Вы писали:
R>Согласно твоим критериям, на каком языке написана данная программа?
Компил-тайм язык отличается тем что:
1. Не позволяет обращаться к изменяемым глобальным переменным (включая constinit) а так же не позволяет иметь static-переменные внутри функции, т.е. как бы запрет на состояние между вызовами функций. Сюда же запрет на const_cast.
2. Не позволяет динамически выделять память, использовать указатель на базовый объект, полноценно работать с полиморфизмом и вирт. функциями. Запрет на dynamic_cast.
3. Почему то запрет на reinterpret_cast.
4. Запрещены вызовы системных функций — результат вычисления можно поместить либо в constexpr/constinit переменную либо использовать для static_assert. Все — больше никакого внешнего воздействия с миром.
Вроде мелочи, но это сокращает возможности языка до неузнаваемости. Даже если вы попытаетесь сделать банальный счетчик вызовов функции (а оказывается это можно сделать
1. Нет обращения к изменяемым глобальным переменным, нет статических переменных внутри функции.
2. Нет динамического выделения памяти.
3. Нет reinterpret_cast.
4. Нет вызова системных функций.
Здравствуйте, Shmj, Вы писали:
S>Поскольку:
S>1. Нет обращения к изменяемым глобальным переменным, нет статических переменных внутри функции. S>2. Нет динамического выделения памяти. S>3. Нет reinterpret_cast. S>4. Нет вызова системных функций.
S>- то на компил-тайм языке.
Здравствуйте, rg45, Вы писали:
R>Да ты не спеши за компилятор говорить. Ты актуализируй сперва все свои критерии. А то у тебя получается, что ты правой пишешь, левой зачёркиваешь.
Оно связано.
Для компил-тайм сильно ограничили язык, фактически до неузнаваемости. Хотя в теории могли бы и снять ограничения, наверное.
Даже написать тот же счетчик для компил-тайма — это отдельный вид мастерства.
S>Оно связано. S>Для компил-тайм сильно ограничили язык, фактически до неузнаваемости. Хотя в теории могли бы и снять ограничения, наверное. S>Даже написать тот же счетчик для компил-тайма — это отдельный вид мастерства.
Ну вот, опять какие-то общие слова и никакой конкретики. Я от тебя устал, если честно.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Shmj, Вы писали:
S>Оно связано. S>Для компил-тайм сильно ограничили язык, фактически до неузнаваемости. Хотя в теории могли бы и снять ограничения, наверное. S>Даже написать тот же счетчик для компил-тайма — это отдельный вид мастерства.
Я тебе, правда, очень признателен за то, что ты вписался за меня, когда меня отправили в бан. В то же время, у меня к тебе огромная просьба: не заваливай этот форум своими философскими "концепциями". Пускай технический форум остается чисто техническим. Ладно?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>Я тебе, правда, очень признателен за то, что ты вписался за меня, когда меня отправили в бан. В то же время, у меня к тебе огромная просьба: не заваливай этот форум своими философскими "концепциями". Пускай технический форум остается чисто техническим. Ладно?
Так эта тема то не мной создана и изначально холиварная. Вопроса технического никакого нет. Чел. просто не согласен с философией — максимум вопрос тяняет на Философию программирования. Ну раз не удалили — то почему бы не обсудить?
И второе. Форумное членство так сказать — не особо важно. Важно другое — как в мелком люди поступают — так поступят и в крупном. Т.е. если у вас в жизни что-то плохое случится, то поддержат только такие люди как я. Кто-то проигнорит а кто-то еще и камень кинет.
под свои нужды переделал один известный, но мало использоваемый regex либ
что бы конструирование стейт машины было на этапе компайл тайм
собственно можно поискать по форуму
я просил апать баг репорты для clang что бы пофиксили consteval
в чем суть
regex r("(.*?)(end)+(.*?)$"); //конструирование стейт машины
std::string input;
r.match(input);
std::string a = r[1];
std::string b = r[2];
после компиляции, все строки регекспа видны в бинаре
ксорить итд как то не красиво
а по итогу сама строка переводиться каждый раз во внутреннее состояние
надеяться на constexpr не приходиться
лезть потом в бинарь и проверять
а сбилдилось ли оно в бинарный массив состояний или осталось строкой, слишком накладно
а consteval это делает наверняка
вообщем то сейчас многие начнут возражать
агааааа есть же regex компаил тайм от Даши Гуськовой(Hana Dusikova)
ну он мне не зашел
Здравствуйте, Shmj, Вы писали:
S>Так эта тема то не мной создана и изначально холиварная. Вопроса технического никакого нет. Чел. просто не согласен с философией — максимум вопрос тяняет на Философию программирования. Ну раз не удалили — то почему бы не обсудить?
Ну, я не только про эту тему говорю, но и вообще. Ты же не впервые развиваешь эту и подобные ей темы. Да и в этот холивар совсем не обязательно было подливать собственного керосина.
S>Важно другое — как в мелком люди поступают — так поступят и в крупном.
В этом я не раз убеждался.
--
Справедливость выше закона. А человечность выше справедливости.