Software Design

Design de software em C, C++, Java, etc…

C++: Adicione um engine javascript à sua aplicação

Introdução:

Muitas vezes é necessário permitir que a sua aplicação seja extensível. Geralmente para que isso aconteça os programadores optam por criar APIs de plugins para a aplicação para que os usuários possam criar ‘plug-ins’ para ela.

Uma alternativa é adicionar um engine de javascript que vai compartilhar objetos com a sua aplicação. Ou seja, sua aplicação faz uma parte do trabalho e envia os objetos pré-processados para um script que fará um processamento adicional.

Baixando e Compilando o V8:

Você pode clonar o repositório do GIT do V8 com o comando:

git clone http://github.com/v8/v8.git v8

Entre no diretório v8 e digite:

make dependencies

Ele vai baixar os arquivos necessários para o sistema de build (GYP). Depois basta rodar:

make native

O GYP vai proceder com a compilação da biblioteca. A compilação é um pouco demorada, um café deve ajudar!!

Após a compilação copie os arquivos .a para algum diretório que o compilador utiliza para buscas ex.: /usr/lib ou /usr/local/lib. Copie também o conteúdo do diretório include para o /usr/include ou /usr/local/include.

Hello JavaScript:

Como um primeiro exemplo do uso do javascript em um programa C++, vamos fazer uma espécie de calculadora pela linha de comandos. A idéia é que o usuário vai digitar ./calc “10 * 10” e o programa deverá retornar 100. Claro que o usuário pode passar experssões mais elaboradas como: ./calc “50 * (30/2) + 12 * 7”.

Vamos ao código:

#include <stdlib.h>
#include <v8.h>

using namespace v8;

int main(int argc, char* argv[]) {
    if ( argc == 1 ) {
        printf("Use: ./calc \"expr\"");
        return -1;
    }
    // Cria o espaço para alocação de objetos na pilha
    HandleScope handle_scope;
    // Cria um novo contexto para execução dos scripts
    Persistent<Context> context = Context::New();
    // Entra no contexto para compilação/execução de scripts
    Context::Scope context_scope(context);
    // Aloca uma string contendo o conteúdo de argv[1]
    Handle<String> source = String::New(argv[1]);
    // Compila o script passado por parâmetro
    Handle<Script> script = Script::Compile(source);
    // Executa o script, salvando o retorno na variável result
    Handle<Value> result = script->Run();
    // Limpa o contexto
    context.Dispose();
    // Convert o resultado para string
    String::AsciiValue ascii(result);
    printf("%s\n", *ascii);
    return 0;
}

Alguns conceitos:

  • Um handle é um ponteiro para um objeto. Todos os objetos são acessíveis através de handles. Eles são necessários para permitir que o garbage colector do V8 funcione corretamente.
  • scope é um conteiner para os handles. No final da execução você simplesmente deleta o scope e ele fica responsável por apagar os handles contidos nele.
  • Um context é o ambiente de execução. Ele permite que códigos javascript não-relacionados sejam executados na mesma instância do V8. Por isso é necessário que você especifique qual contexto será usado para a execução dos scripts.

Compilando

Utilize o seguinte comando para compilar:

g++ helloworld.cpp -ocalc -lv8_base -lv8_snapshot -pthread

Testando

Para testar vamos executar o script passando algumas expressões e esperamos que ele nos retorne o resultado do cálculo daquela expressão. Alguns exemplos:

$ ./calc "5 * (30/2) + 8"
83
$ ./calc "5 & 1"
1
$ ./calc "'The calculation is:' + (78 * 3 / 4)"
The calculation is:58.5
$ ./calc "new Date()"
Wed Aug 29 2012 15:20:08 GMT-0300 (BRT)

Conclusão:

Javascript é uma linguagem bastante difundida e simples de utilizar, mas sozinha ela não faz nada. Seu aplicativo C++ pode tirar proveito das facilidades do javascript para extender suas funcionalidades, permitindo que terceiros consigam adicionar recursos e comunicar com seus objetos C++.

Este artigo é bastante simples, pretendo mostrar um pouco mais sobre a integração das duas linguagens em artigos mais aprofundados, explicando como funciona o gerenciamento de memória e outros recursos que o V8 oferece.

Referências:

https://developers.google.com/v8/get_started

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Informação

Publicado às agosto 29, 2012 por em C++ e marcado , , , , , .
%d blogueiros gostam disto: