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

2020-04-04 14:25:50 +08:00
 Mrzhs

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

8639 次点击
所在节点    程序员
96 条回复
Mrzhs
2020-04-04 20:33:39 +08:00
@charlie21 又是男妈妈?
Mrzhs
2020-04-04 20:45:56 +08:00
@1OF7G 所以就来问问,看看有什么文章可以拜读拜读
ai277014717
2020-04-04 20:55:12 +08:00
最开始是用打点计时器来写程序的。了解一下。
DOLLOR
2020-04-04 21:03:45 +08:00
科班四大必修课可以解决这些问题:
计算机体系结构
计算机组成原理
操作系统
编译原理

如果还想了解更底层的,可以继续学:
单片机原理
模拟电路
数字逻辑电路
alphatoad
2020-04-04 21:12:49 +08:00
@xieyudi2 俺只会 verilog,膜大佬
koebehshian
2020-04-04 21:21:22 +08:00
先理解到数字层,很好理解,就是二进制01;然后物理层,推荐看 the art of electronics
imdong
2020-04-04 21:21:54 +08:00
zhuangzhuang1988
2020-04-04 22:05:36 +08:00
推荐这个<计算机系统要素>
https://book.douban.com/subject/1998341/
有模拟器, 硬件代码, 而且不需要特殊的工具, 官方都给了 java 实现
Geeker
2020-04-04 22:12:37 +08:00
推荐《编码》
Kiota
2020-04-04 22:28:17 +08:00
可以去看一下计算机专业考研的课本以及一些前置课程,模电数电计算机组成原理操作系统之类的,只是想稍微了解不想入行的话找几本课本简单看看,没必要全学会,大体理解了就行
1109599636
2020-04-04 23:01:42 +08:00
别看楼上回复什么晶体管 ,操作系统,编译器,网络栈,真要说其实也没几个能说上来的,大家都知道是那么回事,至于具体到某个细节全拉胯。这些东西要学一辈子(学一辈子忘一辈子)
HangoX
2020-04-05 00:11:28 +08:00
楼主要是计算机专业的学生应该会知道,我们大一大二就在这上面爬,被虐得跟狗一样,可以了解一下上面几层楼说的那几本书
Perry
2020-04-05 00:17:17 +08:00
楼主本科估计会学到自己设计做出来一个 CPU,这种硬核的成就感是很难再享受到的,一定要珍惜!
xabc
2020-04-05 00:23:17 +08:00
恩,这事应该从法拉第发现电磁感应说起 😄
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
2020-04-05 00:43:12 +08:00
计算机是人类几千年来的智慧积累,要追根溯源就从 2000 年前亚里士多德时代说起
20015jjw
2020-04-05 00:50:23 +08:00
Cs61c 呗
20015jjw
2020-04-05 00:50:46 +08:00
@20015jjw 上完就自己会写 cpu 了...
verrickt
2020-04-05 01:48:25 +08:00
从程序员的角度看,
自己的代码->其他用户的库函数->语言的标准库->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
2020-04-05 04:25:30 +08:00
@verrickt 已经很丰富了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/659337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX