Доки дивився відос про модулі в C++, на які я чекав з часів C++0x (спойлер: все сплюндровано — чи то досі, чи зовсім 🤷🏻♂️ ), згадав про таку білд-систему як xmake, що походить, вірогідно, з Китаю. Вона базується на #Lua, як і Premake, але якось вже розвинутіше виглядає. За ті два роки, котрі я її ігнорував, вони додали підтримку купи мов на кшталт #Zig, #Nim або #Rust і навіть зробили свій пекедж-менеджер. Плюс Lua сама по собі доволі проста та приємна — точно краща за CMake. Може колись нарешті знайду щось, що задовольнить мене хоча б на рівні #Qbs, щоб нарешті від нього відмовитися.
YouTube
So, you want to use C++ Modules ...cross platform - Daniela Engert - Meeting C++ 2023
So, you want to use C++ Modules ...cross platform - Daniela Engert - Meeting C++ 2023
Slides: https://slides.meetingcpp.com
Survey: https://survey.meetingcpp.com
If you are interested in the topic of C++ Modules you are probably aware of the fact that the…
Slides: https://slides.meetingcpp.com
Survey: https://survey.meetingcpp.com
If you are interested in the topic of C++ Modules you are probably aware of the fact that the…
Я інколи кажу, що C++ — це хороша мова з поганими дефолтами. Маю на увазі, що мова дуже потужна і дозволяє робити купу всього, але програміста при цьому примушує тримати купу деталей в голові, щоб не схибити десь.
Нюанс полягає в тому, що мови з хорошими дефолтами я поки не бачив, хоч деякі з них намагаються виправити бодай якусь маленьку проблему, що вже непогано. Як в тому ж #Rust зробили, щоб всі «змінні» стандартно були константами. Воно ж і логічно, ні? Як часто вам насправді треба мати мутабельні змінні? З поточними практиками — дуже рідко, бо через вплив ФП ви найімовірніше просто позначаєте якесь проміжне immutable значення окремим імʼям. Але в C++ для оголошення константи програмісти мусять окрему роботу виконати — написати
Або додали ось в C++11 атрибути, зокрема🤯 «Навіщо?» — спитаєте ви. Я теж не одразу второпав.
Є у вас, наприклад, так званий mutex guard — така штука, яка локає мьютекс при створенні та автоматом анлокає його при виході зі скоупу (при знищенні). Як
Річ у тім, що можна хибно написати ось такий код, і компілятор вам жодного слова не скаже:
Короч, як ви вже здогадалися, щоб уникнути останньої проблеми, можна позначити конструктор як
Логічно? «Логічно»!😅 Але чому це не стандартна поведінка? Ніхто того не зна. Як часто ви пишете функції, які повертають значення, яке можна ігнорувати? Нащо тоді вони його повертають? А як часто ви пишете класи, екземпляри яких ніяк не використовуються? Чисто заради сайд-ефектів чи що?
У #Nim теж так подумали й зробили всі значення non-discardable, причому компілятор одразу помилку пише, а не попередження:
І щоб виправити це, треба буквально сказати йому, що значення вам не потрібне:
Круто, еге ж?
Вирішив пошукати, в яких ще імперативних мовах таке є, і виявилося, що в жодній! #Zig та #Swift нібито попередження видають, але це не точно. А ще в #Rust є схожий пропоузал. Чому ніхто цього не робить? Є ідеї? )
Нюанс полягає в тому, що мови з хорошими дефолтами я поки не бачив, хоч деякі з них намагаються виправити бодай якусь маленьку проблему, що вже непогано. Як в тому ж #Rust зробили, щоб всі «змінні» стандартно були константами. Воно ж і логічно, ні? Як часто вам насправді треба мати мутабельні змінні? З поточними практиками — дуже рідко, бо через вплив ФП ви найімовірніше просто позначаєте якесь проміжне immutable значення окремим імʼям. Але в C++ для оголошення константи програмісти мусять окрему роботу виконати — написати
const
. Легко забути та скіпнути? Легко.Або додали ось в C++11 атрибути, зокрема
[[nodiscard]]
в C++17. Якщо функцію таким позначити, то компілятор «заохочується» 😆 видати попередження, що треба щось зробити зі значенням, що повертається. І як виявилося, подібним атрибутом можна позначити конструктор Є у вас, наприклад, так званий mutex guard — така штука, яка локає мьютекс при створенні та автоматом анлокає його при виході зі скоупу (при знищенні). Як
std::lock_guard
, ага. Використовується наступним чином:{
const mega_guard lock{mutex};
// ...
}
Річ у тім, що можна хибно написати ось такий код, і компілятор вам жодного слова не скаже:
{
mega_guard{mutex}; // не lvalue, тож одразу знищується, звільняючи мьютекс
// ...
}
Короч, як ви вже здогадалися, щоб уникнути останньої проблеми, можна позначити конструктор як
[[nodiscard]]
:class mega_guard {
public:
[[nodiscard]] explicit mega_guard(mutex &);
// ...
};
Логічно? «Логічно»!
У #Nim теж так подумали й зробили всі значення non-discardable, причому компілятор одразу помилку пише, а не попередження:
proc sum(x, y: int): int =
result = x + y
sum(3, 4) # Error: expression 'sum(3, 4)' is of type 'int' and has to be discarded
І щоб виправити це, треба буквально сказати йому, що значення вам не потрібне:
discard sum(3, 4)
Круто, еге ж?
Вирішив пошукати, в яких ще імперативних мовах таке є, і виявилося, що в жодній! #Zig та #Swift нібито попередження видають, але це не точно. А ще в #Rust є схожий пропоузал. Чому ніхто цього не робить? Є ідеї? )
Please open Telegram to view this post
VIEW IN TELEGRAM
Я усвідомлюю, що мені просто впадлу вчити #Rust, тож я й не вчу, але все одно лишалося це відчуття, що може весь хайп не з порожнього місця і що може варто було б звернути увагу.
Друган в коментарях до іншого допису вже наводив приклади, і ось зараз рєпа cve-rs нарешті закрила для мене це питання остаточно. Memory safety — це брехня, розходимося😂
Друган в коментарях до іншого допису вже наводив приклади, і ось зараз рєпа cve-rs нарешті закрила для мене це питання остаточно. Memory safety — це брехня, розходимося
Please open Telegram to view this post
VIEW IN TELEGRAM