找回密码
 立即注册

微信登录

只需一步,快速开始

QQ登录

只需一步,快速开始

搜索
查看: 1040|回复: 4

[转载] 各编程语言 + aardio 相互调用示例(简易代码)

[复制链接]
  • TA的每日心情
    无聊
    2024-10-6 23:27
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    35

    主题

    144

    回帖

    1214

    积分

    金牌会员

    积分
    1214
    来自: 中国安徽
    发表于 2024-2-18 17:00:47 | 显示全部楼层 |阅读模式 来自: 中国安徽
    非业余 - aardio 编程语言 - 非官方问答社区
    限时85折!暑假期间,用aardio培训班充实自己!https://mp.weixin.qq.com/s/c4Z8sZPOiMh_OTG2VPOJmA
    Aardio培训大揭秘,轻松上手打造个人项目!https://mp.weixin.qq.com/s/cr47qhp_Cpz0p57lbbPwug
    aardio风行者第二期培训班https://mp.weixin.qq.com/s/uB6XHUDnGSk0JlWuiBE9AA
    代码都很简单,复制可直接运行。aardio 快速调用 C,C++,C#,Java,R,V,Python,JavaScript,Node.js,Rust,PHP,Ruby,PowerShell,Fortran,Delphi,Julia,Nim,批处理 …… 演示。

    aardio 直接调用系统 API 函数( 支持回调、相互调用 ):
    [AAuto] 纯文本查看 复制代码
    var ret,point = ::User32.GetCursorPos({int x;int y;
    })

    aardio / JavaScript 相互调用( 支持 ES6 ):
    [AAuto] 纯文本查看 复制代码
    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:
    [AAuto] 纯文本查看 复制代码
    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# 组件( 支持相互调用,支持委托这些)

    [AAuto] 纯文本查看 复制代码
    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 ( 也支持相互调用 )
    [AAuto] 纯文本查看 复制代码
    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 函数:
    [AAuto] 纯文本查看 复制代码
    import tcc;  
    
    //编译 DLL
    
    tcc.build( "/start.dll" ).code = /***
    
    #include <windows.h> 
    
    __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 中嵌入并调用批处理:
    [AAuto] 纯文本查看 复制代码
    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:
    [AAuto] 纯文本查看 复制代码
    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服务端,嵌入的浏览器组件:
    [AAuto] 纯文本查看 复制代码
    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 编程语言 - 非官方问答社区
    限时85折!暑假期间,用aardio培训班充实自己!https://mp.weixin.qq.com/s/c4Z8sZPOiMh_OTG2VPOJmA
    Aardio培训大揭秘,轻松上手打造个人项目!https://mp.weixin.qq.com/s/cr47qhp_Cpz0p57lbbPwug
    aardio风行者第二期培训班https://mp.weixin.qq.com/s/uB6XHUDnGSk0JlWuiBE9AA
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2024-10-6 23:27
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    35

    主题

    144

    回帖

    1214

    积分

    金牌会员

    积分
    1214
    来自: 中国安徽
     楼主| 发表于 2024-2-18 17:01:49 | 显示全部楼层 来自: 中国安徽
    aardio 调用 PowerShell,并且在 PowerShell 中调用 aardio。这甚至都不用带上体积较大的
    System.Management.Automation.dll,一个轻巧的 EXE 就可以搞定一切,向下兼容到 PowerShell 2.0 :
    [AAuto] 纯文本查看 复制代码
    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 语言代码 :
    [AAuto] 纯文本查看 复制代码
    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 :
    [AAuto] 纯文本查看 复制代码
    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 范例里有 ) :
    [AAuto] 纯文本查看 复制代码
    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++ :
    [AAuto] 纯文本查看 复制代码
    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.interfacevirtual 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 范例里有 ) :
    [AAuto] 纯文本查看 复制代码
    //加载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();



    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2024-10-6 23:27
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    35

    主题

    144

    回帖

    1214

    积分

    金牌会员

    积分
    1214
    来自: 中国安徽
     楼主| 发表于 2024-2-18 17:02:14 | 显示全部楼层 来自: 中国安徽
    aardio 调用 Delphi ( DLL 源码在 aardio 范例里有) :import win.ui;//内存加载 DLL
    [AAuto] 纯文本查看 复制代码
    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 语言:
    [AAuto] 纯文本查看 复制代码
    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]) ); # 数据类型还是显示为 listb <- 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 :
    [AAuto] 纯文本查看 复制代码
    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 语言:
    [AAuto] 纯文本查看 复制代码
    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")//支持改为 $"/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 语言:
    [AAuto] 纯文本查看 复制代码
    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);

    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2024-10-6 23:27
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    35

    主题

    144

    回帖

    1214

    积分

    金牌会员

    积分
    1214
    来自: 中国安徽
     楼主| 发表于 2024-2-18 17:03:19 | 显示全部楼层 来自: 中国安徽
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-2 11:40
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    26

    主题

    35

    回帖

    561

    积分

    管理员

    积分
    561
    来自: 中国贵州铜仁
    发表于 2024-2-20 21:48:41 | 显示全部楼层 来自: 中国贵州铜仁
    多谢分享
    回复

    使用道具 举报

    *滑块验证:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|非业余 - aardio 编程语言 - 非官方问答社区 知道创宇云防御

    GMT+8, 2024-11-21 19:22 , Processed in 0.121870 second(s), 30 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表