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

coreBugZJ

此 blog 已棄。

對(duì)動(dòng)靜態(tài)語言的語義思考,再兼談點(diǎn)其它的 (轉(zhuǎn))

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


重點(diǎn)探討一下動(dòng)靜態(tài)編程語言的語義,兼帶些DSL及通用語言,以及新手上手難易問題。


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


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


第一句,具體語義是,在內(nèi)存里分配一塊內(nèi)存,大小為4 bytes,在這塊內(nèi)存里,寫入4。第二句,具體語義是,在內(nèi)存里分配一塊內(nèi)存,大小為4 bytes,從a中取值,和4進(jìn)行加法運(yùn)算,結(jié)果寫入b指向的4 bytes內(nèi)存。第三句就是個(gè)潛在的錯(cuò)誤,等號(hào)右邊是個(gè)8 bytes的double,把8 bytes的數(shù)據(jù)寫到4 bytes的內(nèi)存塊里去,數(shù)據(jù)會(huì)損失的。


要把這些靜態(tài)語言內(nèi)存分配的經(jīng)驗(yàn)照搬來理解動(dòng)態(tài)語言,完全是搞錯(cuò)了方向。看看下面一段javascript代碼:


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


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


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


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.
 

這兩段合在一起,可以正確理解動(dòng)態(tài)語言的語義。


靜態(tài),變量實(shí)際是分配的內(nèi)存塊,大小固定。




動(dòng)態(tài),變量實(shí)際是個(gè)指針,可指向內(nèi)存任何一塊。

(當(dāng)然是運(yùn)行的不同時(shí)期指向不同的內(nèi)存塊)


看看下面幾句:


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


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


看看下面ML語言解釋器對(duì)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,也是個(gè)表達(dá)式,evaluate出來的值,綁定給省缺變量it。


看看下面Scheme語言解釋器對(duì)Scheme代碼的解釋:


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


注意第二行的提示。


一定要分清動(dòng)態(tài)語言的變量綁定和靜態(tài)語言的變量賦值的區(qū)別。變量是一個(gè)數(shù)學(xué)上的概念,在靜態(tài)語言中,叫變量其實(shí)不合適,還不如直接叫a memory box,更能清楚地說明其本質(zhì)。


對(duì)于靜態(tài)語言,弱類型是致命傷,因?yàn)樵诼暶髯兞康臅r(shí)候,內(nèi)存塊已經(jīng)分配好了,往這個(gè)內(nèi)存塊里寫一塊內(nèi)存塊存儲(chǔ)不下的數(shù)據(jù),帶來的傷害是致命的。對(duì)于動(dòng)態(tài)語言,強(qiáng)弱類型未必重要。

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


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


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

 
到了C++,更加繁瑣,因?yàn)镃++的 Object是可以分配在stack上的,隨便寫幾句代碼,都會(huì)用到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++編譯器自動(dòng)生成這些函數(shù),有時(shí)不符合需要就要自己手寫。


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

 
Java里面的primitive變量是分配在Stack上的,其實(shí)如果廢除這八個(gè)primitive types,全部用Object reference,動(dòng)靜態(tài)語言的差別已經(jīng)不那么大了。Type inference在C# 3里面,已經(jīng)開始實(shí)現(xiàn)了:


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


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

 
用編程來解決問題,需要三方面的技能:1. 對(duì)編程語言,語義及運(yùn)行環(huán)境的掌握,2.  對(duì)解決問題的算法的掌握,3. 擁有寫出結(jié)構(gòu)清晰,簡(jiǎn)潔易懂的代碼的能力。


第一點(diǎn)和第二點(diǎn)經(jīng)常交匯在一起,因?yàn)檎Z言,經(jīng)常是為了解決某個(gè)領(lǐng)域的問題而設(shè)計(jì)的,解決算法,遞歸之類的問題,用functional programming language,操作系統(tǒng),應(yīng)該用C,web領(lǐng)域之PHP,科學(xué)計(jì)算之Matlab,試驗(yàn)儀器控制之labview,關(guān)系數(shù)據(jù)庫(kù)之SQL,莫不如此。

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

 
新手上路,該學(xué)什么?應(yīng)該從某個(gè)領(lǐng)域?qū)W起,學(xué)習(xí)解決那個(gè)領(lǐng)域問題需要的方法,而且學(xué)習(xí)那個(gè)領(lǐng)域的DSL。這樣成效出的最快,而且不受干擾。


現(xiàn)在學(xué)校里教學(xué)靜態(tài)語言占主流,有歷史原因。以前計(jì)算機(jī)不夠快,用C編程是唯一的選擇?,F(xiàn)在對(duì)運(yùn)行效率要求很高的領(lǐng)域,還得用C,C++。但是在很多領(lǐng)域,這已經(jīng)不是個(gè)問題了。由于歷史的慣性,靜態(tài)語言還在繼續(xù)教。學(xué)校老師學(xué)新知識(shí)的動(dòng)力,可不大。這些老師教出的學(xué)生,只會(huì)靜態(tài)語言,那么公司為了保證人手充足,也會(huì)傾向靜態(tài)語言。這種狀況,慢慢會(huì)打破。

posted on 2012-03-17 14:00 coreBugZJ 閱讀(418) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 技術(shù)視野 、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>
            亚洲精品免费在线播放| 亚洲欧美日韩在线观看a三区| 亚洲美女视频网| 亚洲成人在线视频播放| 一区二区三区在线视频播放| 激情综合中文娱乐网| 在线精品观看| 日韩一区二区精品在线观看| 在线视频你懂得一区| 亚洲综合精品一区二区| 欧美中文字幕第一页| 久久人人九九| 亚洲高清在线| 日韩系列在线| 性色av香蕉一区二区| 久久在线视频| 国产精品第13页| 精品不卡一区| 亚洲视频在线看| 久久夜色精品国产噜噜av| 亚洲国产精品小视频| 中国成人亚色综合网站| 久久久国产精品一区二区中文| 欧美激情国产高清| 国产欧美日韩免费看aⅴ视频| 今天的高清视频免费播放成人 | 欧美www视频| 欧美日韩亚洲天堂| 激情小说亚洲一区| 亚洲一区三区电影在线观看| 久久资源av| 亚洲午夜高清视频| 模特精品裸拍一区| 国产视频久久| 亚洲一区三区视频在线观看| 欧美成年视频| 欧美伊人精品成人久久综合97| 欧美极品一区| 亚洲第一黄色| 久久精品亚洲热| 一区二区三区欧美视频| 欧美激情视频一区二区三区免费| 国产一区二区欧美| 亚洲欧美日韩精品一区二区 | 久久gogo国模裸体人体| 欧美三级乱码| 亚洲每日更新| 亚洲国产精品久久久久秋霞不卡| 久久成人免费网| 国产午夜精品在线| 午夜精品视频| 亚洲欧美韩国| 国产精品永久免费| 午夜影院日韩| 欧美亚洲免费高清在线观看| 国产精品久久久久一区二区| 亚洲一线二线三线久久久| 99国内精品久久久久久久软件| 欧美高清hd18日本| 日韩视频中文字幕| 日韩亚洲不卡在线| 欧美色欧美亚洲另类七区| 99视频有精品| 一区二区三区免费观看| 国产精品国产三级国产专区53| 亚洲天堂网在线观看| 一本色道久久综合亚洲精品高清| 欧美三级视频在线播放| 亚洲欧美三级伦理| 欧美在线播放视频| 在线欧美影院| 亚洲人体影院| 国产精品乱子乱xxxx| 久久精品水蜜桃av综合天堂| 久久久91精品国产| 亚洲精选91| 亚洲性线免费观看视频成熟| 国产农村妇女精品一区二区| 久久午夜精品一区二区| 老牛影视一区二区三区| 一本色道久久88亚洲综合88| 一区二区三区免费观看| 99国产精品久久久久老师| 国产日韩欧美视频| 久热精品视频| 欧美电影在线免费观看网站| 亚洲精品字幕| 亚洲免费综合| 亚洲国产精品一区| 一区二区三区视频在线播放| 国产欧美一区二区在线观看| 女同一区二区| 国产精品日韩专区| 欧美成人精品三级在线观看 | 欧美一区二区日韩| 亚洲国产精品成人综合| 一个色综合av| 亚洲国产精品成人va在线观看| 日韩系列欧美系列| 亚洲大片一区二区三区| 一区二区三区免费网站| 亚洲第一精品夜夜躁人人爽| 亚洲精品日韩欧美| 狠狠综合久久av一区二区老牛| 亚洲美女尤物影院| 精品二区久久| 亚洲已满18点击进入久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美伦理在线观看| 久久久久一区二区| 欧美涩涩网站| 欧美激情偷拍| 国一区二区在线观看| 中日韩在线视频| 99精品99久久久久久宅男| 久久大综合网| 亚欧成人在线| 国产精品成人免费精品自在线观看| 农村妇女精品| 伊人久久综合| 久久精品99国产精品酒店日本| 亚洲永久视频| 欧美亚男人的天堂| 亚洲免费电影在线观看| 亚洲激情在线观看视频免费| 欧美一区二区视频免费观看| 亚洲一区免费网站| 欧美日韩小视频| 亚洲欧洲日本国产| 亚洲日本激情| 欧美激情亚洲一区| 亚洲人www| 99在线热播精品免费| 欧美黄色片免费观看| 麻豆免费精品视频| 影音先锋日韩精品| 狼狼综合久久久久综合网 | 亚洲美女在线视频| 久久一区中文字幕| 国产色视频一区| 亚洲小说欧美另类婷婷| 99在线精品视频在线观看| 久久亚洲欧美| 亚洲风情亚aⅴ在线发布| 亚洲精品1区2区| 久久综合亚州| 亚洲国产精品va在线观看黑人| 伊伊综合在线| 欧美国产高清| 中文亚洲字幕| 久久久久久日产精品| 狠狠色伊人亚洲综合成人| 久久免费视频在线| 亚洲高清视频在线观看| 一区二区三区视频在线看 | 黑人极品videos精品欧美裸| 久久久久久九九九九| 欧美激情国产高清| 一区二区三区三区在线| 国产久一道中文一区| 久久久亚洲综合| 亚洲另类春色国产| 久久精品噜噜噜成人av农村| 亚洲高清一区二| 欧美午夜不卡在线观看免费 | 欧美日韩美女在线观看| 一区二区三区国产精品| 欧美与黑人午夜性猛交久久久| 国产一区再线| 欧美—级在线免费片| 亚洲欧美一区二区三区极速播放 | 在线视频欧美日韩| 久久久久久综合| av成人黄色| 国内精品久久久久久| 欧美日韩成人在线视频| 欧美在线免费观看视频| 亚洲国产日韩在线| 久久久夜夜夜| 亚洲免费在线视频| 亚洲国产精品t66y| 国产美女精品视频| 欧美美女操人视频| 欧美在线视频在线播放完整版免费观看| 欧美激情精品久久久久久大尺度| 亚洲影视在线| 亚洲精品永久免费精品| 国产主播一区二区| 国产精品久久国产精品99gif | 亚洲一区尤物| 亚洲国产日韩在线| 国产小视频国产精品| 欧美日韩一区高清| 另类春色校园亚洲| 欧美在线视频观看免费网站| 99精品欧美| 亚洲精品美女久久久久| 你懂的成人av| 美女尤物久久精品| 久久亚洲一区|