提交 37c92017 编写于 作者: 3 3dgen

Merge branch 'master' of https://gitee.com/wa-lang/wa

......@@ -39,7 +39,7 @@
2. `wa init -name=_examples/hi`
3. `wa run _examples/hi`
> 项目尚处于原型开源阶段,如果有共建和PR需求请参考 [如何贡献代码](https://wa-lang.org/community/contribute.html)。
> 项目尚处于原型开源阶段,如果有共建和PR需求请参考 [如何贡献代码](https://wa-lang.org/community/contribute.html)。我们不再接受针对第三方依赖库修改的 PR。
## 例子: 凹语言
......
<div align="center">
<h1>🇨🇳 The Wa Programming Language</h1>
[Document](https://wa-lang.org) | [Playground](https://wa-lang.org/playground) | [Goals](https://wa-lang.org/goals.html) | [Roadmap](https://wa-lang.org/smalltalk/st0002.html) | [Community](https://wa-lang.org/community) | [Changelog](https://wa-lang.org/changelog.html) | [Discussions](https://github.com/wa-lang/wa/discussions)
<h1>The Wa Programming Language</h1>
</div>
<div align="center">
......@@ -21,7 +18,7 @@ Instead of requiring complex toolchains to set up, you can simply go install it
![](docs/images/logo/logo-animate1.svg)
- Homepage: [https://wa-lang.org](https://wa-lang.org)
- Playground: [https://wa-lang.org/playground](https://wa-lang.org/playground)
- Core Team: [柴树杉(chai2010)](https://github.com/chai2010)[丁尔男(Ending)](https://github.com/3dgen)[史斌(Benshi)](https://github.com/benshi001)[扈梦明(xxxDeveloper)](https://github.com/xxxDeveloper)[刘云峰(leaftree)](https://github.com/leaftree)[宋汝阳(ShiinaOrez)](https://github.com/ShiinaOrez)
> Note: Our canonical Git repository is located at https://gitee.com/wa-lang/wa. There is a mirror of the repository at https://github.com/wa-lang/wa. Unless otherwise noted, the Wa source files are distributed under the AGPL-v3 license found in the LICENSE file.
......@@ -39,7 +36,7 @@ Instead of requiring complex toolchains to set up, you can simply go install it
2. `wa init -name=_examples/hi`
3. `wa run _examples/hi`
> The Wa project is still in very early stage. If you want to submit PR, please read the [Contribution Guide(Chinese)](https://wa-lang.org/community/contribute.html).
> The Wa project is still in very early stage. If you want to submit PR, please read the [Contribution Guide(Chinese)](https://wa-lang.org/community/contribute.html). We do not accept PR only about 3rdparty changes.
## Example: Print Wa
......
/*
* Wasm3 - high performance WebAssembly interpreter written in C.
* Copyright © 2020 Volodymyr Shymanskyy, Steven Massey.
* All rights reserved.
*/
// 版权 @2022 凹语言 作者。保留所有权利。
// Wa/Arduino 源代码位置
// https://gitee.com/wa-lang/wa/tree/master/_examples/arduino
// 导入 Wasm3 头文件
//
// Wasm3 是 Volodymyr Shymanskyy, Steven Massey 开发的 WebAssembly 解释器,
// 可以在 Arduino Nano 33 平台执行 wasm 程序.
#include <wasm3.h>
#include <m3_env.h>
/*
* Configuration
*/
// Redefine the default LED pin here, if needed
#ifndef LED_PIN
#define LED_PIN LED_BUILTIN
#endif
#define WASM_STACK_SLOTS 1024
#define NATIVE_STACK_SIZE (32*1024)
// 定义 WASM 和 本地栈大小
#define WASM_STACK_SLOTS 1024
#define NATIVE_STACK_SIZE (32*1024)
// For (most) devices that cannot allocate a 64KiB wasm page
#define WASM_MEMORY_LIMIT 8096
// WASM 最大内存限制, 一般不得超过 64KB 大小
#define WASM_MEMORY_LIMIT 8096
// Wa/Arduino
// https://gitee.com/wa-lang/wa/tree/master/_examples/arduino
// 导入 凹语言 生成的 WASM 文件对应的二进制头文件
#include "app.wasm.h"
/*
* API bindings
*
* Note: each RawFunction should complete with one of these calls:
* m3ApiReturn(val) - Returns a value
* m3ApiSuccess() - Returns void (and no traps)
* m3ApiTrap(trap) - Returns a trap
*/
m3ApiRawFunction(m3_arduino_millis)
{
m3ApiReturnType (uint32_t)
m3ApiReturn(millis());
// m3ApiRawFunction 宏用于 Arduino 宿主 API 函数绑定
//
// 每个函数必须通过以下 3 种方式之一返回:
// m3ApiReturn(val) - 返回一个值
// m3ApiSuccess() - 返回, void
// m3ApiTrap(trap) - 返回, 异常
// fn arduino.millis() => u32
m3ApiRawFunction(m3_arduino_millis) {
m3ApiReturnType(uint32_t)
m3ApiReturn(millis());
}
m3ApiRawFunction(m3_arduino_delay)
{
m3ApiGetArg (uint32_t, ms)
// You can also trace API calls
//Serial.print("api: delay "); Serial.println(ms);
delay(ms);
m3ApiSuccess();
}
// This maps pin modes from arduino_wasm_api.h
// to actual platform-specific values
uint8_t mapPinMode(uint8_t mode)
{
switch(mode) {
case 0: return INPUT;
case 1: return OUTPUT;
case 2: return INPUT_PULLUP;
}
return INPUT;
// fn arduino.delay(ms: u32)
m3ApiRawFunction(m3_arduino_delay) {
m3ApiGetArg(uint32_t, ms)
delay(ms);
m3ApiSuccess();
}
m3ApiRawFunction(m3_arduino_pinMode)
{
m3ApiGetArg (uint32_t, pin)
m3ApiGetArg (uint32_t, mode)
// fn arduino.pinMode(pin: u32, mode: u32)
m3ApiRawFunction(m3_arduino_pinMode) {
m3ApiGetArg(uint32_t, pin)
m3ApiGetArg(uint32_t, mode)
#if !defined(PARTICLE)
typedef uint8_t PinMode;
#endif
pinMode(pin, (PinMode)mapPinMode(mode));
switch(mode) {
case 0: pinMode(pin, INPUT);
case 1: pinMode(pin, OUTPUT);
case 2: pinMode(pin, INPUT_PULLUP);
default: pinMode(pin, INPUT);
}
m3ApiSuccess();
m3ApiSuccess();
}
m3ApiRawFunction(m3_arduino_digitalWrite)
{
m3ApiGetArg (uint32_t, pin)
m3ApiGetArg (uint32_t, value)
// fn arduino.digitalWrite(pin: u32, value: u32)
m3ApiRawFunction(m3_arduino_digitalWrite) {
m3ApiGetArg(uint32_t, pin)
m3ApiGetArg(uint32_t, value)
digitalWrite(pin, value);
m3ApiSuccess();
digitalWrite(pin, value);
m3ApiSuccess();
}
m3ApiRawFunction(m3_arduino_getPinLED)
{
m3ApiReturnType (uint32_t)
m3ApiReturn(LED_PIN);
// fn arduino.getPinLED() => u32
m3ApiRawFunction(m3_arduino_getPinLED) {
m3ApiReturnType(uint32_t)
m3ApiReturn(LED_BUILTIN);
}
m3ApiRawFunction(m3_arduino_print)
{
m3ApiGetArgMem (const uint8_t *, buf)
m3ApiGetArg (uint32_t, len)
// fn arduino.print(ptr: *u8, len: u32)
m3ApiRawFunction(m3_arduino_print) {
m3ApiGetArgMem(const uint8_t*, buf)
m3ApiGetArg(uint32_t, len)
Serial.write(buf, len);
m3ApiSuccess();
Serial.write(buf, len);
m3ApiSuccess();
}
M3Result LinkArduino (IM3Runtime runtime)
{
IM3Module module = runtime->modules;
const char* arduino = "arduino";
m3_LinkRawFunction (module, arduino, "millis", "i()", &m3_arduino_millis);
m3_LinkRawFunction (module, arduino, "delay", "v(i)", &m3_arduino_delay);
m3_LinkRawFunction (module, arduino, "pinMode", "v(ii)", &m3_arduino_pinMode);
m3_LinkRawFunction (module, arduino, "digitalWrite", "v(ii)", &m3_arduino_digitalWrite);
// Test functions
m3_LinkRawFunction (module, arduino, "getPinLED", "i()", &m3_arduino_getPinLED);
m3_LinkRawFunction (module, arduino, "print", "v(*i)", &m3_arduino_print);
return m3Err_none;
// 初始化 Arduino 宿主 API
M3Result LinkArduino(IM3Runtime rt) {
m3_LinkRawFunction (rt->modules, "arduino", "millis", "i()", &m3_arduino_millis);
m3_LinkRawFunction (rt->modules, "arduino", "delay", "v(i)", &m3_arduino_delay);
m3_LinkRawFunction (rt->modules, "arduino", "pinMode", "v(ii)", &m3_arduino_pinMode);
m3_LinkRawFunction (rt->modules, "arduino", "digitalWrite", "v(ii)", &m3_arduino_digitalWrite);
m3_LinkRawFunction (rt->modules, "arduino", "getPinLED", "i()", &m3_arduino_getPinLED);
m3_LinkRawFunction (rt->modules, "arduino", "print", "v(*i)", &m3_arduino_print);
return m3Err_none;
}
/*
* Engine start, liftoff!
*/
#define FATAL(func, msg) { Serial.print("Fatal: " func " "); Serial.println(msg); return; }
void wasm_task(void*)
{
M3Result result = m3Err_none;
IM3Environment env = m3_NewEnvironment ();
if (!env) FATAL("NewEnvironment", "failed");
IM3Runtime runtime = m3_NewRuntime (env, WASM_STACK_SLOTS, NULL);
if (!runtime) FATAL("NewRuntime", "failed");
#ifdef WASM_MEMORY_LIMIT
runtime->memoryLimit = WASM_MEMORY_LIMIT;
#endif
IM3Module module;
result = m3_ParseModule (env, &module, app_wasm, app_wasm_len);
if (result) FATAL("ParseModule", result);
result = m3_LoadModule (runtime, module);
if (result) FATAL("LoadModule", result);
result = LinkArduino (runtime);
if (result) FATAL("LinkArduino", result);
IM3Function f;
result = m3_FindFunction (&f, runtime, "_start");
if (result) FATAL("FindFunction", result);
Serial.println("Running WebAssembly...");
result = m3_CallV (f);
// Should not arrive here
if (result) {
M3ErrorInfo info;
m3_GetErrorInfo (runtime, &info);
Serial.print("Error44: ");
Serial.print(result);
Serial.print(" (");
Serial.print(info.message);
Serial.println(")");
if (info.file && strlen(info.file) && info.line) {
Serial.print("At ");
Serial.print(info.file);
Serial.print(":");
Serial.println(info.line);
}
}
// 阻塞执行 wasm 程序
void wasm_task(void* ctx) {
M3Result result = m3Err_none;
IM3Environment env = m3_NewEnvironment ();
if(!env) {
Serial.print("Fatal: NewEnvironment failed");
return;
}
IM3Runtime runtime = m3_NewRuntime (env, WASM_STACK_SLOTS, NULL);
if(!runtime) {
Serial.print("Fatal: NewRuntime failed");
return;
}
if(WASM_MEMORY_LIMIT > 0) {
runtime->memoryLimit = WASM_MEMORY_LIMIT;
}
IM3Module module;
result = m3_ParseModule (env, &module, app_wasm, app_wasm_len);
if (result) {
Serial.print("Fatal: ParseModule ");
Serial.print(result);
return;
}
result = m3_LoadModule (runtime, module);
if(result) {
Serial.print("Fatal: LoadModule ");
Serial.print(result);
return;
}
result = LinkArduino (runtime);
if(result) {
Serial.print("Fatal: LinkArduino ");
Serial.print(result);
return;
}
IM3Function fn_start;
result = m3_FindFunction (&fn_start, runtime, "_start");
if (result) {
Serial.print("Fatal: FindFunction ");
Serial.print(result);
return;
}
Serial.println("Running Wa/WebAssembly...");
result = m3_CallV(fn_start); // loop
// 执行到这里说明有错误
if (result) {
M3ErrorInfo info;
m3_GetErrorInfo (runtime, &info);
Serial.print("Error44: ");
Serial.print(result);
Serial.print(" (");
Serial.print(info.message);
Serial.println(")");
if (info.file && strlen(info.file) && info.line) {
Serial.print("At ");
Serial.print(info.file);
Serial.print(":");
Serial.println(info.line);
}
}
}
void setup()
{
Serial.begin(115200);
delay(100);
// setup 作为 main 函数用户
void setup() {
// 串口初始化
Serial.begin(115200);
delay(100);
// Wait for serial port to connect
// Needed for native USB port only
while(!Serial) {}
// 等待串口初始化完成, 必须是 USB 串口
while(!Serial) {}
Serial.println("\nWasm3 v" M3_VERSION " (" M3_ARCH "), build " __DATE__ " " __TIME__);
// 打印提示信息
Serial.println("\nWasm3 v" M3_VERSION " (" M3_ARCH "), build " __DATE__ " " __TIME__);
#ifdef ESP32
// On ESP32, we can launch in a separate thread
xTaskCreate(&wasm_task, "wasm3", NATIVE_STACK_SIZE, NULL, 5, NULL);
#else
wasm_task(NULL);
#endif
// 阻塞执行 wasm 程序, 不会返回
wasm_task(NULL);
}
void loop()
{
delay(100);
// 该函数不会被执行
// 定义该函数只是为了确保 Arduino 编译通过
void loop() {
delay(100);
}
# 版本日志
- v0.4.0 (dev)
- v0.4.1 (dev)
- TODO
- v0.4.0 (2022-12-03)
- 开通 [开源中国机构号](https://my.oschina.net/walang)[微信公众号](https://wa-lang.org/community/), 主仓库迁到 Gitee
- 包路径调整为 wa-lang.org/wa
- 改进类型方法语法, 支持平台特定源文件
- WAT 后端支持多返回值, 支持闭包和方法值
- WAT 后端支持多返回值, 支持闭包和方法值, [支持 Arduino Nano 33](https://wa-lang.org/smalltalk/st0015.html)
- LLVM 后端支持多返回值, [点亮 Arduino 单片机](https://wa-lang.org/smalltalk/st0014.html)
- 已经初步 [图灵完备](https://wa-lang.org/smalltalk/st0013.html)
- v0.3.1 (2022-11-16)
......
......@@ -5,6 +5,6 @@ module wa-lang.org/wa
go 1.17
require (
github.com/tetratelabs/wazero v1.0.0-pre.3
github.com/tetratelabs/wazero v1.0.0-pre.4
wa-lang.org/wabt-go v1.2.3
)
......@@ -380,14 +380,14 @@ func (p *_Loader) isSkipedSouceFile(filename string) bool {
}
}
if isTargetFile {
var shouildSkip = true
var shouldSkip = true
for _, ext := range []string{".wa", ".wa.go", ".ugo"} {
if strings.HasSuffix(filename, "_"+p.cfg.WaOS+ext) {
shouildSkip = false
shouldSkip = false
break
}
}
if shouildSkip {
if shouldSkip {
return true
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册