V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Mrzhs
V2EX  ›  程序员

出于好奇:代码只如何运行的?或者说更底层的一些东西是如何实现的?

  •  
  •   Mrzhs · 2020-04-04 14:25:50 +08:00 · 8594 次点击
    这是一个创建于 1699 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们是使用微信的时候,用户只需要用它提供给我的一些“接口”例如发送功能,而程序员就是写这些接口的,那么这么多语言(例如,C,html,java )到最后是如何运行的? 把这些语言看成这些语言开发者提供给程序员的接口,让我们去使用,在这些语言开发者之上还有什么? 脑洞:计算机硬件的一些“规则”,然后语言开发者根据这些“规则”写出了各种各样的语言. 是这样吗?有这一类更底层的博文或者书籍吗? for example:超市里出售的葡萄酒,只需要打开瓶盖就可以喝了(用户层),而这些酒需要酿酒厂用葡萄酿酒,检查品质等等一系列工作(程序员层),那么在网上一层,这些葡萄是如何长成的? (感觉自己是个老千层饼了~)

    96 条回复    2020-04-05 23:47:13 +08:00
    lhx2008
        1
    lhx2008  
       2020-04-04 14:28:50 +08:00 via Android
    这些就是计算机组成原理和操作系统原理,就像高楼大厦是由混泥土钢筋慢慢建造起来,再装修使用是一个道理,不同层的人干不同的事
    qq316107934
        2
    qq316107934  
       2020-04-04 14:30:26 +08:00
    了解下汇编语言指令机器码,还有编译原理
    nakes
        3
    nakes  
       2020-04-04 14:31:03 +08:00
    leonard916
        4
    leonard916  
       2020-04-04 14:31:27 +08:00   ❤️ 1
    去看 計算機原理 TCP/IP 原理 數據庫原理 等一系列“本科教材”
    luckyrayyy
        5
    luckyrayyy  
       2020-04-04 14:33:50 +08:00 via iPhone   ❤️ 17
    你这像是完全没了解过计算机相关知识的人问的……不然至少也得知道计算机组成原理,操作系统,编译原理这些关键字
    yanqiyu
        6
    yanqiyu  
       2020-04-04 14:40:24 +08:00 via Android
    涉及课程:编译原理,计算机体系结构
    觉得还是不够的话就加上数字电路,离散数学
    Mrzhs
        7
    Mrzhs  
    OP
       2020-04-04 14:52:19 +08:00
    @nakes 这个就太强了
    Mrzhs
        8
    Mrzhs  
    OP
       2020-04-04 14:53:21 +08:00
    @yanqiyu 数字电路。。我的天,太底层了
    Mrzhs
        9
    Mrzhs  
    OP
       2020-04-04 14:53:56 +08:00
    @leonard916 就是准备去国外读本。。
    Mrzhs
        10
    Mrzhs  
    OP
       2020-04-04 14:54:30 +08:00
    @luckyrayyy 的确,没有更深层的了解过。所以就过来问问
    Jooooooooo
        11
    Jooooooooo  
       2020-04-04 15:06:07 +08:00
    先学单片机
    Sanko
        12
    Sanko  
       2020-04-04 15:08:09 +08:00 via Android
    微程序 在底层就与门或门非门电路 触发器之类的
    masker
        13
    masker  
       2020-04-04 15:09:48 +08:00 via Android   ❤️ 17
    哈哈,算是看明白了。。。就是来炫耀出国留学的。。
    adminii
        14
    adminii  
       2020-04-04 15:09:55 +08:00 via iPhone
    尝试用汇编写几个程序,大概你懂的 70%了
    Arzu
        15
    Arzu  
       2020-04-04 15:11:56 +08:00
    你沿着 OSI 七层模型捋一遍,捋清楚了,就全明白了。
    alsas
        16
    alsas  
       2020-04-04 15:24:14 +08:00
    高级语言往低级语言一层层翻译,最终变成一连串的 1 和 0 的数字
    maemual
        17
    maemual  
       2020-04-04 15:25:23 +08:00 via iPhone
    可以看看《穿越计算机的迷雾》微信读书就有
    Mrzhs
        18
    Mrzhs  
    OP
       2020-04-04 15:34:49 +08:00
    @maemual copy that
    reedthink
        19
    reedthink  
       2020-04-04 15:35:26 +08:00
    一层一层,千层饼
    Mrzhs
        20
    Mrzhs  
    OP
       2020-04-04 15:36:22 +08:00
    @alsas 我记得计算机硬件只能读懂 0 和 1
    Mrzhs
        21
    Mrzhs  
    OP
       2020-04-04 15:36:42 +08:00
    @masker 这是第几层?
    alphatoad
        22
    alphatoad  
       2020-04-04 15:44:23 +08:00   ❤️ 2
    晶体管,flip flop, latch, registers, ALU, 内存,汇编,外存,操作系统,编译器,网络栈
    要回答这个问题就是本科的任务,能答出来就毕业了,耗时四年
    kamilic
        23
    kamilic  
       2020-04-04 15:47:33 +08:00
    https://item.jd.com/11116026.html
    不那么学术的话,这本书也说得挺好的
    alphatoad
        24
    alphatoad  
       2020-04-04 15:48:37 +08:00
    有句话怎么说的来着,一个合格的本科生至少要能(理论上)用一坨原子搭建出我们现在在用的计算机
    wenzhoou
        25
    wenzhoou  
       2020-04-04 16:04:18 +08:00 via Android
    之前有个视频讲得挺好的。crash course computer science
    可以去看看,通俗易懂。
    danbai
        26
    danbai  
       2020-04-04 16:05:10 +08:00 via Android   ❤️ 1
    推荐楼主去看看这个 https://b23.tv/BV1EW411u7th/p1
    Mrzhs
        27
    Mrzhs  
    OP
       2020-04-04 16:20:08 +08:00
    @kamilic 感谢
    Mrzhs
        28
    Mrzhs  
    OP
       2020-04-04 16:21:32 +08:00
    @wenzhoou 楼下已经发出来了
    crella
        29
    crella  
       2020-04-04 16:21:33 +08:00 via Android
    crud 码农

    sdk 程序员
    lzyliangzheyu
        30
    lzyliangzheyu  
       2020-04-04 16:22:06 +08:00 via Android
    把 EE 的课程学了,就能从物理上理解底层的运转方式
    lzyliangzheyu
        31
    lzyliangzheyu  
       2020-04-04 16:26:26 +08:00 via Android
    物理世界是模电,数字世界是数电,这两者之间的转换又涉及到采样调制解调,然后这里又细分为通信工程的领域,经过这一环,各种电信号才会变成计算机处理的二进制信号
    leoleoasd
        32
    leoleoasd  
       2020-04-04 16:33:07 +08:00   ❤️ 2
    安利一个 Coursera 上的公开课, "从与非门到俄*斯方块", From nand to tetris.

    不需要任何基础, 完整听完就能做到 在自己写的 cpu 上跑自己的操作系统上跑自己的俄*斯方块
    leoleoasd
        33
    leoleoasd  
       2020-04-04 16:33:31 +08:00
    ?????? 俄罗 asdasd 斯居然是关键词
    smyle
        34
    smyle  
       2020-04-04 16:37:25 +08:00 via Android   ❤️ 1
    严重推荐你一本《编码: 隐匿在计算机软硬件背后的语言》(code: the hidden language of computer hardware and software),作者是 Windows 编程界传奇人物 Charles Petzold
    书从两个小孩用手电筒一亮一暗打暗号给你讲起,你会逐渐明白代码是如何转换成电信号,这些电信号又如何存储、作用在硬件上
    ljpCN
        35
    ljpCN  
       2020-04-04 17:06:34 +08:00
    刚想推荐 code 发现楼上推荐了,那就推荐一个深入理解计算机系统吧😜
    StefanJ
        36
    StefanJ  
       2020-04-04 17:11:32 +08:00
    Mrzhs
        37
    Mrzhs  
    OP
       2020-04-04 17:26:21 +08:00
    @StefanJ 没了。
    Mrzhs
        38
    Mrzhs  
    OP
       2020-04-04 17:26:43 +08:00
    @smyle 多谢科普
    Mrzhs
        39
    Mrzhs  
    OP
       2020-04-04 17:27:37 +08:00
    @leoleoasd 多谢
    1KN6sAqR0a57no6s
        40
    1KN6sAqR0a57no6s  
       2020-04-04 17:39:04 +08:00 via Android
    https://www.youtube.com/playlist?list=PLD495612D7E420544

    这个课程是从麦克斯韦方程往上推的,也挺有趣。
    noparking188
        41
    noparking188  
       2020-04-04 17:58:34 +08:00
    学习下计算机科学系本科几门核心课程大概就了解了呀,好奇心很好啊!
    dreamapple
        42
    dreamapple  
       2020-04-04 18:02:41 +08:00 via Android
    本科电类的上来就是三极管(当然继电器也能用),用三极管可以造与非门、触发器,这些基础原件可以造加法器、控制电路,控制电路和加法器造 ALU,也就是 CPU 的核心,然后加点外围设备就能当计算机跑了
    lijialong1313
        43
    lijialong1313  
       2020-04-04 18:04:08 +08:00
    就我不是看不起或者啥的,但是我觉得楼主是非科班的吧……你可能要学习一下科班的关于计算机的资料……
    EminemW
        44
    EminemW  
       2020-04-04 18:26:19 +08:00 via iPhone
    微信用 socket 的吧
    971586331
        45
    971586331  
       2020-04-04 18:28:27 +08:00
    嵌入式欢迎你
    Mrzhs
        46
    Mrzhs  
    OP
       2020-04-04 18:38:17 +08:00
    @noparking188 生命不息,折腾不止
    yolee
        47
    yolee  
       2020-04-04 18:38:42 +08:00
    从门电路开始学吧。
    Mrzhs
        48
    Mrzhs  
    OP
       2020-04-04 18:40:58 +08:00
    @YuxiangLuo 还有中文字幕。
    souths
        49
    souths  
       2020-04-04 18:43:37 +08:00
    你需要看书《深入理解计算机系统》
    zzzzzzggggggg
        50
    zzzzzzggggggg  
       2020-04-04 18:47:22 +08:00 via iPhone
    有本书叫《编码》可以粗略的了解一下
    chiu
        51
    chiu  
       2020-04-04 19:06:05 +08:00 via Android
    charlie21
        52
    charlie21  
       2020-04-04 19:07:26 +08:00
    语无伦次的样子还挺可爱的呢
    cigarzh
        53
    cigarzh  
       2020-04-04 19:09:31 +08:00
    自己焊个 cpu,再写个 OS 就懂啦
    C1mple
        54
    C1mple  
       2020-04-04 19:25:35 +08:00 via Android
    简单的说最底层就都是逻辑电路实现的,不过中间有很多层封装抽象。具体可见 computer architecture 。
    1OF7G
        55
    1OF7G  
       2020-04-04 19:40:20 +08:00
    思而不学则殆。真想知道的话就停止凭空想象、类比,找点相关的正经书读一读吧。
    xieyudi2
        56
    xieyudi2  
       2020-04-04 19:43:14 +08:00 via Android
    @alphatoad 没有 tapeout 过 GDSII 的程序员不是好的程序员(话说我还有软件工程学位,当年还亲自画过 GDSII 然后流片…)
    limbo0
        57
    limbo0  
       2020-04-04 19:57:21 +08:00 via Android
    由下到上机器码 汇编 c 语言
    没有什么问题是层解决不了的
    yeqizhang
        58
    yeqizhang  
       2020-04-04 20:06:59 +08:00 via Android
    说实话,怎么处理同一光纤里面的那么多的光信号都够复杂了吧……
    abutter
        59
    abutter  
       2020-04-04 20:17:27 +08:00
    axxahut233
        60
    axxahut233  
       2020-04-04 20:24:56 +08:00
    这就是 CS 的知识呀,其实底层的东西没必要太深入,但一定要掌握基本的知识
    Mrzhs
        61
    Mrzhs  
    OP
       2020-04-04 20:33:39 +08:00
    @charlie21 又是男妈妈?
    Mrzhs
        62
    Mrzhs  
    OP
       2020-04-04 20:45:56 +08:00
    @1OF7G 所以就来问问,看看有什么文章可以拜读拜读
    ai277014717
        63
    ai277014717  
       2020-04-04 20:55:12 +08:00
    最开始是用打点计时器来写程序的。了解一下。
    DOLLOR
        64
    DOLLOR  
       2020-04-04 21:03:45 +08:00 via Android   ❤️ 1
    科班四大必修课可以解决这些问题:
    计算机体系结构
    计算机组成原理
    操作系统
    编译原理

    如果还想了解更底层的,可以继续学:
    单片机原理
    模拟电路
    数字逻辑电路
    alphatoad
        65
    alphatoad  
       2020-04-04 21:12:49 +08:00
    @xieyudi2 俺只会 verilog,膜大佬
    koebehshian
        66
    koebehshian  
       2020-04-04 21:21:22 +08:00
    先理解到数字层,很好理解,就是二进制01;然后物理层,推荐看 the art of electronics
    imdong
        67
    imdong  
       2020-04-04 21:21:54 +08:00   ❤️ 3
    zhuangzhuang1988
        68
    zhuangzhuang1988  
       2020-04-04 22:05:36 +08:00
    推荐这个<计算机系统要素>
    https://book.douban.com/subject/1998341/
    有模拟器, 硬件代码, 而且不需要特殊的工具, 官方都给了 java 实现
    Geeker
        69
    Geeker  
       2020-04-04 22:12:37 +08:00
    推荐《编码》
    Kiota
        70
    Kiota  
       2020-04-04 22:28:17 +08:00
    可以去看一下计算机专业考研的课本以及一些前置课程,模电数电计算机组成原理操作系统之类的,只是想稍微了解不想入行的话找几本课本简单看看,没必要全学会,大体理解了就行
    1109599636
        71
    1109599636  
       2020-04-04 23:01:42 +08:00
    别看楼上回复什么晶体管 ,操作系统,编译器,网络栈,真要说其实也没几个能说上来的,大家都知道是那么回事,至于具体到某个细节全拉胯。这些东西要学一辈子(学一辈子忘一辈子)
    HangoX
        72
    HangoX  
       2020-04-05 00:11:28 +08:00
    楼主要是计算机专业的学生应该会知道,我们大一大二就在这上面爬,被虐得跟狗一样,可以了解一下上面几层楼说的那几本书
    Perry
        73
    Perry  
       2020-04-05 00:17:17 +08:00 via iPhone
    楼主本科估计会学到自己设计做出来一个 CPU,这种硬核的成就感是很难再享受到的,一定要珍惜!
    xabc
        74
    xabc  
       2020-04-05 00:23:17 +08:00 via iPhone
    恩,这事应该从法拉第发现电磁感应说起 😄
    vevlins
        75
    vevlins  
       2020-04-05 00:35:56 +08:00
    全明白很难,但是了解基本原理并不难。

    每一层的代码都会被转成更底层的代码,比如 j2ee(开发框架)转成 java(基本编程语言)、java 转成 jvm 字节码(字节码),jvm 字节码运行时转成汇编(这个说法不对,姑且这么以为把)。

    到汇编以下,就是机器语言的范畴,汇编就是某种型号的 cpu 的一些指令集的代码表示(不同的 cpu 有不同的指令集,比如 arm 、x86,这些指令集就是 cpu 的一些基本操作单元,好比规定 010101 是寄存器 1 和寄存器 2 的值交换,当然这是我胡说,类似 arm 这种指令集是 cpu 生产厂家自己或者联合起来定义的,是一种约定),这些代码实际上被转换成一些高(1)低电平(0)送到 cpu 内部,cpu 再操作存储器、运算器等冯诺伊曼体系的其他组成部分,这里可以找最简单的加法器看看就能明白大概了。

    屏幕也好、音响也好,都是 cpu 通过 IO 总线(也许是?计算机原理没听过课)向外部 io 发送了一串 01 序列,这些 io 设备也有一些预设的规则,内部有些电路可以根据不同的 01 序列指示哪个像素点发光哪个不发光(这个规则转换要经过 io 总线-显卡-显示器)。

    我的理解就这个层面,至少对于理解编程的含义自认为够用了,当然我只是一个应用开发工程师,如果你有志于从事更底层的工作,要学好计算机组成原理、操作系统、汇编原理等课程,最好再了解一些单片机等偏电子类的知识,上面也有不少人列举了很多有名的好书和课程。

    代码是怎么运行的是个大问题,也是一个多数人不太好提升高度去看的宏观问题,虽然很多学生课程学的很好,但写代码时完全没有高屋建瓴的意识,如果时刻保持“编码”意识我想应该算是大牛了。
    mumbler
        76
    mumbler  
       2020-04-05 00:43:12 +08:00 via Android
    计算机是人类几千年来的智慧积累,要追根溯源就从 2000 年前亚里士多德时代说起
    20015jjw
        77
    20015jjw  
       2020-04-05 00:50:23 +08:00 via Android
    Cs61c 呗
    20015jjw
        78
    20015jjw  
       2020-04-05 00:50:46 +08:00 via Android
    @20015jjw 上完就自己会写 cpu 了...
    verrickt
        79
    verrickt  
       2020-04-05 01:48:25 +08:00 via Android   ❤️ 2
    从程序员的角度看,
    自己的代码->其他用户的库函数->语言的标准库->sys call->OS
    以 sys call 为分界线跨越了一层边界进入 OS 。进入 os 后你看到了 vmm,cpu/资源调度,文件系统的所有细节。
    从 OS 的角度看,loader 加载二进制到内存后,instruction pointer 指向的指令被加载到 cpu 内部执行,此时又跨过一道边界。分界线是指令集(汇编语言)
    进入指令集后你失去了数据类型和建立在其上的任何抽象,你所能看到的是极少数 register 和 ram(巨大的一维数组)
    来到 cpu 层面,你所面对的是 alu,cu,fpu,register 四大金刚,他们内部的走线,相互间的连接方式,还有其他的一些物理特征称为架构。机器指令送入 cu 后,cu 产生对应的控制信号,协调各部件从而使指令得以执行。在 cu 内部,机器指令被转化为微指令。此时又跨越一道边界。
    这时就到了数字电路的领域。我不是很熟悉就不献丑了。
    总之,程序的执行跨过了好几道边界,最终来到逻辑门电路。之所以弄这么多边界是为了让两侧的东西互不影响的发展下去,即解耦。
    上面写的省略了很大一部分的内容,有兴趣可以看看 os,组成原理,数字电路的导论课,会比这详细得多。
    Mrzhs
        80
    Mrzhs  
    OP
       2020-04-05 04:25:30 +08:00
    @verrickt 已经很丰富了
    oooolongtea
        81
    oooolongtea  
       2020-04-05 04:38:25 +08:00
    @kamilic 我买了这本书,但是一直都没有看。
    ekuso
        82
    ekuso  
       2020-04-05 06:10:22 +08:00
    hankai17
        83
    hankai17  
       2020-04-05 07:52:22 +08:00
    晶体管组成与或非电路组成 cpu 跟存储器 cpu 电路只认特定格式的二进制指令从而操作数据
    sunnybird
        84
    sunnybird  
       2020-04-05 08:03:37 +08:00 via Android
    《程序员的自我修养》
    anubu
        85
    anubu  
       2020-04-05 08:23:49 +08:00
    从顶层到底层涉及多层抽象和多种实现,一时半会应该很难搞懂。建议花几十块钱搞一个单片机加上几个 LED,花上两三天时间就能很直观的感受到所谓的底层二进制 0101 在现实世界是怎么展示的,不用太深奥的数电和汇编知识,通过 LED 能够快速直观的看到你编写的几个汇编或 C 语句给你的反馈。

    这种体验真的很神奇,推荐尝试一下。
    shenqi
        86
    shenqi  
       2020-04-05 09:14:52 +08:00
    我能肯定,楼主 100%的非计算机类专业程序员。或者说完全没上课的计算机类专业
    nevin47
        87
    nevin47  
       2020-04-05 09:23:41 +08:00 via Android
    LZ 如果真的有兴趣,可以读一下《 Modern Processor Design-Fundamentals of Superscalar Processor 》。
    koalabearguo
        88
    koalabearguo  
       2020-04-05 09:34:56 +08:00 via Android
    可以买一本计算机结构体系的书看一看
    star7th
        89
    star7th  
       2020-04-05 09:48:22 +08:00
    最底层是高低电平,对应计算机世界的二进制。翻一番计算机原理就懂啦
    feiffy
        90
    feiffy  
       2020-04-05 10:25:36 +08:00 via Android
    楼上的推荐很好,你看下《穿越计算机的迷雾》差不多就明白了
    leonard916
        91
    leonard916  
       2020-04-05 10:30:21 +08:00
    @Mrzhs 那雅思 /托福分數 高一點就可以去申請了
    WhatIf
        92
    WhatIf  
       2020-04-05 10:50:51 +08:00
    基础是门电路 , 这个可以去看《通灵芯片》或者《编码》 ,这两本书写的非常浅显易懂,了解这块,那么至少可以知道如何构造一个简单的 cpu,支持逻辑运算与数学运算(浮点数不考虑)。
    如果上面的太底层,想要忽略, 那么汇编可能也不合适, 高级语言又是太过抽象, 唯一能解答的就是编译原理了。
    tairan2006
        93
    tairan2006  
       2020-04-05 11:25:11 +08:00 via Android
    好好学习
    zenwong
        94
    zenwong  
       2020-04-05 13:55:18 +08:00
    别人四年大学学习的东西是不可能一张帖子就学会的
    chihiro2014
        95
    chihiro2014  
       2020-04-05 16:41:57 +08:00
    推荐先从编译原理看起啊: https://www.bilibili.com/video/BV1cE411f78c
    pythonee
        96
    pythonee  
       2020-04-05 23:47:13 +08:00
    @DOLLOR 上了科班的我却回答不上来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1724 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:45 · PVG 00:45 · LAX 08:45 · JFK 11:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.