作者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/m.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