Во первых, девиртуализация — это не выбрасывание неиспользуемых методов, а замена виртуального вызова на невиртуальный.
Сейчас девиртуализация в реальном проекте делается компилятором из большой тройки на должном уровне оптимизации, если граф вызовов не очень сложный, в реальном проекте это если создание объекта и вызов метода находятся в той же функции или во вложенной на один-два уровня. Кроме того, невозможно девиртуализировать вызовы объектов, которые приходят в компонент извне.
А чтобы повыбрасывать неиспользуемый код, надо глобально девиртулизовать все виртуальные вызовы, и уже у тех иерархий, у которых это удалось, удалять неиспользуемые методы. На сегодняшний день компиляторы могут делать такое только в тривиальных случаях.
template <typename T>
constexpr void foor(T value)
{
using type = std::type_identity_t<T>;
}
constexpr auto foo = []<typename T>(T value) // C++ 20
{
using type = std::type_identity_t<T>;
};
Бесполезный факт. Сооснователем компании Burroughs был дедушка Билла Берроуза, который написал Naked Lunch и прочие интересные книжки. Начинала компания с торговли арифмометрами.
Я не большой знаток Rust, но читал, что одним из идеологических отличий от Rust является то, что концепция ownership распространяется на группу объектов. Возможно, это позволит сделать двусвязный список без unsafe кода.
Ну, собственно, там тёмная история с Microsoft и IBM, учитывая, что NT линейку они разрабатывали совместно. Возможно, IBM намекнул регулятор — ребята, у вас и так всего дохрена, оставьте этот кусок бизнеса в покое.
Для немодифицированных файлов доступно готовое AST, что должно повысить скорость парсинга на порядок, определение циклических импортов.
Но даже самая начальная поддержка должна обрабатывать директивы module, import, export.
concept int_addable isn't satisfied for function foo() // это есть
because the clause std::integral<T> isn't satisfied for type std::basic_string<char, std::char_traits<char>> // а этого нет
Для сложных выражений в static_assert() есть удобный popup, где можно посмотреть, чему равно или какого типа подвыражение, неплохо бы такую же функциональность для концептов. Сейчас там всё ограничивается красным подчёркиванием и фразой concept isn't satisfied.
Ещё интересно автодополнение как в clangd для членов, методов и подтипов.
Ну и, конечно, всё ещё есть не критичный, но существенный процент ошибок вообще, а в выражениях с концептами этот процент значительно выше.
Производительность Resharper C++ удалось подтянуть, по сравнению с ранними версиями. Сейчас, на мой взгляд, она на удовлетворительном уровне.
Случайно наткнулся на некропост и захотел ответить. Например, Visual Studio страшно замедлилась после того как .NET команда протолкнула переписывание IDE на .NET, а потом пришлось долго оптимизировать её производительность.
Очень мало примеров переписывания софта и очень много поддержки старого кода и портирования. И чем больше проект, тем чаще выбирается второй и третий варианты.
И в этом контексте в долгосрочном плане я не вижу как Си вдруг становится особняком. Для меня становится очевидным что однажды и он родимый будет вытеснен,
Когда-нибудь, разумеется, C будет вытеснен. Вопрос только когда, как и кем.
И попытки аргументировать уникальность случая ценой перехода звучат очень натянуто.
Ну мы же не просто теоретизируем. Очень мало примеров переписывания софта и очень много поддержки старого кода и портирования.
Переход от печатных книг, газет и журналов к их цифровым аналогам пока еще далеко не завершен, но ведь тенденция не вызывает сомнений.
Смена языка — это не настолько радикальное изменение. На выходе будет точно такой же бинарный файл. Возможно, за счёт улучшения языка исчезнут некоторые классы ошибок, но и сегодняшнее положение дел считается приемлемым. Прирост производительности кодера составит ну, максимум, в два раза. Вот если язык будет настолько мощен, что прирост составит 10 или 100 раз, тогда — да, это радикальное изменение.
Почему в случае с переходом на новый язык программирования мы должны переписывать весь старый код? а не просто написать новый и лучший и выкинуть старье? Зачем нам старые приложения? Их место как и печатных машинок на свалке и в музеях или в коллекциях энтузиастов.
Очень давно, когда железо стоило дороже софта, так и делали. Но в районе C ситуация изменилась на противоположную, софт стал дороже железа. А главное, не просто дороже, а его невозможно переписать за секунду, сколько денег не вкладывай. И получается дилемма — портировать старый софт или ждать 10 лет, пока будет написан новый. Что выберет бизнес?
Сейчас девиртуализация в реальном проекте делается компилятором из большой тройки на должном уровне оптимизации, если граф вызовов не очень сложный, в реальном проекте это если создание объекта и вызов метода находятся в той же функции или во вложенной на один-два уровня. Кроме того, невозможно девиртуализировать вызовы объектов, которые приходят в компонент извне.
А чтобы повыбрасывать неиспользуемый код, надо глобально девиртулизовать все виртуальные вызовы, и уже у тех иерархий, у которых это удалось, удалять неиспользуемые методы. На сегодняшний день компиляторы могут делать такое только в тривиальных случаях.
а макрос MAKE_TRAITS_WITH_MASK() на
https://godbolt.org/z/ddRCxc
Но даже самая начальная поддержка должна обрабатывать директивы module, import, export.
хотелось бы сообщения:
Ещё интересно автодополнение как в clangd для членов, методов и подтипов.
Ну и, конечно, всё ещё есть не критичный, но существенный процент ошибок вообще, а в выражениях с концептами этот процент значительно выше.
Производительность Resharper C++ удалось подтянуть, по сравнению с ранними версиями. Сейчас, на мой взгляд, она на удовлетворительном уровне.
Когда-нибудь, разумеется, C будет вытеснен. Вопрос только когда, как и кем.
Ну мы же не просто теоретизируем. Очень мало примеров переписывания софта и очень много поддержки старого кода и портирования.
Смена языка — это не настолько радикальное изменение. На выходе будет точно такой же бинарный файл. Возможно, за счёт улучшения языка исчезнут некоторые классы ошибок, но и сегодняшнее положение дел считается приемлемым. Прирост производительности кодера составит ну, максимум, в два раза. Вот если язык будет настолько мощен, что прирост составит 10 или 100 раз, тогда — да, это радикальное изменение.
Очень давно, когда железо стоило дороже софта, так и делали. Но в районе C ситуация изменилась на противоположную, софт стал дороже железа. А главное, не просто дороже, а его невозможно переписать за секунду, сколько денег не вкладывай. И получается дилемма — портировать старый софт или ждать 10 лет, пока будет написан новый. Что выберет бизнес?