持续排名GITHUB榜首的V语言竟是C++的孪生兄弟-V版毁灭战士值得点赞

      最近V语言持续在GITHUB上霸屏,而笔者在上周介绍了V语言的一些基础,详见:GITHUB排行榜C位出道-手把手教你玩转V语言版的俄罗斯方块,而这周我也持续关注了V语言的动态,这次带大家玩一下V语言版的毁灭战士。

    

   V语言 VS C/C++

       访问V语言的官网https://vlang.io/,可以看到其主打的特点就有

  • C to V translation

    在具体介绍时其声称可以用快400倍的速度来整译整个C或者C++语言的工程。

   而且还举出了使用V语言使用vector例子

#这是C++使用vector的版本
std::vector<std::string> s;
s.push_back("V is ");
s.push_back("awesome");
std::cout << s.size(); 
#这是V语言的版本
mut s := []
s << 'V is '
s << 'awesome'
println(s.len)
    我看可以看到V语言在语法上与JAVA、.NET等纯面向对象的语言比较接近语法甜点很多,API的调用也不像C++那么刻板,但是其内核其实是C/C++,这就让我们这种金融IT的人士非常的开心,因为纯的面向对象语言都有垃圾回收的问题,延时的不确定性使JAVA不太适合做为量化交易的主要编程语言,而Rust虽然也没有延时,但是他还没有像V一样在不进行改造的情况下,直接完整编译C语言工程的能力。
   所以V语言不但具备了C的高效率还能能与C兼容、最关键的是语法掌握起来比较简单,这也是V的核心优势。

   V语言版的DOOM

    在V语言的官网上提到马上有一篇将毁灭战士(DOOM)翻译为V语言的博客PO出,不过使用V语言编译、执行DOOM也能让我们进一步了解V调用C、C++的机制,其Github的地址在github.com/vlang/doom

   下面我来给带大家整理一下ubantu下的安装过程(V语言的安装过程请参考https://blog.csdn.net/BEYONDMA/article/details/94349691,这里假设读者已经装好不再赘述)

    1.安装sdl库

sudo apt install libsdl2-dev
sudo apt install libsdl2-mixer-dev

   注意这步在官网上并未说明,如果不装后面在MAKE的阶段会报sdl::mixer库missing

2.编译doom代码

git clone https://github.com/chocolate-doom/chocolate-doom
cd chocolate-doom
cmake .
make chocolate-doom

3.下载V的调用DOOM工程的代码

wget https://raw.githubusercontent.com/vlang/doom/master/p_enemy.v
v -lib translated p_enemy.v
cp p_enemy.o src/doom/CMakeFiles/doom.dir/p_enemy.c.o

4.运行程序

make chocolate-doom
src/chocolate-doom -width 640 #640是指程序运行界面的宽度

5.p_enemy.v调用C的机制

  下面我再给大家展示一下p_enemy.v,我们可以看到如果想调用C的函数,只需要在声明加上fn C.函数名(函数签名) 返回类型,即可完成,另外调用__global标签就能调用全局变量了。可以说是非常方便啊。

struct C.FILE{} 
fn C.memcpy(voidptr, voidptr, int)#调用C的函数 
fn C.memmove(voidptr, voidptr, int) 
fn C.memset(voidptr, voidptr, int) 
fn C.puts(voidptr) 
fn C.printf(voidptr, ..) 
fn C.sscanf(voidptr,voidptr, ..) voidptr 
fn C.strcasecmp(voidptr, voidptr) int 
fn C.strncasecmp(voidptr, voidptr, int) int 
fn C.strcmp(voidptr, voidptr) int  
fn C.strncmp(voidptr, voidptr, int) int  
fn C.fopen(byteptr, byteptr) *C.FILE 
fn C.fclose(*C.FILE)  
fn C.ftell(*C.FILE) int 
fn C.remove (byteptr) 
fn C.rename ( byteptr, byteptr)  
fn C.isspace(byte) int 
fn C.atoi(byteptr) int 

__global video_driver byteptr#调用全局变量 

__global screenvisible bool 

__global vanilla_keyboard_mapping int 

__global screensaver_mode bool 

__global usegamma int 

具体效果是这样的,虽然只是DOOM一代的画质,但是笔者还是很喜欢,玩了一下午。纯V语言版DOOM出炉笔者会在第一时间向大家分享。