Python vs. Perl

Cedric Adjih adjih at crepuscule.com
Wed May 23 05:11:43 EDT 2001


Rob Nikander <nikander at mindspring.com> wrote:
> In article <slrn9gluo4.8icv.dek at socrates.cgl.ucsf.edu>, "David Konerding"
> <dek at cgl.ucsf.edu> wrote:

>>> I haven't used much Perl, but there is a huge difference from C/C++
>>> because you can do dynamic stuff like:  
>>>    str = getCommandFromSomewhere()
>>>    exec str
>> Eh, you could always add some code to your app which inserts the code
>> into a text file, compiles it, and dlopen's it, but I've never actually
>> seen somebody do that :-)
>> Dave
>
> I thought of a hack like that too... but I am not too familiar with dlopen...

The Python way is sometimes used a level higher by simply storing
all the data as Python code (or pickled code):
  writeFile("application-data.py", repr(self.getAllDataAsPythonLists()))
or
  writeFile("application-data.py", cPickle.dumps(self.allData))

and recovered with something like:
  eval(readFile("application-data.py"))
or
  cPickle.loads(readFile("application-data.py"))

which are a bit harder to do in C/C++.

> Question: The code in the exec can make reference to variables that are "local"
> to the place where "exec str" is.  It inherits the local symbols.  That is not
> going to happen with the dlopen(), right?  The "symbols" that were part
> of a C program aren't around when it is compiled and running.

  The global ones are. Thats if you have a global "double x;" in your
main C program and a shared library that declares a "extern double x;" and
uses it, at dlopen time, the external "x" symbol of the library would be
bound to the address of the "x" of the main program.

> It would be pretty cool if there was a way to do a similar thing in C (without
> reinventing Python/Lisp/etc).  Maybe adding debug info to the executable
> keeps enough symbol information around to pull this off?

  Well if you want to modify a variable in C/C++, you just
pass a pointer to it. Globals are available also with dlsym(...),
but I doubt you can manage to modify the locals of the calling
function...it would be peek and poke on the stack and fiddle with
the stack pointer ; it would be very ugly.

-- Cedric



More information about the Python-list mailing list