使用CNI组成宏编写CovScript扩展

概念介绍

CNI是什么?

CNI,全称为C++ Native Interface,是Covariant Script与C++之间进行交互的抽象接口,几乎支持所有能被调用的东西

CNI组成宏是什么?

CNI组成宏是CNI标准扩展的一部分,旨在用简单易用的宏定义代替繁杂的 CNI 声明

CNI标准扩展又是什么?

C/C++ Native Interface Standard Extension,即CNI标准扩展,是Covariant Script解释器扩展的一部分,旨在降低中低复杂度的Covariant Script语言扩展的编写难度

让我们开始吧

必需头文件

#include <covscript/dll.hpp>

Covariant Script扩展头文件

#include <covscript/cni.hpp>

CNI标准扩展头文件

CNI根名称空间(CNI Root Namespace)

在CNI标准扩展中,我们首先需要接触到的第一个概念就是CNI根名称空间

Covariant Script在引入扩展时,会将扩展中的内容映射为Covariant Script语言中的名称空间,因此CNI根名称空间就是这种映射在C++中的表现

事实上,由于需要建立C++与Covariant Script扩展系统之间的联系,CNI根名称空间会自动完成一些必需工作。因此,我们几乎所有的操作,都必须在CNI根名称空间中进行

声明CNI根名称空间

CNI_ROOT_NAMESPACE {
    // C++代码
}

类似于C++的名称空间声明,在关键的CNI_ROOT_NAMESPACE宏后只需紧跟花括号组成的语句块即可

CNI根名称空间对应着C++中的名称空间名cni_root_namespace

CNI函数(CNI Function)

CNI函数名字叫做函数,实际上是一种C++函数到Covariant Script函数的映射

CNI函数是CNI组成宏的一部分,可以说是整个CNI标准扩展中唯一一个真正和CNI产生联系的部分,其他部分只能说是在配合CNI的工作

CNI系统是Covariant Script扩展系统的多个子系统之一,其功能为构建CNI抽象层以完成Covariant Script函数到C++函数调用的转换工作,具体原理我们这里就不再深究

声明CNI函数

// 声明C++函数
CNI(函数名)

我们只需要先在当前名称空间(必须是CNI名称空间)中声明C++函数,然后再在其后追加一句CNI组成宏,即可完成CNI函数的声明

Hello,world!

到这里我们已经介绍了最基础的CNI组成宏用法,下面就是喜闻乐见的实践环节了

示例代码

// CovScript头文件
#include <covscript/dll.hpp>
#include <covscript/cni.hpp>
// STL输入输出库
#include <iostream>
// CNI根名称空间
CNI_ROOT_NAMESPACE {
    // C++函数声明
    void test() {
        std::cout << "Hello,world!" << std::endl;
    }
    // CNI函数声明
    CNI(test)
}

结合我们之前介绍的知识,能不能看懂这段代码呢?

编译为Covariant Script扩展

由于开发环境的多样,我们这里不再阐述Covariant Script SDK的安装方法

本教程基于基于Debian Linux的发行版,使用Windows的朋友推荐先使用Windows Subsystem Linux进行开发

首先是安装SDK,请在root环境中运行以下代码或使用sudo执行

# wget http://mirrors.covariant.cn/covscript/covscript-amd64.deb
# dpkg -i ./covscript-amd64.deb

然后,切换到工作目录,即你的代码所在目录,执行以下指令

# g++ -std=c++14 --shared -fPIC -O3 源代码.cpp -o 扩展名.cse -lcovscript

执行完毕后,会在当前目录生成一个文件名为”扩展名.cse”的Covariant Script扩展,接下来执行Covariant Script REPL验证

# cs_repl
Covariant Script Programming Language Interpreter REPL
Version: 3.2.0 Psephurus gladius(Stable) Build 8
Copyright (C) 2019 Michael Lee. All rights reserved.
Please visit http://covscript.org/ for more information.
> import test
> test.test()

程序应在终端输出“Hello,world!”,如下图

这便代表我们的扩展编写正确,Covariant Script调用了扩展中的C++函数

模板元编程之类型萃取(Type Traits)中匹配规则的推导方法

现我们希望在编译期判定

  1. 一个类型是否为常量类型
  2. 一个类型是否为引用类型
  3. 一个类型是否为模板类型

那么如何去做呢?

首先是写出泛匹配,泛匹配的结果一定为失败(false)。在本例中的三个需求都是针对单一类型的萃取,所以泛匹配只需要写一个参数即可:

template<typename> struct is_xxxx {
static constexpr bool result = false;
};

在这里,模板参数的参数名被省略,只需把xxxx改成对应的易读名即可,如is_constant_type、is_reference_type、is_template_class。所有的单一类型萃取都可以使用这个泛匹配,只需根据需要更改result的形式即可。比如在这里我们只需要判断是不是某种类型,所以我们使用bool,相应的特化匹配也只需要写一个即可。

接下来就要开始写特化匹配了。特化匹配一般比较难写,我们在这里分成四步:

  1. 写出最终要匹配的类型的一阶推导式
  2. 补齐对应的参数名和相关语法
  3. 写出对应的模板参数列表
  4. 完成特化匹配

一:写出最终要匹配的类型的一阶推导式

推导式的形式一般是:

元素 -> 语法描述

那么推导式的作用就是描述使用“语法描述”分解“元素”的方式,我们将这种方式成为文法。编译器会根据推导式描述的文法对程序进行解析,这种解析的过程称为匹配。

一阶推导式仅涉及到一次匹配,一般比较好写,但以后为了解决更复杂的问题我们可能要写高阶推导式甚至递归推导式,其中递归推导式涉及到消除无限递归的问题,我们以后会讲。

在这里,对应三个例子,有三个一阶推导式:

  1. ConstT -> const T
  2. RefT -> T& | T&&
  3. TemplateClass -> T<…>

注意,“…”指的是任意参数。后两个一阶推导式理论上是递归推导式,但我们不关心接下来的递归结果,所以也可以看作一阶推导。

问题:请列出下面几个类型符合的推导式以及推导结果

  1. const int&
  2. const std::map<std::string, std::size_t>

答案:

  1. 符合ConstT和RefT两个推导式,推导结果分别是T=int&、T=const int
  2. 符合ConstT和TemplateClass两个推导式,推导结果分别是T=std::map<std::string, std::size_t>、T=const std::map

二:补齐对应的参数名和相关语法

一般来说,需要补齐的有以下几个情况:

  1. 任意参数,需要用模板参数包表示出来
  2. 嵌套匹配,需要加上传递给嵌套匹配的参数

在这里需要补齐的只有第三个,补齐后的形式为:

TemplateClass  ->  T<X...>

三:写出对应的模板参数列表

这一步就比较简单,只需按照模板参数的语法规则对照写就可以了:

  1. template<typename T>
  2. template<typename T>
  3. template<template<typename…ArgsT>class T, typename…X>

其中,第三个模板参数列表还可以简化:

template<template<typename...>class T, typename...X>

为什么可以简化?因为这里ArgsT并没有实际意义,仅为了标记模板类参数的模板参数列表。

四:完成特化匹配

到这里我们只需要将我们完成的部分填入下面的模板:

模板参数列表 struct is_xxxx<推导式语法描述> {
static constexpr bool result = true;
};

在这里,既然是特化匹配,匹配结果必然是成功(true);除了填入完成的部分,还要把xxxx改成与泛匹配对应的易读名;像第二个判断类型是否为引用的特化匹配因为存在两个情况所以需要写两个特化匹配。

所以我们最终完成的代码如下:

// 一个类型是否为常量类型
template <typename T>
struct is_constant_type
{
static constexpr bool result = false;
};
template <typename T>
struct is_constant_type<const T>
{
static constexpr bool result = true;
};
// 一个类型是否为引用类型
template <typename T>
struct is_reference_type
{
static constexpr bool result = false;
};
template <typename T>
struct is_reference_type<T &>
{
static constexpr bool result = true;
};
template <typename T>
struct is_reference_type<T &&>
{
static constexpr bool result = true;
};
// 一个类型是否为模板类型
template <typename T>
struct is_template_class
{
static constexpr bool result = false;
};
template <template <typename... ArgsT> class T, typename... X>
struct is_template_class<T<X...>>
{
static constexpr bool result = true;
};

此代码符合C++11标准

浅析中国崛起之必然

四川大学计算机学院 李登淳

中国是一个什么样的国家?对于我们来说,中国是我们的祖国、我们的家园,是代表着我们文化的符号,是我们思想深处灵魂的依靠。对于亚洲各国来说,中国是又爱又恨的邻居,是无法忽略的重要区域大国;对于西方各国来说,中国是拥有五千年历史的神秘国度,他地大物博、人口众多,他的人民勤劳勇敢、吃苦耐劳。西方人的是身边总是围绕着他们又爱又恨无孔不入的中国制造。

一、优秀文化铸就了中国的精神脊梁

中国是四大文明古国中唯一一个存活至今且完整保留了自己优秀文化的国家。就像世间万物一样,漫长的历史对于中国来说也是具有两面性的,在一定程度上造成了近代的闭关锁国。

傲慢是一个文明最危险的符号,纵观世界,历史上的帝国覆灭最终均可以总结为傲慢。在我们的国家,正是因为傲慢使得清朝的皇帝选择了自高自傲、闭关锁国,最终造成了中国近代与世界主流发展的脱节。但我认为,中国近代的丧权辱国给每一个中国人留下了深刻的痛,从而在一定程度上推动了中国近代彻底的革新。为什么这么说?我们可以看一下儒家文化圈中的日本和我们熟悉的邻居印度。先说日本,日本与中国的文化十分相似,受益于明治维新完成了工业革命,但之后由于资源匮乏演变为军国主义转而输出武力,在一战二战中均为重要的组成部分。二战之后日本实力被大大削弱,虽然受益于经济全球化发展出比较完整的工业体系,但由于体量太小难以维持,最终在20世纪末爆发经济危机,至今一蹶不振。

再说印度,受益于英国殖民的历史,印度在1949年时拥有比我们好得多的工业基础,同为拥有悠久历史的文明古国,应当发展的比中国更好,至少与中国类似才对。但事实则是中国成为了世界工厂、工业总产值位列世界第一、是当今联合国安理会五大常任理事国,在各项指标上远超印度,除了人口。

印度为什么没能崛起呢?没有经历过现代工业国家必须的土地改革;没有行之有效的中央集权政治制度;没有消除阶级限制难以解放大量的劳动力;没有高效的教育制度以提供现代工业需要的高素质工人;诸如此类。

中国在近代完成了很多非常伟大的改革,长达几十年的革命、动荡和战争几乎完全清除了中国的阶级旧势力。土地改革解放了大量农村劳动力,激发了广大劳动者的劳动热情;文化大革命和文青上山下乡完成了世俗化和教育的普及;义务教育培养了大量高素质的工业人口;强有力的中央集权保证了政令畅通和地区之间的亲密高效协作;苏联在建国初期的援助使得中国快速完成了工业化。正是由于这些伟大的改革给我们国家打下了坚实的基础,才能在40年前改革开放时引爆了发展的引擎,最终成就了近代经济奇迹。

那么上述的各项改革,为什么在中国能够完成呢?正是基于我们国家悠久的历史留下的政治智慧以及近代丧权辱国引发的中国人的觉醒。我们独有的儒家文化决定了我们对教育的重视,自古以来的家国情怀,以及“王侯将相宁有种乎”和“水可载舟,亦可覆舟”的政治觉醒。这正是漫长历史两面性的正面部分,不可否认的促进了当代中国的复兴。

但为什么和中国文化类似的日本没能崛起呢?这就不得不提到日本的先天缺陷:国土太小、资源匮乏,表现出来就是对于一些社会问题难以内部消化,只能选择转移内部矛盾,即战争,或者崩溃,如经济危机。但中国作为一个国土辽阔的大国,能够在内部消化整个产业链,任何问题在中国都有很大的缓冲空间。西方国家认为,中国是一个“试图伪装成国家的文明”,这也在侧面反映出中国本身的多样性。

综上所述,在亚洲各国中,中国无论在过去还是将来都是不容置疑的顶尖力量。

二、中国特色社会主义是中国崛起的必然

在全球化的今天,西方国家由于在工业革命中占据了先机从而称霸世界长达百年之久,中国的崛起无法避开西方国家的遏制和打击。上一个能够挑战美国霸权的国家–苏联,已逐渐消失在历史的视线中。那么中国为何能够避免冷战和热战,最终和平崛起呢?我们不得不提起当今世界唯一的超级大国:美国。

美国是当前世界的霸主,以民主和自由著称,被戏称为“灯塔国”。美国的崛起,一方面是得益于美国得天独厚的地理优势:两面环海,无陆地入侵威胁,这使得两次世界大战期间美国本土几乎没有被战火波及;水资源丰富,大面积国土为可耕种的平原,有利于规模化耕种,最终使得美国的农业成本极低。美国在第二次世界大战期间大赚战争财,战后又通过马歇尔计划牢牢掌控了欧洲的经济命脉,最终冷战打败苏联后成为全球唯一的霸主。

美国看起来强大到独孤求败,但实际上其内部也存在着诸多问题。

首先最大的问题便是产业空心化:美国的第三产业占比高达60%,工业产值不及中国的三分之二。无论第三产业是多么美好,第二产业永远都是现代工业国家的立国之本。中国之所以成为世界工厂正是因为中国拥有完整的工业体系、成熟的供应链体系和发达的物流系统。

第二大问题是腐败分裂的政治体系:美国的政治体系被视为民主和自由的典范,其三权分立的政治制度有效的防止了权力的滥用。但近代以来美国政治格局被资本集团挟持,导致国家的利益被资本高度捆绑。虽然美国表面上是民主制度,但资本家会通过操控舆论的方式来蒙蔽民众的眼睛,从而达到操控选情的目的,最终牢牢掌控美国政府,使其成为实质上的傀儡政府。在此基础上各个资本集团为了达成自己的目的从而扶持不同的政党,因此表现出来的便是美国两党纷争的政治局势。

资本是逐利的,在一定程度上来说资本家远不及政治家的目光长远。不同利益集团缺乏强有力的中央政府统一调控,最终造成了美国政府执行力效率低下,除非存在强有力的外部压力,很难像中国一样“集中力量办大事”,或是为了更长远的利益牺牲眼前的利益。得益于中国的一党专政和中央集权,中国的各种政策持续性强,执行效率和力度都要更高,当然也能很好的协调各方面的资源,如中国的各种资源调动工程和经济特区等。

不得不承认,任何一种制度都有其两面性,美国的制度减少了政府犯错的几率,却牺牲了执行效率;中国的制度提升了执行效率,却忽略了政府也会犯错的事实。但是我们的政府近年来在不断改进监察制度,从而极大程度地规范了政府的行为,这也在另外一个方面证实了当前中国政治体系的优越性。

说完了内部,不得不提到中美两国外交政策的差异性。美国的外交政策充分体现出西方文化的排他性,西方文化自古以来都是小城邦之间的外交,他们缺乏大一统的文化认知,所以欧洲至今还是无数个小国在欧盟框架中打打闹闹,美国各个州至今分裂严重。这表现在美国全球治理的政策上就是美国倾向于把每一个团结的地区拆分为一个一个的小国,然后再插手地区事务使得这群小国之间引发矛盾,然后爆发地区冲突,美国就可以坐享其成,卖军火赚的盆满钵满的同时还能保证这些国家无法形成气候,威胁美国的既有利益。

中国的外交政策则融合了中华文化中包容的理念,无论是“和平共处五项原则”,还是“求同存异、合作共赢、共建人类命运共同体”,都无不体现出中国五千年的政治智慧。虽然无论是何种政策,均反映出国家之间的利益交换或者说体现出国家根本利益的最大化。如果说中国的政策像是“聪明”的商人,精打细算;那么美国的政策则更像中世纪的“欧洲海盗”,豪夺强取。

综上所述,美国依旧强大,但其已经无法阻挡中国崛起的步伐。

我们的先辈力挽狂澜,帮助我们国家度过了最困难的时期。但当今世界依然充满了各种挑战:日本和印度依旧是不可忽视的地区大国,美国再疲弱也在短期内不会失去其霸主地位。所以,中国的崛起之路远比我们想象的要困难。但另外一方面,我们的国家无论是在政治体系上,还是在综合实力上,都已经展现出崛起的不可阻挡之势。

总结来说,中国的崛起是必然的。当代中国,必将大有可为。

2018.12.18,于江安河畔,有感而发

逆流而上:从政府大院一步步走向四川大学

四川大学计算机学院 李登淳

我们这一代人被称为“千禧宝宝”,一出生就处于一个十分优越的环境中:我们的父母大多数都接受了良好的教育,国家经济正享受着改革开放的红利,我们中的很多人都是独生子女。

在这样一个时代背景下,我们在享受着父辈未曾享受过的资源同时,也面临着比父辈多得多的诱惑和陷阱。

我出生在地处城乡交界处的一个政府大院中,父母是很普通的国家公务员,都接受过高等教育。由于国家政策的限制,我父母只能养育我一个孩子,所以我是从小集宠爱于一身的独生子女。大院里的孩子情况多数与我相似。虽然我们和城里的孩子都属于独生子女,但包括我在内的大院里的孩子与他们不同:我们从小接触不到千奇百怪的社会环境。

我们的世界就是大院,我们在能够独立出行之前从未自己踏出过大院的大门,当然这也让我们这群孩子和所属的家庭免遭非典的伤害。因为那个时候母亲在另外一个不远的政府单位工作,所以非典将我和母亲隔离开了好一段时间,那时候不知道啥是非典,只知道不能见到母亲了。这也导致了我在具体查询了非典相关资料以前并不知道我小时候爆发过这样一场灾难。

后来我大了一些,父母开始带着我去院外的农田里玩,摘麦穗,挖野菜,捉虫子。记得那个时候的天还是蓝的,晚上还能坐成一圈围在大院操场上数星星。我们一群孩子在整个大院里玩捉迷藏,玩飙自行车游戏。家长们都互相认识,在那个夜不闭户的小院里从来不担心我们的安全。夏天热了我们就去买雪糕的奶奶家买几只小布丁,大概只要五毛钱。

就这样我们在大院的庇护下小学毕业了。

父亲中专时学的是计算机专业,所以他对于我偶然间造访他办公室时对电脑展现出的兴趣进行了一些引导,送给我他曾经的教材。我便使用那几本被父亲翻的泛黄但依旧整洁的旧书进行了计算机相关的启蒙,从此便一发不可收拾。

初中时我到了隔壁教育更发达的城市读书,住在爷爷家,父母每天晚上乘坐单位的班车到爷爷家照顾我的生活。后来爷爷奶奶为了方便我读书搬到了叔叔家,从此爷爷家成了实质上我们的新家。我正是从初中开始比较系统的学习计算机相关知识,买了很多这方面的书籍,包括硬件组成和维护以及比较简单的CMD脚本等。父亲的好友是单位的信息管理员,得知我对这方面感兴趣便放我到单位的废旧硬件仓库里玩,我硬是在里面拆拆装装淘出来三四台电脑,这也为我后来学习编程打下了坚实的基础。

初二春节的时候在书店里偶然看见了一本Accelerated C++,当时刚参加过学校的科技展,其中就介绍了C++,于是我毫不犹豫地买了下来,开始自学C++。经过近一年的摸索我在初三时取得了一些进展,开始写一些简单的小项目,现在看来都是玩具级别的东西。当时因为父母管教比较严格并没有智能手机,又因为小时候不知道网吧这种东西所以一直都是有什么问题自己烧脑解决,然后回家之后在简陋的小平板上一点一点打进去调试练习。这也让我养成了有问题先自己想方设法解决的习惯以及不依赖IDE进行编程的习惯。

初三时同时发生的还有另外一件事:我们的班主任兼数学老师发掘了我的潜力,鼓励我自学数学知识并尝试自己解决困难的数学问题,然后在讲台上给同学们讲解。可以说我的这个班主任彻底的改变了我的性格,让我更加自信,培养了我独立探究问题的能力和教授知识的能力。

同时我也得以逆转不断下降的成绩,成功考入市重点高中。

进入高中,首先是毛遂自荐第一次当上了班长,在高一班主任的培养下逐渐熟悉了团队管理的一些技巧和注意事项,同时也磨练了我桀骜不驯的性格。但真正再一次改变了我的性格的是不久后的一次车祸:我为了躲避行人不小心使自行车前轮刹车抱死,头部受到严重冲击摔在路边不省人事,被同学看见帮忙打了120送到医院抢救。完全恢复意识时大概已经是一两天之后了,上身插满了心肺监护的探头。

还好我命大活了过来,只是头骨骨裂,颅内出血量又恰巧躲过了头部手术指标,除了口腔里因为碎裂的牙齿划伤缝了几针之外没有其他外伤。被捆在病床上一个月后腿部肌肉萎缩到几乎不能走路了,我又在父亲的帮助下重新站起来学会走路。在病床上的一个月里,除去前半个月几乎都在睡觉(恢复神经),剩下半个月就是在病床上思考人生。父母因为这场事故濒临崩溃,痊愈后再也不对我的学习加以期望,用父亲的话说,孩子能好好的活着就满足了。

真的感慨父母永远是背后最坚实的依靠。

因为这个事我在做事风格上要收敛了不少,开始做一些实事。出院后第一件事就是在各方的支持下向校方提出申请建立了计算机社团,这中间又经历了好多波折,但年级主任最终扛不住我的软磨硬泡同意了。然后就是热火朝天的宣传,招新,闹得整个学校沸沸扬扬,我最高纪录大概是给上百人同时讲课。社团在我高二时达到顶峰,学校划给我们一个废旧机房,我组织学生打扫了一遍卫生然后扯上了网,在一堆旧电脑里凑出来几个用,在这里我得以大量的编写代码,我这边编写出来的程序立刻就有几十个学生帮忙测试,形成一个十分良性的循环,在这种需求驱动的开发模式推动下我接连完成了CovBasic的开发和CovScript开发,后者成为我中学时期编写的规模最大复杂度最高的程序。

高三时我渐渐退出社团日常管理,但依旧掌握大局,偶尔还是去机房写一些程序。在此期间我带的一个学生获得了我们社团成立以来第一个省级奖项:NOIP二等奖。由此为契机我推动了学校官方竞赛班的创立,但由于有了竞赛班加上高三学习越来越紧张我分身乏力,社团总体开始走下坡路,到我毕业时已经名存实亡了。

同时另外一边,我母亲注意到了四川大学等一些985高校有不需要各大竞赛奖项而且最高能够降一本线录取的优惠资格,开始为我筹备自主招生事宜。我母亲的上级领导的女儿前一年刚刚通过自主招生考上了北京师范大学,所以他便将相关资料和经验交给我母亲,我母亲在其帮助下顺利帮助我完成了相关准备工作并顺利通过了四川大学的自主招生复试资格。我根据我自身情况高考前一个月向父母和班主任提出回家自学,在充分交流之后他们倒也是十分开明的同意了我的请求。最终我十分顺利的在高考中超常发挥,取得了理想的成绩。

为什么说是超常发挥?因为我考前焦虑症虽然没体现在精神上,却异常导致了阑尾炎的发作,我考试两天都是在疼痛中渡过。考完之后几乎立刻病情就得到了缓解,高考之后立刻就赶到成都参加四川大学自主招生复试,我竟然吃了好几天麻辣火锅都没有任何问题,后来一直阑尾都没有任何复发的迹象。

当然了,复试的时候由于我拥有十分丰富的演讲和教学经验,应付面试毫无压力,顺利拿到了直降一本线的录取资格。

回看18年的成长历程,总体是非常顺利且特殊的。我一直在说,我用我自己的经历证明了,任何努力终究不会白费,但付出努力的同时必须要抓住机遇。有人可能会说,我只是幸运罢了,其实并没有这么简单。的确很多事情我非常幸运,但事实上幸运在不断的降临在每个人身上,只是他没有发现并加以利用罢了。我觉得我的经历给我的最大启发便是千万不要过于功利的为了一个短期的目标而奔跑,成功的关键在于向着一个足够远大且真实的目标付出持续而坚定的努力。我的理想是建立完整的中国自主研发软件生态,所以我在这条漫漫长路上不断地积累,不断地努力,而能够进入四川大学就读只是一个阶段性成果罢了。

那为什么说我是“逆流而上“呢?

很明显,在大家都疯了一般在学校里参加各种模拟测试时,我回家自学;在大家都去网吧,打游戏,谈恋爱,追电视剧时,我在写程序;大家都在参加各种比赛拿证的时候,我在社团泡着写程序;大家都在使用成熟框架写程序时,我不厌烦的去尝试自己实现基础功能。我看起来是最傻,最Low的那个臭屌丝,整天沉迷于好像没什么用的程序里,最后却比大多数嘲笑我的人跳的更高。

那为什么逆流的人很少能攀的更高呢?

逆流是一个非常危险的行为,如果把控不好方向很容易走歪。都听说过“博观而约取,厚积而薄发“,却很少有人懂得其本质。现在的人都太浮躁,被大量的毒鸡汤洗脑,希望能一夜成名。尤其是我们的同龄人和后辈,被现在一些不良之风带坏,梦想通过当网红打电竞一夜暴富,过上衣食无忧的生活;或者希望几年,几个月,甚至几周就精通一门专业技术,快速实现自己不切实际的梦想。无论是什么事,没有厚积,哪来的薄发!如果怀揣梦想,一定要脚踏实地的一步一个脚印去实现它,戒骄戒躁,才能有机会去实现它。

最后,任何一个人的成长道路都不是完全相同的,一定要结合自己的实际情况,选择适合自己的道路,并坚定的走下去。我相信任何人都能够逆流而上,活出自己的精彩。

谨以此文,纪念我18年的成长历程,送给我的学生,我的学弟学妹,我的后辈以及我自己,希望能够给更多的人启发而走出自己的道路。

为什么要学习Covariant Script

经过将近两年的发展,Covariant Script可以说是一个比较成熟的编程语言了。如果不追求一些先进的语言特性,Covariant Script能够满足编写程序的大多数需求。

目前而言,Covariant Script拥有以下优势:

  1. 动态类型。当然这不仅是Covariant Script独家的优势,但对于一门脚本语言而言是一个非常方便的设定。我个人是不希望在写点小程序时和类型纠缠个不停。
  2. 强类型。这当然也不是独家优势,但结合动态类型能够保证类型安全。事实上Covariant Script中可以说是不存在任何形式的不安全的隐式转换,隐式转换也很少,又能省不少事。
  3. 语法清晰无歧义。虽然一堆人吐槽我的语法不好看不符合基本法啥的,但我个人对于这一套语法是蛮满意的,至少没有歧义。虽然end神烦,也总比if…fi和Tab强吧。至于C-Style的花括号,不是做不到,但以我的教学实践来看,少写花括号的情况比少写end更常见。
  4. 有比较完善的标准库。基本上啥都有,啥都能干。基本上如果你不需要重新实现一个Covariant Script都够了(其实自举也是没啥问题的,就是麻烦点,感兴趣的朋友可以试一下)。
  5. Bug少。这个当然是一定程度上的自嘲,毕竟当初Covariant Script可是天天有Bug能修,现在都闲了好几个月了。不过核心寥寥几万行的小项目能有多少Bug呢?但我想应该也比大多数个人开发者开发的语言更可靠了。
  6. 最后不敢单独提的几点,包括跨平台(烂大街了,一堆Java实现的语言有天生优势),与C++的交互比较简单(用户群不关心),性能好(只是在没有平台优化加成的情况下比Python好而已)

我设计Covariant Script的目的就是尽可能降低使用程序解决问题的门槛,也就是那句Slogan:让编程变得更简单。这不仅是针对初学者,对于熟练者而言也能降低很多与语言特性本身纠缠的成本。当然仅用Covariant Script写大型程序或项目是不太现实的,毕竟在这个时候脚本语言的优势会全部转换为劣势。对于大型程序和项目,开发者可通过使用Covariant Script SDK打造属于自己的脚本体验,这一块的文档暂时缺失,感兴趣的朋友可以联系我获取帮助。

联系方式:

QQ: 2943407092

微信: mikecovlee

电邮: mikecovlee@163.com