自1958年以來(lái),一種古老的語(yǔ)言一直存在,并被用來(lái)解決編程和計(jì)算機(jī)科學(xué)中的現(xiàn)代問(wèn)題。
在1950年代中后期,麻省理工學(xué)院的約翰·麥卡錫有一個(gè)要解決的問(wèn)題。作為人工智能項(xiàng)目的一部分,他需要一種可以處理數(shù)據(jù)列表的編程語(yǔ)言。以正式方式構(gòu)成的句子代表著世界的信息。計(jì)算機(jī)將導(dǎo)航和處理句子的列表來(lái)模仿人類(lèi)推理。例如,通過(guò)比較由列表組織成的可能語(yǔ)句來(lái)回答問(wèn)題。
用簡(jiǎn)單的話(huà)來(lái)說(shuō),如果你是計(jì)算機(jī),并且程序會(huì)詢(xún)問(wèn)你在寒冷和饑餓時(shí)該怎么辦,請(qǐng)列出可能的結(jié)果列表,然后瀏覽該列表以找到合理的結(jié)果。例如,如果你感冒,你將傾向于與溫暖有關(guān)的句子,而避免與感冒有關(guān)的句子。這個(gè)問(wèn)題拋給了麥卡錫,因?yàn)闆](méi)有適合列表的軟件語(yǔ)言,麥卡錫必須創(chuàng)造自己的語(yǔ)言。
但是接下來(lái)發(fā)生了一件有趣的事情。麥卡錫創(chuàng)建了他的語(yǔ)言,他稱(chēng)之為L(zhǎng)isp——List Processing的簡(jiǎn)寫(xiě)。正如保羅·格雷厄姆所說(shuō),麥卡錫為編程所做的與歐幾里得為幾何所做的一樣。他從簡(jiǎn)單的運(yùn)算符和函數(shù)符號(hào)系統(tǒng)構(gòu)建了一種編程語(yǔ)言。但是他認(rèn)為最重要的語(yǔ)言部分,即用于處理數(shù)學(xué)語(yǔ)法的m表達(dá)式,對(duì)使用Lisp的人來(lái)說(shuō)最不重要。麥卡錫語(yǔ)言的次要部分之一,用來(lái)描述數(shù)據(jù)的s表達(dá)式,在隨后的五十年中不斷影響著許多編程語(yǔ)言。
更加有趣的是,斯蒂芬·羅素將Lisp中的理論評(píng)估函數(shù)轉(zhuǎn)換為真實(shí)的機(jī)器代碼。 Lisp現(xiàn)在可以解釋用于描述數(shù)據(jù)的Lisp s表達(dá)式語(yǔ)句并運(yùn)行Lisp程序。 1962年,第一個(gè)將Lisp編譯為代碼的軟件將評(píng)估代碼(在代碼運(yùn)行時(shí)處理)和編譯代碼(在代碼運(yùn)行之前處理)混合在一起。在20世紀(jì)70年代,麻省理工學(xué)院的丹尼爾·愛(ài)德華茲向Lisp添加了垃圾回收功能,該功能可以釋放未使用的內(nèi)存以提高語(yǔ)言的效率。
最初,它是一種解決問(wèn)題的優(yōu)雅極簡(jiǎn)方案,即作為人工智能項(xiàng)目的一部分來(lái)處理列表,它擁有完整的編程語(yǔ)言的種子,其創(chuàng)新思想可以影響數(shù)十種語(yǔ)言。例如,麥卡錫創(chuàng)建了現(xiàn)在常見(jiàn)的if-then-else條件語(yǔ)句,因此Lisp可以以緊密的結(jié)構(gòu)化方式處理列表。 格雷厄姆還認(rèn)為L(zhǎng)isp是思考軟件編程問(wèn)題的第二種方法。 FORTRAN和C是另一種更為熟悉的軟件編程方式。
盡管關(guān)于哪種編程語(yǔ)言最好的爭(zhēng)論經(jīng)常引起激烈的討論,但對(duì)于Lisp作為最佳語(yǔ)言的爭(zhēng)論尤其強(qiáng)烈,這可能是由于其使用壽命長(zhǎng)。許多有才華和創(chuàng)造力的人都在Lisp上進(jìn)行工作,以完善和優(yōu)化該語(yǔ)言。沒(méi)錯(cuò),Lisp一直是解決編程和計(jì)算機(jī)科學(xué)問(wèn)題的不尋常且別出心裁的解決方案。一方面,Lisp一直傾向于使用簡(jiǎn)單的靈活解決方案,而其他語(yǔ)言卻增加了復(fù)雜性(出于充分的理由)。麥卡錫的直覺(jué)是,隨著時(shí)間的推移,一種更簡(jiǎn)單的語(yǔ)言將提供更多的靈活性。
但是,對(duì)于軟件語(yǔ)言而言,沒(méi)有對(duì)與錯(cuò),最好或最壞的情況。在給定情況下,只有哪種語(yǔ)言最有效。 Lisp是第一種為FORTRAN及其后續(xù)語(yǔ)言提供替代語(yǔ)言的語(yǔ)言,同時(shí)又不偏離熟悉的語(yǔ)言。Lisp的不尋常部分之一是宏。如果你不知道,宏就是操控其他程序的代碼。考慮一個(gè)重復(fù)的計(jì)算任務(wù),可能是添加數(shù)字,然后將代碼放入一個(gè)塊中,然后調(diào)用該塊,而不是重新鍵入用于添加數(shù)字的代碼。如果你使用過(guò)Word宏,你就會(huì)明白,宏擴(kuò)展了編程語(yǔ)言的功能。
借助Lisp,宏還允許程序員將特定于域的語(yǔ)言嵌入Lisp中。宏可以直接訪(fǎng)問(wèn)該語(yǔ)言所包含的解析器。使用Lisp,代碼是數(shù)據(jù)(列表),數(shù)據(jù)可以是代碼。它是一種可編程的軟件語(yǔ)言。函數(shù)可以像變量一樣傳遞并在代碼中的其他地方進(jìn)行處理,也可以像函數(shù)一樣直接進(jìn)行處理。Lisp的另一個(gè)功能是使用括號(hào)將數(shù)據(jù)組織到列表中。 Lisp中使用的語(yǔ)法或元素是原子和列表。原子是數(shù)字,字母和非字母數(shù)字字符,列表是原子或其他列表的序列。空格分隔原子和列表,如下所示:
(1 2 3 4)
在此示例中,原子1、2、3和4是列表中標(biāo)有括號(hào)的原子。
(1(2 3 4(5 6)))
在此示例中,第一個(gè)列表是原子1,一個(gè)由2、3、4組成的列表,以及它自己的由5和6組成的列表。
由于使用了宏且語(yǔ)法解析簡(jiǎn)單,因此Lisp被大量用于特定領(lǐng)域,例如人工智能項(xiàng)目。Lisp的工作方式也適用于多種方言。例如,更新的編程語(yǔ)言Clojure以L(fǎng)isp的方式工作,解決了現(xiàn)代問(wèn)題,例如同時(shí)處理多個(gè)請(qǐng)求,最大程度地減少了需要相同資源或需要按特定順序發(fā)生的進(jìn)程間的沖突。這些問(wèn)題不同于麥卡錫的問(wèn)題,即創(chuàng)建一種語(yǔ)言來(lái)管理人工智能語(yǔ)句和簡(jiǎn)單的數(shù)學(xué)符號(hào)系統(tǒng)的語(yǔ)句。
Lisp語(yǔ)言已演變?yōu)镃ommon Lisp和Scheme,以及各種方言。它們都以與原始語(yǔ)言規(guī)范類(lèi)似的方式工作。在某些情況下,它們的命名和使用的元素不同。但是它們都使用相同的Lisp概念,包括宏。毫不夸張地說(shuō),了解Lisp類(lèi)似于在《星球大戰(zhàn)》中成為絕地武士并獲得輕型軍刀一樣,是比較難的過(guò)程。當(dāng)你學(xué)習(xí)了至少一種語(yǔ)言后改用Lisp時(shí),Lisp的力量最為明顯。例如,在其他語(yǔ)言設(shè)置語(yǔ)言操作方式的基本規(guī)則的地方,Lisp則經(jīng)常讓編碼人員設(shè)置規(guī)則。在其他語(yǔ)言可能提供許多功能來(lái)完成大量任務(wù)的地方,Lisp通常可以用較少的功能來(lái)完成相同的任務(wù)。Lisp活了超過(guò)半個(gè)世紀(jì),因?yàn)槌绦騿T不得不承認(rèn),十年又十年,Lisp依然是工作的最好工具。
-
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1945瀏覽量
34745 -
人工智能
+關(guān)注
關(guān)注
1791文章
47282瀏覽量
238534 -
計(jì)算機(jī)科學(xué)
+關(guān)注
關(guān)注
1文章
144瀏覽量
11361 -
LISP
+關(guān)注
關(guān)注
0文章
12瀏覽量
7726
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論