如何創造一門編程語言?

来源:http://www.cnblogs.com/fanzhidongyzby/archive/2016/08/14/5769045.html
-Advertisement-
Play Games

編程語言,作為人與電腦溝通的橋梁,有著重要和深遠的意義。有過電腦編程經驗的人,多少學習或掌握過一到多種編程語言。電腦專業領域的編程語言成百上千種,主流的編程語言也有數十種之多。每種編程語言面向的領域和特性都不盡相同,不過歸根結底是為瞭解決人與電腦之間溝通的效率問題,提高電腦的生產力。想必有 ...


 

編程語言,作為人與電腦溝通的橋梁,有著重要和深遠的意義。有過電腦編程經驗的人,多少學習或掌握過一到多種編程語言。電腦專業領域的編程語言成百上千種,主流的編程語言也有數十種之多。每種編程語言面向的領域和特性都不盡相同,不過歸根結底是為瞭解決人與電腦之間溝通的效率問題,提高電腦的生產力。想必有不少人對那些主流編程語言的創造者十分傾佩,也相信有不少人會好奇一門編程語言是如何誕生的。那麼如何創造一門編程語言呢?

總的來看,創造一門編程語言需要有以下幾個過程:

1)設計語言的特性。

2)定義語言的單詞、語法和語義。

3)實現編譯器或者解釋器將程式翻譯為電腦底層表示。

4)生成電腦程式的二進位存儲格式。

5)完善語言的運行時環境和標準庫。

 

一、語言特性設計

所謂語言特性,就是編程語言為開發者提供了什麼樣的原子性功能特征。比如是否支持數學表達式計算、字元串處理,是否支持變數、函數和遞歸,是否支持分支、迴圈複合語句等。語言的變數類型是強類型、弱類型,還是動態類型,程式是過程式、函數式,還是面向對象的。是否支持模板、泛型和反射機制,是否支持多線程和併發特性,是否支持錯誤和異常處理機制等等。

語言特性設計是一門編程語言最關鍵的環節,直接決定了語言的基本特征和雛形。當然,這也是最難的一個環節,因為語言設計是面向具體問題領域的,是語言設計者從大量的編程實踐中的獲得的總結和升華。比如C語言設計者希望面向電腦底層,擁有對操作系統和硬體的直接操縱能力。而Python的設計者則希望儘可能地減少操作電腦資源的繁瑣過程,以獲得語言的簡潔性、高度的靈活性和擴展性。SQL的設計者面向具體的數據查詢和分析領域,希望幫助開發者獲得快速檢索和操縱數據的能力。而Go語言的設計者則希望在保留C語言優秀功能的基礎上,擴展編程語言對高併發環境的支持,並擁有垃圾回收和快速編譯的能力。

凡此種種,編程語言特性的設計都是面向具體的問題領域的,是語言設計者構建於開發者和電腦之間的中間層,是對開發過程中重覆功能邏輯的原子性“封裝”,最終的目的是為了提升具體問題領域內的軟體開發效率。

 

二、單詞、語法和語義

和人類使用的自然語言類似,編程語言也有自身的單詞、語法和語義,專業上稱為詞法記號、語言文法和語義。

常見的詞法記號可以分為數字、字元、字元串、標識符、關鍵字,以及用於連接表達式的運算符、分割語句或者程式段落的界符等符號。這些是編程語言程式的基本單位,通過它們的有序組合,構建出了一門編程語言形形色色的代碼片段。

編程語言的文法是用來描述語言的語法規則的,具體來說是規定詞法記號之間的排列組合的順序與規則。它描述了編程語言程式的基本模式,不符合該模式的詞法記號的排列被擋在了合法語言程式的大門之外。同時,它也是各種編程語言對於開發者最明顯的差異化特征。一個有經驗的開發者可以很容易地通過掃視一段代碼,就能分辨出這是哪種編程語言編寫的電腦程式。

編程語言的語義描述了一段符合語言語法的程式,對於電腦而言的真正含義,是開發者最終要傳達給電腦的意願和指令。語言的語義必須是準確的、無二義性的,編譯器也正是通過語義的指導,將電腦程式翻譯為電腦可識別的表達形式。

 

三、程式的翻譯

電腦程式是用來供人閱讀和修改的,電腦硬體並不能理解程式內的思想和含義。因此,必須有一個翻譯轉換的過程,將人所表達的意願準確無誤地傳遞給電腦,讓電腦明確並執行人下發的指令。實現這種翻譯工作的工具就是編譯器或解釋器。

對於編譯器來說,它的輸入是人類書寫的電腦語言程式,輸出則是電腦可識別的底層表示。首先,它需要識別出程式中的單詞,即詞法分析。然後,根據單詞的組合模式識別出程式的語法結構,即語法分析。最後,根據不同的語法結構對應的語義,將程式按照每個語法模塊的形式轉換為電腦可識別的指令序列,即語義分析和目標代碼生成。

眾所周知編譯器的實現具有一定的複雜度,其根本原因來自於語言語法的結構靈活性和電腦底層表達形式的多樣性,這也是創造一門編程語言最核心的環節。

 

四、二進位存儲

編譯器將語言程式翻譯轉換後,需要將轉換後的結果存儲起來,以便電腦在需要的時候將其載入、執行。這裡不可避免的涉及到兩個問題:

1)轉換後的結果是什麼樣的形式?

2)轉換後的結果保存在哪裡?

第一個問題描述的是電腦程式被轉換為怎樣的形式,才是電腦可以識別的。由於電腦中實際運行程式的硬體模塊是CPU,因此電腦程式只有被轉換為CPU的二進位指令格式才能被正確識別、執行。比如常見的Intel體系的CISC指令格式、ARM體系的RISC執行格式等。

第二個問題描述的是電腦程式轉化為二進位指令格式後,以什麼樣的方式保存在電腦的磁碟上。由於絕大多數的電腦程式是需要通過運行在電腦硬體之上的操作系統載入運行的,因此電腦程式的二進位表達形式必須以對應操作系統可識別的文件格式存儲。比如常見的Windows操作系統的PE文件格式、Linux操作系統的ELF文件格式等。

 

五、運行時環境和標準庫

理論上講,一門編程語言如果能提供出完備的操縱操作系統和硬體的原子性功能就已經成功了。但是不提供強大的運行時環境支持和標準庫,是很難讓一門編程語言真正的好用和流行的。沒有人希望簡單地列印一行字元串,還需要使用編程語言提供的基本特性實現調用操作系統提供的列印介面的邏輯。Java語言之所以久興不衰,正是因為它不僅提供了完善的運行時環境和開發庫支持,甚至提供了更強大的開發框架和工具支持。

因此可見,除了完備的語言特性,為開發者提供更方便好用的庫和框架支持,消除軟體構建過程中複雜和重覆的邏輯,才是一門優秀編程語言的長盛之道。

 

六、自己動手,立即開始!

《自己動手構造編譯系統——編譯、彙編與鏈接》一書詳細闡述了一門編程語言從無到有的過程,從語言的功能特性設計,到詞法、文法、語義分析;從編譯器、彙編器的設計實現,到目標文件的鏈接生成可執行文件;甚至編譯優化器的實現、二進位指令、可執行文件格式以及語言運行時和標準庫的概念,都在書中做了認真細緻地剖析。相信對本書的閱讀,將是一次不錯的獲得知識的體驗!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 很久之前就看了有關JavaScript繼承,都沒怎麼總結,剛好今天有空就來聊聊唄 (^o^)/ 通過不斷試驗 來檢驗自己理解的正確性。 首先JavaScript裡面所有的數據類型都是對象(object),其中的new命令引入Javascript,用來從原型對象生成一個實例對象。 (這裡請註意:在Ja ...
  • 這幾天有個工作需求,就是在富文本輸入區域(kindeditor)可以有@功能,能夠容易提示用戶名的(像在qq群組@人一樣)。在網上找了一個叫bootstrap-suggest的插件,卻不能滿足我的需求,於是我決定在該插件上改良,主要是下麵幾點: 1. @內容的輸入,能夠匹配多個屬性值。 2. 選中列 ...
  • PHPMyadmin配置文件config.inc.php內容如下,在需要設置的地方增加了相關註釋。 PHPMyadmin配置文件config.inc.php內容如下,在需要設置的地方增加了相關註釋。 非常適合對資料庫操作命令不熟悉的資料庫管理者,下麵我就說下怎麼安裝該工具: 1.先到網上下載phpm ...
  • 配置 hive 與 hbase 整合的目的是利用 HQL 語法實現對 hbase 資料庫的增刪改查操作,基本原理就是利用兩者本身對外的API介面互相進行通信,兩者通信主要是依靠hive_hbase-handler.jar工具類。 但請註意:使用Hive操作HBase中的表,只是提供了便捷性,前面章節 ...
  • HQL語法基於 SqlLine(http://sqlline.sourceforge.net/),DDL主要包含資料庫、函數、視圖的創建、修改、刪除,參考資料:(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL), ...
  • 源代碼如下: typedef struct _IMAGE_NT_HEADERS { +00h DWORD Signature; // 固定為 0x00004550 根據小端存儲為:"PE.." +04h IMAGE_FILE_HEADER FileHeader; +18h IMAGE_OPTIONA... ...
  • ...
  • 我們可以為自己訂製個性化的命令行提示符,Linux系統提示符是用系統變數PS1來定義的,只要按規則修改PS1系統變數的值隨意修改命令行提示符。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...