我觉得这根本就不是一个二选一或者 N 选一的问题。
我不知道楼主所谓的“底层”究竟是指什么,先权当从语言抽象的角度来讲好了。学习底层的东西,你至少需要能够看懂相关的实现,涉及到什么项目,就得去看相关的语言。
对于有些项目来说,语言扩展甚至不比语言本身作用要小。
现在的阶段,底层的绝对主力还是 C/C++,你的 JS 和 C#,主流实现穿透到下面都是 C/C++,Java 一样。你要是去看 Linux Kernel ,Postgres ,SQLite ,PyTorch ,Mesa 之类的也是,所以你可以不拿他们当主力,但是早晚要学点。
我不知道楼主了不了解指针这个概念,但是往底层实现走,少不了 C FFI (
v2ex.com/t/604915#r_7962546 ),FFI 这套搞明白了,看过一些典型的 FFI 接口,C 其实已经差不多学会三分之一了。这条路我觉得比一般的教科书要强。
现在已经有一些项目开始用 Rust 作为主力(虽然我脑袋里面除了 TiKV 和 Zed 之外一时半会没想出来有啥),但是一是这样的项目以后会越来越多,二是正是因为 Rust 很多项目不完善,用得人少,屎山堆得少,反而更加简洁适合初学者。语言丁真,鉴定为早晚也得学。
另外你以为学一个通用语言就得了?事实上每个项目都有自己的 DSL ,而且一般还不只一个,比如 SQLite 里面有个 VM ,这里有文档:
www.sqlite.org/opcode.html 每个 SQL 语句都会被编译成这样一段 VM 程序(噢对了,SQLite 本身的 SQL 方言也算一个),然后这玩意的测试是 Tcl 写的。
不要对底层有神秘感,换个语言糊屎,不代表就不在糊屎了。
所以语言不妨先随便看看,然后看起相关的项目。至于实际使用嘛,JS 难说,不过 C# 在与底层交互方面做得其实算比较完善的,所以很多情况下不用换语言就可以。折腾一段时间之后了解了不同的语言,再根据个人口味选择更好。