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