各种编程语言中嵌入脚本代码并执行的实例

下面提供在C、Python、Perl、Go、Java、JavaScript中嵌入并执行脚本代码的实例:

🔧 C 语言示例 (使用Lua脚本引擎)

#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

// 执行Lua脚本示例
int execute_lua_script() {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);  // 打开Lua标准库
    
    printf("=== Lua脚本执行示例 ===\n");
    
    // 执行简单的Lua表达式
    const char* lua_code = "return 2 + 3 * 5";
    if (luaL_dostring(L, lua_code) == LUA_OK) {
        int result = lua_tointeger(L, -1);
        printf("Lua计算结果: %d\n", result);
        lua_pop(L, 1);
    }
    
    // 执行复杂的Lua函数
    const char* lua_function = 
        "function factorial(n)\n"
        "    if n <= 1 then\n"
        "        return 1\n"
        "    else\n"
        "        return n * factorial(n-1)\n"
        "    end\n"
        "end\n"
        "function greet(name)\n"
        "    return 'Hello, ' .. name\n"
        "end\n"
        "return '函数定义完成'";
    
    if (luaL_dostring(L, lua_function) == LUA_OK) {
        printf("Lua函数定义: %s\n", lua_tostring(L, -1));
        lua_pop(L, 1);
    }
    
    // 调用Lua函数
    lua_getglobal(L, "factorial");
    lua_pushinteger(L, 5);
    if (lua_pcall(L, 1, 1, 0) == LUA_OK) {
        printf("5的阶乘: %d\n", lua_tointeger(L, -1));
        lua_pop(L, 1);
    }
    
    lua_getglobal(L, "greet");
    lua_pushstring(L, "World");
    if (lua_pcall(L, 1, 1, 0) == LUA_OK) {
        printf("问候语: %s\n", lua_tostring(L, -1));
        lua_pop(L, 1);
    }
    
    lua_close(L);
    return 0;
}

// 从文件执行Lua脚本
int execute_lua_file(const char* filename) {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    
    if (luaL_dofile(L, filename) != LUA_OK) {
        printf("Lua文件执行错误: %s\n", lua_tostring(L, -1));
        lua_close(L);
        return -1;
    }
    
    lua_close(L);
    return 0;
}

int main() {
    execute_lua_script();
    return 0;
}

编译命令:gcc -o lua_example lua_example.c -llua -lm -ldl

🔧 Python 示例 (多种脚本引擎)

#!/usr/bin/env python3
import subprocess
import json

def execute_javascript():
    """使用Node.js执行JavaScript代码"""
    print("=== JavaScript执行示例 ===")
    
    js_code = """
    function calculateCircleArea(radius) {
        return Math.PI * radius * radius;
    }
    
    function fibonacci(n) {
        if (n <= 1) return n;
        return fibonacci(n-1) + fibonacci(n-2);
    }
    
    const result = {
        area: calculateCircleArea(5),
        fibonacci: fibonacci(10),
        message: "来自JavaScript的问候"
    };
    
    console.log(JSON.stringify(result));
    """
    
    try:
        result = subprocess.run(['node', '-e', js_code], 
                              capture_output=True, text=True, timeout=10)
        if result.returncode == 0:
            data = json.loads(result.stdout)
            print(f"圆面积: {data['area']}")
            print(f"斐波那契数列第10项: {data['fibonacci']}")
            print(f"消息: {data['message']}")
        else:
            print(f"JavaScript执行错误: {result.stderr}")
    except Exception as e:
        print(f"执行失败: {e}")

def execute_lua_in_python():
    """使用lupa库执行Lua代码"""
    try:
        import lupa
        from lupa import LuaRuntime
        
        lua = LuaRuntime()
        
        print("\\n=== Lua脚本执行示例 ===")
        
        # 执行Lua代码
        lua_code = """
        function lua_factorial(n)
            if n <= 1 then
                return 1
            else
                return n * lua_factorial(n-1)
            end
        end
        
        function lua_greet(name)
            return "Hello from Lua, " .. name
        end
        
        return {
            factorial_result = lua_factorial(6),
            greeting = lua_greet("Python")
        }
        """
        
        result = lua.execute(lua_code)
        print(f"Lua阶乘结果: {result['factorial_result']}")
        print(f"Lua问候语: {result['greeting']}")
        
    except ImportError:
        print("请先安装lupa库: pip install lupa")

def execute_ruby_script():
    """执行Ruby脚本"""
    print("\\n=== Ruby执行示例 ===")
    
    ruby_code = """
    def ruby_calculate(a, b)
        {
            sum: a + b,
            product: a * b,
            power: a ** b,
            message: "来自Ruby的计算结果"
        }
    end
    
    result = ruby_calculate(7, 3)
    puts result.to_json
    """
    
    try:
        result = subprocess.run(['ruby', '-rjson', '-e', ruby_code], 
                              capture_output=True, text=True)
        if result.returncode == 0:
            data = json.loads(result.stdout)
            print(f"和: {data['sum']}")
            print(f"积: {data['product']}")
            print(f"幂: {data['power']}")
            print(f"消息: {data['message']}")
    except Exception as e:
        print(f"Ruby执行失败: {e}")

def embedded_python_eval():
    """Python内置的eval和exec函数"""
    print("\\n=== Python内置执行示例 ===")
    
    # 使用eval执行表达式
    expression = "2 ** 8 + 3 * 5"
    result = eval(expression)
    print(f"表达式 '{expression}' = {result}")
    
    # 使用exec执行代码块
    code_block = """
def python_function(x):
    return x * x + 2 * x + 1

result_list = [python_function(i) for i in range(5)]
message = "Python动态执行完成"
"""
    exec(code_block)
    print(f"函数计算结果: {locals()['result_list']}")
    print(f"消息: {locals()['message']}")

if __name__ == "__main__":
    execute_javascript()
    execute_lua_in_python()
    execute_ruby_script()
    embedded_python_eval()

🔧 Perl 示例

#!/usr/bin/perl
use strict;
use warnings;
use JSON;

print "=== Perl脚本执行示例 ===\n";

# 执行JavaScript代码
sub execute_javascript {
    my $js_code = <<'JS_CODE';
function jsCalculate() {
    const numbers = [1, 2, 3, 4, 5];
    const sum = numbers.reduce((a, b) => a + b, 0);
    const average = sum / numbers.length;
    
    return {
        sum: sum,
        average: average,
        message: "来自JavaScript的计算"
    };
}
console.log(JSON.stringify(jsCalculate()));
JS_CODE

    open my $pipe, '-|', 'node', '-e', $js_code or die "无法执行Node.js: $!";
    my $output = do { local $/; <$pipe> };
    close $pipe;
    
    my $data = decode_json($output);
    print "JavaScript求和: " . $data->{sum} . "\n";
    print "JavaScript平均值: " . $data->{average} . "\n";
    print "消息: " . $data->{message} . "\n";
}

# 执行Python代码
sub execute_python {
    my $python_code = <<'PY_CODE';
import math
import json

def python_operations():
    result = {
        'sqrt': math.sqrt(256),
        'factorial': math.factorial(5),
        'constants': {
            'pi': math.pi,
            'e': math.e
        },
        'message': '来自Python的数学计算'
    }
    print(json.dumps(result))

python_operations()
PY_CODE

    open my $pipe, '-|', 'python', '-c', $python_code or die "无法执行Python: $!";
    my $output = do { local $/; <$pipe> };
    close $pipe;
    
    my $data = decode_json($output);
    print "Python平方根: " . $data->{sqrt} . "\n";
    print "Python阶乘: " . $data->{factorial} . "\n";
    print "Python π: " . $data->{constants}{pi} . "\n";
    print "消息: " . $data->{message} . "\n";
}

# 使用eval执行Perl代码
sub execute_perl_eval {
    print "\n=== Perl eval执行示例 ===\n";
    
    # 执行表达式
    my $expression = "2 ** 10 + 3 * 7";
    my $result = eval $expression;
    print "表达式 '$expression' = $result\n";
    
    # 执行代码块
    my $code_block = '
        sub perl_calculate {
            my ($x, $y) = @_;
            return {
                sum => $x + $y,
                product => $x * $y,
                power => $x ** $y
            };
        }
        
        my $calc_result = perl_calculate(4, 3);
        1;
    ';
    
    if (eval $code_block) {
        my $calc_result = perl_calculate(4, 3);
        print "Perl计算 - 和: " . $calc_result->{sum} . "\n";
        print "Perl计算 - 积: " . $calc_result->{product} . "\n";
        print "Perl计算 - 幂: " . $calc_result->{power} . "\n";
    } else {
        print "Perl eval错误: $@\n";
    }
}

# 主程序
execute_javascript();
execute_python();
execute_perl_eval();

🔧 Go 语言示例

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"os/exec"
	"strings"
)

// 执行JavaScript代码
func executeJavaScript() {
	fmt.Println("=== JavaScript执行示例 ===")
	
	jsCode := `
	const calculate = (a, b) => {
		return {
			sum: a + b,
			difference: a - b,
			product: a * b,
			quotient: a / b,
			message: "来自Go调用的JavaScript"
		};
	};
	
	const result = calculate(15, 3);
	console.log(JSON.stringify(result));
	`
	
	cmd := exec.Command("node", "-e", jsCode)
	output, err := cmd.Output()
	if err != nil {
		log.Printf("JavaScript执行错误: %v", err)
		return
	}
	
	var data map[string]interface{}
	if err := json.Unmarshal(output, &data); err != nil {
		log.Printf("JSON解析错误: %v", err)
		return
	}
	
	fmt.Printf("和: %v\n", data["sum"])
	fmt.Printf("差: %v\n", data["difference"])
	fmt.Printf("积: %v\n", data["product"])
	fmt.Printf("商: %v\n", data["quotient"])
	fmt.Printf("消息: %v\n", data["message"])
}

// 执行Python代码
func executePython() {
	fmt.Println("\n=== Python执行示例 ===")
	
	pythonCode := `
import json
import math

def python_calculations():
    results = {
        'circle_area': math.pi * 7 * 7,
        'hypotenuse': math.hypot(3, 4),
        'log_value': math.log(100, 10),
        'message': '来自Go调用的Python'
    }
    print(json.dumps(results))

python_calculations()
`
	
	cmd := exec.Command("python3", "-c", pythonCode)
	output, err := cmd.Output()
	if err != nil {
		log.Printf("Python执行错误: %v", err)
		return
	}
	
	var data map[string]interface{}
	if err := json.Unmarshal(output, &data); err != nil {
		log.Printf("JSON解析错误: %v", err)
		return
	}
	
	fmt.Printf("圆面积: %v\n", data["circle_area"])
	fmt.Printf("斜边长: %v\n", data["hypotenuse"])
	fmt.Printf("对数值: %v\n", data["log_value"])
	fmt.Printf("消息: %v\n", data["message"])
}

// 执行Lua代码
func executeLua() {
	fmt.Println("\n=== Lua执行示例 ===")
	
	luaCode := `
	function lua_operations(x, y)
		return {
			sum = x + y,
			product = x * y,
			power = x ^ y,
			message = "来自Go调用的Lua"
		}
	end
	
	local result = lua_operations(5, 3)
	
	-- 手动构建JSON字符串
	print('{"sum":' .. result.sum .. ',"product":' .. result.product .. ',"power":' .. result.power .. ',"message":"' .. result.message .. '"}')
	`
	
	cmd := exec.Command("lua", "-e", luaCode)
	output, err := cmd.Output()
	if err != nil {
		log.Printf("Lua执行错误: %v", err)
		return
	}
	
	var data map[string]interface{}
	if err := json.Unmarshal(output, &data); err != nil {
		log.Printf("JSON解析错误: %v", err)
		return
	}
	
	fmt.Printf("和: %v\n", data["sum"])
	fmt.Printf("积: %v\n", data["product"])
	fmt.Printf("幂: %v\n", data["power"])
	fmt.Printf("消息: %v\n", data["message"])
}

// Go内置模板引擎示例
func goTemplateEngine() {
	fmt.Println("\n=== Go模板引擎示例 ===")
	
	templateText := `
计算结果是: {{add .A .B}}
欢迎消息: {{greet .Name}}
平方: {{square .Number}}
`
	
	// 在实际应用中,可以使用text/template或html/template包
	// 这里简化演示
	data := struct {
		A      int
		B      int
		Name   string
		Number int
	}{
		A:      10, 
		B:      20,
		Name:   "Gopher",
		Number: 9,
	}
	
	fmt.Printf("模板数据: A=%d, B=%d, Name=%s, Number=%d\n", 
		data.A, data.B, data.Name, data.Number)
	fmt.Printf("模拟计算结果: %d\n", data.A + data.B)
	fmt.Printf("模拟问候: Hello, %s!\n", data.Name)
	fmt.Printf("模拟平方: %d\n", data.Number * data.Number)
}

func main() {
	executeJavaScript()
	executePython()
	executeLua()
	goTemplateEngine()
}

🔧 Java 示例

import javax.script.*;
import java.util.*;

public class ScriptEngineExample {
    public static void main(String[] args) {
        System.out.println("=== Java脚本引擎示例 ===\n");
        
        // 创建脚本引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();
        
        // 执行JavaScript
        executeJavaScript(manager);
        
        // 执行Python (需要Jython)
        executePython(manager);
        
        // 执行Groovy (需要Groovy引擎)
        executeGroovy(manager);
        
        // 多语言比较示例
        compareLanguages(manager);
    }
    
    // 执行JavaScript
    public static void executeJavaScript(ScriptEngineManager manager) {
        try {
            ScriptEngine engine = manager.getEngineByName("javascript");
            
            if (engine == null) {
                System.out.println("JavaScript引擎不可用");
                return;
            }
            
            System.out.println("=== JavaScript执行 ===");
            
            // 设置变量
            engine.put("name", "Java用户");
            engine.put("numbers", new int[]{1, 2, 3, 4, 5});
            
            // 执行简单表达式
            Object result = engine.eval("2 + 3 * 4");
            System.out.println("JavaScript计算结果: " + result);
            
            // 执行函数
            String jsCode = 
                "function calculateStats(arr) {" +
                "   var sum = arr.reduce((a, b) => a + b, 0);" +
                "   var avg = sum / arr.length;" +
                "   return {" +
                "       sum: sum," +
                "       average: avg," +
                "       message: 'Hello, ' + name" +
                "   };" +
                "}" +
                "calculateStats(numbers);";
            
            Object stats = engine.eval(jsCode);
            System.out.println("JavaScript统计结果: " + stats);
            
            // 调用函数
            engine.eval("function greet(msg) { return '消息: ' + msg.toUpperCase(); }");
            Invocable invocable = (Invocable) engine;
            Object greeting = invocable.invokeFunction("greet", "来自Java的调用");
            System.out.println(greeting);
            
        } catch (Exception e) {
            System.out.println("JavaScript执行错误: " + e.getMessage());
        }
    }
    
    // 执行Python (需要Jython)
    public static void executePython(ScriptEngineManager manager) {
        try {
            ScriptEngine engine = manager.getEngineByName("python");
            
            if (engine == null) {
                System.out.println("\nPython引擎不可用 (需要Jython)");
                return;
            }
            
            System.out.println("\n=== Python执行 ===");
            
            String pythonCode = 
                "def python_factorial(n):\n" +
                "    if n <= 1:\n" +
                "        return 1\n" +
                "    else:\n" +
                "        return n * python_factorial(n-1)\n" +
                "\n" +
                "result = python_factorial(5)\n" +
                "message = 'Python计算完成'\n" +
                "{'factorial': result, 'message': message}";
            
            Object pythonResult = engine.eval(pythonCode);
            System.out.println("Python计算结果: " + pythonResult);
            
        } catch (Exception e) {
            System.out.println("Python执行错误: " + e.getMessage());
        }
    }
    
    // 执行Groovy
    public static void executeGroovy(ScriptEngineManager manager) {
        try {
            ScriptEngine engine = manager.getEngineByName("groovy");
            
            if (engine == null) {
                System.out.println("\nGroovy引擎不可用");
                return;
            }
            
            System.out.println("\n=== Groovy执行 ===");
            
            String groovyCode = 
                "def groovyCalculate(a, b) {\n" +
                "    return [\n" +
                "        sum: a + b,\n" +
                "        product: a * b,\n" +
                "        power: a ** b,\n" +
                "        message: '来自Groovy的动态计算'\n" +
                "    ]\n" +
                "}\n" +
                "\n" +
                "groovyCalculate(4, 3)";
            
            Object groovyResult = engine.eval(groovyCode);
            System.out.println("Groovy计算结果: " + groovyResult);
            
        } catch (Exception e) {
            System.out.println("Groovy执行错误: " + e.getMessage());
        }
    }
    
    // 多语言比较
    public static void compareLanguages(ScriptEngineManager manager) {
        System.out.println("\n=== 多语言性能比较 ===");
        
        String[] languages = {"javascript", "groovy"};
        String testCode = "var sum = 0; for (var i = 0; i < 10000; i++) { sum += i; } sum;";
        
        for (String lang : languages) {
            try {
                ScriptEngine engine = manager.getEngineByName(lang);
                if (engine != null) {
                    long startTime = System.currentTimeMillis();
                    Object result = engine.eval(testCode);
                    long endTime = System.currentTimeMillis();
                    
                    System.out.printf("%s 执行时间: %d ms, 结果: %s\n", 
                        lang, (endTime - startTime), result);
                }
            } catch (Exception e) {
                System.out.println(lang + " 测试失败: " + e.getMessage());
            }
        }
    }
}

🔧 JavaScript (Node.js) 示例

const { exec, execSync, spawn } = require('child_process');
const vm = require('vm');

// 使用Node.js内置vm模块执行JavaScript
function executeWithVM() {
    console.log("=== Node.js VM模块执行 ===");
    
    // 创建沙盒环境
    const sandbox = {
        x: 10,
        y: 20,
        console: console
    };
    
    // 执行简单脚本
    try {
        const script = new vm.Script('result = x * y + 15;');
        const context = vm.createContext(sandbox);
        script.runInContext(context);
        console.log(`VM计算结果: ${sandbox.result}`);
    } catch (err) {
        console.error('VM执行错误:', err);
    }
    
    // 执行更复杂的脚本
    const complexScript = `
        function calculate(a, b) {
            return {
                sum: a + b,
                product: a * b,
                power: Math.pow(a, b),
                message: '来自VM的计算'
            };
        }
        
        const results = calculate(x, y);
        results;
    `;
    
    try {
        const result = vm.runInNewContext(complexScript, sandbox);
        console.log('VM复杂计算:', result);
    } catch (err) {
        console.error('VM复杂执行错误:', err);
    }
}

// 执行Python代码
function executePython() {
    console.log("\n=== 执行Python代码 ===");
    
    const pythonCode = `
import math
import json

def main():
    data = {
        'circumference': 2 * math.pi * 5,
        'area': math.pi * math.pow(5, 2),
        'volume': (4/3) * math.pi * math.pow(5, 3),
        'message': '来自Node.js调用的Python'
    }
    print(json.dumps(data))

if __name__ == "__main__":
    main()
`;
    
    try {
        const result = execSync('python3 -c ' + JSON.stringify(pythonCode), { 
            encoding: 'utf8' 
        });
        const data = JSON.parse(result);
        console.log('Python几何计算:');
        console.log(`  圆周长: ${data.circumference}`);
        console.log(`  圆面积: ${data.area}`);
        console.log(`  球体积: ${data.volume}`);
        console.log(`  消息: ${data.message}`);
    } catch (err) {
        console.error('Python执行错误:', err);
    }
}

// 执行Ruby代码
function executeRuby() {
    console.log("\n=== 执行Ruby代码 ===");
    
    const rubyCode = `
require 'json'

def ruby_calculations
    results = {
        factorial: (1..6).reduce(:*),
        fibonacci: [0, 1, 1, 2, 3, 5, 8, 13, 21],
        prime: [2, 3, 5, 7, 11, 13],
        message: '来自Node.js调用的Ruby'
    }
    puts results.to_json
end

ruby_calculations
`;
    
    try {
        const result = execSync('ruby -e ' + JSON.stringify(rubyCode), { 
            encoding: 'utf8' 
        });
        const data = JSON.parse(result);
        console.log('Ruby数学计算:');
        console.log(`  6的阶乘: ${data.factorial}`);
        console.log(`  斐波那契数列: ${data.fibonacci.join(', ')}`);
        console.log(`  质数: ${data.prime.join(', ')}`);
        console.log(`  消息: ${data.message}`);
    } catch (err) {
        console.error('Ruby执行错误:', err);
    }
}

// 执行Lua代码
function executeLua() {
    console.log("\n=== 执行Lua代码 ===");
    
    const luaCode = `
function lua_table_operations()
    local tbl = {1, 2, 3, 4, 5}
    local sum = 0
    local product = 1
    
    for i, v in ipairs(tbl) do
        sum = sum + v
        product = product * v
    end
    
    return {
        original = tbl,
        sum = sum,
        product = product,
        average = sum / #tbl,
        message = "来自Node.js调用的Lua"
    }
end

local result = lua_table_operations()

-- 手动输出JSON格式
print('{"sum":' .. result.sum .. ',"product":' .. result.product .. ',"average":' .. result.average .. ',"message":"' .. result.message .. '"}')
`;
    
    try {
        const result = execSync('lua -e ' + JSON.stringify(luaCode), { 
            encoding: 'utf8' 
        });
        const data = JSON.parse(result);
        console.log('Lua表操作:');
        console.log(`  总和: ${data.sum}`);
        console.log(`  乘积: ${data.product}`);
        console.log(`  平均值: ${data.average}`);
        console.log(`  消息: ${data.message}`);
    } catch (err) {
        console.error('Lua执行错误:', err);
    }
}

// 使用eval函数(谨慎使用)
function executeWithEval() {
    console.log("\n=== 使用eval函数 ===");
    
    // 简单的数学表达式
    const expression = '2 ** 8 + 3 * 7';
    const result = eval(expression);
    console.log(`表达式 "${expression}" = ${result}`);
    
    // 函数定义和执行
    const functionCode = `
        (function() {
            const numbers = [10, 20, 30, 40, 50];
            const stats = {
                count: numbers.length,
                total: numbers.reduce((a, b) => a + b, 0),
                max: Math.max(...numbers),
                min: Math.min(...numbers)
            };
            stats.average = stats.total / stats.count;
            return stats;
        })()
    `;
    
    try {
        const stats = eval(functionCode);
        console.log('eval统计计算:');
        console.log(`  数量: ${stats.count}, 总和: ${stats.total}`);
        console.log(`  最大值: ${stats.max}, 最小值: ${stats.min}`);
        console.log(`  平均值: ${stats.average}`);
    } catch (err) {
        console.error('eval执行错误:', err);
    }
}

// 主函数
async function main() {
    executeWithVM();
    executePython();
    executeRuby();
    executeLua();
    executeWithEval();
}

main().catch(console.error);

📝 使用要点说明

  1. 环境要求

    • C语言:需要安装Lua开发库
    • Python:需要安装lupa库 (pip install lupa)
    • Java:需要相应的脚本引擎 (Rhino for JavaScript, Jython for Python, Groovy for Groovy)
    • 所有语言:需要安装对应的解释器 (Node.js, Python, Ruby, Lua)
  2. 安全考虑

    • 使用eval()函数要特别小心,可能执行恶意代码
    • 推荐使用沙盒环境或子进程执行
  3. 性能考虑

    • 子进程调用有启动开销
    • 内置引擎通常性能更好
  4. 适用场景

    • 动态配置和规则引擎
    • 数学公式计算
    • 插件系统和扩展功能
    • 多语言集成架构

这些示例展示了各种语言中嵌入和执行脚本的不同方法,可以根据具体需求选择合适的技术方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千江明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值