编程语言的概念
在網絡中很容易引發一場編程語言孰優孰劣的爭論,這是極其幼稚的。因為使用的語言不同而分成不同的陣營,一定要爭個高下優劣是極其不應該的,這不僅離架構 師有遙遠的距離,離一個高產的程序員尚有不小的距離。但并不是說關于編程語言的討論是不應該的,編程語言也是人設計的,缺陷必然有的,需要的是在更高層次 上的探討。一個達到架構師程度的程序員可以有偏愛的語言和討厭的語言,但是面對編程語言時不應該有障礙,站在一個更高的層次上,任何語言都能夠在一周之內學會,對任何語言也能夠有一個客觀的評價和選擇。
任何主流程序語言無外乎輸入、輸出、邏輯控制結構這三要素;雖然有面向過程、面向對象等不同的分類,這也僅僅是這三個要素的組織形式。邏輯控制結構包括順序、選擇、循環、[直接]跳轉。選擇和循環本質上都是邏輯判斷+跳轉。 只需要選擇和循環這兩種形式的跳轉,再加上順序就能夠實現所有的控制結構了,所以直接跳轉在有些語言里就被拋棄了。
考察任何一段代碼塊都是有輸入和輸出 的。輸入有什么?函數或方法的參數、創建或申明的變量、直接量、輸入流等。輸出又有什么呢?函數或方法的返回值、函數或方法的引用或指針類型的參數、變量 賦值、輸出流等。看這樣一個簡單的賦值語句`int a = b*12;`。這就是一個簡單的順序結構,從高級語言層面上可以簡單的看作一步,從匯編和機器語言上看包含了按順序執行的一系列操作;在這個操作中a就是輸出,b是變量類型的輸入,12是直接量類型的輸入。
當前如果一種編程語言僅僅考慮這三個基本的要素,是沒有必要的存在意義的,尤其是在機器語言、匯編語言逐漸少有人會的時候,甚至是C語言。所以在設計一種編程語言的時候必然會考慮到如何組合這三種要素、如果解決一些開發中不得不面對的問題。如何組合這三種要素目前僅需要考慮面向對象這一種。開發中不得不面對的問題有兩個最關鍵的----內存管理和程序執行方式。程序執行方式有編譯成執行文件后執行,從源代碼直接執行兩種。
這兩類問題具體怎么解決的,構成了一種編程語言的最大特色。 比如,java和C#對第一個問題的解決方案是:單一繼承、一切都被類包裝、接口;C++對第一個問題的解決是:多重繼承、類和函數并行。java、 C#、C++在執行方式上并無本質的區別,都需要編譯出結果然后執行;java和C#雖然多個虛擬機或者運行時的東西,如果把這兩個東西和操作系統集成到 一起,這三種語言使用上并沒有什么區別。而Python、Perl這些語言可以在執行環境中從源代碼直接運行。在內存管理方式上,java、C#與C++ 有顯著的區別。java和C#將類型和類型的存儲方式綁定在一起了,class(引用類型)一定是存放在堆上的并且能夠自動釋放,struct和基本類型 (值類型)一定存放在棧上(當然是自動釋放的);引用類型的對象創建之后就獲得了一個指示這個對象位置的值類型對象,這個具有位置指示器作用的值類型對象 的類型叫做引用;值類型的對象創建之后獲得這個對象本身。而C++的類型和類型的存儲方式不是綁定的,任何類型都可以存儲堆上或者棧上;存儲在堆上的對象 所占據的內存是需要明確在代碼中編碼釋放的。
注意前面的用詞,“任何主流程序語言”而不是“任何程序語言”,這是因為主流的程序語言都是命令式的,只有命令式語言才包含邏輯控制結構這一要素。命令式語言特點是需要告訴計算機以怎么樣的步驟完成功能,有邏輯控制結構才能有步驟。當然還存在另外兩種語言----聲明式語言、函數式語言。聲明式語言的特點就是不需要告訴計算機解決問題的步驟,僅輸入需要什么然后等待結果的輸出,那么聲明式語言是沒有邏輯控制結構的,在當前的這種馮·諾依曼體系結構的機器上更準確的說法是聲明式語言隱藏了邏輯控制結構,一般情況聲明式語言是由命令式語言實現的。?聲明式語言最擅長的是數據處理,聲明式語言無法完成命令式語言能完成的所有事情。一個很典型的例子就是SQL,使用SQL在進行查詢的時候沒有指明“讀取 所有數據然后一個個的比對是否符合要求再返回”之類的步驟,而是通過“SELECT what FROM table WHERE condition”這種語句輸入了“從什么地方查找符合什么條件什么東西”這種需求。為了提高編程效率,很多面向對象的編程語言都加入“聲明式編程”的 特性——其實就是通用的分解動作已經被語言或者語言的庫包內置了,比如C#的linq。
轉載于:https://www.cnblogs.com/tgis/p/4717569.html
總結
- 上一篇: plist使用
- 下一篇: Android Dialog 系统样式讲