日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我的程序语言实践

發布時間:2025/3/21 编程问答 89 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我的程序语言实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動靜之間,不變的本質

??????? ——我的程序語言實踐

===========


引子
====

源于SD2.0大會的召開,以及拙作《JavaScript語言精髓與編程實踐》一書的出版在即,CSDN、博文視點以及《程序員》的編輯都希望我寫一點關于語言的東西。我已經為這個問題苦惱了很久,因為我不知道可以說什么,既可以與先行者有別,又可以使后來者為鑒。

這下便借用《程序設計語言實踐》一書的書名,講講我的經歷吧。


從動態語言到靜態語言
====

我所學的第一門語言其實是數據庫編程語言DBASE,參加的是學校的一個暑期的關于微機操作的培訓——程序設計語言只是其中很小的一部分,我們得從鍵盤鍵位之類的開始學起。就這樣,我也只學了十天。這是在1994年,當時用的是DBASE III。DBASE是解釋執行的、弱類型的一種語言,我用它寫過數據庫的前置的口令檢測程序。很快我就換成了BASIC,換這門語言的原因是當時要參加省賽區的一個競賽,我用了一個月略多的時間來學習它就參賽了,結果是第二名。在后來的學習中,我用BASIC寫過內存處理、端口處理程序。到了1997年的時候,我的一個朋友的畢業設計要用BASIC來寫,當時我已經丟下BASIC兩年了,但還是用了一晚的時間完成了一個考試管理系統,包括班級、學科管理、成績管理和檔案管理(含磁盤檢測以上報檔案)。當時我用了一個名為Turbo Basic的東東,是Borland做的最后一款BASIC語言的工具,據內幕說是因為與微軟存在協議,后來Borland再也沒出過這一語言的工具。

(*) 順便補充一點,那個微機培訓的課程是一個月,而我當時對文學感興趣,因為要去北京參加一個筆會而只學了十天。我對文學的興趣持續到1999年,在2000年的時候,一篇早期的文學作品拿了網易首屆網絡文學大屆的散文金獎(這個大賽也只辦了一屆,哈哈)。而對文字的喜好則持續到現在,成了我寫書作文的根基與動力。

在DOS時代還有一種可編程的批處理(當然現在在Windows系統中也有,只是用的人實在不多了),我曾經用它與BASIC和匯編結合起來,寫過系統加鎖程序。這些大概都是在1996年之前的事了。

我學習編譯型語言的時間晚于解釋型的,最初是在1995年初開始自學《數據結構》一書,那一版的書就是用PASCAL語法來講的,而我學算法語言晚于學《數據結構》,所以當時并不會PASCAL,也不可能在當時的BASIC中理解這些復雜的數據結構。因此我又買來Pascal語言入門教材自學,然而題不對板,數據結構中用的與我這本書所講的,以及我能用的Pascal編譯器三者全不靠譜,而那時候我還在死學死用的層次上,學了半年而無有小成。

然而《數據結構》卻沒有耽擱,對這門學科的學習成了我這么多年來理解編程的基礎。再后來,我又開始自學匯編語言、算法語言(Pascal)和操作系統原理,到了1996年初,我基本上已經完成了對語言和系統的自學。這個時候,我的語言選擇已經從Basic轉到了Pascal。

換言之,我從動態語言走到了靜態語言。不過這樣說,我可能被立即反問:它們是動態語言嗎?我慎之又慎的思考之后的回答,仍然“是”。前面提到的DBASE、BASIC和批處理其實都有動態語言的特征——盡管這在我學習它們時是不知的。


回歸動態-從Delphi到JavaScript
====

知道我的朋友很多是因為Delphi以及我所寫的《Delphi源代碼分析》一書。我從1996年開始做一些商業產品的代碼,一直到2003年都是使用的Pascal/Delphi系列語言,以及一些匯編語言。我從傳統過程式開發轉變到面向對象開發,用了非常長的時間——超過兩年。直到2003年的早些時候,我終于停下忙忙碌碌的、無止盡的代碼書寫,問了自己一個問題:Delphi是怎么回事?

為了給自己解答這個問題,我辭掉所有的工作,靜下心來研究這門語言。準確地說,是研究靜態語言的語法、語義以及面向操作系統的編譯與二進制文件生成。《Delphi源代碼分析》這本書講的就樣的一些內容:語言的基本要素、操作系統對語言的要求、語言的實現等等。只不過我是通過對Delphi的源代碼的分析來展現這些罷了。

用了一年的時間,我終于看明白語言在“結構”方面的真相:所有的語言效果、語法以及二進制的執行能力,原來不過是操作系統理解的一堆“可執行和可存取的數據結構”。“編譯”這一過程,無非是把這些細節隱藏起來,讓程序員以為自己在寫一種非常高級的、邏輯的、有趣的代碼,而忽視掉背后的本質部分:靜態的數據與指令。

如同我此前對于Pascal/Delphi的盲目一樣,我學用JavaScript之初也是盲目的。我選擇JavaScript的唯一原因,只是因為我在Web上開發時找不到第二種可以通用的語言(如果當時我能選擇一種類pascal語法的語言,我一定會錯失學習JavaScript的良機)。

我從1998年開始使用JavaScript,這離這門語言被創生出來不過三年時間——以語言的歷史而言,這算得上是“追新”了。在最初我無非是把它當成一種腳本化的過程式語言,以及用來響應網頁里的OnXXXX事件的一些代碼。但在一兩年之后,在我深受Delphi中的面向對象編程思想的影響之后,我發現JavaScript令我不堪忍受:它畢竟不是一門具有完整的對象特性的語言。于是我開始試圖實現JSOOP:JavaScript的面向對象編程。

這一設想以及一些實踐開始于2002年,但直到2004年初我才真正著手實施這個計劃,到了2005年末這個項目延伸為現在的Qomo(Qomolangma OpenProject)。而我另一方面的計劃——自2005年初開始寫的一本名為《B端開發》的書,也終于因為Qomo項目而被放棄,變成了《JavaScript語言精髓與編程實踐》。因為在Qomo開發過程中,我發現討論JavaScript這種語言本身,遠比“在瀏覽器端(B端)開發”更為有趣。盡管,在這其間我還用過PHP、Java與C#等等,不過相對于后面要討論的內容來說,這些已經不重要了。

因為我對編程的理解,終于從Delphi走回JavaScript,從靜態回歸到動態。


JavaScript語言的基本特性
====

到底JavaScript是怎樣的、以及為什么會吸引我呢?如今我之視見,JavaScript語言包括了四個方面的語言特性:過程式語言、面向對象語言、函數式語言和動態語言。具有過程式特性,是它入門容易的原因;面向對象特性則使它符合主流的程序設計思想;函數式是JavaScript語言的根基,而動態語言則是它的外在表現,以及強大到難于駕馭的根源。

前些時候在北京參與CSDN大會時,與一個老朋友談到JavaScript,他說:JavaScript具有幾乎所有主要語言形式的原子要素。我覺得,這個“語言原子”的概念就提得很好。的確,JavaScript在上述四個方面都表現平平,但每個方面都抓住了相應語言范型的精髓。不但如此,JavaScript還使用了一個最簡而又最合理的方式來組織各種語言特性。僅以“動態”而論,《JavaScript語言精髓與編程實踐》講述了JavaScript所包括的四個方面的動態性質:
?- 動態執行
?- 動態類型
?- 重寫
?- 實現動態環境的基礎數據結構
源于本文篇幅,對于更深層面的問題便不討論了,這里僅討論一下靜態執行與動態執行的某些本質上的差異。舉個例子來說,下面的代碼:
------
obj.aMethod(x,y,z);
------

這顯然是一個對象方法調用。但對象方法是如何實現的呢?在靜態語言中,因為有編譯過程,所以我們把一個結構放在內存里,并使得它
? - 擁有一個對象實例指針指向obj,
? - 擁有一個對象方法指針指向aMethod()在代碼區的地址,
? - 在有效代碼的前后加入處理x,y,z這些參數的代碼(例如入棧與清棧)。
在執行時,我們將obj與aMethod交給執行系統,并傳入指定參數(的序列),然后就可以按照既已編譯的規則來執行了。

然而在JavaScript中,由于它是一個動態語言,因此編譯的結果只是一個表達執行過程的語法樹。這個語法樹被存儲為一個二叉樹形式的數據結構。更細節的說,二叉樹的Root/Left/Right三個節點分別表示運算符、運算元1、運算元2。以較為復雜的三元運算符“?:”來說,下面表達式:
------
isTrue ? expr1 : expr2
------

就被表達為
??????? root(?)
???????? /?? /?
left(isTrue)? right(:)
?????????????? /? /
?????? left(expr1) right(expr2)
——學過數據結構的開發者一定對此不會陌生,因此我就不細講實現和使用這個結構的過程了(其實三元表達式不能描述為這個結構,但這里只為了說明問題,請不要去追究它。)。不過這一結構也顯然地可以陳述為一個lisp/scheme表達式。同樣的道理,一個對象方法的過程亦是如此,用這樣的方法來表達上面的“對象方法調用”,就可以用lisp/scheme方法來陳述:
------
((. obj aMethod) x y z)
------

正是這個細節,表明在JavaSctipt中所謂的“對象方法調用”,其本質上是函數式語言中的一個運算式。因其是一個運算式,所以能動態地(作為語法樹的一部分)解釋執行。

同樣的方法,可以解構所有在JavaScript有關執行系統(語句、表達式、函數等)的問題,基本上都可以歸結到函數式這個范圍內。換而言之:函數式這個“原子”為JavaScript提供了執行和動態執行能力。

再往后,我考察了JavaScript在數據結構層面上的實現。這方面最精當(而又平凡)的解釋是前兩天在微軟架構師有關語言的討論中做出的:JavaScript的對象其實是“屬性包”。不過,更專業而難解的詞匯是“關聯數組”。JavaScript使用關聯數組作為動態化類型的基礎,而靜態的值類型僅包括布爾、數值、字符串類型(字符串兼具值與引用兩方面特性)和undefined四種。當所有的類型被歸結到這里時,就可以發現“動態”的另一層含義與”引用“結合了起來:
? - 所謂引用,不過是動態地找到值的一種手段
另一方面,對運算系統的考察,也會被歸結到這里:
? - 所謂運算,本質是針對值的運算

舉個實例來說,例如:
------
aWindow.width = obj.aMethod(x,y,z);
------

其中".width”運算的目的是找到一個值類型的屬性;“.aMethod()”的目的是找到一個函數并調用它,然后返回某個值;“=”運算則將某值傳入某個存值的屬性。

所以,根源上來說,JavaScript中的所有運算都是圍繞“如何得到和使用值(類型)數據”來的。對此更深入的推論是:所有的計算系統都是圍繞這一根本目的來的。

在寫《JavaScript語言精髓與編程實踐》的過程中,我一次又一次地回顧了我對Delphi的所有理解,拋開那些將語法樹靜態化到內存結構和磁盤文件結構的過程,我看到:所有靜態與動態語言,在本義上所追求的,無非是算法與結構的平衡——即先滿足算法實現一致性,還是先滿足結構實現一致性的問題。

在這十余年之中,我從動態開始,深入靜態又回歸動態,最終我來到了原點:程序=算法+結構。


學兩種語言
====

在《程序設計語言實踐》中對“語言”有一個分類法,將語言分類為“說明式”與“命令式”兩種。Delphi以及C、C++、Java、C#等都被分為“命令式”語言范型的范疇;“函數式”語言則是“說明式”范型中的一種。我如今回顧我對語言的學習,其實十年也就學會了兩門語言:一門是命令式的,一門是說明式的。當然從語言的實現方式來看,一門是靜態的,一門是動態的。

這便是我程序員生涯的全部了。

我畢竟不是計算機科學的研究者,而只是其應用的實踐者,因而我從一開始就缺乏對“程序”的某些科學的或學術層面上的認識是很正常的。也許有些人認為一開始程序便是如此,或者一門語言就應當是這樣構成和實現的,那么可能他是從計算機科學走向應用,故而比我了解得多些。而我,大概在十年前學習編程,以及在后來很多年的實踐中,僅被要求“寫出代碼”,而從未被要求了解“什么是語言”。所以我才會后知后覺,才會在很長的時間里迷失于那些精細的、溝壑縱橫的語言表面而不自知。然而一如我現在所見到,與我曾相同地行進于那些溝壑的朋友,仍然在持續地迷惑著、盲目著,全然無覺于溝壑之外的瑰麗與宏偉。

前些天寫過一篇BLOG,是推薦那篇“十年學會編程”的。那篇文章道出了我在十年編程實踐之后,對程序語言的最深刻的感概。我們學習語言其實不必太多,深入一兩種就可以了。如果在一種類型的語言上翻來覆去,例如學C、Delphi、Java、C#……無非是求生存、討生活,或者用以裝點個人簡歷,于編程能力上提高是不大的。更多的人,因為面臨太多的語言選擇而淺嘗轍止,多年之后仍遠離程序根本,成為書寫代碼的機器,把書寫代碼的行數、程序個數或編程年限作為簡歷中最顯要的部分。這在明眼人看來,無過是熟練的磚頭工而已。

《大道至簡》中說“如今我已經不再專注于語言”。其實在說完這句話之后,我就已經開始了對JavaScript的深入研究。在如此深入地研究一種語言,進而與另一種全然有別的語言比較補充之后,我對“程序=算法+結構”有了更深刻的理解與認識——盡管這句名言從來未因我的認識而變化過,從來未因說明與命令的編程方式而變化過,也從來未因動態與靜態的實現方法而變化過。

動靜之間,不變的是本質。我之所以寫這篇文字,并非想說明這種本質是什么亦或如何得到,只是期望讀者能在匆忙的行走中,時而停下了腳步,遠遠地觀望一下目標罷了。

而我,此時刻,正在做一個駐足觀望的路人甲。?


from:?http://blog.csdn.net/aimingoo/article/details/1861213

總結

以上是生活随笔為你收集整理的我的程序语言实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。