成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

編程語(yǔ)言的本質(zhì)是什么?

開(kāi)發(fā) 后端
我們會(huì)用 Javascript、Typescript 來(lái)寫(xiě)前端應(yīng)用,用 Java、Go 等來(lái)寫(xiě)后端應(yīng)用,也會(huì)用 Python 來(lái)寫(xiě)一些工具腳本。

[[434214]]

本文轉(zhuǎn)載自微信公眾號(hào)「神說(shuō)要有光zxg」,作者說(shuō)要有光zxg。轉(zhuǎn)載本文請(qǐng)聯(lián)系神說(shuō)要有光zxg公眾號(hào)。

作為程序員,我們會(huì)接觸到各種各樣的語(yǔ)言:

我們會(huì)用 Javascript、Typescript 來(lái)寫(xiě)前端應(yīng)用,用 Java、Go 等來(lái)寫(xiě)后端應(yīng)用,也會(huì)用 Python 來(lái)寫(xiě)一些工具腳本。

每種語(yǔ)言都有自己的語(yǔ)法和擅長(zhǎng)的領(lǐng)域,那不同的編程語(yǔ)言的區(qū)別是什么呢?編程語(yǔ)言的本質(zhì)是什么呢?

這篇文章我們嘗試探究一下。

從硬件到語(yǔ)言

不同的語(yǔ)言最終都是控制計(jì)算機(jī)的一些硬件來(lái)工作的,從硬件層面來(lái)看他們是沒(méi)有區(qū)別的。各種語(yǔ)言只不過(guò)描述邏輯的方式、 api 的封裝方式不同而已,底層都跑在同一套硬件上。

那硬件層面做了啥呢?

就拿打印機(jī)來(lái)說(shuō),它本身是一個(gè)機(jī)械的結(jié)構(gòu),但是控制機(jī)械工作的確是通過(guò)電子的方式,也就是 0 和 1 的電信號(hào),一般控制它工作的芯片都有不同的引腳,傳高低電平代表不同的含義,那么就可以通過(guò)高低電平來(lái)控制打印機(jī)做不同的工作。

控制硬件工作的程序就叫做驅(qū)動(dòng)程序,它把硬件的能力做了封裝,提供了各種 api。這樣,我們就可以通過(guò)程序控制各種硬件了。

這些硬件中最特殊的是 CPU,其他硬件提供的指令都是控制該硬件工作的,而 CPU 提供的指令確是可以描述各種邏輯,可以讀寫(xiě)內(nèi)存,進(jìn)而控制其他硬件。

這樣我們就不用直接控制其他硬件,而是可以通過(guò) CPU 來(lái)間接的控制各種硬件,所以,它叫做中央處理器。這些機(jī)器指令叫做指令集,由它所描述的邏輯,就是機(jī)器語(yǔ)言。

硬件是通過(guò)電子來(lái)控制機(jī)械,提供了驅(qū)動(dòng)程序,然后又通過(guò) CPU 來(lái)實(shí)現(xiàn)各種通用的邏輯,進(jìn)而控制其他硬件。CPU 提供的指令集所描述的邏輯,就叫做機(jī)器語(yǔ)言,這是我們寫(xiě)的程序最底層的樣子。

為什么要有操作系統(tǒng)

計(jì)算機(jī)上肯定不能只跑一個(gè)程序,那是最早的計(jì)算機(jī),現(xiàn)在的計(jì)算機(jī)都是支持多個(gè)程序的并發(fā)的。但是不管跑了多少了程序,都是在同一個(gè)硬件上跑,只是做了順序、優(yōu)先級(jí)等的安排,這種叫做調(diào)度,實(shí)現(xiàn)多個(gè)程序的調(diào)度的程序就是操作系統(tǒng)。

既然是為了讓多個(gè)程序都能跑在同一個(gè)硬件上,那得先給這個(gè)跑起來(lái)的程序一個(gè)名字,就叫做進(jìn)程。進(jìn)程調(diào)度是 CPU 最主要做的事情。進(jìn)程要用各種硬件,那也就還需要內(nèi)存調(diào)度、I/O 調(diào)度等。

總之,操作系統(tǒng)主要做的事情就是支持了程序的并發(fā)執(zhí)行,把各種資源統(tǒng)一管理了起來(lái),實(shí)現(xiàn)了進(jìn)程、內(nèi)存、IO 等等調(diào)度。

同時(shí),為了安全性,操作系統(tǒng)會(huì)把程序的運(yùn)行狀態(tài)分為用戶態(tài)和內(nèi)核態(tài),只有內(nèi)核態(tài)可以訪問(wèn)驅(qū)動(dòng),來(lái)控制硬件,然后提供了系統(tǒng)調(diào)用給用戶態(tài)來(lái)用,因?yàn)槿绻魏纬绦蚨寄茈S意操作硬件,那就不安全了,所以要管控起來(lái)。

為什么講編程語(yǔ)言會(huì)講到操作系統(tǒng)呢?

因?yàn)槲覀儗?xiě)的應(yīng)用層的代碼都是在操作系統(tǒng)上跑的,用的各種 api 也最終都是操作系統(tǒng)提供的系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)的。

但我們不是直接使用系統(tǒng)調(diào)用,而是用各種語(yǔ)言的標(biāo)準(zhǔn)庫(kù),這些標(biāo)準(zhǔn)庫(kù)就是對(duì)系統(tǒng)調(diào)用做了進(jìn)一步的封裝,比如創(chuàng)建進(jìn)程、訪問(wèn)網(wǎng)絡(luò)、訪問(wèn)內(nèi)存等等。Node.js 的 api、JDK 的 api 都是基于系統(tǒng)調(diào)用封裝的。

操作系統(tǒng)實(shí)現(xiàn)了多個(gè)程序在同一套硬件上的并發(fā)執(zhí)行,為了安全,還把程序的運(yùn)行分為了內(nèi)核態(tài)和用戶態(tài),提供了系統(tǒng)調(diào)用來(lái)使用操作系統(tǒng)能力,各種語(yǔ)言對(duì)系統(tǒng)調(diào)用做了封裝,這樣,我們就能通過(guò)這些 API 來(lái)控制計(jì)算機(jī)了。

編程范式與描述方式

我們講了如何通過(guò)機(jī)器語(yǔ)言來(lái)控制 CPU 進(jìn)而控制其他硬件,講了操作系統(tǒng)的功能和它提供的系統(tǒng)調(diào)用是怎么被編程語(yǔ)言封裝的,這些都是我們能夠控制計(jì)算機(jī)的基礎(chǔ)。

但是我們現(xiàn)在還停留在機(jī)器語(yǔ)言呢,用這個(gè)來(lái)寫(xiě)邏輯也太麻煩了,既要考慮怎么表達(dá)邏輯,又要考慮計(jì)算機(jī)是怎么執(zhí)行的,比如要訪問(wèn)那個(gè)寄存器、讀寫(xiě)哪個(gè)內(nèi)存等。

能不能簡(jiǎn)化一些呢?

首先想到的是把機(jī)器語(yǔ)言做成一些有含義的字符串,叫做匯編語(yǔ)言,這樣描述起來(lái)就簡(jiǎn)單很多。

但是這依然要考慮表達(dá)的邏輯、計(jì)算機(jī)執(zhí)行細(xì)節(jié)這兩個(gè)方面,而執(zhí)行細(xì)節(jié)其實(shí)與邏輯沒(méi)關(guān)系,而且不同機(jī)器和操作系統(tǒng)的執(zhí)行細(xì)節(jié)也可能不同。

能不能我只管怎么表達(dá)邏輯,然后通過(guò)一種方式來(lái)轉(zhuǎn)成帶有執(zhí)行細(xì)節(jié)的機(jī)器語(yǔ)言呢?

這種就是高級(jí)語(yǔ)言了,它的特點(diǎn)就是沒(méi)有具體的執(zhí)行細(xì)節(jié),只關(guān)心邏輯的表達(dá),實(shí)現(xiàn)這種轉(zhuǎn)換的就是編譯器。(當(dāng)然,也可以做成一個(gè)解釋執(zhí)行其他程序的中間程序,叫做解釋器)

而描述邏輯這件事情有不同的方式,比如我可以通過(guò)一個(gè)個(gè)函數(shù)來(lái)組織邏輯,把數(shù)學(xué)那套思維拿過(guò)來(lái),這叫函數(shù)式,也可以通過(guò)一個(gè)個(gè)對(duì)象來(lái)組織邏輯,這叫做面向?qū)ο螅@些不同的描述邏輯的思路就是編程范式。

編程語(yǔ)言主要就是實(shí)現(xiàn)了某幾種編程范式,這樣,程序員就可以通過(guò)不同的方式來(lái)描述邏輯,由編譯器去轉(zhuǎn)成帶有計(jì)算機(jī)執(zhí)行細(xì)節(jié)的機(jī)器代碼。

不同語(yǔ)言實(shí)現(xiàn)的編程范式不同,也就是描述邏輯的方式不同,這是語(yǔ)言之間最大的區(qū)別。 至于能做什么,這個(gè)不是區(qū)別,只要對(duì)系統(tǒng)調(diào)用封裝一下,做成一些庫(kù)就可以支持。

比如 Javascript 最開(kāi)始只可以在瀏覽器上跑,描述渲染邏輯,但后來(lái)有了 Node.js 后,它同樣可以用來(lái)描述一些腳本或者服務(wù)端邏輯。

像現(xiàn)在的跨端引擎,不就是對(duì)操作系統(tǒng)能力做了封裝,通過(guò) Js 來(lái)描述邏輯,然后由 native 來(lái)調(diào)用操作系統(tǒng)能力么?

還有 electron、hybrid 等等,這些都是 Javascript 的 runtime,他們擴(kuò)展的是 api,并沒(méi)有擴(kuò)展 js 語(yǔ)言本身。

那什么擴(kuò)展了 Javascript 語(yǔ)言本身呢?是 Typescript 這種編譯成 Javascript 的語(yǔ)言,它提供了類型系統(tǒng),可以靜態(tài)檢查出程序中的一些錯(cuò)誤。

為了分離邏輯的表達(dá)和程序執(zhí)行的細(xì)節(jié),我們實(shí)現(xiàn)了高級(jí)語(yǔ)言,這樣程序員只需要專注邏輯的表達(dá),然后通過(guò)編譯器/解釋器來(lái)轉(zhuǎn)換成帶有執(zhí)行細(xì)節(jié)的機(jī)器語(yǔ)言代碼。而邏輯表達(dá)有不同的方式,比如面向?qū)ο蟆⒑瘮?shù)式等,每種編程語(yǔ)言會(huì)實(shí)現(xiàn)其中的幾種,這是語(yǔ)言之間最大的區(qū)別。語(yǔ)言只是表達(dá)邏輯用的,至于能做什么,則是 api的事情,只要對(duì)系統(tǒng)能力做下封裝,就可以擴(kuò)展其他的 api,進(jìn)而可以寫(xiě)該領(lǐng)域的邏輯,比如 Node.js、Electron、跨端引擎等都是 api 的擴(kuò)展。

總結(jié)

我們從硬件、操作系統(tǒng)、編程范式三個(gè)層次來(lái)探討了編程語(yǔ)言的本質(zhì):

硬件是用電子控制機(jī)械,通過(guò)驅(qū)動(dòng)程序來(lái)驅(qū)動(dòng)硬件工作,而 CPU 可以描述通用的邏輯,進(jìn)而控制其他硬件,我們就是通過(guò)控制 CPU 來(lái)間接控制各種硬件的,所以它叫做中央處理器。它提供的指令集所表達(dá)的邏輯叫做機(jī)器語(yǔ)言。

操作系統(tǒng)實(shí)現(xiàn)了程序的并發(fā)執(zhí)行,讓一套硬件上可以同時(shí)跑多個(gè)程序,叫做進(jìn)程。操作系統(tǒng)支持了進(jìn)程、內(nèi)存、IO 等各種調(diào)度。為了安全,把程序的執(zhí)行分成了用戶態(tài)和內(nèi)核態(tài)兩個(gè)狀態(tài),內(nèi)核態(tài)才可以通過(guò)驅(qū)動(dòng)控制硬件,然后把它做成了系統(tǒng)調(diào)暴露給用戶態(tài)。各種語(yǔ)言的標(biāo)準(zhǔn)庫(kù)就是通過(guò)系統(tǒng)調(diào)用來(lái)使用操作系統(tǒng)的能力的。

機(jī)器語(yǔ)言是我們控制計(jì)算機(jī)最根本的方式,但是它要邏輯的表達(dá)和計(jì)算機(jī)執(zhí)行細(xì)節(jié)兩方面,為了分離兩者,我們做了編譯器/解釋器來(lái)完成這種轉(zhuǎn)換,這樣我們只需要表達(dá)邏輯即可,這叫做高級(jí)語(yǔ)言。描述邏輯有不同的方式,叫做編程范式,每種編程語(yǔ)言都實(shí)現(xiàn)了某幾種編程范式。不同編程語(yǔ)言的區(qū)別只是表達(dá)邏輯的方式不同,至于可用的 api,這個(gè)可以通過(guò)庫(kù)或者 runtime 來(lái)擴(kuò)展。

所以,如果讓你做一門(mén)編程語(yǔ)言,你要做什么呢?

你要先選擇一種編程范式,用它來(lái)表達(dá)邏輯,然后要設(shè)計(jì)細(xì)節(jié)的語(yǔ)法。

之后實(shí)現(xiàn)編譯器/解釋器來(lái)讓它能夠轉(zhuǎn)成控制計(jì)算機(jī)運(yùn)行的機(jī)器語(yǔ)言。

之后要實(shí)現(xiàn)對(duì)操作系統(tǒng)能力做了封裝的標(biāo)準(zhǔn)庫(kù)。

然后如果你要表達(dá)不同領(lǐng)域的邏輯,則要實(shí)現(xiàn)不同領(lǐng)域的一些庫(kù),比如圖形領(lǐng)域的、桌面端的、web 服務(wù)器的等等。

這是實(shí)現(xiàn)編程語(yǔ)言的思路,也是我們理解編程語(yǔ)言的思路。

 

責(zé)任編輯:武曉燕 來(lái)源: 神說(shuō)要有光zxg
相關(guān)推薦

2012-04-16 15:14:47

web設(shè)計(jì)

2020-08-02 19:55:46

Python編程語(yǔ)言技術(shù)

2021-08-18 07:56:05

Typescript類型本質(zhì)

2013-12-19 15:56:50

去IOE數(shù)據(jù)庫(kù)服務(wù)器

2015-08-31 13:43:27

運(yùn)維

2024-12-13 08:24:23

2021-07-31 23:25:34

CSS布局UI

2012-05-16 13:11:28

編程語(yǔ)言開(kāi)發(fā)語(yǔ)言Java

2022-08-17 17:57:37

GoGo語(yǔ)言

2018-04-04 14:29:33

2022-08-26 09:51:49

索引簽名編程語(yǔ)言

2021-09-03 09:12:09

Linux中斷軟件

2023-07-04 07:53:53

MVCDDD架構(gòu)

2015-10-10 10:51:25

數(shù)據(jù)本質(zhì)大數(shù)據(jù)

2022-04-28 08:12:29

函數(shù)調(diào)用進(jìn)程切換代碼

2024-04-02 07:32:58

Go語(yǔ)言接口

2018-03-21 09:08:06

超融合架構(gòu)本質(zhì)

2021-07-07 10:01:13

編程語(yǔ)言計(jì)算機(jī)斯坦福大學(xué)

2021-02-07 09:18:07

JavaScript 前端編程語(yǔ)言

2009-07-20 15:42:59

JDBC是什么
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久久久久天堂 | 动漫www.被爆羞羞av44 | 日韩免费 | 天堂av中文在线 | 91久久久久| 久久精品在线免费视频 | 美女视频一区二区三区 | 久久三区| 久久av一区二区三区 | 大香在线伊779 | 久久久久无码国产精品一区 | 色欧美片视频在线观看 | 国产在线观看福利 | 久久av资源网 | 午夜码电影 | 97福利在线 | 在线欧美激情 | 日韩第一夜 | 久久最新精品视频 | 久久久久久久久久久久久久久久久久久久 | 国产欧美精品一区二区色综合 | 91精品久久久久久久久99蜜臂 | 国产精品一区在线 | 色婷婷婷婷色 | 国产精品影视在线观看 | 国产精品揄拍一区二区 | 国产做a爱片久久毛片 | 久久久国产亚洲精品 | 国产在线拍偷自揄拍视频 | 91免费在线 | 人人九九精 | 国产传媒在线播放 | 欧美视频免费在线 | 国产高清一二三区 | 成人性视频免费网站 | 亚洲视频免费观看 | 欧美精品一区二区三区四区 在线 | 一级特黄视频 | 精品欧美一区免费观看α√ | 国产精品久久久久久久久久久久久 | 超碰人人人人 |