yueji
v0.11.4
Published
没有虚拟机,不要jit,直接把js编译成机器码,而不是附加一个解释器。
Downloads
6
Readme
月季
没有虚拟机,不要jit,直接把js编译成机器码。当前版本仅支持windows系统x86核心,少量的js语法及简单的dll调用,暂无内置的js对象。
用法
- 全局安装后使用。全局安装的命令为
npm install -g yueji
- 暂不支持没有nodejs的用户使用。
- 由于本编译器生成的机器码与其他中老年语言的机器码的结构都不一样,可能会被Windows Defender误诊为病毒。如果被误诊,将其设置为允许运行即可。
编译代码
yueji 文件名.js
运行生成的文件
文件名.exe
指定生成的文件的版本及版权信息
目前支持修改的字段有 OriginalFilename ProductName LegalCopyright InternalName FileDescription CompanyName ProductVersion
yueji 文件名.js?ProductName=...,CompanyName=...,LegalCopyright=...
嵌入式数据
数据预处理器使用模板串的方法将文本数据转换成对应的二进制数据并嵌入到可执行文件。
HEX
或H
,16进制文本转成二进制数据,中间可以有空格 如:
H`af ca dd aa`
GUID
或G
,GUID格式的字符串转GUID二进制 如:
Guid`23170f69-40c1-278a-1000-000110070000`
BYTE
或B
, 0到255之间的整数数组,用逗号或空格分开。WORD
或W
, 0到65535之间的整数数组,用逗号或空格分开。DWORD
或UINT
或INT
或N
, 四字节整数数组,用逗号或空格分开。UTF16
或L
或U
,使用utf16-le编码的字符串。Brizer
,将贝塞尔曲线的控制点坐标转换为曲线点坐标数组,单精度。real
或decimal
或m
,10进制单精度坐标数组 其中brizer
和decimal
前级可传入变换参数(缩放, x位移, y位移)
或(缩放, x位移, y位移, z位移)
。 如:
M(1,0,0)`2,3,4,235,4,2`;
DATA
或D
,从文件读入数据。 如:
D`./index.html`
特殊语法,区别于js的部分
可用标签指定变量的结构体类型
与typescript
不同的是,标签不放到参数中,而是放在函数体中。
同一个变量可以在不同的地方拥有不同的类型。
指定一个临时的类型,主要是为了方便访问结构体的属性。
// 类似汇编语句 assume b:EFRONT_BUTTON,c:EFRONT_BUTTON,d:EFRONt_BUTTON
// EFRONT_BUTTON是已在.inc或.h文件中定义的结构体
EFRONT_BUTTON: b,c,d;
EFRONT_BUTTON: var b,c,d; // 这种写法会被vscode警告
可以用defer标签延迟执行语句
defer标签类似go语言中的defer指令
defer: CloseHandle(h1),CloseHandle(h2);// 语句延迟
defer: { /* 语句块延迟*/ }
defer: if(/*延时条件*/){} else;
if(/*即时条件*/) defer:{
}
// ...
示例代码
下文中提到的二进制的dll和头文件,现已在开源仓库提供
github地址 https://github.com/yunxu1019/yueji-samples
gitee地址 https://gitee.com/jams/yueji-samples (国内访问较快)
Hello World
import { MessageBoxW } from "user32.dll"
// MessageBoxW的用法参考微软文档
// https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-messageboxw
MessageBoxW(null, "你好月季", "中文原创", 0);
Hello World 2 - 手搓 print
import { GetStdHandle, WriteConsoleW, AttachConsole, AllocConsole, FreeConsole, ExitProcess } from "kernel32.dll";
import "include/windows.inc";
if (!AttachConsole(-1/*parent*/)) AllocConsole();
// 如果前边不想导入耗时的头文件,这里可用-11代替STD_OUTPUT_HANDLE
var output = GetStdHandle(STD_OUTPUT_HANDLE/*-11*/);
function print(a) {
WriteConsoleW(output, a, a.length, 0, 0);
}
print("你好月季,中文原创!")
在windows上实现pwd
import { GetModuleFileNameW, WriteConsoleW, GetStdHandle } from "kernel32.dll";
import { buffer, Utf16, dirname } from "yueji";
import "include/windows.inc";
// 目前支持使用.h和.inc文件中定义的常量和结构体,但有些头文件中的宏可能处理的不到位,会加载失败
var output = GetStdHandle(STD_OUTPUT_HANDLE);
var moduleFileName = buffer(8192);
GetModuleFileNameW(null, moduleFileName, 8192);
moduleFileName = Utf16(moduleFileName);
var folderName = dirname(moduleFileName);
WriteConsoleW(output, folderName, folderName.length, 0, 0);
其他示例
用sdl2演示排序算法
源码链接 https://github.com/yunxu1019/yueji-samples/blob/main/sdl-demo.js
用miniblink加载web应用
源码链接(普通用户) https://github.com/yunxu1019/yueji-samples/blob/main/blink.js 源码链接(vip适用) https://github.com/yunxu1019/yueji-samples/blob/main/blink-vip.js
用windows api创建原生窗口
源码链接 https://github.com/yunxu1019/yueji-samples/blob/main/winup.js
赞助
如果您希望项目快速迭代,请为此项目的开发者注资。
混入我们
QQ群: 710029752