【4】到底該學哪種程式語言?各種不同的程式語言現在都用來幹嘛?

2020-09-28 09:01:52

本菜雞經過調研,決定了碩士未來兩年的學習路線。最近半年主攻演演算法+資料結構基礎,LeetCode就用C++寫,配合學習資料:1.卜東波演演算法視訊課;2.兩本學長的刷題總結pdf;3.清華大學本科資料結構(C++版)教材。課題正好也是C++和Java都要用到。然後課餘時間學習課外機構的Java巨量資料視訊課(買的),巨量資料有點難不一定能學好,但總之就業具體方向還是確定了以Java為主。

0 本文要點

1.計算機程式語言的分類
低階語言/高階語言;(高階語言中的)編譯型語言/解釋性語言;動態語言/靜態語言;
2.主要的流行高階語言介紹
Java、C++、python、C#、C、JavaScript、Go、ruby、Groovy、Kotlin等
3.硬體程式設計
只瞭解一點FPGA/DSP,就簡單提一下

1 程式語言分類

(1)低階語言 / 高階語言

低階語言套件括機器語言和組合語言,Java、C++、python這些常見的都是方便程式設計師與電腦高效互動的高階語言。
機器語言是計算機可以直接識別的 0/1 串,對應計算機硬體的「斷開」和「閉合」兩種狀態。
組合語言實際上就是描述指令集的語言。通過組合這一過程,組合語言轉換成機器指令執行。特定的組合語言和特定的機器語言指令集是一一對應的,不同平臺之間不具備移植性。
高階語言更接近人類的思維方式,編寫容易,開發效率高。

(2)編譯型語言 / 直譯語言

C、C++語言是典型的編譯型語言。可以這麼理解,有一個事先編好的叫做「編譯程式」的「機器語言程式」(*未求證,感覺這裡不太對)*安裝在計算機內,它的功能是通過預處理、編譯、連結等將高階語言變為機器可執行的目的碼(注意區分,這個目的碼是機器指令,並非0 / 1二進位制程式碼。這裡涉及到ABI的相關知識)。C++編譯連結後生成的.exe可執行檔案,也是作用/執行在作業系統上的,並非直接執行在硬體上。

直譯語言:python是典型的直譯語言,即計算機有專門對應的直譯器程式,一邊掃描python程式碼、逐句輸入逐句翻譯,沒有編譯產生目標程式的過程,而是翻譯後由計算機直接一行一行執行。

這裡特殊講下Java語言,因為Java執行過程是,先 javac xxx.java 即編譯Java檔案,這一步生成一個 .class 檔案(一個與平臺無關的位元組碼程式),然後 java xxx 執行這個名為xxx的Java源程式。所以這麼看來Java也有編譯的過程,但是Java被定義為直譯語言,因為它並不是編譯生成常規的機器指令,而是生成在JVM上執行的指令位元組碼。

這就涉及到Java語言的執行機制:JDK JRE JVM與Java。

在這裡插入圖片描述

JDK(Java Development Kit) 是 Java 語言的軟體開發套件(SDK),它是Java實現的核心,我們要執行Java必經痛苦的設定環境的過程,就是在部署JDK。

JRE(Java Runtime Environment,Java執行環境),包含JVM標準實現及Java核心類庫。JRE是Java執行環境,並不是一個開發環境,所以沒有包含任何開發工具(如編譯器和偵錯程式),它負責類的載入、初始化靜態變數、二進位制位元組碼的校驗、解析類中呼叫的介面和類

JVM是Java Virtual Machine(Java虛擬機器器)的縮寫,JVM是一種用於計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。經過Java編譯器生成的位元組碼.class檔案就是執行在JVM。

(3)靜態(強型別)語言 / 動態(弱型別)語言

這也是針對高階語言來講的。靜態語言即編譯時變數的資料類與就可以確定的語言,大多數靜態語言要求在使用變數之前就必須宣告資料型別,C++、Java都是如此,所以他們用起來更安全。

動態語言的變數型別是由其上下文決定、動態賦予的,其型別檢查是在執行時做的。它的優點是方便閱讀,不需要寫非常多的型別相關的程式碼;缺點是不方便偵錯,容易出錯。比如眾所周知的ECMAScript(JavaScript)、Ruby、Python等都屬於動態語言。

指令碼語言都屬於動態語言,動態語言又都屬於直譯語言。

2 主要高階語言介紹

(1)Java

誕生於1995年,是分散式服務開發的最佳選擇之一;
Java做後端服務居多,包括網站後端、手機app後端,微信小程式後端、h5頁面的後端等等。
Java也可以用來做安卓開發,不過現在Android釋出了官方的開發語言kotlin,可能會形成相對聚集的生態圈。
Java開源框架超多,spring全家桶等;
遊戲方面,《我的世界》就是用Java寫的;
Java提供web外掛,允許在瀏覽器中直接執行此類應用;
在巨量資料儲存和應用方面,Java是必備語言,Hadoop也是基於Java進行開發的;

(2)C語言

誕生於1972年,最初構建目標是用來編寫系統軟體;
Linux作業系統就是用C語言開發的;
C語言不支援物件導向程式設計,也不具備執行時檢查機制;但具有出色的可移植性;
通訊電子類的公司(華為、中興等),開發相關的軟體都是用的標準C語言;
嵌入式系統程式設計、微控制器開發板都是用C語言來進行開發的;(直接接觸底層,執行效率高)

(3)python

python誕生於1991年,本身是用C語言開發的;
用於數值分析與計算(金融系統分析、量化展示等);
在機器學習、人工智慧、資料探勘等領域應用廣泛;
第三方開源庫和工具繁花似錦,不用造輪子,調包非常方便;
python指令碼可以用來分析系統效率、覆蓋率、做資料視覺化,以及爬蟲
也可以用來做web的後端服務,開發小程式等,Flask、Django框架等都非常火熱;

python是Google的官方語言之一,常用的軟體中,Instagram、YouTube、Dropbox(媒體儲存和處理方向)和spotify等後端都是用python開發的。

(4)C++

誕生於1983年,屬於C語言的一個超集;
對C語言的擴充和延申,非常有設計感,容器、泛型程式設計、模板庫、物件導向程式設計等元素的使用,使得C++非常具有表現力;
嵌入式程式設計、電信級軟體、windows/Linux上的(ps、office、QQ、微信,基本都是c++開發的。Foxmail / Outlook 等各種郵件收發工具、Chrome瀏覽器、IDE visual studio、搜狗輸入法等也都是由C++開發

C++可跨越全部裝置實現移植,並受到Android、蘋果、Windows phone以及黑莓四大行動平臺支援;

(5)JavaScript

JavaScript誕生於1995年,屬於使用者端指令碼語言;(JS程式碼被寫入HTML頁面中,使用者端的使用者通過內部JS請求某HTML頁面時,該指令碼會被傳送至瀏覽器,並由(使用者端的)瀏覽器決定下一步操作。)

程式碼在使用者端執行,減輕了伺服器端的壓力,但這也意味著有時會被惡意活動所利用,從而帶來安全隱患;
JavaScript在不同的瀏覽器上有時會以不同的方式進行解釋,相比於提供穩定輸出結果的伺服器端,js指令碼的可預測性較差。不過充分測試可避免此類問題。

也是典型的全棧語言,在前後端無處不在;
使用者互動UI、動態頁面生成,主要在前端大放異彩;
廣泛應用到各種企業級開發,如Vue.js、React.js、Angular.js等框架;
也可以用來做後端伺服器開發、高效能伺服器程式設計等,其支援框架為大名鼎鼎的 Node.js,具有非同步程式設計的特點;

(6)C#

誕生於2000年,語法很像Java,可以做web後端(ASP.NET)、桌面軟體開發、Windows應用開發等;
常用的 stack overflow、印象筆記就是由C#開發的;
全面整合.net庫,提供出色的功能與支援庫存取能力,但也由於整合了.net庫而不具備跨平臺的能力;
在國內生態不太好,就業形勢一般;

(7)PHP

誕生於1994年,超文字前處理器,是一種伺服器端的指令碼語言;
可以用來做後端的web服務,典型框架 ThinkPHP,以及現在比較流行的 Larvaral;
Facebook中就用到了PHP;
PHP擁有龐大而活躍的社群,易於上手,能夠豐富支援html、js、css等語言,與各類資料庫、檔案系統的共同作業都非常順暢;

(8)SQL

資料庫查詢語言,很簡單,但必須要學;
經久不衰的話題是:如何對SQL語言進行優化;(社招常問)

(9)Objective-C、Swift

O-C誕生於1983年,是蘋果IOS開發官方語言,用於構建 Mac OS、IOS;

(10)Go

由Google開發釋出;
對在多處理器系統上的執行進行了特別的優化,據說編譯後的執行速度可以媲美C++/C;
也擁有自己web後端開發的典型框架:Beego框架、Gin框架;
基於Go語言的部落格框架:Hugo,可以用來搭建自己的個人部落格;
Go語言在虛擬化技術方面應用十分廣泛,大名鼎鼎的遠端虛擬機器器工具Docker就是Go語言的典型作品;

(11)Groovy

隸屬於Java系的指令碼語言;可以理解為Java動態機制的一種補充,二者可以互相呼叫;
它也需要JDK的支援;
典型的應用:Jenkins 2.0的流水線 pipeline 指令碼,只能用groovy來寫;

(12)Kotlin

也需要JDK的支援,也和Java語言互通;
2017Google開發者大會官宣了kotlin為Android開發的官方語言;

(13)Lua

和python類似,也是用C語言實現的,很容易和C程式碼互相呼叫;
OpenResty = Nginx + Lua:這個專案就是 Lua 語言對 Nginx 伺服器進行二次開發得到的,用於web後端伺服器開發、遊戲開發等;

(14)Julia

高效能動態科學計算語言;
支援非常多的資料型別,在科研中(尤其機器學習)用的非常多;

3 硬體程式設計

(1)Verilog、VHDL(用於FPGA程式設計的兩種常見語言)

Field Programmable Gate Array,現場可程式化邏輯閘陣列

FPGA 晶片並非單純侷限於研究以及設計晶片,而是針對較多領域產品都能借助特定晶片模型予以優化設計。從晶片器件的角度講,FPGA 本身構成 了半客製化電路中的典型積體電路,其中含有數位管理模組、內嵌式單元、輸出單元以及輸入單元等。

我們的計算機中,CPU晶片處理器負責排程、計算,GPU用來圖形加速顯示等,上面佈滿了密集的電路元件,FPGA也是一種晶片,它在通訊領域用途較廣,常規也用於影象、資料處理的一些演演算法輔助實現,現在比較火熱的是用於深度學習加速

(2)DSP

TI公司的DSP用CCS開發平臺,程式語言一般是C語言;來ADI公司的源DSP用VDSP++開發平臺,一般也是用C語言。
這個我瞭解不多,只知道在我們直觀看不到的地方應用非常廣泛,還有就是EDA技術那一套。有機會了解了再說。

參考連結:
https://blog.csdn.net/zdb292034/article/details/80732098
bilibili @ codesheep 高階語言介紹的部分內容由程式羊大哥的視訊搬運而來
知乎 @ 周萌萌 部分內容參考來自四年前由周翻譯過來的一個外國網站的統計圖