写点什么

各编程语言 + aardio 相互调用示例

作者:Java-fenn
  • 2022 年 9 月 25 日
    湖南
  • 本文字数:6770 字

    阅读完需:约 22 分钟

Python .Net Java C++ PowerShell 代码简单、复制可用。aardio 快速调用 C,C++,C#,Java,R,V,Python,JavaScript,Node.js,Rust,PHP,Ruby,PowerShell,Fortran,Delphi,Julia,Nim,批处理 …… 演示。


《aardio 编程语言快速入门 —— 语法速览》


aardio 直接调用系统 API 函数( 支持回调、相互调用 ):


var ret,point = ::User32.GetCursorPos({int x;int y;})aardio / JavaScript 相互调用( 支持 ES6 ):


import web.script;var vm = web.script("ES6")


//导出 aardio 函数到 JavaScriptvm.external = {log = function(...){


console.log(...)}}


vm.script = /*****function TestFunction(a,b) {return a + b;}*****/


var ret = vm.script.TestFunction(2,3);在 aardio 中调用 Python( Python 调用 aardio 同样简单,参考 aardio 自带范例),简单得就像在 Python 中使用 Python:


import console;import py3;


//导入 Python 模块。var itertools = py3.import("itertools")


//调用 Python 函数,支持纯 aardio 类型参数 var permutations = itertools.permutations({"a","b","c"});


//调用 Python 内置函数 listvar pyList = py3.list(permutations);


//遍历 Python 对象成员 for( item in pyList.each() ){console.log(item); //像 aardio 对象一样使用 Python 对象}


console.pause();aardio 直接调用 .Net / C# 组件( 支持相互调用,支持委托这些)


import win.ui;var winform = win.form(text="DataGridView")


import System.Data;var tab = System.Data.DataTable("DT");tab.Columns.Add("名称");tab.Rows.Add({"WangWu"});


import System.Windows.Forms;var grid = System.Windows.Forms.CreateEmbed("DataGridView",winform);grid.ColumnHeadersHeightSizeMode = 2;grid.DataSource = System.Data.DataView(tab);


winform.show();win.loopMessage();aardio 直接调用 Java ( 也支持相互调用 )


import java;var jvm = java();


//加载 Java 类对象 HelloworldApp = jvm.import("aardio.sample.HelloworldApp");


//也可以如下自内存或文件直接加载类,HelloworldApp = jvm.import("aardio.sample.HelloworldApp",$"\java\aardio\sample\HelloworldApp.class");


//用 Java 类创建 Java 对象 var helloworld = HelloworldApp();


//直接调用 Java 对象的方法 var result = helloworld.test(3);用 aardio 编译 C 语言代码生成 DLL 执行文件,再调用 DLL 中的 C 函数:


import tcc;


//编译 DLLtcc.build( "/start.dll" ).code = /***#include <windows.h>__declspec(dllexport) int Add( int a,int b ){


return a + b;}***/


//加载 DLLvar dll = raw.loadDll( "/start.dll",,"cdecl" );//调用 C 函数 var result = dll.Add(12,3);在 aardio 中嵌入并调用批处理:


import consoleimport process.batch;


//批处理 for 遍历并拆分字符串 var bat = process.batch(@echo off for %%i in (abc,def,xyz) do echo %%i)console.log(bat.read(-1))


console.pause()aardio 调用 Rust 语言解析 TOML:


import console;import string.toml;


var str = string.toml.stringify({abc=123,d={1,2,3}});console.log( str );


import process.code;process.code("~\lib\string\toml.res");console.pause(true);在 aardio 里嵌入 PHP,以下短短几句代码,包含了 HTTP 服务器,PHP 服务端,嵌入的浏览器组件:


import win.ui;/DSG{{/var winform = win.form(text="Hello World / PHP_CGI 服务器")/}}/


var code = /*<html><head><meta charset="utf-8"><title>PHP 测试</title></head><body><?php echo '<p>Hello World / PHP_CGI 服务器</p>'; ?></body></html>*/string.save("/test.php",code);


import php.simpleHttpServer;var url = php.simpleHttpServer.startUrl("/test.php");


import web.form;var wb = web.form(winform);wb.go(url);


winform.show();win.loopMessage();aardio 调用 PowerShell,并且在 PowerShell 中调用 aardio。这甚至都不用带上体积较大的


System.Management.Automation.dll,一个轻巧的 EXE 就可以搞定一切,向下兼容到 PowerShell 2.0 :


import dotNet.ps;


var pScript = /*

声明 PowerShell 参数

param($win)

修改 aardio 对象属性

$win.title = "PowerShell + aardio";

调用 aardio 对象函数

$win.msgbox("这是 PowerShell 调用 aardio 打开的对话框。")


*/


import win;dotNet.ps(pScript,{win = win; //# 将 aardio 对象作为参数传给 PowerShell});aardio 执行 Ruby 语言代码 :


import win.ui;/DSG{{/var winform = win.form(text="执行 Ruby 代码")winform.add(edit={cls="edit";left=26;top=16;right=737;bottom=435;multiline=1;z=1})/}}/


import process.ruby;var out = process.ruby.exec("puts '测试 UTF-8'")winform.edit.print(out);


var out = process.ruby.eval([1, 2, { name: "tanaka", age: 19 }])winform.edit.print(out);


winform.show();win.loopMessage();aardio 调用 Node.js :


import console;


import nodeJs;


var js = /******


console.log(process.argv);


var startEnviron = require('startEnviron');console.log(startEnviron.dest);


******/


//自动分析 JS 代码中的 require 语句并安装依赖模块 nodeJs.requireByJs(js);


//把对象传给 node.js,在 JS 代码中用 require('startEnviron') 获取。nodeJs.startEnviron({src:"传个字符串",dest:{test:"嵌套的对象表,传给 node.js 都没问题",number:123, arr:{1,2,3} }})


//执行 JS,这里指定的启动参数在 JS 代码中可用 process.argv 获取。var prcs = nodeJs.exec(js,"--args1=1","--args2=1");prcs.logResponse();


console.pause(true);aardio 调用 Fortran ( DLL 源码在 aardio 范例里有 ) :


import console


//加载 DLL , DLL 路径前加 "/fortran.dll",,"cdecl");


//不声明直接调用,结构体默认传址,这不用改什么。var c = dll.__test_MOD_addbypoint({int x = 22;int y = 3;})console.log(c);


//可以先声明一下,参数类型加上 &声明为按引用传址(指针)var add = dll.api("__test_MOD_add","int(int &a,int &b)")var c = add(33,2); //Fortran 的数值参数默认都是传址(传指针)


//不声明直接调用可以用结构体取代指针 var c = dll.__test_MOD_add({int a=33},{int b=2});


//用 raw.int 创建传址数值也可以 var c = dll.__test_MOD_add(raw.int(33,true),raw.int(2,true));


//参数声明为传值时调用更简单,不声明调用时数值默认为 int 类型 var c = dll.__test_MOD_addbyval(33,2,raw.double(123));console.log(c);


//字符串 var str = "hello"; //只读字符串,改用 raw.buffer 创建可读写字节数组 dll.__test_MOD_hello(str,#str); //注意到字符串长度传过去


console.pause(true);aardio 调用 C++ :


import vc6;import console;console.open();


var vc = vc6( "/" )


//输入 C++源码 vc.cpp = /******#include <windows.h>


struct TestInfo{    int x;    int y;    BYTE name[256];};
class CTestObject{public: //注意函数声明前加上 virtual 以支持 aardio 中的 raw.interface virtual void getName(char *buffer,int len); virtual void getInfo(TestInfo *pInfo);};
void CTestObject::getName(char *buffer,int len){ strcpy(buffer,"测试");}
void CTestObject::getInfo(TestInfo *pInfo){ pInfo->x = 1; pInfo->y = 2; strcpy((char *)pInfo->name,"测试");}
extern "C" __declspec(dllexport) CTestObject* __cdecl CreateTestObject() { return new CTestObject();}
extern "C" __declspec(dllexport) void __cdecl DeleteTestObject( CTestObject* pTest) { delete pTest;}
复制代码


******/


//编译生成 DLLvc.exec('cl *.cpp','/W3' /警告等级/,'/MD' /使用多线程动态运行库/,'/O2 /Ot /EHsc' /代码优化选项/,'/D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL"' /定义常数和宏/,'/I"./INCLUDE"'/指定头文件目录/,'kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib' /导入库/,'/link /SUBSYSTEM:WINDOWS /MACHINE:X86' /*后面是链接参数 */,'/out:test.dll'/输出文件名/,'/dll' /输出 DLL/,'/LIBPATH:".\LIB" /LIBPATH:".\LIB2"' /指定库目录/)


var dll = raw.loadDll("/test.dll",,"cdecl");


import raw.interface;class testObject{ctor(){//创建 C++ 对象,并获取指针,注意这里使用了 P 尾标获取指针。var pTest = dll.CreateTestObjectP();


    //C++ 对象指针转换为 aardio 对象。    this = ..raw.interface( pTest,"        void getName(string &buffer,int len);        void getInfo(struct &pInfo);         ","thiscall" //注意调用约定为thiscall    )        //添加析构函数        ..table.gc(this,"delete")    };delete = function(){    if(!owner.deleted){        dll.DeleteTestObject( owner );        owner.deleted = true;    } };
复制代码


}


//创建对象 var obj = testObject();


//调用 C++ 函数 var name = obj.getName(25,25);console.log(name);


//调用 C++ 函数 var info = obj.getInfo({ int x;int y;BYTE name[256]})console.log( info.name );


console.pause();aardio 调用 FreeBASIC (DLL 源码在 aardio 范例里有 ) :


//加载 DLL,DLL 路径前面加上"\basic.dll",,"cdecl" //注意参数里指定使用 cdecl 调用约定。);


//定义结构体,当然也可以先声明一个 class 来创建实例。var info = {int x;INT y;}


// 然后直接调用 APIvar ret = dll.msgboxW(123,456,"测试一下好用不好用",info);


//最后打印结构体看一下值 import console;console.log(ret);


console.dumpJson(info);console.pause();aardio 调用 Delphi ( DLL 源码在 aardio 范例里有) :


import win.ui;


//内存加载 DLLvar delphiDll = raw.loadDll($"\Project1.dll");class win.ui.ctrl.delphiForm{ctor(parent,tParam){this.hwnd = delphiDll.CreateForm(parent.hwnd);};@..win.ui.ctrl.metaProperty()}/DSG{{/var winform = win.form(text="用 Delphi 语言为 aardio 编写控件";right=507;bottom=423;bgcolor=11842740)winform.add(custom={cls="delphiForm";text="嵌入 Delphi 控件";left=17;top=28;right=490;bottom=211;db=1;dl=1;dr=1;dt=1;z=1};edit={cls="edit";text="请先用 Delphi 打开此目录下的 DLL 源码工程编译生成 \Project1.dll";left=16;top=228;right=489;bottom=398;edge=1;multiline=1;z=2})/}}/


import web.json;winform.onTest = function(delphiStructParam){winform.edit.print("Delphi 调用了 aardio 函数,参数如下:");winform.edit.print(delphiStructParam);delphiStructParam.x = 90;


//可选返回修改后的结构体return delphiStructParam;
复制代码


}winform.edit.text = "";


winform.show();win.loopMessage();aardio 调用 R 语言:


import console;import process.r;


//执行 R 代码,支持 aardio 模板语法 process.r.code = /*write("<?="这是 aardio 代码"?>",file=".data.txt");*/


//执行 R 代码,支持 aardio 模板语法 var out = process.r.loadcode(write("<?="这是 aardio 代码"?>",file=".data.txt");)


//执行纯 R 代码,参数 @1 可以指定 R 代码或 R 文件。var out = process.r.exec(`args=commandArgs(T);write(args[1],file=".data.txt");

list 有点像 aardio 中的表(table),可以包含各种数据类型,

a <- list(hello = 1, world = "字符串" ) # <- 相当于 aardio 中的等号, R 的等号一般用于分隔键值对 print ( a[["world"]] ); # aardio 里的直接下标也是这么写 print ( a$world ); # 相当于 aardio 里的 a.worldprint ( a[1] ); # 这个返回的是键值对 hello = 1,不像 aadio 中 a[1] 与 a.hello 是指向不同的元素。print ( mode(a[1]) ); # 数据类型还是显示为 list


b <- TRUE #布尔值必须全大写 print( b )

向量

a = c(10, 20, 30, 40, 50)print( a[1] ) #起始下标为 1 ,这跟 aardio 一样 print( a[1:4] ) # 取出第 1 项到第 4 项

定义函数,与 aardio 语法类似

new.function <- function(a,b,c) {result <- a * b + c # 类似 aardio 中的 return a * b + c #print(result) # 指定返回值以后,还能继续执行后面的代码,不像 aardio 函数 return 后面的代码被忽略。}


print( new.function(2,3,1) )`,"测试一下"); //可以添加不定个数的启动参数 console.log( out );console.more(,true);


console.showLoading(" 正在安装 rjson 包");process.r.require("rjson","https://mirrors.ustc.edu.cn/CRAN/");//不会重复安装


var out = process.r.exec( `library("rjson") # 载入 rjson 包


args <- commandArgs(T);tab <- fromJSON(args[1], simplify=FALSE);


#不要用 print ,cat 不会加一堆不必要的东西 cat( toJSON(tab) )`, {name1 = "测试一下,传对象给 R 语言";name2 = "这是一个 aardio 对象"})


console.dump(out);


var rCode = /*testabc <- function(a,b,c) {result <- a * b + c # 类似 aardio 中的 return a * b + c #print(result) # 指定返回值以后,还能继续执行后面的代码,不像 aardio 函数 return 后面的代码被忽略。}*/


//启动 Rvar r = process.r.startRpc(rCode);


//调用 R 函数 var ret = r.testabc(2,3,1)


//打印 R 函数返回值 if(ret[["result"]]){console.log("R 函数返回值",ret[["result"]])}console.pause(true);aardio 调用 Julia :


import console;import julia;


//调用 Julia 函数 var ret = julia.sqrt(2);console.log(ret);


//导入 Julia 模块 julia.using("Base64");var data = julia.Base64.base64encode("测试一下");console.log( data );


//转换 Julia 数据类型 var buf = julia.value.build(raw.buffer("abc"));console.log(julia.typeof(buf));


//执行 Julia 代码并获取返回值 var refs = julia.eval("refs = IdDict(");


//查看 Julia 代码错误 console.log(julia.lasterr());


console.pause();aardio 调用 Nim 语言:


import console;


var nimCode = /*{.pragma: rtl, exportc, dynlib, cdecl.}


import md5

Nim 双引号中的字符串,相当于 aardio 中用单引号包含的转义字符串

aardio 中双引号包含的字符串,相当于 Nim 中的原始字符串: r"原始字符串"

Nim 与 aardio 都是 UTF-8 编码,aardio 的文本字符串在 Nim 中的类型为 cstring

Nim 中 string 可以隐式转换为 cstring, cstring 加上 $ 转为 string 类型

proc build*(str: cstring, num: ptr[cint]): cstring {.rtl.} =num[] = num[] * 2result = md5.getMD5($str)*/string.save("/test.nim",nimCode )


import process.nim;process.nim("c --app:lib -d:release -r test.nim")


//支持改为 //用 cdecl 调用约定的好处是:导出函数名直接可用,不会被加上修饰名 var test = raw.loadDll("/test.dll",,"cdecl")


//nim 与 aardio 的字符串都是 UTF-8 编码,UTF-8 真是到处通行,非常方便省了很多事 var build = test.api("build","str(str,int& num)" )


//一般 C 语言不能这么直接返回字符串(要考虑谁释放内存)。//但是 nim 可以投机取巧一下,nim 会自动回收内存,而这时候还来不及回收。var str,num = build("测试 abc",9)console.log(str,num)


//用 aardio 算出 MD5 对比一下,结果一模一样 import crypt;console.log(crypt.md5("测试 abc",false))console.pause();aardio 调用 V 语言:


import console;import process.v;


console.open();


//V 语言不支持中文路径,所以工程目录路径不要包含任何中文 string.save("/hello.v","struct Point {pub mut: //声明下面的字段公开、可变 x inty int}


[export: 'add'] //一定要用这句指定 DLL 导出函数名 pub fn add(a int,b int,mut pt &Point) int {pt.x = a+breturn a+b}" )


/*V 语言是翻译成 C 语言然后生成 DLL,生成的 DLL 依赖 VC 运行库,试了换成调用 TCC 编译,10KB 的 DLL 增大到 400KB,并且运行崩溃。*/process.v.shared("hello.v").waitOne();


//V 生成的 DLL 建议至少在 WIN10 上用,需要 VC++2017 运行库 import sys.vc14;sys.vc14.require(); //检测并自动安装 VC++ 运行库


//导入 DLL,注意要指定 cdecl 调用约定 var dll = raw.loadDll("/hello.dll",,"cdecl")


//调用 V 函数( V 是翻译为 C 语言,所以参考 C 语言的规则)var n,pt = dll.add(12,3,{int x=1;int y =2});


//输出结果 console.log(n);console.dumpJson(pt);


console.pause(true);

用户头像

Java-fenn

关注

需要Java资料或者咨询可加我v : Jimbye 2022.08.16 加入

还未添加个人简介

评论

发布
暂无评论
各编程语言 + aardio 相互调用示例_Java_Java-fenn_InfoQ写作社区