[問題] 程式是如何建構出來的???

看板C_and_CPP (C/C++)作者 (我愛阿蓉)時間16年前 (2010/03/27 03:20), 編輯推噓19(19055)
留言74則, 17人參與, 最新討論串1/2 (看更多)
我標題想了好久~~實在不會下 但我想問這些問題很久了(滿長的請見諒) 希望大家能夠提供一些看法 我目前也不知道這要怎麼google... 我是剛進入公司工作 性質是寫AP.... 從大學接觸程式到研究所 我好像寫的程式也都是非常上層 我所定義的上層 是指 所有功能都是拿別人現成的API or Lib來用 像是 讀圖, 存圖 讀音效撥音效 了不起我寫過唯一的網路程式 用BCB ...也是很簡單要丟啥字串 傳到某function 他就幫我送給對方了(我覺得好厲害我根本不懂網路) 我所做的 只是把他們提供的API 再包一包 搞成一個可以run的程式 不懂這些的人看到我的程式好像很厲害 有一些特殊的功能 疏不知我根本不懂原理..........簡單一句...我只是call function 邏輯我有 但是技術我完全沒有.... 在工作環境上 我剛進公司沒多久 我看到的AP 也都是用一堆API 建構出來的華麗程式 問了問同事 阿你們都懂原理喔 回: 不知道阿... 舉個例 拿我所看到的google Android (java) 有提供camera這class camear.Initial camera.什麼的 哇靠 就有camera抓到的影像秀出來 別人不懂還以為我連camera都會寫 好厲害喔....我只能說 我只是call function... 這讓我有一個感慨 難道寫AP的 都學不到技術嗎?我不用懂技術只要會呼叫該用的function就有辦法 把程式寫出來 好像不用資工系 只要會call function 邏輯有 一般有興趣想寫AP的人都可以來寫阿 有bug(邏輯bug)在慢慢de就好 component都不是我們寫 我們能寫出的bug 也是邏輯上的bug... 他們component寫錯了 我根本不會知道是他們寫錯 因為我根本不懂原理..... 請過來人指證我 我真的到現在都是這樣認為.....我也不想這樣下去.... 我自己到現在底子很差 沒有技術知識 我又對硬體一竅不通 所以以下我想問一個問題(可能很腦殘 但我真的不知道) 我一直在想 一個API 是怎麼和底層溝通 舉個例: 我想畫一條線 (windows系統) 我很高興的去msdn找到類似叫drawline的函式 我呼叫了 也真的給我畫出來 可是drawline是微軟寫死的 他怎麼有辦法把資料丟給顯示卡要他畫圖?? 顯示卡 好多種規格 牌子 為什麼我灌了driver OS就有辦法知道他 並且drawline這API就能夠畫圖了? 這中間可能卡了好幾層 但我不知道這之間的觀念 我就卡在 api已經寫死了 底層是如何讓OS和顯示卡接起來這個橋樑 以上我認為我寫AP我根本不用管這些 但是又覺得說 我不懂這些 又覺得自己很像啥都不會... 這例子也可以改成 我呼叫一行他就可以播放音樂 我呼叫一行 他就有辦法把字串透過網路送出去 為什麼standard library cout<<可以把字串印到console視窗內... 這都怎麼做到的 微軟的API都寫死了 你硬體(是driver嗎)需要遵照什麼規範去實做嗎????? =========================================================== 和一些大學同學聯絡 他們目前工作性質有的是寫韌體 有的是寫一些影音串流包含網路 閒聊中 他們可以講出他在做什麼 用了哪些技術 哪些是他負責在弄的 寫韌體的 也講說什麼 阿就照spec 他要我哪個ping怎麼樣我就照他的寫阿 他講的簡單 我卻無法體會 我根本就不懂.... 我呢......啥都沒得講 我還是只會call function.... 當然AP沒這麼好寫 我自己是認為寫AP 你OO一定要有一定水準 你coding的style也要越來越嚴謹 一堆error都要記得去handle 雖然我現在也弱弱的 但感覺在職場呆一陣子 我頂多C++或是被迫使用的OO language變強 或是變成coding機器... 但我技術還是沒有學到阿....... 可能有人會說自己花時間學~~但是真的在公司 也不可能偷偷自修自己想學的東西 真正下班了 都很晚了 根本不會想再去自修.....能玩就不錯了 = = 我真的很佩服寫底層的 寫driver阿 寫一些核心技術的人 感覺他們才是真正又會寫程式 又會開發新技術的人員... 請板友們 替我解解惑吧..... 自己覺得我再寫上層的東西 但是要是沒底層的人 我根本就無法寫出來 我覺得我已經變成 要寫程式 只要找不到API就不會寫了的情況... 是只有我有這種疑惑嗎 大家都對整個 os hw driver firmware 這些 都有基本的觀念嗎?? 我是都沒有才想潑版請教各位 謝謝~~請指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.83.99

03/27 03:38, , 1F
感覺牽涉很廣@@ OS 計組 組語 compiler 很多很多..
03/27 03:38, 1F

03/27 03:39, , 2F
我也是囫圇吞棗XD 需要有厲害的大大整個有系統的說明
03/27 03:39, 2F

03/27 03:40, , 3F
好期待這篇的回應(興奮) 感覺可以學到很多
03/27 03:40, 3F

03/27 04:37, , 4F
懂原理就好摟 原理是拿來應用的 也不需要到底層
03/27 04:37, 4F

03/27 04:39, , 5F
像TCP/IP就懂它的handshaking camera就懂它的RGB raw data
03/27 04:39, 5F

03/27 04:40, , 6F
同樣是Call function,有些人就是可以最佳化
03/27 04:40, 6F

03/27 04:41, , 7F
差別就是在對原理了不了解
03/27 04:41, 7F

03/27 04:44, , 8F
修過計算機組織、微處理機實習、系統程式...就知道了
03/27 04:44, 8F

03/27 04:45, , 9F
或者是弄個嵌入式板子來玩
03/27 04:45, 9F

03/27 04:46, , 10F
當程式會寫 以前教觀念的書本重看一次真的會超有收獲
03/27 04:46, 10F

03/27 04:57, , 11F
去看看 Minix 的程式碼, 自己寫一個作業系統就知道了
03/27 04:57, 11F

03/27 05:01, , 12F
以你問的 drawline 為例, CPU 有兩種 mode, text
03/27 05:01, 12F

03/27 05:01, , 13F
mode 和 graphic mode, 傳統的 command line, CPU 是
03/27 05:01, 13F

03/27 05:02, , 14F
在 text mode, 單位是一個字, 要如何寫就是用 bios
03/27 05:02, 14F

03/27 05:03, , 15F
提供的中斷, 現今的 GUI 則是 CPU 處於 graphic mode
03/27 05:03, 15F

03/27 05:04, , 16F
寫的方式應是 memory mapped IO
03/27 05:04, 16F

03/27 05:04, , 17F
單位則是 pixel
03/27 05:04, 17F

03/27 05:05, , 18F
如你所說的, 如果是 standard library cout, 當你是
03/27 05:05, 18F

03/27 05:05, , 19F
在 command line 的系統, standard library 最終call
03/27 05:05, 19F

03/27 05:06, , 20F
OS 的 API, OS 的 API 則是用 bios 的中斷
03/27 05:06, 20F

03/27 05:07, , 21F
如果是在 GUI, 那你輸出的會被轉成像 pixel 的型式
03/27 05:07, 21F

03/27 05:07, , 22F
才被畫上螢幕
03/27 05:07, 22F

03/27 05:08, , 23F
至於你說的網路, 則牽扯到 network stack, 但是最接
03/27 05:08, 23F

03/27 05:09, , 24F
近底層的部分, 還是不外乎剛剛說得那兩種方式
03/27 05:09, 24F

03/27 05:11, , 25F
有錯請指正 <(_ _)>
03/27 05:11, 25F

03/27 06:15, , 26F
你轉烤麵包機的旋鈕時,不必忙著思考線路上的原理.
03/27 06:15, 26F

03/27 06:25, , 27F
弄嵌入式系統 trace kernel就可以猜出些端倪
03/27 06:25, 27F

03/27 06:27, , 28F
從之前看到ip 113到公司 時間過好快...@_@
03/27 06:27, 28F

03/27 06:28, , 29F
不過再早期確實會碰到kernel api不足支援的問題
03/27 06:28, 29F

03/27 07:53, , 30F
推y大, 轉烤麵包機的旋鈕時,不必忙著思考線路上的原理
03/27 07:53, 30F

03/27 07:54, , 31F
就算是寫所謂比較底層的東西, 也不見得需要去弄懂每一個
03/27 07:54, 31F

03/27 07:55, , 32F
API/LIB怎麼實作的, 不同vendor不一定實作方式也不同.
03/27 07:55, 32F

03/27 07:55, , 33F
真正有需要的公司, 公司自有一套機制train你給你需要研
03/27 07:55, 33F

03/27 07:56, , 34F
讀的資訊(不管是底層的SW或HW怎麼做). 軟硬體包山包海,
03/27 07:56, 34F

03/27 07:57, , 35F
你想弄懂所有東西, 那就卯起來讀書卯起來trace code吧.
03/27 07:57, 35F

03/27 07:58, , 36F
最後, 寫AP也沒有這麼淺, 或者說寫程式也沒有這麼容易.
03/27 07:58, 36F

03/27 10:23, , 37F
單純寫AP,也有一堆演算法資料結構可以研究啊 XDD
03/27 10:23, 37F

03/27 10:24, , 38F
要花的時間也是很多低~
03/27 10:24, 38F

03/27 10:53, , 39F
呃 ... text跟graphics mode是顯示卡那邊的事吧 @@a
03/27 10:53, 39F

03/27 10:54, , 40F
x86的工作模式是有 real mode跟protected mode XD
03/27 10:54, 40F

03/27 10:56, , 41F
遇到行家了, good. 那他是怎麼切換的阿, 我只知道有
03/27 10:56, 41F

03/27 10:57, , 42F
兩個 mode 可供切換, 不過不知道他實際怎麼切換的?
03/27 10:57, 42F

03/27 10:58, , 43F
看了 EFI 也沒找到相關的程式碼
03/27 10:58, 43F

03/27 10:59, , 44F
API就是要給人家call的,有興趣的東西再深入研究就好了
03/27 10:59, 44F

03/27 11:41, , 45F
你要看real mode 切 protected mode 就看 x86 programmi
03/27 11:41, 45F

03/27 11:41, , 46F
g guide 就好了 去圖書館也找的到專書
03/27 11:41, 46F

03/27 11:42, , 47F
填暫存器填一填 設定分頁和分段
03/27 11:42, 47F

03/27 12:31, , 48F
real mode 跟 protected mode 我知道, 這蠻基本的
03/27 12:31, 48F

03/27 12:31, , 49F
我是想請問 text mode 和 graphic mode 之間的切換
03/27 12:31, 49F

03/27 13:03, , 50F
大家推文的專有名詞我...都沒概念= = 我不是說寫AP很容易@@
03/27 13:03, 50F

03/27 13:03, , 51F
只是覺得寫AP會學到的東西可能有限 技術方面能碰到的機會很少
03/27 13:03, 51F

03/27 13:05, , 52F
主要是我從來沒有會過底層 沒有這觀念 有點希望知道這方面的
03/27 13:05, 52F

03/27 13:05, , 53F
概觀 不然我只會call有的東西 沒的話我就不知道怎下手了
03/27 13:05, 53F

03/27 14:34, , 54F
有時候有穩定可靠的開發工具比自己去從頭寫還重要
03/27 14:34, 54F

03/27 14:53, , 55F
我會從他們的API去推測他們的記憶體管理策略
03/27 14:53, 55F

03/27 14:54, , 56F
倒是覺得沒有Call function那麼簡單
03/27 14:54, 56F

03/27 14:55, , 57F
因為在很多情況 資料量大的時候很容易overflow
03/27 14:55, 57F

03/27 14:58, , 58F
我也想要有推敲她怎麼寫的能力 但是我就一直不懂....
03/27 14:58, 58F

03/27 14:59, , 59F
某一個環節.....
03/27 14:59, 59F

03/27 15:01, , 60F
有興趣的話可以改找driver相關的工作啊XD
03/27 15:01, 60F

03/27 20:59, , 61F
那你要不要學量子力學來徹底瞭解電子是啥東西啊...XD
03/27 20:59, 61F

03/27 21:34, , 62F
我覺得寫ap可以學到一些架構面的東西,不一定就比driver容易
03/27 21:34, 62F

03/27 21:36, , 63F
你看到那些能夠reuse的component內部也可能只是多call了一
03/27 21:36, 63F

03/27 21:36, , 64F
層api
03/27 21:36, 64F

03/27 21:37, , 65F
能夠設計這些component也是很有學問的...XD
03/27 21:37, 65F

03/27 22:00, , 66F
做出那些層次本來就是要讓你不懂底層也能用
03/27 22:00, 66F

03/27 22:00, , 67F
只是你如果懂底層比較知道如何去最佳化
03/27 22:00, 67F

03/27 22:01, , 68F
在上層做東西不代表就沒問題要解決
03/27 22:01, 68F

03/27 22:01, , 69F
因為你依賴的是下面的那些東西,當那些有問題時
03/27 22:01, 69F

03/27 22:02, , 70F
你可能就得想辦法去讀下面的東西,做出workaround來
03/27 22:02, 70F

03/28 13:36, , 71F
量子力學也說不出電子是什麼東西XD 要場論或String ?
03/28 13:36, 71F

03/28 13:38, , 72F
String(弦)可以append嗎?
03/28 13:38, 72F

03/28 17:51, , 73F
我覺得原po如果對driver有興趣 可以去學習
03/28 17:51, 73F

03/28 17:52, , 74F
但如果只是覺得ap比driver遜那就不必了 不同領域罷了
03/28 17:52, 74F
文章代碼(AID): #1BhGZfyj (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BhGZfyj (C_and_CPP)