所謂計算機語言只是一個抽象的規范,而編譯器是這個規范的實現,它是在這個規范的嚴格定義下被實現的.
說的通俗一點,語言就像一份制造汽車的圖紙,他規定了
汽車應該有什么,擁有什么功能,等等各個方面,而編譯器就是一量根據這張圖紙制造出來的汽車,它實現了圖紙的定義,這樣你才能真正的使用這量汽車.
如果你有OOP的方面的知識,那可以把語言和編譯器比喻成類和對象的關系.
他們誰也離不開誰,只有兩部分共同合作,你才能使用這個語言.
學習一門語言大概會經歷如下幾步。
基本語法
學習任何東西,都是一個由表及里的過程。學習一門編程語言也一樣。對于一門編程語言來說,表就是基本語法。
對于基礎語法的學習,我喜歡看一些簡短而又系統的教程。一般這些教程標題很有特色。如,X天學會X語言。一門語言要學習的東西其實很多的,這類文章一般會把常用的基本語法總結提煉。
技巧和坑
雖然絕大部分語言的語法都差不多。但是,語言之間語法還是有差異的。如果都這些差異不了解,而是套用以前的經驗,很可能掉到坑里面。比如==在PHP和Java中的含義并不是完全一致。
如何避免坑,或者掌握需要特有的技巧?我通常會從兩個途徑下手。第一,看一些面試題之類的文章。第二,看一些優秀的源代碼。如一些框架的代碼。在看代碼的過程中,你會發現一些新的語法,使用技巧等。
系統學習
基礎語法學習,能讓你快速上手,應用實踐。對技巧和坑的關注,一定程度上拓展了你的知識面。系統學習,一方面會進一步拓展你的知識面。另一方面,也有利于你語言知識結構的形成。
找幾本系統講解這門語言的書,認真學習。我在學PHP的時候,曾經認真看過PHP手冊??赐曛螅苡惺斋@。
語法之外
任何一門成熟語言,都有其特有的生態。這個生態包括,框架,擴展包,解決方案,規范等。除了學習語法之外,這些東西也是需要學習的。這些我一般都是碰到了才去學。
如果還有精力,我還會去學習下語言更底層的東西。而不僅僅停留在應用層面。如jvm是如何執行java代碼的。java的線程和操作系統線程的關系。以及一些操作系統方面的知識。
動手練兵
對于發現的新的語法或者技巧,建議大家親手實踐一次。有些文章已經很老了。實踐的目的,一是檢驗是否正確。另外就是加深印象。正所謂,紙上得來終覺淺。
有些人會困惑,每天工作都是數據庫的curd操作。如何把學到的東西應用到實踐中?我的解決方法是,自己業余時間搞一些小項目,把學到的知識應用進入。我當初寫kvproxy的時候,沒人要求我去寫。我只是感覺搞這個能鍛煉技術,又能解決一些問題。
掌握基礎,持續練習
每一門編程語言的學習內容都會涉及:基礎運行環境、數據類型(數字、字符串、數組、集合、字典等)、表達式、函數、流程控制、類、方法等等,不同的語言還有一些不同的特性,這些內容并不復雜,盡快通過大量的練習擊倒它們,然后再去深入了解面向對象、并發、異常、文件與目錄、網絡、標準庫等內容,并輔以持續的練習,這些內容才能夠讓你真正進入編程領域并做出實際的軟件。
學習一門新的語言的時候,要利用以前所學的語言的功底,但是也要保持開放的心態。
編程語言是怎么設計出來的?
編程語言設計是在紙上完成的。你需要決定兩個東西:
語義
文法
是用更底層的語言來寫?匯編?那匯編是怎么設計出來的?
這是說編譯器的實現?,F代編譯器都是用高級語言寫成的,它做的事情是把你的語言翻譯成機器代碼|字節碼|其他任何東西。甚至很多語言的編譯器是用自己寫成的——只要你有一個其他語言寫的編譯器來讓這個自解釋循環啟動起來。
編程語言不過是一系列的預定義語法而已。至于說語言設計的原則,就是必須滿足圖靈完備的這個特征的,只要有圖靈完備這個特性,這門語言從理論上來說就能夠表達任何一個可計算的問題,因此就能夠被我們用于描述問題的解的算法。
但是計算機不能夠直接理解我們設計的語法,因此我們需要根據我們(編程語言的設計者)和你(語言使用者)之前約定的語法,將編程語言轉換成可直接理解的匯編指令。
所謂轉換,實際上就是降低抽象的層次。比如你現在使用*p = 0;這么一個指令,但是他的抽象層次過高,計算機不理解,因此我們需要將它具體化為:mov eax, p mov [eax], 0這么兩條具體的指令。這兩條指令的語義則處在CPU能夠理解的層級,而他們的語義實際上是由CPU內部的門電路提供實現的。
至于說匯編語言,同高級語言一樣是被設計出來的。CPU的制造者根據自家CPU能夠執行的操作,制定了一套語法用于表示這些操作。這樣你就能通過匯編語言指示機器按照你的意圖工作了(執行生產商預定義好的操作)。
=====================
至于編程語言用神馬來寫,我估計你的問題應該是編譯器是用什么來寫?
這個問題的話答案是先有雞還是先有蛋的問題。我們有研究過編譯器歷史,不過我相信第一款有編譯器功能的軟件肯定是匯編實現的。不過現在的編譯器你編譯的話,由于編譯器已經存在了,所以一般都用c。