C is not that hard once you realize the relationship between C and the ASM/Machine code. C is just a structured form of ASM, and the compiler has to do the optimization at compile time.
Assembly language is incredibly unparseable. It's actually amazing that every game for 8-bit and 16-bit game consoles was assembly language.
Certain programming languages make sense for certain tasks. Most GUI driven software is difficult to understand without an object-representation of the GUI objects, which is why C++ makes sense for Windows, but C++ itself is extremely unparseable, and being a super-set of C, you need to know C, because you will encounter a lot of "C formatted C++"
The problem with a lot of programming is that the wrong language is picked for stupid reasons.
2D Games should always be C. There is no need for an object model, and having one complicates the process of saving and loading games while maintaining performance. Emulators of game consoles likewise should be C.
3D games can be C++/Rust. There is a logical relationship between objects in 3D space that isn't required for 2D space.
All GUI-driven software is basically required to be C++, but can be Rust.
Any thing that has NO GUI, and does not have latency penalties can be scripted in your favorite javascript/python/perl/php type of language.
If it has latency penalties, then you're back to C being the only choice.
The entire purpose of C is to not have any overhead from testing for failure conditions. When you use C, you are literately saying "this is correct", you expect correct behavior from everything you interact with via C bindings. If you feed a C library something that it doesn't expect, the program should die immediately, and have to do 200 sanity checks on every possible mistake that can be made.
The biggest problem with programming language is the relationship between pointers and variables. In scripting languages, pointers do not exist, and variables are passed by reference, not copied. In C and C++ variables are passed by value (passing the variable) or by reference (passing the pointer), and as such, it's possible to change the variable passed to it, back via the function as a pointer, and not just via the return. Java meanwhile is strictly pass-by-value. So when you switch between C/C++ to Java, suddenly things don't work as expected. The reason pass by reference (and pointers) exist at all is a proactive optimization that you need when you are developing drivers, operating systems and emulators. It's not something need with any other non-penalized time to run.
Like an input loop for the keyboard or mouse. Your end-user is never going to be typing 1000 characters per second, or clicking 1000 times per second, so you are afforded >1ms to read input, and thus you don't need to optimize it with C pointers. However audio is very sensitive to latency, you you likely are required to use pointers on a ever-present ring buffer rather than constantly creating and destroying buffers one-time to playback because it will stall the timing of the playback.
Anyway that's my perspective on Language choice arguments. Pick the language that makes the most sense for the purpose. 100% of AI dev crap could be done in C, but the latency for it has never mattered, the larger the input the larger the latency between input and output, be it training or inference. All you get from doing AI dev in C/C++/Rust over Python is a faster initial steady-state if you are constantly loading different models into the same hardware. If you're using the same model over and over, you are better off just loading the script once and leaving the model persistant and at that point you don't really gain anything further, everything is being done on the GPU, the GPU isn't running python, it's running against C/C++ libraries that nvidia/amd/intel already wrote.