I have recently tried to run more complicated programs in my RISC-V userspace emulator, and I have actually had more or less the same problems as you. I do miss Nim though. Nim does have a package manager (nimble), but it does lack some important features like statically embedded DNS in order to avoid glibc libnss for proper static executables. Then again, many languages suffer that problem, even C and C++. I built the musl toolchain for RISC-V and that solved the problem. But it's an avoidable problem: Nim does not strictly have to use getaddrinfo and friends.
And yes, I agree, C and C++ lack these expected things: A compiler suite that does everything from linting to package management with a single build configuration file. On the plus side they are easy to use in weird settings. How many languages let you optimize away a memcpy or even malloc and free that are all implemented as inline assembly? But it doesn't matter when all you want is to produce a binary that Just Works (TM). We are in 2022. It should be more straight forward to build a program that works on every Linux machine as Linux has a stable ABI.
My experience is that Go is the only language capable of producing a static executable that can fetch something from the Internet, with no hassle. Actually quite refreshing. People can lament all they want about security issues of TLS crypto, but at the end of the day 99% of programs only need to be built again if they stop working. Maybe Rust covers this, but the musl linker script seems very broken to me (puts the executable at 0x0), and it's very complicated to learn, let alone read. I'm just not feeling it, sorry.
And yes, I agree, C and C++ lack these expected things: A compiler suite that does everything from linting to package management with a single build configuration file. On the plus side they are easy to use in weird settings. How many languages let you optimize away a memcpy or even malloc and free that are all implemented as inline assembly? But it doesn't matter when all you want is to produce a binary that Just Works (TM). We are in 2022. It should be more straight forward to build a program that works on every Linux machine as Linux has a stable ABI.
My experience is that Go is the only language capable of producing a static executable that can fetch something from the Internet, with no hassle. Actually quite refreshing. People can lament all they want about security issues of TLS crypto, but at the end of the day 99% of programs only need to be built again if they stop working. Maybe Rust covers this, but the musl linker script seems very broken to me (puts the executable at 0x0), and it's very complicated to learn, let alone read. I'm just not feeling it, sorry.