【4】到底該學哪一種編程語言?各類不一樣的編程語言如今都用來幹嗎?

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

0 本文要點

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

1 編程語言分類

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

低級語言包括機器語言和彙編語言,Java、C++、python這些常見的都是方便程序員與電腦高效交互的高級語言。
機器語言是計算機能夠直接識別的 0/1 串,對應計算機硬件的「斷開」和「閉合」兩種狀態。
彙編語言實際上就是描述指令集的語言。經過彙編這一過程,彙編語言轉換成機器指令執行。特定的彙編語言和特定的機器語言指令集是一一對應的,不一樣平臺之間不具有移植性。
高級語言更接近人類的思惟方式,編寫容易,開發效率高。前端

(2)編譯型語言 / 解釋型語言

C、C++語言是典型的編譯型語言。能夠這麼理解,有一個事先編好的叫作「編譯程序」的「機器語言程序」(*未求證,感受這裏不太對)*安裝在計算機內,它的功能是經過預處理、編譯、連接等將高級語言變爲機器可執行的目標代碼(注意區分,這個目標代碼是機器指令,並不是0 / 1二進制代碼。這裏涉及到ABI的相關知識)。C++編譯連接後生成的.exe可執行文件,也是做用/運行在操做系統上的,並不是直接運行在硬件上。java

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

這裏特殊講下Java語言,由於Java運行過程是,先 javac xxx.java 即編譯Java文件,這一步生成一個 .class 文件(一個與平臺無關的字節碼程序),而後 java xxx 運行這個名爲xxx的Java源程序。因此這麼看來Java也有編譯的過程,可是Java被定義爲解釋型語言,由於它並非編譯生成常規的機器指令,而是生成在JVM上運行的指令字節碼。c++

這就涉及到Java語言的運行機制:JDK JRE JVM與Java。程序員

在這裏插入圖片描述

JDK(Java Development Kit) 是 Java 語言的軟件開發工具包(SDK),它是Java實現的核心,咱們要運行Java必經痛苦的配置環境的過程,就是在部署JDK。web

JRE(Java Runtime Environment,Java運行環境),包含JVM標準實現及Java核心類庫。JRE是Java運行環境,並非一個開發環境,因此沒有包含任何開發工具(如編譯器和調試器),它負責類的加載、初始化靜態變量、二進制字節碼的校驗、解析類中調用的接口和類算法

JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是經過在實際的計算機上仿真模擬各類計算機功能來實現的。通過Java編譯器生成的字節碼.class文件就是運行在JVM。spring

(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 高級語言介紹的部份內容由程序羊大哥的視頻搬運而來
知乎 @ 周萌萌 部份內容參考來自四年前由周翻譯過來的一個外國網站的統計圖