[翻譯]編譯器(4)-語言設計

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

原文在此。另外推薦閱讀王大師的“設計和開發 Yin 語言”,你會看到另一個完全不同的語言設計思路。
————翻譯分隔線————

編譯器(4)-語言設計

第一部分:介紹
第二部分:編譯、轉譯和解釋
第三部分:編譯器設計概覽

在第一部分概述了這一系列文章將介紹的內容。在第二、三部分粗略的瀏覽了電腦語言編譯的各個步驟。

在本文中,將會比上幾篇概述介紹的內容略微詳細一些。我將討論語言的規格說明書。

語言設計概述

我剛剛是不是說我將不再進行太多的概述?一轉身,我就變成了一個卑鄙無恥的騙子。

為了讓我們更快的進入編碼階段,我已經盡量簡明扼要的進行介紹。同時我也希望明確一點,這是一個非常不完善的語言設計。電腦語言設計是一個你可以為之奮鬥一生的話題。我無法為你提供在 Calc 用到的支撐設計的理論。我不會對此進行探討。

事實上,我只會告訴你語言規格說明書是什麼。

我得承認 Calc 算不上一個真正的程式設計語言。它的出發點是構建一個基礎的用於教學的編譯器,並且作為 Calc 的未來版本的基石,在將來的系列博文中使用。

語言設計很難,非常難。說“我想要這個特性,那個特性,和另外那些特性。”很容易。為什嗎?用於什麼目的?如何讓它匹配設計?它會讓使用者迷惑嗎?是否有必要?誰是你的目標使用者,還有他們想要或者需要這個特性嗎?

迴圈

即使有豐富的經驗,這些也不是容易回答的問題。有一些特性,例如迴圈結構,看起來似乎不需要怎麼思考,但是真得是這樣?來看看最常見的兩種迴圈結構:for 和 while。

幾乎所有的電腦語言都設計了一些用於迴圈的方法,不論是用於跳轉的 goto 語句還是很常見的 for 和 while 迴圈。遞迴是另一種樣式的迴圈。不過最流行的應當是 for 和 while 了。

第一個問題,首先是:為什嗎?

好吧,我們想要重複一些動作。OK,相當簡單。

for 和 while 都需要一個允出準則來完成。通常這些條件是與邏輯 true 和 false 關聯的。兩種不同的編寫方式:

while(condition) do { action }

for (start; condition; increment) do { action }

為什嗎?在最初的時候,我想這些迴圈的的邏輯是出於不同的考慮。然而 Go 開發人員看到了兩種結構中的共性,並問了自己這個問題:“為什嗎?”

為什麼要有兩種關鍵字,兩個保留字來實現一個本質上一樣的事情?用一種迴圈結構和唯一的保留字來取代這兩個,雖然可能在分析的時候會更複雜,但是對於終端使用者來說不是更好嗎?

Go 開發人員選擇了更短的那個作為關鍵字。我還覺得這個選擇直覺大於理論支撐。“for (條件) do { 操作 }”很直觀。通過向一個我們已經逆來順受很久的簡單的認知,瞬間,我們的語言變得簡單和清晰。當一個就能滿足,誰還會用兩個呢?

取捨

總是會有取捨。複雜或是簡單。速度或是便利。

迴圈的決策所帶來的成本是在解析時稍稍複雜了一些。開發人員有意識選擇讓 for 語句解析更加困難來為程式員提供生產力上的巨大的改進。

泛型是一個熱門話題。Go 並未提供任何關於泛型的特性。為什嗎?

泛型僅僅是一種取捨,並且我無法向你解釋清楚。你最好是在 golang 的郵件清單裡做一些研究,並看一下 FAQ。

最終結果是你需要決定你需要什麼。你是想要一個簡潔並且平凡的語言,還是一個複雜的,可以做任何事情的語言?為什麼你做了這樣的選擇?

一個特性也出現在其他語言中並不意味著它必須存在。while 迴圈就是相當好的例子。

在 Go 中,switch 比它在像 C 這樣的語言中的功能豐富得多。基本觀點是在無須讓程式員增加太多認知複雜度的前提下提供強有力的功能。

類型系統

動態或靜態?強型別還是弱類型?直白還是隱含?

個人來說,我更喜歡強型別、靜態語言。我希望在無須額外任何操作,就能確定我得到的就是我想要的。

一個類型能夠或者應該轉換嗎?一個浮點數能是一個整數嗎?一個字元能是浮點嗎?字串是什嗎?

在數組上進行邊界檢查?slice 呢?

指標還是可取地址的變數?變數是引用傳遞還是值傳遞?

就像我說過的,一些看起來很簡單的東西可以非常非常快的變複雜。

總結

我突然對許多語言都充滿的尊敬。誠實來說,我不喜歡 Java。我瞭解它的威力,但是用它寫代碼感覺就像是跟驢子一起編程。雖然這樣說,但是我不得不佩服設計者。我欽佩他們已經做到並完成的。我不得不欽佩這可能是最好的、或者說唯一的做法,回頭路永遠都是個懷主意。Java 工作良好,並且無數程式員在使用它。你不得不對此表示敬意。

你可能會做一個糟糕的設計選擇,無論你認為你有多聰明。從 2011 年初,當我對 Go 語言關注開始,我就加入了 Go 郵件清單,並且見證了這個語言演化發展直到 1.0 發布。曾經許多圍繞著語言設計的爭論,將來也會持續下去。語言設計是相當困難的,而你的決策不會讓每個人都開心。

就如我之前說的,語言設計是一個巨大的話題。我認為,許多語言成為取悅所有人的受害者。它們的工具箱已經滿得溢了出來。其他一些語言划了一條不可逾越的底線,即使面對壓倒性的證據證明其必要性的時候。這兩種策略將使用者踢走了。

你需要決定選擇哪個陣營以及為什麼這麼選擇。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.