Controles de Conectividade NEW
O HarbourBuilder fornece 9 controles de interoperabilidade de linguagens que permitem chamar codigo escrito em Python, Swift, Go, Node.js, Rust, Java, .NET, Lua e Ruby diretamente das suas aplicacoes Harbour. Os 9 controles herdam da classe base TInteropRuntime, que fornece uma API unificada para chamadas entre linguagens.
Cada componente de conectividade fornece uma API xBase limpa que envolve a interface de funcao estrangeira subjacente. Solte o componente no formulario, aponte para seu script ou biblioteca, e chame funcoes como se fossem metodos nativos Harbour.
Linguagens Suportadas
| Componente | Linguagem | Mecanismo | Caso de Uso |
|---|---|---|---|
| TPython | Python | Python C API (libpython) | Pipelines de ML, ciencia de dados, scripting, automacao. |
| TSwift | Swift | C-interop via @_cdecl | APIs nativas macOS/iOS, pacotes Swift. |
| TGo | Go | Biblioteca compartilhada cgo (buildmode=c-shared) | Workers concorrentes, microsservicos, criptografia. |
| TNode | Node.js | Node-API (n-api) via runtime embutido | Ecossistema npm, frameworks web, I/O assincrono. |
| TRust | Rust | cdylib com extern "C" FFI | Bibliotecas seguras em memoria, codigo de alta performance. |
| TJava | Java | JNI (Java Native Interface) | Bibliotecas Java empresariais, integracao Android. |
| TDotNet | C# / .NET | API de hospedagem CoreCLR | Ecossistema .NET, pacotes NuGet, interoperabilidade WPF. |
| TLua | Lua | Lua C API (liblua) | Scripting leve, logica de jogos, arquivos de configuracao. |
| TRuby | Ruby | Ruby C API (libruby) | Web scraping, processamento de texto, DSLs. |
Classe Base TInteropRuntime
Os 9 controles de conectividade herdam de TInteropRuntime, uma classe base abstrata que define a interface comum para comunicacao entre linguagens. Este design garante que mudar entre linguagens requer apenas alterar o nome da classe do componente — a API permanece identica.
Propriedades Herdadas
| Propriedade | Tipo | Padrao | Descricao |
|---|---|---|---|
cLibPath | String | "" | Caminho da biblioteca compartilhada estrangeira (.so, .dll, .dylib). |
cRuntimePath | String | "" | Caminho do executavel ou VM do runtime (Python, Java, Node, etc.). |
lInitialized | Logico | .F. | Verdadeiro apos chamada bem-sucedida de Init() (somente leitura). |
lAutoShutdown | Logico | .T. | Chamar Shutdown() automaticamente ao destruir o componente. |
nLastErrorCode | Numero | 0 | Ultimo codigo de erro do runtime estrangeiro (somente leitura). |
cLastError | String | "" | Descricao da ultima mensagem de erro (somente leitura). |
Metodos Abstratos
Cada classe filha deve implementar estes metodos internos, que sao chamados pela API publica:
| Metodo | Descricao |
|---|---|
LoadLibrary( cPath ) | Carregar a biblioteca ou inicializar o runtime embutido. |
UnloadLibrary() | Liberar a biblioteca e os recursos. |
MarshalToForeign( xValue ) | Converter valores Harbour para tipos da linguagem estrangeira. |
MarshalToHarbour( foreignValue ) | Converter tipos da linguagem estrangeira de volta para Harbour. |
Padrao de API Comun
Estes metodos sao definidos em TInteropRuntime e herdados por todos os controles de conectividade:
| Metodo | Parametros | Descricao |
|---|---|---|
:Init() | configuracao | Inicializa o runtime / carrega a biblioteca. |
:Call( cFunction, ...args ) | nome da funcao + args | Chama uma funcao na linguagem estrangeira. |
:Eval( cCode ) | string de codigo fonte | Executa codigo arbitrario na linguagem estrangeira. |
:SetVar( cName, xValue ) | nome, valor | Define uma variavel no ambiente da linguagem estrangeira. |
:GetVar( cName ) | nome | Obtem o valor de uma variavel da linguagem estrangeira. |
:Shutdown() | — | Limpa e descarrega o runtime. |
Exemplo de Integracao Python
O componente TPython e o mais comumente usado entre os controles de conectividade. Ele incorpora um interpretador Python completo na sua aplicacao Harbour:
#include "hbbuilder.ch" function Main() local oPython, cResult, aData // Inicializar runtime Python oPython := TPython():New() oPython:Init() // Executar codigo Python oPython:Eval( "import math" ) cResult := oPython:Call( "math.sqrt", 144 ) ? "sqrt(144) =", cResult // 12.0 // Chamar uma funcao Python de um arquivo de script oPython:Eval( ; "def greet(name):\n" + ; " return f'Hello, {name} from Python!'\n" + ; "def process_list(items):\n" + ; " return [x**2 for x in items]" ) cResult := oPython:Call( "greet", "Harbour" ) ? cResult // "Hello, Harbour from Python!" aData := oPython:Call( "process_list", { 1, 2, 3, 4, 5 } ) // aData = {1, 4, 9, 16, 25} oPython:Shutdown() return nil
Exemplo de Integracao Node.js
oNode := TNode():New() oNode:Init() // Executar um snippet JavaScript cResult := oNode:Eval( ; "const os = require('os');" + ; "JSON.stringify({ platform: os.platform(), arch: os.arch() })" ) ? cResult // {"platform":"darwin","arch":"arm64"} oNode:Shutdown()
Exemplo de Integracao Lua
oLua := TLua():New() oLua:Init() // Definir uma variavel Harbour visivel no Lua oLua:SetVar( "app_name", "HarbourBuilder" ) // Executar codigo Lua que acessa a variavel oLua:Eval( "result = 'Hello from ' .. app_name" ) ? oLua:GetVar( "result" ) // "Hello from HarbourBuilder" oLua:Shutdown()
Exemplo de Integracao Go
Compile um pacote Go como biblioteca compartilhada:
// Fonte Go (golib.go) // export Double func Double(n C.int) C.int { return n * 2 } // Build: go build -buildmode=c-shared -o golib.so golib.go
oGo := TGo():New() oGo:cLibPath := "./golib.so" oGo:Init() ? oGo:Call( "Double", 21 ) // 42 oGo:Shutdown()
Exemplo de Integracao Rust
Compile Rust com cdylib e extern "C":
// Fonte Rust (src/lib.rs) #[no_mangle] pub extern "C" fn hash_string(s: *const c_char) -> *mut c_char { let input = unsafe { CStr::from_ptr(s).to_str().unwrap() }; let hash = format!("{:x}", md5::compute(input)); CString::new(hash).unwrap().into_raw() } // Build: cargo build --release
oRust := TRust():New() oRust:cLibPath := "./target/release/libmylib.so" oRust:Init() ? oRust:Call( "hash_string", "hello" ) // "5d41402abc4b2a76b9719d911017c592" oRust:Shutdown()
Arquitetura
Consideracoes de Desempenho
| Componente | Overhead por Chamada | Melhor Para |
|---|---|---|
| TPython | Baixo (C API direta) | Chamadas frequentes, troca de dados. |
| TLua | Muito baixo (VM minima) | Lacos apertados, scripting embutido. |
| TNode | Medio (marshalling Node-API) | Operacoes assincronas, pacotes npm. |
| TGo | Baixo (C-shared, FFI direto) | Tarefas concorrentes de alta performance. |
| TRust | Muito baixo (cdylib, custo zero) | Computacoes criticas de desempenho. |
| TJava | Medio (custo de transicao JNI) | Chamadas de bibliotecas empresariais. |
| TDotNet | Medio (hospedagem CoreCLR) | Interop de bibliotecas .NET. |
| TSwift | Baixo (C-interop) | Recursos nativos macOS/iOS. |
| TRuby | Baixo (C API) | Execucao de DSL, processamento de texto. |
Para a maioria das necessidades de scripting, TPython ou TLua sao os mais simples de configurar. Para codigo critico de desempenho, use TRust ou TGo. Para acessar recursos nativos da plataforma no macOS, use TSwift. A escolha certa depende da sua base de codigo existente e da expertise da equipe.