对高级程序设计语言的基本理解
各位看官抱歉,因為域名備案出現了一點小插曲,原定計劃Typora調教和七牛云圖床的相關內容可能要拖到周末進行。
我是在大學期間開始接觸編程,但是學習的第一門程序設計語言是C語言,但是當時只是簡單的學習,能用C語言寫一些簡單的控制臺程序,所以當時對于程序設計來說只是一種玩票性質。
后來也進過實驗室,玩過單片機,還接觸過匯編,但是最終都沒有走下去。
到大四下學期的時候由于畢業設計和工作的需要,開始接觸JavaWeb,從此踏上了一條不歸路,所以從這個意義上來說Java才是我在編程世界的母語。
從剛開始懵懂地照著葫蘆畫瓢,到現在接觸Java一年半左右的時間,對于一些高級程序設計語言中的基本概念有了一些理解,雖然不知道理解的是否正確,但是還是想記錄下來,留待以后進行驗證(目前我也在積極的學習JS相關的技術棧,而且計劃明年年初的時候學習一下kotlin語言)。
(想自學習編程的小伙伴請搜索圈T社區,更多行業相關資訊更有行業相關免費視頻教程。完全免費哦!)
我們編寫的代碼是什么
我們平常使用高級程序設計語言編寫的程序代碼,其實就是一個文本文件,而每種程序設計語言的文本文件都有自己的擴展名,比如Java程序的源代碼文件的擴展名是.java,JavaScript程序的源代碼文件的擴展名是.js
文件的擴展名是什么呢?文件是用來存儲數據的,而數據要存儲到計算機中肯定要進行編碼,那么我們就可以把文件的擴展名理解成一種“協議”,如果一個文件采用某個擴展名,就相當于這個文件遵循了某個協議,就可以被支持這種數據協議的應用程序讀取、解析并處理。當然用不支持這種協議的應用程序也能夠打開這個文件,但是得到的往往是亂碼。
但是程序源代碼還有所不同,高級程序設計語言的源代碼其本質上還是一個純文本文件,我們可以用任何一個編輯器打開并查看,而采用特定的擴展名其實是告訴這門高級程序設計語言的編譯器,這個文件中的文本遵循了對應的程序設計語言的語法和規范,可以被編譯器進行編譯。
關鍵字、標識符和字面量
高級程序設計語言的源代碼文件本質上是一個純文本文件,而純文本文件對于人類來說其實就是一個大字符串,而高級程序設計語言的編譯器在對源代碼進行編譯的時候其實也是在處理一個大的字符串,它會根據特定的規則(主要依靠程序語言中定義的關鍵字)將源代碼的文本映射成一棵抽象語法樹(這里不做過多介紹,關鍵是本人還沒有過多接觸編譯原理的相關知識),反正是一頓操作之后,代碼就能運行了(認真臉)。
而從人類信息文明的發展來看,從剛產生文字到現在為止,人類進行信息記錄和傳遞的方式都是使用“字符串”,而計算機程序的運行是進行數據的處理,我們要向代碼中傳入數據,然后從代碼中接收處理之后的數據;而數據的來源是人類,那么我們可以比較確定的說,計算機程序的最終來源是人類提供的字符串。
就算是java中的Date這種對象的數據的最終來源也是一個代表了數字的字符串(時間戳)。
高級程序設計語言的**源代碼本身就是一個字符串,那我們怎么向一個字符串中傳遞數據呢?這就要依靠高級程序設計語言為我們提供的字面量機制了。**高級編程語言中通過使用界定符、特殊格式、關鍵字等手段為我們提供字面量機制。
在程序設計語言中,字面量常常被分為三類:
- 字符串,但是因為代碼本身就是字符串,通常會使用界定符比如""來區分是字面量還是程序代碼
-數字,其實就是具有特定格式的字符串,因為其格式特殊,所以不需要界定符 - 邏輯值,true或者false,大部分程序設計語言中都把true和false作為關鍵字。
思考
以上是摘自《瘋狂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…),而高級程序設計語言的發展又依賴于編譯技術等底層技術的發展,這里不進行過多的介紹。
以上的理解均是個人經驗和理解,如有不同的看法歡迎留言進行討論
總結
以上是生活随笔為你收集整理的对高级程序设计语言的基本理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工作计划进度甘特图.xlsx
- 下一篇: 数字图像处理