Função eval() no C/C++

450 views
Skip to first unread message

Sergio Augusto Vladisauskis

unread,
Mar 11, 2010, 2:30:33 PM3/11/10
to ccppb...@googlegroups.com
Preciso saber se existe um eval() para executar umas formulas que estão
dentro de strings, algo parecido com o que tem no PHP.
--
Sergio Augusto Vladisauskis
-> Oportunix IT Services Brasil - ME
-> Site: http://www.oportunix.com.br
-> Fone: +55 11 4221 8163
-> Móvel: +55 11 8017 5065
-> Skype: sergiovl-work
-> Registered Linux User: 305281

P.

unread,
Mar 13, 2010, 8:36:18 AM3/13/10
to ccppbrasil
On 11 mar, 16:30, Sergio Augusto Vladisauskis <sergi...@gmail.com>
wrote:

> Preciso saber se existe um eval() para executar umas formulas que estão
> dentro de strings, algo parecido com o que tem no PHP.

Não existe.

O equivalente seria:

1. Escrever as fórmulas como programa C e escrevê-lo em um arquivo.
2. Criar um novo processo para executar o compilador e compilar o
programa em (1).
3. Criar um novo processo para executar o programa gerado em (2).

--
P.

B. C.

unread,
Mar 13, 2010, 8:44:53 AM3/13/10
to ccppb...@googlegroups.com


2010/3/11 Sergio Augusto Vladisauskis <serg...@gmail.com>

Preciso saber se existe um eval() para executar umas formulas que estão
dentro de strings, algo parecido com o que tem no PHP.

Não não há... o suporte a metaprogramação em C++ é um pouco diferente. Nativamente C++ não possue este suporte.

A quem utilize Lua para esta propósito, pois ela tem este suporte dinâmico, mas aí já não é C++; mas sim uma linguagem estática, embutindo uma linguagem dinâmica para dar suporte.

Há outras opções, ja vi (algora não me lembro o nome) de uma VM C++ que vc embute no programa para conseguir  este suporte dinâmico, mas não lembro-me agora o nome dela; porém não é recurso nativo de C++. Mas lembro-me de um colega que o utilizou e dependendo do uso seu programa consumia memória em proporções dantescas.

 
--
Sergio Augusto Vladisauskis
-> Oportunix IT Services Brasil - ME
-> Site: http://www.oportunix.com.br
-> Fone: +55 11 4221 8163
-> Móvel: +55 11 8017 5065
-> Skype: sergiovl-work
-> Registered Linux User: 305281

--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Sugestão de Conteúdo para Eventos do Grupo C & C++ Brasil
[&] http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira:  vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en

Sergio Augusto Vladisauskis

unread,
Mar 13, 2010, 11:58:17 AM3/13/10
to ccppb...@googlegroups.com
Já resolvi galera, graças a esse link:
http://www8.cs.umu.se/~isak/Snippets/eval.c
Obrigado pelas dicas.

PS: o programa que fiz utilizando essas funções realizam 362880 operações
matemáticas em 3.8s.

B. C.

unread,
Mar 13, 2010, 12:21:18 PM3/13/10
to ccppb...@googlegroups.com
Nossa, agora entendi realmente o que você desejava... no fundo não era exatamente um eval; mas um interpretador de expressões matemáticas no qual um eval poderia atender...


2010/3/13 Sergio Augusto Vladisauskis <serg...@gmail.com>
[&] Colabore com a Pesquisa de Preferência de Conteúdo
             para Eventos do Grupo C & C++ Brasil:

Blabos de Blebe

unread,
Mar 13, 2010, 1:32:59 PM3/13/10
to ccppb...@googlegroups.com
Mesmo não sendo o que você procurava e já tendo o problema resolvido,
tem sempre a opção de embutir na aplicação Lua, Perl, Python, etc.

2010/3/13 B. C. <banc...@gmail.com>:

B. C.

unread,
Mar 13, 2010, 1:53:15 PM3/13/10
to ccppb...@googlegroups.com
Blabos,

  Como eu já comentei anteriormente, não sou o papa de C++, apesar de ser um analista senior em C++, mas me viro bem; aliás dizem que é por isto sou senior! :-)

  Eu também gosto muito desta opção de aplicar um tempero dinâmico ao sistema, porém as vezes isto não é possível por n variáveis, de qualquer forma meu candidato quase sempre é Lua.  

   E olha que já fui fã de Perl e hoje sou Python desde criancinha.

2010/3/13 Blabos de Blebe <bla...@gmail.com>

Rodrigo Kumpera

unread,
Mar 13, 2010, 2:29:09 PM3/13/10
to ccppb...@googlegroups.com
100k operações por segundo me parece bem lento.
Suponho que performance não seja um problema p/ você.

2010/3/13 Sergio Augusto Vladisauskis <serg...@gmail.com>
Já resolvi galera, graças a esse link:
[&] Colabore com a Pesquisa de Preferência de Conteúdo
             para Eventos do Grupo C & C++ Brasil:

Sergio Augusto Vladisauskis

unread,
Mar 13, 2010, 6:40:18 PM3/13/10
to ccppb...@googlegroups.com
É possível executar mais rápido ainda?


On Sat, 13 Mar 2010 16:29:09 -0300, Rodrigo Kumpera <kum...@gmail.com>
wrote:

Sergio Augusto Vladisauskis

unread,
Mar 13, 2010, 6:43:20 PM3/13/10
to ccppb...@googlegroups.com
Pois é, não me expressei bem, estava precisando uma função que fosse bem
parecida com o eval do PHP, pois passei esse script de PHP para C por causa
da performance, no PHP é sofrível, 16 minutos contra 3.8 segundos no C.

Sergio Augusto Vladisauskis

unread,
Mar 13, 2010, 6:44:54 PM3/13/10
to ccppb...@googlegroups.com
Sou iniciante em C, mas a intenção era a performance.

On Sat, 13 Mar 2010 15:32:59 -0300, Blabos de Blebe <bla...@gmail.com>
wrote:

max

unread,
Mar 13, 2010, 7:55:28 PM3/13/10
to ccppb...@googlegroups.com


Tu pode passar o teu programa por um profiler como o gprof (eu não sei
de nenhuma alternativa para outras plataformas que não sejam em cima
do GCC) e ver onde que acontece o "gargalo".

100k operações/segundo não parece grandes coisas mesmo, mas fora de
todo o contexto eu acho difícil dizer se é ou não realmente lento (por
exemplo, depende do hardware onde roda, o código propriamente dito, se
tu usou ou não as opções de otimização do compilador, se o binário
tinha ou não símbolos de depuração e etc.).

Com o C tu tem sim a possibilidade de executar muito mais rápido mas a
linguagem em si não faz milagre quando o algoritmo não é dos melhores.
:)

Rodrigo Kumpera

unread,
Mar 13, 2010, 8:11:14 PM3/13/10
to ccppb...@googlegroups.com
Se performance é um problema, basta usar algo que te permita
gerar código eficiente durante execução. Você usar algo como llvm,
C--, libfirm ou mesmo embutir uma VM que gere código eficiente como
mono ou uma JVM.

Sergio Augusto Vladisauskis

unread,
Mar 14, 2010, 10:34:29 AM3/14/10
to ccppb...@googlegroups.com
Vou realizar mais uns testes mas da forma que está, melhor 100% do que
precisava.
Obrigado pelas dicas galera.


On Sat, 13 Mar 2010 22:11:14 -0300, Rodrigo Kumpera <kum...@gmail.com>
wrote:

Alex Queiroz

unread,
Mar 14, 2010, 3:48:12 PM3/14/10
to ccppb...@googlegroups.com
Hallo,

2010/3/13 Rodrigo Kumpera <kum...@gmail.com>:


> Se performance é um problema, basta usar algo que te permita
> gerar código eficiente durante execução. Você usar algo como llvm,
> C--, libfirm ou mesmo embutir uma VM que gere código eficiente como
> mono ou uma JVM.
>

LuaJIT 2.0 ainda está em beta, mas já bate Java -server em vários
benchmarks, e deixa Mono para trás.

http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=all&box=1

-alex

Rodrigo Kumpera

unread,
Mar 14, 2010, 5:47:52 PM3/14/10
to ccppb...@googlegroups.com
Se tudo que quiser rodar forem benchmarks, vai fundo. Ou aplicações
muito curtas. Para todo o resto, trace compilers não são muito
vantajosos.

> --
> Antes de enviar um e-mail para o grupo leia:
> http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
> --~--~---------~--~----~---------------------------------~----------~--~----~
> [&] Colabore com a Pesquisa de Preferência de Conteúdo
> para Eventos do Grupo C & C++ Brasil:
> http://www.surveymonkey.com/s/GBBGTXN
> ------~----~-------~---~---~---~---~----------------~------------~---------~
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> Para sair dessa lista, envie um e-mail para
> ccppbrasil-...@googlegroups.com
> Para mais opções, visite http://groups.google.com/group/ccppbrasil
> --~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
> Emprego & carreira: vag...@ccppbrasil.org
> http://groups.google.com/group/dev-guys?hl=en
>

--
Sent from my mobile device

Alex Queiroz

unread,
Mar 14, 2010, 7:22:22 PM3/14/10
to ccppb...@googlegroups.com
Hallo,

2010/3/14 Rodrigo Kumpera <kum...@gmail.com>:


> Se tudo que quiser rodar forem benchmarks, vai fundo. Ou aplicações
> muito curtas. Para todo o resto, trace compilers não são muito
> vantajosos.
>

As milhares de linhas de código testadas diariamente pelos
frequentadores na lua-l discordam. Mas se "não são muito vantajosos"
quer dizer "não batem Mono em todos os programas grandes possíveis",
pode ser que isso não seja um requisito do Sérgio.

-alex

Rodrigo Kumpera

unread,
Mar 14, 2010, 9:05:25 PM3/14/10
to ccppb...@googlegroups.com
Minha sugestão fica para então testar e conferir.
Tracing JITs tem muito problema com bases de código grandes, cheias de
condicionais ou com sites megamórficos. Isso é uma característica da
forma como funcionam e não uma limitação do luajit2.
Mas provavelmente para o caso aqui em questão, um avaliador de
expressões matemáticas, nenhuma dessas limitações aplicam.

On 3/14/10, Alex Queiroz <asan...@gmail.com> wrote:

Rodrigo Mizobe

unread,
Mar 14, 2010, 9:16:17 PM3/14/10
to ccppb...@googlegroups.com
Minha sugestão nesse caso seria embarcar um script perl para a manipulação das strings...
Reply all
Reply to author
Forward
0 new messages