日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
6個新奇的編程方式,改變你對編碼的認知

我時不時會發(fā)現(xiàn)一種編程語言的不同用法它有時候會改變我對編程的看法啊。這篇文章中,我想分享一下讓我驚訝的發(fā)現(xiàn)。這不是類似于高呼“函數(shù)式編程會改變世界!”博客文章。我敢打賭,大多數(shù)讀者都沒有聽說過下面的大多數(shù)語言和范例,所以你應該也會被這些新概念吸引。

10年積累的成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先做網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有水磨溝免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

注意:我對以下大多數(shù)語言的使用經(jīng)驗都很少,但是我發(fā)現(xiàn)他們背后的想法非常吸引人,但對其沒有專業(yè)知識,所以有任何錯誤請指出并指導更正。如果您也有新的范例和想法,歡迎分享。

默認并發(fā)

示例語言:ANI, Plaid

讓我們用一個哲學家的思想來解決問題吧:有些編程語言是默認情況下并發(fā)的,也就是說,每行代碼都是并行執(zhí)行的。

例如,假設(shè)你寫了三行代碼,A,B和C:

 
 
 
  1. A;
  2. B;
  3. C;

在大多數(shù)編程語言中,A先執(zhí)行,然后執(zhí)行B,***執(zhí)行C。在像ANI這樣的語言中,A,B和C都將同時執(zhí)行。

ANI中代碼行之間的控制流或排序,僅僅是代碼行之間顯式依賴關(guān)系的副作用。例如,如果B引用了A中定義的變量,則A和C將同時執(zhí)行,而B只會在A完成后執(zhí)行。

以下是ANI中的“Hello World”示例:

 
 
 
  1. "Hello, World!" ->std.out

在ANI術(shù)語中,我們將"Hello, World!"對象(字符串)發(fā)送到std.out流。如果我們發(fā)送另一個字符串,會發(fā)生 std.out什么

 
 
 
  1. "Hello, World!" ->std.out
  2. "Goodbye, World!" ->std.out

這兩行代碼并行執(zhí)行,因此它們可以在控制臺中以任何順序結(jié)束?,F(xiàn)在,看看當我們在一行上引入一個變量并參考它會發(fā)生什么:

 
 
 
  1. s = [string\];
  2. "Hello, World!" ->s;
  3. \s ->std.out;

***行聲明一個“鎖存(latch)”(鎖存器有點像變量),調(diào)用 s它包含一個字符串; 第二行將文本賦值 "Hello, World!"給s; 第三行“解鎖” s并將內(nèi)容發(fā)送給std.out。在這里,您可以看到ANI的隱式程序排序:由于每行都依賴于前一行,因此此代碼將按寫入的順序執(zhí)行。

Plaid 語言還聲稱通過默認支持并發(fā)性,但使用權(quán)限模型,如在本文中,設(shè)置控制流程。多核技術(shù)正在興起,并發(fā)性仍然是大多數(shù)語言中難點。ANI 和 Plaid 提供了一個新的解決方案,可以帶來驚人的性能提升;,問題在于“默認并行”是否會改變開發(fā)的狀態(tài)。有關(guān)更多信息,請參閱并發(fā)性并行性。

相關(guān)類型

示例語言:Idris, Agda, Coq

你可能習慣使用C和Java等語言來鍵入系統(tǒng),編譯器可以檢查變量是整數(shù),列表還是字符串。但是如果你的編譯器能檢查一個變量是“一個正整數(shù)”,“一個長度為2的列表”還是“一個回文字符串”呢?

下面是如何聲明一個Vector包含無形庫1,2,3的值:

 
 
 
  1. val l1 = 1 :#: 2 :#: 3 :#: VNil

這將創(chuàng)建一個變量l1,它的類型簽名不僅指定它Vector是包含的Ints,而且指定它的Vector長度為3.編譯器可以使用此信息來捕獲錯誤。讓我們使用該vAdd方法在Vector兩個之間執(zhí)行成對加法Vectors:

 
 
 
  1. val l1 = 1 :#: 2 :#: 3 :#: VNil
  2. val l2 = 1 :#: 2 :#: 3 :#: VNil
  3.  
  4. val l3 = l1 vAdd l2
  5.  
  6. // Result: l3 = 2 :#: 4 :#: 6 :#: VNil

上面的例子工作正常,因為類型系統(tǒng)知道兩者 Vectors都有長度3.但是,如果我們嘗試了vAdd 兩種Vectors不同的長度,我們沒等到運行時就會在編譯時得到一個錯誤。

 
 
 
  1. val l1 = 1 :#: 2 :#: 3 :#: VNil
  2. val l2 = 1 :#: 2 :#: VNil
  3.  
  4. val l3 = l1 vAdd l2
  5.  
  6. // Result: a *compile* error because you can't pairwise add vectors 
  7. // of different lengths!

Shapeless 是一個仍然有點粗糙的庫,只支持依賴類型的一個子集,并有相當冗長的代碼和類型簽名。相反,Idris使得類型成為編程語言的***類成員,因此依賴類型系統(tǒng)似乎更加強大和干凈。為了進行比較,請查看Scala vs Idris:相關(guān)類型,現(xiàn)在以及未來的討論。

連貫語言

示例語言:Forth, cat,joy

有沒有想過不用變量和函數(shù)應用程序編程會是什么樣子?至少我沒有,但顯然有些人這么想了,他們提出了連續(xù)編程。這個想法是,語言中的所有內(nèi)容都是將數(shù)據(jù)推送到堆棧或從堆棧中彈出數(shù)據(jù)的函數(shù); 程序幾乎完全通過功能組合(串聯(lián)組合)來構(gòu)建。

這聽起來很抽象,所以我們來看看cat中的一個簡單例子 :

 
 
 
  1. 2 3 +

在這里,我們將兩個數(shù)字推入堆棧,然后調(diào)用該+函數(shù),將兩個數(shù)字從堆棧中彈出,并將其添加到堆棧中的結(jié)果:代碼的輸出為5。下面是一個稍微有趣的示例:

 
 
 
  1. def foo {
  2.   10 <
  3.   [ 0 ]
  4.   [ 42 ]
  5.   if
  6. }
  7.  
  8. 20
  9. foo

讓我們一行一行地瀏覽一下:

  1. 首先,我們聲明一個函數(shù)foo。請注意,cat中的函數(shù)沒有指定輸入?yún)?shù):所有參數(shù)都從堆棧中隱式讀取。
  2. foo調(diào)用<函數(shù),該函數(shù)彈出的***項在堆棧中,將它與10,并且推動任一True或 False背面壓入堆棧。
  3. 接下來,我們將值0和42輸入堆棧:我們將它們包括在括號中以確保它們未被執(zhí)行就推入堆棧。這是因為它們將分別用于調(diào)用if下一行函數(shù)的“then”和“else”分支。
  4. 該if函數(shù)從堆棧中彈出3個項目:布爾條件,“then”分支和“else”分支。根據(jù)布爾條件的值,它會將“then”或“else”分支的結(jié)果輸回堆棧。
  5. ***,我們將20輸入堆棧并調(diào)用foo函數(shù)。
  6. 當所有的事情都做完后,會得到一個42的結(jié)果

這種編程風格頗有趣味:程序可以以無數(shù)種方式拆分和連接以創(chuàng)建新程序; 非常簡單的語法(甚至比LISP更簡單),導致非常簡潔的程序; 也具有強大的元編程支持??雌饋砟惚仨氂涀』蛳胂蠖褩5漠斍盃顟B(tài),而不是能夠從代碼中的變量名稱中讀取它,這可能使得很難推斷代碼。

聲明式編程

示例語言:Prolog, SQL

聲明式編程已經(jīng)存在了很多年,但大多數(shù)程序員仍然不知道這個概念。這里的要點是:在大多數(shù)主流語言中,你需要描述如何解決一個特定的問題; 在聲明性語言中,你只需描述你想要的結(jié)果,而語言本身就能找出到達那里的方法。

例如,如果您在C中從頭開始編寫排序算法,例如編寫合并排序的指令,該指令逐步描述如何遞歸地將數(shù)據(jù)集分成一半并按排序順序合并到一起。如果您使用像Prolog這樣的聲明性語言對數(shù)字進行排序 ,則應該描述所需的輸出:“我需要相同的值列表,但索引中的每個項目 i應小于或等于索引處的項目i + 1”。將以前的C解決方案與此Prolog代碼進行比較:

 
 
 
  1. sort_list(Input, Output) :-
  2.   permutation(Input, Output),
  3.   check_order(Output).
  4.   
  5. check_order([]).
  6. check_order([Head]).
  7. check_order([First, Second | Tail]) :-
  8.   First =< Second,
  9.   check_order([Second | Tail]).

如果你使用過SQL,那么你已經(jīng)完成了一種聲明式編程,你可能沒有意識到這一點:當你發(fā)出查詢時select X from Y where Z,你正在描述你想要返回的數(shù)據(jù)集;它是真正計算出如何執(zhí)行查詢的數(shù)據(jù)庫引擎。

聲明性語言的美妙之處在于它允許你在更高層次的抽象中工作:你只需要描述所需輸出的規(guī)范。例如,prolog中簡單數(shù)獨求解器的代碼,只是列出了解決的數(shù)獨謎題的每行,每列和對角線應該是什么樣的:

 
 
 
  1. sudoku(Puzzle, Solution) :-
  2.   Solution = Puzzle,
  3.   
  4.   Puzzle = [S11, S12, S13, S14,
  5.             S21, S22, S23, S24,
  6.             S31, S32, S33, S34,
  7.             S41, S42, S43, S44],
  8.   
  9.   fd_domain(Solution, 1, 4),
  10.   
  11.   Row1 = [S11, S12, S13, S14],
  12.   Row2 = [S21, S22, S23, S24],
  13.   Row3 = [S31, S32, S33, S34],
  14.   Row4 = [S41, S42, S43, S44],      
  15.   
  16.   Col1 = [S11, S21, S31, S41],
  17.   Col2 = [S12, S22, S32, S42],
  18.   Col3 = [S13, S23, S33, S43],
  19.   Col4 = [S14, S24, S34, S44],      
  20.   
  21.   Square1 = [S11, S12, S21, S22],
  22.   Square2 = [S13, S14, S23, S24],
  23.   Square3 = [S31, S32, S41, S42],
  24.   Square4 = [S33, S34, S43, S44],      
  25.   
  26.   valid([Row1, Row2, Row3, Row4,
  27.          Col1, Col2, Col3, Col4,
  28.          Square1, Square2, Square3, Square4]).
  29.  
  30. valid([]).
  31. valid([Head | Tail]) :- fd_all_different(Head), valid(Tail).

以下是數(shù)獨解算器的運行結(jié)果:

 
 
 
  1. | ?- sudoku([_, _, 2, 3,
  2.              _, _, _, _,
  3.              _, _, _, _,
  4.              3, 4, _, _],
  5.              Solution). 
  6.  
  7. S = [4,1,2,3,2,3,4,1,1,2,3,4,3,4,1,2]

不幸的是,聲明式編程語言很容易造成性能瓶頸。上面的排序算法很可能 O(n!)讓數(shù)獨解算器進行了一次強力搜索; 而且大多數(shù)開發(fā)人員必須提供數(shù)據(jù)庫提示和額外索引,避免執(zhí)行SQL查詢時出現(xiàn)代價高昂且效率低下的情況。

符號編程

示例語言:Aurora

Aurora語言是一個典型的符號編程的例子:它不僅包括純文本編程,而且還包括圖像,數(shù)學方程,圖形,圖表等。這能夠用該數(shù)據(jù)的原始格式操作和描述各種數(shù)據(jù),而不是用文本描述所有數(shù)據(jù)。Aurora也是完全互動的,可以立即顯示每行代碼的結(jié)果,例如 REPL。

Aurora語言由Chris Granger創(chuàng)建,他也創(chuàng)建了Light Table IDE。Chris在他的文章中概述了Aurora的動機:實現(xiàn)更好的編程。目標是使編程更加具有可觀察性,直接并減少偶然的復雜性。欲了解更多信息,請務必查看Bret Victor令人難以置信的會談: Inventing on Principle, Media for Thinking the Unthinkable, and Learnable Programming。

基于知識的編程

示例:Wolfram語言

像上面提到的 Aurora 語言一樣,Wolfram語言也是基于符號編程的。但是,符號層僅僅是為Wolfram語言的核心提供一致的接口的一種方式,這是基于知識的編程:內(nèi)置于大量的庫,算法和數(shù)據(jù)。這使得從繪制Facebook連接到操縱圖像,查看天氣,處理自然語言查詢,繪制地圖上的方向,求解數(shù)學方程式等等都可以輕松地完成。

我懷疑 Wolfram 語言是否有***的“標準庫”和有任何語言的數(shù)據(jù)集?;ヂ?lián)網(wǎng)的連接是編寫代碼的內(nèi)在組成部分的想法讓我感到興奮:它幾乎就像一個自動完成功能進行谷歌搜索的IDE。符號編程模型是否像Wolfram聲稱的那樣靈活,而且可以真正利用所有這些數(shù)據(jù)?如果是的話,會很有趣。

更新:雖然Wolfram聲稱Wolfram語言支持“符號編程”和“知識編程”,但這些術(shù)語的定義略有不同。更多有關(guān)信息,請參閱知識編程和符號編程wiki。


新聞標題:6個新奇的編程方式,改變你對編碼的認知
網(wǎng)頁路徑:http://www.5511xx.com/article/dpososi.html