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

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

  •  
  •   Mrzhs · 92 天前 · 6352 次点击
    这是一个创建于 92 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    每一层的代码都会被转成更底层的代码,比如 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   92 天前 via Android
    计算机是人类几千年来的智慧积累,要追根溯源就从 2000 年前亚里士多德时代说起
    20015jjw
        77
    20015jjw   92 天前 via Android
    Cs61c 呗
    20015jjw
        78
    20015jjw   92 天前 via Android
    @20015jjw 上完就自己会写 cpu 了...
    verrickt
        79
    verrickt   91 天前 via Android   ❤️ 1
    从程序员的角度看,
    自己的代码->其他用户的库函数->语言的标准库->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   91 天前
    @verrickt 已经很丰富了
    oooolongtea
        81
    oooolongtea   91 天前
    @kamilic 我买了这本书,但是一直都没有看。
    ekuso
        82
    ekuso   91 天前
    hankai17
        83
    hankai17   91 天前
    晶体管组成与或非电路组成 cpu 跟存储器 cpu 电路只认特定格式的二进制指令从而操作数据
    sunnybird
        84
    sunnybird   91 天前 via Android
    《程序员的自我修养》
    anubu
        85
    anubu   91 天前
    从顶层到底层涉及多层抽象和多种实现,一时半会应该很难搞懂。建议花几十块钱搞一个单片机加上几个 LED,花上两三天时间就能很直观的感受到所谓的底层二进制 0101 在现实世界是怎么展示的,不用太深奥的数电和汇编知识,通过 LED 能够快速直观的看到你编写的几个汇编或 C 语句给你的反馈。

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