Skip to content

一个小巧精炼的跨平台开发引擎

License

Notifications You must be signed in to change notification settings

liyipengwps/Boymue

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Boymue

引擎原则

1. 本引擎目的仅用于学习C++,Rust及V8, skia,以及渲染引擎所用

主要目的

1. 深入探索V8引擎以及Skia 2d绘制引擎原理
2. 自渲染跨端应用开发引擎的深入探索与实验
3. 主要使用C++17来进行调研,开发平台目前仅限于android,windows以及IOS
4. 网络请求等具体功能将采用rust实现,减少跨平台代码编写带来的成本

相关编译事项

1. C++17不支持异常处理,需要添加-Wno-dynamic-exception-spec进行忽略异常处理,IOS中在Other Warning Flags中添加
2. 鉴于目前ios将opengles2标注为过期,使用GLES_SILENCE_DEPRECATION来忽略代码中的警告
3. Windows与Android上将使用V8 JS引擎,IOS上由于不能开启JIT,所以采用包更小的QuickJS
4. ios framework中创建bundle,直接使用target创建
5. ios copy file中需要将framework的destination从File改为frameworks
6. rustup安装完后,需要执行rustup toolchain install stable
7. Android下可以执行./gradlew assembleDebug --rerun-tasks

相关知识点

QuickJS

1. 执行入口,JS_Eval实际上是使用了__JS_EvalInternal函数进行调用
2. 字符串管理,JSAtom管理字符串,如关键字,标识符,常量字符串
3. 解释执行入口,JS_CallInternal,执行字节码,具体逻辑:
   1)创建local_buf,容量包含函数参数个数arg_count,var_count,以及栈大小stack_size,采用alloca申请栈内存
      函数结束后会自动释放
   2)字节码定义,字节码存储在opcode_info数组中
4. 微任务
   1)promise调用异步函数执行完后,会调用js_promise_resolve_function_call
      将微任务加入队列,例如JS_EnqueueJob(ctx, promise_reaction_job, 5, args)
   2)当前宏任务业务执行完毕后,会逐个处理队列中的微任务
   3)函数执行过程中如果是异步函数,实际状态会存储在JSAsyncFunctionState的JSStackFrame中,而不是函数本地的JSStackFrame,
   4)如果promise是JS_PROMISE_PENDING状态,则JSAsyncFunctionState所携带的状态将会被加入到链表,具体逻辑在perform_promise_then中实现
   5)微任务队列只会存在已经完成和拒绝完成的任务
   6)await操作会中断程序,并将当前执行的sp和pc保存到JSObject的JSAsyncFunctionState结构中
   7)async function默认会返回一个promise,这个处理部分在qjs中也有体现,具体实现在js_async_function_call函数中,
      ```
      static JSValue js_async_function_call(JSContext *ctx, JSValueConst func_obj,
                                      JSValueConst this_obj,
                                      int argc, JSValueConst *argv, int flags) 
      {
         ...
         promise = JS_NewPromiseCapability(ctx, s->resolving_funcs);
         ...
         return promise;
      }
      
      ```
5,函数
   1)JSFunctionDef,函数定义
   2)func_kind,表示函数类型, 包含JS_FUNC_NORMAL,JS_FUNC_ASYNC等类型
   3)异步函数与同步函数的区别,同步函数的栈帧是局部变量JSStackFrame sf_s, 而异步函数对象则会自带栈帧,例如
      JSAsyncFunctionState *s = JS_VALUE_GET_PTR(func_obj);
      sf = &s->frame;
      栈帧存储在JSAsyncFunctionState结构中  

V8

1. V8字节码生成
   1)BytecodeGenerator字节码生成器
      a)MakeBytecode为语法树生成字节码
      b)ConstantArrayBuilder常量表的构建
   2)V8引擎解释器中每个字节码对应一个handler
      a)handler是字节码处理器
      b)handler存储在解释器的dispatch_table_表中 
      c)V8引擎没有虚拟执行环境,每个字节码的操作都会被翻译成抽象汇编存储在handler调用中,
         最终执行都会使用TurboFan编译器翻译成机器码
      d)新版V8引擎的handler实现是包裹在IGNITION_HANDLER宏中进行实现,而此版本是直接代码实现
2. V8字节码执行
   1)入口,Execution::Call
   2)运行时任务主要集中在V8的runtime模块
   3)解释执行,Runtime_InterpreterNewClosure
   4)RUNTIME_FUNCTION宏
      a)会生成一个__RT_impl_开头的静态方法
3. V8宏开关
   1)flags,flag开关在flag-definitions.h中进行声明, 例如如果需要开启ignition解释器  
   2)async, await开关修改FLAG_STAGED_FEATURES为true

Donate

打赏辛苦费

image image

About

一个小巧精炼的跨平台开发引擎

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 59.9%
  • Python 16.8%
  • Kotlin 5.5%
  • Objective-C++ 5.2%
  • Objective-C 3.5%
  • C 3.1%
  • Other 6.0%