Coder Essential之編程語言語法特性概論

Programming Language(編程語言) 語法特性概論

學習一門語言最痛苦的反而是大量的細節語法,譬如字符串截取、數組或者字典類型的索引之類的。下面要進行討論的一些語法特性是目前流行的一些語言的總結,可能有些語言尚不支持部分特性,可是要麼有些第三方庫進行輔助,要麼會在將來的版本中添加以下特性。筆者參考的語言包括但不限於:html

  • Java程序員

  • JavaScript正則表達式

  • Python編程

  • Rubysegmentfault

  • PHP數組

  • Swift數據結構

  • Objective-C閉包

  • C/C++框架

  • C#編程語言

  • Rust*:正在學習

下文的闡述中會以目錄方式進行闡述,目錄的概覽能夠參考這篇文章。本篇文章便是對於那篇文章的詳細闡述,歡迎你們提出本身的看法,一塊兒來完善。

注意:本部分僅僅包含基本語言特性,學習一門語言還有不少其餘的部分,可是都暫時摘了出去,請參考筆者該系列其餘文章。

入門概述

版本迭代

每一門語言的每一次迭代都會引入一些新特性,做爲一名合格的程序員必定要隨時關注,不是爲了一味追新,只是不能墨守成規。就像筆者如今感覺到的Swift 2.0、Java 八、NodeJs 4.0、ECMAScript 2015帶來的特性變化,會大大方便咱們的開發。

註釋與代碼分割

不一樣語言的註釋與代碼分割風格截然不同,筆者最先學習的是C、Java這樣看上去灰常嚴謹的語言,而當筆者學習Matlab、Python、Ruby這樣」隨意」的語言的時候,心裏是崩潰的。有的語言以分號做爲代碼分割,而Python是利用的換行與縮進進行代碼分割(還有SASS)。

參考資料

Tutorial&Docs:入門教程、指導

本部分主要存放部分相關的官方教程,譬如官方的Quick Start以及社區中的部分入門教程。

Practice&Resources:實踐與資源

本部分主要存放社區相關的實踐以及資源,譬如Github很著名的awesome-*系列或者Best-Practice系統。

Forum&Lessons:論壇與視頻教程

本部分主要存放該語言相關的著名的論壇地址或者在線教程地址,譬如Coursera或者慕課網這一類型的。

Blog&News:博客與資訊

本部分主要存放該語言相關的博客或者諮詢地址,譬如Java領域的ImportNews、Swift領域的SwiftGG等等。

Book&Tools:書籍

本部分主要存放該語言相關的書籍地址或者工具地址,譬如Android領域的DevTools這個站點。

Quick Start

Installation

本部分主要介紹語言開發環境的搭建以及SDK的安裝與管理。譬如利用NVM進行NodeJs的基本環境安裝。

Builder & Dependence Manager:構建與依賴管理

本部分主要介紹該語言的構建工具以及依賴項管理,譬如Java領域的Maven,將筆者從IDE的世界帶領到了構建的世界,脫離了IDE的束縛。比較常見的構建工具備Maven、Gradle、Google-Bazel、Make、Ant等等。而依賴工具則是更爲常見,譬如Npm、Pip等等。

Deployment:代碼部署工具

數據結構(Data Structure)

本部分應該算是一門語言的基石,主要涉及某個語言所提供的基本的數據類型與數據結構。

變量

本部分主要介紹變量的定義方式與定義規範,變量名的要求、強/弱類型語言區分以及類型聲明等。譬如PHP中須要明晰全部的變量以$符號開始,Java中以Int i 這種類型在前的方式聲明,而Swift中以var i:Int這種方式聲明。除以以外,在JavaScript與Swift中存在着let與var兩種變量聲明方式,這兩種不一樣的聲明方式對應了不變量與可變量。

常量與宏

常量與宏每每做爲全局的定義或者配置,譬如C++以及OC中的define關鍵字,就能夠定義某個宏。

系統常量

本部分須要對經常使用的系統常量有一個瞭解,譬如PHP中的__dir,就是指代的當前目錄。

賦值

賦值最簡單的理解就是利用=號將右側的值或者指針賦予左側,不過賦值這部分須要瞭解的是該語言是否支持析構解包賦值,譬如ES6中的特性:var a,b = [1,2]

做用域(Scope)

本部分主要對於變量的做用域進行一個闡述,通常變量便是指局部變量,可是每每會受到閉包、靜態變量(static)、全局變量(global)的影響。

類型與格式判斷與轉換

本部分主要闡述語言中經常使用的類型判斷方法,譬如Java領域的instanceof關鍵字、JavaScript領域的typeof關鍵字等等。另外一方面,還要闡述下常見的強制類型轉換的方法,就像Swift領域的as關鍵字。

基本類型(Basic)

本部分主要介紹常見的基礎數據類型。

數值類型

數值類型包括整型、浮點型(若是是強數據類型的化)。

隨機數

介紹隨機數的生成方式。

科學計算

介紹科學計算的方式,特別是對於Matlab、R、Python這樣在統計學與數據科學領域應用較多的,包括常見的科學計算算子等等。

類型轉換

介紹數值類型轉化爲其餘類型(特別是String類型,有些語言就沒有toString方法,譬如C++)或者數值類型內部轉化的方式。

空類型

本部分介紹語言中是怎麼定義空類型的,常見的空類型有null、nil、undefined等等。

布爾類型

不部分介紹語言中的布爾類型,對於非面向對象的語言,每每是true這樣的Primitive類型,而OC中則存在着TRUE、YES等等多種形式。

可選類型(Optional)

筆者第一次接觸到可選類型仍是在Google的Guava這個類庫中,此後做爲特性之一正式加入了Java8。不過筆者竊認爲Swift中對於可選類型的封裝更爲完善,譬如在Swift中以var str:String?方式聲明的就是一個可選類型,該類型能夠優雅地判斷是否爲空或者爲Nil(雖然是由於Swift不會主動將對象賦值爲Nil才須要這麼作),而後經過str!方式便可方便調用。

字符串(String)

字符串是語言中最常使用的語法,沒有之一,雖然簡單,可是仍是很噁心。本部分主要就是闡述經常使用的字符串的API,每每都是一列一大堆,還長得特別像,因此這邊也分了個類。若是是在C這種非對象化的語言中,能夠暫時將字符數組看作字符串,不要在乎這些細節。

建立增刪

本部分介紹怎麼建立以及修改某個字符串。

  • 建立添加

最多見的也是最通用的建立字符串的方式就是以」」雙引號方式建立,不過譬如OC中你必定要加@符號才能真正建立某個字符串對象,這個須要注意。另外,在字符串合併時,譬如C裏面要注意使用concat這樣的函數,而PHP裏面要注意使用.運算符而不是+運算符。

  • Format/Template:格式化與模板字符串生成、字符串插值

格式化字符串、模板字符串、字符串插值實際上是一個意思,簡單而言就好像print("%s","a")這樣,其實print裏面是採用變量替換的方式組裝了一個新的字符串。在ES六、Swift、PHP中的直觀表現就是利用{}或者雙引號能夠書寫變量而後直接將變量的值替換進來。

  • 複製

    本部分介紹字符串的複製。
  • 替換刪除

    本部分介紹常見的在字符串中查找某個字符、根據下標刪除某個字符等等。
  • 棧列操做

    本部分介紹常見的push、pop、shift、unshift操做等等。

索引遍歷

  • 存在判斷

    本部分主要介紹如何在字符串中判斷某個字符是否存在或者某個字串是否存在,有時候直接能夠用contains方法,有時候須要indexOf方法判斷。
  • 反向索引

根據某個字符或者某個字串,得到其在字符串中的下標。

  • 循環遍歷

怎麼去遍歷某個字符串。

  • 截取分割

    本部分介紹怎麼根據某個字符或者正則表達式進行字符串分割,每每分割的結果就是得到一個數組。

類型編碼

  • HTML

    介紹下語言中是否有處理HTML標籤的方法,每每是爲了防止XSS等,譬如PHP領域的htmlspecialchars、strip_tags等等。
  • Pinyin

介紹下語言中是否對於漢字拼音有支持,譬如Java領域比較著名的Pinyin4j。

其餘操做

  • Reverse

怎麼去反轉某個字符串,算是一個代碼的積累。

  • 正則匹配

正則表達式,不用贅述了,每每用於模式匹配與提取。

時間日期類型

時間與日期類型也是編程語言領域經常使用的數據類型,Java8以前的Date、SimpleDateFormat等等也是爲人詬病。通常而言,時間與日期類型須要考慮如下幾個部分:

構造與TimeZone(本地化時間)

本部分介紹怎麼根據當前時間構造一個時間對象或者根據輸入的指定格式的字符串構造一個時間對象。另外,須要對TimeZone以及本地化時間有一個闡述。

  • TimeFormat(時間格式化)

    介紹下經常使用的時間格式話工具、規範,譬如OC領域的NSDateFormatter等等。

TimeComparison(時間比較)&Diff(計算)

主要介紹如何比較兩個時間對象以及計算他們之間的差值。

TimeStamp

介紹怎麼從時間對象獲得TimeStamp,以及TimeStamp自己的TimeZone。

Calendar(日曆)

日曆功能,用於判斷某個日期在某月的第幾周等等。Java 8中,LocalDate也自帶了Calendar功能。

序列類型(Array)

常說的序列類型,包括但不限於數組(Array)、列表(List)、元組(Tuple)。序列類型是編程語言數據類型的重要組成部分。若是是像JavaScript或者PHP這種,只有一種Array類型的,能夠直接一章寫完。若是是Java這樣包含了各類序列類型的,建議是另開一章。序列類型最基本的須要介紹序列的長度獲取、空判斷以及序列的類型判斷。

建立增刪

  • 建立添加

  • 複製

  • 替換刪除

  • 棧列操做

索引遍歷

  • 存在判斷

  • 反向索引

  • 循環遍歷

  • 截取分割

類型轉換

其餘操做

  • 統計查詢

  • 過濾去重

字典類型(Dict)/ Map

建立增刪

  • 建立添加

  • 替換刪除

  • 棧列操做

索引遍歷

  • 鍵類型與存在判斷

  • 反向索引

  • 循環遍歷

  • 截取分割

類型轉換

其餘操做

流程控制(Control Flow)

運算符

基本運算符

邏輯運算符

運算符重載

條件選擇

if

循環

for

while

控制

函數(Function)

函數定義

參數調用

默認參數與外部參數

不定參數

傳值類型:引用傳值/複製傳值

閉包(Closure)/匿名函數/Lambda

閉包、匿名函數、Lambda這三種東西在有些編程語言裏是能夠統一而視的,可是在某些編程語言裏,譬如JavaScript中,是有區別的。

序列函數/Stream API

序列函數在Python、Ruby等語言中早就有了,用起來確實爽氣,代碼的逼格一會兒就上去了。在Java8中也引入了Stream API,不過序列函數並不只僅包含下面三貨,只不過這三個傢伙最爲出名

map

reduce

filter

生成器(Generator/yield)

生成器的概念筆者最先是見於Python中。

模塊(Modules)

命名空間

類與對象(Class)

可見域

包括static、public、private、protected這幾個關鍵字不一樣的做用以及不一樣語言裏不一樣的聲明方式。

屬性(Properties)

方法(Methods)

對象

繼承

抽象類、接口/協議與委託(Delegate)

匿名類

反射(Reflect)與類裝載

異常處理(Exception)

I/O

I/O Types

NIO

Advanced

內存管理

本部分由於篇幅所限(總不能在一篇筆記裏把全部東西擼一遍)

序列化與反序列化

序列化與反序列化簡單來講就是把某個Object或者複雜數據類型轉化爲某個字符串(Json)或者某個數據流。本部分一方面主要介紹語言內置的序列化方式,譬如Java的Serialization,不要管什麼ProtoBuf、FlatBuffer、Thrift等等。另外一方面介紹該語言經常使用的Json編譯與解析框架(用的多,沒辦法)。就像Java領域的FastJson。

相關文章
相關標籤/搜索