跳到正文
豫言包管理
← 全部包

豫言操作系统网页编译 0.1.0

豫言 · 库

在浏览器里本地编译一组豫言源文件,进度与结果进入统一事件队列,可停止。

网页编译接口规范 0.1.0

本包让浏览器里的豫言应用在本机编译一组豫言源文件:源文件由应用给出,编译在后台工作线程里由浏览器版豫言编译器(WasmGC+JSPI)完成,输出、诊断和阶段进度作为事件进入统一事件队列(见[网页事件接口规范](../网页事件/规范.汉语.md)),最终结果以“完成”事件报告。用途是云控制台的“本地编译”:源码在云端,编译在用户浏览器,结果与日志回传云端。应用依赖本包后,全部函数都必须实现。

本包只规定编译(源文件 → 编译是否通过、标准输出与标准错误、产物摘要),不规定运行编译产物、也不规定编译器资源的发布方式。

编译客户端

宿主通过一个“编译客户端”模块执行编译,默认从页面基址目录下的 `编译/客户端.mjs` 动态加载(例如页面 /cloud/ 加载 /cloud/编译/客户端.mjs);创建宿主时可用选项 编译客户端 换成别的模块地址或已加载的对象(测试用)。模块须导出两个函数:

  • 浏览器编译(输入, 仅编译, 报告):输入 是 {"files":{路径:内容}};返回 Promise,解析为结果对象 {ok, stdout, stderr, error, phase, artifact:{sha256}};过程中用 报告(事件) 回报 {type:"stage",phase,label}、{type:"output",stream,text}、{type:"diagnostic",text}。
  • 停止编译():终止当前编译(客户端负责让上面的 Promise 以 {ok:false,error:"已停止"} 结束)。

语言仓的 宿主/浏览器/编译器/ 是这两个函数的参考实现(主线程计时器、Worker、90 秒编译时限、5 秒运行时限均由它负责)。

函数

本地编译可用 : 有 → 爻

浏览器同时具备 WebAssembly.promising(JSPI)、Worker、DecompressionStream 时返回阳,否则返回阴。它只查浏览器能力,不检查编译客户端与编译资源是否能加载;加载失败在启动之后以“完成”事件报告。可用来决定界面上是否提供“本地编译”选项。

启动本地编译 : 字符串(文件 JSON) → 整数

参数是 JSON 对象,键是文件路径,值是文件内容(字符串):{"入口。豫":"…","库/甲。豫":"…"}。至多 4096 个文件;路径 1 至 512 个 UTF-16 码元,不含 NUL;内容总量至多 32 MiB(UTF-8 字节)。返回编译号(正整数,实例内递增,不复用),编译在后台进行。同一时刻只允许一个编译:已有编译在运行时抛事故;参数不合规或超限同样抛事故。

停止本地编译 : 有 → 爻

停止正在运行的编译。确有编译在运行时返回阳,随后会投递一个“完成”事件(成 为假,错误 为 已停止);没有编译在运行时返回阴。

事件

类型 编译,订阅号 = 编译号,同一编译的事件保持先后,最后一个总是“完成”。

名称 进度

{"批":[{"类":"阶段","阶段":"load","标签":"正在加载浏览器编译器与标准库"},
       {"类":"输出","流":"stderr","文字":"正在编译:/库/标准库.豫\n"},
       {"类":"诊断","文字":"错误:…"}]}

宿主把 50 毫秒内到达的进度合成一批(1 至 64 项,一批总量至多约 1 MiB,更大的单项自成一批)。类 为 阶段(只带 阶段 与 标签 字段)、输出(只带 流 与 文字,流 为 stdout 或 stderr)、诊断(只带 文字);客户端没给的值为空文字;客户端报告的其他类型被忽略。编译器把正常的编译进度也写到标准错误,应用不能凭 流 为 stderr 判断失败,应看 完成 的 成。进度事件不会丢失:宿主在队列里该编译的进度积压过多时暂缓合批的投递,直到应用取走(编译线程本身不受影响,时限由客户端负责)。

名称 完成

{"成":true,"标准输出":"…","标准错误":"…","错误":"","阶段":"compile","产物摘要":"e3b0…"}

成 为编译是否通过;标准输出、标准错误 是完整输出(宿主不截断,应用上报云端时自行限长);错误 是失败说明(例如 已停止、加载或编译超过九十秒时限、编译客户端不可用:…),成功时为空文字;阶段 是失败发生的阶段(load、compile、run),可为空;产物摘要 是编译产物的 SHA-256 十六进制,没有产物为空文字。“完成”之前,该编译所有已收到的进度先投递完。

限额与失败分类

| 项 | 限额 | | --- | --- | | 同时运行的编译 | 1 | | 文件数 | 4096 | | 路径 | 512 个 UTF-16 码元 | | 内容总量 | 32 MiB(UTF-8) | | 一批进度 | 64 项且约 1 MiB |

违规调用(文件 JSON 不合规、超限、已有编译在运行、宿主已关闭)抛豫言事故;编译失败、超时、客户端加载失败都通过“完成”事件(成 为假)报告,不抛事故。浏览器不具备所需能力时,启动本地编译 仍可调用,随即以 完成(成 为假,错误 说明缺少的能力)结束。

一致性样例

  1. 对一个简单源文件 启动本地编译:依次收到若干 进度 事件(含 阶段 项)和一个 完成,成 为真,产物摘要 是 64 位十六进制文字。
  2. 源文件含语法错误:完成 的 成 为假,标准错误 或 错误 含诊断,进度 里出现 诊断 项或标准错误输出。
  3. 编译中途 停止本地编译:返回阳;收到 完成,成 为假,错误 为 已停止;随后可以再 启动本地编译。
  4. 编译在运行时再次 启动本地编译:抛事故。
  5. 编译客户端模块不存在:启动本地编译 返回编译号,随后 完成 的 成 为假,错误 以 编译客户端不可用 开头。
  6. 客户端报告 100 条输出:应用收到的所有 进度 批里按顺序恰好 100 条 输出 项。

边界

本包不规定:运行编译产物、增量编译与缓存、编译器资源(编译器 Wasm、标准库资料、Binaryen)的发布与版本核对、多编译并行、仅编译 以外的模式、把产物写入文件。

依赖

查看包配置

上传历史

当前上传修订:1 ·

  1. 上传修订 1
    下载 ZIP

包层级

父包:豫言操作系统接口

没有子包。