直至正文
豫言包府
← 众包

豫言操作系统编译运行 0.1.0

豫言 · 库

在宿主的隔离编译环境里把多文件豫言项目编译为 WasmGC 程序:拉取式逐个取回阶段提示与编译器输出,再取产物字节或 Base64。

编译运行公约 0.1.0

此包使客于宿主之隔绝编室,编多文之豫言项目为 WasmGC 程序,并于编时逐一取其阶段之告与编器之出。此乃“云端编译之务”之核:请求之验、限额、应答之形与流式之报,皆客以豫言决之;宿主惟司一事,曰“行豫言之编器”——内存文件系、标准库之资、编器 Wasm 与 Binaryen 之组装。所成之物乃文件式 WasmGC 程序,可径授[隔离运行公约](../隔离运行/规范.文言.md)运之:本包 读取编译产物Base64 所返,正其程序之参。此乃云工专用之能:宿主以外壳于进程中固定之编资运编器,客之许须授一 COMPILE 绑定之名。

运之制

拉取之式。一运之始终:启动编译运行 得运行号 → 循环 读取编译运行事件 阻候下一事,至得终止之事 → 按需 读取编译产物 或 读取编译产物Base64 → 结束编译运行 释之。运行号乃宿主所生、不可猜之字符串,客不得自造。运行号惟启之之事有效:别事所得之号(纵字同)一律使调用抛可捕之豫言异,不误操他事之运(同网页事件流之流柄;亦以 Worker 之类宿主不许一事之异步工作续于他事也)。故一编之启、读事、取产物与终,须皆在同一事内。事依发生之序而出;宿主可边编边出,亦可编毕一并出,公约不承诺出之时,客不得恃“先见过程之事、后见编毕”之序。

术

启动编译运行 编译器名 请求,返运行号。

| 参 | 义 | | --- | --- | | 编译器名 | 客之许 COMPILE 列中所授之绑定名,一至一百二十八字节,不含控制之字;未授或绑定不存则本事失败 | | 请求 | JSON 文,至多二百零九万七千一百五十二字节:{"files":{"路径":"文",…},"entry":"路径"},余字段不问 |

请求之则:files 乃路径至文之对象,含一至二百五十六件,值皆字符串,诸内容合至多二十六万二千一百四十四 UTF-8 字节;每路径至多二百五十六 UTF-16 码元,不含反斜线与 U+0000 至 U+001F 之控制字,不以 / 起,依 / 分段后每段非空且非 .、..。entry 缺或为 null 则取 入口。豫,须为合规之路径而在 files 中。违一则,或未终之运已有八(宿主忙),皆抛可捕之豫言异,辞为中文而明其故,不生运;绑定未授则使本事失败。成则即返,编于宿主中行。

读取编译运行事件 编译器名 运行号 等待毫秒,返(状态,事 JSON 文)。

  • 阻候此运之下一事。等待毫秒须在一至六万,越则抛异。
  • 状态 0:得一事,文为其 JSON(每事乃一 JSON 对象,见下节)。
  • 状态 1:等待毫秒已满而无新事,运仍行,事文为空。客可因而写心跳、察己之限或续候。
  • 状态 2:运已终而诸事已尽(终止之事已于前某次以状态零交付),或读者候时运被 结束编译运行 所终;事文为空。
  • 同一运同一时至多一候者;运行号无效(空、过长、含控制字)、不属当前事、未知或已结束,抛可捕之豫言异。

读取编译产物 编译器名 运行号,返字节串:编成(终止之事乃带 artifact 之 finished)之 WasmGC 程序原字节,至多八百三十八万八千六百零八字节,可含零字节。运未终、编败、宿主故或运已结束,抛可捕之豫言异。读取编译产物Base64 返同一产物之 Base64 文(标准字母表,带 = 之填充,无换行),前提与败同上。二术于 结束编译运行 之前可重复用,其果同。

结束编译运行 编译器名 运行号 终运而释宿主之资(事之队、产物之字节),返单位值。幂等:运行号未知或已结束不为错。未始编之运不复编;已在编之运不可断,宿主弃其后果。既结束,再以此号读事或产物则抛可捕之豫言异;正候事之读者立得状态二。运行号不属当前事者亦抛异(幂等惟对本事内已结束或未知之号)。客当于一切路径(含出错)终己所启之运,否则运留于宿主至五分钟存活之期满而为宿主所收;事异退所遗之运,既不永占并发之额(并发之额惟计未终之运),亦不无限而积(见限额)。

事

事文乃一 JSON 对象,以 type 别其类。宿主可增新之过程事类,客遇不识之类当置之而不为错。

| type | 字段 | 义 | | --- | --- | --- | | stage | label:中文阶段之告;可带 phase(compile) | 编所至之阶,依所实行之步而发。至少有“正在加载标准库与项目文件”“正在执行豫言编译器”,其后编器组装 Wasm 时又有“正在组装 Wasm(N 字符)” | | output | phase(compile)、stream(stdout 或 stderr)、text | 编器所写出之一段,原样,不截,不并行 | | diagnostic | text | 编器异终时之诊(最近所读之文件与错误之栈),惟败时有之 | | finished | result:{"ok":爻,"stdout":文,"stderr":文,"exitCode":整数,"error"?:文};artifact(惟成时):{"format":"wasmgc","bytes":整数,"sha256":六十四位小写十六进制} | 终止之事:编器已行毕。ok 为真,当且仅当退出码为零;stdout、stderr 乃诸出之全,等于依序拼诸同名 output 事之 text。编败(语法误、类型误、出逾限、逾时)乃 finished 而 ok 为假,无 artifact,error 与 stderr 明其故 | | failed | error:中文之因 | 终止之事:宿主之故,编器未给其果(标准库之资不可用、文件系逾限、产物逾八 MiB 等) |

每运恰有一终止之事,恒为最后一事。artifact.sha256 乃产物字节之 SHA-256;bytes 乃其字节数。

编室

  • 标准之境:每运皆于全新之内存文件系中行,预置宿主固定版之标准库资;包上下文由宿主固定:包 豫言/标准库,及所有者 访客、名 云项目、依 标准库 之项目包。项目之文置于项目包之目录(宿主内部之径 /用户程序/)下,entry 相对之;项目若含 云项目。包。豫 则用之,否则宿主置一空描述。编之目标固定为 WasmGC。客不得择编器之版、目标、包上下文或标准库。
  • 无外能:编时无网、无原生进程、无环境变量、无宿主之文件;运与运之间不遗任何用户之文与产物,任一运亦读不到前运所写。
  • 限额:编器之出(stdout 与 stderr 合)至多二百零九万七千一百五十二字节,逾则编败;一编之墙钟期限由宿主定(云工宿主为九十秒,编器调宿主原语时察之);产物至多八百三十八万八千六百零八字节;事文合至多一千六百七十七万七千二百一十六字节(逾者过程之事为宿主所弃,终止之事不弃)。同一宿主进程中未终(候或编中)之运至多八,逾则 启动编译运行 抛异;既终而待读之运另留至多三十二,逾则弃其最旧;诸运自创至多存活五分钟。编阶段串行(同一时唯一份编文件系副本),后者先候。
  • 同版之编器与标准库,于同一项目,ok、exitCode 与产物字节当同;编器之志行带墙钟之时戳,故 stderr 之文不可逐字节而较。

败之分

  • 违规(可捕之豫言异):请求不合规、逾限、并运过多、编译器名不合规、等待毫秒越界、运行号无效或不属当前事、运行号未知或已结束、同一运已有候者、产物不可用。异之辞为中文,明其故。
  • 绑定未授或不存:使本事失败(宿主之误,客不可捕),与他云工公约同;此乃部署配置之事,非运时之业务情形。
  • 编败:乃返值(finished 而 ok 为假),非异。
  • 宿主之故:乃 failed 之事,非异。

一致之例

  1. 入口 寻观「标准库」之书。寻观「云项目」之「问候」之书。「打印行」于「问候」。、问候。豫(以『你好,多文件』为 问候)与 云项目。包。豫 三文:事序以 stage(正在加载标准库与项目文件)、stage(正在执行豫言编译器)始,若干 output 之后恰有一 finished(ok 为真、exitCode 为零)与 artifact;再读事得状态二;读取编译产物 之字节以 Wasm 魔数始而长等于 artifact.bytes,SHA-256 等于 artifact.sha256;读取编译产物Base64 解码后与字节同;stdout、stderr 等于对应 output 之 text 依序所拼。
  2. 入口之文为 此语不成立。:finished、ok 为假、无 artifact;读取编译产物 抛异;stderr 或 error 言及入口之文。
  3. 请求 {"files":{"../逃逸。豫":""}}、{"files":{}}、{"files":{"入口。豫":1}}、入口之文二十六万二千一百四十五字节、文名含反斜线或以 / 起、entry 不在 files 中:启动编译运行 皆抛异,宿主中不生运。
  4. 先后启两运而其文不同:各自之产物与事不相扰;后者读不到前者所写之任何文(同一径之次项目不见前项目之他文)。
  5. 事尽后再读:状态二;结束编译运行 后再读事、再读产物:抛异;重复结束:不为错。
  6. 阻候时别有并发之读者:抛异,不扰原候者;等待毫秒为零或六万零一:抛异。
  7. 于他事中用启之之事所返之运行号(读事、取产物、终):抛异,原事中之运不受扰。

界

此包惟司编:不运产物(用隔离运行公约)、不解不托 HTTP、不存任何状、不供网、不解包(惟标准库与项目自己之文)、不对外承诺编译之缓存。宿主可以异术实现(云工以 Worker 内之 WasmGC 编器与静态 Binaryen,他宿主可用进程沙箱或容器),惟须合上述之境、限与事之义。COMPILE 乃云工许可之种名;他宿主各以其授权之法,公约惟求“编译器名由客给,由宿主核”。

所赖

观包之制

上传之记

今修订:1 ·

  1. 修订 1
    取 ZIP

包之层级

父:豫言操作系统接口

无子包。