(用Malbolge編寫的Hello, World示例)
Malbolge以其非傳統(tǒng)的設(shè)計(jì)理念,打破了編程語言的常規(guī)語法規(guī)則。
在Malbolge的世界里,指令執(zhí)行的隨機(jī)性和代碼的加密特性是其顯著標(biāo)志。它采用獨(dú)特的三進(jìn)制系統(tǒng),僅識別三個(gè)寄存器,并且解釋器會(huì)用空數(shù)據(jù)自動(dòng)填充未使用的內(nèi)存區(qū)域。
這些因素共同塑造了Malbolge這一門復(fù)雜至極、幾乎無法手工編程的語言。迄今為止,只有極少數(shù)程序是使用Malbolge編寫的,且這些程序的編寫幾乎完全依賴于計(jì)算機(jī)輔助。
(用WhiteSpace編寫的Hello, World示例)
WhiteSpace是一種獨(dú)特的編程語言,其核心設(shè)計(jì)理念是僅使用空格、制表符和換行符來構(gòu)建代碼,不同的字符序列在這里代表著不同的指令。
這種語言的特點(diǎn)是忽略所有可見字符,只有那些不可見的字符才具有實(shí)際的指令功能,非常適合希望在代碼中隱藏信息的用戶。
在WhiteSpace中,所有文本內(nèi)容默認(rèn)為注釋,直到被特定的不可見字符序列觸發(fā)執(zhí)行。
(用Ook!編寫的Hello, World示例)
Ook!是一種極簡主義的編程語言,它將編程語法簡化至極致,僅使用“Ook”、“Ook!”和“Ook?”三種元素的不同組合來構(gòu)成命令。
盡管看似簡單,但使用Ook!進(jìn)行編碼實(shí)際上是一個(gè)挑戰(zhàn)。Ook!的設(shè)計(jì)理念是如此簡潔,以至于創(chuàng)造者認(rèn)為連猩猩也能學(xué)會(huì),因此認(rèn)為無需程序注釋。
(用Chef編寫的Hello, World示例)
Chef是一種將編程與烹飪藝術(shù)巧妙結(jié)合的語言。
在Chef中,每個(gè)程序都被視為一道食譜,包括成分列表及其數(shù)值,以及烹飪步驟即編程指令。所有變量都以食材的名字命名,使得Chef直觀且富有趣味性。
Chef不僅功能強(qiáng)大,能夠處理復(fù)雜的編程任務(wù),還為熱愛烹飪的程序員提供了額外的樂趣。
(用Piet編寫的Hello, World示例)
Piet是一種獨(dú)特的編程語言,通過顏色塊的組合來表達(dá)程序邏輯。這種語言包含20種不同亮度級別的顏色,每種顏色都有其特定的功能。
編譯器通過識別顏色塊之間的亮度差異來解析指令。程序的結(jié)構(gòu)由顏色塊的形狀和組織方式?jīng)Q定,黑色或白色的邊界用來分隔不同的代碼塊。
盡管在Piet上編寫程序是可行的,但由于不同的解釋器可能有不同的顏色解讀,它更適合于探索和藝術(shù)創(chuàng)作。
LolCode是一種基于互聯(lián)網(wǎng)俚語的編程語言,其語法結(jié)構(gòu)簡單直觀,易于學(xué)習(xí)。
這種語言雖然看似是對傳統(tǒng)編程語言的幽默模仿,主要用于娛樂和教育目的,但對于那些希望以輕松愉快的方式入門編程的人來說,它提供了一個(gè)有趣的選擇。
ArnoldC的設(shè)計(jì)靈感來源于阿諾德·施瓦辛格的電影臺(tái)詞,使用施瓦辛格的經(jīng)典臺(tái)詞來表示編程指令。
雖然ArnoldC并不實(shí)用,但它通過將編程與流行文化相結(jié)合,提供了一種富有創(chuàng)意的編程體驗(yàn)。
這種語言支持循環(huán)、邏輯運(yùn)算和函數(shù)等基本編程結(jié)構(gòu),為終結(jié)者系列電影的粉絲們提供了一種全新的互動(dòng)方式。
Java2k是一種以概率原理為核心的編程語言,其特點(diǎn)是程序中的任何事情都不具有確定性。
這種語言的內(nèi)置函數(shù)可能不會(huì)按預(yù)期工作,甚至可能產(chǎn)生完全不可預(yù)見的結(jié)果,使得每次運(yùn)行程序時(shí)都可能表現(xiàn)出不同的行為。
因此,Java2k編寫的程序在每次執(zhí)行時(shí)都可能呈現(xiàn)出不同的結(jié)果,這一點(diǎn)與量子計(jì)算中基于概率確定正確答案的理念相仿。
雖然用Java2k編寫一個(gè)‘Hello, World’程序本身很簡單,但程序的具體輸出結(jié)果卻充滿了不確定性。
(用Velato編寫的Hello, World示例)
Velato是一種創(chuàng)新的編程語言,它允許開發(fā)者通過音樂來編寫代碼。這種語言通過分析MIDI文件來讀取源代碼,讓你可以在創(chuàng)作旋律的同時(shí)編寫程序。
Velato通過分析音符的序列、間隔和音調(diào)(這些相當(dāng)于編程中的字母)來解釋代碼。雖然它能夠處理基本的編程元素,例如表達(dá)式、數(shù)字和變量聲明,但目前還不支持函數(shù)和數(shù)組。
此外,Velato 并不適用于將實(shí)際的音樂作品轉(zhuǎn)換成具有實(shí)際功能的程序。
(用Velato編寫的Hello, World示例)
Intercal是一種歷史悠久的編程語言,以其反直覺的思想和非常規(guī)邏輯而聞名,使得其他人很難理解其代碼。
這種語言強(qiáng)調(diào)編程中的禮儀,比如適當(dāng)?shù)厥褂谩罢垺弊謽觼肀苊饩幾g器因?yàn)榇a不夠禮貌或過于正式而報(bào)錯(cuò)。
代碼中“Please”的使用過少或過多都會(huì)使編譯器提示代碼不夠禮貌或過于正式。
這些編程語言主要是為了娛樂或探索而設(shè)計(jì),并不適用于開發(fā)嚴(yán)肅的應(yīng)用程序。
在開發(fā)需要穩(wěn)定性、容錯(cuò)能力和功能性的項(xiàng)目時(shí),我們還是會(huì)優(yōu)先選擇如C++、Go、JavaScript和Python等成熟的編程語言。
手在開始學(xué)習(xí)編程時(shí)通常會(huì)問這個(gè)問題:
“我要從哪一門編程語言開始學(xué)起?”
在學(xué)會(huì)了幾門編程語言之后,很多開發(fā)者會(huì)問這個(gè)問題:
“哪一門編程語言是最好的?”
我將會(huì)在這篇文章里給出我的答案。不過,比得到答案更重要的是:掌握學(xué)習(xí)新編程語言的能力。
對于一個(gè)編程老手來說,學(xué)習(xí)新的編程語言應(yīng)該很容易。他們只需要一個(gè)周末甚至是幾個(gè)小時(shí)就可以開始用新學(xué)的編程語言寫代碼了。優(yōu)秀的程序員可以為了完成某個(gè)任務(wù)使用任何一門編程語言。畢竟,編程語言只是工具。
話是沒錯(cuò),不過更重要的你要學(xué)會(huì)“如何學(xué)習(xí)新的編程語言”,而不只是學(xué)會(huì)某一門具體的語言。要掌握“學(xué)會(huì)所有編程語言”的能力,你不需要是一個(gè)天才,你要做的是掌握編程語言的核心知識,并知道所以,代碼實(shí)際上就是你傳達(dá)給人類和計(jì)算機(jī)的“消息”。這也是在設(shè)計(jì)和實(shí)現(xiàn)編程語言時(shí)需要考慮的權(quán)衡點(diǎn)。因?yàn)椋阂恍┳罴褜?shí)踐。
下面讓我來具體解釋一下。
要記住,編程語言只是工具,它們也是由程序員發(fā)明出來的。世界上有幾千種編程語言,其中只有 20 多種在 IT 界里被廣泛使用。如果你稍微想一想,就會(huì)發(fā)現(xiàn)這些編程語言有一些共同點(diǎn)。
我們以汽車為例,世界上有很牌子的汽車。有些車子緊湊但動(dòng)力十足,有些車子笨重開得慢,不同牌子的車子具有不同的駕駛體驗(yàn)。
如果你知道怎么開其中一種車型,也就知道怎么開其他大部分車型,盡管它們的牌子不一樣。
為什么這么說呢?因?yàn)椴煌谱拥能囎佑幸恍┕餐c(diǎn)——它們都有發(fā)動(dòng)機(jī)和輪胎。它們的作用都是一樣的:把你送到目的地。
編程語言的作用是幫助程序員表達(dá)想法。
編程語言是一種表達(dá)工具,包含了兩個(gè)方面:
所以,代碼實(shí)際上就是你傳達(dá)給人類和計(jì)算機(jī)的“消息”。這也是在設(shè)計(jì)和實(shí)現(xiàn)編程語言時(shí)需要考慮的權(quán)衡點(diǎn)。因?yàn)椋?/p>
不同的編程語言有不同的語法和特性,但它們都是圖靈完備的。通俗地說就是:所有的編程語言都可以用來實(shí)現(xiàn)任意一種算法。
當(dāng)然,你不需要學(xué)會(huì)所有的編程語言,但學(xué)會(huì)的編程語言越多,就越容易為要完成的任務(wù)選擇合適的語言。
幾乎所有的編程語言都包含了幾類元素,它們都與“抽象”有關(guān):
編程語言有很多公共特性,因此,我們能夠?qū)W會(huì)所有編程語言的主要原因是:編程語言的概念其實(shí)是很有限的。常用的編程語言概念不會(huì)超過 15 個(gè):
編程語言的概念基本上是不怎么變的,就像設(shè)計(jì)原則一樣。
編程語言的作者們相互借鑒想法,只是實(shí)現(xiàn)不一樣罷了。有時(shí)候,我們可以說語言 C 是語言 A 和 B 的兒子,那么整個(gè)編程語言的家譜可能像這樣:
理解好這些概念,不僅可以幫你快速學(xué)會(huì)編程語言,還會(huì)讓你寫出更好的代碼。例如,函數(shù)式編程語言和過程式編程語言的代碼風(fēng)格和抽象方式是非常不一樣的,如果沒有領(lǐng)會(huì)到它的重點(diǎn),可能就寫不好代碼。
因此,我們要學(xué)習(xí)編程語言概念,但該怎么學(xué)呢?
我建議去了解某個(gè)語言概念或特性要解決的問題是什么,它有哪些好處和不足,而且最好可以知道它是怎么實(shí)現(xiàn)的。
我們以 GC 為例,那么第一問題就是:GC 是什么東西?
在網(wǎng)上搜一下,可以找到這個(gè)維基百科的解釋。GC 是用來解決內(nèi)存管理問題的,可以減少程序的內(nèi)存錯(cuò)誤。有了 GC,代碼寫起來更容易了,因?yàn)槲覀儾恍枰謩?dòng)管理內(nèi)存,但這是以犧牲性能為代價(jià)的。如果你的編程語言使用了 GC,要注意 GC 是如何幫你處理內(nèi)存的。
隨后,你需要知道 GC 的工作原理。它們使用了什么算法?GC 有很多種,而且它們的種類還在不斷發(fā)展演化中。
開始學(xué)習(xí)新的編程語言正是學(xué)習(xí)編程語言概念的一個(gè)好時(shí)機(jī)。例如,如果 Ruby 是你的第一門面向?qū)ο缶幊陶Z言,就可以借這個(gè)機(jī)會(huì)深入了解一下面向?qū)ο缶幊痰膬?yōu)點(diǎn)和不足。
對面向?qū)ο缶幊逃辛撕芎玫睦斫猓偃W(xué)習(xí)其他面向?qū)ο缶幊陶Z言就會(huì)容易得多。
如果語法不是很復(fù)雜,要實(shí)現(xiàn)一門編程語言并不需要做太多工作。可以看看這個(gè)項(xiàng)目,任何一門語言都可以被用來實(shí)現(xiàn) Lisp。 8cc 是 C 語言的一個(gè)編譯器,如果你想自己寫一個(gè)編譯器,可以參考這個(gè)項(xiàng)目。
除了這些,還有一些書可以看:
《編程語言要領(lǐng)》介紹了很多種解釋器,《編程語言編譯器實(shí)踐》也是一本適合用來學(xué)習(xí)編程語言的書。
如果你遵循以下這些步驟,就可以快速“學(xué)會(huì)所有的編程語言”。
第一步:理解這門語言的設(shè)計(jì)理念和通用的語言特性
例如,如果你要學(xué) Ruby,那就先看一下 Ruby 有什么特別的?
Ruby 是一門開源的動(dòng)態(tài)編程語言,專注易用性和效率。它的語法很優(yōu)雅,代碼讀起來很自然,寫起來也很自然。
讓我們更深入地看一下:
http://www.ruby-lang.org/en/about/
那么,在學(xué)習(xí) Ruby 之前,需要了解的重點(diǎn)是:
了解這門語言最重要的特性,包括它的優(yōu)點(diǎn)和不足。
第二步:通過教程或書籍學(xué)習(xí)語法和最佳實(shí)踐
在第二步,你需要掌握語法、基本的 IO、調(diào)試工具和單元測試。
如果你剛開始學(xué)習(xí)編程,最好找那種“權(quán)威指南”之類的書籍,比如語言作者寫的書,或者在網(wǎng)上書店搜索這門編程語言,找到好評如潮的書。
如果你是個(gè)編程老手,只需要找一些簡單的指南或示例代碼就可以了,可以看看這個(gè)。
記住,在學(xué)習(xí)語法時(shí),你需要?jiǎng)邮謱懘a,不要只是拷貝黏貼。你可以在這個(gè)網(wǎng)站上練習(xí)寫代碼,有人會(huì)審閱你的代碼,并免費(fèi)為你提供建議。
第三步:使用新學(xué)的語言寫更多的代碼
現(xiàn)在,你需要使用新學(xué)的語言開始一個(gè)項(xiàng)目,包括與這門語言有關(guān)的生態(tài)系統(tǒng)、工具和庫。你可以從簡單的開始,比如一個(gè)猜數(shù)字小游戲、簡單的網(wǎng)上書店或者 TODO 應(yīng)用程序。在 GitHub 上可以找到很多類似的項(xiàng)目。
第四步:了解語言的實(shí)現(xiàn)細(xì)節(jié)
這一步并非都是必需的。不過,有追求的程序員對編程語言的實(shí)現(xiàn)細(xì)節(jié)會(huì)感興趣。有時(shí)候,因?yàn)閷幊陶Z言的實(shí)現(xiàn)細(xì)節(jié)不是很了解,容易寫出 bug。
好吧,現(xiàn)在我們來回答這個(gè)問題。這個(gè)問題的答案取決于很多因素,但簡單地說就是:
如果你的老師要你學(xué)習(xí) C 語言,那么 C 語言就是你的第一門需要學(xué)習(xí)的編程語言,因?yàn)橛腥私棠悖氵€有同學(xué),學(xué)習(xí)起來會(huì)更容易。
如果你要開發(fā) Web 應(yīng)用程序,就學(xué)習(xí) JavaScript/Python/Ruby。如果你要開發(fā)游戲,就學(xué)習(xí) C++。如果你要處理數(shù)據(jù),就學(xué)習(xí) Python/R 語言。如果你要開發(fā) Android App,就學(xué) Java/Kotlin。
如果是這樣,按照崗位的要求來學(xué)就好了。
這個(gè)也取決于實(shí)際情況。每一門編程語言都有自己的優(yōu)點(diǎn)和不足。適合用來處理所有任務(wù)的編程語言是不存在的。如果存在,我們只需要學(xué)習(xí)一門就夠了,不是嗎?記住,這個(gè)世界上沒有萬靈丹。
對于我個(gè)人而言,我最喜歡的語言是 C 語言 /Ruby/Lua/OCaml。
有人說,在掌握 5 門編程語言之前,不要把自己當(dāng)成高級程序員。當(dāng)正如之前所說的,不要專注于學(xué)習(xí)更多的編程語言,而是試著學(xué)習(xí)更多的編程語言概念和設(shè)計(jì)原則。
如果你在工作中使用的是結(jié)構(gòu)化的編程語言,為什么不試著學(xué)習(xí)一門函數(shù)式編程語言?如果你的語言是動(dòng)態(tài)類型的,為什么不試著學(xué)習(xí)一門靜態(tài)類型的語言?
關(guān)注我并轉(zhuǎn)發(fā)此篇文章,私信我“領(lǐng)取資料”,即可免費(fèi)獲得InfoQ價(jià)值4999元迷你書!
我們?nèi)酥载S富多彩,究根結(jié)底是因?yàn)槲覀兓駾NA的多樣性。人的基因的基本單位只有四種,但是通過不同的排列組合卻能讓其萬般變化。計(jì)算機(jī)的基因的基本單位只有兩個(gè):0和1。但千萬別小瞧這兩個(gè)數(shù)。就是這由兩個(gè)數(shù)構(gòu)成了我們復(fù)雜而聰明的計(jì)算機(jī)。
DNA決定著我們
計(jì)算機(jī)低級語言——機(jī)器語言
但我們都知道,我們不會(huì)直接用0和1來直接命令計(jì)算機(jī)為我們辦事,因?yàn)檫@樣對我們?nèi)祟惗蕴珡?fù)雜了,于是我們聰明的人類想出了一個(gè)辦法,就是我們?nèi)祟惡陀?jì)算機(jī)都用”學(xué)習(xí)”同一種語言,這樣我們就能夠好的“溝通”了。
于是我們有了匯編語言,但是匯編語言對我們來說還是太晦澀難懂了,所以有了高級語言。到今天,隨著人工智能的興起,大家或多或少都可能聽過一些高級語言的名字。只是,我們可能并不清楚它是什么。那我們的高級語言有哪些呢?
高級語言有許多,如:FORTRAN、COBOL、BASIC、Pascal、C、C++、Ada、Java、C#、還有我們時(shí)下流行的Python等等。而現(xiàn)在比較多人用的,應(yīng)該是Java、C、C++、和Python了。高級語言其實(shí)也沒什么神秘的,也是一種語言,就跟我們?nèi)祟惖恼Z言一樣,都是為了交流信息而有的。
高級語言C++
編程語言
隨著科技進(jìn)步,我們與計(jì)算機(jī)打交道越來越頻繁了(手機(jī)也是一種計(jì)算機(jī),計(jì)算機(jī)有別于狹義的電腦),越來越多非計(jì)算機(jī)行業(yè)的人去學(xué)習(xí)高級語言。這是一種很好的現(xiàn)象,畢竟這樣可以增加我們工作的機(jī)會(huì),也可以為我們的生活帶來一點(diǎn)樂趣。其實(shí)學(xué)習(xí)高級語言并不沒你想象中那么困難,它怎么說也只是一門外語而已。哈哈,其實(shí)我覺得它比英語簡單多了啊!