青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

coreBugZJ

此 blog 已棄。

對動靜態語言的語義思考,再兼談點其它的 (轉)

在參與這個討論 http://www.iteye.com/topic/33971 后,這段時間對這個話題有了一些新的思考,寫下來和大家分享分享。


重點探討一下動靜態編程語言的語義,兼帶些DSL及通用語言,以及新手上手難易問題。


編程語言的語義,在論壇里討論不多。在這里先分析一下幾門主流靜態語言,C,C++,Java,C#的語義。這些語言從編程風格角度講,都稱之為”imperative programming language”,(命令式的編程語言)。究其原因,這些語言都是對計算機的核心部件,CPU及內存,施發號令的。


1. int a = 4;
2. int b = 4 + a;
3. int c = 5.2345;


第一句,具體語義是,在內存里分配一塊內存,大小為4 bytes,在這塊內存里,寫入4。第二句,具體語義是,在內存里分配一塊內存,大小為4 bytes,從a中取值,和4進行加法運算,結果寫入b指向的4 bytes內存。第三句就是個潛在的錯誤,等號右邊是個8 bytes的double,把8 bytes的數據寫到4 bytes的內存塊里去,數據會損失的。


要把這些靜態語言內存分配的經驗照搬來理解動態語言,完全是搞錯了方向。看看下面一段javascript代碼:


1. var a = 5;
2. alert(a);
3. var a = "foobar";
4. alert(a);


這是一段完全合法可以正確運行的javascript程序,然而對于只編過靜態語言而且對靜態語言的語義很了解的人,卻很難理解。變量a,明顯不是指向根據類型分配出來一塊大小固定的內存塊。


如何理解這一段代碼的語義?


Revised Report on the Algorithmic Language Scheme 一文里有這么一段:


引用


Scheme has latent as opposed to manifest types. Types are associated with values also (also call objects) rather than with variables. (Some authors refer to languages with latent types as weakly typed or dynamically typed languages. Other languages with latent types are APL, Snobol, and other dialects of Lisp. Languages with manifest types (sometimes referred to as strongly typed or statically typed language) include Algol 60, Pascal, and C.


Paul Graham在其“What Made Lisp Different”一文中這么說:


引用

 
A new concept of variables. In Lisp, all variables are effectively pointers. Values are what have types, not variables, and assigning or binding variables means copying pointers, not what they point to.
 

這兩段合在一起,可以正確理解動態語言的語義。


靜態,變量實際是分配的內存塊,大小固定。




動態,變量實際是個指針,可指向內存任何一塊。

(當然是運行的不同時期指向不同的內存塊)


看看下面幾句:


1. JavaScript:   var a = 5;
2. ML: val a = 5;
3. Scheme: (define a 5)


這些語句應該理解為, (等號右邊)表達式evaluate出來一個值,這個值綁定到變量a里面去。用來描述上述代碼語義的正確的詞是binding。


看看下面ML語言解釋器對ML代碼的解釋:


 1. Moscow ML version 2.01 (January 2004)
 2. Enter `quit();' to quit.
 3. - a;
 4. ! Toplevel input:
 5. ! a;
 6. ! ^
 7. ! Unbound value identifier: a
 8. - val a = 5;
 9. > val a = 5 : int
10. - a;
11. > val it = 5 : int
12. - val a = "foobar";
13. > val a = "foobar" : string
14. - a;
15. > val it = "foobar" : string


注意第七行的提示。


第十行,第十四行光打入a,也是個表達式,evaluate出來的值,綁定給省缺變量it。


看看下面Scheme語言解釋器對Scheme代碼的解釋:


1. > a
2. ; Unbound variable: a
3.
4. > (define a 5)
5. ; Value: a
6.
7. > a
8. ; Value: 5


注意第二行的提示。


一定要分清動態語言的變量綁定和靜態語言的變量賦值的區別。變量是一個數學上的概念,在靜態語言中,叫變量其實不合適,還不如直接叫a memory box,更能清楚地說明其本質。


對于靜態語言,弱類型是致命傷,因為在聲明變量的時候,內存塊已經分配好了,往這個內存塊里寫一塊內存塊存儲不下的數據,帶來的傷害是致命的。對于動態語言,強弱類型未必重要。

 
在C/C++/Java/C#里面,內存是可以分配到Stack里面,也可以分配到Heap里面, 程序員一定要搞清楚區別, 像在C里:


1. int a = 5; 
2. int b[] = { 1, 2, 3, 4} 
3. int* ptr = (int*)malloc(10*sizeof(int)); 


a 和 b 所分配的內存都在stack里,c 指向heap里的一塊,退出前不把c 給free掉,就會遺漏內存。給function傳值的時候,更要小心,傳a是把5這個值給傳過去,傳b是傳b這個array第一個元素的地址。

 
到了C++,更加繁瑣,因為C++的 Object是可以分配在stack上的,隨便寫幾句代碼,都會用到assignment operator = , address-of operator &, copy constructor.


1. const ClassFoo e1;    // default constructor, destructor later
2. ClassFoo e2(e1);          // copy constructor
3. e2 = e1;                     // assignment operator
4. ClassFoo *pe2 = &e2;   // address-of operator (non-const)
5. const ClassFoo *pe1 = &e1;   // address-of operator (const)
 

C++編譯器自動生成這些函數,有時不符合需要就要自己手寫。


Java里面所有的object allocation, 都是分配在Heap里的,光這一點,就大大減輕了編程的繁瑣度。從Java轉向C++的朋友,一定要記住這一點。C++的 Object是可以分配在stack上的。

 
Java里面的primitive變量是分配在Stack上的,其實如果廢除這八個primitive types,全部用Object reference,動靜態語言的差別已經不那么大了。Type inference在C# 3里面,已經開始實現了:


1. var str = "Hello world!";
2. var num = 42;
3. var v = new TypeWithLongName<AndWithTypeParameter>();


歐美計算機專業的第一門語言,一般是ML或Scheme。這些語言,做到了程序員不用思考內存是分配在stack上還是heap上,內存回收由GC管,因而可以集中精力,學習算法,遞歸等等。

 
用編程來解決問題,需要三方面的技能:1. 對編程語言,語義及運行環境的掌握,2.  對解決問題的算法的掌握,3. 擁有寫出結構清晰,簡潔易懂的代碼的能力。


第一點和第二點經常交匯在一起,因為語言,經常是為了解決某個領域的問題而設計的,解決算法,遞歸之類的問題,用functional programming language,操作系統,應該用C,web領域之PHP,科學計算之Matlab,試驗儀器控制之labview,關系數據庫之SQL,莫不如此。

 
那么什么算是通用語言,什么算是DSL?通用不通用是相對的。C是一門通用語言,但也可以說是操作系統的DSL。從某種角度來說,能夠全面控制計算機的,才叫通用語言,那么只有匯編才符合這個條件,C和C++勉強算得上。

 
新手上路,該學什么?應該從某個領域學起,學習解決那個領域問題需要的方法,而且學習那個領域的DSL。這樣成效出的最快,而且不受干擾。


現在學校里教學靜態語言占主流,有歷史原因。以前計算機不夠快,用C編程是唯一的選擇。現在對運行效率要求很高的領域,還得用C,C++。但是在很多領域,這已經不是個問題了。由于歷史的慣性,靜態語言還在繼續教。學校老師學新知識的動力,可不大。這些老師教出的學生,只會靜態語言,那么公司為了保證人手充足,也會傾向靜態語言。這種狀況,慢慢會打破。

posted on 2012-03-17 14:00 coreBugZJ 閱讀(418) 評論(0)  編輯 收藏 引用 所屬分類: 技術視野ProgrammingLanguage

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩亚洲精品内裤| 另类春色校园亚洲| 欧美高清视频www夜色资源网| 久久精品国产精品亚洲| 欧美啪啪成人vr| 在线免费观看欧美| 欧美.www| 免费毛片一区二区三区久久久| 国产一区二区三区无遮挡| 亚洲精品你懂的| 欧美第一黄色网| 毛片一区二区三区| 亚洲第一精品影视| 久久在线91| 一区二区免费看| 一本大道久久a久久综合婷婷| 欧美一区二区日韩| 欧美一级黄色录像| 欧美大片国产精品| 中日韩在线视频| 亚洲一区二区成人在线观看| 国产精品日韩二区| 亚洲国产欧美在线人成| 亚洲肉体裸体xxxx137| 免费短视频成人日韩| 一本色道久久综合亚洲91| 狠色狠色综合久久| 亚洲精品社区| 国产一区观看| 91久久亚洲| 亚洲特级毛片| 亚洲综合国产| 久久精品亚洲精品| 亚洲三级视频在线观看| 国产精品福利在线观看| 欧美韩国一区| 黄色在线一区| 亚洲免费在线观看视频| 亚洲美女av在线播放| 裸体女人亚洲精品一区| 亚洲欧美国产另类| 欧美人交a欧美精品| 欧美一级淫片aaaaaaa视频| 亚洲国产精品va| 久久久亚洲一区| 国产午夜精品理论片a级大结局 | 欧美国产第二页| 新狼窝色av性久久久久久| 欧美久久影院| 久久精品视频在线观看| 欧美日韩国产123区| 亚洲人成人99网站| 久久福利资源站| 亚洲电影免费在线观看| 国产一区清纯| 亚洲国产毛片完整版| 欧美精品一区三区在线观看| 久久香蕉国产线看观看av| 亚洲精品资源美女情侣酒店| 欧美激情中文不卡| 夜夜嗨av一区二区三区| 一区二区免费看| 欧美在线高清视频| 欧美高清影院| 欧美激情一区二区三区不卡| 99re亚洲国产精品| 亚洲一区二区三区欧美| 国产一区二区三区高清| 伊人男人综合视频网| 欧美成人免费小视频| 欧美二区在线| 国产综合视频在线观看| 亚洲主播在线| 亚洲福利av| 欧美色网在线| 欧美日韩国产小视频在线观看| 欧美视频手机在线| 极品裸体白嫩激情啪啪国产精品| 亚洲精品国产日韩| 久久久久欧美| 亚洲视频中文字幕| 国产精品美女诱惑| 国产精品成人一区二区艾草| 欧美久久一区| 亚洲国产福利在线| 麻豆精品在线观看| 久久精品国内一区二区三区| 国产日本欧美一区二区三区在线| 国产精品毛片a∨一区二区三区| 国产日韩欧美一区二区三区在线观看| 亚洲老司机av| 亚洲国产视频直播| 亚洲一区二区毛片| 国产精品色午夜在线观看| 欧美一区网站| 欧美一区不卡| 国产精品久久久久影院色老大 | 欧美精品九九99久久| 久久精品麻豆| 国产欧美日韩亚洲| 免费观看成人www动漫视频| 久久精品国产第一区二区三区| 亚洲国产精品成人综合色在线婷婷 | 久久久久久久一区| 欧美一区二区国产| 国产在线精品自拍| 亚洲国产二区| 亚洲免费黄色| 国产欧美日韩一区| 欧美国产日韩a欧美在线观看| 欧美精品一区在线播放| 99视频一区二区| 久久久久国色av免费看影院| 亚洲片在线观看| 欧美三级在线视频| 狼人天天伊人久久| 欧美视频中文在线看| 久久久久久综合| 欧美女同在线视频| 欧美高清在线播放| 狠狠久久婷婷| 欧美一区三区三区高中清蜜桃| 亚洲精品一区中文| 噜噜噜91成人网| 麻豆freexxxx性91精品| 国产毛片一区二区| 亚洲国产婷婷香蕉久久久久久99| 艳女tv在线观看国产一区| 国产精品一级二级三级| 亚洲美女网站| 91久久精品日日躁夜夜躁欧美 | 亚洲一区二区三区乱码aⅴ| 狠狠色狠狠色综合日日小说| 亚洲色无码播放| 亚洲欧洲av一区二区三区久久| 国产精品成人一区二区三区夜夜夜 | 国产精品欧美日韩一区二区| 亚洲黄页视频免费观看| 亚洲第一久久影院| 美女精品国产| 欧美国产欧美综合 | 亚洲人成高清| 日韩亚洲欧美在线观看| 亚洲精品麻豆| 美女脱光内衣内裤视频久久网站| 久久人人97超碰国产公开结果| 国产偷国产偷精品高清尤物| 午夜在线成人av| 亚洲精品欧美激情| 快she精品国产999| 欧美不卡视频一区发布| 亚洲电影欧美电影有声小说| 久久久精品国产一区二区三区| 久久字幕精品一区| 欧美视频中文字幕在线| 这里只有精品视频在线| 亚洲男同1069视频| 国产精品乱人伦一区二区| 亚洲字幕在线观看| 久久免费少妇高潮久久精品99| 精品51国产黑色丝袜高跟鞋| 麻豆久久精品| 99精品视频免费观看| 午夜国产精品视频免费体验区| 玖玖视频精品| 亚洲日本一区二区| 亚洲欧美国产高清va在线播| 国产精品婷婷午夜在线观看| 欧美一级在线亚洲天堂| 欧美国产日韩一区二区| 正在播放欧美视频| 国产精品丝袜91| 久久综合久久久| 99热精品在线观看| 久久综合国产精品台湾中文娱乐网| 亚洲国产三级在线| 国产精品视频精品视频| 免费成人高清在线视频| 在线一区免费观看| 麻豆freexxxx性91精品| 亚洲视频一二区| 99视频精品免费观看| 免费日韩成人| 免费中文字幕日韩欧美| 一二三四社区欧美黄| 国产亚洲精久久久久久| 欧美精品福利在线| 新狼窝色av性久久久久久| 亚洲激情在线观看| 久久精品日韩一区二区三区| 日韩亚洲精品视频| 欧美大片网址| 亚洲欧美色婷婷| 亚洲国产成人tv| 久久国产欧美| 亚洲欧美清纯在线制服| 99re国产精品| 亚洲国产毛片完整版| 国产自产高清不卡| 国产精品亚洲аv天堂网|