`
yanlijun250
  • 浏览: 783434 次
文章分类
社区版块
存档分类
最新评论

解释型脚本向编译型脚本转化的一个简单转变

 
阅读更多

解释型脚本是大量游戏中需要用到的,用以控制触发器、规则系统和数据系统的一个重要措施。RPG游戏中尤其大量用到了脚本来控制剧情的变化、战场细节等等。即便是在非RPG类游戏中,各种各样的脚本也是被大量运用的。

这里的脚本,并不指代那些"材质脚本""Shader脚本",对我而言,那些不能叫脚本,而只是配置文件,这两个的意义有些不同。脚本是用来执行的,而配置文件则是用来配置、调制的。无论其表现形态如何,是XML?是INI?还是别的,只要是被解释器装载、逐行解释并运行,就是解释型的脚本。

解释型脚本简单易学,耐用。就像名枪AK47,结构简单,经久耐用,高寒、干旱、湿热条件均可应用,每一本编译原理书其实都会花很大的功夫来讲解释原理,正可谓是资源取之不尽用之不竭。我们当时的编译原理课时严重不足,来得及讲完的也不过就是解释原理而已,可惜如何在目标机器上编译出来目标代码、如何把目标代码连接为机器码,都没有学到,惭愧!遗憾!

既然没学过真正的编译原理,因此目前为止所作的也不过就一个很简单的解释器而已。

可惜的事情来了,既然没有学过编译原理,把代码编译为机器代码几乎是不可能的事情,难道写C++或者C的代码,最后交给C++或者C的编译器去编译?虽然这样有先例,但那样也没什么意义,还不如直接硬编码。

后来想想,干嘛把问题考虑得这么复杂,编译,为何要编译?解释器的关键在于逐行解释,每一次运行解释脚本都会重新解释,对于很多游戏来说,这是一个无法容忍的行为。编译的作用就是把脚本代码一次编译为连续的、固定的指令序列的集合,只要脚本没变、以及除开随机数的影响,两次执行同样编译后指令的结果应当是完全相同的。其他还有吗?应该没有了。

其实现在已经有这种编译器,在游戏中也有所应用,Python等脚本语言都提供了编译功能,这种编译其实相对就简单很多。

可以这样理解编译过后的代码:那是一系列指令或者说基本元素的集合,没必要把这些基本元素复杂到细微到Push、Pop、Jump等汇编级别,实际上根据需要,我们可以非常粗略地给出基本元素:按照功能可以把元素划分为行为子和算子,例如GetHP指令获取某物件的HP(如果有),或者MoveTo将某物件设置为MoveTo某位置的状态,最后的算子最为简单而不可或缺,如:与或非、加减乘除、位算符、地址算符、域算符(用于基于对象)等等。这样的一系列代码,对于上层的使用者来说很简单,不必要注意一些不需要注意的细节,同时又能保证扩展性,如果需要新的元素,只需要添加新元素就可以了。就像CISC那样,我不用精简指令,用的就是复杂指令,需要就添加一个复杂指令,效率?要效率的话你就不要玩这个了,去玩机器代码吧,那个效率最高。这本就不准备注意效率,而是去注意开发的效率。在中国,开发了5年的游戏有几个?大部分2、3年就撑不住了,还等你有时间去折磨5年?那只有在特大规模的公司和企业才可能,在中国目前的情况:物力、人力财力是不可能做到的。除了行为子和算子外,更重要的是数据,如何把数据——更多指的是变量——在运行时对应到每个指令上去?这个编译原理的教材中都会提到,我还没有动手,因此就不随便写了,等做完了再写吧。

编译的开始,逐行扫描分析脚本指令,将之打散为基本元素的关系集合。如果脚本是过程性的,那就需要注意出入栈的问题,而如果是基于对象或者面向对象的,目前还没有思考过。最后将所有的基本元素以一种更为精简快速的数据格式存储到某个文件中,作为编译后的目标代码。在执行游戏的时候,我们预先装入这些目标代码,将之转化为用数组或者其他数据结构存储的指令序列。这样就不用解释脚本了,每次运行到目标代码的时候,只需要提供相应的数据,然后调用For循环运行所有的指令就可以了。

我原来用过3DGS,当时听说那个是编译的脚本,刚刚写完解释器的我受触动很大,后来我狠狠查了查3DGS的文件,觉得3DGS好像没有真的把脚本编译为机器码。3DGS的脚本相对是比较RISC的,指令大凡都是简单指令,因此写起来非常难受,比写C还难受。CISC还是RISC是一种具体做法的区别,前者省了脚本编纂者的事情,但是比较费力,不好把握,后者会让脚本编纂者头疼,但是比较好把握,而且挑错比较容易。

粗略写写,请大家帮我看看有没有什么疏漏,期待与您的交流。

分享到:
评论

相关推荐

    MTK系统编译架构,让你理解MTK系统编译脚本结构

    MTK系统编译架构的另一个关键组件是"设备树"(Device Tree),这是一个描述硬件配置的文件集合,用于向内核提供平台相关的详细信息。通过设备树,开发者可以精确控制硬件资源的分配,使得内核能够适配各种不同的...

    VB 实现简单脚本语言编译器及执行器

    在VB(Visual Basic)编程环境中实现一个简单的脚本语言编译器及执行器是一项具有挑战性的任务,它涉及到计算机科学中的编译原理、解析技术、虚拟机设计等多个领域。VB本身是一个面向对象的编程语言,通常用于快速...

    linux-全自动工具链编译脚本

    "Linux-全自动工具链编译脚本"是一个专为此目的设计的工具,它简化了手动编译过程,允许开发者快速构建针对特定环境的工具链,不仅适用于本机系统,通过适当修改也能适应Windows系统。下面我们将深入探讨这个主题。 ...

    Delphi实现脚本引擎

    在"Delphi实现脚本引擎"这一主题中,我们将探讨如何利用Delphi的特性来设计和实现一个自定义的脚本引擎。 首先,我们需要理解脚本引擎的基本工作原理。脚本引擎通常由以下几个关键部分组成: 1. **语法解析器**:...

    powershell脚本转exe文件

    这些工具能够将PowerShell脚本编译为独立的可执行文件,使得用户无需了解PowerShell语法就能运行程序。转换后,EXE文件会包含所有必要的依赖,因此可以在没有PowerShell安装的系统上运行。 以下是转换步骤的一个...

    基于C#实现的一个简单的C#脚本解释器,可以将完整的C#脚本代码运行在控制台

    本文将详细介绍一个基于C#实现的简单C#脚本解释器,以及它如何使开发者能够将完整的C#脚本代码运行在控制台环境。 一、脚本解释器的概念与作用 脚本解释器是一种软件,它可以读取并执行特定语言的脚本代码,而无需...

    C#动态编译,可以编译TXT格式的文件形成C#文件

    下面是一个简单的步骤概述: 1. **读取TXT文件**:使用StreamReader或其他文件读取方法读取TXT文件内容,将其转化为字符串数组,每一项代表一行C#代码。 2. **构建编译参数**:创建CompilerParameters对象,设置...

    linux转化windows文件编码格式脚本

    在使用该脚本时,需要将其保存到一个文件中(例如 `convert_encoding.sh`),然后赋予执行权限 (`chmod +x convert_encoding.sh`),最后执行该脚本,传递要遍历的目录作为参数(例如 `./convert_encoding.sh /path/...

    自动编译脚本编写指南.docx

    下面将详细解释自动编译脚本编写指南的内容。 一、“简单编译”对象 “简单编译”对象是指一些不需要调用编译语言进行编译的源码,例如 Php、Asp、Html 等。对于这些源码文件,可以通过打包压缩的方式进行处理。 ...

    耳机bes-rtx5自动编译脚本:Shell版 - 简化构建流程,增强开发效率

    我们的自动化编译Shell脚本旨在将手动编译过程转化为一键式的操作,为开发团队带来前所未有的便利。手动编译不仅耗时,而且容易出错,尤其是在大型项目中。通过这个脚本,我们希望简化开发流程,让开发者能够更专注...

    3DMAX MAXScript mse文件反编译工具(含中文使用教程)下载

    .mse文件是Maxscript脚本的加密文件,本工具可以实现对.mse文件的反编译,将其转化为.ms...加密使用一个固定的隐藏密钥,该密钥允许它在任何3ds Max系统上运行,但有效地隐藏了脚本的源。加密的脚本文件具有后缀.mse。

    几百行代码实现一个脚本解释器.doc

    本文档将探讨如何利用几百行代码构建一个简单的脚本解释器,涵盖词法分析、语法分析以及基本的语义分析,从而实现一个功能相对完整的“语言”。作者通过这个项目实践,旨在深化对编译原理的理解,并逐步完善这个脚本...

    android反编译脚本(unix like版本)

    这个“android反编译脚本(unix like版本)”正是针对Linux和Mac OS平台设计的工具,它能够帮助用户在这些Unix-like系统上便捷地反编译APK文件,揭示其内部结构和逻辑。 首先,我们要理解反编译的基本概念。反编译...

    很有用的bat脚本知识

    2. **编译脚本**:虽然bat脚本本身并不需要编译,但可以理解为在运行前需要解释器(CMD命令行)将其转化为操作系统可执行的命令。用户可以使用批处理命令如`call`来调用其他脚本,实现类似编译的效果。 3. **脚本...

    编译利器之大型项目如何使用Automake和Autoconf完成编译配置分享.pdf

    编写Makefile.am文件,按照automake规定的规则和项目目录结构,编写一个或多个Makefile.am文件。 ⑺. 调用automake工具,将每个Makefile.am文件转化成Makefile.in文件,同时生成满足GNU编码规范的一系列文件。 ⑻...

    类C语法脚本解释器

    在构建一个类C语法脚本解释器时,我们需要考虑以下几个核心知识点: 1. **词法分析(Lexical Analysis)**:这是解释器的第一个阶段,它将输入的源代码分解成一系列的标记(tokens),这些标记对应于C语言中的...

    在Linux下编译FFmpeg+android ndk成功的脚本及so库

    在Linux环境下编译FFmpeg并集成到Android项目中,通常会借助于Android NDK(Native Development Kit),这是一个让开发者用C/C++编写Android应用原生代码的工具集。 本文将详细介绍如何在Linux系统下使用NDK编译...

    Lua编译成exe的工具

    在描述中提到的“Usage: lua2exe myscript.lua”,这是一个命令行用法的例子,表明lua2exe是一个命令行工具,用户可以通过在终端或命令提示符中输入lua2exe命令,后面跟随他们想要编译的Lua脚本的名称(myscript.lua...

    自动编译脚本编写指南 (2).docx

    自动编译脚本编写指南 自动编译脚本编写指南是指在软件开发过程中,使用脚本语言来自动完成编译工作的指南。该指南旨在帮助配置管理员、项目经理以及需要实施自动编译的相关人员,提高编译效率和质量。 一、“简单...

    超实用win1010个自制bat脚本.zip

    - **系统性能监控**:创建一个脚本来持续监控CPU、内存和硬盘使用情况,找出可能导致性能下降的原因。 - **病毒扫描**:自动化全盘或特定目录的病毒扫描,提高安全性。 4. **其他实用功能**: - **文件备份**:...

Global site tag (gtag.js) - Google Analytics