当前位置: 首页 > news >正文

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

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smPXgY5L-1664039491806)(https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/6e2aa12706e64101b2b1d26bdb3c98ae~noop.image?_iz=58558&from=article.pc_detail&x-expires=1664615752&x-signature=TGyrX8D9mJ%2F%2FOOqtqlSqhmJR6tc%3D)]
 
《 aardio 快速入门 —— 语法速览 》
aardio 直接调用系统 API 函数( 支持回调、相互调用 ):

var ret,point = ::User32.GetCursorPos({
 int x;
 int y;
})

aardio / JavaScript 相互调用( 支持 ES6 ):

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

//导出 aardio 函数到 JavaScript
vm.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 内置函数 list
var 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; 
//编译 DLL
tcc.build( "/start.dll" ).code = /***
#include  
\_\_declspec(dllexport) int Add( int a,int b ) 
{ 
 return a + b;
} 
***/

//加载 DLL
var dll = raw.loadDll( "/start.dll",,"cdecl" );
//调用 C函数
var result = dll.Add(12,3);

在 aardio 中嵌入并调用批处理:

import console
import 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 = /*

 

PHP 测试


php echo '<pHello World / PHP\_CGI 服务器'; ?>


*/
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 路径前加 $ 实现内存加载 DLL(发布后不需要外部 DLL 文件)
var dll = raw.loadDll($"/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  
 
 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;
 }
******/

//编译生成DLL 
vc.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路径前面加上$表示把DLL嵌入到程序中并通过内存加载
var dll = raw.loadDll( 
 $"\basic.dll",,"cdecl" //注意参数里指定使用 cdecl 调用约定。
);

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

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


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

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

import win.ui;

//内存加载 DLL
var 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.world
print ( 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 后面的代码被忽略。
}
*/

//启动 R 
var 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[] * 2
 result = md5.getMD5($str)
*/
string.save("/test.nim",nimCode )

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

//支持改为 $"/test.dll" 内存加载 DLL,
//但这时候 test.dll 还未生成,所以示例里没有加 $
//用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 int
 y int 
} 

[export: 'add'] //一定要用这句指定DLL导出函数名
pub fn add(a int,b int,mut pt &Point) int {
 pt.x = a+b
 return 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);

相关文章:

  • SpringCloud概述
  • element的Form表单就应该这样用
  • Linux基础组件之死锁检测
  • TypeScript——函数(函数定义类型、可选参数和默认参数、剩余参数、函数类型变量、使用接口封装函数变量类型)
  • T1056点和正方形的关系 (信息学一本通C++)
  • 【Selenium】一网打尽 小窗口滑动 全窗口滑动
  • 大数据必学Java基础(六十三):COW并发容器讲解
  • AutoCAD2014与致命的错误与独显直连
  • 联邦学习系列---读书个人总结
  • MyBatis概述、maven构建、Mapper接口及ORM思想
  • 【MyCat2】学习笔记(二)
  • 【洛谷题解/USACO题解】P2746 【USACO5.3】校园网Network of Schools
  • 防火墙iptables
  • Apiserver 执行顺序
  • Spring5 框架 ---- IOC容器(二)
  • Angular 2 DI - IoC DI - 1
  • express如何解决request entity too large问题
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JavaScript新鲜事·第5期
  • JS基础之数据类型、对象、原型、原型链、继承
  • Mysql优化
  • SpiderData 2019年2月13日 DApp数据排行榜
  • tensorflow学习笔记3——MNIST应用篇
  • 观察者模式实现非直接耦合
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端
  • 容器服务kubernetes弹性伸缩高级用法
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 数据科学 第 3 章 11 字符串处理
  • 数组的操作
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 网页视频流m3u8/ts视频下载
  • 写代码的正确姿势
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • !$boo在php中什么意思,php前戏
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (¥1011)-(一千零一拾一元整)输出
  • (LeetCode 49)Anagrams
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (南京观海微电子)——I3C协议介绍
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)linux 命令大全
  • ***测试-HTTP方法
  • ***利用Ms05002溢出找“肉鸡
  • .form文件_一篇文章学会文件上传