對高級程序設計語言的基本理解

我是在大學期間開始接觸編程,可是學習的第一門程序設計語言是C語言,可是當時只是簡單的學習,能用C語言寫一些簡單的控制檯程序,因此當時對於程序設計來講只是一種玩票性質。java

後來也進過實驗室,玩過單片機,還接觸過彙編,可是最終都沒有走下去。數據庫

到大四下學期的時候因爲畢業設計和工做的須要,開始接觸JavaWeb,今後踏上了一條不歸路,因此從這個意義上來講Java纔是我在編程世界的母語。編程

從剛開始懵懂地照着葫蘆畫瓢,到如今接觸Java一年半左右的時間,對於一些高級程序設計語言中的基本概念有了一些理解,雖然不知道理解的是否正確,可是仍是想記錄下來,留待之後進行驗證(目前我也在積極的學習JS相關的技術棧,並且計劃明年年初的時候學習一下kotlin語言)。瀏覽器

咱們編寫的代碼是什麼

咱們日常使用高級程序設計語言編寫的程序代碼,其實就是一個文本文件,而每種程序設計語言的文本文件都有本身的擴展名,好比Java程序的源代碼文件的擴展名是.java,JavaScript程序的源代碼文件的擴展名是.js編程語言

文件的擴展名是什麼呢?文件是用來存儲數據的,而數據要存儲到計算機中確定要進行編碼,那麼咱們就能夠把文件的擴展名理解成一種「協議」,若是一個文件採用某個擴展名,就至關於這個文件遵循了某個協議,就能夠被支持這種數據協議的應用程序讀取、解析並處理。固然用不支持這種協議的應用程序也可以打開這個文件,可是獲得的每每是亂碼。編輯器

可是程序源代碼還有所不一樣,高級程序設計語言的源代碼其本質上仍是一個純文本文件,咱們能夠用任何一個編輯器打開並查看,而採用特定的擴展名實際上是告訴這門高級程序設計語言的編譯器,這個文件中的文本遵循了對應的程序設計語言的語法和規範,能夠被編譯器進行編譯。學習

關鍵字、標識符和字面量

高級程序設計語言的源代碼文件本質上是一個純文本文件,而純文本文件對於人類來講其實就是一個大字符串,而高級程序設計語言的編譯器在對源代碼進行編譯的時候其實也是在處理一個大的字符串,它會根據特定的規則(主要依靠程序語言中定義的關鍵字)將源代碼的文本映射成一棵抽象語法樹(這裏不作過多介紹,關鍵是本人尚未過多接觸編譯原理的相關知識),反正是一頓操做以後,代碼就能運行了(認真臉)。編碼

而從人類信息文明的發展來看,從剛產生文字到如今爲止,人類進行信息記錄和傳遞的方式都是使用「字符串」,而計算機程序的運行是進行數據的處理,咱們要向代碼中傳入數據,而後從代碼中接收處理以後的數據;而數據的來源是人類,那麼咱們能夠比較肯定的說,計算機程序的最終來源是人類提供的字符串。操作系統

就算是java中的Date這種對象的數據的最終來源也是一個表明了數字的字符串(時間戳)。設計

高級程序設計語言的源代碼自己就是一個字符串,那咱們怎麼向一個字符串中傳遞數據呢?這就要依靠高級程序設計語言爲咱們提供的字面量機制了。高級編程語言中經過使用界定符、特殊格式、關鍵字等手段爲咱們提供字面量機制。

在程序設計語言中,字面量經常被分爲三類:

  • 字符串,可是由於代碼自己就是字符串,一般會使用界定符好比""來區分是字面量仍是程序代碼
  • 數字,其實就是具備特定格式的字符串,由於其格式特殊,因此不須要界定符
  • 邏輯值,true或者false,大部分程序設計語言中都把true和false做爲關鍵字。

思考

  1. 標識符能夠由字母、數字、下劃線、$組成,其中數字不能打頭
  2. 標識符不能是java的關鍵字和保留字
  3. 標識符不能包含空格
  4. 標識符只能包含美圓符號($),而不能包含諸如@、#等其餘特殊符號(@、#等專門在java編譯器自動生成的代碼中使用,以進行區分)

以上是摘自《瘋狂java講義》P48中的java標識符的命名規則,其實大部分的程序設計語言的標識符命名規則都是相似的,如今咱們來討論爲何標識符能夠包含數字可是不能用數字打頭。

上面在介紹字面量的時候提到,數字字面量不須要界定符,也就是編譯器在對代碼進行編譯的時候若是遇到純數字字符串就認爲這是一個數字,注意,數字字面量沒有界定符,也就是說數字字面量是直接嵌入到代碼中的,編譯器對數字字面量的識別僅僅是「這是一個表明數字的字符串」。假如說,標識符的命名規則沒有數字不能打頭這一說,那麼像a=1+b這句代碼中,1是一個標識符仍是一個數字字面量?同時就算是限定標識符不能是純字符字符串也是行不通的,就拿java來講,123L這是一個數字字面量值,若是放開數字不能打頭的限制,對於標識符的解析成本和難度將會大大增長,而對於一門高級程序設計語言來講,對標識符的解析是一個很是頻繁的操做,而限制標識符不能以數字打頭不會對咱們的程序編寫形成任何影響,因此標識符名稱不能以數字打頭無疑是最佳的解決方案。

說到這裏我又忍不住提到Java中的int和long的字面量,java中的整形字面量支持四種進制:

  • 二進制 以 0b 或者 0B 打頭
  • 八進制 以 0 打頭 這一點須要特別注意
  • 十進制 默認進制,可是須要注意不要以0打頭
  • 十六進制 以 0x 或者 0X 打頭

發現了沒有,各類進制仍是以數字打頭,也就是說在java中只要遇到以數字打頭且沒有界定符的「標識符」java就認爲這是一個數字字面量。

數據類型、操做符和變量

數據類型、操做符和變量能夠說是每一門高級程序設計語言的最基本的構件,並且咱們平常的編碼中很大一部分就是在跟這三者打交道,高級程序設計語言經過這三個基礎構件讓咱們以比較接近天然語言的方式書寫程序代碼,例如a=b+c這樣的代碼相信每一個開發人員都寫過,不論你使用的是哪一門高級程序設計語言,這樣的表達式都是很是常見的;這也使得高級程序設計語言的語義更加明確,代碼更加易寫。

可是咱們在使用高級程序設計語言給咱們提供的這些數據類型、操做符和變量的時候,高級程序設計語言到底問咱們作了什麼事情呢。

在個人理解中,數據類型、操做符以及變量其實就是高級程序設計語言爲咱們封裝的一系列內存操做,好比在32位的計算機系統中,若是直接使用匯編咱們須要本身對內存進行尋址,同時將數據加載到一個寄存器中,而後再用相應的彙編指令讓CPU對咱們加載到寄存器中的數據進行運算;而在高級程序設計語言中,這一系列的操做被一個簡單的表達式a=b+c完成,其中的a、b、c在這裏是變量(固然一個表達式中也能夠存在字面量值)幫助咱們完成了尋址的操做,同時變量所具備的數據類型規定操做的內存的大小和內存中數據的解釋方式,操做符規定了對這些數據進行的操做。

對以上的理解稍微總結一下,在高級程序設計語言中:

  • 變量實際上是引用了一個內存地址,它幫助咱們完成對內存的尋址操做。
  • 數據類型定義了對應的變量所要操做的內存的長度,以及對內存中數據的解釋方式。
  • 操做符定義了要對對應的變量指向的內存地址中對應長度的數據進行的操做。

這樣,開發人員就從底層硬件中解脫了出來,讓咱們更加關注於程序的邏輯。

固然,如今不少的程序設計語言是運行在某個平臺(宿主環境,能夠是操做系統,也能夠是其餘的應用程序,好比JavaScript是運行在瀏覽器中的;SQL是運行在數據庫管理系統中的;Java是運行在JVM中的,而JVM又是運行在操做系統中的;etc...),而高級程序設計語言的發展又依賴於編譯技術等底層技術的發展,這裏不進行過多的介紹。

以上的理解均是我的經驗和理解,若有不一樣的見解歡迎留言進行討論

相關文章
相關標籤/搜索