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. |
Requisitos de Runtime
Cada componente de conectividade requer a respetiva toolchain instalada na maquina
host. O componente auto-deteta o binario procurando em caminhos comuns;
cRuntimePath sobrepoe a detecao se estiver definido.
Se faltar a toolchain, Start() falha, define cLastError com o
URL de instalacao e dispara bOnError. O componente nao crasha — apenas
devolve .F. / saida vazia.
| Componente | Ferramenta | Instalacao (macOS) | Caminhos auto-detetados |
|---|---|---|---|
| TPython | libpython (embutido) |
Pre-instalado no macOS, ou brew install python |
/usr/bin/python3, /opt/homebrew/bin/python3 |
| TRust | rustc |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
~/.cargo/bin/rustc, /opt/homebrew/bin/rustc, /usr/local/bin/rustc, PATH |
| TNode | node |
brew install node |
/opt/homebrew/bin/node, /usr/local/bin/node, /usr/bin/node, PATH |
| TDotNet | SDK dotnet 8+ |
brew install --cask dotnet-sdk |
/usr/local/share/dotnet/dotnet, /opt/homebrew/bin/dotnet, ~/.dotnet/dotnet, PATH |
| TJava | javac + java (JDK) |
brew install openjdk |
/opt/homebrew/opt/openjdk/bin/javac, /usr/local/opt/openjdk/bin/javac, PATH |
| TRuby | ruby |
Pre-instalado no macOS, ou brew install ruby |
/opt/homebrew/bin/ruby, /usr/local/bin/ruby, /usr/bin/ruby, PATH |
| TGo | Compilador go |
brew install go |
PATH |
| TSwift | swiftc (Xcode CLT) |
xcode-select --install |
/usr/bin/swiftc |
| TLua | lua |
brew install lua |
/opt/homebrew/bin/lua, /usr/local/bin/lua, PATH |
Modelo de Execucao
Linguagens compiladas (Rust, Go, Java, .NET, Swift) seguem um pipeline
compilar-depois-executar: fonte → binario em diretorio temporario →
execucao como subprocesso. As interpretadas (Node, Ruby, Lua) saltam o build. Python usa
libpython embutido para chamadas in-process diretas (menor overhead).
| Componente | Modo | Localizacao do artefacto |
|---|---|---|
| TRust | Compilar + executar | $TMPDIR/hbrust_*/main_* |
| TDotNet | Compilar + executar | $TMPDIR/hbdotnet_*/proj_*/bin/Release/net8.0/proj.dll |
| TJava | Compilar + executar | $TMPDIR/hbjava_*/build_*/Main.class |
| TNode | Interpretar | $TMPDIR/hbnode_*.js (apagado apos execucao) |
| TRuby | Interpretar | $TMPDIR/hbruby_*.rb (apagado apos execucao) |
| TPython | Embutido | In-process |
Eventos Comuns
| Evento | Assinatura | Quando dispara |
|---|---|---|
bOnReady | {|oSelf|} | Start() termina com sucesso. |
bOnError | {|oSelf, cMsg|} | Toolchain em falta, build falha, execucao falha. |
bOnOutput | {|oSelf, cText|} | Stdout produzido por Run() / Exec(). |
bOnBuild | {|oSelf, lOk, cBuildOutput|} | Apos Build() em runtimes compilados (TRust, TDotNet, TJava, TGo, TSwift). |
Metodos API Comuns
| Metodo | Devolve | Descricao |
|---|---|---|
Start() | Self | Auto-deteta toolchain. Define lRunning, dispara bOnReady ou bOnError. |
Stop() | Self | Marca como parado, liberta binarios temporarios (langs compilados). |
Exec( cCode ) | Logico | Compila (se preciso) + executa fonte completa. .T. em sucesso. |
Eval( cExpr ) | String | Envolve expressao, executa, devolve stdout (trim). Injeta valores de SetVar. |
Build( cSource ) | Logico | (Apenas compilados) Compila para binario temporario, guarda em cBinPath/cAssemblyPath/cClassDir. |
Run( cArgs ) | String | (Apenas compilados) Executa o ultimo build com args opcionais. Devolve stdout. |
SetVar( cName, x ) | Logico | Guarda valor injetado como let/var/= antes do proximo Eval/Exec. |
GetVar( cName ) | Qualquer | Devolve valor guardado (cache lado Harbour). |
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.