熟练掌握多种语言是一种什么体验?

  1. 不会用混吗?
  2. 我在看 Benjamin Keep 的 How Learning Works 系列的时候,他的一个观点就是variant is good。 就像练习投篮,需要在不同的点位练习,而不是站在固定的一个点,这样它迫使你去思考你的发力模式,以及每次投篮后的反馈,来进行下一次的调整。反正意思就是变化会让你思考更本质的东西

掌握了多种编程语言的大佬们,你们会有这种体验吗?思考到了本质的什么吗?

感觉lisp应该可能会混吧,种类有那么多,语法命名都相似,只看代码本身可能一时认不出是那种lisp.

但python,golang,php,java这些语法区别很大, 特征明显,即使掌握不熟,见多了代码也能一眼看出来是什么语言, 想弄混应该也不容易, 我用混过的是php和jquery,因为php的变量命名全部是$开头,jquery的方法命名也全部是$开头

不会,因为我从来不假设随便写段差不多的代码就能用,只用确定支持的功能,甚至经常打开着语言标准文档写,这样还会弄混的话恐怕要做下脑部 MRI 了

会越来越欣赏 TAOCP

2 个赞

很多年前我也会有这种多语言使用的困扰,每次切换不同语言的项目就要重新学一遍。

我一开始的解决方法是记笔记,把语言的特殊性质还有一些奇怪的语法记下来。不过随着后面经验的积累,就会发现这些语法后面的共性,也就是"结构“ 或者"类型"。所以我的思路就转变成了,通过这些”结构" ”类型"反过去寻找语言的写法。

再后来随着项目的积累,基本上已经不会去刻意记这些东西了,我更加注重代码写法本身的"人机交互“。碰到一个问题要用某某某语言去解决,我会想着把问题的结构写成什么样子的形式,再去找语法然后去构建。而不是先学语言的语法再去想着去怎么解决问题,这样容易拿着锤子看什么都像钉子。

举个以前我碰到的一个很简单的例子,二进制的协议解析。在erlang中这个问题非常简单用bit syntax就可以解决,官网就有一个解析ip头的例子

-define(IP_VERSION, 4).
-define(IP_MIN_HDR_LEN, 5).

DgramSize = byte_size(Dgram),
case Dgram of 
    <<?IP_VERSION:4, HLen:4, SrvcType:8, TotLen:16, 
      ID:16, Flgs:3, FragOff:13,
      TTL:8, Proto:8, HdrChkSum:16,
      SrcIP:32,
      DestIP:32, RestDgram/binary>> when HLen>=5, 4*HLen=<DgramSize ->
        OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
        <<Opts:OptsLen/binary,Data/binary>> = RestDgram,
    ...
end.

可以看到用这种语法写起来非常方便,新增的字段只要填一下表格就可以。其它一些语言对于这个问题还要自己吃力的去分割字段,然后做类型转换,或者引入第三方库来做。

erlang这种声明式的写法就给了我一个很好的示范,我会对于这类解析二进制数据包的问题,有了一种写法上的最佳实践。当用其它语言来解决这种类似的问题的时候,虽然由于表达力的缺失,但是我会尽量的去用那种语言的语法,写成接近erlang这种bit syntax的形式。

我的这种做法,其实就是racket中碰到什么样的问题,就去构建什么样的DSL去解决的思维。

当然了,这一切是要建立在你见得多了之后,才能明白什么样的问题,有什么样的代码的”最佳实践“,然后才会这种编写的方式。

7 个赞

TAOCP太晦涩了,啃了好几次,啃了几口就放弃了 :face_exhaling:

会记住定义函数的关键字(defun)的十种写法,成为新时代孔乙己(逃

3 个赞

TAOCP 用途就是在什么都没有的情况下用编程语言最基本的功能实现其它基础功能。越是用功能丰富的编程语言越用不上。

以我买的前三本内容为例

第一章,讲的是 1byte 还没有固定等于 8bit,计算机不见得会用 2 进制 (当时 IBM 有 10 进制和 60 进制的计算机),操作系统还不一定会有的情况下的汇编编程。放现在很多人连操作系统和链接器干了什么都不清楚的情況下就能写复杂的程序。

第二章,linked list 和 dynamic memory allocation 这些如果用 LISP 就自动给你准备好的功能。讲的算法也不是现在面试会要求的,连个红黑树都没有。

第三章,随机数生成器,也是放现在用个 random() 函数就能搞定的。

第四章,浮点数和大数,还是连 IEEE754 都没有的时候写成的,哪怕现在写 C 的都只需要靠调用 gmp 库就能解决,写 embeded 那软件浮点数都是标配。

第五章第六章,终于有些算法和数据结构内容了,但想必只用现代编程语言的你连自定义 hash function 都没用过几次,要 sorting 也可以直接抄个在现代验证过性能的 bubble sort 或 merge sort 就行了。

但是只要认真给计算器写过程序,这些知识就能都用上,甚至还有点不够用,汇编用的是十进制的 HP Saturn,标准库哪会有红黑树给你用,有个 list 算不错了,内存管理只有最简单的。随机数生成器倒是有个不错的。浮点数实现不是标准的,还要实现相对不错的算法精度。计算資原有限的情況下,外部排序就有用处了。Hashing function 当然要自己实现了。

5 个赞

跟人用多种语言跟别人交流一样,熟到一定程度就可以无缝切换。不需要经过大脑。

搬去蚌埠市住了

显然不是, 多语人, 尤其是从小就多语教育的人, 语言是混乱的, 切换语言需要刻意努力. 多语家庭的小孩拿起一本书直接读都不会有意识判断书里是什么语言 (这一点欧洲家庭尤其严重, 毕竟都是一堆字母).

你看那些刚出国回来的海龟说话一定会夹杂英文, 除非他们刻意努力, 才能保持用中文说话.

掌握多语言确实会混乱, 但混合使用好像也没什么不好, 比如说 "美好的一天" 转成英语我总会想要中间的de,写成 “Nice de day”, 没有中间的de就感觉缺了什么不能习惯.

后来我也就不改正了, 这种写英文时会把中文混合进去的用法, 应该很多人都会有过, 不知道大家是怎么克服纠正的

无意冒犯,我觉得大多数人都不会有这样的困惑 :joy: 太奇葩了哈哈。

2 个赞

我感觉 这个字是汉语的灵魂, 我统计了自己的org文件库, 出现频率最多的几个字是: “的是不一有” , 其中 “的” 字出现率遥遥领先其它字.

换其它更大的汉语语料库, 只要不偏向古汉语范围, 应该也是这个结果, 无争议的 出现频率最高的汉字 ,而这个字在英语里感觉不能准确表达, 所以就写成了de

额,我是在说编程语言,不过人类语言,会有另一个表述思维的问题。就是你说的这种情况,母语->母语, 其他语言->母语->其他语言

“的”在中文里是虚词,作用仅仅是让语句流畅,在你的例子中用来衔接定语“美好”,在英文中没有类似作用的虚词罢了,“美好一天”和”nice day”语义相同,只不过“美好的一天”更通顺。

这是语感问题, 多练就好了

我现在打开空白的python文件,就想不起来定义函数是define还是defun还是declare还是defn还是fn

1 个赞

:joy: 很久之前我刷到一个文章,里面介绍了一个网站,是给多语言工作者,切换编程语言的时候,熟悉语法用的,可能是跟着打一段?但具体忘了是哪个网站

这个? https://learnxinyminutes.com/

1 个赞

好像不是,不过这个网站看着也不错