SPUG: Self-generating code: yea or nay? (was: Dijsktra is Dead)

Geoffrey & Kristin Grosenbach glyph at mac.com
Fri Aug 9 14:18:04 CDT 2002


I love using Perl to generate code for other languages. In a past 
project I used Perl to parse SQL stored procedures, then generate Java 
database-layer code. One might argue for a different design, but it sure 
beat monotonous copying of stored proc names, arguments, return values, 
etc.

Geoff


On Friday, August 9, 2002, at 10:12  AM, Colin Meyer wrote:

> On Thu, Aug 08, 2002 at 10:25:35PM -0700, Richard Anderson wrote:
>> Speaking of unstructured coding, I recently updated the online
>> grep/map/sort tutorial and added the example below. This got me
>> thinking: are there any cases where self-generating code is "better"
>> (in some sense) than the alternatives? I feel the answer is no - can
>> anyone provide a counter-example?
> [...]
>>
>> foreach $num (1 .. 1000) {
>>     @expr = map { '$_ % ' . $_ . ' &&' } 2 .. int sqrt $num;
>>     if (eval "grep { @expr 1 } $num") { print "$num " }
>> }
>>
>> 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 ...
>>
>> This works, but the code is such an evil mess that it made my dog
>> cry. Self-generating code is inherently difficult to read, debug
>> and modify.
>
> This example is difficult to read, but that doesn't demonstrate that
> all code generated by code is so messy.
>
> Consider the code it generates when $num == 10:
>
> @expr will be: ( '$_ % 2 &&', '$_ % 3' )
>
> the eval'd string will be: "grep { $_ % 2 && $_ % 3 && 1 } $num".
>
> Just because you chose to generate code that is odd to the typical
> Perl programmer doesn't mean that all generated code need be so odd.
>
>>
>> Look at how easy it is to understand a straightforward implementation
>> of the same algorithm:
>
> Comparing apples and oranges doesn't lend to useful conclusions.
>
> For a useful and understandable example of autogenerated code, take a
> look at something like Class::Struct (or Chapter 8 of _OO Perl_ for a
> nice analysis).
>
> A module like this demonstrates when when autogenerated code is better
> than the alternative.  It is a waste of time for the programmer to
> repeatedly hand code simple accessors, yet how many of us do so on a
> regular basis?  Why not let automate the task and let a program generate
> the code for you?
>
> For a very useful example, see Lex::HookWrap. This code may take some
> studying (or a lecture from Damian ;-) to understand. Lex::HookWrap
> autogenerates a class to unhook the hooks, when a scope is left (causing
> an object to go out of scope, and its DESTROY method to be called).
> What's the alternative to autogenerated code here? ;-) It's doable, but
> with a DESTROY method that is much thicker and less intuitive.
>
> As with many features of Perl, don't use autogenerating code, if you
> aren't comfortable with it.  When writing code that others will be
> maintaining, consider their capabilities and comfort as well.
>
> Have fun,
> -Colin.
>
>  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
> - -
>      POST TO: spug-list at pm.org       PROBLEMS: owner-spug-list at pm.org
>       Subscriptions; Email to majordomo at pm.org:  ACTION  LIST  EMAIL
>   Replace ACTION by subscribe or unsubscribe, EMAIL by your 
> Email-address
>  For daily traffic, use spug-list for LIST ;  for weekly, 
> spug-list-digest
>      Seattle Perl Users Group (SPUG) Home Page: http://seattleperl.org
>
>

http://www.GeoffreyGrosenbach.com


 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     POST TO: spug-list at pm.org       PROBLEMS: owner-spug-list at pm.org
      Subscriptions; Email to majordomo at pm.org:  ACTION  LIST  EMAIL
  Replace ACTION by subscribe or unsubscribe, EMAIL by your Email-address
 For daily traffic, use spug-list for LIST ;  for weekly, spug-list-digest
     Seattle Perl Users Group (SPUG) Home Page: http://seattleperl.org




More information about the spug-list mailing list