鍓嶄簺澶╃粍閲岃佸徃鏈篅姊佸笇鍦╦vm鐨勯」鐩Θ騫叉満鍣ㄦц兘涔嬩綑錛屼負浜嗘鏌ヤ笅gcc緙栬瘧鍣ㄥ拰Intel Xoen CPU鐨勬紜э紝鍐欎簡涓緇勬祴璇曚唬鐮佹祴璇曚簡涓媘fence鎸囦護鐨勬晥鏋?/p>
`
mfence Opcode : 0F AE /6
Performs a serializing operation on all load-from-memory and store-to-memory instructions that were issued prior the MFENCE instruction. This serializing operation guarantees that every load and store instruction that precedes in program order the MFENCE instruction is globally visible before any load or store instruction that follows the MFENCE instruction is globally visible. The MFENCE instruction is ordered with respect to all load and store instructions, other MFENCE instructions, any SFENCE and LFENCE instructions, and any serializing instructions (such as the CPUID instruction).
Weakly ordered memory types can be used to achieve higher processor performance through such techniques as out-of-order issue, speculative reads, write-combining, and write-collapsing.
The degree to which a consumer of data recognizes or knows that the data is weakly ordered varies among applications and may be unknown to the producer of this data. The MFENCE instruction provides a performance-efficient way of ensuring load and store ordering between routines that produce weakly-ordered results and routines that consume that data.
It should be noted that processors are free to speculatively fetch and cache data from system memory regions that are assigned a memory-type that permits speculative reads (that is, the WB, WC, and WT memory types). The PREFETCHh instruction is considered a hint to this speculative behavior. Because this speculative fetching can occur at any time and is not tied to instruction execution, the MFENCE instruction is not ordered with respect to PREFETCHh instructions or any other speculative fetching mechanism (that is, data could be speculatively loaded into the cache just before, during, or after the execution of an MFENCE instruction).
`
綆鍗曟潵璇村氨鏄竴涓彲浠ュ湪CPU涔卞簭鎵ц涓繚璇佺湡瀹炵殑load/store欏哄簭鐨勬寚浠?br />
澶ф閫昏緫鏄細 涓鍏辨湁3涓彉閲忥紝v1.i
, v2.i
, b
,璧蜂簡2涓嚎紼嬶紝涓涓『搴忓啓鍏1鍜寁2錛屼竴涓v1鍜寁2錛屼簰鐩擱氳繃鏀瑰彉b鐨勫兼潵閫氳錛岀劧鍚庝袱涓嚎紼嬩笉鍋滃驚鐜?/p>
榪欎釜紼嬪簭浼氭寕鍦?br />printf("assert error, cnt = %d, icnt = %d, i1 = %d, i2 = %d\n", cnt, icnt, i1, i2);
榪欐潯鏂█涓婏紝鎰忔濇槸綰跨▼1鍦ㄩ『搴忓啓鍏1鍜寁2錛屼絾鏄富綰跨▼鍗村嚭鐜拌鍒?v1=0錛寁2=1鐨勬儏鍐點?br />
鐒跺悗鎴戝府蹇欏幓鐪嬩簡涓涓嬶紝瑙夊緱榪欑鍐欐硶鐢氭槸綺楁毚錛屼簬鏄師鏍風収鎼簡涓涓猚++11鐗?
鍥犱負鏄師鏍風収鎼紝鎵浠ヨ偗瀹氳繕鏄細鎸傦紝浣嗘槸姣曠珶璇箟涓婃洿濂界悊瑙d簡
鎴戜滑鍏堟潵鍒嗘瀽涓涓嬩負浠涔堜細鎸?/p>
鍦ㄦ棫鍐欐硶涓紝鎸傛帀鐨勬儏鍐墊槸綰跨▼1鍐欏叆v1 = 1錛屼富綰跨▼璇籿1錛屾病鏈夎鍒幫紝閭d箞涓葷嚎紼嬭涓簐1鏄?錛岀劧鍚庣嚎紼?緇х畫鍐欏叆v2錛屼富綰跨▼璇誨埌浜嗭紝涓葷嚎紼嬭涓簐2鏄?銆?鐒跺悗鎸傚湪浜嗘柇璦涓娿?/p>
涓よ浜掓崲鍚庯紝涓葷嚎紼嬮鍏堣鍙杤2錛屽鏋渧2宸茬粡鏄?浜嗭紝閭d箞v1涔熶竴瀹氭槸1錛屽弽涔嬩害鐒躲?/p>
褰撶劧錛屾兂璁╄窇閫氶偅涓緥瀛愪笉闇瑕侀偅涔堝鐨刟tomic<>錛岀簿綆涔嬪悗鍒╃敤c++11鐨刴emory_order鍙互鍐欐垚濡備笅錛?br />
鍒╃敤鍙橀噺b鍦ㄤ袱涓嚎紼嬩箣闂村悓姝ワ紝濡備笅鍥?br />
鎴戜滑鏌ョ湅涓嬬敓鎴愮殑浠g爜g++ -std=c++11 -pthread -g -O2 order.cpp
鐪嬫潵Intel鐨凷trong Memory Model宸茬粡淇濊瘉浜嗚繖涓鐐癸紝Memory Barrier閮戒笉闇瑕佷簡
錛堣櫧鐒舵爣棰橀噷闈㈡湁MemoryBarrier錛屼絾鏄唴瀹歸噷闈㈡牴鏈病娑夊強鐨勬牱瀛愩傘傦級
鍑芥暟寮忕紪紼嬭璦鏈夊緢澶氱瀹氫箟錛屽娉涚殑璁や負鏀寔楂橀樁鍑芥暟錛坔igher-order function錛夊氨綆楀嚱鏁板紡璇█鐨勮瘽錛屽ぇ澶氭暟鐜頒唬璇█閮芥槸鏀寔鍑芥暟寮忕紪紼嬬殑錛屼緥濡侰/C++錛宩ava錛孋#錛宭ua錛宲ython錛孞avaScript錛孲cala絳夌瓑銆傛敹绱т竴涓嬪畾涔夌殑璇濓紝鍔犲叆鍑芥暟寮忚璦瑕佹眰鐨勬ā寮忓尮閰嶃佹棤鍓綔鐢ㄧ瓑瑕佹眰錛岄偅涔堝墿涓嬬殑灝辨槸綰嚱鏁板紡璇█錛屾瘮杈冨父瑙佺殑鏈塇askell錛孋lean絳夈?/p>
鍓綔鐢ㄦ槸浠涔堝拰涓轟粈涔堟湁浜涜璦鎯沖湪璁捐涓婇伩鍏嶅壇浣滅敤榪欎釜闂錛実oogle鑳芥悳鍑哄ソ澶氬崥鏂囷紝榪欓噷灝變笉澶氳浜嗐傞伩鍏嶅壇浣滅敤鍙互甯︽潵涓浜涘疄闄呯殑濂藉錛屾瘮濡傚府浣犲ぇ閲忔敼鍐欎唬鐮佷粈涔堢殑錛堣錛夛紝鑰屼笖榪瀏cc閮芥湁 _ _ attribute _ _((pure/const))鐨勫嚱鏁版墿灞曞槢~銆傛瘮濡傚儚erlang榪欑渚濊禆浜庡壇浣滅敤緙栫▼鐨勮璦錛岃櫧鐒舵湁鐫鍙橀噺涓嶅彲鍙樿繖涓壒鎬э紝浣嗘槸浠嶇劧鍙互璇誨啓process鎼哄甫鐨勫叏灞鍙橀噺錛岃屼笖鍙堟病鏈変竴涓ソ鐨勭被鍨嬬郴緇燂紝鎵浠ュ湪緙栬瘧鐨勬椂鍊欎篃涓嶄細鎬庝箞澶ф敼浣犵殑浠g爜錛屽ぇ澶氳繕鏄洿璇戞垚瀛楄妭鐮併?/p>
娉細榪欑瘒鏂囩珷涓嶆槸**杞枃**錛屼笉浼氱敤涓猤(f(x))灝卞綋渚嬪瓙緇欏ぇ瀹惰鏃犲壇浣滅敤澶氫箞澶氫箞濂斤紝鍙紦瀛樼粨鏋滄媺(just a lie)~鍘熺敓鏀寔騫惰鎷?just another lie)錛岃繖浜涢兘鏄壇娣¤屼笖涓嶅疄闄呯殑銆傦紙鏈夋満浼氬啀鍐欎釜鍗氬涓撻棬璋堣皥榪欎釜錛?/p>
棣栧厛錛岀函鍑芥暟寮忕殑璇█寮鴻皟娌℃湁鍓綔鐢紝瀹冧笉浼氭敼鍙樹換浣曞疄闄呯殑涓滆タ錛屽綋鐒朵篃娌℃湁錛堝叏灞鐨勶級鐘舵侊紝榪欐牱鐨勭▼搴忓鏋滀笉閰嶄笂浠h〃鍓綔鐢ㄧ殑杈撳叆杈撳嚭褰撶劧鏄粈涔堥兘騫蹭笉浜嗙殑銆傞偅涔堝浣曟妸鍓綔鐢ㄥ祵鍏ュ埌鏈笉璇ユ湁鍓綔鐢ㄧ殑璇█璁捐涓偅錛熷綋鐒朵笉鑳界洿鎺ヨ祴鍊鹼紝涓嶇劧銆傘備笉鐒躲傘傚氨鍙樻垚鍛戒護寮忚璦浜嗭紝鑰屼笖鍑芥暟寮忚璦緙栬瘧涓紩浠ヤ負璞殑鍚勭浼樺寲pass鍑犱箮閮戒笉鑳界敤浜嗐傞偅涔堟妸鏈夊壇浣滅敤鐨勫嚱鏁版爣娉ㄥ嚭鏉ワ紵褰撶劧鏄竴涓姙娉曘傝繕鏈夊氨鏄妸鍓綔鐢ㄧ殑琛ㄨ揪寮忛兘鍖呭惈鍦╟ontext涓紝闅忕潃鍑芥暟浼犻掞紝淇濊瘉欏哄簭鑰屼笖瑕佷繚璇佸紩鐢ㄧ殑鍞竴鎬с?/p>
浣滀負綰嚱鏁板紡璇█鐨勪唬琛紝Haskell鍜孋lean瀵逛簬鍓綔鐢ㄧ殑璁捐瀹炵幇涓婂樊鍒緢澶э紝涓嬮潰灝辯畝鍗曡涓涓嬪畠浠殑瀹炵幇錛屽埁鏍圭┒搴曪紝鍏跺疄瀹冧滑鍋氱殑榪樻槸鍚屼竴浠朵簨鎯呫?/p>
Haskell涓湁涓涓緢閲嶈鐨勬蹇碉細Monad錛屽彇鍚嶈嚜鑼冪暣璁猴紝鍙互綺楁祬鐨勮涓哄畠灝辨槸瀹氫箟浜嗕竴緋誨垪鐨勮涓哄噯鍒欙紙>>= , return錛夈侶askell涓ぇ澶氭暟璇硶緋栭兘鏄負浜嗚繖涓彂鏄庢潵鐨勩侶askell鐨勬爣鍑嗗簱涓湁寰堝鍏充簬鍓綔鐢ㄧ殑綾誨簱灝佽錛屾瘮濡侷ORef錛孧Var錛孖OMonad絳夌瓑錛屼粬浠殑鍐呴儴瀹炵幇閮戒細褰掔粨鍒癝T Monad錛圫tate Thread Monad錛変笂錛屾鏄繖涓笌forall鍏抽敭瀛楃殑緇撳悎錛屼粠鑰屽湪璇硶涓婁繚璇佷簡鍓綔鐢ㄥ祵鍏ュ湪錛堢函錛塇askell涓殑姝g‘鎬с?br style="box-sizing: border-box;" />ST Monad閲岄潰涓昏鐨勫畾涔夋槸錛?/p>
newtype ST s a = ST (STRep s a)
type STRep s a = State# s -> (# State# s, a #)
data STRef s a = STRef (MutVar# s a)
runST :: (forall s. ST s a) -> a
runSTRep :: (forall s. STRep s a) -> a
鍏朵腑鏈鍏抽敭鐨勬槸ST s a 涓?STref s a 榪欎袱涓暟鎹粨鏋勩?/p>
鍏堢湅鐪嬭繖涓敤娉曪紝let a0 = runST $ newSTRef 0
錛屼細寮曞彂涓涓猼ype error銆傚洜涓簉unST鐨勭被鍨嬫槸(forall s.ST s a) -> a
錛屽弬鏁?code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14.5454540252686px; padding: 2px 4px; color: #c7254e; white-space: nowrap; border-radius: 2px; background-color: #f9f2f4;">(newSTRef 0)鐨勭被鍨嬫槸forall s. ST s (STRef s Int)
錛屾渶鍚庢眰鍊煎悗鐨勭粨鏋滄槸a0::STRef s Int
錛屾樉鐒秙鑴辯浜嗗師鏈殑瀹氫箟鍩燂紙涔熷氨鏄偅灞俧orall涔嬪錛宖orall鏄疕askell涓彁渚?*RankNType**鐨勫叧閿瓧錛夈備粠鑰岀敤鎴峰氨鍙兘浣跨敤涓嬮潰鐨勬柟寮忥細
sumST :: Num a => [a] -> a
sumST xs = runST $ do
n <- newSTRef 0
forM_ xs $ \x -> do
modifySTRef n (+x)
readSTRef n
涓嶇敤鏍囧嚭鏍囧嚭鍏蜂綋瀹炵幇錛屽ぇ瀹跺氨鑳界湅鍑轟粬鍋氱殑浜嬫儏灝辨槸鍋氫簡涓灞倃rapper錛屽湪type checker涓婁繚璇佽box涔嬪悗涓嶄細琚敤鎴峰彇鍑烘潵涔辨敼銆傝嚦浜庡浣曞仛鍒癲estructive in-place update錛岃繖灝卞睘浜庣紪璇戝櫒鐨勯粦欖旀硶浜嗭紝璇█榪欏眰鍙渶淇濊瘉璇箟灝卞ソ銆傦紙**娉細**ghc鐨勫疄鐜頒腑錛孲T Monad鏍囧噯搴撶敤鍒頒簡ghc鐨剈nsafe鎵撳ご鐨勫唴緗嚱鏁幫級
Clean璇█鐢ㄧ殑絳栫暐鏄嚎鎬х被鍨嬬郴緇燂紙linear type system錛夛紝鏄疭ubstructural type sysytem鐨勪竴縐嶃傚湪Curry-Howard鍚屾瀯涓搴擲ubstructrual logic銆傝繖綾葷被鍨嬬郴緇熶腑錛屼笉浣嗗彲浠ュ喅瀹氫竴涓彉閲忔槸浠涔堢被鍨嬶紝榪樺彲浠ョ害鏉熻浣跨敤鐨勬鏁頒笌欏哄簭銆傚湪Mozilla鍑虹殑Rust璇█涓紝涔熷彲浠ョ湅鍒扮嚎鎬х被鍨嬬殑褰卞瓙銆?/p>
鍏堜婦涓牀瀛悀
transform :: (Int -> Int) *{#Int} -> *{#Int}
transform f s
| size s == 0 = s
| otherwise = if (s.[0] == 0)
{f i \\ i <-: s}
{f i \\ _ <-: s & i <- [s.[0]..]}
錛堜笉瑕佸湪鎰忓鎬殑璇硶錛岋經锝濋噷闈㈠叾瀹炲氨鏄痩ist comprehension錛?/p>
鍏朵腑*灝辨槸uniqueness type鐨勬爣娉紝榪欎釜鍑芥暟鐨勭被鍨嬬敤haskell鍐欏嚭鏉ュ氨鏄?code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14.5454540252686px; padding: 2px 4px; color: #c7254e; white-space: nowrap; border-radius: 2px; background-color: #f9f2f4;">transform :: (Int -> Int) -> *[Int] -> *[Int]銆傝繖涓嚱鏁拌櫧鐒舵病鏈夊緢濂界殑鐪嬪嚭uniqueness type鐨勭壒鎬у拰浼犳挱鎬э紝浣嗘槸浣滀負綆鍗曠殑渚嬪瓙錛屽樊涓嶅灝辨槸榪欎箞鍥炰簨銆?br style="box-sizing: border-box;" />瀵逛簬uniqueness type鏈鐩磋鐨勭悊瑙e氨鏄甫鏈夎繖涓爣璇嗙殑綾誨瀷鏄笉鑳藉弬涓庡埌浠ュ悗Graph Reduction涓紝鑰屼笖浼氭嫻嬩細涓嶄細鏈夊涓?#8220;鍙橀噺”鎸囧悜浠栥備笂闈㈣繖涓嚱鏁頒腑灝變笉浼氬瓨鍦ㄥ涓猍Int]鍙婄浉鍏崇殑鍓湰絳夌潃琚洖鏀訛紝鑰屾槸浼氱洿鎺ュ湪錛圧eadWorld涓殑錛夊唴瀛樹笂鏇存柊鏁版嵁銆?/p>
鍏跺疄宸茬粡鐪嬪嚭錛屽湪涓婇潰Haskell涓嶤lean鐨勫仛娉曚腑錛屼竴涓槸鍒╃敤forall鍏抽敭瀛椾笌ST Monad+緙栬瘧鍣ㄩ粦欖旀硶錛屽彟涓涓槸build-in鍦ㄧ被鍨嬬郴緇熶腑錛屼絾鏄湰璐ㄩ兘鏄仛浜嗕竴浠朵簨鎯咃紝灝辨槸淇濊瘉RealWorld涓殑瀵硅薄涓嶄細瀛樺湪澶氫釜寮曠敤錛岃屼笖鍦℅raph Reduction涓笉浼氳緙栬瘧鍣ㄦ悶涔遍『搴忥紝榪欐牱灝辮兘铻嶅叆鍒版暣涓函鍑芥暟寮忕殑澶т綋緋諱腑浜嗐?/p>
鏈漢鍗氬鍦板潃錛坔ttp://m.shnenglu.com/pwq1989/錛?br />