最新版本學(xué)習(xí)筆記:github電子書(shū)
利用閑暇時(shí)間,體驗(yàn)了V語(yǔ)言,邊看邊動(dòng)手記錄,所以有了這個(gè)V語(yǔ)言學(xué)習(xí)筆記
寫在前頭的話
畢竟這是一門新發(fā)布的語(yǔ)言,開(kāi)源時(shí)間不到1年,穩(wěn)定性和成熟度肯定還需要時(shí)間完善,目前不能期望太高
不過(guò)V語(yǔ)言作者還是實(shí)現(xiàn)了很多不錯(cuò)的語(yǔ)言特性,也很佩服他有勇氣,有能力,又開(kāi)發(fā)了一門新語(yǔ)言,并且很努力地全職開(kāi)發(fā),快速更新
總之,V語(yǔ)言還算是很有潛力的一門新語(yǔ)言,不喜歡的人可以忽略,喜歡的人不妨抽點(diǎn)時(shí)間跟進(jìn)一下,一起跟著V語(yǔ)言成長(zhǎng)...
V語(yǔ)言github:https://github.com/vlang
為什么喜歡V
V感覺(jué)就是go+rust+c的結(jié)合體罚渐,吸收了這三者的優(yōu)點(diǎn),不過(guò)像go更多一點(diǎn)
V實(shí)現(xiàn)了自舉却汉,編譯器把V代碼生成C代碼,然后再調(diào)用gcc或者clang來(lái)編譯生成的C代碼
V的語(yǔ)法看著荷并,寫著都很舒服病涨,比go和rust都好
吸收了go和rust中的各種簡(jiǎn)潔和優(yōu)秀的特性
主要還是看重:
1.簡(jiǎn)潔,干凈的語(yǔ)法,看起來(lái),寫起來(lái)都很舒服
2.沒(méi)有GC,編譯快,生成的執(zhí)行文件很小,執(zhí)行很快
感覺(jué)V才是 "better C"
當(dāng)然,目前V的階段還是比較早期的,還是不夠穩(wěn)定
開(kāi)發(fā)的速度挺快的,新語(yǔ)法特性一直在完善璧坟,bug也還挺多的既穆,還不能用到實(shí)際的項(xiàng)目中
即使1.0發(fā)布了,也有挺長(zhǎng)的路要走,畢竟一門編譯語(yǔ)言的發(fā)展是按年來(lái)計(jì)算的
安裝
源代碼安裝
目前V語(yǔ)言還處在快速開(kāi)發(fā)的不穩(wěn)定階段,首選源代碼安裝方式.
編譯準(zhǔn)備
目前V語(yǔ)言的編譯需要依賴C編譯器:gcc或clang
如果沒(méi)有C編譯器,可以參考以下文檔,進(jìn)行安裝:
下載源碼/編譯
git clone https://github.com/vlang/v
cd v
make
編譯成功后,會(huì)在當(dāng)前目錄生成V編譯器的可執(zhí)行文件,大小700k左右,小巧得很.
可以使用v version查看當(dāng)前的版本
后續(xù)升級(jí)
方式一:
v up //抓取github上V代碼庫(kù)的主干代碼,然后自動(dòng)重新編譯
方式二:
git pull
make
下載預(yù)編譯安裝包
在官網(wǎng)直接下載對(duì)應(yīng)平臺(tái)的安裝包
這個(gè)目前不推薦使用,更新太慢
快速總覽
這個(gè)部分試圖展示V語(yǔ)言的總體特性,形成對(duì)V語(yǔ)言的一個(gè)總體印象,后續(xù)章節(jié)再展開(kāi)逐個(gè)部分詳細(xì)介紹
V語(yǔ)言是一門靜態(tài)類型,編譯型語(yǔ)言
語(yǔ)法追求簡(jiǎn)潔,基本就是吸收了go和rust中各自簡(jiǎn)潔的部分,go的部分更多一些,代碼看起來(lái),寫起來(lái)都很舒服,這個(gè)應(yīng)該也是大多數(shù)人第一眼看到V語(yǔ)言的感覺(jué),被吸引的主要原因之一
無(wú)GC,錯(cuò)誤處理機(jī)制,支持泛型,這三點(diǎn)一直是go有爭(zhēng)議的地方,V語(yǔ)言都有
無(wú)全局變量,無(wú)空值null,變量默認(rèn)不可變,結(jié)構(gòu)體默認(rèn)不可變,從rust那邊吸收了一些
模塊化支持,包管理工具
提供跟go一樣的并發(fā)
7個(gè)1級(jí)元素:const常量,enum枚舉,function函數(shù),struct結(jié)構(gòu)體,method方法,interface接口,type類型
編譯速度很快,可以跨平臺(tái)交叉編譯,編譯出來(lái)的可執(zhí)行文件很小,運(yùn)行速度就是C的速度
實(shí)現(xiàn)自舉,編譯器也是用V語(yǔ)言寫的
基本的編譯器思路是:把V源代碼編譯生成C源代碼,然后調(diào)用C編譯器編譯生成單一可執(zhí)行文件
很容易跟C集成,方便使用C成熟豐富的代碼庫(kù)
可以使用C手動(dòng)管理內(nèi)存malloc,calloc,memmove,memcpy實(shí)現(xiàn)對(duì)內(nèi)存進(jìn)行手工控制
Vscript可以像python腳本那樣簡(jiǎn)單,方便地寫系統(tǒng)shell
內(nèi)置json支持,非運(yùn)行時(shí)反射實(shí)現(xiàn),性能更好
內(nèi)置SQL語(yǔ)法支持,實(shí)現(xiàn)更簡(jiǎn)單的ORM
內(nèi)置一個(gè)輕量的跨平臺(tái)GUI庫(kù)
內(nèi)置一個(gè)web框架
代碼熱更新,修改代碼,實(shí)時(shí)顯示結(jié)果
V代碼生成javascript,webassembly代碼
C/C++代碼生成V代碼
以上是對(duì)V語(yǔ)言的特性總覽,里面有的特性已經(jīng)實(shí)現(xiàn),有的還未實(shí)現(xiàn)
有些未實(shí)現(xiàn)的特性好得讓人感覺(jué)不真實(shí),拭目以待吧,畢竟語(yǔ)言的發(fā)展周期都是按年來(lái)計(jì)算的
未實(shí)現(xiàn)的功能正在逐步實(shí)現(xiàn),計(jì)劃在2020年5月份發(fā)布0.2版本,相對(duì)完善一些,穩(wěn)定一些
希望作者和開(kāi)發(fā)團(tuán)隊(duì)能持續(xù)下去,周邊生態(tài)能起來(lái)
V語(yǔ)言代碼初步印象:
//單行注釋
/*
多行注釋
*/
module main //定義主模塊,編譯生成可執(zhí)行程序
import os //導(dǎo)入模塊
import strings
import time
fn main() { //主函數(shù),程序運(yùn)行入口
println('say hello world') //語(yǔ)句結(jié)尾不需要分號(hào)
}
//模塊內(nèi)7個(gè)主要一級(jí)元素:常量,枚舉,函數(shù),結(jié)構(gòu)體,方法,接口,類型
//1.常量
pub const (
Version = '0.1.21'
supported_platforms = ['windows', 'mac', 'linux']
)
//2.枚舉
pub enum OS {
mac
linux
windows
}
//3.函數(shù)-函數(shù)的定義風(fēng)格基本跟go一樣,只是關(guān)鍵字改為更簡(jiǎn)短的fn雀鹃,支持不確定個(gè)數(shù)參數(shù)幻工,支持多返回值
//pub表示公共級(jí)別的訪問(wèn)控制,可以被模塊外使用黎茎,否則只能在模塊內(nèi)使用
pub fn my_fn(x,y int) int {
i:=1 //強(qiáng)類型囊颅,類型推斷
s:='abc' //變量默認(rèn)不可變,約定用單引號(hào)表示字符串,雙引號(hào)也可以,反引號(hào)才是單字符
mut a:=3 //可變用var
a=5 //聲明可變后,才可修改
println(i)
println(s)
return a
}
//3.函數(shù)-泛型函數(shù)
pub fn g_fn<T>(p T) T {
return p
}
//4.結(jié)構(gòu)體-結(jié)構(gòu)體定義
pub struct Point { //結(jié)構(gòu)體字段一共有5種訪問(wèn)控制
//默認(rèn)私有且不可變
a int
//私有,但可變
mut:
x int
y int
//公共,但不可變
pub:
d int
//模塊內(nèi)可訪問(wèn)且可變;模塊外可訪問(wèn),但是只讀
pub mut:
e int
//全局字段,模塊內(nèi)部和外部都可訪問(wèn),可修改,這樣等于破壞了封裝性,不推薦使用
__global:
f int
}
//4.結(jié)構(gòu)體-泛型結(jié)構(gòu)體
struct Repo<T> {
db DB
mut:
model T
}
//5.方法-方法只是指定了接收者的函數(shù)踢代,跟go一樣
pub fn (mut p Point) move(x,y int) {
p.x+=x
p.y+=y
}
//6.接口-接口無(wú)須顯式聲明實(shí)現(xiàn),鴨子類型,跟go一樣
pub interface Walker {
walk(int,int) int
}
//7.類型-類型別名,可以基于基本類型,也可基于結(jié)構(gòu)體類型創(chuàng)建類型別名
pub type myint = int
//7.類型-函數(shù)類型盲憎,表示這一類相同簽名的函數(shù)
pub type fn_type = fn(int) int
//7.類型-聯(lián)合類型,跟typescript類似胳挎,表示類型Expr可以是這幾種類型的其中一種
pub type Expr = Foo | BoolExpr | BinExpr | UnaryExpr