作者nnlisalive (nnlisalive)
看板PLT
标题[问题] 为啥高阶语言的hello world跟机器无关?
时间Fri Sep 8 04:33:14 2017
https://helloworldcollection.github.io/
这个网页是各种语言写的Hello World 程式
有565种 包括76人类语言
我看到用音符写程式的Velato语言XD
如果用组合语言写Hello World 程式
写法就会因为不同机器而不同
例如Assembler(8051)的HELLO WORLD程式
-----------------------------------------------
Org 0
mov dptr,#msg
mov R0,#30h
loop:
clr a
movc a,@a+dptr
jz end
mov @R0,a
inc R0
inc dptr
sjmp loop
end:
jmp $
msg:
db 'Hello World",0
------------------------------------------------
那个loop不知道在loop啥的 反正程式码就是这样
我猜是因为组合语言就是010110101机械语言的浓缩版
透过键盘来浓缩 本来要输入0100 1000 代表 H
现在搞一个 H 按钮
透过电路设计当按下按钮时
送出0100 1000 给电脑 用八条电线?
还是用一条电线依序送出0 1 0 0 1 0 0 0?
总之就是按一下会输入8个bit
Hello world 总共要按10下
再来是有个指令mov 在其他的组合语言版本也有看到
我猜mov就是英文的move的意思
把输入move到暂存区??
其他的指令通通看不懂
暂存区就是电脑不知道你输入hello world要干嘛
先收起来放着
严格讲起来电脑不知道你输入的是hello world
电脑收到的是按下hello world按钮所输入的1010...讯号
而且是有顺序的 h 在 e 前输入 e 又在 l 前
所以hello world的二进位讯号
现在被搬进暂存区 等下一步指令
其实整段hello world 程式码
通通都是0101...的型态 装入暂存区内
然後大概有指令是告诉8051 准备输出hello world
所以要再搞出显示装置
我有用过面包板接出计时器
用这个逻辑 假如显示器设计复杂一点
可以让显示器收到0100 1000 亮出 H 的点
例如制作个8*8解析度的显示器好了 总共64颗LED灯泡
64亮出 HeloWrd 的形状应该很够了 (那个 W 可能不太清楚)
透过nand nor not逻辑闸组合出一个8bit控制64颗灯泡怎亮的电路
可能不用控制到64颗 有几颗可能永远不会亮 不用管他
不过也许有其他字母会让它亮 所以设计时要考虑进来
总之 Hello world 终於顺利显示在萤幕上了
结论是这个程式码会跟
1.输入装置
2.暂存器
3.输出装置
有很大的关系 只要有不同的电路设计
输出的0101...在显示器上就不是预期的形状
但现在我看C C++ Java 这些程式 完全不care这些东西耶
我是指大家的电脑都不一样阿
虽然键盘都一样
但是大家的萤幕 CPU 记忆体都不一样
有人用22寸 24寸
记忆体也有DDR2 DDR3 DDR4
CPU也有Intel AMD
主机板 显示卡 也一堆不同厂商
大家用着各式各样不同的零件组成的电脑
安装完作业系统和C++编辑器
只要在C++的编辑器打入
---------------------------------------------
#include <iostream.h>
main()
{
cout << "Hello World!" << endl;
return 0;
}
--------------------------------------------
编译完 执行就能在命令提示字元显示 Hello world
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.238.33.245
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PLT/M.1504816399.A.B44.html
※ 编辑: nnlisalive (36.238.33.245), 09/08/2017 05:14:12
1F:推 LPH66: 建议你去找本计算机概论从头到尾读完再回头来看你的问题 09/08 08:12
2F:推 james732: 底层原理其实一样,但编译器大神处理掉了 09/08 09:34
3F:→ james732: 高阶语言的重点就是不用管硬体啊XD 09/08 09:35
4F:推 mars90226: 这问题有点尴尬...感觉你需要先搞懂计算机的基础 09/08 16:45
5F:→ mars90226: 简单的说编译器知道各机器所需要的机器码 09/08 16:46
6F:→ mars90226: 他会自动将你的code转换成对应的机器码 09/08 16:46
7F:→ mars90226: 还有你说这那堆硬体其实都没差,只有CPU的架构才有影响 09/08 16:48
8F:→ mars90226: 这种简单的程式只有CPU架构跟OS会影响生出来的执行档 09/08 16:49
9F:推 CoNsTaR: 你讲的不就是编译器在做的事吗… 09/08 22:37
10F:推 Neisseria: 去读编译器和直译器的书就有解了 09/13 08:25
11F:推 wgst88w: 白算盘讲的软韧体介面,就是你不知ASM在干嘛的地方。 09/17 22:02
12F:推 Davidhu127: 高阶的特性就是可以从实际层面"抽离",所以又叫做"抽 10/15 14:54
13F:→ Davidhu127: 象化",抽象化的好处是可以相容,跨平台都适用,设计 10/15 14:54
14F:→ Davidhu127: 起来省力,坏处是中间的转换(或许会)让效能变差一点点 10/15 14:54
15F:推 Davidhu127: 如果有兴趣往高阶走,比程式语言更高阶的是演算法 10/15 14:57
16F:推 CoNsTaR: 楼上,语言和算法是两个完全不同的东西吧 = = 10/16 05:46
17F:→ CoNsTaR: 还有抽象化是忽略整体的一部分,有助於将不同的东西归类 10/16 05:46
18F:→ truefalse: 楼上,我觉得楼上上只是在表达概念 11/18 16:14
19F:→ truefalse: 因为演算法是跨越各种语言的 11/18 16:14
20F:→ truefalse: 正如同高阶语言跨越机械的概念相近 11/18 16:15
21F:推 CoNsTaR: 语言也是跨越各种演算法的啊… 12/04 08:18
22F:→ CoNsTaR: 而且不管高不高阶,语言本来就是跨越机械的不是吗 12/04 08:18
23F:→ CoNsTaR: 我是指在有对应的编/组译器的情况下 12/04 08:21