天天看點

100多種程式設計語言學什麼?程式設計範型/程式設計範式

孫廣東  2016.4.3    (為什麼是這個日期, 是我存入筆記的日期)

http://blog.csdn.NET/u010019717

        回想一下, 其實程式設計語言基礎到了很多, 大學時的 C, C++,  C#  , Java, 資料庫SQL,  彙編。  畢業後的 Lua, Python , Golang, Ruby ,  javaScript, TypeScript 等 很多隻是接觸皮毛而已。 

首先要知道語言是屬于哪種範類:   強類型/弱類型  ,     動态語言/靜态語言,     編譯/解釋

強類型/弱類型

         如果一門語言很少隐式轉換類型,說明它是強類型語言;如果經常這麼做,說明它是弱類型語言。 Java, C++ 和Python是強類型語言,   PHP, JavaScript 和 Perl是弱類型語言。 強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。

             強類型,一旦一個變量被指定了某個資料類型,如果不經過強制轉換,那麼它就永遠是這個資料類型了,   不允許兩種不同類型的變量互相操作。  強類型定義語言是類型安全的語言。

        比如在Python中不能:

100多種程式設計語言學什麼?程式設計範型/程式設計範式

動态語言/靜态語言

             在編譯時檢查類型的語言是靜态類型語言,在運作時檢查類型的語言是動态類型語言。   靜态類型需要聲明類型。   強類型能及早發現問題缺陷。  能為IDE等提供更好的之前。             我是特别喜歡靜态類型語言。

               在用動态語言程式設計時,不用給變量指定資料類型,該語言會在你第一次指派給變量時,在内部将資料類型記錄下來。

           靜态類型語言  在寫程式時要聲明變量的資料類型。

           Python跟Ruby、javaScript類似是動态語言,類型根據=右面的值。

           而C、C++等語言則不屬于動态語言。

動的:

優點:友善閱讀,不需要寫非常多的類型相關的代碼;

缺點:不友善調試,命名不規範時會造成讀不懂,不利于了解等

靜的:

優點:結構非正常範,便于調試,友善類型安全

缺點:為此需要寫更多類型相關代碼,不便于閱讀、不清晰明了

           python這樣的代碼是不會報錯的:    x的類型是動态改變的!!!!

x = 1

x = "shjkg"  

print(x)

                我在想,對于js, lua ,python 下面這種命名方式不是更好麼?一看就知道類型,友善别人使用和閱讀。但是在C# ,  Java 中是不推薦,但是她們是靜态類型啊!!!!

100多種程式設計語言學什麼?程式設計範型/程式設計範式

編譯型語言 和 解釋型語言

編譯型語言

        需通過編譯器(compiler)将源代碼編譯成機器碼,之後才能執行的語言。一般需經過編譯(compile)、連結(linker)這兩個步驟。

                 C、C++、Pascal、Object-C以及最近很火的蘋果新語言swift

解釋型語言

            解釋性語言的程式不需要編譯,相比編譯型語言省了道工序,解釋性語言在運作程式的時候才逐行翻譯。

               JavaScript、Python、Erlang、PHP、Perl、Ruby

有兩個特殊的語言: 既然編譯型和解釋型各有缺點就會有人想到把兩種類型整合起來,取其精華去其糟粕。就出現了半編譯型語言。C#在編譯的時候不是直接編譯成機器碼而是中間碼.     Java先生成位元組碼(這個位元組碼不是編譯型語言的機器碼)再在Java虛拟機中解釋執行(解釋器)。.net在編譯成IL代碼後,儲存在dll中,首次運作時由JIT在編譯成機器碼緩存在記憶體中,下次直接執行(博友回複指出)。      是以C# 最終執行接近編譯, java 最終執行接近解釋。   Unity和 Mono的技術在ios 上除外。

           C# ,  Java 

多說一句:

              Java位元組碼的執行有兩種方式:

1.即時編譯方式:解釋器先将位元組碼編譯成機器碼,然後再執行該機器碼。(這是C#采用的!)

2.解釋執行方式:解釋器通過每次解釋并執行一小段代碼來完成Java位元組碼程式的所有操作。(通常是這一種)

=============================================================================================================

每個語言都有他優美的地方,讨厭的地方。 我是最不愛參與“xxx是最牛x, 最叼的語言, 是世界上最好的語言”。 說明他一直在井裡!

        每個語言基本上都是多重範式的組合。   

        多重程式設計範式:     并發程式設計,限制程式設計,資料流程式設計(Dataflow programming),聲明性程式設計,分布式的程式設計,函數式程式設計,泛型程式設計,指令式程式設計,邏輯程式設計,元程式設計,面向對象程式設計,和響應式程式設計(Reactive programming)

           注: 一下内容連結, 可能需要科學上網,翻牆!

程式設計範型  :  https://zh.wikipedia.org/zh-cn/%E7%BC%96%E7%A8%8B%E8%8C%83%E5%9E%8B

  • 結構化程式設計對比非結構化程式設計
  • 指令式程式設計對比聲明式程式設計
  • 消息傳遞程式設計對比指令式程式設計
  • 程式程式設計對比函數式程式設計
  • Value-level programming對比Function-level programming
  • 流程驅動程式設計對比事件驅動程式設計
  • 純量程式設計對比陣列程式設計
  • 基于類程式設計對比基于原型程式設計(在面向對象程式設計的上下文中)
  • Rule-based programming對比Constraint programming(在邏輯程式設計的上下文中)
  • 基于元件程式設計(如OLE)
  • 面向方面程式設計(如AspectJ)
  • 符号式程式設計(如Mathematica)
  • 面向表格程式設計(如Microsoft FoxPro)
  • 管道程式設計(如Unix指令中的管道)
  • Post-object programming
  • 面向主題程式設計
  • 自省程式設計或稱反射程式設計

元程式設計

          metaprogramming  。根據百度百科的 介紹 ,是指某類計算機程式的編寫,這類計算機程式編寫或者操縱其他程式(或者自身)作為它們的資料,或者在運作時完成部分本應在編譯時完成的工作。  最早聽說到這個概念是在  C# .Net 平台中有所使用,因為有反射。 一門語言同時也是自身的元語言的能力稱之為反射。編寫元程式的語言稱之為元語言,被操作的語言稱之為目智語言。

           反射是促進元程式設計的一種很有價值的語言特性。支援泛型程式設計的語言也使用元程式設計能力。  

               常見的開發語言均能做到元程式設計,Lisp這貨就不用多說了,C的Marco,C++的Template、宏,Java的Annotation,C#的Attribute、Reflection、 CodeDom 和 IL Emitter, 各種腳本語言python(元程式設計:特性、描述符、類裝飾器和元類等等),、Ruby , Elixir  ,甚至連Unix/Linux的shell腳本也能。Javascript 中,eval、new Function()便是兩個可以用來進行元程式設計的特性。

            元程式設計常見的應用場景很多,擴充(重構)文法、開發DSL、生成代碼、根據特定場景自動選擇代碼優化、解決一些正交的架構設計問題、AOP等等。

  連結: https://www.zhihu.com/question/22572900/answer/21828721

            《元程式設計藝術》 系列文章,  《Ruby元程式設計》, 

           我在學習的時候好奇過,就搜尋了一下  【Python的decorater,與C#的attribute和Java的annotation有何異同? - 知乎】,  結論就是完全不是一回事兒。 

https://www.zhihu.com/question/40618143

指令式程式設計  和  聲明式程式設計

          可以對比的(Imperative vs Declarative)

指令式程式設計:    應該是所有 C語言系的 ,有普通函數的語言都算。

聲明式程式設計語言:SQL  、  d3.js ,  Python的 推導或内涵 ,C#中的特性  等等吧

網上流傳着 這樣的總結:

指令式程式設計: 指令“機器”如何去做事情(how),這樣不管你想要的是什麼(what),它都會按照你的指令實作。
聲明式程式設計: 告訴“機器”你想要的是什麼(what),讓機器想出如何去做(how)。

響應式程式設計

            例如,在指令式程式設計環境中,a := b+c 表示将表達式的結果賦給,而之後改變b或c的值不會影響a。但在響應式程式設計中,a的值會随着b或c的更新而更新。

電子表格程式就是響應式程式設計的一個例子。單元格可以包含字面值或類似"=B1+C1"的公式,而包含公式的單元格的值會依據其他單元格的值的變化而變化。

             例如,在MVC軟體架構中,響應式程式設計允許将相關模型的變化自動反映到視圖上(資料綁定),反之亦然。

來自 <https://zh.m.wikipedia.org/wiki/%E5%93%8D%E5%BA%94%E5%BC%8F%E7%BC%96%E7%A8%8B> 

             未完, 待續。。。。。

孫廣東  2017.8.3

http://blog.csdn.NET/u010019717

繼續閱讀