V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
pythonee
V2EX  ›  程序员

你遇到过哪些比较难理解的编程语言概念

  •  2
     
  •   pythonee · 2024-09-03 17:51:06 +08:00 · 14529 次点击
    这是一个创建于 365 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我先来:递归 -> Y 组合子 -> Monad

    第 1 条附言  ·  2024-09-04 09:20:48 +08:00
    本来是面向编程语言,但话题扩展,不过也好,补充几个大家提到的
    yield
    协变、逆变
    lisp 的宏
    闭包
    所有权
    cps
    prototype
    大 O 表示法

    非编程语言的
    六边形架构
    reactor 背压
    TCP 粘包
    IO 多路复用
    可计算理论
    第 2 条附言  ·  2024-09-04 11:03:52 +08:00
    C++模板元编程
    Continuation
    Channel
    异步
    并发&内存屏障
    第 3 条附言  ·  364 天前
    箭头函数
    无栈协程
    Delegate
    asycio
    139 条回复    2024-09-06 11:56:44 +08:00
    1  2  
    liudewa
        1
    liudewa  
       2024-09-03 17:51:46 +08:00
    异步
    liudewa
        2
    liudewa  
       2024-09-03 17:52:04 +08:00
    @liudewa #1 递归 +1
    vfs
        3
    vfs  
       2024-09-03 17:53:30 +08:00
    一个函数返回另外一个函数,一个函数的参数时另外一个函数。 这绝对是取乱之道
    superhot
        4
    superhot  
       2024-09-03 18:09:07 +08:00 via Android   ❤️ 2
    @vfs 不懂闭包与函数式编程就别乱说话 你 Java 的接口回调本质上也是把函数作为参数传递 没见你说 Java 乱
    ltyj2003
        5
    ltyj2003  
       2024-09-03 18:12:17 +08:00 via Android
    @vfs c 就没这个烦恼,啥都可以是指针,是指针就能传。
    Maboroshii
        6
    Maboroshii  
       2024-09-03 18:13:32 +08:00   ❤️ 1
    yield 绝对算一个
    Building
        7
    Building  
       2024-09-03 18:15:51 +08:00   ❤️ 9
    Process 懂了
    Thread 懂了
    Queue 懂了
    Group 懂了
    Atom 懂了
    Lock 懂了
    Await/Async 懂了
    Promise 懂了
    Callback 懂了
    当你把他们放在一起的时候...
    nagisaushio
        8
    nagisaushio  
       2024-09-03 18:17:23 +08:00 via Android   ❤️ 3
    难懂概念千千万,rust haskell 占一半
    zeonluang
        9
    zeonluang  
       2024-09-03 18:20:31 +08:00   ❤️ 1
    js 里的原型和 promise 把
    pisc
        10
    pisc  
       2024-09-03 18:30:28 +08:00   ❤️ 1
    Monad 有啥难理解的? A monad is just a monoid in the category of endofunctors, what’s the problem?

    想要实用一点的理解? A monad is just a typeclass with the three laws !

    还是不太好理解? A monad is just the bind/flatMap !!!
    tinytoadd
        11
    tinytoadd  
       2024-09-03 18:34:12 +08:00
    tokio
    JackYao
        12
    JackYao  
       2024-09-03 18:34:39 +08:00
    @Maboroshii +1 当年理解这货 废了我好多脑细胞
    passive
        13
    passive  
       2024-09-03 18:45:10 +08:00 via Android
    cps 、monad 这些都简单。

    #define 宏替换比较绕
    kissmenow
        14
    kissmenow  
       2024-09-03 18:46:38 +08:00
    golang 的指针传参
    dapang1221
        15
    dapang1221  
       2024-09-03 18:47:57 +08:00
    yield ,最开始接触的时候寻思这是啥破玩意,理解之后恍然大悟,惊为天人
    lonelee
        16
    lonelee  
       2024-09-03 19:00:13 +08:00
    自旋锁/偏向锁
    csys
        17
    csys  
       2024-09-03 19:05:07 +08:00
    Wh1t3zZ
        18
    Wh1t3zZ  
       2024-09-03 19:12:32 +08:00
    yield
    caqiko
        19
    caqiko  
       2024-09-03 19:18:50 +08:00 via Android   ❤️ 1
    泛型类和具体实现类
    看的迷迷糊糊的
    PTLin
        20
    PTLin  
       2024-09-03 19:25:55 +08:00
    学 c 的时候是指针。
    学 python 的时候是 generator 和 async await 。
    学 rust 的时候是所有权和生命周期。
    学 Haskell 的时候是 reader applicative/monad/,monad transformer 。
    DOLLOR
        21
    DOLLOR  
       2024-09-03 19:32:36 +08:00   ❤️ 7
    @vfs
    如果你从来只写过 java ,可能确实就会觉得函数作为返回值、参数、变量,是无法理解的事情。
    反过来也一样,学过其他语言(尤其函数是一等公民的语言)的人看 java ,也会很困惑 java 这边为了传递 callback ,还要整出依赖注入、控制反转这些设计模式。
    netabare
        22
    netabare  
       2024-09-03 19:35:49 +08:00 via iPhone
    DDD 和六边形那套东西,函数式编程的概念反而没什么难的
    GuardX
        23
    GuardX  
       2024-09-03 19:41:31 +08:00
    reactor 那套,比如背压。。
    jeesk
        24
    jeesk  
       2024-09-03 20:00:53 +08:00 via Android
    @vfs 这都嫌弃乱,那 golang 和 cpp 不适合你,连 js 都不适合你
    xuanbg
        25
    xuanbg  
       2024-09-03 20:11:03 +08:00
    其实不是概念难以理解,更多的是名词难以理解。譬如 JS 的原型链和闭包
    wangjh0802
        26
    wangjh0802  
       2024-09-03 20:14:34 +08:00   ❤️ 3
    就没人提 控制反转 和 依赖注入吗 哈哈哈哈哈哈哈
    Kaiv2
        27
    Kaiv2  
       2024-09-03 20:23:12 +08:00
    @DOLLOR 不能这么说返回参数是函数和函数参数是函数,当作是匿名 class 就理解了。而且 Java8 就有了 lambda
    TWorldIsNButThis
        28
    TWorldIsNButThis  
       2024-09-03 20:36:30 +08:00 via iPhone   ❤️ 1
    闭包是穷人的对象 对象是穷人的闭包
    nagisaushio
        29
    nagisaushio  
       2024-09-03 20:41:04 +08:00 via Android
    楼主想要讨论编程语言概念,但楼上说的有些并不是编程语言概念
    johnhsh
        30
    johnhsh  
       2024-09-03 21:08:27 +08:00
    闭包
    R4rvZ6agNVWr56V0
        31
    R4rvZ6agNVWr56V0  
       2024-09-03 21:25:51 +08:00
    C++ 的模版、预编译指令
    povsister
        32
    povsister  
       2024-09-03 21:29:08 +08:00
    Makefile
    cookii
        33
    cookii  
       2024-09-03 21:29:34 +08:00
    @GuardX reactor 绝对是 java 程序员的噩梦
    rabbbit
        34
    rabbbit  
       2024-09-03 21:35:47 +08:00   ❤️ 1
    指针
    函数式编程
    ts 类型体操
    M4n5ter
        35
    M4n5ter  
       2024-09-03 22:11:57 +08:00
    第一眼看到 go1.23 有些丑陋的迭代器和其文档中给出的 example 时
    adoal
        36
    adoal  
       2024-09-03 22:22:51 +08:00
    @ltyj2003 然后发现很多程序员看不懂 Linux 举的那个编程品位例子里的二阶指针
    levelworm
        37
    levelworm  
       2024-09-03 22:32:54 +08:00
    @ltyj2003 像我这种小白就喜欢 C 。简洁,没那么多花招。函数式编程实在是超过了我的智商。
    echoless
        38
    echoless  
       2024-09-03 22:33:01 +08:00
    我觉得没有难的概念, 只是大部分人(包括很多知名教授)没有把一个概念解释清楚的能力.

    我看递归, Monad, 都是看多个资料慢慢懂得.

    你要懂 C. 可能需要你先了解 A, B, 但是你可能不懂 A, 或者你知道 B’.

    但是很多资料(或者老师), 给所有人直接讲 C.

    那么就是恰好了解 A, B 的人明白了 C.

    因为你不懂 A, 了解 B’, 又干扰了你了解 B. 所以会觉得 C 很难.

    教学是 1 对 1 的. 需要知道学习的人的状态, 要学习的概念. 跟化学反应一样, 要把所有的条件都达到, 才能进入下一步.
    echoless
        39
    echoless  
       2024-09-03 22:40:19 +08:00
    @levelworm #37 这个绝对是那些追求 Pure functional 的把函数编程给弄的阳春白雪了. pure functional 代价很大.
    但是函数编程思想倒是很容易理解, 根本在于对状态(state)的处理上. C 语言可以 OOP 也可以 FP. 追求 pure OOP 或者 pure FP 就意义不大.
    echoless
        40
    echoless  
       2024-09-03 22:42:48 +08:00
    插一句, 我想象中科班和非科班的 CS 区别, 在于编程语言理论, 计算理论. 但是实际上, 无论科班和非科班, 99.99%的人都是刷题, 被八股文, 搞我这个非科班的也可以滥竽充数.
    yb2313
        41
    yb2313  
       2024-09-03 22:43:39 +08:00
    今天看 go 那个生成器看晕了, 最后才发现我看漏了, 是个语法糖
    yb2313
        42
    yb2313  
       2024-09-03 22:44:17 +08:00
    @M4n5ter 我也是, 感觉说不出的难受, 但是总比 java 好点
    yb2313
        43
    yb2313  
       2024-09-03 22:45:09 +08:00
    @M4n5ter 我去, 这么巧, 我今天也是看的这个东西, 最后发现就是个语法糖, 还很丑陋
    aliensb
        44
    aliensb  
       2024-09-03 23:00:36 +08:00
    erlang 这都是啥
    Acsw
        45
    Acsw  
       2024-09-03 23:05:37 +08:00
    闭包,内存屏障
    kinkin666
        46
    kinkin666  
       2024-09-03 23:24:44 +08:00
    高三结束准大学生的时候去新华书店看《 C#入门经典(第四版)》看到第六章泛型,卡在那里卡了一个星期,有一天一瓶可乐干下去,悟了,这就是把类型当参数!!!

    下一次再这么悟是在学高数下册和离散数学的时候,高数里三层积分里面那个函数我就当它是回调函数了、离散数学和线性代数里那些东西我就当他是 C++里的运算符重载了

    haskell 、scala 、f#、pearl 这些东西没用过,粗看一眼看不懂
    raptor
        47
    raptor  
       2024-09-03 23:37:21 +08:00
    印象中第一个这种坎是二十多年前在汇编语言的保护模式,后来搞懂了。第二个这种坎是十几年前 C++的 TMP ,后来放弃了 C++。
    purringpal
        48
    purringpal  
       2024-09-03 23:46:32 +08:00 via iPhone
    可以考虑备注一下大学专业和工作年限,作为科班毕业来说,完全 get 不到楼上说的这些困扰~
    yafoo
        49
    yafoo  
       2024-09-04 00:03:47 +08:00 via Android
    yield
    qinfensky
        50
    qinfensky  
       2024-09-04 00:19:41 +08:00 via iPhone
    Macro
    spidah
        51
    spidah  
       2024-09-04 00:24:13 +08:00
    monad
    levelworm
        52
    levelworm  
       2024-09-04 01:10:00 +08:00
    @echoless 我一直觉得函数式编程是需要一定智商的,我这种还是就 C-like 吧。。。
    NoOneNoBody
        53
    NoOneNoBody  
       2024-09-04 01:15:30 +08:00
    堆、栈 其实至今只能说知道大概
    iintothewind
        54
    iintothewind  
       2024-09-04 05:39:44 +08:00
    CPS (Continuation-passing style)
    HOF(Higher-order function)
    还有些其它的,

    总之就是函数式编程真的很费脑子,不过挺好玩,逼格确实挺高的,就是工作中几乎用不上。
    busuzhike
        55
    busuzhike  
       2024-09-04 08:31:01 +08:00
    python 的装饰
    ZGame
        56
    ZGame  
       2024-09-04 08:32:11 +08:00
    @superhot 喷的好
    ZGame
        57
    ZGame  
       2024-09-04 08:37:31 +08:00
    @echoless #39 应该是说能把函数式写明白很难。函数式增加了很多约束,如果编程的时候按照相关规范去做,思维负担会减轻,局部查看每个函数的时候只用关系入参和出参对不对。 然后现实是因为约束的原因,取巧或者工期赶,有的变量直接就透传进来,然后就变成了使用函数式的方式,写出了非函数式的代码,反而加重了局部查看代码时候的混乱度。另外类似 java 后端 rjdbc 函数式的 zip,merge 等等响应式的 api 在进行调试的时候,我个人感觉也没有传统的编程方式那样好调试
    ZGame
        58
    ZGame  
       2024-09-04 08:39:26 +08:00
    @echoless #39 不过前端领域目前函数式 hooks 那套结合的算是现实里的表率了,很赞。
    nutting
        59
    nutting  
       2024-09-04 08:52:00 +08:00
    js 的底层。异步啥的那些有点别扭
    test4zhou
        60
    test4zhou  
       2024-09-04 08:54:41 +08:00
    js 一些底层原理
    diroverflow
        61
    diroverflow  
       2024-09-04 08:54:51 +08:00
    指针这个概念主要是名字起的不好,其实不就是内存地址吗?学过汇编的都能理解
    querysecret
        62
    querysecret  
       2024-09-04 08:59:18 +08:00   ❤️ 1
    协变、逆变
    dododada
        63
    dododada  
       2024-09-04 09:01:32 +08:00
    设计模式,太多了,很多死搬硬套,最怕那种一开口就是我觉得这个用什么什么模式比较好的,以前有个同事,不管什么语言,上来就是设计模式,头大
    a1b2c3T
        64
    a1b2c3T  
       2024-09-04 09:02:19 +08:00
    我感觉大部分设计模式都不是太好理解,可能单独看示例 i 还可以,但是自己用的时候就不大行了。
    MRG0
        65
    MRG0  
       2024-09-04 09:09:22 +08:00
    闭包
    xntzmk
        66
    xntzmk  
       2024-09-04 09:11:00 +08:00
    @Maboroshii 赞同,还好后面 async 冒出来了
    lew1
        67
    lew1  
       2024-09-04 09:11:12 +08:00
    套接字
    shangyu7
        68
    shangyu7  
       2024-09-04 09:21:21 +08:00
    "对象"
    theprimone
        69
    theprimone  
       2024-09-04 09:27:19 +08:00   ❤️ 1
    ”运行时“,本科相当长一段时间没懂啥意思 😅
    CREEPER5
        70
    CREEPER5  
       2024-09-04 09:30:08 +08:00
    右值引用,每次看的时候觉得自己理解了,事后发现并没有
    ixx
        71
    ixx  
       2024-09-04 09:33:07 +08:00
    @superhot 特意去翻了翻这老哥以前的帖子和回复 也没看出来是搞 java 的吧 咱话题都跑 java 上来了🤣
    p1gd0g
        72
    p1gd0g  
       2024-09-04 09:33:19 +08:00
    刚入行搞不懂 interface ,业务写多了自然也就明白了
    Fallever
        73
    Fallever  
       2024-09-04 09:34:01 +08:00
    逆变和协变 对于人来说这是很自然的转换. 但是到泛型里再加上拗口的翻译 真的绕晕了
    coderzhangsan
        74
    coderzhangsan  
       2024-09-04 09:34:35 +08:00
    @theprimone +1
    runtime 看中文教材很难理解,可能是最早接触并翻译的人,没有系统性的理解,犯了民科的毛病,类似的还有所谓 TCP 粘包。
    sunrain
        75
    sunrain  
       2024-09-04 09:34:51 +08:00
    刚学 OC 的时候吧,这是什么鬼?!
    Mogamigawa
        76
    Mogamigawa  
       2024-09-04 09:36:50 +08:00 via Android
    我自己最近的新发现:
    符号越多,看着越难
    直接用关键词,就好理解多了
    RainCats
        77
    RainCats  
       2024-09-04 09:40:30 +08:00
    @DOLLOR 还好,我经常搞 lamdba 函数,然后当成其他方法的入参
    qW7bo2FbzbC0
        78
    qW7bo2FbzbC0  
       2024-09-04 09:41:21 +08:00
    @vfs 我在 go 里面遇到这种情况最多。。。
    jheroy
        79
    jheroy  
       2024-09-04 09:41:49 +08:00
    过程式编程都不算啥,去看下 erlang 这种纯函数式编程才知道啥叫难理解,什么高阶函数什么单次赋值就不说了,就尾递归这概念就比较难理解。虽然纯函数编程数学上完美,就是不是按人好理解设计的,不过学数学专业出身的应该很喜欢。
    loryyang
        80
    loryyang  
       2024-09-04 09:43:20 +08:00
    c++ 元编程见过吗?
    aleimu
        81
    aleimu  
       2024-09-04 09:47:42 +08:00
    一通百通
    opengps
        82
    opengps  
       2024-09-04 09:48:17 +08:00
    竟然没人说:完成端口
    neimengwuyanzu
        83
    neimengwuyanzu  
       2024-09-04 09:49:50 +08:00
    @csys lambda 真的就是 写时候还行 写完过段时间在回头看 自己写的读起来有点费劲
    LitterGopher
        84
    LitterGopher  
       2024-09-04 09:54:13 +08:00
    套接字+句柄


    (我觉得是翻译问题,你要说是网络通讯和指针我当场就能理解)
    me1onsoda
        85
    me1onsoda  
       2024-09-04 09:54:37 +08:00
    自从我开始写 go ,我发现我对 interface 一无所知
    davin
        86
    davin  
       2024-09-04 09:56:41 +08:00
    说多了都是语法糖
    javazero
        87
    javazero  
       2024-09-04 09:59:05 +08:00 via Android
    rust 的特征?我不是科班出身,只会 Python 。想学点底层的,看到特征想着以后再看,结果再也没看过了哈哈
    EndlessMemory
        88
    EndlessMemory  
       2024-09-04 09:59:05 +08:00
    promise.then
    Subfire
        89
    Subfire  
       2024-09-04 09:59:58 +08:00   ❤️ 1
    "你们自己先入为主地错误地认为 send 与 recv 是一一对应的, 从而生造出"TCP 黏包"这种东西, 还有理了吗?"
    aloxaf
        90
    aloxaf  
       2024-09-04 10:00:01 +08:00
    Memory Order
    inhzus
        91
    inhzus  
       2024-09-04 10:00:38 +08:00
    C++ coroutine 提案
    winglight2016
        92
    winglight2016  
       2024-09-04 10:02:57 +08:00
    scala 的柯里化阻止了我学习 Scala
    leona723
        93
    leona723  
       2024-09-04 10:03:48 +08:00
    递归,每次做这个我感觉我就进入了无限循环的时空里
    yazinnnn0
        94
    yazinnnn0  
       2024-09-04 10:05:24 +08:00
    谁能解释一下 call/cc

    看过一些解释 call/cc 的文章, 我对这个概念的理解还停留在 "砸哇噜多" 阶段
    besto
        95
    besto  
       2024-09-04 10:08:36 +08:00
    @yazinnnn0 你说出了我心里话,我找了一圈居然上面没有人说 call/cc 的。。。
    KFCVIVO50
        96
    KFCVIVO50  
       2024-09-04 10:18:59 +08:00
    异步+事件循环
    FYFX
        97
    FYFX  
       2024-09-04 10:19:16 +08:00
    continuation ,
    qbmiller
        98
    qbmiller  
       2024-09-04 10:19:50 +08:00
    python 的异步
    17681880207
        99
    17681880207  
       2024-09-04 10:28:12 +08:00
    @kissmenow
    传指针其实就是传内存地址吧,这么理解
    Dcrclub
        100
    Dcrclub  
       2024-09-04 10:34:17 +08:00
    难以理解的东西, 基本都是故意为之, 目的就是增加编程的入门门槛, 很多能用白话解释的东西. 故意弄个晦涩难懂的词,搞到这里, 有的还是用英文表示. 显得很高大上
    1  2  
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5382 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:37 · PVG 15:37 · LAX 00:37 · JFK 03:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.