0.11.4 • Published 1 year ago

yueji v0.11.4

Weekly downloads
-
License
ISC
Repository
-
Last release
1 year ago

月季

没有虚拟机,不要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=...

嵌入式数据

数据预处理器使用模板串的方法将文本数据转换成对应的二进制数据并嵌入到可执行文件。

  • HEXH,16进制文本转成二进制数据,中间可以有空格 如:
H`af ca dd aa`
  • GUIDG,GUID格式的字符串转GUID二进制 如:
Guid`23170f69-40c1-278a-1000-000110070000`
  • BYTEB, 0到255之间的整数数组,用逗号或空格分开。
  • WORDW, 0到65535之间的整数数组,用逗号或空格分开。
  • DWORDUINTINTN, 四字节整数数组,用逗号或空格分开。
  • UTF16LU,使用utf16-le编码的字符串。
  • Brizer,将贝塞尔曲线的控制点坐标转换为曲线点坐标数组,单精度。
  • realdecimalm,10进制单精度坐标数组 其中brizerdecimal前级可传入变换参数(缩放, x位移, y位移)(缩放, x位移, y位移, z位移)。 如:
M(1,0,0)`2,3,4,235,4,2`;
  • DATAD,从文件读入数据。 如:
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和头文件,现已在开源仓库提供

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演示排序算法

npm.io 源码链接 https://github.com/yunxu1019/yueji-samples/blob/main/sdl-demo.js

用miniblink加载web应用

npm.io 源码链接(普通用户) https://github.com/yunxu1019/yueji-samples/blob/main/blink.js 源码链接(vip适用) https://github.com/yunxu1019/yueji-samples/blob/main/blink-vip.js

用windows api创建原生窗口

npm.io 源码链接 https://github.com/yunxu1019/yueji-samples/blob/main/winup.js

赞助

如果您希望项目快速迭代,请为此项目的开发者注资。 npm.io

混入我们

QQ群: 710029752

0.11.4

1 year ago

0.11.3

1 year ago

0.11.0

1 year ago

0.11.1

1 year ago

0.11.2

1 year ago

0.10.1

2 years ago

0.10.0

2 years ago

0.9.3

2 years ago

0.9.0

2 years ago

0.9.2

2 years ago

0.9.1

2 years ago

0.8.2

2 years ago

0.8.1

2 years ago

0.7.2

2 years ago

0.8.0

2 years ago

0.7.1

2 years ago

0.6.2

2 years ago

0.7.3

2 years ago

0.5.0

2 years ago

0.4.1

2 years ago

0.3.2

2 years ago

0.4.0

2 years ago

0.7.0

2 years ago

0.6.1

2 years ago

0.6.0

2 years ago

0.3.1

2 years ago

0.3.0

2 years ago

0.2.2

2 years ago

0.2.1

2 years ago

0.2.0

2 years ago

0.1.2

2 years ago

0.1.1

2 years ago

0.1.0

2 years ago