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.

Chame Qualquer Linguagem a Partir do Harbour

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

ComponenteLinguagemMecanismoCaso de Uso
TPythonPythonPython C API (libpython)Pipelines de ML, ciencia de dados, scripting, automacao.
TSwiftSwiftC-interop via @_cdeclAPIs nativas macOS/iOS, pacotes Swift.
TGoGoBiblioteca compartilhada cgo (buildmode=c-shared)Workers concorrentes, microsservicos, criptografia.
TNodeNode.jsNode-API (n-api) via runtime embutidoEcossistema npm, frameworks web, I/O assincrono.
TRustRustcdylib com extern "C" FFIBibliotecas seguras em memoria, codigo de alta performance.
TJavaJavaJNI (Java Native Interface)Bibliotecas Java empresariais, integracao Android.
TDotNetC# / .NETAPI de hospedagem CoreCLREcossistema .NET, pacotes NuGet, interoperabilidade WPF.
TLuaLuaLua C API (liblua)Scripting leve, logica de jogos, arquivos de configuracao.
TRubyRubyRuby 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.

classDiagram class TInteropRuntime { +string cLibPath +string cRuntimePath +logical lInitialized +logical lAutoShutdown +Init() +Eval(cCode) +Call(cFunction, ...args) +SetVar(cName, xValue) +GetVar(cName) +Shutdown() #LoadLibrary(cPath)* #UnloadLibrary()* #MarshalToForeign(xValue)* #MarshalToHarbour(foreignValue)* } TInteropRuntime <|-- TPython TInteropRuntime <|-- TNode TInteropRuntime <|-- TLua TInteropRuntime <|-- TGo TInteropRuntime <|-- TRust TInteropRuntime <|-- TJava TInteropRuntime <|-- TDotNet TInteropRuntime <|-- TSwift TInteropRuntime <|-- TRuby style TInteropRuntime fill:#58a6ff,stroke:#388bfd,color:#0d1117

Propriedades Herdadas

PropriedadeTipoPadraoDescricao
cLibPathString""Caminho da biblioteca compartilhada estrangeira (.so, .dll, .dylib).
cRuntimePathString""Caminho do executavel ou VM do runtime (Python, Java, Node, etc.).
lInitializedLogico.F.Verdadeiro apos chamada bem-sucedida de Init() (somente leitura).
lAutoShutdownLogico.T.Chamar Shutdown() automaticamente ao destruir o componente.
nLastErrorCodeNumero0Ultimo codigo de erro do runtime estrangeiro (somente leitura).
cLastErrorString""Descricao da ultima mensagem de erro (somente leitura).

Metodos Abstratos

Cada classe filha deve implementar estes metodos internos, que sao chamados pela API publica:

MetodoDescricao
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:

MetodoParametrosDescricao
:Init()configuracaoInicializa o runtime / carrega a biblioteca.
:Call( cFunction, ...args )nome da funcao + argsChama uma funcao na linguagem estrangeira.
:Eval( cCode )string de codigo fonteExecuta codigo arbitrario na linguagem estrangeira.
:SetVar( cName, xValue )nome, valorDefine uma variavel no ambiente da linguagem estrangeira.
:GetVar( cName )nomeObtem 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

graph TB A["Aplicacao Harbour\n(.prg → .hrb)"] --> B["TInteropRuntime\nBase Class"] B --> C1["TPython\nlibpython"] B --> C2["TNode\nNode-API"] B --> C3["TLua\nliblua"] B --> C4["TGo\nc-shared .so"] B --> C5["TRust\ncdylib FFI"] B --> C6["TJava\nJNI"] B --> C7["TDotNet\nCoreCLR"] B --> C8["TSwift\n@_cdecl"] B --> C9["TRuby\nlibruby"] C1 --> D1["Python\nInterpreter"] C2 --> D2["Node.js\nRuntime"] C3 --> D3["Lua\nVM"] C4 --> D4["Go\n.so"] C5 --> D5["Rust\ncdylib"] C6 --> D6["Java\nJVM"] C7 --> D7[".NET\nCLR"] C8 --> D8["Swift\n@_cdecl"] C9 --> D9["Ruby\nVM"] style A fill:#d2a8ff,stroke:#bc8cff,color:#0d1117 style B fill:#58a6ff,stroke:#388bfd,color:#0d1117

Consideracoes de Desempenho

ComponenteOverhead por ChamadaMelhor Para
TPythonBaixo (C API direta)Chamadas frequentes, troca de dados.
TLuaMuito baixo (VM minima)Lacos apertados, scripting embutido.
TNodeMedio (marshalling Node-API)Operacoes assincronas, pacotes npm.
TGoBaixo (C-shared, FFI direto)Tarefas concorrentes de alta performance.
TRustMuito baixo (cdylib, custo zero)Computacoes criticas de desempenho.
TJavaMedio (custo de transicao JNI)Chamadas de bibliotecas empresariais.
TDotNetMedio (hospedagem CoreCLR)Interop de bibliotecas .NET.
TSwiftBaixo (C-interop)Recursos nativos macOS/iOS.
TRubyBaixo (C API)Execucao de DSL, processamento de texto.
Escolhendo uma Linguagem

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.

Nesta Página

Linguagens Suportadas Classe Base TInteropRuntime Propriedades Herdadas Metodos Abstratos Padrao de API Comun Exemplo de Integracao Python Exemplo de Integracao Node.js Exemplo de Integracao Lua Exemplo de Integracao Go Exemplo de Integracao Rust Arquitetura Consideracoes de Desempenho