当前位置: 首页 > news >正文

AngelScript -- C++程序最好的脚本语言

官网:AngelCode.com - game development and more...

最新版2.35.1 编译需要vs2019以上。

尝试用了vs2022编译了一个,0 error 0 warning,太TM的丝滑了。

各方评价:

游戏编程领域中有哪些鲜为人知的脚本语言,且为什么它们没有像lua一样普及? - 大钊的回答 - 知乎 https://www.zhihu.com/question/34605919/answer/102827708

AngelScript是我用过对C++最友好的脚本语言,其语法也尽量贴合C++,面向对象,强类型,传引用,any,map等等C++里你熟悉的东西。可惜的是国内基本很少有人知道这个脚本语言,当初最早发现它的时候也是机缘巧合,当时游戏开发要使用脚本做战斗系统,那时2dx的lua还处于萌芽,而且当时我也还不会Lua,反正都是从头用起,就想想看去找找国外的游戏圈子使用的脚本语言都有哪几种,对比一番后,就一见倾心AngelScript了。因为跟C++贴得那么近的缘故,实际游戏开发使用过程中间的绑定和调用也是异常的舒畅。当时我还把AngelScript给整到C++服务器端也跑了起来,客户端服务器一部分逻辑代码共用。

像Lua之面向C,用原始API,注册一个复杂点的函数到C中,得写得手抽筋,所以就有各种各样的Lua绑定库。而AngelScript的官方API只需要一行。可以看出作者是很用心在为C++服务。

Game脚本语言比较 - ROTC - 博客园 

 Pawn在这群语言中是个古怪的家伙, 我从它开始介绍
    Pawn 小, 而且简单, 它使用C风格的语法, 而且只有一种数据结构, 叫做cell. 一个cell通常是一个integer, 但是它经过处理后也可以表示character, boolean, float. Pawn不支持struct 和class, 但是使用数组的"named position"来模拟struct.
    在这篇文章中提到的所有语言中, Pawn是唯一一个将编译器和虚拟机完全分离的脚本. 当然, 它在编译期提供更多的检查. 所有的变量必须声明, 所有的本地函数必须前向声明. 这很好, 因为这些检查是在compile-time进行的, 避免了在run-time时对本地函数参数的检查. 我发现编译器也给出了考虑周到的警告信息, 比如它会警告你使用了不正确的缩进, 这样可以帮助你维持一致的编程风格, 防止意外错误. 对于它, 我唯一抱怨的地方就是, 在使用float类型常量的时候, 你必须写成0.5形式, 而不能是.5这个被认为是语法错误.
    Pawn有完整的文档和广泛的应用, 以及一个不太活跃的论坛. Pawn是我见过的最快的轻量级脚本语言. 我在游戏中使用Pawn来进行低级脚本编程, 包括角色和对象的动画.

    Lua拥有自己独特的语法, 有点像Basic. 它也很快, 编译出的byte-code相当小. Lua是动态语言, 变量在使用之前不需要声明, 而且function作为first-class值(这意味着它的编译器和抽象机制是紧密结合在一起的, function可以保存在一个变量中). Lua中的table被广泛应用, 它是Lua中唯一的复杂数据类型. 一个table中可以部分存储function, 另一部分存储data, 这样就可以用来模仿class, object.
    Lua广泛的应用在工业中, 它拥有一个活跃的在线社区和一个巨大的开源组件基地. Lua是本文提及的所有脚本语言中最早产生的, 而且深深地影响着本文中的其他语言, 我发现熟悉Lua的用法之前(这需要大量的联系), lua API document是个难以理解的东西. Lua也有一本书可以用来学习—Programming in Lua, 这本书覆盖了这本语言方方面面的细节.

    GameMonkey借鉴了很多Lua中的概念, 不同的是它采用C风格脚本. 它使得table变的非常强大, 可以像Lua那样用来模拟object. 它提供有限状态机机制, 变量使用前不需要声明, function也是作为first-class.
    GameMonkey的速度和byte-code的小巧着实让我惊讶(我的意思是它是至精至简的). GM的API参考文档相当的匮乏. 源代码是使用Doxygen结构注释的, 所以可以使用Doxygen来生产帮助文档(我并没有发现生成好的online帮助文档). 它有一个远程脚本调试器. 我只是短暂的玩了一下这个调试器, 但是还是发现它是相当简洁的.
    看不到有关于GameMonkey的天花乱坠的宣传, 但是它有一个活跃的论坛. 几个社区成员在背后推进着GameMonkey的发展, 主要是提供各种bindings, 以及更好的调试器等.

    Squirrel是一个高级动态类型, 面向对象的语言, 提供了类和继承, 使用C风格. 同样, 它借鉴了Lua中的table. 它很容易编译, 而且看起来有高水平的文档.
    尽管Squirrel是一门年轻的语言, 但是它以及被用在了一些商业程序中, 它有一个活跃的论坛.

    AngelScript是一门静态类型语言, C++风格. AngelScript拥有最好的原生支持bindings. 通常, 一个函数或者是类只需要注册到AS的虚拟机中, 就可以在AS脚本中使用了. 本文中的其他脚本语言都需要中间插件帮助才能实现函数的binding. 当然, 如果本地函数没有先注册的话, AS脚本也是编不过的. 这给那些想要预编译AS byte-code的人增加了一个额外步骤.
    AngelScript不支持table, 事实上这一点不会造成麻烦, 因为AS是静态类型脚本.
    AS拥有一个活跃的在线论坛, 漂亮的文档, 而且保持持续的更新.

    TinyScheme有被拿来讨论的价值. 它包含在一个C的源文件中. 不像本文中提到的其他脚本语言, 它是解释性的, 所以它的速度很慢, 当然, 如果速度问题对你没有太大影响, 而且你刚好想将Scheme加入到你的项目中去, 我强烈推荐TinyScheme.
    我考验过很多其他的Scheme, 但是都碰到了严重的编译问题. TinyScheme很容易编译, 而且它有很多选项可以供你hack.

 

[翻译]AngelScript 实用手册之概述 - 聚星亭 - C++博客 

  AngelScript 是当作一个引擎而构建的,当应用程序需要注册函数、属性(properties)和任意数据类型的时候,这个脚本可能会派上用场(原文: AngelScript is structured around an engine where the application should register the functions, properties, and even types, that the scripts will be able to use.)。本脚本库依赖于应用程序,它会被编译到应用程序的一个或多个模块之中(原文: The scripts are then compiled into modules, where the application may have one or more modules, depending on the need of the application.)。应用程序也可以通过各式各样的接口来使用configuration集合的每一个模块(原文:The application can also expose a different interface to each module through the use of configuration groups)。当应用程序需要一个多类型的脚本时,例如图形用户界面,人工智能控制等等本脚本库就显得特别有用了(原文: This is especially useful when the application works with multiple types of scripts, e.g. GUI, AI control, etc.)。

       脚本的函数、全局变量和类,每个模块都有它自己的作用域范围(原文: Each module has it's own scope of script functions, global variables, and classes)。即使各个模块可能组建于同一个脚本源码,它们之间通常也不会共享(原文: These are normally not shared between modules, even though multiple modules may be built from the same source scripts)。不过模块可以通过绑定函数来相互配合相互影响(原文: However modules may interact with each others through function binding.)。

       作为一个脚本,被编译成 字节码 AngelScript同样也提供了一个虚拟机来作为执行这些字节码的脚本环境,AngelScript同样也提供了一个虚拟机来解析脚本的上下文,来将脚本编译成字节码并执行。(原文:As the scripts are compiled into bytecode AngelScript also provides a virtual machine, also known as a script context, for executing the bytecode)。尽管大多数应用程序可能仅需要一个脚本环境,但是应用程序可以在同一时间获取许多脚本上下文(原文:The application can have any number of script context at the same time, though most applications will probably only need one.)。

       这个环境支持可执行体的挂起和恢复,因此,这个应用程序可以很容易的执行就好像同时执行脚本和普通程序一样(原文:The contexts support suspending the execution and then resuming it, so the application can easily implement features such as concurrent scripts and co-routines.)。脚本环境为了获取运行时信息业提供了一个接口,这对调试脚本非常有用(原文:The script context also provides an interface for extracting run-time information, useful for debugging scripts.)。

       AngelScript的脚本语言是在众所周知的C + +语法之上增加像Java, C#和D等更现代语言的语法(原文:The script language is based on the well known syntax of C++ and more modern languages such as Java, C#, and D.)。任何人只要了解一些别的语言,或者其他有着类似语法的脚本语言,像Javascript和ActionScript,再用AngelScript会有一种一见如故的感觉(Anyone with some knowledge of those languages, or other script languages with similar syntax, such as Javascript and ActionScript, should feel right at home with AngelScript.)。

跟许多的脚本语言相反,AngelScript是一个强类型的语言,它允许更快更稳定的执行代码与宿主应用程序之间的交互会减少有类型值所需要的运行时间(原文:Contrary to most script languages, AngelScript is a strongly typed language, which permits faster execution of the code and smoother interaction with the host application as there will be less need for runtime evaluation of the true type of values.)。

        

       AngelScript的内存管理是基于一个用于检测和释放的循环引用对象来增加垃圾回收的引用计数(原文:The memory management in AngelScript is based on reference counting with an incremental garbage collector for detecting and freeing objects with circular references)。这就提供了一个可控环境,除非应用程序冻结垃圾回收机制来申请内存(原文:This provides for a controlled environment without application freezes as the garbage collector steps in to free up memory.)。

这个脚本最大的优势就是跟c++ 结合的很好,c++对象,函数导出到脚本中很方便。

相关文章:

  • 如何编写整洁的代码
  • leetcode: 122. 买卖股票的最佳时机II
  • 字符串习题总结3
  • Java 操作RestHighLevelClient查询详解
  • 有效 TCP RST
  • 46.全排列 | 51.N皇后
  • 正则表达式的说明》
  • 【Vue】基础系列(三三)指令语法-事件及其修饰符,动态样式,v-model的用法,数据持久化存在本地localStorage,自定义指令
  • 3D感知技术(3)相机成像模型及相机标定
  • ThinkPHP 接口开发过程
  • Pytorch常用的4种随机数生成方法
  • java毕业设计闲一品交易平台mybatis+源码+调试部署+系统+数据库+lw
  • java计算机毕业设计汽车销售系统源码+数据库+系统+lw文档+mybatis+运行部署
  • GNS3 vm 添加 H3C VSR1000 镜像、导入初始配置
  • docker镜像学习
  • Codepen 每日精选(2018-3-25)
  • CSS3 变换
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Java IO学习笔记一
  • log4j2输出到kafka
  • PhantomJS 安装
  • Unix命令
  • 盘点那些不知名却常用的 Git 操作
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • FaaS 的简单实践
  • ​Python 3 新特性:类型注解
  • #include到底该写在哪
  • (4)事件处理——(7)简单事件(Simple events)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (黑马C++)L06 重载与继承
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET 5种线程安全集合
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • 。Net下Windows服务程序开发疑惑
  • ::
  • @property @synthesize @dynamic 及相关属性作用探究
  • @RequestMapping 的作用是什么?
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [android] 请求码和结果码的作用
  • [Angular 基础] - 表单:响应式表单
  • [C#] 如何调用Python脚本程序
  • [C#7] 1.Tuples(元组)
  • [CLR via C#]11. 事件
  • [hibernate]基本值类型映射之日期类型
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
  • [HXPCTF 2021]includer‘s revenge
  • [Java] 什么是IoC?什么是DI?它们的区别是什么?
  • [jobdu]不用加减乘除做加法