编程语言越新越难学? 不, 是越反直觉越让人头大。

发布日期:2026-02-13 06:13    点击次数:59

最近翻了不少学习论坛和教学群,发现一个怪事:不是语法越复杂越难上手,而是你越习惯怎么写代码,它就越不让你按套路来。好多学了半年Python的人,一碰Rust或者Haskell,直接卡在第一行编译报错上,连“hello world”都跑不起来。

C++的难,在于它不拦你,也不教你。你既可以用C的方式写,也能套上一堆模板、概念、智能指针,还能手动new/delete——它把所有门都打开,然后告诉你:“你选。”结果就是,写对一段代码,得同时记住内存规则、异常安全、移动语义、模板实例化顺序,外加编译器版本差异。我朋友学C++20,光是搞懂一个`requires`表达式,查了三天文档,最后发现是编译器没开C++20模式。不是他笨,是C++本身就像个没说明书的工具箱,里面扳手锤子电钻全堆一起,你自己拼。

Rust更绝。它不信任你,连“我想读这个变量”都要先跟编译器辩论半小时。所有权、借用、生命周期,听着像法律条款。你写`let s = String::from("hi"); let t = s; println!("{}", s);`——立马报错。不是语法错,是你“偷走了s”,又想用它。改?得加`clone`,或者改用引用`&s`,但加了引用,下一行又可能因为生命周期不够长被拒。18.6%的新手卡在这上面超三周,不是没时间学,是实在没法凭经验猜出编译器要什么。

Haskell把“执行顺序”直接抹掉。你写`quicksort [] = []`,它不急着跑,等你真用到结果才开始算。看起来省事,但一不小心,十万行数据全留在内存里不动,程序直接OOM。单子(Monad)也不是魔法,它就是把“可能失败”“要读文件”“要随机数”这些事儿,打包成能组合的“盒子”。可初学者看到`IO String`,第一反应是:“这不就是字符串吗?”——不对,它是一段还没运行的、带副作用的、可被组合的指令描述。剑桥那帮人试过,平均120小时才写出不崩的归并排序,真不是吓唬人。

Prolog干脆不告诉你怎么做,只让你说“是什么”。你写`parent(tom, bob).`,再写`grandparent(X, Z) :- parent(X, Y), parent(Y, Z).`,敲`grandparent(tom, X).`,它真能回你`bob`?但要是把`parent`事实换个顺序,或者多加一个`!`剪枝符,结果可能突然变空。调试器啥都不显示,你只能对着规则一行行手推,像解逻辑谜题。NLP组有哥们说,他调了两天Prolog,最后发现只是某条规则里逗号写成了分号,整个推理链就断了。

Malbolge不是人设计来用的。它三进制、自动加密指令、每次执行后地址自毁。第一个Hello World是2000年写的,作者花两年才搞定,不是笨,是这语言压根没打算让人看懂。它没有范式,没有模式,没有学习路径——它是一道证明题:证明有些东西,人类大脑根本没法模拟。

有人问汇编难不难?难,但难在记指令和寄存器,逻辑还是线性的。LISP括号多,可一旦习惯,S表达式反而干净。Java难?生态乱,但写个for循环、建个类,路径清晰。HTML?它压根不是编程语言,W3C自己写的文档里都写着“markup language”,没图灵完备性,不参与这场比难。

学C++,你学会妥协。学Rust,你学会提前想清楚数据去哪。学Haskell,你开始怀疑“执行”是不是个假象。学Prolog,你明白“对”和“能推出”根本不是一回事。Malbolge?它就躺在那,不教,不帮,不解释。你对着它敲半天,屏幕还是黑的。

那就关了。