安全的全新编程语言 V语言

安全的全新编程语言 V语言

MIT
跨平台
2019-04-18
红薯

V语言 一个集合了 Go 的简单和 Rust 的安全特性的新语言。

主要特性:

  • 快速编译(编译器只有 400kb,而且无第三方依赖)
  • 安全
  • C/C++ 转换

示例代码:

数据库访问:

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 
} 

 

的码云指数为
超过 的项目
加载中

评论(84)

希若
希若
非常好,我还是继续用我的c++
吕少尘
吕少尘

引用来自“宇润”的评论

:=赋值,反人类

引用来自“wxyu”的评论

同感

引用来自“开源中国绿帽协会”的评论

就在delphi和go上面见过这种赋值号

引用来自“纯洁徐”的评论

Postgres 也是这样赋值的呢~

引用来自“javasql”的评论

oracle存储过程也是这样赋值的
我依稀记得TAL上好像也这样赋值。
javasql
javasql

引用来自“宇润”的评论

:=赋值,反人类

引用来自“wxyu”的评论

同感

引用来自“开源中国绿帽协会”的评论

就在delphi和go上面见过这种赋值号

引用来自“纯洁徐”的评论

Postgres 也是这样赋值的呢~
oracle存储过程也是这样赋值的
Nixus
Nixus
我靠, 没活路了, 又出新语言?
icdcom
icdcom
什么时候a到z所有语言都可以凑齐
M
Martin濮先生
啧啧
沙发迪
沙发迪

引用来自“火眼金睛容嬷嬷”的评论

前几天和一个邻居聊天,说孩子幼儿园的老师总是数落孩子有东北口音。我当时的反应就是:土鳖。一个不知道什么时候来到北京,自己的口音还没清理干净的货色就开始鄙视别人的土鳖。
哎呦喂..................哈哈哈
胡建洲
胡建洲

引用来自“dwingo”的评论

内存管理仍然是最大的问题, Go和Rust研究了这么久都没法避免GC或者繁琐的生命期管理, 看看V以后怎么解决吧, 现在还明显不完善.

引用来自“shifeng1983”的评论

语言解决不了的问题能不能用框架解决,比如弄个框架,写在这个框架方法调用里面的代码自动析构变量,这种不知道可不可行

引用来自“dwingo”的评论

这就是C++的做法了, 但还是有很多漏洞, 限制也不够严格, 很难保证所有代码和引入的库都用这一套框架, 总的来说不太放心.

引用来自“dwcz”的评论

这是个伪命题。内存管理还是得使用者管理。毕竟,赚钱的没花钱的快。再好的方案,在使用者都不过脑子想一想的情况下,能跑好吗。

引用来自“dwingo”的评论

虽然说带GC的语言还是需要开发者注意一些生命周期的问题, 但还是比C++这种手动和半自动的管理方式相比要省心太多了, 而且出问题的概率也低很多,解决起来也更容易, 尤其是对开发经验较少的人. 有良好自动内存管理的语言, 在内存使用上非常的人性化, 任何内存访问异常的提示也非常友好, 哪怕需要性能开销作为代价, 在很多场景下也是值得付出的.

引用来自“dwcz”的评论

你所说的其实就是资源丰富时的环境,在简单和重复的任务是有道理的,但随着需求最终还是得面对内存管理。现在的语言有点跑偏,没有在提供更高层次的抽象描叙和方便的维度转换上使劲,反倒在应该是硬件领域该干的事情上使劲。像自动内存管理、安全编程这些,对应硬件就好比要做出不会出故障的设备一样可笑。

引用来自“dwingo”的评论

看来你的开发领域限制了自己的结论, 有不同的见解也正常. 有的开发属于业务量大,经常变更和重构, 那么开发起来就无暇顾及内存管理这些细节; 有的开发需要榨干硬件潜力的, 当然手动管理是必需的. 凡事不能以偏概全.

引用来自“dwcz”的评论

不知道你在编程的那一个阶段。可以确定的是,你还没意识到,所说之事是模式不对应造成的。这里有设计模式和使用模式之间、软件模式和硬件模式之间的不匹配问题。变更和重构代码之所以麻烦,其实正是语言缺乏抽象描叙和维度转换造成的,而无暇顾及内存管理是思维惰性培养的坏习惯。说白了,就是当要写“战争与和平”时,才发现得自己一根一根的削铅笔。

引用来自“dwingo”的评论

按你怎么说,为什么现在大部分语言都是带gc的,为什么要发明自动挡汽车,为什么要发明各种机器人生产线。。。这些都会给人带来懒惰的坏习惯。
我很喜欢自己管理内存的
胡建洲
胡建洲
A语言 B语言 C语言 D语言 E语言 F语言 G语言 。。。Z语言,爸爸学不完啊。。。

暂无资讯

暂无问答

ClassVisitor 类分析

读取的类文件 1.hello/asm/bean/User.java 2.hello/asm/bean/Column.java 3.hello/asm/bean/Table.java package hello.asm.bean; @Table(name="BASE_USER") public class User { @Colu...

2012/03/12 13:07
141
0
聊聊java String的intern

序 本文主要研究一下java String的intern String.intern() java.base/java/lang/String.java public final class String implements java.io.Serializable, Comparable<String>, CharSequenc...

04/06 11:49
13
0
Smail代码调试LogUtil

调试smail代码时的工具类

2016/01/26 10:18
51
1
JNI字段描述符“([Ljava/lang/String;)V”

(Ljava/lang/Object;)I

2014/12/09 17:21
59
1
JNI字段描述符

“([Ljava/lang/String;)V” 它是一种对函数返回值和参数的编码。这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors)。一个数组int[],就需要表示为这样"[I"。如果多个数组...

2014/02/21 02:31
92
0
Scala对象

我实在是有点看不下去现在市场上写的关于Scala的对象解释,一大堆的总结,一大堆的规则,难道要背下来?非也,本文从java的角度来看看Scala对象到底是怎么回事。

2016/05/13 14:08
36
2
深入理解class字节码中的<init>,<clinit>

java中有两种特殊的方法<init>,<clinit> 1,当java类中,存在用static修饰的静态类型字段,或static块,编译器便会生成<clinit> 2,当java类中定义了构造方法,或其他非static类成员变量被赋了...

2018/11/16 14:28
5
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部