V (Vlang) 首个主要版本 0.2 发布,安全快速可编译的静态语言

来源: OSCHINA
编辑: 局长
2020-12-23

V (Vlang) 0.2 发布了,作者宣布这是首个主要版本,更新重点是提升稳定性和优化编译时(compile-time)内存管理。

部分更新亮点

  • 通过启用-autofree参数对 compile-time 内存进行管理(计划在 0.3 中默认启用)
  • 提供对 iOS 和 Android 的早期支持
  • 引入 IO 流
  • 引入 channel 和 lock
  • 引入内联结构体 (Struct embedding)
  • 支持通过 GitHub Actions 自动构建和部署 Linux/Windows/macOS 的 V 二进制文件
  • 支持 C++ 编译器:C 后端生成的代码现在可以由 C++ 编译器编译
  • 泛型语法更简洁,例如使用foo(5)代替foo<int>(5)
  • V 现在可通过 WASM 在浏览器中运行
  • 完善文档
  • ……

详情查看 https://github.com/vlang/v/discussions/7474
V 0.3 Roadmap:https://github.com/vlang/v/blob/master/0.3_roadmap.txt

V 是一个集合了 Go 的简单和 Rust 的安全特性的静态语言,作者表示 V 与 Go 非常相似,如果你了解 Go,那么就已经了解 80% 的 V。V 在 Go 的基础上进行改进之处:https://vlang.io/compare#go

V 主要特性

  • 简单(作者声称可以在不到一小时内学习 V)
  • 快速编译(编译器只有 400kb,而且无第三方依赖)
  • 易于开发:V 在不到一秒钟的时间内完成编译
  • 安全:没有 null、没有全局变量、没有未定义的值、边界检测、默认使用 Immutable 结构体
  • 支持 C/C++ 转换
  • 方便使用的交叉编译
  • 提供跨平台 UI 库
  • 内置图形库
  • 内置 ORM
  • 内置 Web 框架
  • ……

示例代码

数据库访问:

struct User { /* ... */ }
struct Post { /* ... */ }
struct DB   { /* ... */ }

struct Repo <T> {
    db DB
}

fn new_repo<T>(db DB) Repo {
    return Repo<T>{db: db}
}

fn (r Repo) find_by_id(id int) T? { // `?` means the function returns an optional
    table_name := T.name // in this example getting the name of the type gives us the table name
    return r.db.query_one<T>('select * from $table_name where id = ?', id)
}

fn main() {
    db := new_db()
    users_repo := new_repo<User>(db)
    posts_repo := new_repo<Post>(db)
    user := users_repo.find_by_id(1) or {
        eprintln('User not found')
        return
    }
    post := posts_repo.find_by_id(1) or {
        eprintln('Post not found')
        return
    }
} 

网络开发:

struct Story {
    title string
}

// Fetches top HN stories in 8 coroutines 
fn main() {
    resp := http.get('https://hacker-news.firebaseio.com/v0/topstories.json')?
    ids := json.decode([]int, resp.body)?
    mut cursor := 0
    for _ in 0..8 {
        go fn() {
            for  {
                lock { // Without this lock the program will not compile 
                    if cursor >= ids.len {
                        break
                    }
                    id := ids[cursor]
                    cursor++
                }
                resp := http.get('https://hacker-news.firebaseio.com/v0/item/$id.json')? 
                story := json.decode(Story, resp.body)?
                println(story.title)
            }
        }()
    }
    runtime.wait() // Waits for all coroutines to finish 
} 
展开阅读全文
8 收藏
分享
加载中
精彩评论
虽然泛型很丑,但静态强类型语言没有泛型,类型系统就不够灵活.
没有泛型,一个函数只能处理一种类型的数据,一个数组只能存储一种类型的数据,确实很蛋疼.
真不知道那些Go吹是怎么把Go吹得飞起的,人家一个个人开发的V语言,都支持泛型.
2020-12-24 11:09
12
举报
今年初开始,利用业余时间跟进了一段时间,感觉还不错,也顺手整理了一些学习笔记,基本涵盖V的基本语法和部分的标准库,对V有兴趣的可以看看:https://github.com/lydiandy/vlang_note
2020-12-23 16:05
7
举报
I_I
因为vlang类似于TypeScript,将代码转译成了C代码
Go当初为什么不支持范型,官方早就有解释,其中重要一条就是为了编译速度以及性能,没有找到好的解决方案,目前一般用interface{}来暂时代替,但并没有因为缺乏这条语言特性影响golang生态的繁荣
范型方案也改了好几版,按照官方的路线图将在明年支持
2020-12-24 17:22
4
举报
我看了,不是真的语言,是先翻译成C语言再去编译呢,例子都编不过。还不如CBrother脚本
2020-12-24 16:29
3
举报
说是跟golang比更多的是和nim比。不支持UTF-8命名,差评。
2020-12-23 14:33
3
举报
最新评论 (33)
变量在前,类型在后的语言老蛋疼了,idea都难以帮我生成变量名。要么先自己手打变量名,再工具提示类型。要么写了类型,再移回光标前面,工具提示类型。既然新语言要提高效率,缩写关键字有啥用?又不是用记事本写代码。定义和变量倒置更是把工具提示的优点干没了。
2020-12-28 00:14
2
回复
举报
狮子是不会和病犬打架的。赢了没意思。输了不光彩。我们应该抬头挺胸。目光看向远方。才能看的更多知道的更多。而他们只会逮谁咬谁
2020-12-27 12:10
0
回复
举报
function -> func -> fun -> fn
既然 function 都简化成这样了,那 return 为什么不简化呢,只用一个符号来表示不是更好?
2020-12-26 13:46
2
回复
举报
没有全局变量

真不习惯没有全局变量的语言
2020-12-26 01:49
0
回复
举报
这不就是golang吗,把数据类型重新type struct一下
2020-12-25 13:40
0
回复
举报
A-Z,都用完了咋办?
2020-12-25 10:54
0
回复
举报
A++ ...Z++
2020-12-28 14:33
0
回复
举报
我看了,不是真的语言,是先翻译成C语言再去编译呢,例子都编不过。还不如CBrother脚本
2020-12-24 16:29
3
回复
举报
各位,可以试试d.各种新语言,都可以试试嘛.试试才知道好不好.
2020-12-24 14:01
0
回复
举报
Wlong啥时候出来
2020-12-24 14:01
0
回复
举报
看着和go和rust都有点像
2020-12-24 13:57
0
回复
举报
更多评论
33 评论
8 收藏
分享
返回顶部
顶部