博斯克语(Microsoft)

2020-05-14 13:24:29

PermalLink GitHub是5000多万开发人员的家园,他们一起工作,共同托管和审查代码、管理项目和构建软件。

报名。

Bosque编程语言是微软研究院的一项突破性研究项目。Bosque同时支持现代云开发人员期望的高生产力开发体验(例如来自TypeScript/Node堆栈),同时还提供资源高效且可预测的运行时,其性能配置类似于本机C++应用程序。除了用一种语言支持这些以前相互冲突的目标之外,Bosque还带来了前所未有的工具生态系统,包括零工作验证、符号测试、依赖项管理验证、时间旅行调试等。

下面的代码片段和工具部分提供了小的代码示例和独特的博斯克工具。语言概述部分0中提供了博斯克语显著和/或独特功能的概要。有关该语言如何工作和流动的详细信息,请参阅简单tic-tac-toe程序的代码。

注意:此存储库和代码目前仍处于实验阶段。这意味着该语言需要修改,存在错误和功能缺失,性能受到限制。

2020年5月:我们将在5月14日举办一场现场问答的博斯克网络研讨会(注册请点击此处)。对于那些不能参加现场活动的人,也将提供点播录制。

函数add2(x:int,y:int):int{return x+y;}add2(2,3)//5add2(x=2,y=3)//5add2(y=2,5)//7。

函数doit(tup:[int,bool],rec:{f:string,g:int}):int{return tup.0+rec.g;}doit([1,false],{f=";ok";,g=3})//4

函数sign(x?:int):int{var y:int;if(x==None||x==0){y=0;}Else{y=(x>;0)?1:-1;}return y;}sign(5)//1sign(-5)//-1sign()//0。

Concept WithName{Constant$Name!=";";;字段名称:String;}Concept Greeting{抽象方法sayHello():String;虚方法sayGoodbai():String{return";告别";;}}实体GenericGreeting提供问候语{const实例:GenericGreeting=GenericGreeting@{};覆盖方法sayHello():String{return";hello world";;}}实体NamedGreeting{const instance:GenericGreeting=GenericGreeting@{};覆盖方法sayHello():string{return";hello world";;}}实体NamedGreeting。";,this.name);}}GenericGreeting@{}->;sayhello()//";hello world";GenericGreeting::instance->;sayHello()//";hello world";NamedGreeting@{}->;sayHello()//类型错误&没有为";Name";fieldNamedGreeting@{name=";";}->;sayHello()//固定错误名称Greeting@{Name=";bob";}->;sayhello()//&34;hello bob";

tyfinf Letter=/^\w$/;tyfinf digit=/^\d$/;函数fss(s1:SafeString<;digit>;):bool{return s1->;string()==";3";;}digit::Accept(";a";);//false seDigit::Accept(";2";);//truefss(";1234&。用法:FROM(";a";))//类型错误不兼容安全字符串类型fss(数字';a';)//类型错误';a';与数字fss(SafeString<;Digit>;::from(";a";))不兼容//运行时错误';a';与Digitfss(SafeString<;Digit>;::from(";3";))不兼容//TRUE。

实体StatusCode提供可解析的{field code:int;field name:string;Override static tryParse(name:string):result<;StatusCode,string>;{return switch(Name){case";IO";=>;ok(StatusCode@{1,name})case";Network";=>;ok(StatusCode@{2,name})case_=>;Err(";未知。):bool{Return s==StatusCode';IO';;}isIOCode(";IO";);//类型错误不是StringOf<;StatusCode>;isIOCode(StatusCode';Input';)//类型错误不是有效的状态代码字符串//运行时错误不是有效的状态代码字符串IOCode(StatusCode&39;Assert&39;)//FalseIOCode(stringisIOCode(StringOf<;StatusCode>;::from(";Input";))of<;StatusCode>;::FROM(";IO";))//trulet EC:StatusCode=StatusCode@';IO';Assert(ec.code==1);//true。

实体人{field name:string;}函数foo(arg?:{f:int,n?:string}|string|Person):string{if(arg==None){return";Blank";;}Else{Return Switch(Arg){type Record=>;ARG.N?|";Blank";type String=>;arg type Person=>;arg.name};}}foo()//"。foo(无)//类型错误-无不允许foo(";Bob";)//Bobfoo(Person@{name=";Bob";})//Bobfoo({f=5})//";空白";foo({f=1,n=";Bob";})//";Bob";foo({g=1,n="。

实体动物{不变$Said!=";";;字段表示:String;}函数createAnimal(标语:String):Animal{return Animal@{say=catchPhrase};}函数createAnimal(标语:String):动物需要标语!=";";;{return Animal@{say=标语};}函数createAnimalPreSafe(标语:String):动物需要释放标语!=。入口点函数getSays(Animal:String,CatchPhase:String):Result<;String,ErrData?>;或返回结果<;String,ErrData>;::Err({msg=";无效动物";});验证主题短语!=";";或返回结果<;String,ErrData>;::Err(。,Animal,";say";,createAnimal::(catchPhrase).says);}createAnimal(";woof Woof&34;)//确定总是在debugcreateAnimalPre(";";)//在debugcreateAnimalPre(";";)//在调试中不通过前提条件*而不是*RelasecreateAnimalPreSafe(";";)//在所有构建风格中都不通过前提条件(";Dog";字符串,ErrData&>;@{value=";}getSays(";";,";Woof&34;)//err<;字符串,ErrData>;@{error={msg=";无效动物&34;}}getSays(";狗";,";";)//err<;

博斯克提供了一种强大的新方法来测试您的应用程序。单元测试是确保代码按预期工作并防止在添加新功能或修复错误时意外更改行为的好方法。但是,编写和维护大量测试可能是一项乏味且耗时的任务。为帮助实现这一点,Bosque提供了一个符号测试工具,该工具增强了单元测试,并为导致运行时故障的错误提供了很高的覆盖率--这些错误要么是由于内置语言错误,要么是由于失败的用户提供的Pre/Post/Ininvaria

命名空间NSMain;全局操作:set<;string>;=set<;string>;@{";Negate";,";add";,";sub";};入口点函数processOp(op:string,arg1:int,arg2:int?):int需要释放NSMain::ops->;has(Op);//需要释放(op=";add。{if(op==";否定";){Return-arg1;}Else{assert(arg2!=None);if(op=";add";){return arg1+arg2;}Else{return arg1-arg2;}。

假设此代码位于名为process_op.bsq的文件中,那么我们可以运行以下命令来检查错误:

将报告当op==";Negate";和arg2==NONE时可能出现错误。注意,测试人员知道前置条件REQUIRED_ops.has(Op),因此没有生成任何虚假的失败测试输入(例如op=";";)。

取消注释第二个REQUIES行告诉测试人员API定义排除了此错误和类似的错误,重新运行测试程序现在将报告代码已验证到极限。

注意:我们建议在入口点函数上指定前提条件总是选中的,需要释放的,以确保这些外部公开的API端点不会被误用。

为了提供最佳性能,Bosque支持通过ExeGen工具生成独立的命令行可执行文件。此工具和Bosque运行时的设计旨在提供:

尽可能直接将启动逻辑预编译为常量值,并最大限度地减少开始处理用户输入所需的操作次数,从而加快冷启动响应时间。

随时间和可能的输入保持稳定的执行行为。GC是一种新颖引用计数,具有急切的自由实现,以最大限度地减少内存占用并防止任何不确定的GC抖动。

运行库本身对Set/Map使用排序的容器实现,以便最小化平均和最坏情况下的操作成本之间的差异,并防止病态行为(如极端的散列代码冲突)。

使用[TODO]标志可以进行安全递归。这将递归函数编译成使用常量堆栈空间的CPS形式,消除了任何可能的堆栈外问题,并允许我们在所有调试版本中保留完整的调用堆栈。

一个简单的示例用法是使用以下代码创建名为";max.bsq";的文件:

命名空间NSMain;入口点函数main(x:int,y:int):int{return(x>;y)?X:Y;}。

然后运行以下命令以生成max.exe(在Windows可执行文件上),然后可以使用以下命令调用该文件:

Bosque项目目前的重点是核心语言设计。因此,不支持打包、部署、生命周期管理等。

impl目录包含引用实现解析器、类型检查器、解释器和命令行运行器。在此目录中,使用以下命令构建并测试Bosque参考实现:

注意:Z3定理证明器是通过GIT LFS在repo中作为二进制依赖项提供的。要确保这些都存在,您需要安装git LFS,运行git LFS install来设置所需的钩子,然后拉入。

该存储库为Bosque语言提供基本的Visual Studio代码IDE支持(当前仅限于语法和大括号突出显示)。安装需要手动将完整的Bosque-Language-Tools/文件夹复制到您的用户.vscode/tensions/目录中,然后重新启动VSCode。

此项目已采用Microsoft开放源代码准则。有关更多信息,请参阅行为准则常见问题解答,或联系[email protected]提出任何其他问题或意见。