命令行程式碼和高級語言程式碼有什麼關係?
我正在學習在我的 Ubuntu 14.04 上使用終端,並在我的 shell 中執行命令行程式碼(我被告知是終端內部的內容)來安裝程序。但我也可以在我的 shell 中啟動我的 node.js 伺服器,然後我可以在終端中執行 javascript 程式碼;它跟踪我儲存在變數中的值,我可以創建函式然後使用它們等等。但是它似乎確實改變了模式,因為我不再在我的作業系統的特定文件夾中,所以也許我不再在我的 shell 中?
所以我開始研究shell命令:
什麼是“命令?
根據http://linuxcommand.org/lc3_lts0060.php命令可以是 4 種不同類型之一:
- 像 /usr/bin 中的所有這些文件一樣**的可執行程序。**在此類別中,程序可以編譯為二進製文件,例如用 C 和 C++ 編寫的程序,或者用腳本語言編寫的程序,例如 shell、Perl、Python、Ruby 等。
- 內置於 shell 本身**的命令。**bash 提供了許多內部稱為 shell 內置命令的命令。例如,cd 命令是一個內置的 shell。
- 一個外殼函式。這些是集成到環境中的微型 shell 腳本。
- 一個別名。您可以自己定義的命令,由其他命令建構。
這是否意味著每次啟動程序時,我總是在我的 shell 的幫助下執行我的文件(egxphp、x.js、x.css、x.html 文件)中的更高級別的程式碼?還是僅僅意味著我可以使用命令行啟動一個程序,然後在其他地方執行(如果在其他地方,那麼在哪裡?)?
您如何掌握這些不同類型的程式碼/語言之間的互動?
例如:您可以將其全部視為放入命令行的程式碼嗎?一些語言逐行呼叫其他語言,然後將控制權返回給呼叫者等等,或者什麼樣的心理模型有助於理解正在發生的事情?
您說得對,當您打開終端時,您使用的是外殼。shell 的主要工作是幫助您執行可執行程序。
那麼什麼是執行檔?鍵入
ls
並按輸入鍵。它應該列印出目前目錄中的文件。現在,看起來 shell 正在執行某種名為 的內置命令ls
,對吧?錯誤的!它實際上是在創建一個 執行可執行程序的新 Linux程序/usr/bin/ls
。那麼它為什麼將文件列表寫入 shell 呢?好吧,該
ls
程序對外殼一無所知。事實上,它並不真正知道要寫到哪裡。程序員所做的是讓程序將列表寫入稱為標準輸出的東西。然後,shell 使用稱為管道的 Linux 技巧將列表列印到終端。有趣的是,shell 也可以把這個標準弄到其他地方去。例如,打字
ls > /tmp/ls.out
不會列印到終端。它實際上是將列表發送到目錄中的文件/tmp
。更有趣的是,鍵入使ls | less
shell 啟動ls
程序以及less
程序並將標準輸出到標準ls
輸入。這些程序都不知道關於 shell 的任何事情,事實上,shell 也不知道程序是如何工作的:如果程序是以標準方式編碼的,那麼它就可以正常工作。less
現在,到
node.js
案子。同樣,shell 剛剛啟動了node.js
程序。如果你不提供參數,這個程序會嘗試從標準中讀取,就像less
. 由於您沒有通過管道傳輸任何內容,因此 shell 只是連接了鍵盤,以便您鍵入的任何內容都會發送到node
. shell 還將標準輸出連接到終端,這樣任何node
寫入的內容都會像我們看到的ls
那樣進入終端。最終的結果是,shell 現在似乎可以理解 JavaScript,但事實並非如此。它真的只是理解執行程序和重定向輸入/輸出(至少在這種情況下)。它正在node
做JS。
除了自下而上的學習對開發複雜系統的心智模型有用外,我從來沒有發現任何東西。
學一點彙編語言——不多,只夠寫一個數字加法子程序。Watch 通過在調試器中單步執行來完成它的工作。發現指針只不過是機器地址,而字元串實際上是由包含
0
在其中的單元終止的記憶體單元序列(免責聲明:在某些語言中)。一旦你知道了這一點,當你用高級語言編寫時記住它是你能做的最好的事情,以獲得整個系統的連貫圖像。你會立即明白為什麼有些事情比其他事情慢,以及為什麼有些事情需要更多的記憶體。
一旦你了解了程式語言,就可以快速了解一下命令 shell 的實現。再一次,沒多久,就足以看出它和其他程序一樣是一個程序,只是它的輸入和輸出是其他命令。觀察它解析命令行,最終你會“明白”為什麼帶有空格的文件名會造成這麼多麻煩。
或者,查看一個現代系統啟動守護程序,看看它是如何使用 shell 腳本、程序和系統呼叫來實現的(盡量不要對這一切看起來多麼搖搖晃晃感到太震驚。)
所有這一切都需要時間,但我堅信,如果不投入大量時間,就無法對現代電腦這樣複雜的系統產生半有用的印象。用一種半錯的、誤導性的心智模型(問問任何曾經花一天時間從事技術支持工作的人)離開的情況要普遍得多。您也不太可能了解堆棧中的所有內容,但這沒關係 -沒有人了解當今用於計算任何內容的整個堆棧。人類的大腦太慢,太有價值,不能再嘗試這樣的特技了。