孫廣東 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中不能:
動态語言/靜态語言
在編譯時檢查類型的語言是靜态類型語言,在運作時檢查類型的語言是動态類型語言。 靜态類型需要聲明類型。 強類型能及早發現問題缺陷。 能為IDE等提供更好的之前。 我是特别喜歡靜态類型語言。
在用動态語言程式設計時,不用給變量指定資料類型,該語言會在你第一次指派給變量時,在内部将資料類型記錄下來。
靜态類型語言 在寫程式時要聲明變量的資料類型。
Python跟Ruby、javaScript類似是動态語言,類型根據=右面的值。
而C、C++等語言則不屬于動态語言。
動的:
優點:友善閱讀,不需要寫非常多的類型相關的代碼;
缺點:不友善調試,命名不規範時會造成讀不懂,不利于了解等
靜的:
優點:結構非正常範,便于調試,友善類型安全
缺點:為此需要寫更多類型相關代碼,不便于閱讀、不清晰明了
python這樣的代碼是不會報錯的: x的類型是動态改變的!!!!
x = 1 x = "shjkg" print(x) |
我在想,對于js, lua ,python 下面這種命名方式不是更好麼?一看就知道類型,友善别人使用和閱讀。但是在C# , Java 中是不推薦,但是她們是靜态類型啊!!!!
編譯型語言 和 解釋型語言
編譯型語言
需通過編譯器(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