V語言學(xué)習(xí)筆記-總覽

最新版本學(xué)習(xí)筆記:github電子書

利用閑暇時(shí)間,體驗(yàn)了V語言,邊看邊動(dòng)手記錄,所以有了這個(gè)V語言學(xué)習(xí)筆記

寫在前頭的話

畢竟這是一門新發(fā)布的語言,開源時(shí)間不到1年,穩(wěn)定性和成熟度肯定還需要時(shí)間完善,目前不能期望太高

不過V語言作者還是實(shí)現(xiàn)了很多不錯(cuò)的語言特性,也很佩服他有勇氣,有能力,又開發(fā)了一門新語言,并且很努力地全職開發(fā),快速更新

總之,V語言還算是很有潛力的一門新語言,不喜歡的人可以忽略,喜歡的人不妨抽點(diǎn)時(shí)間跟進(jìn)一下,一起跟著V語言成長...

V語言github:https://github.com/vlang

為什么喜歡V

V感覺就是go+rust+c的結(jié)合體,吸收了這三者的優(yōu)點(diǎn),不過像go更多一點(diǎn)

V實(shí)現(xiàn)了自舉,編譯器把V代碼生成C代碼,然后再調(diào)用gcc或者clang來編譯生成的C代碼

V的語法看著,寫著都很舒服,比go和rust都好

吸收了go和rust中的各種簡潔和優(yōu)秀的特性

主要還是看重:

1.簡潔,干凈的語法,看起來,寫起來都很舒服

2.沒有GC,編譯快,生成的執(zhí)行文件很小,執(zhí)行很快

感覺V才是 "better C"

當(dāng)然,目前V的階段還是比較早期的,還是不夠穩(wěn)定

開發(fā)的速度挺快的,新語法特性一直在完善,bug也還挺多的,還不能用到實(shí)際的項(xiàng)目中

即使1.0發(fā)布了,也有挺長的路要走,畢竟一門編譯語言的發(fā)展是按年來計(jì)算的


安裝

源代碼安裝

目前V語言還處在快速開發(fā)的不穩(wěn)定階段,首選源代碼安裝方式.

編譯準(zhǔn)備

目前V語言的編譯需要依賴C編譯器:gcc或clang

如果沒有C編譯器,可以參考以下文檔,進(jìn)行安裝:

windows下安裝C編譯器

linux/macOS下安裝C編譯器

下載源碼/編譯

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代碼庫的主干代碼,然后自動(dòng)重新編譯

方式二:

git pull
make

下載預(yù)編譯安裝包

官網(wǎng)直接下載對(duì)應(yīng)平臺(tái)的安裝包

這個(gè)目前不推薦使用,更新太慢


快速總覽

這個(gè)部分試圖展示V語言的總體特性,形成對(duì)V語言的一個(gè)總體印象,后續(xù)章節(jié)再展開逐個(gè)部分詳細(xì)介紹

  • V語言是一門靜態(tài)類型,編譯型語言

  • 語法追求簡潔,基本就是吸收了go和rust中各自簡潔的部分,go的部分更多一些,代碼看起來,寫起來都很舒服,這個(gè)應(yīng)該也是大多數(shù)人第一眼看到V語言的感覺,被吸引的主要原因之一

  • 無GC,錯(cuò)誤處理機(jī)制,支持泛型,這三點(diǎn)一直是go有爭議的地方,V語言都有

  • 無全局變量,無空值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)交叉編譯,編譯出來的可執(zhí)行文件很小,運(yùn)行速度就是C的速度

  • 實(shí)現(xiàn)自舉,編譯器也是用V語言寫的

  • 基本的編譯器思路是:把V源代碼編譯生成C源代碼,然后調(diào)用C編譯器編譯生成單一可執(zhí)行文件

  • 很容易跟C集成,方便使用C成熟豐富的代碼庫

  • 可以使用C手動(dòng)管理內(nèi)存malloc,calloc,memmove,memcpy實(shí)現(xiàn)對(duì)內(nèi)存進(jìn)行手工控制


  • Vscript可以像python腳本那樣簡單,方便地寫系統(tǒng)shell

  • 內(nèi)置json支持,非運(yùn)行時(shí)反射實(shí)現(xiàn),性能更好

  • 內(nèi)置SQL語法支持,實(shí)現(xiàn)更簡單的ORM

  • 內(nèi)置一個(gè)輕量的跨平臺(tái)GUI庫

  • 內(nèi)置一個(gè)web框架

  • 代碼熱更新,修改代碼,實(shí)時(shí)顯示結(jié)果


  • V代碼生成javascript,webassembly代碼

  • C/C++代碼生成V代碼


以上是對(duì)V語言的特性總覽,里面有的特性已經(jīng)實(shí)現(xiàn),有的還未實(shí)現(xiàn)

有些未實(shí)現(xiàn)的特性好得讓人感覺不真實(shí),拭目以待吧,畢竟語言的發(fā)展周期都是按年來計(jì)算的

未實(shí)現(xiàn)的功能正在逐步實(shí)現(xiàn),計(jì)劃在2020年5月份發(fā)布0.2版本,相對(duì)完善一些,穩(wěn)定一些

希望作者和開發(fā)團(tuán)隊(duì)能持續(xù)下去,周邊生態(tài)能起來


V語言代碼初步印象:

//單行注釋

/*
多行注釋
*/

module main     //定義主模塊,編譯生成可執(zhí)行程序

import os       //導(dǎo)入模塊
import strings
import time

fn main() {     //主函數(shù),程序運(yùn)行入口
    println('say hello world')  //語句結(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)鍵字改為更簡短的fn,支持不確定個(gè)數(shù)參數(shù),支持多返回值
//pub表示公共級(jí)別的訪問控制,可以被模塊外使用,否則只能在模塊內(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種訪問控制
//默認(rèn)私有且不可變
  a int  
//私有,但可變
mut:     
    x int
    y int
//公共,但不可變
pub:    
    d int 
//模塊內(nèi)可訪問且可變;模塊外可訪問,但是只讀
pub mut:
    e int 
//全局字段,模塊內(nèi)部和外部都可訪問,可修改,這樣等于破壞了封裝性,不推薦使用
__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.接口-接口無須顯式聲明實(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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容