“想入門程式設計,應該學那種語言?” 這類問題在五湖四海,世界各地,應當都是比較月經的。 給出的回答呢, 有的會直接告訴你去學Python,有的呢會給一些比喻,說程式語言就像畫家手裡的筆,有毛筆,鋼筆……,有的會給出一個技術棧的圖表,告訴你如果你要做XXX,那就學XXX,如果做XXX就學XXXX。 感覺呢這些建議,也都不錯,但是通常都比較簡略,結果明確,但緣由一般不會展開太多解釋。純新手可能似懂非懂,將信將疑。
自上而下,由整體到具體的理解一個事物,效率往往比從具體到整體要高,更容易明白自己所處的位置, 更容易入門。 可惜,對於程式設計師在開發領域歸納總結,融匯貫通來說, 可能是十幾,二十年後的事情了。所以在分析程式語言優劣,或者選一個語言寫具體的Hello World之前, 我們最好對“程式語言”有一個更整體全面的瞭解。
學習程式語言是在學什麼
百度百科——程式語言(programming language)可以簡單的理解為一種計算機和人都能識別的語言。一種計算機語言讓程式設計師能夠準確地定義計算機所需要使用的資料,並精確地定義在不同情況下所應當採取的行動。
維基百科——程式語言是一種規則, 這種規則,可以把文字, 或者圖形元素(視覺化程式語言)轉化為機器碼。程式語言是一種計算機語言,用於在計算機上實現各種演算法。
百度的定義顯然說了啥但好像又啥都沒說。-_-|| 。維基百科的則準確了很多。程式設計其實就是把你寫的一段文字(程式碼)按照特定的規則, 轉換成機器碼(機器能夠執行的指令),用於在計算機上實現演算法(如顯示2個輸入數字中最大的)。你要學習的其實就是這種規則,比如當我需要在螢幕上顯示 Hellow World時。按照不同語言的規則,我需要這樣寫出這樣的文字。
c語言
printf("\nhello world!");
php語言
echo "hello world!";
java語言
System.out.println("Hello World!");
看上去有些差別,但又有些相似。實際上目前主流的高階語言如Java ,C#,javascript,Python 他們的基礎語法規則是非常近似的。 無論先學哪個入門,後面的切換成本,基本是幾小時搞定。當你學會一門語言, 除了學會了具體關鍵字,語法之外,更主要的是你會沉澱下來一種對程式語言模式的理解。當你理解了一種語言中的 變數, 函式,控制結構(順序,分支,迴圈),遷移其他語言時,你會發現在其他語言中,這些概念也是存在且完全適用的。
虛擬碼是一種脫離具體語言的,體現程式設計思維的描述方式, 相同層次的語言,程式設計思維是共通的。如顯示2個輸入數字中最大的問題的程式設計思路。
變數A等於輸入的第一個數字
變數B等於收入的第二個數字
如果 變數A大於 變數B
螢幕顯示變數A
否則
螢幕顯示變數B
上面的演算法思想, 在各種語言中都是可以實現的。僅僅變數定義的方式,判斷分支的書寫方式略有差別。所以,對於入門來說,學習一門程式語言,通常都狹義的指程式語言本身(基本不涉及第三方類庫框架等), 你所學到的語法細節切換成本是很低的,各個語言差不太多,而真正沉澱的是你在編寫過程中逐漸熟悉領會的,程式設計思路。即組合使用,變數,函式,控制結構(如果/那麼/迴圈)等要素,解決具體的演算法問題的能力。
IDE與編譯原理
在糾結良久終於選定了學哪一門語言之後,可能開始接觸到的第一個東西是IDE, 例如學Python可能是用PyCharm,我之前學Basic用的是Visual Basic。 IDE的含義是“整合開發環境”, 名字雖然很準確, 但當時還是小白的我其實是非常困惑的, 壓根搞不清楚IDE與程式語言之間的關係。也搞不清楚,寫完程式碼後在IDE中一點那個綠色的小三角(執行)過程中到底發生了什麼。IDE可以方便程式的開發, 但是對於新手會影響他對程式語言的理解認識,很難理解IDE的確實含義,“整合開發環境”到底整合了什麼。
——上面是Python的 Hello World。 IDE為PyCharm
IDE大概整合這樣幾種東西。
1.文字編輯器 是一個用於編寫文字的工具,像上圖寫print Hello World 的地方。 程式設計其實就是在編寫一段文字,儲存成一個檔案。 常見的簡單文字編輯器比如windows中的記事本,也是一個文字編輯器。理論上記事本完全可以用來程式設計,但IDE中的文字編輯器會提供很多額外功能,如文字著色,智慧提示(敲pr會自動提示 print),這些快捷功能是語言相關的。當然也會提供文字編輯器的常見功能, 儲存,查詢,替換等。
2.編譯器,聯結器 對於非指令碼語言(最終生成獨立的可執行程式)如C,編寫好的程式檔案是無法被執行的。例如在windows中,系統層次,典型的可執行副檔名為EXE,這是一種特定的檔案格式PE檔案格式。編譯器與聯結器的作用是,將編寫好的程式檔案最終轉化為EXE檔案。編譯器針對不同的CPU將程式檔案,編譯為對應的CPU指令。連結器是平臺相關的,將編譯後的中間檔案組裝成約定格式,如 Windows ExE。
3.直譯器 對於指令碼語言,直譯器能夠直接執行,文編編輯器編寫完成的程式檔案。如點選上圖的執行。實際是執行了python ./a.py 其中的 python 可以理解為直譯器。
4.偵錯程式 為你提供了一個視覺化的偵錯程式,你可以直接點選按鈕,進行除錯操作,而不是在黑洞洞的命令列上敲命令。
——gdb 除錯介面
5.其他工具外掛 通常會具有整合其他外掛的能力,如整合版本管理。可以直接把你的程式碼上傳雲端,進行版本控制。或者統計分析,寫了多少程式碼,是否編寫規範等。
通過以上對IDE 的介紹可以看出, 程式語言是一種規則,準確的說是一種規範。舉例來說其中可能存在一條, 當你寫了一行printf(hello),之後就在螢幕上顯示hello。所以規則是穩定不變的。而你過程中要到的工具,IDE的各個組成部分都是可以替換的。只要編譯器符合語言的標準規範即可,因此會有多種編譯器存在,其效能特點可能會有一些差異。
廣義的程式語言
想入行的同學經常會說,我想學Java 該怎麼學, 我想學Python該怎麼學。這其實通常來說不太準確。狹義來說,你只需要花幾天,老手可能是幾小時幾十分鐘,去看下這個語言的語法規則,如何定義變數,如何寫判斷,迴圈,如何呼叫方法。然後做一些演算法問題練習,比如對10個數字排排序。寫個猜數字的遊戲,基本就算學會了。但這可能跟你的期望不一致,你說的學Java 可能是覺得你學會了Java 就可以寫出一個像WOW那樣的遊戲 :-),或者像QQ那樣的聊天工具,或者像淘寶那樣的網站,而學會了語言之後你仍然會覺得無從下手,只會在命令列控制檯中做點簡單的輸入輸出。那麼這中間的gap究竟在哪裡呢?是因為——技術棧。
——圖片來源於知乎回答“網際網路”技術棧
就是說,要規範專業的做一個能支援一定訪問量的網際網路站點(如淘寶),會涉及上面大部分的技術內容。這遠超“程式語言”定義的範圍。其中很大一部分是語言無關的,例如運維,工具,中介軟體中的分支內容。其中後端中的語言分支之下是語言相關的,而前端中如果不考慮移動端Android Ios, 對於Web來說其實只有HTML,CSS,Javascript三種語言,angularjs以及VUE,屬於屬於Javasciprt 語言中的不同框架,但差異較大。
綜合以上涉及的語言型別主要分為以下幾類
命令式
關注步驟細節, 如查詢一堆數字中最大的一個, 需要寫迴圈、判斷、 定義變數進行比較,最終得到結果。計算機的演算法過程完全由你定義。通常學習的Java javascrfipt PHP C都可以理解為這一類語言。
結構化查詢——宣告式
多用於結構化資料庫查詢(“資料庫”是為了解決程式儲存,查詢資料問題,想象一個圖書管理程式),SQL語言。 取得最大數字如下, 你並不需要關心它的具體演算法。
SELECT max(num) FROM table
標記語言
HTML,XML,CSS等屬於標記語言,用於定義佈局,沒有邏輯。 嚴格來說不屬於程式語言。如HTML標記語言規定 <Table>表示一個表格 ,其中的<tr>表示表格的一行, 編寫人按照HTML的標準編寫,瀏覽器按照HTML的標準處理渲染, 最終就會在螢幕上顯示一個表格。
回到寫一個淘寶上,淘寶需要有web頁面,所以你要學習HTMLCSS,JS,需要有資料庫儲存商品, 所以需要學習資料庫工具如MYSQL,並能夠程式設計使用他,能夠增刪改查資料。需要有後臺伺服器,用於給頁面提供動態內容, 動態的生成HTML,所以需要學習Web伺服器如何編寫,可以選擇的語言有很多, 如果選擇了一種如Java, 也不需要從頭造輪子, 那就要接著學習Java 的Web框架,如Spring。如果你選擇用PHP語言寫Web伺服器, 那就無法使用Java 的Spring框架了。 對應的PHP也會有自己的Web框架。所以特定語言第三方框架的學習成本才是切換語言的最主要成本。
總結
如果你是想入門學一門語言,那具體學哪種其實真的不算是個重大抉擇,主要是為了建立程式設計思想。
如果你是想進行特定領域的開發, 那你一定要首先搞清楚技術棧, 在該領域中使用的主流語言,工具。然後針對性的學習。如果你志向於開發遊戲客戶端,那學習網際網路的技術棧,就是南轅北轍了。
先到這裡, 希望對初入門的同學能有所幫助。