<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Interoperability Happens - LLVM</title>
    <link>http://blogs.tedneward.com/</link>
    <description>Ted's takes on the enterprise Java, .NET and Web services communities and technologies</description>
    <copyright>Ted Neward</copyright>
    <lastBuildDate>Thu, 09 Sep 2010 03:53:01 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.7067.0</generator>
    <managingEditor>tneward@tedneward.com</managingEditor>
    <webMaster>tneward@tedneward.com</webMaster>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=bd7339e6-fdd5-4f2a-b711-de9a38f6c743</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,bd7339e6-fdd5-4f2a-b711-de9a38f6c743.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,bd7339e6-fdd5-4f2a-b711-de9a38f6c743.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=bd7339e6-fdd5-4f2a-b711-de9a38f6c743</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Hey, anybody who’s got significant VMWare mojo, help out a bro?
</p>
        <p>
I’ve got a Win7 VM (one of many) that appears to be exhibiting weird disk behavior—the
vmdk, a growable single-file VMDK, is almost precisely twice the used space. It’s
a 120GB growable disk, and the Win7 guest reports about 35GB used, but the VMDK takes
about 70GB on host disk. CHKDSK inside Windows says everything’s good, and the VMWare
“Disk Cleanup” doesn’t change anything, either. It doesn’t seem to be a Windows7 thing,
because I’ve got a half-dozen other Win7 VMs that operate… well, normally (by which
I mean, 30GB used in the VMDK means 30GB used on disk). It’s a VMWare Fusion host,
if that makes any difference. Any other details that might be relevant, let me know
and I’ll post.
</p>
        <p>
Anybody got any ideas what the heck is going on inside this disk?
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=bd7339e6-fdd5-4f2a-b711-de9a38f6c743" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>VMWare help</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,bd7339e6-fdd5-4f2a-b711-de9a38f6c743.aspx</guid>
      <link>http://blogs.tedneward.com/2010/09/09/VMWare+Help.aspx</link>
      <pubDate>Thu, 09 Sep 2010 03:53:01 GMT</pubDate>
      <description>&lt;p&gt;
Hey, anybody who’s got significant VMWare mojo, help out a bro?
&lt;/p&gt;
&lt;p&gt;
I’ve got a Win7 VM (one of many) that appears to be exhibiting weird disk behavior—the
vmdk, a growable single-file VMDK, is almost precisely twice the used space. It’s
a 120GB growable disk, and the Win7 guest reports about 35GB used, but the VMDK takes
about 70GB on host disk. CHKDSK inside Windows says everything’s good, and the VMWare
“Disk Cleanup” doesn’t change anything, either. It doesn’t seem to be a Windows7 thing,
because I’ve got a half-dozen other Win7 VMs that operate… well, normally (by which
I mean, 30GB used in the VMDK means 30GB used on disk). It’s a VMWare Fusion host,
if that makes any difference. Any other details that might be relevant, let me know
and I’ll post.
&lt;/p&gt;
&lt;p&gt;
Anybody got any ideas what the heck is going on inside this disk?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=bd7339e6-fdd5-4f2a-b711-de9a38f6c743" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,bd7339e6-fdd5-4f2a-b711-de9a38f6c743.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
      <category>XNA</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=479e3371-5ecf-4379-b9d4-f7cf070aae82</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,479e3371-5ecf-4379-b9d4-f7cf070aae82.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,479e3371-5ecf-4379-b9d4-f7cf070aae82.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=479e3371-5ecf-4379-b9d4-f7cf070aae82</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
By now, the Twitter messages have spread, and the word is out: at Uberconf this year,
I did a session ("Pragmatic Architecture"), which I've done at other venues
before, but this time we made it into a 180-minute workshop instead of a 90-minute
session, and the workshop included breaking the room up into small (10-ish, which
was still a teensy bit too big) groups and giving each one an "architectural
kata" to work on.
</p>
        <p>
The architectural kata is a take on PragDave's coding kata, except taken to a higher
level: the architectural kata is an exercise in which the group seeks to create an
architecture to solve the problem presented. The inspiration for this came from Frederick
Brooks' latest book, <em>The Design of Design</em>, in which he points out that the
only way to get great designers is to get them to design. The corollary, of course,
is that in order to create great architects, we have to get them to architect. But
few architects get a chance to architect a system more than a half-dozen times or
so over the lifetime of a career, and that's only for those who are fortunate to be
given the opportunity to architect in the first place. Of course, the problem here
is, you have to be an architect in order to get hired as an architect, but if you're
not an architect, then how can you architect in order to become an architect?
</p>
        <p>
Um... hang on, let me make sure I wrote that right.
</p>
        <p>
Anyway, the "rules" around the kata (which makes it more difficult to consume
the kata but makes the scenario more realistic, IMHO):
</p>
        <ul>
          <li>
you may ask the instructor questions about the project</li>
          <li>
you must be prepared to present a rough architectural vision of the project and defend
questions about it</li>
          <li>
you must be prepared to ask questions of other participants' presentations</li>
          <li>
you may safely make assumptions about technologies you don't know well as long as
those assumptions are clearly defined and spelled out</li>
          <li>
you may not assume you have hiring/firing authority over the development team</li>
          <li>
any technology is fair game (but you must justify its use)</li>
          <li>
any other rules, you may ask about</li>
        </ul>
        <p>
The groups were given 30 minutes in which to formulate some ideas, and then three
of them were given a few minutes to present their ideas and defend it against some
questions from the crowd.
</p>
        <p>
An example kata is below:
</p>
        <blockquote>
          <p>
            <strong>Architectural Kata #5: I'll have the BLT</strong>
          </p>
          <p>
a national sandwich shop wants to enable "fax in your order" but over the
Internet instead
</p>
          <p>
users: millions+
</p>
          <p>
requirements: users will place their order, then be given a time to pick up their
sandwich and directions to the shop (which must integrate with Google Maps); if the
shop offers a delivery service, dispatch the driver with the sandwich to the user;
mobile-device accessibility; offer national daily promotionals/specials; offer local
daily promotionals/specials; accept payment online or in person/on delivery
</p>
        </blockquote>
        <p>
As you can tell, it's vague in some ways, and this is somewhat deliberate—as one group
discovered, part of the architect's job is to ask questions of the project champion
(me), and they didn't, and felt like they failed pretty miserably. (In their defense,
the kata they drew—randomly—was pretty much universally thought to be the hardest
of the lot.) But overall, the exercise was well-received, lots of people found it
a great opportunity to try being an architect, and even the team that failed felt
that it was a valuable exercise.
</p>
        <p>
I'm definitely going to do more of these, and refine the whole thing a little. (Thanks
to everyone who participated and gave me great feedback on how to make it better.)
If you're interested in having it done as a practice exercise for your development
team before the start of a big project, ping me. I think this would be a *great* exercise
to do during a user group meeting, too.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=479e3371-5ecf-4379-b9d4-f7cf070aae82" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Architectural Katas</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,479e3371-5ecf-4379-b9d4-f7cf070aae82.aspx</guid>
      <link>http://blogs.tedneward.com/2010/06/17/Architectural+Katas.aspx</link>
      <pubDate>Thu, 17 Jun 2010 08:42:47 GMT</pubDate>
      <description>&lt;p&gt;
By now, the Twitter messages have spread, and the word is out: at Uberconf this year,
I did a session (&amp;quot;Pragmatic Architecture&amp;quot;), which I've done at other venues
before, but this time we made it into a 180-minute workshop instead of a 90-minute
session, and the workshop included breaking the room up into small (10-ish, which
was still a teensy bit too big) groups and giving each one an &amp;quot;architectural
kata&amp;quot; to work on.
&lt;/p&gt;
&lt;p&gt;
The architectural kata is a take on PragDave's coding kata, except taken to a higher
level: the architectural kata is an exercise in which the group seeks to create an
architecture to solve the problem presented. The inspiration for this came from Frederick
Brooks' latest book, &lt;em&gt;The Design of Design&lt;/em&gt;, in which he points out that the
only way to get great designers is to get them to design. The corollary, of course,
is that in order to create great architects, we have to get them to architect. But
few architects get a chance to architect a system more than a half-dozen times or
so over the lifetime of a career, and that's only for those who are fortunate to be
given the opportunity to architect in the first place. Of course, the problem here
is, you have to be an architect in order to get hired as an architect, but if you're
not an architect, then how can you architect in order to become an architect?
&lt;/p&gt;
&lt;p&gt;
Um... hang on, let me make sure I wrote that right.
&lt;/p&gt;
&lt;p&gt;
Anyway, the &amp;quot;rules&amp;quot; around the kata (which makes it more difficult to consume
the kata but makes the scenario more realistic, IMHO):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
you may ask the instructor questions about the project&lt;/li&gt;
&lt;li&gt;
you must be prepared to present a rough architectural vision of the project and defend
questions about it&lt;/li&gt;
&lt;li&gt;
you must be prepared to ask questions of other participants' presentations&lt;/li&gt;
&lt;li&gt;
you may safely make assumptions about technologies you don't know well as long as
those assumptions are clearly defined and spelled out&lt;/li&gt;
&lt;li&gt;
you may not assume you have hiring/firing authority over the development team&lt;/li&gt;
&lt;li&gt;
any technology is fair game (but you must justify its use)&lt;/li&gt;
&lt;li&gt;
any other rules, you may ask about&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The groups were given 30 minutes in which to formulate some ideas, and then three
of them were given a few minutes to present their ideas and defend it against some
questions from the crowd.
&lt;/p&gt;
&lt;p&gt;
An example kata is below:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Architectural Kata #5: I'll have the BLT&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
a national sandwich shop wants to enable &amp;quot;fax in your order&amp;quot; but over the
Internet instead
&lt;/p&gt;
&lt;p&gt;
users: millions+
&lt;/p&gt;
&lt;p&gt;
requirements: users will place their order, then be given a time to pick up their
sandwich and directions to the shop (which must integrate with Google Maps); if the
shop offers a delivery service, dispatch the driver with the sandwich to the user;
mobile-device accessibility; offer national daily promotionals/specials; offer local
daily promotionals/specials; accept payment online or in person/on delivery
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
As you can tell, it's vague in some ways, and this is somewhat deliberate—as one group
discovered, part of the architect's job is to ask questions of the project champion
(me), and they didn't, and felt like they failed pretty miserably. (In their defense,
the kata they drew—randomly—was pretty much universally thought to be the hardest
of the lot.) But overall, the exercise was well-received, lots of people found it
a great opportunity to try being an architect, and even the team that failed felt
that it was a valuable exercise.
&lt;/p&gt;
&lt;p&gt;
I'm definitely going to do more of these, and refine the whole thing a little. (Thanks
to everyone who participated and gave me great feedback on how to make it better.)
If you're interested in having it done as a practice exercise for your development
team before the start of a big project, ping me. I think this would be a *great* exercise
to do during a user group meeting, too.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=479e3371-5ecf-4379-b9d4-f7cf070aae82" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,479e3371-5ecf-4379-b9d4-f7cf070aae82.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>WCF</category>
      <category>XML Services</category>
      <category>XNA</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=0e4f9c86-b602-42d7-8729-662d855fd69f</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,0e4f9c86-b602-42d7-8729-662d855fd69f.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,0e4f9c86-b602-42d7-8729-662d855fd69f.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0e4f9c86-b602-42d7-8729-662d855fd69f</wfw:commentRss>
      <slash:comments>13</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://codekata.pragprog.com/2007/01/code_katahow_it.html" target="_blank">Code
Katas</a> are small, relatively simple exercises designed to give you a problem to
try and solve. I like to use them as a way to get my feet wet and help write something
more interesting than "Hello World" but less complicated than "The
Internet's Next Killer App".
</p>
        <p>
 
</p>
        <p>
          <a href="http://richardminerich.com/2010/04/the-ted-neward-f-folding-challenge/" target="_blank">Rick
Minerich</a> mentioned this one on his blog already, but here is the original "problem"/challenge
as it was presented to me and which I in turn shot to him over a Twitter DM:
</p>
        <p>
 
</p>
        <p>
I have a list, say something like [4, 4, 4, 4, 2, 2, 2, 3, 3, 2, 2, 2, 2, 1, 1, 1,
5, 5], which consists of varying repetitions of integers. (We can assume that it's
always numbers, and the use of the term "list" here is generic—it could
be a list, array, or some other collection class, your choice.) The goal is to take
this list of numbers, and "compress" it down into a (theoretically smaller)
list of numbers in pairs, where the first of the pair is the occurrence number of
the value, which is the second number. So, since the list above has four 4's, followed
by three 2's, two 3's, four 2's, three 1's and two 5's, it should compress into [4,
4, 3, 2, 2, 3, 3, 1, 2, 5]. 
</p>
        <blockquote>
          <p>
            <strong>Update:</strong> Typo! It should compress into [4, 4, 3, 2, 2, 3, 4, 2, 3,
1, 2, 5], not [4, 4, 3, 2, 2, 3, 3, 1, 2, 5]. Sorry!
</p>
        </blockquote>
        <p>
Using your functional language of choice, implement a solution. (No looking at Rick's
solution first, by the way—that's cheating!) Feel free to post proposed solutions
here as comments, by the way.
</p>
        <p>
 
</p>
        <p>
This is a pretty easy challenge, but I wanted to try and solve it in a functional
mindset, which the challenger had never seen before. I also thought it made for an
interesting challenge for people who've never programming in functional languages
before, because it requires a very different approach than the imperative solution.
</p>
        <p>
 
</p>
        <p>
Extensions to the kata (a.k.a. "extra credit"):
</p>
        <ul>
          <li>
How does the implementation change (if any) to generalize it to a list of any particular
type? (Assume the list is of homogenous type—always strings, always ints, always whatever.)</li>
          <li>
How does the implementation change (if any) to generalize it to a list of any type?
(In other words, a list of strings, ints, Dates, whatever, mixed together within the
list: [1, 1, "one", "one", "one", ...] .)</li>
          <li>
How does the implementation change (if any) to generate a list of two-item tuples
(the first being the occurence, the second being the value) as the result instead?
Are there significant advantages to this?</li>
          <li>
How does the implementation change (if any) to parallelize/multi-thread it? For your
particular language how many elements have to be in the list before doing so yields
a significant payoff?</li>
        </ul>
        <p>
By the way, some of the extension questions make the Kata somewhat interesting even
for the imperative/O-O developer; have at, and let me know what you think.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0e4f9c86-b602-42d7-8729-662d855fd69f" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Code Kata: Compressing Lists</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,0e4f9c86-b602-42d7-8729-662d855fd69f.aspx</guid>
      <link>http://blogs.tedneward.com/2010/05/06/Code+Kata+Compressing+Lists.aspx</link>
      <pubDate>Thu, 06 May 2010 21:42:09 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://codekata.pragprog.com/2007/01/code_katahow_it.html" target="_blank"&gt;Code
Katas&lt;/a&gt; are small, relatively simple exercises designed to give you a problem to
try and solve. I like to use them as a way to get my feet wet and help write something
more interesting than &amp;quot;Hello World&amp;quot; but less complicated than &amp;quot;The
Internet's Next Killer App&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://richardminerich.com/2010/04/the-ted-neward-f-folding-challenge/" target="_blank"&gt;Rick
Minerich&lt;/a&gt; mentioned this one on his blog already, but here is the original &amp;quot;problem&amp;quot;/challenge
as it was presented to me and which I in turn shot to him over a Twitter DM:
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
I have a list, say something like [4, 4, 4, 4, 2, 2, 2, 3, 3, 2, 2, 2, 2, 1, 1, 1,
5, 5], which consists of varying repetitions of integers. (We can assume that it's
always numbers, and the use of the term &amp;quot;list&amp;quot; here is generic—it could
be a list, array, or some other collection class, your choice.) The goal is to take
this list of numbers, and &amp;quot;compress&amp;quot; it down into a (theoretically smaller)
list of numbers in pairs, where the first of the pair is the occurrence number of
the value, which is the second number. So, since the list above has four 4's, followed
by three 2's, two 3's, four 2's, three 1's and two 5's, it should compress into [4,
4, 3, 2, 2, 3, 3, 1, 2, 5]. 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; Typo! It should compress into [4, 4, 3, 2, 2, 3, 4, 2, 3,
1, 2, 5], not [4, 4, 3, 2, 2, 3, 3, 1, 2, 5]. Sorry!
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Using your functional language of choice, implement a solution. (No looking at Rick's
solution first, by the way—that's cheating!) Feel free to post proposed solutions
here as comments, by the way.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
This is a pretty easy challenge, but I wanted to try and solve it in a functional
mindset, which the challenger had never seen before. I also thought it made for an
interesting challenge for people who've never programming in functional languages
before, because it requires a very different approach than the imperative solution.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Extensions to the kata (a.k.a. &amp;quot;extra credit&amp;quot;):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
How does the implementation change (if any) to generalize it to a list of any particular
type? (Assume the list is of homogenous type—always strings, always ints, always whatever.)&lt;/li&gt;
&lt;li&gt;
How does the implementation change (if any) to generalize it to a list of any type?
(In other words, a list of strings, ints, Dates, whatever, mixed together within the
list: [1, 1, &amp;quot;one&amp;quot;, &amp;quot;one&amp;quot;, &amp;quot;one&amp;quot;, ...] .)&lt;/li&gt;
&lt;li&gt;
How does the implementation change (if any) to generate a list of two-item tuples
(the first being the occurence, the second being the value) as the result instead?
Are there significant advantages to this?&lt;/li&gt;
&lt;li&gt;
How does the implementation change (if any) to parallelize/multi-thread it? For your
particular language how many elements have to be in the list before doing so yields
a significant payoff?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
By the way, some of the extension questions make the Kata somewhat interesting even
for the imperative/O-O developer; have at, and let me know what you think.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0e4f9c86-b602-42d7-8729-662d855fd69f" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,0e4f9c86-b602-42d7-8729-662d855fd69f.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>C#</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Visual Basic</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=6b75f874-1ce8-485b-b0ec-72c0e7f2ad38</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,6b75f874-1ce8-485b-b0ec-72c0e7f2ad38.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,6b75f874-1ce8-485b-b0ec-72c0e7f2ad38.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6b75f874-1ce8-485b-b0ec-72c0e7f2ad38</wfw:commentRss>
      <slash:comments>14</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
... with my earlier <a href="http://blogs.tedneward.com/2010/03/23/How+To+And+Not+To+Give+A+Talk+On+F.aspx" target="_blank">speaking
about F#</a> post, which I will admit, surprises me, since I would've thought somebody
interested in promoting F# would've been more supportive of the idea of putting some
ideas out to help other speakers get F# more easily adopted by the community. Perhaps
I misunderstood her objections, but I thought a response was required in any event.
</p>
        <p>
Amanda opens with:
</p>
        <blockquote>
          <p>
Let's start with the "Do" category.
</p>
        </blockquote>
        <p>
OK, then, let's. :-)
</p>
        <blockquote>
          <p>
First you say you want the speaker to show inheritance... in a functional-first language.
This is an obvious no-no. Inheritance should be used extremely lightly in any language
and it should be hidden completely in F#. You should NEVER have a student/instructor/employee
inherit from a person. This language isn't used that way. 
</p>
        </blockquote>
        <p>
That's odd.... that's entirely contradictory to what I've heard from the F# team.
I've never heard anyone on the F# team ever call it a "functional-first"
language, nor that inheritance (or any other object-oriented feature) is something
that should be used "extremely lightly" or "hidden completely".
Quite the contrary, in fact; when I did a tag-team presentation on F# with Luke Hoban,
the PM of the F# team, he gently corrected my use of the phrase describing F# as a
"functional-object hybrid" language to suggest instead that it was a "fusion"
of both features.
</p>
        <p>
But even if that's not the case (or perhaps isn't the case anymore), I think it's
critical to give audience members something concrete and familiar to hang onto as
they start the roller-coaster ride of learning not only a new syntax, but new concepts.
To simply say, "Everything you know from objects is wrong" is to do them
a disservice, particularly when the language clearly is intended to expose object-oriented
concepts as a first-class citizen.
</p>
        <blockquote>
          <p>
Second you say to show interop. This will show nothing about the language. You might
as well just say it is a .net language. If you spend your F# session discussing what
it means to be on .net, you fail. Nobody expects that one dll will not be able to
call another. If they do, I assure you that they will not be writing F# anytime soon. 
</p>
        </blockquote>
        <p>
Ah, but here is where my decades of experience teaching languages to audiences all
over the world kicks in: they don't know that. DLLs are not all created equal, as
anyone who's ever tried to get COM components to interop with native C++ DLLs that
in turn want to call into managed code DLLs will tell you. It's important to stress,
again, that what they know is still relevant in this new world. In fact, the goal
of showing them interoperability is to reassure them that, in fact, it's not a new
world at all, but simply a different spin on the world they already know and love.
</p>
        <blockquote>
          <p>
Next you say give concrete examples of where F# is a win. This is a sales pitch. It's
fine for some audiences but if you intend to teach F# to the audience, you likely
are already there. Just make sure your examples are real world and you should be fine.
I challenge you to make your next blog a "Why F#" which contains real world
examples. I've not ever heard you give valuable advice about when to use F#. Also
please post what your real world experience is with F#. Where did you implement a
solution? What was that project like? Why was F# the best choice? 
</p>
        </blockquote>
        <p>
Interesting. Based on the conversations I've had with others, the main reason people
come to technical talks, at least the talks I've been to (both as an audience member
and as a speaker) is to know when and where and how they can use this technology (whatever
it is) to solve the problems they face. That means that they need to see and hear
where a technology fits well as a solution against a given problem domain or case,
and the sooner they get that information, the sooner they can start to evaluate where,
how and when they should use a particular technology. This has been true of almost
every "new" technology I've evaluated—from the more recent presentations
and articles around WCF, Workflow, MongoDB and Axum to the older talks/trainings I've
given for C#, Java (including servlets, JSPs, EJBs, JMS, and so on), C++ and patterns.
Case in point: does F# offer up a great experience in building UIs? Not really—Visual
Studio 2010 doesn't have any of the templates or designer support that C# and Visual
Basic will have, making it awkward at best to build a UI around it. On top of that,
the data-binding architecture present in both WinForms and WPF rely on the idea of
mutable objects, which while something F# allows, isn't something it encourages. So,
it seems pretty reasonable to assume that F# is not great for UI scenarios.
</p>
        <p>
Oh, and your memory is letting you down here—your comment "I've not ever heard
you give valuable advice about when to use F#" is patently false. You were standing
next to me at DevTeach 2008, talking about F# to an audience of about 20 or so when
I said that I thought that functional-object languages were a natural fit for building
services (XML or otherwise).
</p>
        <p>
More importantly, these were tips to speakers interested in F#—where <em>they</em> think
F# is strong and <em>they</em> think F# is weak is a personal judgment, not something
that I should dictate. You used F# to implement an insurance-scoring engine, as I
recall. I've used it (in conjunction with AbsIL, which used to ship with the F# bits
back when they were a MSR technology) to do some IL weaving in the spirit of AOP.
I've used it in a couple of other cases, but alas I cannot divulge the details due
to NDA. But where I've used it and where you've used it isn't the point—it's what
the speaker talking about F# has done that's important. This isn't about us—it's about
the guy or gal on the stage who's giving the talk.
</p>
        <blockquote>
          <p>
Then you say to inform the audience that the language is Turing complete. This seems
like a huge waste as well. If the audience needs to understand that you can accomplish
the same things in C#/VB/F#/Iron*/etc, you are speaking to people who are very young
in the understanding of programming. They won't be using F# anytime soon. 
</p>
        </blockquote>
        <p>
Hmm. I <em>think</em> this is a reaction to the comment "DO stress that F# can
do everything that C# or Visual Basic can do", which is a very different creature
than simply informing the audience that the language is Turing complete. Again, based
on my decade's-plus years of training experience, it's important to let the audience
know that they don't have to throw away everything they already know in order to use
this language. I know that it's fashionable among the functional programming community
to suggest that we should just "toss away all that object stuff", but frankly
I've not found that to be the attitude among the "heavyweights" in that
part of the industry, nor do I find that attitude laced throughout F#. If that were
the case, why would F# go to such great lengths to incorporate object-orientation
as a full part of its linguistic capabilities? It would be far simpler to be a CLI
Consumer (much as managed JScript is/was) and only offer up functional mechanisms,
a la Yeti in the Java space.
</p>
        <p>
I lived through the procedural-to-object transition back in the late 80's/early 90's,
and realized that if you want to bring the previous generation of programmers along
with you into a brave new world, you have to show them that a complete reboot of their
mental processes is not necessary. Otherwise, you're basically calling them idiots
if they can't keep up. Perhaps you're OK with that; I'm not.
</p>
        <blockquote>
          <p>
Finally you say to Tease them for 20 minutes. I am not sure what this means. Can you
post those 35 lines to wow us? I'd love to see your real world demo that is 35 lines.
I'm curious as to why you wouldn't be able to explain the 35 lines as well. I guess
there isn't time because you're busy showing interop examples that prove F# is a Turing
complete, .net language.
</p>
        </blockquote>
        <p>
Alas, I doubt my 35 lines would impress you. However, my 35 lines of F# service code,
or Aaron's 35 lines of F# natural-language parser code might impress the crowd we're
speaking to. I dunno. More importantly, again, this isn't about what *I* want to do
in a talk, it's about helping other F# speakers be able to better reach their audience.
</p>
        <blockquote>
          <p>
Let's get into the Don't category:
</p>
        </blockquote>
        <p>
So soon? But we were just getting comfortable with all the DO's being judged completely
out of order from their corresponding DON'Ts. *shrug* Ah, well.
</p>
        <blockquote>
          <p>
First you say to stay away from mathematical examples because people don't write mathematical
code every day. I think you already mentioned that F# is not meant to be the language
you use for every scenario. Now it seems you want to say it should be the everyday
tool. I'm confused. I agree that some of these simple examples aren't very useful
but then again it's not because they are mathematical. It's because they are simple
and ridiculous. I don't use a web crawler everyday either but I see value in the demo.
I think the examples need to be more real world, period. Have you posted that blog
I requested yet? :) 
</p>
        </blockquote>
        <p>
Ah, the black/white pedagogical argument: if it's not black, it must be white, and
if it's not white, it must be black. Your confusion is clear: if it is not a language
to be used for everything, it must be a niche language solely for creating high-end
mathematical systems, and if it isn't just for creating high-end mathematical systems,
it must be a language used for everything.
</p>
        <p>
My reasoning for avoiding the exponent-hugging example is pretty easy, I think: Mathematical
examples reinforce the idea that F# is solely to be used for high-end mathematical
scenarios. If you're OK with the language only appealing to that crowd, please, by
all means, continue to use those examples. Myself, I think functional concepts are
powerful, and I try to show people the power of extracting behavior by showing them
widely-disparate uses of foldLeft across lists of things to produce concrete yet widely
different results. Simple examples, but without a shred of "derivatives"
found anywhere.
</p>
        <p>
Alas, that blog post will have to wait—I have an F# book I'm finishing up, and I'd
rather put the energy there.
</p>
        <blockquote>
          <p>
Next up you say to not stress FSI or the REPL. I'll start by reminding you that FSI
is the REPL. There aren't two different things here. I think it's great to show a
REPL! This is not just a cool F# thing. It's common to most functional languages,
statically typed or not. The statically typed argument might be a better one to have
than Turing completeness. I'd much rather discuss those benefits for the types of
code that are written in F#. 
</p>
        </blockquote>
        <p>
Wow. I wouldn't have thought I would have to remind you that REPL is a generic phrase
that can apply to both FSI and the Interactive Window inside Visual Studio. And while
I'm certainly happy to hear that you think it's great to show a REPL, the fact remains
that most .NET developers don't know what to do with it. More importantly, demonstrating
a REPL reinforces the idea that this is a shell-scripting language like Python and
Ruby and PowerShell, hence the questions comparing F# to Python or Perl that come
up every time I've seen an F# talk show off FSI or the Interactive Window. Business
developers using .NET build using Visual Studio (with the exception of that small
percentage who've discovered IPy or IRb) and, again, need to be brought gently into
this new approach.
</p>
        <p>
(For those readers still following along, the REPL concept is hardly restricted to
the functional language cadre; in fact, object-oriented developers would be well-advised
to play with one of their own ancient progenitors, Smalltalk, and its environment
that is essentially one giant REPL baked into a GUI image that can be frozen and re-hydrated
at any time. Long-time readers of this blog will know I've talked about this before,
and how incredibly powerful it would be if we could do similar kinds of things to
the JVM or CLR.)
</p>
        <blockquote>
          <p>
You go back into the Why F# question without giving any real reason. Can you post
that blog please? I think many of your readers would appreciate that! PS: The Steelers
are fantastic! :) 
</p>
        </blockquote>
        <p>
If I'm following your point-by-point refutation correctly, you're now saying I'm "going
back" to the "Why F#" question for no real reason; I would've thought
the progression of DON'T followed by DO would've been pretty obvious, but perhaps
I was assuming too much on the part of at least one of the post's readership. The
DO was designed to offer up prescriptive advice about how to accomplish something
I'd said to DON'T previously. And thus is true here: DON'T answer the "Why F#"
question with "Productivity", DO answer it with something more concrete
and tangible than that, either in the form of real-world examples or concrete scenarios.
</p>
        <p>
I think by this point, given all the wheedling for that blog post, the general readership
would probably be very interested in your own rationale blog post, by the way.
</p>
        <p>
Alas, your Steelers barely made it to .500 last year, their franchise quarterback
is now the target of his second (and possibly more, if the rumors are to be believed)
sexual assault charge, and their principal receiver has a reputation around the league
as being a dirty player. So perhaps we will simply have to disagree on how fantastic
they are. Which, you will note, proves my point—as the old saying goes, "there
is no accounting for taste", because I can't understand how you think. Which
then means "It's just how I think" is pretty ridiculous as a justification
for using a language.
</p>
        <blockquote>
          <p>
You say to stay away from the "functional jazz" or the reason why anyone
should be looking at F# to start with. People don't come to these types of talks to
see how F# is just like C#. They want to see what is different. Don't stress the jargon
but if someone asks, let them know there is a name for what they are looking at. I
remember when I was learning F# that everyone hid the meaning of let!. They would
say "Something special happens here" and that would leave me thinking they
were trying to hide the magic. There is no magic! I don't assume people are morons.
They can handle the truth. If they want to learn more I want to give them a term to
google and some potential resources. There isn't time to cover that completely in
most sessions though. It's something to be careful of, not to avoid completely. 
</p>
        </blockquote>
        <p>
Interesting how your anecdotal evidence differs from mine—what I've seen, based on
the quick poll I took of the attendees at the user group meeting last night, and based
on conversations I've had with hundreds of developers from companies all over the
world over the last four years, vastly more attendees come to a talk on a given subject
because they have no clue what this thing is and want to see a general overview of
it. Shy Cohen, one of the attendees last night, whom I first met during my days as
a <em>digerati</em> on the WCF team back when it was still called "Indigo",
admitted as much during a whispered conversation at the back of the room. If Shy,
old Microsoft hand that he is/was, bright guy that he is, and close friend to Lisa
Feigenbaum, who's a Program Manager for Visual Studio, has no clue what F# is and
comes to a talk on it so he can get a quick overview of it, how likely is it that
everybody is coming to an F# talk with a predetermined idea of what the language is
and are thus ready to be given "the truth" complete with all the big dime-store
words?
</p>
        <p>
Yes, people want to know what is different, but to do that, they also have to see
what is the same. Which takes us back to my earlier points about showing them what
is the same between F# and C#.
</p>
        <p>
As for people waving their hands and saying "something special happens here",
well, maybe you just listened to the wrong people. *shrug* Can't help you there. For
as long as I've been giving talks on F#, dating back to SDWest back in 2005 when I
gave a talk on "A Tour of Microsoft Research" during which I talked about
Fugue, Detours, AbsIL and F#, I've shown the language, talked about what's happening
in there, and shown the IL bindings underneath to give people concrete ideas to hold
on to. It's the truth, but without the pretentiousness of big words.
</p>
        <blockquote>
          <p>
The last point is obvious. Nobody can learn F# in 20 (or 30 as it was) minutes. 
</p>
        </blockquote>
        <p>
Unfortunately, that doesn't stop people from trying to teach the entirety of the language
in 20 minutes. Or even in a full day. (From having taught languages for many years,
and knowing that it took most of a week to teach C# back in the 1.0/2.0 timeframe,
I'm finding that it takes about 5 days of full 8-to-5 training to get them competent
and confident in using the language. Less than that, by about a day or so, if they
have a strong background in C#.)
</p>
        <blockquote>
          <p>
Context, context, context.
</p>
        </blockquote>
        <p>
Indeed. But for now, Amanda, if you take such strong issue with my suggested guidelines
for F# speakers, I encourage you to create your own guidelines and post them to your
blog. Let's rise the tide to raise all the ships, and encourage a broad spectrum of
talk styles.
</p>
        <p>
In the meantime, though, I have a lunch with Michael later this week, some OTN and
developerWorks articles to write, an F# book to finish, a Scala book to start, some
client code to wrap up, a slew of Scala recordings to work through, soccer practice
Thursday night, and a Seattle Tech Speakers Workshop meeting next month to prep for,
in addition to a class next week that requires some final polish, so you'll have to
excuse me if I don't respond further down this particular path.
</p>
        <p>
Cheers!
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=6b75f874-1ce8-485b-b0ec-72c0e7f2ad38" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Amanda takes umbrage....</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,6b75f874-1ce8-485b-b0ec-72c0e7f2ad38.aspx</guid>
      <link>http://blogs.tedneward.com/2010/03/24/Amanda+Takes+Umbrage.aspx</link>
      <pubDate>Wed, 24 Mar 2010 06:38:17 GMT</pubDate>
      <description>&lt;p&gt;
... with my earlier &lt;a href="http://blogs.tedneward.com/2010/03/23/How+To+And+Not+To+Give+A+Talk+On+F.aspx" target="_blank"&gt;speaking
about F#&lt;/a&gt; post, which I will admit, surprises me, since I would've thought somebody
interested in promoting F# would've been more supportive of the idea of putting some
ideas out to help other speakers get F# more easily adopted by the community. Perhaps
I misunderstood her objections, but I thought a response was required in any event.
&lt;/p&gt;
&lt;p&gt;
Amanda opens with:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Let's start with the &amp;quot;Do&amp;quot; category.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
OK, then, let's. :-)
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
First you say you want the speaker to show inheritance... in a functional-first language.
This is an obvious no-no. Inheritance should be used extremely lightly in any language
and it should be hidden completely in F#. You should NEVER have a student/instructor/employee
inherit from a person. This language isn't used that way. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
That's odd.... that's entirely contradictory to what I've heard from the F# team.
I've never heard anyone on the F# team ever call it a &amp;quot;functional-first&amp;quot;
language, nor that inheritance (or any other object-oriented feature) is something
that should be used &amp;quot;extremely lightly&amp;quot; or &amp;quot;hidden completely&amp;quot;.
Quite the contrary, in fact; when I did a tag-team presentation on F# with Luke Hoban,
the PM of the F# team, he gently corrected my use of the phrase describing F# as a
&amp;quot;functional-object hybrid&amp;quot; language to suggest instead that it was a &amp;quot;fusion&amp;quot;
of both features.
&lt;/p&gt;
&lt;p&gt;
But even if that's not the case (or perhaps isn't the case anymore), I think it's
critical to give audience members something concrete and familiar to hang onto as
they start the roller-coaster ride of learning not only a new syntax, but new concepts.
To simply say, &amp;quot;Everything you know from objects is wrong&amp;quot; is to do them
a disservice, particularly when the language clearly is intended to expose object-oriented
concepts as a first-class citizen.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Second you say to show interop. This will show nothing about the language. You might
as well just say it is a .net language. If you spend your F# session discussing what
it means to be on .net, you fail. Nobody expects that one dll will not be able to
call another. If they do, I assure you that they will not be writing F# anytime soon. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Ah, but here is where my decades of experience teaching languages to audiences all
over the world kicks in: they don't know that. DLLs are not all created equal, as
anyone who's ever tried to get COM components to interop with native C++ DLLs that
in turn want to call into managed code DLLs will tell you. It's important to stress,
again, that what they know is still relevant in this new world. In fact, the goal
of showing them interoperability is to reassure them that, in fact, it's not a new
world at all, but simply a different spin on the world they already know and love.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Next you say give concrete examples of where F# is a win. This is a sales pitch. It's
fine for some audiences but if you intend to teach F# to the audience, you likely
are already there. Just make sure your examples are real world and you should be fine.
I challenge you to make your next blog a &amp;quot;Why F#&amp;quot; which contains real world
examples. I've not ever heard you give valuable advice about when to use F#. Also
please post what your real world experience is with F#. Where did you implement a
solution? What was that project like? Why was F# the best choice? 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Interesting. Based on the conversations I've had with others, the main reason people
come to technical talks, at least the talks I've been to (both as an audience member
and as a speaker) is to know when and where and how they can use this technology (whatever
it is) to solve the problems they face. That means that they need to see and hear
where a technology fits well as a solution against a given problem domain or case,
and the sooner they get that information, the sooner they can start to evaluate where,
how and when they should use a particular technology. This has been true of almost
every &amp;quot;new&amp;quot; technology I've evaluated—from the more recent presentations
and articles around WCF, Workflow, MongoDB and Axum to the older talks/trainings I've
given for C#, Java (including servlets, JSPs, EJBs, JMS, and so on), C++ and patterns.
Case in point: does F# offer up a great experience in building UIs? Not really—Visual
Studio 2010 doesn't have any of the templates or designer support that C# and Visual
Basic will have, making it awkward at best to build a UI around it. On top of that,
the data-binding architecture present in both WinForms and WPF rely on the idea of
mutable objects, which while something F# allows, isn't something it encourages. So,
it seems pretty reasonable to assume that F# is not great for UI scenarios.
&lt;/p&gt;
&lt;p&gt;
Oh, and your memory is letting you down here—your comment &amp;quot;I've not ever heard
you give valuable advice about when to use F#&amp;quot; is patently false. You were standing
next to me at DevTeach 2008, talking about F# to an audience of about 20 or so when
I said that I thought that functional-object languages were a natural fit for building
services (XML or otherwise).
&lt;/p&gt;
&lt;p&gt;
More importantly, these were tips to speakers interested in F#—where &lt;em&gt;they&lt;/em&gt; think
F# is strong and &lt;em&gt;they&lt;/em&gt; think F# is weak is a personal judgment, not something
that I should dictate. You used F# to implement an insurance-scoring engine, as I
recall. I've used it (in conjunction with AbsIL, which used to ship with the F# bits
back when they were a MSR technology) to do some IL weaving in the spirit of AOP.
I've used it in a couple of other cases, but alas I cannot divulge the details due
to NDA. But where I've used it and where you've used it isn't the point—it's what
the speaker talking about F# has done that's important. This isn't about us—it's about
the guy or gal on the stage who's giving the talk.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Then you say to inform the audience that the language is Turing complete. This seems
like a huge waste as well. If the audience needs to understand that you can accomplish
the same things in C#/VB/F#/Iron*/etc, you are speaking to people who are very young
in the understanding of programming. They won't be using F# anytime soon. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Hmm. I &lt;em&gt;think&lt;/em&gt; this is a reaction to the comment &amp;quot;DO stress that F# can
do everything that C# or Visual Basic can do&amp;quot;, which is a very different creature
than simply informing the audience that the language is Turing complete. Again, based
on my decade's-plus years of training experience, it's important to let the audience
know that they don't have to throw away everything they already know in order to use
this language. I know that it's fashionable among the functional programming community
to suggest that we should just &amp;quot;toss away all that object stuff&amp;quot;, but frankly
I've not found that to be the attitude among the &amp;quot;heavyweights&amp;quot; in that
part of the industry, nor do I find that attitude laced throughout F#. If that were
the case, why would F# go to such great lengths to incorporate object-orientation
as a full part of its linguistic capabilities? It would be far simpler to be a CLI
Consumer (much as managed JScript is/was) and only offer up functional mechanisms,
a la Yeti in the Java space.
&lt;/p&gt;
&lt;p&gt;
I lived through the procedural-to-object transition back in the late 80's/early 90's,
and realized that if you want to bring the previous generation of programmers along
with you into a brave new world, you have to show them that a complete reboot of their
mental processes is not necessary. Otherwise, you're basically calling them idiots
if they can't keep up. Perhaps you're OK with that; I'm not.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Finally you say to Tease them for 20 minutes. I am not sure what this means. Can you
post those 35 lines to wow us? I'd love to see your real world demo that is 35 lines.
I'm curious as to why you wouldn't be able to explain the 35 lines as well. I guess
there isn't time because you're busy showing interop examples that prove F# is a Turing
complete, .net language.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Alas, I doubt my 35 lines would impress you. However, my 35 lines of F# service code,
or Aaron's 35 lines of F# natural-language parser code might impress the crowd we're
speaking to. I dunno. More importantly, again, this isn't about what *I* want to do
in a talk, it's about helping other F# speakers be able to better reach their audience.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Let's get into the Don't category:
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
So soon? But we were just getting comfortable with all the DO's being judged completely
out of order from their corresponding DON'Ts. *shrug* Ah, well.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
First you say to stay away from mathematical examples because people don't write mathematical
code every day. I think you already mentioned that F# is not meant to be the language
you use for every scenario. Now it seems you want to say it should be the everyday
tool. I'm confused. I agree that some of these simple examples aren't very useful
but then again it's not because they are mathematical. It's because they are simple
and ridiculous. I don't use a web crawler everyday either but I see value in the demo.
I think the examples need to be more real world, period. Have you posted that blog
I requested yet? :) 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Ah, the black/white pedagogical argument: if it's not black, it must be white, and
if it's not white, it must be black. Your confusion is clear: if it is not a language
to be used for everything, it must be a niche language solely for creating high-end
mathematical systems, and if it isn't just for creating high-end mathematical systems,
it must be a language used for everything.
&lt;/p&gt;
&lt;p&gt;
My reasoning for avoiding the exponent-hugging example is pretty easy, I think: Mathematical
examples reinforce the idea that F# is solely to be used for high-end mathematical
scenarios. If you're OK with the language only appealing to that crowd, please, by
all means, continue to use those examples. Myself, I think functional concepts are
powerful, and I try to show people the power of extracting behavior by showing them
widely-disparate uses of foldLeft across lists of things to produce concrete yet widely
different results. Simple examples, but without a shred of &amp;quot;derivatives&amp;quot;
found anywhere.
&lt;/p&gt;
&lt;p&gt;
Alas, that blog post will have to wait—I have an F# book I'm finishing up, and I'd
rather put the energy there.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Next up you say to not stress FSI or the REPL. I'll start by reminding you that FSI
is the REPL. There aren't two different things here. I think it's great to show a
REPL! This is not just a cool F# thing. It's common to most functional languages,
statically typed or not. The statically typed argument might be a better one to have
than Turing completeness. I'd much rather discuss those benefits for the types of
code that are written in F#. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Wow. I wouldn't have thought I would have to remind you that REPL is a generic phrase
that can apply to both FSI and the Interactive Window inside Visual Studio. And while
I'm certainly happy to hear that you think it's great to show a REPL, the fact remains
that most .NET developers don't know what to do with it. More importantly, demonstrating
a REPL reinforces the idea that this is a shell-scripting language like Python and
Ruby and PowerShell, hence the questions comparing F# to Python or Perl that come
up every time I've seen an F# talk show off FSI or the Interactive Window. Business
developers using .NET build using Visual Studio (with the exception of that small
percentage who've discovered IPy or IRb) and, again, need to be brought gently into
this new approach.
&lt;/p&gt;
&lt;p&gt;
(For those readers still following along, the REPL concept is hardly restricted to
the functional language cadre; in fact, object-oriented developers would be well-advised
to play with one of their own ancient progenitors, Smalltalk, and its environment
that is essentially one giant REPL baked into a GUI image that can be frozen and re-hydrated
at any time. Long-time readers of this blog will know I've talked about this before,
and how incredibly powerful it would be if we could do similar kinds of things to
the JVM or CLR.)
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
You go back into the Why F# question without giving any real reason. Can you post
that blog please? I think many of your readers would appreciate that! PS: The Steelers
are fantastic! :) 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
If I'm following your point-by-point refutation correctly, you're now saying I'm &amp;quot;going
back&amp;quot; to the &amp;quot;Why F#&amp;quot; question for no real reason; I would've thought
the progression of DON'T followed by DO would've been pretty obvious, but perhaps
I was assuming too much on the part of at least one of the post's readership. The
DO was designed to offer up prescriptive advice about how to accomplish something
I'd said to DON'T previously. And thus is true here: DON'T answer the &amp;quot;Why F#&amp;quot;
question with &amp;quot;Productivity&amp;quot;, DO answer it with something more concrete
and tangible than that, either in the form of real-world examples or concrete scenarios.
&lt;/p&gt;
&lt;p&gt;
I think by this point, given all the wheedling for that blog post, the general readership
would probably be very interested in your own rationale blog post, by the way.
&lt;/p&gt;
&lt;p&gt;
Alas, your Steelers barely made it to .500 last year, their franchise quarterback
is now the target of his second (and possibly more, if the rumors are to be believed)
sexual assault charge, and their principal receiver has a reputation around the league
as being a dirty player. So perhaps we will simply have to disagree on how fantastic
they are. Which, you will note, proves my point—as the old saying goes, &amp;quot;there
is no accounting for taste&amp;quot;, because I can't understand how you think. Which
then means &amp;quot;It's just how I think&amp;quot; is pretty ridiculous as a justification
for using a language.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
You say to stay away from the &amp;quot;functional jazz&amp;quot; or the reason why anyone
should be looking at F# to start with. People don't come to these types of talks to
see how F# is just like C#. They want to see what is different. Don't stress the jargon
but if someone asks, let them know there is a name for what they are looking at. I
remember when I was learning F# that everyone hid the meaning of let!. They would
say &amp;quot;Something special happens here&amp;quot; and that would leave me thinking they
were trying to hide the magic. There is no magic! I don't assume people are morons.
They can handle the truth. If they want to learn more I want to give them a term to
google and some potential resources. There isn't time to cover that completely in
most sessions though. It's something to be careful of, not to avoid completely. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Interesting how your anecdotal evidence differs from mine—what I've seen, based on
the quick poll I took of the attendees at the user group meeting last night, and based
on conversations I've had with hundreds of developers from companies all over the
world over the last four years, vastly more attendees come to a talk on a given subject
because they have no clue what this thing is and want to see a general overview of
it. Shy Cohen, one of the attendees last night, whom I first met during my days as
a &lt;em&gt;digerati&lt;/em&gt; on the WCF team back when it was still called &amp;quot;Indigo&amp;quot;,
admitted as much during a whispered conversation at the back of the room. If Shy,
old Microsoft hand that he is/was, bright guy that he is, and close friend to Lisa
Feigenbaum, who's a Program Manager for Visual Studio, has no clue what F# is and
comes to a talk on it so he can get a quick overview of it, how likely is it that
everybody is coming to an F# talk with a predetermined idea of what the language is
and are thus ready to be given &amp;quot;the truth&amp;quot; complete with all the big dime-store
words?
&lt;/p&gt;
&lt;p&gt;
Yes, people want to know what is different, but to do that, they also have to see
what is the same. Which takes us back to my earlier points about showing them what
is the same between F# and C#.
&lt;/p&gt;
&lt;p&gt;
As for people waving their hands and saying &amp;quot;something special happens here&amp;quot;,
well, maybe you just listened to the wrong people. *shrug* Can't help you there. For
as long as I've been giving talks on F#, dating back to SDWest back in 2005 when I
gave a talk on &amp;quot;A Tour of Microsoft Research&amp;quot; during which I talked about
Fugue, Detours, AbsIL and F#, I've shown the language, talked about what's happening
in there, and shown the IL bindings underneath to give people concrete ideas to hold
on to. It's the truth, but without the pretentiousness of big words.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
The last point is obvious. Nobody can learn F# in 20 (or 30 as it was) minutes. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Unfortunately, that doesn't stop people from trying to teach the entirety of the language
in 20 minutes. Or even in a full day. (From having taught languages for many years,
and knowing that it took most of a week to teach C# back in the 1.0/2.0 timeframe,
I'm finding that it takes about 5 days of full 8-to-5 training to get them competent
and confident in using the language. Less than that, by about a day or so, if they
have a strong background in C#.)
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Context, context, context.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Indeed. But for now, Amanda, if you take such strong issue with my suggested guidelines
for F# speakers, I encourage you to create your own guidelines and post them to your
blog. Let's rise the tide to raise all the ships, and encourage a broad spectrum of
talk styles.
&lt;/p&gt;
&lt;p&gt;
In the meantime, though, I have a lunch with Michael later this week, some OTN and
developerWorks articles to write, an F# book to finish, a Scala book to start, some
client code to wrap up, a slew of Scala recordings to work through, soccer practice
Thursday night, and a Seattle Tech Speakers Workshop meeting next month to prep for,
in addition to a class next week that requires some final polish, so you'll have to
excuse me if I don't respond further down this particular path.
&lt;/p&gt;
&lt;p&gt;
Cheers!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=6b75f874-1ce8-485b-b0ec-72c0e7f2ad38" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,6b75f874-1ce8-485b-b0ec-72c0e7f2ad38.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>F#</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Scala</category>
      <category>Visual Basic</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=4b2137dd-11cc-4ad5-8771-5906f2759273</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,4b2137dd-11cc-4ad5-8771-5906f2759273.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,4b2137dd-11cc-4ad5-8771-5906f2759273.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4b2137dd-11cc-4ad5-8771-5906f2759273</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Cruising the Web late last night, I ran across <a href="http://blogs.techrepublic.com.com/10things/?p=1297" target="_blank">"10
things you can do to advance your career as a developer"</a>, summarized below:
</p>
        <ol>
          <li>
Build a PC 
</li>
          <li>
Participate in an online forum and help others 
</li>
          <li>
Man the help desk 
</li>
          <li>
Perform field service 
</li>
          <li>
Perform DBA functions 
</li>
          <li>
Perform all phases of the project lifecycle 
</li>
          <li>
Recognize and learn the latest technologies 
</li>
          <li>
Be an independent contractor 
</li>
          <li>
Lead a project, supervise, or manage 
</li>
          <li>
Seek additional education 
</li>
        </ol>
        <p>
I agreed with some of them, I disagreed with others, and in general felt like they
were a little too high-level to be of real use. For example, "Seek additional
education" seems entirely too vague: In what? How much? How often? And "Recognize
and learn the latest technologies" is something like offering advice to the Olympic
fencing silver medalist and saying, "You should have tried harder".
</p>
        <p>
So, in the great spirit of "Not Invented Here", I present my own list; as
usual, I welcome comment and argument. And, also as usual, caveats apply, since not
everybody will be in precisely the same place and be looking for the same things.
In general, though, whether you're looking to kick-start your career or just "kick
it up a notch", I believe this list will help, because these ideas have been
of help to me at some point or another in my own career.
</p>
        <h3>
          <strong>
            <em>10: Build a PC.</em>
          </strong>
        </h3>
        <p>
Yes, even developers have to know about hardware. More importantly, a developer at
a small organization or team will find himself in a position where he has to take
on some system administrator roles, and sometimes that means grabbing a screwdriver,
getting a little dusty and dirty, and swapping hardware around. Having said this,
though, once you've done it once or twice, leave it alone—the hardware game is an
ever-shifting and ever-changing game (much like software is, surprise surprise), and
it's been my experience that most of us only really have the time to pursue one or
the other.
</p>
        <p>
By the way, "PC" there is something of a generic term—build a Linux box,
build a Windows box, or "build" a Mac OS box (meaning, buy a Mac Pro and
trick it out a little—add more memory, add another hard drive, and so on), they all
get you comfortable with snapping parts together, and discovering just how ridiculously
simple the whole thing really is.
</p>
        <p>
And for the record, once you've done it, go ahead and go back to buying pre-built
systems or laptops—I've never found building a PC to be any cheaper than buying one
pre-built. Particularly for PC systems, I prefer to use smaller local vendors where
I can customize and trick out the box. If you're a Mac, that's not really an option
unless you're into the "Hackintosh" thing, which is quite possibly the logical
equivalent to "Build a PC". Having never done it myself, though, I can't
say how useful that is as an educational action.
</p>
        <h3>
        </h3>
        <h3>
        </h3>
        <h3>
        </h3>
        <h3>
          <strong>
            <em>9: Pick a destination</em>
          </strong>
        </h3>
        <p>
Do you want to run a team of your own? Become an independent contractor? Teach programming
classes? Speak at conferences? Move up into higher management and get out of the programming
game altogether? Everybody's got a different idea of what they consider to be the
"ideal" career, but it's amazing how many people don't really think about
what they want their career path to be.
</p>
        <p>
A wise man once said, "The journey of a thousand miles begins with a single step."
I disagree: The journey of a thousand miles begins with the damn map. You have to
know where you want to go, and a rough idea of how to get there, before you can really
start with that single step. Otherwise, you're just wandering, which in itself isn't
a bad thing, but isn't going to get you to a destination except by random chance.
(Sometimes that's not a bad result, but at least then you're openly admitting that
you're leaving your career in the hands of chance. If you're OK with that, skip to
the next item. If you're not, read on.)
</p>
        <p>
Lay out explicitly (as in, write it down someplace) what kind of job you're wanting
to grow into, and then lay out a couple of scenarios that move you closer towards
that goal. Can you grow within the company you're in? (Have others been able to?)
Do you need to quit and strike out on your own? Do you want to lead a team of your
own? (Are there new projects coming in to the company that you could put yourself
forward as a potential tech lead?) And so on.
</p>
        <p>
Once you've identified the destination, now you can start thinking about steps to
get there. 
</p>
        <p>
If you want to become a speaker, put your name forward to give some presentations
at the local technology user group, or volunteer to hold a "brown bag" session
at the company. Sign up with Toastmasters to hone your speaking technique. Watch other
speakers give technical talks, and see what they do that you don't, and vice versa. 
</p>
        <p>
If you want to be a tech lead, start by quietly assisting other members of the team
get their work done. Help them debug thorny problems. Answer questions they have.
Offer yourself up as a resource for dealing with hard problems.
</p>
        <p>
If you want to slowly move up the management chain, look to get into the project management
side of things. Offer to be a point of contact for the users. Learn the business better.
Sit down next to one of your users and watch their interaction with the existing software,
and try to see the system from their point of view.
</p>
        <p>
And so on.
</p>
        <h3>
          <strong>
            <em>8: Be a bell curve</em>
          </strong>
        </h3>
        <p>
Frequently, at conferences, attendees ask me how I got to know so much on so many
things. In some ways, I'm reminded of the story of a world-famous concert pianist
giving a concert at Carnegie Hall—when a gushing fan said, "I'd give my life
to be able to play like that", the pianist responded quietly, "I did".
But as much as I'd like to leave you with the impression that I've dedicated my entire
life to knowing everything I could about this industry, that would be something of
a lie. The truth is, I don't know anywhere near as much as I'd like, and I'm always
poking my head into new areas. Thank God for my ADD, that's all I can say on that
one.
</p>
        <p>
For the rest of you, though, that's not feasible, and not really practical, particularly
since I have an advantage that the "working" programmer doesn't—I have set
aside weeks or months in which to do nothing more than study a new technology or language.
</p>
        <p>
Back in the early days of my career, though, when I was holding down the 9-to-5, I
was a Windows/C++ programmer. I was working with the Borland C++ compiler and its
associated framework, the ObjectWindows Library (OWL), extending and maintaining applications
written in it. One contracting client wanted me to work with Microsoft MFC instead
of OWL. Another one was storing data into a relational database using ODBC. And so
on. Slowly, over time, I built up a "bell curve"-looking collection of skills
that sort of "hovered" around the central position of C++/Windows.
</p>
        <p>
Then, one day, a buddy of mine mentioned the team on which he was a project manager
was looking for new blood. They were doing web applications, something with which
I had zero experience—this was completely outside of my bell curve. HTML, HTTP, Cold
Fusion, NetDynamics (an early Java app server), this was way out of my range, though
at least NetDynamics was a <em>little</em> similar, since it was basically a server-side
application framework, and I had some experience with app frameworks from my C++ days.
So, resting on my C++ experience, I started flirting with Java, and so on.
</p>
        <p>
Before long, my "bell curve" had been readjusted to have Java more or less
at its center, and I found that experience in C++ still worked out here—what I knew
about ODBC turned out to be incredibly useful in understanding JDBC, what I knew about
DLLs from Windows turned out to be helpful in understanding Java's dynamic loading
model, and of course syntactically Java looked a lot like C++ even though it behaved
a little bit differently under the hood. (One article author suggested that Java was
closer to Smalltalk than C++, and that prompted me to briefly flirt with Smalltalk
before I concluded said author was out of his frakking mind.)
</p>
        <p>
All of this happened over roughly a three-year period, by the way.
</p>
        <p>
The point here is that you won't be able to assimilate the entire industry in a single
sitting, so pick something that's relatively close to what you already know, and use
your experience as a springboard to learn something that's new, yet possibly-if-not-probably
useful to your current job. You don't have to be a deep expert in it, and the further
away it is from what you do, the less you really need to know about it (hence the
bell curve metaphor), but you're still exposing yourself to new ideas and new concepts
and new tools/technologies that still could be applicable to what you do on a daily
basis. Over time the "center" of your bell curve may drift away from what
you've done to include new things, and that's OK.
</p>
        <h3>
          <strong>
            <em>7: Learn one new thing every year</em>
          </strong>
        </h3>
        <p>
In the last tip, I told you to branch out slowly from what you know. In this tip,
I'm telling you to go throw a dart at something entirely unfamiliar to you and learn
it. Yes, I realize this sounds contradictory. It's because those who stick to only
what they know end up missing the radical shifts of direction that the industry hits
every half-decade or so until it's mainstream and commonplace and "everybody's
doing it".
</p>
        <p>
In their amazing book "The Pragmatic Programmer", Dave Thomas and Andy Hunt
suggest that you learn one new programming language every year. I'm going to amend
that somewhat—not because there aren't enough languages in the world to keep you on
that pace for the rest of your life—far from it, if that's what you want, go learn
Ruby, F#, Scala, Groovy, Clojure, Icon, Io, Erlang, Haskell and Smalltalk, then come
back to me for the list for 2020—but because languages aren't the only thing that
we as developers need to explore. There's a lot of movement going on in areas beyond
languages, and you don't want to be the last kid on the block to know they're happening.
</p>
        <p>
Consider this list: object databases (<a href="http://www.db4o.com" target="_blank">db4o</a>)
and/or the "NoSQL" movement (<a href="http://www.mongodb.org/display/DOCS/Tutorial" target="_blank">MongoDB</a>).
Dependency injection and composable architectures (<a href="http://www.springframework.org" target="_blank">Spring</a>, <a href="http://mef.codeplex.com" target="_blank">MEF</a>).
A dynamic language (<a href="http://www.rubyforge.org" target="_blank">Ruby</a>, <a href="http://www.python.org" target="_blank">Python</a>, <a href="http://www.ecmascript.org" target="_blank">ECMAScript</a>).
A functional language (<a href="http://msdn.microsoft.com/en-us/fsharp/default.aspx" target="_blank">F#</a>, <a href="http://www.scala-lang.org" target="_blank">Scala</a>, <a href="http://www.haskell.org" target="_blank">Haskell</a>).
A Lisp (Common Lisp, <a href="http://clojure.org" target="_blank">Clojure</a>, Scheme,
Nu). A mobile platform (iPhone, Android). "Space"-based architecture (<a href="http://www.gigaspaces.com" target="_blank">Gigaspaces</a>,
Terracotta). Rich UI platforms (Flash/Flex, Silverlight). Browser enhancements (AJAX,
jQuery, HTML 5) and how they're different from the rich UI platforms. And this is
without adding any of the "obvious" stuff, like Cloud, to the list.
</p>
        <p>
(I'm not convinced Cloud is something worth learning this year, anyway.)
</p>
        <p>
You get through that list, you're operating outside of your comfort zone, and chances
are, your boss' comfort zone, which puts you into the enviable position of being somebody
who can advise him around those technologies. <em>DO NOT TAKE THIS TO MEAN YOU MUST
KNOW THEM DEEPLY.</em> Just having a passing familiarity with them can be enough. <em>DO
NOT TAKE THIS TO MEAN YOU SHOULD PROPOSE USING THEM ON THE NEXT PROJECT.</em> In fact,
sometimes the most compelling evidence that you really know where and when they should
be used is when you suggest stealing ideas from the thing, rather than trying to force-fit
the thing onto the project as a whole.
</p>
        <h3>
          <strong>
            <em>6: Practice, practice, practice</em>
          </strong>
        </h3>
        <p>
Speaking of the concert pianist, somebody once asked him how to get to Carnegie Hall.
HIs answer: "Practice, my boy, practice."
</p>
        <p>
The same is true here. You're not going to get to be a better developer without practice.
Volunteer some time—even if it's just an hour a week—on an open-source project, or
start one of your own. Heck, it doesn't even have to be an "open source"
project—just create some requirements of your own, solve a problem that a family member
is having, or rewrite the project you're on as an interesting side-project. Do the
Nike thing and "Just do it". Write some Scala code. Write some F# code.
Once you're past "hello world", write the Scala code to use db4o as a persistent
storage. Wire it up behind Tapestry. Or write straight servlets in Scala. And so on.
</p>
        <h3>
          <strong>
            <em>5: Turn off the TV</em>
          </strong>
        </h3>
        <p>
Speaking of marketing slogans, if you're like most Americans, surveys have shown that
you watch about four hours of TV a day, or 28 hours of TV a week. In that same amount
of time (28 hours over 1 week), you could read the entire set of poems by Maya Angelou,
one F. Scott Fitzgerald novel, all poems by T.S.Eliot, 2 plays by Thornton Wilder,
or all 150 Psalms of the Bible. An average reader, reading just one hour a day, can
finish an "average-sized" book (let's assume about the size of a novel)
in a week, which translates to 52 books a year.
</p>
        <p>
Let's assume a technical book is going to take slightly longer, since it's a bit deeper
in concept and requires you to spend some time experimenting and typing in code; let's
assume that reading and going through the exercises of an average technical book will
require 4 weeks (a month) instead of just one week. That's 12 new tools/languages/frameworks/ideas
you'd be learning per year.
</p>
        <p>
All because you stopped watching David Caruso turn to the camera, whip his sunglasses
off and say something stupid. (I guess it's not his fault; <em>CSI:Miami</em> is a
crap show. The other two are actually not bad, but <em>Miami</em> just makes me retch.) 
</p>
        <p>
After all, when's the last time that David Caruso or the rest of that show did anything
that was even remotely realistic from a computer perspective? (I always laugh out
loud every time they run a database search against some national database on a completely
non-indexable criteria—like a partial license plate number—and it comes back in seconds.
What the hell database are THEY using? I want it!) Soon as you hear The Who break
into that riff, flip off the TV (or set it to mute) and pick up the book on the nightstand
and boost your career. (And hopefully sink Caruso's.)
</p>
        <p>
Or, if you just can't give up your weekly dose of Caruso, then put the book in the
bathroom. Think about it—how much time do you spend in there a week?
</p>
        <p>
And this gets even better when you get a Kindle or other e-reader that accepts PDFs,
or the book you're interested in is natively supported in the e-readers' format. Now
you have it with you for lunch, waiting at dinner for your food to arrive, or while
you're sitting guard on your 10-year-old so he doesn't sneak out of his room after
his bedtime to play more XBox.
</p>
        <h3>
          <strong>
            <em>4: Have a life</em>
          </strong>
        </h3>
        <p>
Speaking of XBox, don't slave your life to work. Pursue other things. Scientists have
repeatedly discovered that exercise helps keep the mind in shape, so take a couple
of hours a week (buh-bye, <em>American Idol</em>) and go get some exercise. Pick up
a new sport you've never played before, or just go work out at the gym. (This year
I'm doing Hopkido and fencing.) Read some nontechnical books. (I recommend anything
by Malcolm Gladwell as a starting point.) Spend time with your family, if you have
one—mine spends at least six or seven hours a week playing "family games"
like <a href="http://www.realitycheckgames.com/Products/127-the-settlers-of-catan.aspx" target="_blank">Settlers
of Catan</a>, <a href="http://www.realitycheckgames.com/Products/113-dominion.aspx" target="_blank">Dominion</a>, <a href="http://www.realitycheckgames.com/Products/88-to-court-the-king.aspx" target="_blank">To
Court The King</a>, <a href="http://www.realitycheckgames.com/Products/98-munchkin.aspx" target="_blank">Munchkin</a>,
and other non-traditional games, usually over lunch or dinner. I also belong to an
informal "Game Night club" in Redmond consisting of several Microsoft employees
and their families, as well as outsiders. And so on. Heck, go to a local bar and watch
the game, and you'll meet some really interesting people. And some boring people,
too, but you don't have to talk to them during the next game if you don't want.
</p>
        <p>
This isn't just about maintaining a healthy work-life balance—it's also about having
interests that other people can latch on to, qualities that will make you more "human"
and more interesting as a person, and make you more attractive and "connectable"
and stand out better in their mind when they hear that somebody they know is looking
for a software developer. This will also help you connect better with your users,
because like it or not, they do <em>not</em> get your puns involving Klingon. (Besides,
the geek stereotype is SO 90's, and it's time we let the world know that.)
</p>
        <p>
Besides, you never know when having some depth in other areas—philosophy, music, art,
physics, sports, whatever—will help you create an analogy that will explain some thorny
computer science concept to a non-technical person and get past a communication roadblock.
</p>
        <h3>
          <strong>
            <em>3: Practice on a cadaver</em>
          </strong>
        </h3>
        <p>
Long before they scrub up for their first surgery on a human, medical students practice
on dead bodies. It's grisly, it's not something we really want to think about, but
when you're the one going under the general anesthesia, would you rather see the surgeon
flipping through the "How-To" manual, "just to refresh himself"?
</p>
        <p>
Diagnosing and debugging a software system can be a hugely puzzling trial, largely
because there are so many possible "moving parts" that are creating the
problem. Compound that with certain bugs that only appear when multiple users are
interacting at the same time, and you've got a recipe for disaster when a production
bug suddenly threatens to jeopardize the company's online revenue stream. Do you really
want to be sitting in the production center, flipping through "How-To"'s
and FAQs online while your boss looks on and your CEO is counting every minute by
the thousands of dollars?
</p>
        <p>
Take a tip from the med student: long before the thing goes into production, introduce
a bug, deploy the code into a virtual machine, then hand it over to a buddy and let
him try to track it down. Have him do the same for you. Or if you can't find a buddy
to help you, do it to yourself (but try not to cheat or let your knowledge of where
the bug is color your reactions). How do you know the bug is there? Once you know
it's there, how do you determine what kind of bug it is? Where do you start looking
for it? How would you track it down without attaching a debugger or otherwise disrupting
the system's operations? (Remember, we can't always just attach an IDE and step through
the code on a production server.) How do you patch the running system? And so on.
</p>
        <p>
Remember, you can either learn these things under controlled circumstances, learn
them while you're in the "hot seat", so to speak, or not learn them at all
and see how long the company keeps you around.
</p>
        <h3>
          <strong>
            <em>2: Administer the system</em>
          </strong>
        </h3>
        <p>
Take off your developer hat for a while—a week, a month, a quarter, whatever—and be
one of those thankless folks who have to keep the system running. Wear the pager that
goes off at 3AM when a server goes down. Stay all night doing one of those "server
upgrades" that have to be done in the middle of the night because the system
can't be upgraded while users are using it. Answer the phones or chat requests of
those hapless users who can't figure out why they can't find the record they just
entered into the system, and after a half-hour of thinking it must be a bug, ask them
if they remembered to check the "Save this record" checkbox on the UI (which
had to be there because the developers were told it had to be there) before submitting
the form. Try adding a user. Try removing a user. Try changing the user's password.
Learn what a real joy having seven different properties/XML/configuration files scattered
all over the system really is.
</p>
        <p>
Once you've done that, particularly on a system that you built and tossed over the
fence into production and thought that was the end of it, you'll understand just why
it's so important to keep the system administrators in mind when you're building a
system for production. And why it's critical to be able to have a system that tells
you when it's down, instead of having to go hunting up the answer when a VP tells
you it is (usually because he's just gotten an outage message from a customer or client).
</p>
        <h3>
          <strong>
            <em>1: Cultivate a peer group</em>
          </strong>
        </h3>
        <p>
Yes, you can join an online forum, ask questions, answer questions, and learn that
way, but that's a poor substitute for physical human contact once in a while. Like
it or not, various sociological and psychological studies confirm that a "connection"
is really still best made when eyeballs meet flesh. (The "disassociative"
nature of email is what makes it so easy to be rude or flamboyant or downright violent
in email when we would never say such things in person.) Go to conferences, join a
user group, even start one of your own if you can't find one. Yes, the online avenues
are still open to you—read blogs, join mailing lists or newsgroups—but don't lose
sight of human-to-human contact.
</p>
        <p>
While we're at it, don't create a peer group of people that all look to you for answers—as
flattering as that feels, and as much as we do learn by providing answers, frequently
we rise (or fall) to the level of our peers—have at least one peer group that's overwhelmingly
smarter than you, and as scary as it might be, venture to offer an answer or two to
that group when a question comes up. You don't have to be right—in fact, it's often
vastly more educational to be wrong. Just maintain an attitude that says "I have
no ego wrapped up in being right or wrong", and take the entire experience as
a learning opportunity.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4b2137dd-11cc-4ad5-8771-5906f2759273" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>10 Things To Improve Your Development Career</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,4b2137dd-11cc-4ad5-8771-5906f2759273.aspx</guid>
      <link>http://blogs.tedneward.com/2010/01/19/10+Things+To+Improve+Your+Development+Career.aspx</link>
      <pubDate>Tue, 19 Jan 2010 10:02:01 GMT</pubDate>
      <description>&lt;p&gt;
Cruising the Web late last night, I ran across &lt;a href="http://blogs.techrepublic.com.com/10things/?p=1297" target="_blank"&gt;&amp;quot;10
things you can do to advance your career as a developer&amp;quot;&lt;/a&gt;, summarized below:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Build a PC 
&lt;/li&gt;
&lt;li&gt;
Participate in an online forum and help others 
&lt;/li&gt;
&lt;li&gt;
Man the help desk 
&lt;/li&gt;
&lt;li&gt;
Perform field service 
&lt;/li&gt;
&lt;li&gt;
Perform DBA functions 
&lt;/li&gt;
&lt;li&gt;
Perform all phases of the project lifecycle 
&lt;/li&gt;
&lt;li&gt;
Recognize and learn the latest technologies 
&lt;/li&gt;
&lt;li&gt;
Be an independent contractor 
&lt;/li&gt;
&lt;li&gt;
Lead a project, supervise, or manage 
&lt;/li&gt;
&lt;li&gt;
Seek additional education 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
I agreed with some of them, I disagreed with others, and in general felt like they
were a little too high-level to be of real use. For example, &amp;quot;Seek additional
education&amp;quot; seems entirely too vague: In what? How much? How often? And &amp;quot;Recognize
and learn the latest technologies&amp;quot; is something like offering advice to the Olympic
fencing silver medalist and saying, &amp;quot;You should have tried harder&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
So, in the great spirit of &amp;quot;Not Invented Here&amp;quot;, I present my own list; as
usual, I welcome comment and argument. And, also as usual, caveats apply, since not
everybody will be in precisely the same place and be looking for the same things.
In general, though, whether you're looking to kick-start your career or just &amp;quot;kick
it up a notch&amp;quot;, I believe this list will help, because these ideas have been
of help to me at some point or another in my own career.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;10: Build a PC.&lt;/em&gt;&lt;/strong&gt; 
&lt;/h3&gt;
&lt;p&gt;
Yes, even developers have to know about hardware. More importantly, a developer at
a small organization or team will find himself in a position where he has to take
on some system administrator roles, and sometimes that means grabbing a screwdriver,
getting a little dusty and dirty, and swapping hardware around. Having said this,
though, once you've done it once or twice, leave it alone—the hardware game is an
ever-shifting and ever-changing game (much like software is, surprise surprise), and
it's been my experience that most of us only really have the time to pursue one or
the other.
&lt;/p&gt;
&lt;p&gt;
By the way, &amp;quot;PC&amp;quot; there is something of a generic term—build a Linux box,
build a Windows box, or &amp;quot;build&amp;quot; a Mac OS box (meaning, buy a Mac Pro and
trick it out a little—add more memory, add another hard drive, and so on), they all
get you comfortable with snapping parts together, and discovering just how ridiculously
simple the whole thing really is.
&lt;/p&gt;
&lt;p&gt;
And for the record, once you've done it, go ahead and go back to buying pre-built
systems or laptops—I've never found building a PC to be any cheaper than buying one
pre-built. Particularly for PC systems, I prefer to use smaller local vendors where
I can customize and trick out the box. If you're a Mac, that's not really an option
unless you're into the &amp;quot;Hackintosh&amp;quot; thing, which is quite possibly the logical
equivalent to &amp;quot;Build a PC&amp;quot;. Having never done it myself, though, I can't
say how useful that is as an educational action.
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;9: Pick a destination&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Do you want to run a team of your own? Become an independent contractor? Teach programming
classes? Speak at conferences? Move up into higher management and get out of the programming
game altogether? Everybody's got a different idea of what they consider to be the
&amp;quot;ideal&amp;quot; career, but it's amazing how many people don't really think about
what they want their career path to be.
&lt;/p&gt;
&lt;p&gt;
A wise man once said, &amp;quot;The journey of a thousand miles begins with a single step.&amp;quot;
I disagree: The journey of a thousand miles begins with the damn map. You have to
know where you want to go, and a rough idea of how to get there, before you can really
start with that single step. Otherwise, you're just wandering, which in itself isn't
a bad thing, but isn't going to get you to a destination except by random chance.
(Sometimes that's not a bad result, but at least then you're openly admitting that
you're leaving your career in the hands of chance. If you're OK with that, skip to
the next item. If you're not, read on.)
&lt;/p&gt;
&lt;p&gt;
Lay out explicitly (as in, write it down someplace) what kind of job you're wanting
to grow into, and then lay out a couple of scenarios that move you closer towards
that goal. Can you grow within the company you're in? (Have others been able to?)
Do you need to quit and strike out on your own? Do you want to lead a team of your
own? (Are there new projects coming in to the company that you could put yourself
forward as a potential tech lead?) And so on.
&lt;/p&gt;
&lt;p&gt;
Once you've identified the destination, now you can start thinking about steps to
get there. 
&lt;/p&gt;
&lt;p&gt;
If you want to become a speaker, put your name forward to give some presentations
at the local technology user group, or volunteer to hold a &amp;quot;brown bag&amp;quot; session
at the company. Sign up with Toastmasters to hone your speaking technique. Watch other
speakers give technical talks, and see what they do that you don't, and vice versa. 
&lt;/p&gt;
&lt;p&gt;
If you want to be a tech lead, start by quietly assisting other members of the team
get their work done. Help them debug thorny problems. Answer questions they have.
Offer yourself up as a resource for dealing with hard problems.
&lt;/p&gt;
&lt;p&gt;
If you want to slowly move up the management chain, look to get into the project management
side of things. Offer to be a point of contact for the users. Learn the business better.
Sit down next to one of your users and watch their interaction with the existing software,
and try to see the system from their point of view.
&lt;/p&gt;
&lt;p&gt;
And so on.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;8: Be a bell curve&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Frequently, at conferences, attendees ask me how I got to know so much on so many
things. In some ways, I'm reminded of the story of a world-famous concert pianist
giving a concert at Carnegie Hall—when a gushing fan said, &amp;quot;I'd give my life
to be able to play like that&amp;quot;, the pianist responded quietly, &amp;quot;I did&amp;quot;.
But as much as I'd like to leave you with the impression that I've dedicated my entire
life to knowing everything I could about this industry, that would be something of
a lie. The truth is, I don't know anywhere near as much as I'd like, and I'm always
poking my head into new areas. Thank God for my ADD, that's all I can say on that
one.
&lt;/p&gt;
&lt;p&gt;
For the rest of you, though, that's not feasible, and not really practical, particularly
since I have an advantage that the &amp;quot;working&amp;quot; programmer doesn't—I have set
aside weeks or months in which to do nothing more than study a new technology or language.
&lt;/p&gt;
&lt;p&gt;
Back in the early days of my career, though, when I was holding down the 9-to-5, I
was a Windows/C++ programmer. I was working with the Borland C++ compiler and its
associated framework, the ObjectWindows Library (OWL), extending and maintaining applications
written in it. One contracting client wanted me to work with Microsoft MFC instead
of OWL. Another one was storing data into a relational database using ODBC. And so
on. Slowly, over time, I built up a &amp;quot;bell curve&amp;quot;-looking collection of skills
that sort of &amp;quot;hovered&amp;quot; around the central position of C++/Windows.
&lt;/p&gt;
&lt;p&gt;
Then, one day, a buddy of mine mentioned the team on which he was a project manager
was looking for new blood. They were doing web applications, something with which
I had zero experience—this was completely outside of my bell curve. HTML, HTTP, Cold
Fusion, NetDynamics (an early Java app server), this was way out of my range, though
at least NetDynamics was a &lt;em&gt;little&lt;/em&gt; similar, since it was basically a server-side
application framework, and I had some experience with app frameworks from my C++ days.
So, resting on my C++ experience, I started flirting with Java, and so on.
&lt;/p&gt;
&lt;p&gt;
Before long, my &amp;quot;bell curve&amp;quot; had been readjusted to have Java more or less
at its center, and I found that experience in C++ still worked out here—what I knew
about ODBC turned out to be incredibly useful in understanding JDBC, what I knew about
DLLs from Windows turned out to be helpful in understanding Java's dynamic loading
model, and of course syntactically Java looked a lot like C++ even though it behaved
a little bit differently under the hood. (One article author suggested that Java was
closer to Smalltalk than C++, and that prompted me to briefly flirt with Smalltalk
before I concluded said author was out of his frakking mind.)
&lt;/p&gt;
&lt;p&gt;
All of this happened over roughly a three-year period, by the way.
&lt;/p&gt;
&lt;p&gt;
The point here is that you won't be able to assimilate the entire industry in a single
sitting, so pick something that's relatively close to what you already know, and use
your experience as a springboard to learn something that's new, yet possibly-if-not-probably
useful to your current job. You don't have to be a deep expert in it, and the further
away it is from what you do, the less you really need to know about it (hence the
bell curve metaphor), but you're still exposing yourself to new ideas and new concepts
and new tools/technologies that still could be applicable to what you do on a daily
basis. Over time the &amp;quot;center&amp;quot; of your bell curve may drift away from what
you've done to include new things, and that's OK.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;7: Learn one new thing every year&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
In the last tip, I told you to branch out slowly from what you know. In this tip,
I'm telling you to go throw a dart at something entirely unfamiliar to you and learn
it. Yes, I realize this sounds contradictory. It's because those who stick to only
what they know end up missing the radical shifts of direction that the industry hits
every half-decade or so until it's mainstream and commonplace and &amp;quot;everybody's
doing it&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
In their amazing book &amp;quot;The Pragmatic Programmer&amp;quot;, Dave Thomas and Andy Hunt
suggest that you learn one new programming language every year. I'm going to amend
that somewhat—not because there aren't enough languages in the world to keep you on
that pace for the rest of your life—far from it, if that's what you want, go learn
Ruby, F#, Scala, Groovy, Clojure, Icon, Io, Erlang, Haskell and Smalltalk, then come
back to me for the list for 2020—but because languages aren't the only thing that
we as developers need to explore. There's a lot of movement going on in areas beyond
languages, and you don't want to be the last kid on the block to know they're happening.
&lt;/p&gt;
&lt;p&gt;
Consider this list: object databases (&lt;a href="http://www.db4o.com" target="_blank"&gt;db4o&lt;/a&gt;)
and/or the &amp;quot;NoSQL&amp;quot; movement (&lt;a href="http://www.mongodb.org/display/DOCS/Tutorial" target="_blank"&gt;MongoDB&lt;/a&gt;).
Dependency injection and composable architectures (&lt;a href="http://www.springframework.org" target="_blank"&gt;Spring&lt;/a&gt;, &lt;a href="http://mef.codeplex.com" target="_blank"&gt;MEF&lt;/a&gt;).
A dynamic language (&lt;a href="http://www.rubyforge.org" target="_blank"&gt;Ruby&lt;/a&gt;, &lt;a href="http://www.python.org" target="_blank"&gt;Python&lt;/a&gt;, &lt;a href="http://www.ecmascript.org" target="_blank"&gt;ECMAScript&lt;/a&gt;).
A functional language (&lt;a href="http://msdn.microsoft.com/en-us/fsharp/default.aspx" target="_blank"&gt;F#&lt;/a&gt;, &lt;a href="http://www.scala-lang.org" target="_blank"&gt;Scala&lt;/a&gt;, &lt;a href="http://www.haskell.org" target="_blank"&gt;Haskell&lt;/a&gt;).
A Lisp (Common Lisp, &lt;a href="http://clojure.org" target="_blank"&gt;Clojure&lt;/a&gt;, Scheme,
Nu). A mobile platform (iPhone, Android). &amp;quot;Space&amp;quot;-based architecture (&lt;a href="http://www.gigaspaces.com" target="_blank"&gt;Gigaspaces&lt;/a&gt;,
Terracotta). Rich UI platforms (Flash/Flex, Silverlight). Browser enhancements (AJAX,
jQuery, HTML 5) and how they're different from the rich UI platforms. And this is
without adding any of the &amp;quot;obvious&amp;quot; stuff, like Cloud, to the list.
&lt;/p&gt;
&lt;p&gt;
(I'm not convinced Cloud is something worth learning this year, anyway.)
&lt;/p&gt;
&lt;p&gt;
You get through that list, you're operating outside of your comfort zone, and chances
are, your boss' comfort zone, which puts you into the enviable position of being somebody
who can advise him around those technologies. &lt;em&gt;DO NOT TAKE THIS TO MEAN YOU MUST
KNOW THEM DEEPLY.&lt;/em&gt; Just having a passing familiarity with them can be enough. &lt;em&gt;DO
NOT TAKE THIS TO MEAN YOU SHOULD PROPOSE USING THEM ON THE NEXT PROJECT.&lt;/em&gt; In fact,
sometimes the most compelling evidence that you really know where and when they should
be used is when you suggest stealing ideas from the thing, rather than trying to force-fit
the thing onto the project as a whole.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;6: Practice, practice, practice&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Speaking of the concert pianist, somebody once asked him how to get to Carnegie Hall.
HIs answer: &amp;quot;Practice, my boy, practice.&amp;quot;
&lt;/p&gt;
&lt;p&gt;
The same is true here. You're not going to get to be a better developer without practice.
Volunteer some time—even if it's just an hour a week—on an open-source project, or
start one of your own. Heck, it doesn't even have to be an &amp;quot;open source&amp;quot;
project—just create some requirements of your own, solve a problem that a family member
is having, or rewrite the project you're on as an interesting side-project. Do the
Nike thing and &amp;quot;Just do it&amp;quot;. Write some Scala code. Write some F# code.
Once you're past &amp;quot;hello world&amp;quot;, write the Scala code to use db4o as a persistent
storage. Wire it up behind Tapestry. Or write straight servlets in Scala. And so on.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;5: Turn off the TV&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Speaking of marketing slogans, if you're like most Americans, surveys have shown that
you watch about four hours of TV a day, or 28 hours of TV a week. In that same amount
of time (28 hours over 1 week), you could read the entire set of poems by Maya Angelou,
one F. Scott Fitzgerald novel, all poems by T.S.Eliot, 2 plays by Thornton Wilder,
or all 150 Psalms of the Bible. An average reader, reading just one hour a day, can
finish an &amp;quot;average-sized&amp;quot; book (let's assume about the size of a novel)
in a week, which translates to 52 books a year.
&lt;/p&gt;
&lt;p&gt;
Let's assume a technical book is going to take slightly longer, since it's a bit deeper
in concept and requires you to spend some time experimenting and typing in code; let's
assume that reading and going through the exercises of an average technical book will
require 4 weeks (a month) instead of just one week. That's 12 new tools/languages/frameworks/ideas
you'd be learning per year.
&lt;/p&gt;
&lt;p&gt;
All because you stopped watching David Caruso turn to the camera, whip his sunglasses
off and say something stupid. (I guess it's not his fault; &lt;em&gt;CSI:Miami&lt;/em&gt; is a
crap show. The other two are actually not bad, but &lt;em&gt;Miami&lt;/em&gt; just makes me retch.) 
&lt;/p&gt;
&lt;p&gt;
After all, when's the last time that David Caruso or the rest of that show did anything
that was even remotely realistic from a computer perspective? (I always laugh out
loud every time they run a database search against some national database on a completely
non-indexable criteria—like a partial license plate number—and it comes back in seconds.
What the hell database are THEY using? I want it!) Soon as you hear The Who break
into that riff, flip off the TV (or set it to mute) and pick up the book on the nightstand
and boost your career. (And hopefully sink Caruso's.)
&lt;/p&gt;
&lt;p&gt;
Or, if you just can't give up your weekly dose of Caruso, then put the book in the
bathroom. Think about it—how much time do you spend in there a week?
&lt;/p&gt;
&lt;p&gt;
And this gets even better when you get a Kindle or other e-reader that accepts PDFs,
or the book you're interested in is natively supported in the e-readers' format. Now
you have it with you for lunch, waiting at dinner for your food to arrive, or while
you're sitting guard on your 10-year-old so he doesn't sneak out of his room after
his bedtime to play more XBox.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;4: Have a life&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Speaking of XBox, don't slave your life to work. Pursue other things. Scientists have
repeatedly discovered that exercise helps keep the mind in shape, so take a couple
of hours a week (buh-bye, &lt;em&gt;American Idol&lt;/em&gt;) and go get some exercise. Pick up
a new sport you've never played before, or just go work out at the gym. (This year
I'm doing Hopkido and fencing.) Read some nontechnical books. (I recommend anything
by Malcolm Gladwell as a starting point.) Spend time with your family, if you have
one—mine spends at least six or seven hours a week playing &amp;quot;family games&amp;quot;
like &lt;a href="http://www.realitycheckgames.com/Products/127-the-settlers-of-catan.aspx" target="_blank"&gt;Settlers
of Catan&lt;/a&gt;, &lt;a href="http://www.realitycheckgames.com/Products/113-dominion.aspx" target="_blank"&gt;Dominion&lt;/a&gt;, &lt;a href="http://www.realitycheckgames.com/Products/88-to-court-the-king.aspx" target="_blank"&gt;To
Court The King&lt;/a&gt;, &lt;a href="http://www.realitycheckgames.com/Products/98-munchkin.aspx" target="_blank"&gt;Munchkin&lt;/a&gt;,
and other non-traditional games, usually over lunch or dinner. I also belong to an
informal &amp;quot;Game Night club&amp;quot; in Redmond consisting of several Microsoft employees
and their families, as well as outsiders. And so on. Heck, go to a local bar and watch
the game, and you'll meet some really interesting people. And some boring people,
too, but you don't have to talk to them during the next game if you don't want.
&lt;/p&gt;
&lt;p&gt;
This isn't just about maintaining a healthy work-life balance—it's also about having
interests that other people can latch on to, qualities that will make you more &amp;quot;human&amp;quot;
and more interesting as a person, and make you more attractive and &amp;quot;connectable&amp;quot;
and stand out better in their mind when they hear that somebody they know is looking
for a software developer. This will also help you connect better with your users,
because like it or not, they do &lt;em&gt;not&lt;/em&gt; get your puns involving Klingon. (Besides,
the geek stereotype is SO 90's, and it's time we let the world know that.)
&lt;/p&gt;
&lt;p&gt;
Besides, you never know when having some depth in other areas—philosophy, music, art,
physics, sports, whatever—will help you create an analogy that will explain some thorny
computer science concept to a non-technical person and get past a communication roadblock.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;3: Practice on a cadaver&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Long before they scrub up for their first surgery on a human, medical students practice
on dead bodies. It's grisly, it's not something we really want to think about, but
when you're the one going under the general anesthesia, would you rather see the surgeon
flipping through the &amp;quot;How-To&amp;quot; manual, &amp;quot;just to refresh himself&amp;quot;?
&lt;/p&gt;
&lt;p&gt;
Diagnosing and debugging a software system can be a hugely puzzling trial, largely
because there are so many possible &amp;quot;moving parts&amp;quot; that are creating the
problem. Compound that with certain bugs that only appear when multiple users are
interacting at the same time, and you've got a recipe for disaster when a production
bug suddenly threatens to jeopardize the company's online revenue stream. Do you really
want to be sitting in the production center, flipping through &amp;quot;How-To&amp;quot;'s
and FAQs online while your boss looks on and your CEO is counting every minute by
the thousands of dollars?
&lt;/p&gt;
&lt;p&gt;
Take a tip from the med student: long before the thing goes into production, introduce
a bug, deploy the code into a virtual machine, then hand it over to a buddy and let
him try to track it down. Have him do the same for you. Or if you can't find a buddy
to help you, do it to yourself (but try not to cheat or let your knowledge of where
the bug is color your reactions). How do you know the bug is there? Once you know
it's there, how do you determine what kind of bug it is? Where do you start looking
for it? How would you track it down without attaching a debugger or otherwise disrupting
the system's operations? (Remember, we can't always just attach an IDE and step through
the code on a production server.) How do you patch the running system? And so on.
&lt;/p&gt;
&lt;p&gt;
Remember, you can either learn these things under controlled circumstances, learn
them while you're in the &amp;quot;hot seat&amp;quot;, so to speak, or not learn them at all
and see how long the company keeps you around.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;2: Administer the system&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Take off your developer hat for a while—a week, a month, a quarter, whatever—and be
one of those thankless folks who have to keep the system running. Wear the pager that
goes off at 3AM when a server goes down. Stay all night doing one of those &amp;quot;server
upgrades&amp;quot; that have to be done in the middle of the night because the system
can't be upgraded while users are using it. Answer the phones or chat requests of
those hapless users who can't figure out why they can't find the record they just
entered into the system, and after a half-hour of thinking it must be a bug, ask them
if they remembered to check the &amp;quot;Save this record&amp;quot; checkbox on the UI (which
had to be there because the developers were told it had to be there) before submitting
the form. Try adding a user. Try removing a user. Try changing the user's password.
Learn what a real joy having seven different properties/XML/configuration files scattered
all over the system really is.
&lt;/p&gt;
&lt;p&gt;
Once you've done that, particularly on a system that you built and tossed over the
fence into production and thought that was the end of it, you'll understand just why
it's so important to keep the system administrators in mind when you're building a
system for production. And why it's critical to be able to have a system that tells
you when it's down, instead of having to go hunting up the answer when a VP tells
you it is (usually because he's just gotten an outage message from a customer or client).
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;1: Cultivate a peer group&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Yes, you can join an online forum, ask questions, answer questions, and learn that
way, but that's a poor substitute for physical human contact once in a while. Like
it or not, various sociological and psychological studies confirm that a &amp;quot;connection&amp;quot;
is really still best made when eyeballs meet flesh. (The &amp;quot;disassociative&amp;quot;
nature of email is what makes it so easy to be rude or flamboyant or downright violent
in email when we would never say such things in person.) Go to conferences, join a
user group, even start one of your own if you can't find one. Yes, the online avenues
are still open to you—read blogs, join mailing lists or newsgroups—but don't lose
sight of human-to-human contact.
&lt;/p&gt;
&lt;p&gt;
While we're at it, don't create a peer group of people that all look to you for answers—as
flattering as that feels, and as much as we do learn by providing answers, frequently
we rise (or fall) to the level of our peers—have at least one peer group that's overwhelmingly
smarter than you, and as scary as it might be, venture to offer an answer or two to
that group when a question comes up. You don't have to be right—in fact, it's often
vastly more educational to be wrong. Just maintain an attitude that says &amp;quot;I have
no ego wrapped up in being right or wrong&amp;quot;, and take the entire experience as
a learning opportunity.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4b2137dd-11cc-4ad5-8771-5906f2759273" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,4b2137dd-11cc-4ad5-8771-5906f2759273.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=680b8296-ba07-4230-b067-edceaf04e84b</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,680b8296-ba07-4230-b067-edceaf04e84b.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,680b8296-ba07-4230-b067-edceaf04e84b.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=680b8296-ba07-4230-b067-edceaf04e84b</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Here we go again—another year, another set of predictions revisited and offered up
for the next 12 months. And maybe, if I'm feeling really ambitious, I'll take that
shot I thought about last year and try predicting for the decade. Without further
ado, I'll go back and revisit, unedited, my predictions for 2009 ("<strong>THEN</strong>"),
and pontificate on those subjects for 2010 before adding any new material/topics.
Just for convenience, <a href="http://blogs.tedneward.com/2009/01/01/2009+Predictions+2008+Predictions+Revisited.aspx" target="_blank">here's
a link back to last years' predictions</a>.
</p>
        <p>
Last year's predictions went something like this (complete with basketball-scoring):
</p>
        <ul>
          <li>
            <strong>THEN: </strong>"Cloud" will become the next "ESB" or "SOA",
in that it will be something that everybody will talk about, but few will understand
and even fewer will do anything with. (Considering the widespread disparity in the
definition of the term, this seems like a no-brainer.) <strong>NOW:</strong> Oh, yeah.
Straight up. I get two points for this one. Does <em>anyone</em> have a working definition
of "cloud" that applies to all of the major vendors' implementations? <em>Ted,
2; Wrongness, 0</em>.</li>
          <li>
            <strong>THEN: </strong>Interest in Scala will continue to rise, as will the number
of detractors who point out that Scala is too hard to learn. <strong>NOW:</strong> Two
points for this one, too. Not a hard one, mind you, but one of those "pass-and-shoot"
jumpers from twelve feet out. James Strachan even tweeted about this earlier today,
pointing out this comparison. As more Java developers who think of themselves as smart
people try to pick up Scala and fail, the numbers of sour grapes responses like "Scala's
too complex, and who needs that functional stuff anyway?" will continue to rise
in 2010. <em>Ted, 4; Wrongness, 0</em>.</li>
          <li>
            <strong>THEN</strong>: Interest in F# will continue to rise, as will the number of
detractors who point out that F# is too hard to learn. (Hey, the two really are cousins,
and the fortunes of one will serve as a pretty good indication of the fortunes of
the other, and both really seem to be on the same arc right now.) <strong>NOW:</strong> Interestingly
enough, I haven't heard as many F# detractors as Scala detractors, possibly because
I think F# hasn't really reached the masses of .NET developers the way that Scala
has managed to find its way in front of Java developers. I think that'll change mighty
quickly in 2010, though, once VS 2010 hits the streets. <em>Ted, 4; Wrongness 2</em>.</li>
          <li>
            <strong>THEN</strong>
            <em>:</em> Interest in all kinds of functional languages will
continue to rise, and more than one person will take a hint from Bob "crazybob"
Lee and liken functional programming to AOP, for good and for ill. People who took
classes on Haskell in college will find themselves reaching for their old college
textbooks again. <strong>NOW:</strong> Yep, I'm claiming two points on this one, if
only because a bunch of Haskell books shipped this year, and they'll be the last to
do so for about five years after this. (By the way, does anybody still remember aspects?)
But I'm going the opposite way with this one now; yes, there's Haskell, and yes, there's
Erlang, and yes, there's a lot of other functional languages out there, but who cares?
They're hard to learn, they don't always translate well to other languages, and developers
want languages that work on the platform they use on a daily basis, and that means
F# and Scala or Clojure, or its simply not an option. <em>Ted 6; Wrongness 2</em>.</li>
          <li>
            <strong>THEN</strong>
            <em>:</em> The iPhone is going to be hailed as "the enterprise
development platform of the future", and companies will be rolling out apps to
it. Look for Quicken iPhone edition, PowerPoint and/or Keynote iPhone edition, along
with connectors to hook the iPhone up to a presentation device, and (I'll bet) a World
of Warcraft iPhone client (legit or otherwise). iPhone is the new hotness in the mobile
space, and people will flock to it madly. <strong>NOW:</strong> Two more points, but
let's be honest—this was a fast-break layup, no work required on my part. <em>Ted
8; Wrongness 2.</em></li>
          <li>
            <strong>THEN</strong>: Another Oslo CTP will come out, and it will bear only a superficial
resemblance to the one that came out in October at PDC. Betting on Oslo right now
is a fools' bet, not because of any inherent weakness in the technology, but just
because it's way too early in the cycle to be thinking about for anything vaguely
resembling production code. <strong>NOW:</strong> If you've worked at all with Oslo,
you might argue with me, but I'm still taking my two points. The two CTPs were pretty
different in a number of ways. <em>Ted 10; Wrongness 2.</em></li>
          <li>
            <strong>THEN</strong>: The IronPython and IronRuby teams will find some serious versioning
issues as they try to manage the DLR versioning story between themselves and the CLR
as a whole. An initial hack will result, which will be codified into a standard practice
when .NET 4.0 ships. Then the next release of IPy or IRb will have to try and slip
around its restrictions in 2010/2011. By 2012, IPy and IRb will have to be shipping
as part of Visual Studio just to put the releases back into lockstep with one another
(and the rest of the .NET universe). <strong>NOW:</strong> Pressure is still building.
Let's see what happens by the time VS 2010 ships, and then see what the IPy/IRb teams
start to do to adjust to the versioning issues that arise. <em>Ted 8; Wrongness 2.</em></li>
          <li>
            <strong>THEN</strong>: The death of JSR-277 will spark an uprising among the two leading
groups hoping to foist it off on the Java community--OSGi and Maven--while the rest
of the Java world will breathe a huge sigh of relief and look to see what "modularity"
means in Java 7. Some of the alpha geeks in Java will start using--if not building--JDK
7 builds just to get a heads-up on its impact, and be quietly surprised and, I dare
say, perhaps even pleased. <strong>NOW:</strong> Ah, Ted, you really should never
underestimate the community's willingness to take a bad idea, strip all the goodness
out of it, and then cycle it back into the mix as something completely different yet
somehow just as dangerous and crazy. I give you Project Jigsaw. <em>Ted 10; Wrongness
2;</em></li>
          <li>
            <strong>THEN</strong>: The invokedynamic JSR will leapfrog in importance to the top
of the list. <strong>NOW:</strong> The invokedynamic JSR begat interest in other languages
on the JVM. The interest in other languages on the JVM begat the need to start thinking
about how to support them in the Java libraries. The need to start thinking about
supporting those languages begat a "Holy sh*t moment" somewhere inside Sun
and led them to (re-)propose closures for JDK 7. And in local sports news, Ted notched
up two more points on the scoreboard. <em>Ted 12; Wrongness 2.</em></li>
          <li>
            <strong>THEN</strong>: Another Windows 7 CTP will come out, and it will spawn huge
media interest that will eventually be remembered as Microsoft promises, that will
eventually be remembered as Microsoft guarantees, that will eventually be remembered
as Microsoft FUD and "promising much, delivering little". Microsoft ain't
always at fault for the inflated expectations people have--sometimes, yes, perhaps
even a lot of times, but not always. <strong>NOW:</strong> And then, just when the
game started to turn into a runaway, airballs started to fly. The Windows7 release
shipped, and contrary to what I expected, the general response to it was pretty warm.
Yes, there were a few issues that emerged, but overall the media liked it, the masses
liked it, and Microsoft seemed to have dodged a bullet. <em>Ted 12; Wrongness 5.</em></li>
          <li>
            <strong>THEN</strong>: Apple will begin to legally threaten the clone market again,
except this time somebody's going to get the DOJ involved. (Yes, this is the iPhone/iTunes
prediction from last year, carrying over. I still expect this to happen.) <strong>NOW:</strong> What
clones? The only people trying to clone Macs are those who are building Hackintosh
machines, and Apple can't sue them so long as they're using licensed copies of Mac
OS X (as far as I know). Which has never stopped them from trying, mind you, and I
still think Steve has some part of his brain whispering to him at night, calculating
all the hardware sales lost to Hackintosh netbooks out there. But in any event, that's
another shot missed. <em>Ted 12; Wrongness 7.</em></li>
          <li>
            <strong>THEN</strong>: Alpha-geek developers will start creating their own languages
(even if they're obscure or bizarre ones like Shakespeare or Ook#) just to have that
listed on their resume as the DSL/custom language buzz continues to build. <strong>NOW:</strong> I
give you Ioke. If I'd extended this to include outdated CPU interpreters, I'd have
made that three-pointer from half-court instead of just the top of the key. <em>Ted
14; Wrongness 7.</em></li>
          <li>
            <strong>THEN</strong>: Roy Fielding will officially disown most of the "REST"ful
authors and software packages available. Nobody will care--or worse, somebody looking
to make a name for themselves will proclaim that Roy "doesn't really understand
REST". And they'll be right--Roy doesn't understand what <em>they</em> consider
to be REST, and the fact that he created the term will be of no importance anymore.
Being "REST"ful will equate to "I did it myself!", complete with
expectations of a gold star and a lollipop. <strong>NOW:</strong> Does anybody in
the REST community care what Roy Fielding wrote way back when? I keep seeing "REST"ful
systems that seem to have designers who've never heard of Roy, or his thesis. Roy
hasn't officially disowned them, but damn if he doesn't seem close to it. Still....
No points. <em>Ted 14; Wrongness 9.</em></li>
          <li>
            <strong>THEN</strong>: The Parrot guys will make at least one more minor point release.
Nobody will notice or care, except for a few doggedly stubborn Perl hackers. They
will find themselves having nightmares of previous lives carrying around OS/2 books
and Amiga paraphernalia. Perl 6 will celebrate it's seventh... or is it eighth?...
anniversary of being announced, and nobody will notice. <strong>NOW:</strong> Does
anybody still follow Perl 6 development? Has the spec even been written yet? Google
on "Perl 6 release", and you get varying reports: "It'll ship 'when
it's ready'", "There are no such dates because this isn't a commericially-backed
effort", and "Spring 2010". Swish—nothin' but net. <em>Ted 16; Wrongness
9.</em></li>
          <li>
            <strong>THEN</strong>: The debate around "Scrum Certification" will rise
to a fever pitch as short-sighted money-tight companies start looking for reasons
to cut costs and either buy into agile at a superficial level and watch it fail, or
start looking to cut the agilists from their company in order to replace them with
cheaper labor. <strong>NOW:</strong> Agile has become another adjective meaning "best
practices", and as such, has essentially lost its meaning. Just ask Scott Bellware. <em>Ted
18; Wrongness 9.</em></li>
          <li>
            <strong>THEN</strong>: Adobe will continue to make Flex and AIR look more like C#
and the CLR even as Microsoft tries to make Silverlight look more like Flash and AIR.
Web designers will now get to experience the same fun that back-end web developers
have enjoyed for near-on a decade, as shops begin to artificially partition themselves
up as either "Flash" shops or "Silverlight" shops. <strong>NOW:</strong> Not
sure how to score this one—I haven't seen the explicit partitioning happen yet, but
the two environments definitely still seem to be looking to start tromping on each
others' turf, particularly when we look at the rapid releases coming from the Silverlight
team. <em>Ted 16; Wrongness 11.</em></li>
          <li>
            <strong>THEN</strong>: Gartner will still come knocking, looking to hire me for outrageous
sums of money to do nothing but blog and wax prophetic. <strong>NOW:</strong> Still
no job offers. Damn. Ah, well. <em>Ted 16; Wrongness 13.</em></li>
        </ul>
        <p>
A close game. Could've gone either way. *shrug* Ah, well. It was silly to try and
score it in basketball metaphor, anyway—that's the last time I watch ESPN before writing
this.
</p>
        <p>
For 2010, I predict....
</p>
        <ul>
          <li>
            <em>... I will offer 3- and 4-day training classes on F# and Scala, among other things.</em> OK,
that's not fair—yes, I have the materials, I just need to work out locations and times.
Contact me if you're interested in a private class, by the way.</li>
          <li>
            <em>... I will publish two books, one on F# and one on Scala.</em> OK, OK, another
plug. Or, rather, more of a resolution. One will be the "Professional F#"
I'm doing for Wiley/Wrox, the other isn't yet finalized. But it'll either be published
through a publisher, or self-published, by JavaOne 2010.</li>
          <li>
            <em>... DSLs will either "succeed" this year, or begin the short slide into
the dustbin of obscure programming ideas.</em> Domain-specific language advocates
have to put up some kind of strawman for developers to learn from and poke at, or
the whole concept will just fade away. Martin's book will help, if it ships this year,
but even that might not be enough to generate interest if it doesn't have some kind
of large-scale applicability in it. Patterns and refactoring and enterprise containers
all had a huge advantage in that developers could see pretty easily what the problem
was they solved; DSLs haven't made that clear yet.</li>
          <li>
            <em>... functional languages will start to see a backlash.</em> I hate to say it,
but "getting" the functional mindset is hard, and there's precious few resources
that are making it easy for mainstream (read: O-O) developers make that adjustment,
far fewer than there was during the procedural-to-object shift. If the functional
community doesn't want to become mainstream, then mainstream developers will find
ways to take functional's most compelling gateway use-case (parallel/concurrent programming)
and find a way to "git 'er done" in the traditional O-O approach, probably
through software transactional memory, and functional languages like Haskell and Erlang
will be relegated to the "What Might Have Been" of computer science history.
Not sure what I mean? Try this: walk into a functional language forum, and ask what
a monad is. Nobody yet has been able to produce an answer that doesn't involve math
theory, or that does involve a practical domain-object-based example. In fact, nobody
has really said why (or if) monads are even still useful. Or catamorphisms. Or any
of the other dime-store words that the functional community likes to toss around.</li>
          <li>
            <em>... Visual Studio 2010 will ship on time, and be one of the buggiest and/or slowest
releases in its history.</em> I hate to make this prediction, because I really don't
want to be right, but there's just so much happening in the Visual Studio refactoring
effort that it makes me incredibly nervous. Widespread adoption of VS2010 will wait
until SP1 at the earliest. In fact....</li>
          <li>
            <em>... Visual Studio 2010 SP 1 will ship within three months of the final product.</em> Microsoft
knows that people wait until SP 1 to think about upgrading, so they'll just plan for
an eager SP 1 release, and hope that managers will be too hung over from the New Year
(still) to notice that the necessary shakeout time hasn't happened.</li>
          <li>
            <em>... Apple will ship a tablet with multi-touch on it, and it will flop horribly.</em> Not
sure why I think this, but I just don't think the multi-touch paradigm that Apple
has cooked up for the iPhone will carry over to a tablet/laptop device. That won't
stop them from shipping it, and it won't stop Apple fan-boiz from buying it, but that's
about where the interest will end.</li>
          <li>
            <em>... JDK 7 closures will be debated for a few weeks, then become a fait accompli
as the Java community shrugs its collective shoulders.</em> Frankly, I think the Java
community has exhausted its interest in debating new language features for Java. Recent
college grads and open-source groups with an axe to grind will continue to try and
make an issue out of this, but I think the overall Java community just... doesn't...
care. They just want to see JDK 7 ship someday.</li>
          <li>
            <em>... Scala either "pops" in 2010, or begins to fall apart.</em> By "pops",
I mean reaches a critical mass of developers interested in using it, enough to convince
somebody to create a company around it, a la G2One.</li>
          <li>
            <em>... Oracle is going to make a serious "cloud" play, probably by offering
an Oracle-hosted version of Azure or AppEngine.</em> Oracle loves the enterprise space
too much, and derives too much money from it, to not at least appear to have some
kind of offering here. Now that they own Java, they'll marry it up against OpenSolaris,
the Oracle database, and throw the whole thing into a series of server centers all
over the continent, and call it "Oracle 12c" (c for Cloud, of course) or
something.</li>
          <li>
            <em>... Spring development will slow to a crawl and start to take a left turn toward
cloud ideas.</em> VMWare bought SpringSource for a reason, and I believe it's entirely
centered around VMWare's movement into the cloud space—they want to be more than "just"
a virtualization tool. Spring + Groovy makes a compelling development stack, particularly
if VMWare does some interesting hooks-n-hacks to make Spring a virtualization environment
in its own right somehow. But from a practical perspective, any community-driven development
against Spring is all but basically dead. The source may be downloadable later, like
the VMWare Player code is, but making contributions back? Fuhgeddabowdit.</li>
          <li>
            <em>... the explosion of e-book readers brings the Kindle 2009 edition way down to
size.</em> The era of the e-book reader is here, and honestly, while I'm glad I have
a Kindle, I'm expecting that I'll be dusting it off a shelf in a few years. Kinda
like I do with my iPods from a few years ago.</li>
          <li>
            <em>... "social networking" becomes the "Web 2.0" of 2010.</em> In
other words, using the term will basically identify you as a tech wannabe and clearly
out of touch with the bleeding edge.</li>
          <li>
            <em>... Facebook becomes a developer platform requirement.</em> I don't pretend to
know anything about Facebook—I'm not even on it, which amazes my family to no end—but
clearly Facebook is one of those mechanisms by which people reach each other, and
before long, it'll start showing up as a developer requirement for companies looking
to hire. If you're looking to build out your resume to make yourself attractive to
companies in 2010, mad Facebook skillz might not be a bad investment.</li>
          <li>
            <em>... Nintendo releases an open SDK for building games for its next-gen DS-based
device.</em> With the spectacular success of games on the iPhone, Nintendo clearly
must see that they're missing a huge opportunity every day developers can't write
games for the Nintendo DS that are easily downloadable to the device for playing.
Nintendo is not stupid—if they don't open up the SDK and promote "casual"
games like those on the iPhone and those that can now be downloaded to the Zune or
the XBox, they risk being marginalized out of existence.</li>
        </ul>
        <p>
And for the next decade, I predict....
</p>
        <ul>
          <li>
            <em>... colleges and unversities will begin issuing e-book reader devices to students.</em> It's
a helluvalot cheaper than issuing laptops or netbooks, and besides....</li>
          <li>
            <em>... netbooks and e-book readers will merge before the decade is out.</em> Let's
be honest—if the e-book reader could do email and browse the web, you have almost
the perfect paperback-sized mobile device. As for the credit-card sized mobile device....</li>
          <li>
            <em>... mobile phones will all but disappear as they turn into what PDAs tried to
be.</em> "The iPhone makes calls? Really? You mean Voice-over-IP, right? No,
wait, over cell signal? It can <em>do </em>that? Wow, there's really an app for everything,
isn't there?"</li>
          <li>
            <em>... wireless formats will skyrocket in importance all around the office and home.</em> Combine
the iPhone's Bluetooth (or something similar yet lower-power-consuming) with an equally-capable
(Bluetooth or otherwise) projector, and suddenly many executives can leave their netbook
or laptop at home for a business presentation. Throw in the Whispersync-aware e-book
reader/netbook-thing, and now most executives have absolutely zero reason to carry
anything but their e-book/netbook and their phone/PDA. The day somebody figures out
an easy way to combine Bluetooth with PayPal on the iPhone or Android phone, we will
have more or less made pocket change irrelevant. And believe me, that day will happen
before the end of the decade.</li>
          <li>
            <em>... either Android or Windows Mobile will gain some serious market share against
the iPhone the day they figure out how to support an open and unrestricted AppStore-like
app acquisition model.</em> Let's be honest, the attraction of iTunes and AppStore
is that I can see an "Oh, cool!" app on a buddy's iPhone, and have it on
mine less than 30 seconds later. If Android or WinMo can figure out how to offer that
same kind of experience without the draconian AppStore policies to go with it, they'll
start making up lost ground on iPhone in a hurry.</li>
          <li>
            <em>... Apple becomes the DOJ target of the decade.</em> Microsoft was it in the 2000's,
and Apple's stunning rising success is going to put it squarely in the sights of monopolist
accusations before long. Coupled with the unfortunate health distractions that Steve
Jobs has to deal with, Apple's going to get hammered pretty hard by the end of the
decade, but it will have mastered enough market share and mindshare to weather it
as Microsoft has.</li>
          <li>
            <em>... Google becomes the next Microsoft.</em> It won't be anything the founders
do, but Google will do "something evil", and it will be loudly and screechingly
pointed out by all of Google's corporate opponents, and the star will have fallen.</li>
          <li>
... <em>Microsoft finds its way again.</em> Microsoft, as a company, has lost its
way. This is a company that's not used to losing, and like Bill Belichick's Patriots,
they will find ways to adapt and adjust to the changed circumstances of their position
to find a way to win again. What that'll be, I have no idea, but historically, the
last decade notwithstanding, betting against Microsoft has historically been a bad
idea. My gut tells me they'll figure something new to get that mojo back.</li>
          <li>
            <em>... a politician will make himself or herself famous by standing up to the TSA.</em> The
scene will play out like this: during a Congressional hearing on airline security,
after some nut/terrorist tries to blow up another plane through nitroglycerine-soaked
underwear, the TSA director will suggest all passengers should fly naked in order
to preserve safety, the congressman/woman will stare open-mouthed at this suggestion,
proclaim, "Have you no sense of decency, sir?" and immediately get a standing
ovation and never have to worry about re-election again. Folks, if we want to prevent
any chance of loss of life from a terrorist act on an airplane, we have to prevent
passengers from getting on them. Otherwise, just accept that it might happen, do a
reasonable job of preventing it from happening, and let private insurance start offering
flight insurance against the possibility to reassure the paranoid.</li>
        </ul>
        <p>
See you all next year.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=680b8296-ba07-4230-b067-edceaf04e84b" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>2010 Predictions, 2009 Predictions Revisited</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,680b8296-ba07-4230-b067-edceaf04e84b.aspx</guid>
      <link>http://blogs.tedneward.com/2010/01/05/2010+Predictions+2009+Predictions+Revisited.aspx</link>
      <pubDate>Tue, 05 Jan 2010 09:45:59 GMT</pubDate>
      <description>&lt;p&gt;
Here we go again—another year, another set of predictions revisited and offered up
for the next 12 months. And maybe, if I'm feeling really ambitious, I'll take that
shot I thought about last year and try predicting for the decade. Without further
ado, I'll go back and revisit, unedited, my predictions for 2009 (&amp;quot;&lt;strong&gt;THEN&lt;/strong&gt;&amp;quot;),
and pontificate on those subjects for 2010 before adding any new material/topics.
Just for convenience, &lt;a href="http://blogs.tedneward.com/2009/01/01/2009+Predictions+2008+Predictions+Revisited.aspx" target="_blank"&gt;here's
a link back to last years' predictions&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Last year's predictions went something like this (complete with basketball-scoring):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&amp;quot;Cloud&amp;quot; will become the next &amp;quot;ESB&amp;quot; or &amp;quot;SOA&amp;quot;,
in that it will be something that everybody will talk about, but few will understand
and even fewer will do anything with. (Considering the widespread disparity in the
definition of the term, this seems like a no-brainer.) &lt;strong&gt;NOW:&lt;/strong&gt; Oh, yeah.
Straight up. I get two points for this one. Does &lt;em&gt;anyone&lt;/em&gt; have a working definition
of &amp;quot;cloud&amp;quot; that applies to all of the major vendors' implementations? &lt;em&gt;Ted,
2; Wrongness, 0&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;Interest in Scala will continue to rise, as will the number
of detractors who point out that Scala is too hard to learn. &lt;strong&gt;NOW:&lt;/strong&gt; Two
points for this one, too. Not a hard one, mind you, but one of those &amp;quot;pass-and-shoot&amp;quot;
jumpers from twelve feet out. James Strachan even tweeted about this earlier today,
pointing out this comparison. As more Java developers who think of themselves as smart
people try to pick up Scala and fail, the numbers of sour grapes responses like &amp;quot;Scala's
too complex, and who needs that functional stuff anyway?&amp;quot; will continue to rise
in 2010. &lt;em&gt;Ted, 4; Wrongness, 0&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Interest in F# will continue to rise, as will the number of
detractors who point out that F# is too hard to learn. (Hey, the two really are cousins,
and the fortunes of one will serve as a pretty good indication of the fortunes of
the other, and both really seem to be on the same arc right now.) &lt;strong&gt;NOW:&lt;/strong&gt; Interestingly
enough, I haven't heard as many F# detractors as Scala detractors, possibly because
I think F# hasn't really reached the masses of .NET developers the way that Scala
has managed to find its way in front of Java developers. I think that'll change mighty
quickly in 2010, though, once VS 2010 hits the streets. &lt;em&gt;Ted, 4; Wrongness 2&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;&lt;em&gt;:&lt;/em&gt; Interest in all kinds of functional languages will
continue to rise, and more than one person will take a hint from Bob &amp;quot;crazybob&amp;quot;
Lee and liken functional programming to AOP, for good and for ill. People who took
classes on Haskell in college will find themselves reaching for their old college
textbooks again. &lt;strong&gt;NOW:&lt;/strong&gt; Yep, I'm claiming two points on this one, if
only because a bunch of Haskell books shipped this year, and they'll be the last to
do so for about five years after this. (By the way, does anybody still remember aspects?)
But I'm going the opposite way with this one now; yes, there's Haskell, and yes, there's
Erlang, and yes, there's a lot of other functional languages out there, but who cares?
They're hard to learn, they don't always translate well to other languages, and developers
want languages that work on the platform they use on a daily basis, and that means
F# and Scala or Clojure, or its simply not an option. &lt;em&gt;Ted 6; Wrongness 2&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;&lt;em&gt;:&lt;/em&gt; The iPhone is going to be hailed as &amp;quot;the enterprise
development platform of the future&amp;quot;, and companies will be rolling out apps to
it. Look for Quicken iPhone edition, PowerPoint and/or Keynote iPhone edition, along
with connectors to hook the iPhone up to a presentation device, and (I'll bet) a World
of Warcraft iPhone client (legit or otherwise). iPhone is the new hotness in the mobile
space, and people will flock to it madly. &lt;strong&gt;NOW:&lt;/strong&gt; Two more points, but
let's be honest—this was a fast-break layup, no work required on my part. &lt;em&gt;Ted
8; Wrongness 2.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Another Oslo CTP will come out, and it will bear only a superficial
resemblance to the one that came out in October at PDC. Betting on Oslo right now
is a fools' bet, not because of any inherent weakness in the technology, but just
because it's way too early in the cycle to be thinking about for anything vaguely
resembling production code. &lt;strong&gt;NOW:&lt;/strong&gt; If you've worked at all with Oslo,
you might argue with me, but I'm still taking my two points. The two CTPs were pretty
different in a number of ways. &lt;em&gt;Ted 10; Wrongness 2.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: The IronPython and IronRuby teams will find some serious versioning
issues as they try to manage the DLR versioning story between themselves and the CLR
as a whole. An initial hack will result, which will be codified into a standard practice
when .NET 4.0 ships. Then the next release of IPy or IRb will have to try and slip
around its restrictions in 2010/2011. By 2012, IPy and IRb will have to be shipping
as part of Visual Studio just to put the releases back into lockstep with one another
(and the rest of the .NET universe). &lt;strong&gt;NOW:&lt;/strong&gt; Pressure is still building.
Let's see what happens by the time VS 2010 ships, and then see what the IPy/IRb teams
start to do to adjust to the versioning issues that arise. &lt;em&gt;Ted 8; Wrongness 2.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: The death of JSR-277 will spark an uprising among the two leading
groups hoping to foist it off on the Java community--OSGi and Maven--while the rest
of the Java world will breathe a huge sigh of relief and look to see what &amp;quot;modularity&amp;quot;
means in Java 7. Some of the alpha geeks in Java will start using--if not building--JDK
7 builds just to get a heads-up on its impact, and be quietly surprised and, I dare
say, perhaps even pleased. &lt;strong&gt;NOW:&lt;/strong&gt; Ah, Ted, you really should never
underestimate the community's willingness to take a bad idea, strip all the goodness
out of it, and then cycle it back into the mix as something completely different yet
somehow just as dangerous and crazy. I give you Project Jigsaw. &lt;em&gt;Ted 10; Wrongness
2;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: The invokedynamic JSR will leapfrog in importance to the top
of the list. &lt;strong&gt;NOW:&lt;/strong&gt; The invokedynamic JSR begat interest in other languages
on the JVM. The interest in other languages on the JVM begat the need to start thinking
about how to support them in the Java libraries. The need to start thinking about
supporting those languages begat a &amp;quot;Holy sh*t moment&amp;quot; somewhere inside Sun
and led them to (re-)propose closures for JDK 7. And in local sports news, Ted notched
up two more points on the scoreboard. &lt;em&gt;Ted 12; Wrongness 2.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Another Windows 7 CTP will come out, and it will spawn huge
media interest that will eventually be remembered as Microsoft promises, that will
eventually be remembered as Microsoft guarantees, that will eventually be remembered
as Microsoft FUD and &amp;quot;promising much, delivering little&amp;quot;. Microsoft ain't
always at fault for the inflated expectations people have--sometimes, yes, perhaps
even a lot of times, but not always. &lt;strong&gt;NOW:&lt;/strong&gt; And then, just when the
game started to turn into a runaway, airballs started to fly. The Windows7 release
shipped, and contrary to what I expected, the general response to it was pretty warm.
Yes, there were a few issues that emerged, but overall the media liked it, the masses
liked it, and Microsoft seemed to have dodged a bullet. &lt;em&gt;Ted 12; Wrongness 5.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Apple will begin to legally threaten the clone market again,
except this time somebody's going to get the DOJ involved. (Yes, this is the iPhone/iTunes
prediction from last year, carrying over. I still expect this to happen.) &lt;strong&gt;NOW:&lt;/strong&gt; What
clones? The only people trying to clone Macs are those who are building Hackintosh
machines, and Apple can't sue them so long as they're using licensed copies of Mac
OS X (as far as I know). Which has never stopped them from trying, mind you, and I
still think Steve has some part of his brain whispering to him at night, calculating
all the hardware sales lost to Hackintosh netbooks out there. But in any event, that's
another shot missed. &lt;em&gt;Ted 12; Wrongness 7.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Alpha-geek developers will start creating their own languages
(even if they're obscure or bizarre ones like Shakespeare or Ook#) just to have that
listed on their resume as the DSL/custom language buzz continues to build. &lt;strong&gt;NOW:&lt;/strong&gt; I
give you Ioke. If I'd extended this to include outdated CPU interpreters, I'd have
made that three-pointer from half-court instead of just the top of the key. &lt;em&gt;Ted
14; Wrongness 7.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Roy Fielding will officially disown most of the &amp;quot;REST&amp;quot;ful
authors and software packages available. Nobody will care--or worse, somebody looking
to make a name for themselves will proclaim that Roy &amp;quot;doesn't really understand
REST&amp;quot;. And they'll be right--Roy doesn't understand what &lt;em&gt;they&lt;/em&gt; consider
to be REST, and the fact that he created the term will be of no importance anymore.
Being &amp;quot;REST&amp;quot;ful will equate to &amp;quot;I did it myself!&amp;quot;, complete with
expectations of a gold star and a lollipop. &lt;strong&gt;NOW:&lt;/strong&gt; Does anybody in
the REST community care what Roy Fielding wrote way back when? I keep seeing &amp;quot;REST&amp;quot;ful
systems that seem to have designers who've never heard of Roy, or his thesis. Roy
hasn't officially disowned them, but damn if he doesn't seem close to it. Still....
No points. &lt;em&gt;Ted 14; Wrongness 9.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: The Parrot guys will make at least one more minor point release.
Nobody will notice or care, except for a few doggedly stubborn Perl hackers. They
will find themselves having nightmares of previous lives carrying around OS/2 books
and Amiga paraphernalia. Perl 6 will celebrate it's seventh... or is it eighth?...
anniversary of being announced, and nobody will notice. &lt;strong&gt;NOW:&lt;/strong&gt; Does
anybody still follow Perl 6 development? Has the spec even been written yet? Google
on &amp;quot;Perl 6 release&amp;quot;, and you get varying reports: &amp;quot;It'll ship 'when
it's ready'&amp;quot;, &amp;quot;There are no such dates because this isn't a commericially-backed
effort&amp;quot;, and &amp;quot;Spring 2010&amp;quot;. Swish—nothin' but net. &lt;em&gt;Ted 16; Wrongness
9.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: The debate around &amp;quot;Scrum Certification&amp;quot; will rise
to a fever pitch as short-sighted money-tight companies start looking for reasons
to cut costs and either buy into agile at a superficial level and watch it fail, or
start looking to cut the agilists from their company in order to replace them with
cheaper labor. &lt;strong&gt;NOW:&lt;/strong&gt; Agile has become another adjective meaning &amp;quot;best
practices&amp;quot;, and as such, has essentially lost its meaning. Just ask Scott Bellware. &lt;em&gt;Ted
18; Wrongness 9.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Adobe will continue to make Flex and AIR look more like C#
and the CLR even as Microsoft tries to make Silverlight look more like Flash and AIR.
Web designers will now get to experience the same fun that back-end web developers
have enjoyed for near-on a decade, as shops begin to artificially partition themselves
up as either &amp;quot;Flash&amp;quot; shops or &amp;quot;Silverlight&amp;quot; shops. &lt;strong&gt;NOW:&lt;/strong&gt; Not
sure how to score this one—I haven't seen the explicit partitioning happen yet, but
the two environments definitely still seem to be looking to start tromping on each
others' turf, particularly when we look at the rapid releases coming from the Silverlight
team. &lt;em&gt;Ted 16; Wrongness 11.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Gartner will still come knocking, looking to hire me for outrageous
sums of money to do nothing but blog and wax prophetic. &lt;strong&gt;NOW:&lt;/strong&gt; Still
no job offers. Damn. Ah, well. &lt;em&gt;Ted 16; Wrongness 13.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
A close game. Could've gone either way. *shrug* Ah, well. It was silly to try and
score it in basketball metaphor, anyway—that's the last time I watch ESPN before writing
this.
&lt;/p&gt;
&lt;p&gt;
For 2010, I predict....
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;... I will offer 3- and 4-day training classes on F# and Scala, among other things.&lt;/em&gt; OK,
that's not fair—yes, I have the materials, I just need to work out locations and times.
Contact me if you're interested in a private class, by the way.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... I will publish two books, one on F# and one on Scala.&lt;/em&gt; OK, OK, another
plug. Or, rather, more of a resolution. One will be the &amp;quot;Professional F#&amp;quot;
I'm doing for Wiley/Wrox, the other isn't yet finalized. But it'll either be published
through a publisher, or self-published, by JavaOne 2010.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... DSLs will either &amp;quot;succeed&amp;quot; this year, or begin the short slide into
the dustbin of obscure programming ideas.&lt;/em&gt; Domain-specific language advocates
have to put up some kind of strawman for developers to learn from and poke at, or
the whole concept will just fade away. Martin's book will help, if it ships this year,
but even that might not be enough to generate interest if it doesn't have some kind
of large-scale applicability in it. Patterns and refactoring and enterprise containers
all had a huge advantage in that developers could see pretty easily what the problem
was they solved; DSLs haven't made that clear yet.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... functional languages will start to see a backlash.&lt;/em&gt; I hate to say it,
but &amp;quot;getting&amp;quot; the functional mindset is hard, and there's precious few resources
that are making it easy for mainstream (read: O-O) developers make that adjustment,
far fewer than there was during the procedural-to-object shift. If the functional
community doesn't want to become mainstream, then mainstream developers will find
ways to take functional's most compelling gateway use-case (parallel/concurrent programming)
and find a way to &amp;quot;git 'er done&amp;quot; in the traditional O-O approach, probably
through software transactional memory, and functional languages like Haskell and Erlang
will be relegated to the &amp;quot;What Might Have Been&amp;quot; of computer science history.
Not sure what I mean? Try this: walk into a functional language forum, and ask what
a monad is. Nobody yet has been able to produce an answer that doesn't involve math
theory, or that does involve a practical domain-object-based example. In fact, nobody
has really said why (or if) monads are even still useful. Or catamorphisms. Or any
of the other dime-store words that the functional community likes to toss around.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Visual Studio 2010 will ship on time, and be one of the buggiest and/or slowest
releases in its history.&lt;/em&gt; I hate to make this prediction, because I really don't
want to be right, but there's just so much happening in the Visual Studio refactoring
effort that it makes me incredibly nervous. Widespread adoption of VS2010 will wait
until SP1 at the earliest. In fact....&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Visual Studio 2010 SP 1 will ship within three months of the final product.&lt;/em&gt; Microsoft
knows that people wait until SP 1 to think about upgrading, so they'll just plan for
an eager SP 1 release, and hope that managers will be too hung over from the New Year
(still) to notice that the necessary shakeout time hasn't happened.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Apple will ship a tablet with multi-touch on it, and it will flop horribly.&lt;/em&gt; Not
sure why I think this, but I just don't think the multi-touch paradigm that Apple
has cooked up for the iPhone will carry over to a tablet/laptop device. That won't
stop them from shipping it, and it won't stop Apple fan-boiz from buying it, but that's
about where the interest will end.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... JDK 7 closures will be debated for a few weeks, then become a fait accompli
as the Java community shrugs its collective shoulders.&lt;/em&gt; Frankly, I think the Java
community has exhausted its interest in debating new language features for Java. Recent
college grads and open-source groups with an axe to grind will continue to try and
make an issue out of this, but I think the overall Java community just... doesn't...
care. They just want to see JDK 7 ship someday.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Scala either &amp;quot;pops&amp;quot; in 2010, or begins to fall apart.&lt;/em&gt; By &amp;quot;pops&amp;quot;,
I mean reaches a critical mass of developers interested in using it, enough to convince
somebody to create a company around it, a la G2One.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Oracle is going to make a serious &amp;quot;cloud&amp;quot; play, probably by offering
an Oracle-hosted version of Azure or AppEngine.&lt;/em&gt; Oracle loves the enterprise space
too much, and derives too much money from it, to not at least appear to have some
kind of offering here. Now that they own Java, they'll marry it up against OpenSolaris,
the Oracle database, and throw the whole thing into a series of server centers all
over the continent, and call it &amp;quot;Oracle 12c&amp;quot; (c for Cloud, of course) or
something.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Spring development will slow to a crawl and start to take a left turn toward
cloud ideas.&lt;/em&gt; VMWare bought SpringSource for a reason, and I believe it's entirely
centered around VMWare's movement into the cloud space—they want to be more than &amp;quot;just&amp;quot;
a virtualization tool. Spring + Groovy makes a compelling development stack, particularly
if VMWare does some interesting hooks-n-hacks to make Spring a virtualization environment
in its own right somehow. But from a practical perspective, any community-driven development
against Spring is all but basically dead. The source may be downloadable later, like
the VMWare Player code is, but making contributions back? Fuhgeddabowdit.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... the explosion of e-book readers brings the Kindle 2009 edition way down to
size.&lt;/em&gt; The era of the e-book reader is here, and honestly, while I'm glad I have
a Kindle, I'm expecting that I'll be dusting it off a shelf in a few years. Kinda
like I do with my iPods from a few years ago.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... &amp;quot;social networking&amp;quot; becomes the &amp;quot;Web 2.0&amp;quot; of 2010.&lt;/em&gt; In
other words, using the term will basically identify you as a tech wannabe and clearly
out of touch with the bleeding edge.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Facebook becomes a developer platform requirement.&lt;/em&gt; I don't pretend to
know anything about Facebook—I'm not even on it, which amazes my family to no end—but
clearly Facebook is one of those mechanisms by which people reach each other, and
before long, it'll start showing up as a developer requirement for companies looking
to hire. If you're looking to build out your resume to make yourself attractive to
companies in 2010, mad Facebook skillz might not be a bad investment.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Nintendo releases an open SDK for building games for its next-gen DS-based
device.&lt;/em&gt; With the spectacular success of games on the iPhone, Nintendo clearly
must see that they're missing a huge opportunity every day developers can't write
games for the Nintendo DS that are easily downloadable to the device for playing.
Nintendo is not stupid—if they don't open up the SDK and promote &amp;quot;casual&amp;quot;
games like those on the iPhone and those that can now be downloaded to the Zune or
the XBox, they risk being marginalized out of existence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
And for the next decade, I predict....
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;... colleges and unversities will begin issuing e-book reader devices to students.&lt;/em&gt; It's
a helluvalot cheaper than issuing laptops or netbooks, and besides....&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... netbooks and e-book readers will merge before the decade is out.&lt;/em&gt; Let's
be honest—if the e-book reader could do email and browse the web, you have almost
the perfect paperback-sized mobile device. As for the credit-card sized mobile device....&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... mobile phones will all but disappear as they turn into what PDAs tried to
be.&lt;/em&gt; &amp;quot;The iPhone makes calls? Really? You mean Voice-over-IP, right? No,
wait, over cell signal? It can &lt;em&gt;do &lt;/em&gt;that? Wow, there's really an app for everything,
isn't there?&amp;quot;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... wireless formats will skyrocket in importance all around the office and home.&lt;/em&gt; Combine
the iPhone's Bluetooth (or something similar yet lower-power-consuming) with an equally-capable
(Bluetooth or otherwise) projector, and suddenly many executives can leave their netbook
or laptop at home for a business presentation. Throw in the Whispersync-aware e-book
reader/netbook-thing, and now most executives have absolutely zero reason to carry
anything but their e-book/netbook and their phone/PDA. The day somebody figures out
an easy way to combine Bluetooth with PayPal on the iPhone or Android phone, we will
have more or less made pocket change irrelevant. And believe me, that day will happen
before the end of the decade.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... either Android or Windows Mobile will gain some serious market share against
the iPhone the day they figure out how to support an open and unrestricted AppStore-like
app acquisition model.&lt;/em&gt; Let's be honest, the attraction of iTunes and AppStore
is that I can see an &amp;quot;Oh, cool!&amp;quot; app on a buddy's iPhone, and have it on
mine less than 30 seconds later. If Android or WinMo can figure out how to offer that
same kind of experience without the draconian AppStore policies to go with it, they'll
start making up lost ground on iPhone in a hurry.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Apple becomes the DOJ target of the decade.&lt;/em&gt; Microsoft was it in the 2000's,
and Apple's stunning rising success is going to put it squarely in the sights of monopolist
accusations before long. Coupled with the unfortunate health distractions that Steve
Jobs has to deal with, Apple's going to get hammered pretty hard by the end of the
decade, but it will have mastered enough market share and mindshare to weather it
as Microsoft has.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Google becomes the next Microsoft.&lt;/em&gt; It won't be anything the founders
do, but Google will do &amp;quot;something evil&amp;quot;, and it will be loudly and screechingly
pointed out by all of Google's corporate opponents, and the star will have fallen.&lt;/li&gt;
&lt;li&gt;
... &lt;em&gt;Microsoft finds its way again.&lt;/em&gt; Microsoft, as a company, has lost its
way. This is a company that's not used to losing, and like Bill Belichick's Patriots,
they will find ways to adapt and adjust to the changed circumstances of their position
to find a way to win again. What that'll be, I have no idea, but historically, the
last decade notwithstanding, betting against Microsoft has historically been a bad
idea. My gut tells me they'll figure something new to get that mojo back.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... a politician will make himself or herself famous by standing up to the TSA.&lt;/em&gt; The
scene will play out like this: during a Congressional hearing on airline security,
after some nut/terrorist tries to blow up another plane through nitroglycerine-soaked
underwear, the TSA director will suggest all passengers should fly naked in order
to preserve safety, the congressman/woman will stare open-mouthed at this suggestion,
proclaim, &amp;quot;Have you no sense of decency, sir?&amp;quot; and immediately get a standing
ovation and never have to worry about re-election again. Folks, if we want to prevent
any chance of loss of life from a terrorist act on an airplane, we have to prevent
passengers from getting on them. Otherwise, just accept that it might happen, do a
reasonable job of preventing it from happening, and let private insurance start offering
flight insurance against the possibility to reassure the paranoid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
See you all next year.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=680b8296-ba07-4230-b067-edceaf04e84b" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,680b8296-ba07-4230-b067-edceaf04e84b.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=d3b4c5aa-2964-492c-9af3-523cb403b444</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,d3b4c5aa-2964-492c-9af3-523cb403b444.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,d3b4c5aa-2964-492c-9af3-523cb403b444.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d3b4c5aa-2964-492c-9af3-523cb403b444</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Paul asked me to review this, his first book, and my comment to him was that he had
a pretty high bar to match; being of the same "series" as <em>Release It!</em>,
Mike Nygard's take on building software ready for production (and, in my repeatedly
stated opinion, the most important-to-read book of the decade), <em>Debug It!</em> had
some pretty impressive shoes to fill. Paul's comment was pretty predictable: "Thanks
for keeping the pressure to a minimum."
</p>
        <p>
My copy arrived in the mail while I was at the NFJS show in Denver this past weekend,
and with a certain amount of dread and excitement, I opened the envelope and sat down
to read for a few minutes. I managed to get halfway through it before deciding I had
to post a review before I get too caught up in my next trip and forget.
</p>
        <h4>
          <em>Short version</em>
        </h4>
        <p>
          <em>Debug It!</em> is a great resource for anyone looking to learn the science of
good debugging. It is entirely language- and platform-agnostic, preferring to focus
entirely on the <em>process</em> and <em>mindset</em> of debugging, rather than on
edge cases or command-line switches in a tool or language. Overall, the writing is
clear and straightforward without being preachy or judgmental, and is liberally annotated
with real-life case stories from both the authors' and the Pragmatic Programmers'
own history, which keeps the tone lighter and yet still proving the point of the text.
Highly recommended for the junior developers on the team; senior developers will likely
find some good tidbits in here as well. 
</p>
        <h4>
          <em>Long version</em>
        </h4>
        <p>
          <em>Debug It!</em> is an excellently-written and to-the-point description of the process
of not only identifying and fixing defects in software, but also of the attitudes
required to keep software from failing. Rather than simply tossing off old maxims
or warming them over with new terminology ("You should always verify the parameters
to your procedure calls" replaced with "You should always verify the parameters
entering a method and ensure the fields follow the invariants established in the specification"),
Paul ensures that when making a point, his prose is clear, the rationale carefully
explained, and the consequences of not following this advice are clearly spelled out.
His advice is pragmatic, and takes into account that developers can't always follow
the absolute rules we'd like to—he talks about some of his experiences with "bug
priorities" and how users pretty quickly figured out to always set the bug's
priority at the highest level in order to get developer attention, for example, and
some ways to try and address that all-too-human failing of bug-tracking systems.
</p>
        <p>
It needs to be said, right from the beginning, that <em>Debug It!</em> will not teach
you how to use the debugging features of your favorite IDE, however. This is because
Paul (deliberately, it seems) takes a platform- and language-agnostic approach to
the book—there are no examples of how to set breakpoints in gdb, or how to attach
the Visual Studio IDE to a running Windows service, for example. This will likely
weed out those readers who are looking for "Google-able" answers to their
common debugging problems, and that's a shame, because those are probably the very
readers that need to read this book. Having said that, however, I like this agnostic
approach, because these ideas and thought processes, the ones that are entirely independent
of the language or platform, are exactly the kinds of things that senior developers
carry over with them from one platform to the next. Still, the junior developer who
picks this book up is going to still need a reference manual or the user manual for
their IDE or toolchain, and will need to practice some with both books in hand if
they want to maximize the effectiveness of what's in here.
</p>
        <p>
One of the things I like most about this book is that it is liberally adorned with
real-life discussions of various scenarios the author team has experienced; the reason
I say "author team" here is because although the stories (for the most part)
remain unattributed, there are obvious references to "Dave" and "Andy",
which I assume pretty obviously refer to Dave Thomas and Andy Hunt, the Pragmatic
Programmers and the owners of Pragmatic Bookshelf. Some of the stories are humorous,
and some of them probably would be humorous if they didn't strike so close to my own
bitterly-remembered experiences. All of them do a good job of reinforcing the point,
however, thus rendering the prose more effective in communicating the idea without
getting to be too preachy or bombastic.
</p>
        <p>
The book obviously intends to target a junior developer audience, because most senior
developers have already intuitively (or experientially) figured out many of the processes
described in here. But, quite frankly, I think it would be a shame for senior developers
to pass on this one; though the temptation will be to simply toss it aside and say,
"I already do all this stuff", senior developers should resist that urge
and read it through cover to cover. If nothing else, it'll help reinforce certain
ideas, bring some of the intuitive process more to light and allow us to analyze what
we do right and what we do wrong, and perhaps most importantly, give us a common backdrop
against which we can mentor junior developers in the science of debugging.
</p>
        <p>
One of the chapters I like in particular, "Chapter 7: Pragmatic Zero Tolerance",
is particularly good reading for those shops that currently suffer from a deficit
of management support for writing good software. In it, Paul talks specifically about
some of the triage process about bugs ("When to fix bugs"), the mental approach
developers should have to fixing bugs ("The debugging mind-set") and how
to get started on creating good software out of bad ("How to dig yourself out
of a quality hole"). These are techniques that a senior developer can bring to
the team and implement at a grass-roots level, in many cases without management even
being aware of what's going on. (It's a sad state of affairs that we sometimes have
to work behind management's back to write good-quality code, but I know that some
developers out there are in exactly that situation, and simply saying, "Quit
and find a new job", although pithy and good for a laugh on a panel, doesn't
really offer much in the way of help. Paul doesn't take that route here, and that
alone makes this book worth reading.)
</p>
        <p>
Another of the chapters that resonates well with me is the first one in Part III ("Debug
Fu"), Chapter 8, entitled "Special Cases", in which he tackles a number
of "advanced" debugging topics, such as "Patching Existing Releases"
and "Hesenbugs" (Concurrency-related bugs). I won't spoil the punchline
for you, but suffice it to say that I wish I'd had that chapter on hand to give out
to teammates on a few projects I've worked on in the past.
</p>
        <p>
Overall, this book is going to be a huge win, and I think it's a worthy successor
to the <em>Release It!</em> reputation. Development managers and team leads should
get a copy for the junior developers on their team as a Christmas gift, but only after
the senior developers have read through it as well. (Senior devs, don't despair—at
190 pages, you can rip through this in a single night, and I can almost guarantee
that you'll learn a few ideas you can put into practice the next morning to boot.)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d3b4c5aa-2964-492c-9af3-523cb403b444" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Book Review: Debug It! (Paul Butcher, Pragmatic Bookshelf)</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,d3b4c5aa-2964-492c-9af3-523cb403b444.aspx</guid>
      <link>http://blogs.tedneward.com/2009/11/23/Book+Review+Debug+It+Paul+Butcher+Pragmatic+Bookshelf.aspx</link>
      <pubDate>Mon, 23 Nov 2009 07:24:41 GMT</pubDate>
      <description>&lt;p&gt;
Paul asked me to review this, his first book, and my comment to him was that he had
a pretty high bar to match; being of the same &amp;quot;series&amp;quot; as &lt;em&gt;Release It!&lt;/em&gt;,
Mike Nygard's take on building software ready for production (and, in my repeatedly
stated opinion, the most important-to-read book of the decade), &lt;em&gt;Debug It!&lt;/em&gt; had
some pretty impressive shoes to fill. Paul's comment was pretty predictable: &amp;quot;Thanks
for keeping the pressure to a minimum.&amp;quot;
&lt;/p&gt;
&lt;p&gt;
My copy arrived in the mail while I was at the NFJS show in Denver this past weekend,
and with a certain amount of dread and excitement, I opened the envelope and sat down
to read for a few minutes. I managed to get halfway through it before deciding I had
to post a review before I get too caught up in my next trip and forget.
&lt;/p&gt;
&lt;h4&gt;&lt;em&gt;Short version&lt;/em&gt;
&lt;/h4&gt;
&lt;p&gt;
&lt;em&gt;Debug It!&lt;/em&gt; is a great resource for anyone looking to learn the science of
good debugging. It is entirely language- and platform-agnostic, preferring to focus
entirely on the &lt;em&gt;process&lt;/em&gt; and &lt;em&gt;mindset&lt;/em&gt; of debugging, rather than on
edge cases or command-line switches in a tool or language. Overall, the writing is
clear and straightforward without being preachy or judgmental, and is liberally annotated
with real-life case stories from both the authors' and the Pragmatic Programmers'
own history, which keeps the tone lighter and yet still proving the point of the text.
Highly recommended for the junior developers on the team; senior developers will likely
find some good tidbits in here as well. 
&lt;/p&gt;
&lt;h4&gt;&lt;em&gt;Long version&lt;/em&gt;
&lt;/h4&gt;
&lt;p&gt;
&lt;em&gt;Debug It!&lt;/em&gt; is an excellently-written and to-the-point description of the process
of not only identifying and fixing defects in software, but also of the attitudes
required to keep software from failing. Rather than simply tossing off old maxims
or warming them over with new terminology (&amp;quot;You should always verify the parameters
to your procedure calls&amp;quot; replaced with &amp;quot;You should always verify the parameters
entering a method and ensure the fields follow the invariants established in the specification&amp;quot;),
Paul ensures that when making a point, his prose is clear, the rationale carefully
explained, and the consequences of not following this advice are clearly spelled out.
His advice is pragmatic, and takes into account that developers can't always follow
the absolute rules we'd like to—he talks about some of his experiences with &amp;quot;bug
priorities&amp;quot; and how users pretty quickly figured out to always set the bug's
priority at the highest level in order to get developer attention, for example, and
some ways to try and address that all-too-human failing of bug-tracking systems.
&lt;/p&gt;
&lt;p&gt;
It needs to be said, right from the beginning, that &lt;em&gt;Debug It!&lt;/em&gt; will not teach
you how to use the debugging features of your favorite IDE, however. This is because
Paul (deliberately, it seems) takes a platform- and language-agnostic approach to
the book—there are no examples of how to set breakpoints in gdb, or how to attach
the Visual Studio IDE to a running Windows service, for example. This will likely
weed out those readers who are looking for &amp;quot;Google-able&amp;quot; answers to their
common debugging problems, and that's a shame, because those are probably the very
readers that need to read this book. Having said that, however, I like this agnostic
approach, because these ideas and thought processes, the ones that are entirely independent
of the language or platform, are exactly the kinds of things that senior developers
carry over with them from one platform to the next. Still, the junior developer who
picks this book up is going to still need a reference manual or the user manual for
their IDE or toolchain, and will need to practice some with both books in hand if
they want to maximize the effectiveness of what's in here.
&lt;/p&gt;
&lt;p&gt;
One of the things I like most about this book is that it is liberally adorned with
real-life discussions of various scenarios the author team has experienced; the reason
I say &amp;quot;author team&amp;quot; here is because although the stories (for the most part)
remain unattributed, there are obvious references to &amp;quot;Dave&amp;quot; and &amp;quot;Andy&amp;quot;,
which I assume pretty obviously refer to Dave Thomas and Andy Hunt, the Pragmatic
Programmers and the owners of Pragmatic Bookshelf. Some of the stories are humorous,
and some of them probably would be humorous if they didn't strike so close to my own
bitterly-remembered experiences. All of them do a good job of reinforcing the point,
however, thus rendering the prose more effective in communicating the idea without
getting to be too preachy or bombastic.
&lt;/p&gt;
&lt;p&gt;
The book obviously intends to target a junior developer audience, because most senior
developers have already intuitively (or experientially) figured out many of the processes
described in here. But, quite frankly, I think it would be a shame for senior developers
to pass on this one; though the temptation will be to simply toss it aside and say,
&amp;quot;I already do all this stuff&amp;quot;, senior developers should resist that urge
and read it through cover to cover. If nothing else, it'll help reinforce certain
ideas, bring some of the intuitive process more to light and allow us to analyze what
we do right and what we do wrong, and perhaps most importantly, give us a common backdrop
against which we can mentor junior developers in the science of debugging.
&lt;/p&gt;
&lt;p&gt;
One of the chapters I like in particular, &amp;quot;Chapter 7: Pragmatic Zero Tolerance&amp;quot;,
is particularly good reading for those shops that currently suffer from a deficit
of management support for writing good software. In it, Paul talks specifically about
some of the triage process about bugs (&amp;quot;When to fix bugs&amp;quot;), the mental approach
developers should have to fixing bugs (&amp;quot;The debugging mind-set&amp;quot;) and how
to get started on creating good software out of bad (&amp;quot;How to dig yourself out
of a quality hole&amp;quot;). These are techniques that a senior developer can bring to
the team and implement at a grass-roots level, in many cases without management even
being aware of what's going on. (It's a sad state of affairs that we sometimes have
to work behind management's back to write good-quality code, but I know that some
developers out there are in exactly that situation, and simply saying, &amp;quot;Quit
and find a new job&amp;quot;, although pithy and good for a laugh on a panel, doesn't
really offer much in the way of help. Paul doesn't take that route here, and that
alone makes this book worth reading.)
&lt;/p&gt;
&lt;p&gt;
Another of the chapters that resonates well with me is the first one in Part III (&amp;quot;Debug
Fu&amp;quot;), Chapter 8, entitled &amp;quot;Special Cases&amp;quot;, in which he tackles a number
of &amp;quot;advanced&amp;quot; debugging topics, such as &amp;quot;Patching Existing Releases&amp;quot;
and &amp;quot;Hesenbugs&amp;quot; (Concurrency-related bugs). I won't spoil the punchline
for you, but suffice it to say that I wish I'd had that chapter on hand to give out
to teammates on a few projects I've worked on in the past.
&lt;/p&gt;
&lt;p&gt;
Overall, this book is going to be a huge win, and I think it's a worthy successor
to the &lt;em&gt;Release It!&lt;/em&gt; reputation. Development managers and team leads should
get a copy for the junior developers on their team as a Christmas gift, but only after
the senior developers have read through it as well. (Senior devs, don't despair—at
190 pages, you can rip through this in a single night, and I can almost guarantee
that you'll learn a few ideas you can put into practice the next morning to boot.)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d3b4c5aa-2964-492c-9af3-523cb403b444" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,d3b4c5aa-2964-492c-9af3-523cb403b444.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da</wfw:commentRss>
      <slash:comments>12</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Phil Haack wrote <a href="http://haacked.com/archive/2009/10/13/software-externalities.aspx" target="_blank">a
thoughtful, insightful and absolutely correct response</a> to <a href="http://blogs.tedneward.com/2009/10/12/quotAgile+Is+Treating+The+Symptoms+Not+The+Diseasequot.aspx" target="_blank">my
earlier blog post</a>. But he's still missing the point.
</p>
        <p>
The short version: Phil's right when he says, "<strong>Agile is less about managing
the complexity of an application itself and more about managing the complexity of
building an application</strong>." Agile is by far the best approach to take
when building complex software. 
</p>
        <p>
But that's not where I'm going with this. 
</p>
        <p>
As a starting point in the discussion, I'd like to call attention to one of Phil's
sidebars: I find it curious (and indicative of the larger point) his earlier comment
about "<em>I have to wonder, why is that little school district in western Pennsylvania
engaging in custom software development in the first place?</em>" At what point
does standing a small Access database up qualify as "custom software development"?
And I take <em>huge</em> issue with Phil's comment immediately thereafter: ""
That's totally untrue, Phil—you are, in fact, creating custom educational curricula,
for your children at home. Not for popular usage, not for commercial use, but clearly
you're educating your children at home, because you'd be a pretty crappy parent if
you didn't. You also practice an informal form of medicine ("Let me kiss the
boo-boo"), psychology ("Now, come on, share the truck"), culinary arts
("Would you like mac and cheese tonight?"), acting ("Aaar! I'm the
Tickle Monster!") and a vastly larger array of "professional" skills
that any of the "professionals" will do vastly better than you.
</p>
        <p>
In other words, you're not a professional actor/chef/shrink/doctor, you're an amateur
one, and you want tools that let you practice your amateur "professions"
as you wish, without requiring the skills and trappings (and overhead) of a professional
in the same arena.
</p>
        <p>
Consider this, Phil: your child decides it's time to have a puppy. (We all know the
kids are the ones who make these choices, not us, right?) So, being the conscientious
parent that you are, you decide to build a doghouse for the new puppy to use to sleep
outdoors (forgetting, as all parents do, that the puppy will actually end up sleeping
in the bed with your child, but that's another discussion for another day). So immediately
you head on down to Home Depot, grab some lumber, some nails, maybe a hammer and a
screwdriver, some paint, and head on home.
</p>
        <p>
Whoa, there, turbo. Aren't you forgetting a few things? For starters, you need to
get the concrete for the foundation, rebar to support the concrete in the event of
a bad earthquake, drywall, fire extinguishers, sirens for the emergency exit doors...
And of course, you'll need a foreman to coordinate all the work, to make sure the
foundation is poured before the carpenters show up to put up the trusses, which in
turn has to happen before the drywall can go up...
</p>
        <p>
We in this industry have a jealous and irrational attitude towards the amateur software
developer. This was even apparent in the Twitter comments that accompanied the conversation
around my blog post: "@<a href="http://twitter.com/tedneward">tedneward</a> treating
the disease would mean... have the client have all their ideas correct from the start"
(from <a href="http://twitter.com/kelps/statuses/4839762645" target="_blank">@kelps</a>).
In other words, "bad client! No biscuit!"?
</p>
        <p>
Why is it that we, IT professionals, consider anything that involves doing something
other than simply putting content into an application to be "custom software
development"? Why can't end-users create tools of their own to solve their own
problems at a scale appropriate to their local problem?
</p>
        <p>
Phil offers a few examples of why end-users creating their own tools is a Bad Idea:
</p>
        <blockquote>
          <p>
I remember one rescue operation for a company drowning in the complexity of a “simple”
Access application they used to run their business. It was simple until they started
adding new business processes they needed to track. It was simple until they started <em>emailing
copies around </em>and were unsure which was the “master copy”. Not to mention all
the data integrity issues and difficulty in changing the monolithic procedural application
code.
</p>
        </blockquote>
        <blockquote>
          <p>
I also remember helping a teachers union who started off with a simple attendance
tracker style app (to use an example Ted mentions) and just scaled it up to an atrociously
complex Access database with stranded data and manual processes where they printed
excel spreadsheets to paper, then manually entered it into another application.
</p>
        </blockquote>
        <p>
And you know what? 
</p>
        <p>
This is not a bad state of affairs. 
</p>
        <p>
Oh, of course, we, the IT professionals, will immediately pounce on all the things
wrong with their attempts to extend the once-simple application/solution in ways beyond
its capabilities, and we will scoff at their solutions, but you know what? That just
speaks to our insecurities, not the effort expended. You think Wolfgang Puck isn't
going to throw back his head and roar at my lame attempts at culinary experimentation?
You think Frank Lloyd Wright wouldn't cringe in horror at my cobbled-together doghouse?
And I'll bet Maya Angelou will be so shocked at the ugliness of my poetry that she'll
post it somewhere on the "So You Think You're A Poet" website.
</p>
        <p>
Does that mean I need to abandon my efforts to all of these things?
</p>
        <p>
The agilists' community reaction to my post would seem to imply so. "If you aren't
a professional, don't even attempt this?" Really? Is that the message we're preaching
these days?
</p>
        <p>
End users have just as much a desire and right to be amateur software developers as
we do at being amateur cooks, photographers, poets, construction foremen, and musicians.
And what do you do when you want to add an addition to your house instead of just
building a doghouse? Or when you want to cook for several hundred people instead of
just your family?
</p>
        <p>
You hire a professional, and let them do the project professionally.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Haacked, but not content; agile still treats the disease</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da.aspx</guid>
      <link>http://blogs.tedneward.com/2009/10/13/Haacked+But+Not+Content+Agile+Still+Treats+The+Disease.aspx</link>
      <pubDate>Tue, 13 Oct 2009 20:42:22 GMT</pubDate>
      <description>&lt;p&gt;
Phil Haack wrote &lt;a href="http://haacked.com/archive/2009/10/13/software-externalities.aspx" target="_blank"&gt;a
thoughtful, insightful and absolutely correct response&lt;/a&gt; to &lt;a href="http://blogs.tedneward.com/2009/10/12/quotAgile+Is+Treating+The+Symptoms+Not+The+Diseasequot.aspx" target="_blank"&gt;my
earlier blog post&lt;/a&gt;. But he's still missing the point.
&lt;/p&gt;
&lt;p&gt;
The short version: Phil's right when he says, &amp;quot;&lt;strong&gt;Agile is less about managing
the complexity of an application itself and more about managing the complexity of
building an application&lt;/strong&gt;.&amp;quot; Agile is by far the best approach to take
when building complex software. 
&lt;/p&gt;
&lt;p&gt;
But that's not where I'm going with this. 
&lt;/p&gt;
&lt;p&gt;
As a starting point in the discussion, I'd like to call attention to one of Phil's
sidebars: I find it curious (and indicative of the larger point) his earlier comment
about &amp;quot;&lt;em&gt;I have to wonder, why is that little school district in western Pennsylvania
engaging in custom software development in the first place?&lt;/em&gt;&amp;quot; At what point
does standing a small Access database up qualify as &amp;quot;custom software development&amp;quot;?
And I take &lt;em&gt;huge&lt;/em&gt; issue with Phil's comment immediately thereafter: &amp;quot;&amp;quot;
That's totally untrue, Phil—you are, in fact, creating custom educational curricula,
for your children at home. Not for popular usage, not for commercial use, but clearly
you're educating your children at home, because you'd be a pretty crappy parent if
you didn't. You also practice an informal form of medicine (&amp;quot;Let me kiss the
boo-boo&amp;quot;), psychology (&amp;quot;Now, come on, share the truck&amp;quot;), culinary arts
(&amp;quot;Would you like mac and cheese tonight?&amp;quot;), acting (&amp;quot;Aaar! I'm the
Tickle Monster!&amp;quot;) and a vastly larger array of &amp;quot;professional&amp;quot; skills
that any of the &amp;quot;professionals&amp;quot; will do vastly better than you.
&lt;/p&gt;
&lt;p&gt;
In other words, you're not a professional actor/chef/shrink/doctor, you're an amateur
one, and you want tools that let you practice your amateur &amp;quot;professions&amp;quot;
as you wish, without requiring the skills and trappings (and overhead) of a professional
in the same arena.
&lt;/p&gt;
&lt;p&gt;
Consider this, Phil: your child decides it's time to have a puppy. (We all know the
kids are the ones who make these choices, not us, right?) So, being the conscientious
parent that you are, you decide to build a doghouse for the new puppy to use to sleep
outdoors (forgetting, as all parents do, that the puppy will actually end up sleeping
in the bed with your child, but that's another discussion for another day). So immediately
you head on down to Home Depot, grab some lumber, some nails, maybe a hammer and a
screwdriver, some paint, and head on home.
&lt;/p&gt;
&lt;p&gt;
Whoa, there, turbo. Aren't you forgetting a few things? For starters, you need to
get the concrete for the foundation, rebar to support the concrete in the event of
a bad earthquake, drywall, fire extinguishers, sirens for the emergency exit doors...
And of course, you'll need a foreman to coordinate all the work, to make sure the
foundation is poured before the carpenters show up to put up the trusses, which in
turn has to happen before the drywall can go up...
&lt;/p&gt;
&lt;p&gt;
We in this industry have a jealous and irrational attitude towards the amateur software
developer. This was even apparent in the Twitter comments that accompanied the conversation
around my blog post: &amp;quot;@&lt;a href="http://twitter.com/tedneward"&gt;tedneward&lt;/a&gt; treating
the disease would mean... have the client have all their ideas correct from the start&amp;quot;
(from &lt;a href="http://twitter.com/kelps/statuses/4839762645" target="_blank"&gt;@kelps&lt;/a&gt;).
In other words, &amp;quot;bad client! No biscuit!&amp;quot;?
&lt;/p&gt;
&lt;p&gt;
Why is it that we, IT professionals, consider anything that involves doing something
other than simply putting content into an application to be &amp;quot;custom software
development&amp;quot;? Why can't end-users create tools of their own to solve their own
problems at a scale appropriate to their local problem?
&lt;/p&gt;
&lt;p&gt;
Phil offers a few examples of why end-users creating their own tools is a Bad Idea:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I remember one rescue operation for a company drowning in the complexity of a “simple”
Access application they used to run their business. It was simple until they started
adding new business processes they needed to track. It was simple until they started &lt;em&gt;emailing
copies around &lt;/em&gt;and were unsure which was the “master copy”. Not to mention all
the data integrity issues and difficulty in changing the monolithic procedural application
code.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;blockquote&gt; 
&lt;p&gt;
I also remember helping a teachers union who started off with a simple attendance
tracker style app (to use an example Ted mentions) and just scaled it up to an atrociously
complex Access database with stranded data and manual processes where they printed
excel spreadsheets to paper, then manually entered it into another application.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
And you know what? 
&lt;/p&gt;
&lt;p&gt;
This is not a bad state of affairs. 
&lt;/p&gt;
&lt;p&gt;
Oh, of course, we, the IT professionals, will immediately pounce on all the things
wrong with their attempts to extend the once-simple application/solution in ways beyond
its capabilities, and we will scoff at their solutions, but you know what? That just
speaks to our insecurities, not the effort expended. You think Wolfgang Puck isn't
going to throw back his head and roar at my lame attempts at culinary experimentation?
You think Frank Lloyd Wright wouldn't cringe in horror at my cobbled-together doghouse?
And I'll bet Maya Angelou will be so shocked at the ugliness of my poetry that she'll
post it somewhere on the &amp;quot;So You Think You're A Poet&amp;quot; website.
&lt;/p&gt;
&lt;p&gt;
Does that mean I need to abandon my efforts to all of these things?
&lt;/p&gt;
&lt;p&gt;
The agilists' community reaction to my post would seem to imply so. &amp;quot;If you aren't
a professional, don't even attempt this?&amp;quot; Really? Is that the message we're preaching
these days?
&lt;/p&gt;
&lt;p&gt;
End users have just as much a desire and right to be amateur software developers as
we do at being amateur cooks, photographers, poets, construction foremen, and musicians.
And what do you do when you want to add an addition to your house instead of just
building a doghouse? Or when you want to cook for several hundred people instead of
just your family?
&lt;/p&gt;
&lt;p&gt;
You hire a professional, and let them do the project professionally.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=6b0686be-7311-4856-9fc9-6fd1c7040b37</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,6b0686be-7311-4856-9fc9-6fd1c7040b37.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,6b0686be-7311-4856-9fc9-6fd1c7040b37.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6b0686be-7311-4856-9fc9-6fd1c7040b37</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently I've had the pleasure to make the acquaintance of <a href="http://www.walterbright.com/" target="_blank">Walter
Bright</a>, one of the heavyweights of compiler construction, and the creator of the
D language (among other things), and he's been great in giving me some hand-holding
on some compiler-related topics and ideas.
</p>
        <p>
Thus, it seems appropriate to point out that Walter's willing to give lots of other
people the same kind of attention and focus, <a href="http://www.astoriaseminar.com/" target="_blank">in
exchange for your presence in gorgeous Astoria, OR</a>. The Astoria Compiler Construction
Seminar is Walter teaching you about the nuts and bolts of building a compiler, from
start to finish:
</p>
        <ul>
          <li>
Introduction to Compilers</li>
          <li>
Lexing and Parsing</li>
          <li>
Semantic Analysis</li>
          <li>
Intermediate Representation</li>
          <li>
Interpreters</li>
          <li>
Optimization</li>
          <li>
Code Generation</li>
          <li>
Special Topics (thread-local storage, exception-handling, and so on)</li>
          <li>
Building a Compiler for .NET</li>
        </ul>
        <p>
If you've got any interest whatsoever in building a language, but you're not sure
how or where to get started, this seems like a great chance to sit down with one of
the "big boys" and find out how to do it. And it doesn't hurt that Walter's
an extremely pleasant guy to hang out with, either. :-) (It doesn't hurt that he was
the one who created the original Empire game, either. So at least you know you'll
have something to play during the breaks.)
</p>
        <p>
Go. Sign up. You'll thank me later.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=6b0686be-7311-4856-9fc9-6fd1c7040b37" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Are you a language wonk? Do you want to be?</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,6b0686be-7311-4856-9fc9-6fd1c7040b37.aspx</guid>
      <link>http://blogs.tedneward.com/2009/08/15/Are+You+A+Language+Wonk+Do+You+Want+To+Be.aspx</link>
      <pubDate>Sat, 15 Aug 2009 17:44:30 GMT</pubDate>
      <description>&lt;p&gt;
Recently I've had the pleasure to make the acquaintance of &lt;a href="http://www.walterbright.com/" target="_blank"&gt;Walter
Bright&lt;/a&gt;, one of the heavyweights of compiler construction, and the creator of the
D language (among other things), and he's been great in giving me some hand-holding
on some compiler-related topics and ideas.
&lt;/p&gt;
&lt;p&gt;
Thus, it seems appropriate to point out that Walter's willing to give lots of other
people the same kind of attention and focus, &lt;a href="http://www.astoriaseminar.com/" target="_blank"&gt;in
exchange for your presence in gorgeous Astoria, OR&lt;/a&gt;. The Astoria Compiler Construction
Seminar is Walter teaching you about the nuts and bolts of building a compiler, from
start to finish:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Introduction to Compilers&lt;/li&gt;
&lt;li&gt;
Lexing and Parsing&lt;/li&gt;
&lt;li&gt;
Semantic Analysis&lt;/li&gt;
&lt;li&gt;
Intermediate Representation&lt;/li&gt;
&lt;li&gt;
Interpreters&lt;/li&gt;
&lt;li&gt;
Optimization&lt;/li&gt;
&lt;li&gt;
Code Generation&lt;/li&gt;
&lt;li&gt;
Special Topics (thread-local storage, exception-handling, and so on)&lt;/li&gt;
&lt;li&gt;
Building a Compiler for .NET&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If you've got any interest whatsoever in building a language, but you're not sure
how or where to get started, this seems like a great chance to sit down with one of
the &amp;quot;big boys&amp;quot; and find out how to do it. And it doesn't hurt that Walter's
an extremely pleasant guy to hang out with, either. :-) (It doesn't hurt that he was
the one who created the original Empire game, either. So at least you know you'll
have something to play during the breaks.)
&lt;/p&gt;
&lt;p&gt;
Go. Sign up. You'll thank me later.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=6b0686be-7311-4856-9fc9-6fd1c7040b37" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,6b0686be-7311-4856-9fc9-6fd1c7040b37.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>F#</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Visual Basic</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=c8fbfc22-056a-41c9-a756-fe520994abb6</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,c8fbfc22-056a-41c9-a756-fe520994abb6.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,c8fbfc22-056a-41c9-a756-fe520994abb6.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c8fbfc22-056a-41c9-a756-fe520994abb6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
From <a href="http://www.hanselman.com/blog/SeattleRedmondBellevueNerdDinnerJan192009.aspx">Scott
Hanselman's blog</a>:
</p>
        <blockquote>
          <p>
Are you in King County/Seattle/Redmond/Bellevue Washington and surrounding areas?
Are you a huge nerd? Perhaps a geek? No? Maybe a dork, dweeb or wonk. Maybe you're
in town for an SDR (Software Design Review) visiting BillG. Quite possibly you're
just a normal person. 
</p>
          <p>
Regardless, why not join us for some Mall Food at the Crossroads Bellevue Mall Food
Court on Monday, January 19th around 6:30pm? 
</p>
          <p>
... 
</p>
          <p>
NOTE: RSVP by leaving a comment <a href="http://www.hanselman.com/blog/SeattleRedmondBellevueNerdDinnerJan192009.aspx">here</a> and
show up on January 19th at 6:30pm! Feel free to bring friends, kids or family. Bring
a Ruby or Java person!
</p>
        </blockquote>
        <p>
Any of the SeaJUG want to attend? (Anybody know of a Ruby JUG in the Eastside area,
by the way?) I'm game....
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c8fbfc22-056a-41c9-a756-fe520994abb6" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Seattle/Redmond/Bellevue Nerd Dinner</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,c8fbfc22-056a-41c9-a756-fe520994abb6.aspx</guid>
      <link>http://blogs.tedneward.com/2009/01/18/SeattleRedmondBellevue+Nerd+Dinner.aspx</link>
      <pubDate>Sun, 18 Jan 2009 09:01:19 GMT</pubDate>
      <description>&lt;p&gt;
From &lt;a href="http://www.hanselman.com/blog/SeattleRedmondBellevueNerdDinnerJan192009.aspx"&gt;Scott
Hanselman's blog&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Are you in King County/Seattle/Redmond/Bellevue Washington and surrounding areas?
Are you a huge nerd? Perhaps a geek? No? Maybe a dork, dweeb or wonk. Maybe you're
in town for an SDR (Software Design Review) visiting BillG. Quite possibly you're
just a normal person. 
&lt;p&gt;
Regardless, why not join us for some Mall Food at the Crossroads Bellevue Mall Food
Court on Monday, January 19th around 6:30pm? 
&lt;p&gt;
... 
&lt;p&gt;
NOTE: RSVP by leaving a comment &lt;a href="http://www.hanselman.com/blog/SeattleRedmondBellevueNerdDinnerJan192009.aspx"&gt;here&lt;/a&gt; and
show up on January 19th at 6:30pm! Feel free to bring friends, kids or family. Bring
a Ruby or Java person!
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Any of the SeaJUG want to attend? (Anybody know of a Ruby JUG in the Eastside area,
by the way?) I'm game....
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c8fbfc22-056a-41c9-a756-fe520994abb6" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,c8fbfc22-056a-41c9-a756-fe520994abb6.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=c68b5a0f-0ea5-4272-b555-3eef96f1ceab</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,c68b5a0f-0ea5-4272-b555-3eef96f1ceab.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,c68b5a0f-0ea5-4272-b555-3eef96f1ceab.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c68b5a0f-0ea5-4272-b555-3eef96f1ceab</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Chris Sells, an acquaintance (and perhaps friend, when he's not picking on me for
my Java leanings) of mine from my DevelopMentor days, has a habit of putting on a
"DevCon" whenever a technology seems to have reached a certain maturity level. He
did it with XML a few years ago, and ATL before that, both of which were pretty amazing
events, filled with the sharpest guys in the subject, gathered into a single room
to share ideas and shoot each others' pet theories full of holes.
</p>
        <p>
He's at it again, this time with DSLs; from <a href="http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=2232">the
announcement on his blog</a>:
</p>
        <blockquote>
          <p>
Are you interested in presenting a 45-minute talk on some Domain Specific Language
(DSL) related topic? It doesn't matter which platform or OS you're targeting. It also
doesn't matter whether you're an author, a vendor, a professional speaker or a developer
in the trenches (in fact, I tend to be biased toward the latter). We're after interesting
and unique applications of DSL technology and if you're doing good work in that area,
then I need you to <a href="mailto:csells@microsoft.com?subject=DSL%20DevCon%20Abstract%20Submission">send
me a session topic and 2-4 sentence abstract along with a little bit about yourself</a>. 
</p>
          <p>
I'll be taking submissions 'til February 9th, 2009, but <a href="mailto:csells@microsoft.com?subject=DSL%20DevCon%20Abstract%20Submission">don't
delay</a>. Passion and a burning story to tell count twice as much as anything else. 
</p>
          <p>
And don't be shy about spreading this announcement around! I've got good coverage
in the .NET and Windows communities, but don't know very many folks in the Java or
Unix or hardcore modeling worlds, so if you're in that world, let those guys know!
Thanks. 
</p>
          <p>
The <a href="http://sellsbrothers.com/conference/">DSL DevCon</a> itself will be in
Redmond, WA on the Microsoft campus April 16-17, 2009, right after <a href="http://www.langnetsymposium.com/">the
Lang.NET conference</a>. Lang.NET will be focused on general-purpose languages, whereas
the DSL DevCon will focus on domain-specific languages. The idea is that if you want
to attend one or the other or both, that's totally fine. We'll have 2.5 days of Lang.NET
on April 14-16 and then 1.5 days of DSL DevCon content. 
</p>
          <p>
Oh, and the cost for both conferences is the same: $0. 
</p>
          <p>
We're only accepting 150 attendees to either conference. Every one of the five previous
DevCons have sold out, so when we open registration, you'll want to be quick about
getting your name on the list. 
</p>
          <p>
            <a href="mailto:csells@microsoft.com?subject=DSL%20DevCon%20Abstract%20Submission">Submit
your DSL-related talk idea!</a>
          </p>
        </blockquote>
        <p>
For those of you who are deep in the Java or Ruby space, I really urge you to take
a chance here and come to the event--just because it's being held on the Microsoft
campus doesn't mean you're going to be forcibly plugged into the Matrix; the same
goes for the Lang.NET event in the earlier part of the week, too. Don't believe me?
I have proof: Brian Goetz, John Rose, and Charlie Nutter, Sun employees all, attended
last years Lang.NET event, talked about the JVM and JRuby, and not only did they <em>not</em> have
to give up their "sun.com" email addresses, but they came away with some new appreciations
for the CLR, the ecosystem there, and even a few insights about their own platform
in comparison to the JVM. (I won't say this as an absolute fact, but I think a lot
of John's work on method handles for Java7 came out of conversations he'd had with
some of the CLR guys that week.)
</p>
        <p>
This is a DevCon, not a MarCon or a SaleCon. If you're a dev, you're welcome to come
here. Frankly, I'd love to see the Java and Ruby (and LLVM and Parrot and ...) guys
storm the castle, so to speak, if for no other reason than so Chris will stop teasing
me about being a Java guy. ;-)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c68b5a0f-0ea5-4272-b555-3eef96f1ceab" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>DSLs: Ready for Prime-Time?</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,c68b5a0f-0ea5-4272-b555-3eef96f1ceab.aspx</guid>
      <link>http://blogs.tedneward.com/2009/01/14/DSLs+Ready+For+PrimeTime.aspx</link>
      <pubDate>Wed, 14 Jan 2009 06:33:42 GMT</pubDate>
      <description>&lt;p&gt;
Chris Sells, an acquaintance (and perhaps friend, when he's not picking on me for
my Java leanings) of mine from my DevelopMentor days, has a habit of putting on a
"DevCon" whenever a technology seems to have reached a certain maturity level. He
did it with XML a few years ago, and ATL before that, both of which were pretty amazing
events, filled with the sharpest guys in the subject, gathered into a single room
to share ideas and shoot each others' pet theories full of holes.
&lt;/p&gt;
&lt;p&gt;
He's at it again, this time with DSLs; from &lt;a href="http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=2232"&gt;the
announcement on his blog&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Are you interested in presenting a 45-minute talk on some Domain Specific Language
(DSL) related topic? It doesn't matter which platform or OS you're targeting. It also
doesn't matter whether you're an author, a vendor, a professional speaker or a developer
in the trenches (in fact, I tend to be biased toward the latter). We're after interesting
and unique applications of DSL technology and if you're doing good work in that area,
then I need you to &lt;a href="mailto:csells@microsoft.com?subject=DSL%20DevCon%20Abstract%20Submission"&gt;send
me a session topic and 2-4 sentence abstract along with a little bit about yourself&lt;/a&gt;. 
&lt;p&gt;
I'll be taking submissions 'til February 9th, 2009, but &lt;a href="mailto:csells@microsoft.com?subject=DSL%20DevCon%20Abstract%20Submission"&gt;don't
delay&lt;/a&gt;. Passion and a burning story to tell count twice as much as anything else. 
&lt;p&gt;
And don't be shy about spreading this announcement around! I've got good coverage
in the .NET and Windows communities, but don't know very many folks in the Java or
Unix or hardcore modeling worlds, so if you're in that world, let those guys know!
Thanks. 
&lt;p&gt;
The &lt;a href="http://sellsbrothers.com/conference/"&gt;DSL DevCon&lt;/a&gt; itself will be in
Redmond, WA on the Microsoft campus April 16-17, 2009, right after &lt;a href="http://www.langnetsymposium.com/"&gt;the
Lang.NET conference&lt;/a&gt;. Lang.NET will be focused on general-purpose languages, whereas
the DSL DevCon will focus on domain-specific languages. The idea is that if you want
to attend one or the other or both, that's totally fine. We'll have 2.5 days of Lang.NET
on April 14-16 and then 1.5 days of DSL DevCon content. 
&lt;p&gt;
Oh, and the cost for both conferences is the same: $0. 
&lt;p&gt;
We're only accepting 150 attendees to either conference. Every one of the five previous
DevCons have sold out, so when we open registration, you'll want to be quick about
getting your name on the list. 
&lt;p&gt;
&lt;a href="mailto:csells@microsoft.com?subject=DSL%20DevCon%20Abstract%20Submission"&gt;Submit
your DSL-related talk idea!&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
For those of you who are deep in the Java or Ruby space, I really urge you to take
a chance here and come to the event--just because it's being held on the Microsoft
campus doesn't mean you're going to be forcibly plugged into the Matrix; the same
goes for the Lang.NET event in the earlier part of the week, too. Don't believe me?
I have proof: Brian Goetz, John Rose, and Charlie Nutter, Sun employees all, attended
last years Lang.NET event, talked about the JVM and JRuby, and not only did they &lt;em&gt;not&lt;/em&gt; have
to give up their "sun.com" email addresses, but they came away with some new appreciations
for the CLR, the ecosystem there, and even a few insights about their own platform
in comparison to the JVM. (I won't say this as an absolute fact, but I think a lot
of John's work on method handles for Java7 came out of conversations he'd had with
some of the CLR guys that week.)
&lt;/p&gt;
&lt;p&gt;
This is a DevCon, not a MarCon or a SaleCon. If you're a dev, you're welcome to come
here. Frankly, I'd love to see the Java and Ruby (and LLVM and Parrot and ...) guys
storm the castle, so to speak, if for no other reason than so Chris will stop teasing
me about being a Java guy. ;-)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c68b5a0f-0ea5-4272-b555-3eef96f1ceab" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,c68b5a0f-0ea5-4272-b555-3eef96f1ceab.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Visual Basic</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=5394a334-8042-40ca-b80b-748b50ce9253</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,5394a334-8042-40ca-b80b-748b50ce9253.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,5394a334-8042-40ca-b80b-748b50ce9253.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5394a334-8042-40ca-b80b-748b50ce9253</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It's once again that time of year, and in keeping with my tradition, I'll revisit
the 2008 predictions to see how close I came before I start waxing prophetic on the
coming year. (I'm thinking that maybe the next year--2010's edition--I should actually
take a shot at predicting the next decade, but I'm not sure if I'd remember to go
back and revisit it in 2020 to see how I did. Anybody want to set a calendar reminder
for Dec 31 2019 and remind me, complete with URL? ;-) )
</p>
        <p>
Without further preamble, here's what I said for 2008:
</p>
        <ul>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: The buzz around building custom languages
will only continue to build. More and more tools are emerging to support the creation
of custom programming languages, like Microsoft's Phoenix, Scala's parser combinators,
the Microsoft DLR, SOOT, Javassist, JParsec/NParsec, and so on. Suddenly, the whole
"write your own lexer and parser and AST from scratch" idea seems about as outmoded
as the idea of building your own String class. Granted, there are cases where a from-hand
scanner/lexer/parser/AST/etc is the Right Thing To Do, but there are times when building
your own String class is the Right Thing To Do, too. Between the rich ecosystem of
dynamic languages that could be ported to the JVM/CLR, and the interesting strides
being made on both platforms (JVM and CLR) to make them more "dynamic-friendly" (such
as being able to reify classes or access the call stack directly), the probability
that your company will find a need that is best answered by building a custom language
are only going to rise. <strong>NOW: </strong>The buzz has definitely continued to
build, but buzz can only take us so far. There's been some scattershot use of custom
languages in a few scattershot situations, but it's certainly not "taken the world
by storm" in any meaningful way yet.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: The hype surrounding "domain-specific languages"
will peak in 2008, and start to generate a backlash. Let's be honest: when somebody
looks you straight in the eye and suggests that "scattered, smothered and covered"
is a domain-specific language, the term has lost all meaning. A lexicon unique to
an industry is not a domain-specific language; it's a lexicon. Period. If you can
incorporate said lexicon into your software, thus making it accessible to non-technical
professionals, that's a good thing. But simply using the lexicon doesn't make it a
domain-specific language. Or, alternatively, if you like, every single API designed
for a particular purpose is itself a domain-specific language. This means that Spring
configuration files are a DSL. Deployment descriptors are a DSL. The Java language
is a DSL (since the domain is that of programmers familiar with the Java language).
See how nonsensical this can get? Until somebody comes up with a workable definition
of the term "domain" in "domain-specific language", it's a nonsensical term. The idea
is a powerful one, mind you--creating something that's more "in tune" with what users
understand and can use easily is a technique that's been proven for decades now. Anybody
who's ever watched an accountant rip an entirely new set of predictions for the new
fiscal outlook based entirely on a few seed numbers and a deeply-nested set of Excel
macros knows this already. Whether you call them domain-specific languages or "little
languages" or "user-centric languages" or "macro language" is really up to you. <strong>NOW:</strong> The
backlash hasn't begun, but only because the DSL buzz hasn't materialized in much way
yet--see previous note. It generally takes a year or two of deployments (and hard-earned
experience) before a backlash begins, and we haven't hit that "deployments" stage
yet in anything yet resembling "critical mass" yet. But the DSL/custom language buzz
continues to grow, and the more the buzz grows, the more the backlash is likey.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: Functional languages will begin to make their
presence felt. Between Microsoft's productization plans for F# and the growing community
of Scala programmers, not to mention the inherently functional concepts buried inside
of LINQ and the concurrency-friendly capabilities of side-effect-free programming,
the world is going to find itself working its way into functional thinking either
directly or indirectly. And when programmers start to see the inherent capabilities
inside of Scala (such as Actors) and/or F# (such as asynchronous workflows), they're
going to embrace the strange new world of functional/object hybrid and never look
back. <strong>NOW:</strong> Several books on F# and Scala (and even one or two on
Haskell!) were published in 2008, and several more (including one of my own) are on
the way. The functional buzz is building, and lots of disparate groups are each evaluating
it (functional programming) independently.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: MacOS is going to start posting some serious
market share numbers, leading lots of analysts to predict that Microsoft Windows has
peaked and is due to collapse sometime within the remainder of the decade. Mac's not
only a wonderful OS, but it's some of the best hardware to run Vista on. That will
lead not a few customers to buy Mac hardware, wipe the machine, and install Vista,
as many of the uber-geeks in the Windows world are already doing. This will in turn
lead Gartner (always on the lookout for an established trend they can "predict" on)
to suggest that Mac is going to end up with 115% market share by 2012 (.8 probability),
then sell you this wisdom for a mere price of $1.5 million (per copy). <strong>NOW:</strong> Can't
speak to the Gartner report--I didn't have $1.5 million handy--but certainly the MacOS
is growing in popularity. More on that later.</li>
          <li>
            <strong>THEN:</strong>
            <em>General</em>: Ted will be hired by Gartner... if only to
keep him from smacking them around so much. .0001 probability, with probability going
up exponentially as my salary offer goes up exponentially. (Hey, I've got kids headed
for college in a few years.) <strong>NOW:</strong> Well, Gartner appears to have lost
my email address and phone number, but I'm sure they were planning to make me that
offer.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: MacOS is going to start creaking in a few
places. The Mac OS is a wonderful OS, but it's got its own creaky parts, and the more
users that come to Mac OS, the more that software packages are going to exploit some
of those creaky parts, leading to some instability in the Mac OS. It won't be widespread,
but for those who are interested in finding it, they're there. Assuming current trends
(of customers adopting Mac OS) hold, the Mac OS 10.6 upgrade is going to be a very
interesting process, indeed. <strong>NOW:</strong> Shhh. Don't tell anybody, but I've
been seeing it starting to happen. Don't get me wrong, Apple still does a pretty good
job with the OS, but the law of numbers has started to create some bad upgrade scenarios
for some people.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: Somebody is going to realize that iTunes
is the world's biggest monopoly on music, and Apple will be forced to defend itself
in the court of law, the court of public opinion, or both. Let's be frank: if this
were Microsoft, offering music that can only be played on Microsoft music players,
the world would be through the roof. All UI goodness to one side, the iPod represents
just as much of a monopoly in the music player business as Internet Explorer did in
the operating system business, and if the world doesn't start taking Apple to task
over this, then "justice" is a word that only applies when losers in an industry want
to drag down the market leader (which I firmly believe to be the case--nobody likes
more than to pile on the successful guy). <strong>NOW:</strong> Nothing this year.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: Somebody is going to realize that the iPhone's
"nothing we didn't write will survive the next upgrade process" policy is nothing
short of draconian. As my father, who gets it right every once in a while, says, "If
I put a third-party stereo in my car, the dealer doesn't get to rip it out and replace
it with one of their own (or nothing at all!) the next time I take it in for an oil
change". Fact is, if I buy the phone, I own the phone, and I own what's on it. Unfortunately,
this takes us squarely into the realm of DRM and IP ownership, and we all know how
clear-cut that is... But once the general public starts to understand some of these
issues--and I think the iPhone and iTunes may just be the vehicle that will teach
them--look out, folks, because the backlash will be huge. As in, "Move over, Mr. Gates,
you're about to be joined in infamy by your other buddy Steve...." <strong>NOW:</strong> Apple
released iPhone 2.0, and with it, the iPhone SDK, so at least Apple has opened the
dashboard to third-party stereos. But the deployment model (AppStore) is still a bit
draconian, and Apple still jealously holds the reins over which apps can be deployed
there and which ones can't, so maybe they haven't learned their lesson yet, after
all....</li>
          <li>
            <strong>THEN: </strong>
            <em>Java</em>: The OpenJDK in Mercurial will slowly start to
see some external contributions. The whole point of Mercurial is to allow for deeper
control over which changes you incorporate into your build tree, so once people figure
out how to build the JDK and how to hack on it, the local modifications will start
to seep across the Internet.... <strong>NOW:</strong> OpenJDK has started to collect
contributions from external (to Sun) sources, but still in relatively small doses,
it seems. None of the local modifications I envisioned creeping across the 'Net have
begun, that I can see, so maybe it's still waiting to happen. Or maybe the OpenJDK
is too complicated to really allow for that kind of customization, and it never will.</li>
          <li>
            <strong>THEN:</strong>
            <em>Java</em>: SpringSource will soon be seen as a vendor like
BEA or IBM or Sun. Perhaps with a bit better reputation to begin, but a vendor all
the same. <strong>NOW:</strong> SpringSource's acquisition of G2One (the company behind
Groovy just as SpringSource backs Spring) only reinforced this image, but it seems
it's still something that some fail to realize or acknowledge due to Spring's open-source
(?) nature. (I'm not a Spring expert by any means, but apparently Spring 3 was pulled
back inside the SpringSource borders, leading some people to wonder what SpringSource
is up to, and whether or not Spring will continue to be open source after all.)</li>
          <li>
            <strong>THEN:</strong>
            <em>.NET</em>: Interest in OpenJDK will bootstrap similar interest
in Rotor/SSCLI. After all, they're both VMs, with lots of interesting ideas and information
about how the managed platforms work. <strong>NOW:</strong> Nope, hasn't really happened
yet, that I can see. Not even the 2nd edition of the SSCLI book (by Joel Pobar and
yours truly, yes that was a plug) seemed to foster the kind of attention or interest
that I'd expected, or at least, not on the scale I'd thought might happen.</li>
          <li>
            <strong>THEN: </strong>
            <em>C++/Native</em>: If you've not heard of LLVM before this,
you will. It's a compiler and bytecode toolchain aimed at the native platforms, complete
with JIT and GC. <strong>NOW:</strong> Apple sank a lot of investment into LLVM, including
hosting an LLVM conference at the corporate headquarters.</li>
          <li>
            <strong>THEN:</strong>
            <em>Java</em>: Somebody will create Yet Another Rails-Killer
Web Framework. 'Nuff said. <strong>NOW:</strong> You know what? I honestly can't say
whether this happened or not; I was completely not paying attention.</li>
          <li>
            <strong>THEN:</strong>
            <em>Native</em>: Developers looking for a native programming
language will discover D, and be happy. Considering D is from the same mind that was
the core behind the Zortech C++ compiler suite, and that D has great native platform
integration (building DLLs, calling into DLLs easily, and so on), not to mention automatic
memory management (except for those areas where you want manual memory management),
it's definitely worth looking into. <a href="http://www.digitalmars.com">www.digitalmars.com</a><strong>NOW:</strong> D
had its own get-together as well, and appears to still be going strong, among the
group of developers who still work on native apps (and aren't simply maintaining legacy
C/C++ apps).</li>
        </ul>
        <p>
Now, for the 2009 predictions. The last set was a little verbose, so let me see if
I can trim the list down a little and keep it short and sweet:
</p>
        <ul>
          <li>
            <em>General:</em> "Cloud" will become the next "ESB" or "SOA", in that it will be
something that everybody will talk about, but few will understand and even fewer will
do anything with. (Considering the widespread disparity in the definition of the term,
this seems like a no-brainer.)</li>
          <li>
            <em>Java</em>: Interest in Scala will continue to rise, as will the number of detractors
who point out that Scala is too hard to learn.</li>
          <li>
            <em>.NET</em>: Interest in F# will continue to rise, as will the number of detractors
who point out that F# is too hard to learn. (Hey, the two really are cousins, and
the fortunes of one will serve as a pretty good indication of the fortunes of the
other, and both really seem to be on the same arc right now.)</li>
          <li>
            <em>General:</em> Interest in all kinds of functional languages will continue to rise,
and more than one person will take a hint from Bob "crazybob" Lee and liken functional
programming to AOP, for good and for ill. People who took classes on Haskell in college
will find themselves reaching for their old college textbooks again.</li>
          <li>
            <em>General:</em> The iPhone is going to be hailed as "the enterprise development
platform of the future", and companies will be rolling out apps to it. Look for Quicken
iPhone edition, PowerPoint and/or Keynote iPhone edition, along with connectors to
hook the iPhone up to a presentation device, and (I'll bet) a World of Warcraft iPhone
client (legit or otherwise). iPhone is the new hotness in the mobile space, and people
will flock to it madly.</li>
          <li>
            <em>.NET</em>: Another Oslo CTP will come out, and it will bear only a superficial
resemblance to the one that came out in October at PDC. Betting on Oslo right now
is a fools' bet, not because of any inherent weakness in the technology, but just
because it's way too early in the cycle to be thinking about for anything vaguely
resembling production code.</li>
          <li>
            <em>.NET</em>: The IronPython and IronRuby teams will find some serious versioning
issues as they try to manage the DLR versioning story between themselves and the CLR
as a whole. An initial hack will result, which will be codified into a standard practice
when .NET 4.0 ships. Then the next release of IPy or IRb will have to try and slip
around its restrictions in 2010/2011. By 2012, IPy and IRb will have to be shipping
as part of Visual Studio just to put the releases back into lockstep with one another
(and the rest of the .NET universe).</li>
          <li>
            <em>Java</em>: The death of JSR-277 will spark an uprising among the two leading groups
hoping to foist it off on the Java community--OSGi and Maven--while the rest of the
Java world will breathe a huge sigh of relief and look to see what "modularity" means
in Java 7. Some of the alpha geeks in Java will start using--if not building--JDK
7 builds just to get a heads-up on its impact, and be quietly surprised and, I dare
say, perhaps even pleased.</li>
          <li>
            <em>Java</em>: The invokedynamic JSR will leapfrog in importance to the top of the
list.</li>
          <li>
            <em>Windows</em>: Another Windows 7 CTP will come out, and it will spawn huge media
interest that will eventually be remembered as Microsoft promises, that will eventually
be remembered as Microsoft guarantees, that will eventually be remembered as Microsoft
FUD and "promising much, delivering little". Microsoft ain't always at fault for the
inflated expectations people have--sometimes, yes, perhaps even a lot of times, but
not always.</li>
          <li>
            <em>Mac OS</em>: Apple will begin to legally threaten the clone market again, except
this time somebody's going to get the DOJ involved. (Yes, this is the iPhone/iTunes
prediction from last year, carrying over. I still expect this to happen.)</li>
          <li>
            <em>Languages</em>: Alpha-geek developers will start creating their own languages
(even if they're obscure or bizarre ones like Shakespeare or Ook#) just to have that
listed on their resume as the DSL/custom language buzz continues to build.</li>
          <li>
            <em>XML Services</em>: Roy Fielding will officially disown most of the "REST"ful authors
and software packages available. Nobody will care--or worse, somebody looking to make
a name for themselves will proclaim that Roy "doesn't really understand REST". And
they'll be right--Roy doesn't understand what <em>they</em> consider to be REST, and
the fact that he created the term will be of no importance anymore. Being "REST"ful
will equate to "I did it myself!", complete with expectations of a gold star and a
lollipop.</li>
          <li>
            <em>Parrot</em>: The Parrot guys will make at least one more minor point release.
Nobody will notice or care, except for a few doggedly stubborn Perl hackers. They
will find themselves having nightmares of previous lives carrying around OS/2 books
and Amiga paraphernalia. Perl 6 will celebrate it's seventh... or is it eighth?...
anniversary of being announced, and nobody will notice.</li>
          <li>
            <em>Agile</em>: The debate around "Scrum Certification" will rise to a fever pitch
as short-sighted money-tight companies start looking for reasons to cut costs and
either buy into agile at a superficial level and watch it fail, or start looking to
cut the agilists from their company in order to replace them with cheaper labor.</li>
          <li>
            <em>Flash</em>: Adobe will continue to make Flex and AIR look more like C# and the
CLR even as Microsoft tries to make Silverlight look more like Flash and AIR. Web
designers will now get to experience the same fun that back-end web developers have
enjoyed for near-on a decade, as shops begin to artificially partition themselves
up as either "Flash" shops or "Silverlight" shops.</li>
          <li>
            <em>Personal</em>: Gartner will still come knocking, looking to hire me for outrageous
sums of money to do nothing but blog and wax prophetic.</li>
        </ul>
        <p>
Well, so much for brief or short. See you all again next year....
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=5394a334-8042-40ca-b80b-748b50ce9253" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>2009 Predictions, 2008 Predictions Revisited</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,5394a334-8042-40ca-b80b-748b50ce9253.aspx</guid>
      <link>http://blogs.tedneward.com/2009/01/01/2009+Predictions+2008+Predictions+Revisited.aspx</link>
      <pubDate>Thu, 01 Jan 2009 07:54:29 GMT</pubDate>
      <description>&lt;p&gt;
It's once again that time of year, and in keeping with my tradition, I'll revisit
the 2008 predictions to see how close I came before I start waxing prophetic on the
coming year. (I'm thinking that maybe the next year--2010's edition--I should actually
take a shot at predicting the next decade, but I'm not sure if I'd remember to go
back and revisit it in 2020 to see how I did. Anybody want to set a calendar reminder
for Dec 31 2019 and remind me, complete with URL? ;-) )
&lt;/p&gt;
&lt;p&gt;
Without further preamble, here's what I said for 2008:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: The buzz around building custom languages
will only continue to build. More and more tools are emerging to support the creation
of custom programming languages, like Microsoft's Phoenix, Scala's parser combinators,
the Microsoft DLR, SOOT, Javassist, JParsec/NParsec, and so on. Suddenly, the whole
"write your own lexer and parser and AST from scratch" idea seems about as outmoded
as the idea of building your own String class. Granted, there are cases where a from-hand
scanner/lexer/parser/AST/etc is the Right Thing To Do, but there are times when building
your own String class is the Right Thing To Do, too. Between the rich ecosystem of
dynamic languages that could be ported to the JVM/CLR, and the interesting strides
being made on both platforms (JVM and CLR) to make them more "dynamic-friendly" (such
as being able to reify classes or access the call stack directly), the probability
that your company will find a need that is best answered by building a custom language
are only going to rise. &lt;strong&gt;NOW: &lt;/strong&gt;The buzz has definitely continued to
build, but buzz can only take us so far. There's been some scattershot use of custom
languages in a few scattershot situations, but it's certainly not "taken the world
by storm" in any meaningful way yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: The hype surrounding "domain-specific languages"
will peak in 2008, and start to generate a backlash. Let's be honest: when somebody
looks you straight in the eye and suggests that "scattered, smothered and covered"
is a domain-specific language, the term has lost all meaning. A lexicon unique to
an industry is not a domain-specific language; it's a lexicon. Period. If you can
incorporate said lexicon into your software, thus making it accessible to non-technical
professionals, that's a good thing. But simply using the lexicon doesn't make it a
domain-specific language. Or, alternatively, if you like, every single API designed
for a particular purpose is itself a domain-specific language. This means that Spring
configuration files are a DSL. Deployment descriptors are a DSL. The Java language
is a DSL (since the domain is that of programmers familiar with the Java language).
See how nonsensical this can get? Until somebody comes up with a workable definition
of the term "domain" in "domain-specific language", it's a nonsensical term. The idea
is a powerful one, mind you--creating something that's more "in tune" with what users
understand and can use easily is a technique that's been proven for decades now. Anybody
who's ever watched an accountant rip an entirely new set of predictions for the new
fiscal outlook based entirely on a few seed numbers and a deeply-nested set of Excel
macros knows this already. Whether you call them domain-specific languages or "little
languages" or "user-centric languages" or "macro language" is really up to you. &lt;strong&gt;NOW:&lt;/strong&gt; The
backlash hasn't begun, but only because the DSL buzz hasn't materialized in much way
yet--see previous note. It generally takes a year or two of deployments (and hard-earned
experience) before a backlash begins, and we haven't hit that "deployments" stage
yet in anything yet resembling "critical mass" yet. But the DSL/custom language buzz
continues to grow, and the more the buzz grows, the more the backlash is likey.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: Functional languages will begin to make their
presence felt. Between Microsoft's productization plans for F# and the growing community
of Scala programmers, not to mention the inherently functional concepts buried inside
of LINQ and the concurrency-friendly capabilities of side-effect-free programming,
the world is going to find itself working its way into functional thinking either
directly or indirectly. And when programmers start to see the inherent capabilities
inside of Scala (such as Actors) and/or F# (such as asynchronous workflows), they're
going to embrace the strange new world of functional/object hybrid and never look
back. &lt;strong&gt;NOW:&lt;/strong&gt; Several books on F# and Scala (and even one or two on
Haskell!) were published in 2008, and several more (including one of my own) are on
the way. The functional buzz is building, and lots of disparate groups are each evaluating
it (functional programming) independently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: MacOS is going to start posting some serious
market share numbers, leading lots of analysts to predict that Microsoft Windows has
peaked and is due to collapse sometime within the remainder of the decade. Mac's not
only a wonderful OS, but it's some of the best hardware to run Vista on. That will
lead not a few customers to buy Mac hardware, wipe the machine, and install Vista,
as many of the uber-geeks in the Windows world are already doing. This will in turn
lead Gartner (always on the lookout for an established trend they can "predict" on)
to suggest that Mac is going to end up with 115% market share by 2012 (.8 probability),
then sell you this wisdom for a mere price of $1.5 million (per copy). &lt;strong&gt;NOW:&lt;/strong&gt; Can't
speak to the Gartner report--I didn't have $1.5 million handy--but certainly the MacOS
is growing in popularity. More on that later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; &lt;em&gt;General&lt;/em&gt;: Ted will be hired by Gartner... if only to
keep him from smacking them around so much. .0001 probability, with probability going
up exponentially as my salary offer goes up exponentially. (Hey, I've got kids headed
for college in a few years.) &lt;strong&gt;NOW:&lt;/strong&gt; Well, Gartner appears to have lost
my email address and phone number, but I'm sure they were planning to make me that
offer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: MacOS is going to start creaking in a few
places. The Mac OS is a wonderful OS, but it's got its own creaky parts, and the more
users that come to Mac OS, the more that software packages are going to exploit some
of those creaky parts, leading to some instability in the Mac OS. It won't be widespread,
but for those who are interested in finding it, they're there. Assuming current trends
(of customers adopting Mac OS) hold, the Mac OS 10.6 upgrade is going to be a very
interesting process, indeed. &lt;strong&gt;NOW:&lt;/strong&gt; Shhh. Don't tell anybody, but I've
been seeing it starting to happen. Don't get me wrong, Apple still does a pretty good
job with the OS, but the law of numbers has started to create some bad upgrade scenarios
for some people.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: Somebody is going to realize that iTunes
is the world's biggest monopoly on music, and Apple will be forced to defend itself
in the court of law, the court of public opinion, or both. Let's be frank: if this
were Microsoft, offering music that can only be played on Microsoft music players,
the world would be through the roof. All UI goodness to one side, the iPod represents
just as much of a monopoly in the music player business as Internet Explorer did in
the operating system business, and if the world doesn't start taking Apple to task
over this, then "justice" is a word that only applies when losers in an industry want
to drag down the market leader (which I firmly believe to be the case--nobody likes
more than to pile on the successful guy). &lt;strong&gt;NOW:&lt;/strong&gt; Nothing this year.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: Somebody is going to realize that the iPhone's
"nothing we didn't write will survive the next upgrade process" policy is nothing
short of draconian. As my father, who gets it right every once in a while, says, "If
I put a third-party stereo in my car, the dealer doesn't get to rip it out and replace
it with one of their own (or nothing at all!) the next time I take it in for an oil
change". Fact is, if I buy the phone, I own the phone, and I own what's on it. Unfortunately,
this takes us squarely into the realm of DRM and IP ownership, and we all know how
clear-cut that is... But once the general public starts to understand some of these
issues--and I think the iPhone and iTunes may just be the vehicle that will teach
them--look out, folks, because the backlash will be huge. As in, "Move over, Mr. Gates,
you're about to be joined in infamy by your other buddy Steve...." &lt;strong&gt;NOW:&lt;/strong&gt; Apple
released iPhone 2.0, and with it, the iPhone SDK, so at least Apple has opened the
dashboard to third-party stereos. But the deployment model (AppStore) is still a bit
draconian, and Apple still jealously holds the reins over which apps can be deployed
there and which ones can't, so maybe they haven't learned their lesson yet, after
all....&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;Java&lt;/em&gt;: The OpenJDK in Mercurial will slowly start to
see some external contributions. The whole point of Mercurial is to allow for deeper
control over which changes you incorporate into your build tree, so once people figure
out how to build the JDK and how to hack on it, the local modifications will start
to seep across the Internet.... &lt;strong&gt;NOW:&lt;/strong&gt; OpenJDK has started to collect
contributions from external (to Sun) sources, but still in relatively small doses,
it seems. None of the local modifications I envisioned creeping across the 'Net have
begun, that I can see, so maybe it's still waiting to happen. Or maybe the OpenJDK
is too complicated to really allow for that kind of customization, and it never will.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; &lt;em&gt;Java&lt;/em&gt;: SpringSource will soon be seen as a vendor like
BEA or IBM or Sun. Perhaps with a bit better reputation to begin, but a vendor all
the same. &lt;strong&gt;NOW:&lt;/strong&gt; SpringSource's acquisition of G2One (the company behind
Groovy just as SpringSource backs Spring) only reinforced this image, but it seems
it's still something that some fail to realize or acknowledge due to Spring's open-source
(?) nature. (I'm not a Spring expert by any means, but apparently Spring 3 was pulled
back inside the SpringSource borders, leading some people to wonder what SpringSource
is up to, and whether or not Spring will continue to be open source after all.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; &lt;em&gt;.NET&lt;/em&gt;: Interest in OpenJDK will bootstrap similar interest
in Rotor/SSCLI. After all, they're both VMs, with lots of interesting ideas and information
about how the managed platforms work. &lt;strong&gt;NOW:&lt;/strong&gt; Nope, hasn't really happened
yet, that I can see. Not even the 2nd edition of the SSCLI book (by Joel Pobar and
yours truly, yes that was a plug) seemed to foster the kind of attention or interest
that I'd expected, or at least, not on the scale I'd thought might happen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;C++/Native&lt;/em&gt;: If you've not heard of LLVM before this,
you will. It's a compiler and bytecode toolchain aimed at the native platforms, complete
with JIT and GC. &lt;strong&gt;NOW:&lt;/strong&gt; Apple sank a lot of investment into LLVM, including
hosting an LLVM conference at the corporate headquarters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; &lt;em&gt;Java&lt;/em&gt;: Somebody will create Yet Another Rails-Killer
Web Framework. 'Nuff said. &lt;strong&gt;NOW:&lt;/strong&gt; You know what? I honestly can't say
whether this happened or not; I was completely not paying attention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; &lt;em&gt;Native&lt;/em&gt;: Developers looking for a native programming
language will discover D, and be happy. Considering D is from the same mind that was
the core behind the Zortech C++ compiler suite, and that D has great native platform
integration (building DLLs, calling into DLLs easily, and so on), not to mention automatic
memory management (except for those areas where you want manual memory management),
it's definitely worth looking into. &lt;a href="http://www.digitalmars.com"&gt;www.digitalmars.com&lt;/a&gt; &lt;strong&gt;NOW:&lt;/strong&gt; D
had its own get-together as well, and appears to still be going strong, among the
group of developers who still work on native apps (and aren't simply maintaining legacy
C/C++ apps).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Now, for the 2009 predictions. The last set was a little verbose, so let me see if
I can trim the list down a little and keep it short and sweet:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;General:&lt;/em&gt; "Cloud" will become the next "ESB" or "SOA", in that it will be
something that everybody will talk about, but few will understand and even fewer will
do anything with. (Considering the widespread disparity in the definition of the term,
this seems like a no-brainer.)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Java&lt;/em&gt;: Interest in Scala will continue to rise, as will the number of detractors
who point out that Scala is too hard to learn.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;.NET&lt;/em&gt;: Interest in F# will continue to rise, as will the number of detractors
who point out that F# is too hard to learn. (Hey, the two really are cousins, and
the fortunes of one will serve as a pretty good indication of the fortunes of the
other, and both really seem to be on the same arc right now.)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;General:&lt;/em&gt; Interest in all kinds of functional languages will continue to rise,
and more than one person will take a hint from Bob "crazybob" Lee and liken functional
programming to AOP, for good and for ill. People who took classes on Haskell in college
will find themselves reaching for their old college textbooks again.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;General:&lt;/em&gt; The iPhone is going to be hailed as "the enterprise development
platform of the future", and companies will be rolling out apps to it. Look for Quicken
iPhone edition, PowerPoint and/or Keynote iPhone edition, along with connectors to
hook the iPhone up to a presentation device, and (I'll bet) a World of Warcraft iPhone
client (legit or otherwise). iPhone is the new hotness in the mobile space, and people
will flock to it madly.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;.NET&lt;/em&gt;: Another Oslo CTP will come out, and it will bear only a superficial
resemblance to the one that came out in October at PDC. Betting on Oslo right now
is a fools' bet, not because of any inherent weakness in the technology, but just
because it's way too early in the cycle to be thinking about for anything vaguely
resembling production code.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;.NET&lt;/em&gt;: The IronPython and IronRuby teams will find some serious versioning
issues as they try to manage the DLR versioning story between themselves and the CLR
as a whole. An initial hack will result, which will be codified into a standard practice
when .NET 4.0 ships. Then the next release of IPy or IRb will have to try and slip
around its restrictions in 2010/2011. By 2012, IPy and IRb will have to be shipping
as part of Visual Studio just to put the releases back into lockstep with one another
(and the rest of the .NET universe).&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Java&lt;/em&gt;: The death of JSR-277 will spark an uprising among the two leading groups
hoping to foist it off on the Java community--OSGi and Maven--while the rest of the
Java world will breathe a huge sigh of relief and look to see what "modularity" means
in Java 7. Some of the alpha geeks in Java will start using--if not building--JDK
7 builds just to get a heads-up on its impact, and be quietly surprised and, I dare
say, perhaps even pleased.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Java&lt;/em&gt;: The invokedynamic JSR will leapfrog in importance to the top of the
list.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Windows&lt;/em&gt;: Another Windows 7 CTP will come out, and it will spawn huge media
interest that will eventually be remembered as Microsoft promises, that will eventually
be remembered as Microsoft guarantees, that will eventually be remembered as Microsoft
FUD and "promising much, delivering little". Microsoft ain't always at fault for the
inflated expectations people have--sometimes, yes, perhaps even a lot of times, but
not always.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mac OS&lt;/em&gt;: Apple will begin to legally threaten the clone market again, except
this time somebody's going to get the DOJ involved. (Yes, this is the iPhone/iTunes
prediction from last year, carrying over. I still expect this to happen.)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Languages&lt;/em&gt;: Alpha-geek developers will start creating their own languages
(even if they're obscure or bizarre ones like Shakespeare or Ook#) just to have that
listed on their resume as the DSL/custom language buzz continues to build.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;XML Services&lt;/em&gt;: Roy Fielding will officially disown most of the "REST"ful authors
and software packages available. Nobody will care--or worse, somebody looking to make
a name for themselves will proclaim that Roy "doesn't really understand REST". And
they'll be right--Roy doesn't understand what &lt;em&gt;they&lt;/em&gt; consider to be REST, and
the fact that he created the term will be of no importance anymore. Being "REST"ful
will equate to "I did it myself!", complete with expectations of a gold star and a
lollipop.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Parrot&lt;/em&gt;: The Parrot guys will make at least one more minor point release.
Nobody will notice or care, except for a few doggedly stubborn Perl hackers. They
will find themselves having nightmares of previous lives carrying around OS/2 books
and Amiga paraphernalia. Perl 6 will celebrate it's seventh... or is it eighth?...
anniversary of being announced, and nobody will notice.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Agile&lt;/em&gt;: The debate around "Scrum Certification" will rise to a fever pitch
as short-sighted money-tight companies start looking for reasons to cut costs and
either buy into agile at a superficial level and watch it fail, or start looking to
cut the agilists from their company in order to replace them with cheaper labor.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Flash&lt;/em&gt;: Adobe will continue to make Flex and AIR look more like C# and the
CLR even as Microsoft tries to make Silverlight look more like Flash and AIR. Web
designers will now get to experience the same fun that back-end web developers have
enjoyed for near-on a decade, as shops begin to artificially partition themselves
up as either "Flash" shops or "Silverlight" shops.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Personal&lt;/em&gt;: Gartner will still come knocking, looking to hire me for outrageous
sums of money to do nothing but blog and wax prophetic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Well, so much for brief or short. See you all again next year....
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=5394a334-8042-40ca-b80b-748b50ce9253" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,5394a334-8042-40ca-b80b-748b50ce9253.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=502a7f84-98f0-40d6-95aa-87513a7c35c6</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,502a7f84-98f0-40d6-95aa-87513a7c35c6.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,502a7f84-98f0-40d6-95aa-87513a7c35c6.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=502a7f84-98f0-40d6-95aa-87513a7c35c6</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It amazes me how insular and inward-facing the software industry is. And how the "agile"
movement is reaping the benefits of a very simple characteristic.
</p>
        <p>
For example, consider Jeff Palermo's essay on <a href="http://jeffreypalermo.com/blog/the-myth-of-self-organizing-teams/">"The
Myth of Self-Organizing Teams"</a>. Now, nothing against Jeff, or his post, <em>per
se</em>, but it amazes me how our industry believes that they are somehow inventing
new concepts, such as, in this case the "self-organizing team". Team dynamics have
been a subject of study for decades, and anyone with a background in psychology, business,
or sales has probably already been through much of the material on it. The best teams
are those that find their own sense of identity, that grow from within, but still
accept some leadership from the outside--the classic example here being the championship
sports team. Most often, that sense of identity is born of a string of successes,
which is why teams without a winning tradition have such a hard time creating the <em>esprit
de corps</em> that so often defines the difference between success and failure. 
</p>
        <blockquote>
          <p>
            <em>(Editor's note: Here's a free lesson to all of you out there who want to help
your team grow its own sense of identity: give them a chance to win a few successes,
and they'll start coming together pretty quickly. It's not always that easy, but it
works more often than not.)</em>
          </p>
        </blockquote>
        <p>
How many software development managers--much less technical leads or project managers--have
actually gone and looked through the management aisle at the local bookstore?
</p>
        <p>
Tom and Mary Poppendieck have been spending years now talking about "lean" software
development, which itself (at a casual glance) seems to be a refinement of the concepts
Toyota and other Japanese manufacturers were pursuing close to two decades ago. "Total
quality management" was a concept introduced in those days, the idea that anyone on
the production line was empowered to stop the line if they found something that wasn't
right. (My father was one of those "lean" manufacturing advocates back in the 80's,
in fact, and has some great stories he can tell to its successes, and failures.)
</p>
        <p>
How many software development managers or project leads give their developers the
chance to say, "No, it's not right yet, we can't ship", and back them on it? Wouldn't
you, as a developer, feel far more involved in the project if you knew you had that
power--and that responsibility?
</p>
        <p>
Or consider the "agile" notion of customer involvement, the classic XP "On-Site Customer"
principle. Sales people have known for years, even decades (if not centuries), that
if you involve the customer in the process, they are much more likely to feel an ownership
stake sooner than if they just take what's on the lot or the shelf. Skilled salespeople
have done the "let's walk through what you <em>might</em> buy, if you were buying,
of course" trick countless numbers of times, and ended up with a sale where the customer
didn't even intend to buy.
</p>
        <p>
How many software development managers or project leads have read a book on basic
salesmanship? And yet, isn't that notion of extracting what the customer wants endemic
to both software development and basic sales (of anything)?
</p>
        <p>
What is it about the software industry that just collectively refuses to accept that
there might be lots of interesting research on topics that aren't technical yet still
something that we can use? Why do we feel so compelled to trumpet our own "innovations"
to ourselves, when in fact, they've been long-known in dozens of other contexts? When
will we wake up and realize that we can learn a lot more if we cross-train in other
areas... like, for example, getting your MBA?
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=502a7f84-98f0-40d6-95aa-87513a7c35c6" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>The Myth of Discovery</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,502a7f84-98f0-40d6-95aa-87513a7c35c6.aspx</guid>
      <link>http://blogs.tedneward.com/2008/12/10/The+Myth+Of+Discovery.aspx</link>
      <pubDate>Wed, 10 Dec 2008 15:48:45 GMT</pubDate>
      <description>&lt;p&gt;
It amazes me how insular and inward-facing the software industry is. And how the "agile"
movement is reaping the benefits of a very simple characteristic.
&lt;/p&gt;
&lt;p&gt;
For example, consider Jeff Palermo's essay on &lt;a href="http://jeffreypalermo.com/blog/the-myth-of-self-organizing-teams/"&gt;"The
Myth of Self-Organizing Teams"&lt;/a&gt;. Now, nothing against Jeff, or his post, &lt;em&gt;per
se&lt;/em&gt;, but it amazes me how our industry believes that they are somehow inventing
new concepts, such as, in this case the "self-organizing team". Team dynamics have
been a subject of study for decades, and anyone with a background in psychology, business,
or sales has probably already been through much of the material on it. The best teams
are those that find their own sense of identity, that grow from within, but still
accept some leadership from the outside--the classic example here being the championship
sports team. Most often, that sense of identity is born of a string of successes,
which is why teams without a winning tradition have such a hard time creating the &lt;em&gt;esprit
de corps&lt;/em&gt; that so often defines the difference between success and failure. 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;(Editor's note: Here's a free lesson to all of you out there who want to help
your team grow its own sense of identity: give them a chance to win a few successes,
and they'll start coming together pretty quickly. It's not always that easy, but it
works more often than not.)&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
How many software development managers--much less technical leads or project managers--have
actually gone and looked through the management aisle at the local bookstore?
&lt;/p&gt;
&lt;p&gt;
Tom and Mary Poppendieck have been spending years now talking about "lean" software
development, which itself (at a casual glance) seems to be a refinement of the concepts
Toyota and other Japanese manufacturers were pursuing close to two decades ago. "Total
quality management" was a concept introduced in those days, the idea that anyone on
the production line was empowered to stop the line if they found something that wasn't
right. (My father was one of those "lean" manufacturing advocates back in the 80's,
in fact, and has some great stories he can tell to its successes, and failures.)
&lt;/p&gt;
&lt;p&gt;
How many software development managers or project leads give their developers the
chance to say, "No, it's not right yet, we can't ship", and back them on it? Wouldn't
you, as a developer, feel far more involved in the project if you knew you had that
power--and that responsibility?
&lt;/p&gt;
&lt;p&gt;
Or consider the "agile" notion of customer involvement, the classic XP "On-Site Customer"
principle. Sales people have known for years, even decades (if not centuries), that
if you involve the customer in the process, they are much more likely to feel an ownership
stake sooner than if they just take what's on the lot or the shelf. Skilled salespeople
have done the "let's walk through what you &lt;em&gt;might&lt;/em&gt; buy, if you were buying,
of course" trick countless numbers of times, and ended up with a sale where the customer
didn't even intend to buy.
&lt;/p&gt;
&lt;p&gt;
How many software development managers or project leads have read a book on basic
salesmanship? And yet, isn't that notion of extracting what the customer wants endemic
to both software development and basic sales (of anything)?
&lt;/p&gt;
&lt;p&gt;
What is it about the software industry that just collectively refuses to accept that
there might be lots of interesting research on topics that aren't technical yet still
something that we can use? Why do we feel so compelled to trumpet our own "innovations"
to ourselves, when in fact, they've been long-known in dozens of other contexts? When
will we wake up and realize that we can learn a lot more if we cross-train in other
areas... like, for example, getting your MBA?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=502a7f84-98f0-40d6-95aa-87513a7c35c6" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,502a7f84-98f0-40d6-95aa-87513a7c35c6.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=277a29cb-c011-45a3-82f9-6e702d5ad5df</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,277a29cb-c011-45a3-82f9-6e702d5ad5df.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,277a29cb-c011-45a3-82f9-6e702d5ad5df.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=277a29cb-c011-45a3-82f9-6e702d5ad5df</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The full list is <a href="http://www.noop.nl/2008/09/top-100-blogs-for-development-managers-q3-2008.html">here</a>.
It's a pretty prestigious group--and I'm totally floored that I'm there next to some
pretty big names.
</p>
        <p>
In homage to Ms. Sally Fields, of so many years ago... "You like me, you really like
me". Having somebody come up to me at a conference and tell me how much they like
my blog is second on my list of "fun things to happen to me at a conference", right
behind having somebody come up to me at a conference and tell me how much they like
my blog, except for that one entry, where I said something <em>totally</em> ridiculous
(and here's why) ....
</p>
        <p>
What I find most fascinating about the list was the means by which it was constructed--the
various calculations behind page rank, technorati rating, and so on. Very cool stuff.
</p>
        <p>
Perhaps it's trite to say it, but it's still true: readers are what make writing blogs
worthwhile. Thanks to all of you.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=277a29cb-c011-45a3-82f9-6e702d5ad5df" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Apparently I'm #25 on the Top 100 Blogs for Development Managers</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,277a29cb-c011-45a3-82f9-6e702d5ad5df.aspx</guid>
      <link>http://blogs.tedneward.com/2008/09/15/Apparently+Im+25+On+The+Top+100+Blogs+For+Development+Managers.aspx</link>
      <pubDate>Mon, 15 Sep 2008 11:29:19 GMT</pubDate>
      <description>&lt;p&gt;
The full list is &lt;a href="http://www.noop.nl/2008/09/top-100-blogs-for-development-managers-q3-2008.html"&gt;here&lt;/a&gt;.
It's a pretty prestigious group--and I'm totally floored that I'm there next to some
pretty big names.
&lt;/p&gt;
&lt;p&gt;
In homage to Ms. Sally Fields, of so many years ago... "You like me, you really like
me". Having somebody come up to me at a conference and tell me how much they like
my blog is second on my list of "fun things to happen to me at a conference", right
behind having somebody come up to me at a conference and tell me how much they like
my blog, except for that one entry, where I said something &lt;em&gt;totally&lt;/em&gt; ridiculous
(and here's why) ....
&lt;/p&gt;
&lt;p&gt;
What I find most fascinating about the list was the means by which it was constructed--the
various calculations behind page rank, technorati rating, and so on. Very cool stuff.
&lt;/p&gt;
&lt;p&gt;
Perhaps it's trite to say it, but it's still true: readers are what make writing blogs
worthwhile. Thanks to all of you.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=277a29cb-c011-45a3-82f9-6e702d5ad5df" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,277a29cb-c011-45a3-82f9-6e702d5ad5df.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=033a0895-7246-4015-8516-fa26291adc45</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,033a0895-7246-4015-8516-fa26291adc45.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,033a0895-7246-4015-8516-fa26291adc45.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=033a0895-7246-4015-8516-fa26291adc45</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://callvirt.net/blog/entry.aspx?entryid=b9a94d0c-761a-4d6b-bc2f-d6a5f8c1a4a7">As
Joel points out</a>, we've made a draft of the <em>SSCLI 2.0 Internals</em> book available
for download (via his blog). Rather than tell you all about the book, which Joel summarizes
quite well, instead I thought I'd tell you about the process by which the book came
to be.
</p>
        <blockquote>
          <p>
            <em>Editor's note: if you have no interest in the process by which a book can get
done, skip the rest of this blog entry.</em>
          </p>
        </blockquote>
        <p>
One thing that readers will note that's different about this version of "the Rotor
book" is that it's <em>not</em> being done through one of the traditional publishers.
This is deliberate. As Joel and I talk about on the <a href="http://www.dotnetrocks.com/default.aspx?showNum=360">.NET
Rocks! show we did together</a>, the first Rotor book was on the first version of
Rotor, which shipped shortly after the .NET 1.1 bits shipped to customers. That was
back in the summer of 2001. Dave, Geoff and I shipped the book, I did a few conference
talks on Rotor for the relatively few people who had an interest in what was going
on "under the hood" of the CLR, and then we all sort of parted ways. (Dave retired
from Microsoft entirely shortly thereafter, in order "to focus on the two things that
matter in life: making music and making wine", as he put it.) Mission accomplished,
we moved on.
</p>
        <p>
Meanwhile, as we all knew would happen, the world moved on--Whidbey (.NET 2.0) shipped,
and with it came a whole slew of CLR enhancements, most notably generics. Unlike how
generics happened in the JVM, CLR generics are carried through all the way to the
type system, and as a result, a lot of what we said in the first Rotor book was instantly
rendered obsolete. Granted, one could always grab the Gyro patch for Rotor and see
what generics would have looked like, but even that was pretty much rendered obsolete
by the emergence of the SSCLI 2.0 drop, bringing the Rotor code up to date with the
Whidbey production CLR release.
</p>
        <p>
Except the book was, to be blunt about it, left behind.
</p>
        <p>
Speaking honestly, the book never broke any sales records. Sure, for a while there
it was the #1 best-selling book (in Redmond, WA, to my <em>total</em> shock and surprise)
on Amazon, but we never had the kind of best-seller success that that of, say, <em>Programming
Ruby</em> or pick-your-favorite-ASP.NET book. In the book publishing world, this was
kind of the moral equivalent to watching your neighbors' slide show of their vacation:
boring for most people <em>not</em> in the pictures, unless you were <em>really</em> interested
in either the place they were visiting or what they did there. Most of our audience
were either people working on the CLR itself (hence all the copies sold in Redmond,
get it?), people who were researching on the CLR (such as the various Rotor research
projects that came over a few years after its release), or people who just had that
itch to "get wonky with it" and learn how some of the structures worked. Granted,
a lot of what those people in the last category learned turned out to be pretty helpful
in the Real World, but it was a payoff that came with a pretty non-trivial learning
curve.
</p>
        <p>
Fast-forward a few years, to the end of calendar year 2005.
</p>
        <p>
By this point, .NET 2.0 has been out in production form for a bit, and Mark Lewin,
then of Microsoft University Relations (I think that was his job, but to be honest
my recollection on that point is kinda fuzzy) approached me: Microsoft was interested
in seeing a second edition of the book out, to keep the Rotor community up to date
with what was going on in the state of the art in the CLR. Was I interested? Sure,
but the rules surrounding a multi-author book and subsequent editions are pretty clear:
everybody has to be given right of first refusal. Thus a two-fold task was under way:
find a co-author (preferably somebody from the CLR team, since my skills had never
really been in navigating the Rotor source code in the first place, and I hadn't really
spent a significant amount of time in the code since 2001), and get Geoff and Dave
to indicate--in a very proper legal fashion--that they were passing on the second
edition.
</p>
        <p>
Ugh. Lawyers. Contracts. Bleah.
</p>
        <p>
John Osborn then broke the bad news: OReilly wasn't interested in doing a second edition.
I couldn't really blame them, since the first hadn't broken any kind of sales record,
but I was a bit bummed because I thought this was the end of the road.
</p>
        <p>
Mark Lewin to the rescue. Apparently his part of Microsoft <em>really</em> wanted
this book out, to the point where they were willing to fund the effort, if I and my
co-author were still interested. Sure, that sounded like a workable idea. And once
the book was done, maybe we could publish it through MSPress, if that sounded like
a good idea to me. Sure, that sounded good. Then Mark dropped the suggestion that
maybe I could talk to Joel Pobar, former CLR geek extraordinaire, to see if he was
interested. Joel had impressed me back when we'd briefly touched bases during the
first book-writing experience, so yeah, sure, that sounded like a good idea. He was
on board pretty quickly, and so we had the first step out of the way.
</p>
        <p>
Next, we had to get OReilly to release their copyright on the first book, so we (and
possibly MSPress) could work on and publish the second edition. This turned out to
be a huge part of the time between then and now, not owing to any one party's deliberate
attempt to derail the process, but just because copies of contracts had to be sent
to the original three authors (myself, Stutz and Geoff) to sign over our rights with
OReilly to a Creative Commons License, then copies had to be sent to everybody else
so all the signatures could appear on one document, and so on.
</p>
        <p>
Did I say it already? Ugh. Lawyers. Contracts. Bleah.
</p>
        <p>
Then, we had to get a contract from Microsoft signed, and that meant more contracts
flying back and forth across the fax lines, and then later the US (and Australian)
postal system, and that was more delays as the same round of signatures had to be
exchanged.
</p>
        <p>
Just for the record: Ugh. Lawyers. Contracts. Bleah.
</p>
        <p>
Finally, though, the die was cast, the authors were ready to go, and.... Hey, does
anybody have the latest soft copy of the Word docs we used from the first edition?
A quick email to John (Osborn) took longer than we thought, as OReilly tried to find
the post-QA docs for us to work from. (I had my own copies, of course, but they were
pre-QA, and thus not really what we wanted to start from.) More rounds of emails to
try and track those down, so we can get started. Oh, and while we're at it, can we
get the figures/graphics, too? They're not in the manuscript directly, so.... Oh,
wait, does anybody know how to read .EPS files?
</p>
        <p>
Then began the actual writing process, or, to be more precise, the revision process.
We decided on a process similar to the way the first book had been written: Joel,
being the "subject matter expert", would take a first pass on the text, and sketch
in the rough outlines of what needed to be said. I would then take the prose, polish
it up (which in many cases didn't require a whole lot of work, Joel being a great
writer in his own right) and rearrange sections as necessary to make it flow more
easily, as well as flesh out certain sections that didn't require a former position
on the CLR team to write. Joel would then have a look at what I wrote, and assuming
I didn't get it completely wrong, would sign off on it, and the chapter/section/paragraph/whatever
was done.
</p>
        <p>
And now we're in the process of doing that cosmetic cleanup that's part of the overtime
period in book-writing, including generating the table of contents and index, since,
it turns out, we'd rather publish it ourselves than through MSPress (which they're
OK with). So, readers will have a choice: get the free download from Microsoft's website
(once we're done, which should be "real soon now") and read it in soft-copy, or buy
it off of Amazon in "treeware version", which will put a modest amount of money into
Joel's and my collective pocket (once the relatively modest expenses of self-publishing
are covered, that is).
</p>
        <p>
This will be my first experience with self-publishing (as it is for Joel, too), so
I'm eager to see how the whole things turns out. One thing I will warn the prospective
self-publisher, though: do <em>not</em> underestimate the time you will spend doing
those things the editorial/QA/copyedit pass normally handles for you, because it's
kind of a pain in the *ss to do it yourself. Still, it's worth it, particularly if
you're having a hard time selling your book to a publisher who, for reasons of economy
of scale, don't want to publish a niche book (like this one).
</p>
        <p>
Anyway, like many of my blog postings, this post has gone on long enough, so I'll
sign off here with a "go read the draft", even if you're a Java or other execution
engine/virtual machine kind of developer--seeing the nuts and bolts of a complex execution
engine in action is a pretty cool exercise.
</p>
        <p>
Oh, and if anybody's interested in doing a similar kind of effort around the OpenJDK
(once it ships), let me know, 'cuz I'm a glutton for punishment....
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=033a0895-7246-4015-8516-fa26291adc45" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Rotor v2 book draft available</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,033a0895-7246-4015-8516-fa26291adc45.aspx</guid>
      <link>http://blogs.tedneward.com/2008/08/20/Rotor+V2+Book+Draft+Available.aspx</link>
      <pubDate>Wed, 20 Aug 2008 18:55:05 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://callvirt.net/blog/entry.aspx?entryid=b9a94d0c-761a-4d6b-bc2f-d6a5f8c1a4a7"&gt;As
Joel points out&lt;/a&gt;, we've made a draft of the &lt;em&gt;SSCLI 2.0 Internals&lt;/em&gt; book available
for download (via his blog). Rather than tell you all about the book, which Joel summarizes
quite well, instead I thought I'd tell you about the process by which the book came
to be.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Editor's note: if you have no interest in the process by which a book can get
done, skip the rest of this blog entry.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
One thing that readers will note that's different about this version of "the Rotor
book" is that it's &lt;em&gt;not&lt;/em&gt; being done through one of the traditional publishers.
This is deliberate. As Joel and I talk about on the &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=360"&gt;.NET
Rocks! show we did together&lt;/a&gt;, the first Rotor book was on the first version of
Rotor, which shipped shortly after the .NET 1.1 bits shipped to customers. That was
back in the summer of 2001. Dave, Geoff and I shipped the book, I did a few conference
talks on Rotor for the relatively few people who had an interest in what was going
on "under the hood" of the CLR, and then we all sort of parted ways. (Dave retired
from Microsoft entirely shortly thereafter, in order "to focus on the two things that
matter in life: making music and making wine", as he put it.) Mission accomplished,
we moved on.
&lt;/p&gt;
&lt;p&gt;
Meanwhile, as we all knew would happen, the world moved on--Whidbey (.NET 2.0) shipped,
and with it came a whole slew of CLR enhancements, most notably generics. Unlike how
generics happened in the JVM, CLR generics are carried through all the way to the
type system, and as a result, a lot of what we said in the first Rotor book was instantly
rendered obsolete. Granted, one could always grab the Gyro patch for Rotor and see
what generics would have looked like, but even that was pretty much rendered obsolete
by the emergence of the SSCLI 2.0 drop, bringing the Rotor code up to date with the
Whidbey production CLR release.
&lt;/p&gt;
&lt;p&gt;
Except the book was, to be blunt about it, left behind.
&lt;/p&gt;
&lt;p&gt;
Speaking honestly, the book never broke any sales records. Sure, for a while there
it was the #1 best-selling book (in Redmond, WA, to my &lt;em&gt;total&lt;/em&gt; shock and surprise)
on Amazon, but we never had the kind of best-seller success that that of, say, &lt;em&gt;Programming
Ruby&lt;/em&gt; or pick-your-favorite-ASP.NET book. In the book publishing world, this was
kind of the moral equivalent to watching your neighbors' slide show of their vacation:
boring for most people &lt;em&gt;not&lt;/em&gt; in the pictures, unless you were &lt;em&gt;really&lt;/em&gt; interested
in either the place they were visiting or what they did there. Most of our audience
were either people working on the CLR itself (hence all the copies sold in Redmond,
get it?), people who were researching on the CLR (such as the various Rotor research
projects that came over a few years after its release), or people who just had that
itch to "get wonky with it" and learn how some of the structures worked. Granted,
a lot of what those people in the last category learned turned out to be pretty helpful
in the Real World, but it was a payoff that came with a pretty non-trivial learning
curve.
&lt;/p&gt;
&lt;p&gt;
Fast-forward a few years, to the end of calendar year 2005.
&lt;/p&gt;
&lt;p&gt;
By this point, .NET 2.0 has been out in production form for a bit, and Mark Lewin,
then of Microsoft University Relations (I think that was his job, but to be honest
my recollection on that point is kinda fuzzy) approached me: Microsoft was interested
in seeing a second edition of the book out, to keep the Rotor community up to date
with what was going on in the state of the art in the CLR. Was I interested? Sure,
but the rules surrounding a multi-author book and subsequent editions are pretty clear:
everybody has to be given right of first refusal. Thus a two-fold task was under way:
find a co-author (preferably somebody from the CLR team, since my skills had never
really been in navigating the Rotor source code in the first place, and I hadn't really
spent a significant amount of time in the code since 2001), and get Geoff and Dave
to indicate--in a very proper legal fashion--that they were passing on the second
edition.
&lt;/p&gt;
&lt;p&gt;
Ugh. Lawyers. Contracts. Bleah.
&lt;/p&gt;
&lt;p&gt;
John Osborn then broke the bad news: OReilly wasn't interested in doing a second edition.
I couldn't really blame them, since the first hadn't broken any kind of sales record,
but I was a bit bummed because I thought this was the end of the road.
&lt;/p&gt;
&lt;p&gt;
Mark Lewin to the rescue. Apparently his part of Microsoft &lt;em&gt;really&lt;/em&gt; wanted
this book out, to the point where they were willing to fund the effort, if I and my
co-author were still interested. Sure, that sounded like a workable idea. And once
the book was done, maybe we could publish it through MSPress, if that sounded like
a good idea to me. Sure, that sounded good. Then Mark dropped the suggestion that
maybe I could talk to Joel Pobar, former CLR geek extraordinaire, to see if he was
interested. Joel had impressed me back when we'd briefly touched bases during the
first book-writing experience, so yeah, sure, that sounded like a good idea. He was
on board pretty quickly, and so we had the first step out of the way.
&lt;/p&gt;
&lt;p&gt;
Next, we had to get OReilly to release their copyright on the first book, so we (and
possibly MSPress) could work on and publish the second edition. This turned out to
be a huge part of the time between then and now, not owing to any one party's deliberate
attempt to derail the process, but just because copies of contracts had to be sent
to the original three authors (myself, Stutz and Geoff) to sign over our rights with
OReilly to a Creative Commons License, then copies had to be sent to everybody else
so all the signatures could appear on one document, and so on.
&lt;/p&gt;
&lt;p&gt;
Did I say it already? Ugh. Lawyers. Contracts. Bleah.
&lt;/p&gt;
&lt;p&gt;
Then, we had to get a contract from Microsoft signed, and that meant more contracts
flying back and forth across the fax lines, and then later the US (and Australian)
postal system, and that was more delays as the same round of signatures had to be
exchanged.
&lt;/p&gt;
&lt;p&gt;
Just for the record: Ugh. Lawyers. Contracts. Bleah.
&lt;/p&gt;
&lt;p&gt;
Finally, though, the die was cast, the authors were ready to go, and.... Hey, does
anybody have the latest soft copy of the Word docs we used from the first edition?
A quick email to John (Osborn) took longer than we thought, as OReilly tried to find
the post-QA docs for us to work from. (I had my own copies, of course, but they were
pre-QA, and thus not really what we wanted to start from.) More rounds of emails to
try and track those down, so we can get started. Oh, and while we're at it, can we
get the figures/graphics, too? They're not in the manuscript directly, so.... Oh,
wait, does anybody know how to read .EPS files?
&lt;/p&gt;
&lt;p&gt;
Then began the actual writing process, or, to be more precise, the revision process.
We decided on a process similar to the way the first book had been written: Joel,
being the "subject matter expert", would take a first pass on the text, and sketch
in the rough outlines of what needed to be said. I would then take the prose, polish
it up (which in many cases didn't require a whole lot of work, Joel being a great
writer in his own right) and rearrange sections as necessary to make it flow more
easily, as well as flesh out certain sections that didn't require a former position
on the CLR team to write. Joel would then have a look at what I wrote, and assuming
I didn't get it completely wrong, would sign off on it, and the chapter/section/paragraph/whatever
was done.
&lt;/p&gt;
&lt;p&gt;
And now we're in the process of doing that cosmetic cleanup that's part of the overtime
period in book-writing, including generating the table of contents and index, since,
it turns out, we'd rather publish it ourselves than through MSPress (which they're
OK with). So, readers will have a choice: get the free download from Microsoft's website
(once we're done, which should be "real soon now") and read it in soft-copy, or buy
it off of Amazon in "treeware version", which will put a modest amount of money into
Joel's and my collective pocket (once the relatively modest expenses of self-publishing
are covered, that is).
&lt;/p&gt;
&lt;p&gt;
This will be my first experience with self-publishing (as it is for Joel, too), so
I'm eager to see how the whole things turns out. One thing I will warn the prospective
self-publisher, though: do &lt;em&gt;not&lt;/em&gt; underestimate the time you will spend doing
those things the editorial/QA/copyedit pass normally handles for you, because it's
kind of a pain in the *ss to do it yourself. Still, it's worth it, particularly if
you're having a hard time selling your book to a publisher who, for reasons of economy
of scale, don't want to publish a niche book (like this one).
&lt;/p&gt;
&lt;p&gt;
Anyway, like many of my blog postings, this post has gone on long enough, so I'll
sign off here with a "go read the draft", even if you're a Java or other execution
engine/virtual machine kind of developer--seeing the nuts and bolts of a complex execution
engine in action is a pretty cool exercise.
&lt;/p&gt;
&lt;p&gt;
Oh, and if anybody's interested in doing a similar kind of effort around the OpenJDK
(once it ships), let me know, 'cuz I'm a glutton for punishment....
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=033a0895-7246-4015-8516-fa26291adc45" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,033a0895-7246-4015-8516-fa26291adc45.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>F#</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=c3ad9bf0-39cd-4985-981e-dabc0342dbf2</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,c3ad9bf0-39cd-4985-981e-dabc0342dbf2.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,c3ad9bf0-39cd-4985-981e-dabc0342dbf2.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c3ad9bf0-39cd-4985-981e-dabc0342dbf2</wfw:commentRss>
      <slash:comments>9</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This comment deserves response:
</p>
        <blockquote>
          <p>
First of all, if you're quoting my post, blocking out my name, and attacking me behind
my back by calling me "our intrepid troll", you could have shown the decency of linking
back to my original post. Here it is, for those interested in the real discussion: 
</p>
          <p>
            <a href="http://www.agilesoftwaredevelopment.com/blog/jurgenappelo/professionalism-knowledge-first">http://www.agilesoftwaredevelopment.com/blog/jurgenappelo/professionalism-knowledge-first</a>
          </p>
        </blockquote>
        <p>
Well, frankly, I didn't get your post from your blog, I got it from an email 'zine
(as indicated by the comment "This crossed my Inbox..."), and I didn't really think
that anybody would have any difficulty tracking down where it came from, at least
in terms of the email blast that put it into my Inbox. Coupled with the fact that,
quite honestly, I don't generally make a practice of using peoples' names without
their permission (and my email to the author asking if I could quote the post with
his name attached generated no response), so I blocked out the name. Having said that,
I'm pleased to offer full credit as to its source. 
</p>
        <blockquote>
          <p>
Now, let's review some of your remarks: 
</p>
          <p>
"COBOL is (at least) twenty years old, so therefore any use of COBOL must clearly
be as idiotic." 
</p>
          <p>
I never talked about COBOL, or any other programming language. I was talking about
old practices that are nowadays considered harmful and seriously damaging. (Like practising
waterfall project management, instead of agile project management.) I don't see how
programming in COBOL could seriously damage a business. Why do you compare COBOL with
lobotomies? I don't understand. I couldn't care less about programming languages.
I care about management practices.
</p>
        </blockquote>
        <p>
Frankly, the distinction isn't very clear in your post, and even more frankly, to
draw a distinction here is a bit specious. "I didn't mean we should throw away the <em>good</em> stuff
that's twenty years old, only the <em>bad</em> stuff!" doesn't seem much like a defense
to me. There are cases where waterfall style development is <em>exactly</em> the right
thing to do a more agile approach is <em>exactly</em> the wrong thing to do--the difference,
as I'm fond of saying, lies entirely in the context of the problem. Analogously, there
are cases where keeping an existing COBOL system up and running is the wrong thing
to do, and replacing it with a new system is the right thing to do. It all depends
on context, and for that reason, any dogmatic suggestion otherwise is flawed. 
</p>
        <blockquote>
          <p>
"How can a developer honestly claim to know "what it can be good for", without some
kind of experience to back it?" 
</p>
          <p>
I'm talking about gaining knowledge from the experience of others. If I hear 10 experts
advising the same best practice, then I still don't have any experience in that best
practice. I only have knowledge about it. That's how you can apply your knowledge
without your experience.
</p>
        </blockquote>
        <p>
Leaving aside the notion that there is no such thing as best practices (another favorite
rant of mine), what you're suggesting is that you, the individual, don't necessarily
have to have experience in the topic but others have to, before we can put faith into
it. That's a very different scenario than saying "We don't need no stinkin' experience",
and is still vastly more dangerous than saying, "I have used this, it works." I (and
lots of IT shops, I've found) will vastly prefer the latter to the former. 
</p>
        <blockquote>
          <p>
"Knowledge, apparently, isn't enough--experience still matters" 
</p>
          <p>
Yes, I never said experience doesn't matter. I only said it has no value when you
don't have gained the appropriate knowledge (from other sources) on when to apply
it, and when not.
</p>
        </blockquote>
        <p>
You said it when you offered up the title, "Knowledge, not Experience". 
</p>
        <blockquote>
          <p>
"buried under all the ludicrous hyperbole, he has a point" 
</p>
          <p>
Thanks for agreeing with me.
</p>
        </blockquote>
        <p>
You're welcome! :-) Seriously, I think I understand better what you were trying to
say, and it's not the horrendously dangerous comments that I thought you were saying,
so I will apologize here and now for believing you to be a wet-behind-the-ears/lets-let-technology-solve-all-our-problems/dangerous-to-the-extreme
developer that I've run across far too often, particularly in startups. So, please,
will you accept my apology? 
</p>
        <blockquote>
          <p>
"developers, like medical professionals, must ensure they are on top of their game
and spend some time investing in themselves and their knowledge portfolio" 
</p>
          <p>
Exactly.
</p>
        </blockquote>
        <p>
Exactly. :-) 
</p>
        <blockquote>
          <p>
"this doesn't mean that everything you learn is immediately applicable, or even appropriate,
to the situation at hand" 
</p>
          <p>
I never said that. You're putting words into my mouth. 
</p>
          <p>
My only claim is that you need to KNOW both new and old practices and understand which
ones are good and which ones can be seriously damaging. I simply don't trust people
who are bragging about their experience. What if a manager tells me he's got 15 years
of experience managing developers? If he's a micro-manager I still don't want him.
Because micro-management is considered harmful these days. A manager should KNOW that.
</p>
        </blockquote>
        <p>
Again, this was precisely the read I picked up out of the post, and my apologies for
the misinterpretation. But I stand by the idea that this is one of those posts that <em>could</em> be
read in a highly dangerous fashion, and used to promote evil, in the form of "Well,
he runs a company, so therefore he must know what he's doing, and therefore having
any kind of experience isn't really necessary to use something new, so... see, Mr.
CEO boss-of-mine? We're safe! Now get out of my way and let me use Software Factories
to build our next-generation mission-critical core-of-the-company software system,
even though nobody's ever done it before." 
</p>
        <p>
To speak to your example for a second, for example: Frankly, there are situations
where a micro-manager is a <em>good</em> thing. Young, inexperienced developers, for
example, need more hand-holding and mentoring than older, more senior, more experienced
developers do (speaking stereotypically, of course). And, quite honestly, the guy
with 15 years managing developers is <em>far</em> more likely to know how to manage
developers than the guy who's never managed developers before at all. The former is
the safer bet; not a guarantee, certainly, but often the safer bet, and that's sometimes
the best we can do in this industry. 
</p>
        <blockquote>
          <p>
"And we definitely shouldn't look at anything older than five years ago and equate
it to lobotomies." 
</p>
          <p>
I never said that either. Why do you claim that I said this? I don't have a problem
with old techniques. The daily standup meeting is a 80-year old best practice. It
was already used by pilots in the second world war. How could I be against that? It's
fine as it is.
</p>
        </blockquote>
        <p>
Um... because you used the term "lobotomies" first? And because your title pretty
clearly implies the statement, perhaps? (And let's lose the term "best practice" entirely,
please? There is no such thing--not even the daily standup.) 
</p>
        <blockquote>
          <p>
It's ok you didn't like my article. Sure it's meant to be provocative, and food for
thought. The article got twice as many positive votes than negative votes from DZone
readers. So I guess I'm adding value. But by taking the discussion away from its original
context (both physically and conceptually), and calling me names, you're not adding
any value for anyone.
</p>
        </blockquote>
        <p>
I took it in exactly the context it was given--a DZone email blast. I can't help it
if it was taken out of context, because that's how it was handed to me. What's worse,
I can see a development team citing this as an "expert opinion" to their management
as a justification to try untested approaches or technologies, or as inspiration to
a young developer, who reads "knowledge, not experience", and thinks, "Wow, if I know
all the cutting-edge latest stuff, I don't need to have those 10 years of experience
to get that job as a senior application architect." If your article was aimed more
clearly at the development process side of things, then I would wish it had appeared
more clearly in the arena of development processes, and made it more clear that your
aim was to suggest that managers (who aren't real big on reading blogs anyway, I've
sadly found) should be a bit more pragmatic and open-minded about who they hire.
</p>
        <p>
Look, I understand the desire for a provocative title--for me, the author of "The
Vietnam of Computer Science", to cast stones at another author for choosing an eye-catching
title is so far beyond hypocrisy as to move into sheer wild-eyed audacity. But I have
seen, first-hand, how that article has been used to justify the most incredibly asinine
technology decisions, and it moves me now to say "Be careful what you wish for" when
choosing titles that meant to be provocative and food for thought. Sure, your piece
got more positive votes than negative ones. So too, in their day, did articles on
client-server, on CORBA, on Six-Sigma, on the necessity for big up-front design....
</p>
        <p>
 
</p>
        <p>
Let me put it to you this way. Assume your child or your wife is sick, and as you
reach the hospital, the admittance nurse offers you a choice of the two doctors on
call. Who do you want more: the doctor who just graduated fresh from medical school
and knows all the latest in holistic and unconventional medicine, or the doctor with
30 years' experience and a solid track record of healthy patients?
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c3ad9bf0-39cd-4985-981e-dabc0342dbf2" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>From the &amp;quot;Gosh, You Wanted Me to Quote You?&amp;quot; Department...</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,c3ad9bf0-39cd-4985-981e-dabc0342dbf2.aspx</guid>
      <link>http://blogs.tedneward.com/2008/07/25/From+The+QuotGosh+You+Wanted+Me+To+Quote+Youquot+Department.aspx</link>
      <pubDate>Fri, 25 Jul 2008 07:03:40 GMT</pubDate>
      <description>&lt;p&gt;
This comment deserves response:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
First of all, if you're quoting my post, blocking out my name, and attacking me behind
my back by calling me "our intrepid troll", you could have shown the decency of linking
back to my original post. Here it is, for those interested in the real discussion: 
&lt;p&gt;
&lt;a href="http://www.agilesoftwaredevelopment.com/blog/jurgenappelo/professionalism-knowledge-first"&gt;http://www.agilesoftwaredevelopment.com/blog/jurgenappelo/professionalism-knowledge-first&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Well, frankly, I didn't get your post from your blog, I got it from an email 'zine
(as indicated by the comment "This crossed my Inbox..."), and I didn't really think
that anybody would have any difficulty tracking down where it came from, at least
in terms of the email blast that put it into my Inbox. Coupled with the fact that,
quite honestly, I don't generally make a practice of using peoples' names without
their permission (and my email to the author asking if I could quote the post with
his name attached generated no response), so I blocked out the name. Having said that,
I'm pleased to offer full credit as to its source. &lt;blockquote&gt; 
&lt;p&gt;
Now, let's review some of your remarks: 
&lt;p&gt;
"COBOL is (at least) twenty years old, so therefore any use of COBOL must clearly
be as idiotic." 
&lt;p&gt;
I never talked about COBOL, or any other programming language. I was talking about
old practices that are nowadays considered harmful and seriously damaging. (Like practising
waterfall project management, instead of agile project management.) I don't see how
programming in COBOL could seriously damage a business. Why do you compare COBOL with
lobotomies? I don't understand. I couldn't care less about programming languages.
I care about management practices.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Frankly, the distinction isn't very clear in your post, and even more frankly, to
draw a distinction here is a bit specious. "I didn't mean we should throw away the &lt;em&gt;good&lt;/em&gt; stuff
that's twenty years old, only the &lt;em&gt;bad&lt;/em&gt; stuff!" doesn't seem much like a defense
to me. There are cases where waterfall style development is &lt;em&gt;exactly&lt;/em&gt; the right
thing to do a more agile approach is &lt;em&gt;exactly&lt;/em&gt; the wrong thing to do--the difference,
as I'm fond of saying, lies entirely in the context of the problem. Analogously, there
are cases where keeping an existing COBOL system up and running is the wrong thing
to do, and replacing it with a new system is the right thing to do. It all depends
on context, and for that reason, any dogmatic suggestion otherwise is flawed. &lt;blockquote&gt; 
&lt;p&gt;
"How can a developer honestly claim to know "what it can be good for", without some
kind of experience to back it?" 
&lt;p&gt;
I'm talking about gaining knowledge from the experience of others. If I hear 10 experts
advising the same best practice, then I still don't have any experience in that best
practice. I only have knowledge about it. That's how you can apply your knowledge
without your experience.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Leaving aside the notion that there is no such thing as best practices (another favorite
rant of mine), what you're suggesting is that you, the individual, don't necessarily
have to have experience in the topic but others have to, before we can put faith into
it. That's a very different scenario than saying "We don't need no stinkin' experience",
and is still vastly more dangerous than saying, "I have used this, it works." I (and
lots of IT shops, I've found) will vastly prefer the latter to the former. &lt;blockquote&gt; 
&lt;p&gt;
"Knowledge, apparently, isn't enough--experience still matters" 
&lt;p&gt;
Yes, I never said experience doesn't matter. I only said it has no value when you
don't have gained the appropriate knowledge (from other sources) on when to apply
it, and when not.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
You said it when you offered up the title, "Knowledge, not Experience". &lt;blockquote&gt; 
&lt;p&gt;
"buried under all the ludicrous hyperbole, he has a point" 
&lt;p&gt;
Thanks for agreeing with me.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
You're welcome! :-) Seriously, I think I understand better what you were trying to
say, and it's not the horrendously dangerous comments that I thought you were saying,
so I will apologize here and now for believing you to be a wet-behind-the-ears/lets-let-technology-solve-all-our-problems/dangerous-to-the-extreme
developer that I've run across far too often, particularly in startups. So, please,
will you accept my apology? &lt;blockquote&gt; 
&lt;p&gt;
"developers, like medical professionals, must ensure they are on top of their game
and spend some time investing in themselves and their knowledge portfolio" 
&lt;p&gt;
Exactly.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Exactly. :-) &lt;blockquote&gt; 
&lt;p&gt;
"this doesn't mean that everything you learn is immediately applicable, or even appropriate,
to the situation at hand" 
&lt;p&gt;
I never said that. You're putting words into my mouth. 
&lt;p&gt;
My only claim is that you need to KNOW both new and old practices and understand which
ones are good and which ones can be seriously damaging. I simply don't trust people
who are bragging about their experience. What if a manager tells me he's got 15 years
of experience managing developers? If he's a micro-manager I still don't want him.
Because micro-management is considered harmful these days. A manager should KNOW that.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Again, this was precisely the read I picked up out of the post, and my apologies for
the misinterpretation. But I stand by the idea that this is one of those posts that &lt;em&gt;could&lt;/em&gt; be
read in a highly dangerous fashion, and used to promote evil, in the form of "Well,
he runs a company, so therefore he must know what he's doing, and therefore having
any kind of experience isn't really necessary to use something new, so... see, Mr.
CEO boss-of-mine? We're safe! Now get out of my way and let me use Software Factories
to build our next-generation mission-critical core-of-the-company software system,
even though nobody's ever done it before." 
&lt;p&gt;
To speak to your example for a second, for example: Frankly, there are situations
where a micro-manager is a &lt;em&gt;good&lt;/em&gt; thing. Young, inexperienced developers, for
example, need more hand-holding and mentoring than older, more senior, more experienced
developers do (speaking stereotypically, of course). And, quite honestly, the guy
with 15 years managing developers is &lt;em&gt;far&lt;/em&gt; more likely to know how to manage
developers than the guy who's never managed developers before at all. The former is
the safer bet; not a guarantee, certainly, but often the safer bet, and that's sometimes
the best we can do in this industry. &lt;blockquote&gt; 
&lt;p&gt;
"And we definitely shouldn't look at anything older than five years ago and equate
it to lobotomies." 
&lt;p&gt;
I never said that either. Why do you claim that I said this? I don't have a problem
with old techniques. The daily standup meeting is a 80-year old best practice. It
was already used by pilots in the second world war. How could I be against that? It's
fine as it is.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Um... because you used the term "lobotomies" first? And because your title pretty
clearly implies the statement, perhaps? (And let's lose the term "best practice" entirely,
please? There is no such thing--not even the daily standup.) &lt;blockquote&gt; 
&lt;p&gt;
It's ok you didn't like my article. Sure it's meant to be provocative, and food for
thought. The article got twice as many positive votes than negative votes from DZone
readers. So I guess I'm adding value. But by taking the discussion away from its original
context (both physically and conceptually), and calling me names, you're not adding
any value for anyone.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I took it in exactly the context it was given--a DZone email blast. I can't help it
if it was taken out of context, because that's how it was handed to me. What's worse,
I can see a development team citing this as an "expert opinion" to their management
as a justification to try untested approaches or technologies, or as inspiration to
a young developer, who reads "knowledge, not experience", and thinks, "Wow, if I know
all the cutting-edge latest stuff, I don't need to have those 10 years of experience
to get that job as a senior application architect." If your article was aimed more
clearly at the development process side of things, then I would wish it had appeared
more clearly in the arena of development processes, and made it more clear that your
aim was to suggest that managers (who aren't real big on reading blogs anyway, I've
sadly found) should be a bit more pragmatic and open-minded about who they hire.
&lt;/p&gt;
&lt;p&gt;
Look, I understand the desire for a provocative title--for me, the author of "The
Vietnam of Computer Science", to cast stones at another author for choosing an eye-catching
title is so far beyond hypocrisy as to move into sheer wild-eyed audacity. But I have
seen, first-hand, how that article has been used to justify the most incredibly asinine
technology decisions, and it moves me now to say "Be careful what you wish for" when
choosing titles that meant to be provocative and food for thought. Sure, your piece
got more positive votes than negative ones. So too, in their day, did articles on
client-server, on CORBA, on Six-Sigma, on the necessity for big up-front design....
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Let me put it to you this way. Assume your child or your wife is sick, and as you
reach the hospital, the admittance nurse offers you a choice of the two doctors on
call. Who do you want more: the doctor who just graduated fresh from medical school
and knows all the latest in holistic and unconventional medicine, or the doctor with
30 years' experience and a solid track record of healthy patients?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c3ad9bf0-39cd-4985-981e-dabc0342dbf2" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,c3ad9bf0-39cd-4985-981e-dabc0342dbf2.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=7ea05023-cdc1-439d-910d-bcff5f4ff309</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,7ea05023-cdc1-439d-910d-bcff5f4ff309.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,7ea05023-cdc1-439d-910d-bcff5f4ff309.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7ea05023-cdc1-439d-910d-bcff5f4ff309</wfw:commentRss>
      <slash:comments>9</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently this little gem crossed my Inbox....
</p>
        <blockquote>
          <p>
            <strong>Professionalism = Knowledge First, Experience Last</strong>
            <br />
By J----- A-----
</p>
          <p>
            <br />
Do you trust a doctor with diagnosing your mental problems if the doctor tells you
he's got 20 years of experience? Do you still trust that doctor when he picks up his
tools, and asks you to prepare for a lobotomy?
</p>
          <p>
Would you still be impressed if the doctor had 20 years of experience in carrying
out lobotomies?
</p>
          <p>
I am always skeptic when people tell me they have X years of experience in a certain
field or discipline, like "5 years of experience as a .NET developer", "8 years of
experience as a project manager" or "12 years of experience as a development manager".
It is as if people's professional levels need to be measured in years of practice.
</p>
          <p>
This, of course, is nonsense.
</p>
          <p>
            <strong>Professionalism is measured by what you are going to do <em>now</em>...</strong>
          </p>
          <p>
Are you going to use some discredited technique from half a century ago?<br />
•    Are you, as a .NET developer, going to use Response.Write, because
you've got 5 years of experience doing exactly that?<br />
•    Are you, as a project manager, going to create Gantt charts, because
that's what you've been doing for 8 years?<br />
•    Are you, as a development manager, going to micro-manage your
team members, as you did in the 12 years before now?
</p>
          <p>
If so, allow me to illustrate the value of your experience...
</p>
          <p>
(Photo of "Zero" signs)
</p>
          <p>
Here's an example of what it means to be a professional:
</p>
          <p>
There's a concept called Kanban making headlines these days in some parts of the agile
community. I honestly and proudly admit that I have no experience at all in applying
Kanban. But that's just a minor inconvenience. Because I have attained the knowledge
of what it is and what it can be good for. And now there are some planning issues
in our organization for which this Kanban-stuff might be the perfect solution. I'm
sure we're going to give it a shot, in a controlled setting, with time allocated for
a pilot and proper evaluations afterwards. That's the way a professional tries to
solve a problem.
</p>
          <p>
            <strong>Professionals don't match problems with their experiences. They match them
with their knowledge.</strong>
          </p>
          <p>
Sure, experience is useful. But only when you already have the knowledge in place.
Experience has no value when there's no knowledge to verify that you are applying
the right experience.
</p>
          <p>
            <strong>Knowledge Comes First, Experience Comes Last</strong>
          </p>
          <p>
This is my message to anyone who wants to be a professional software developer, a
professional project manager, or a professional development manager. 
</p>
          <p>
You must gain and apply knowledge first, and experience will help you after that.
Professionals need to know about the latest developments and techniques. 
</p>
          <p>
They certainly don't bother measuring years of experience.
</p>
          <p>
Are you still practicing lobotomies?
</p>
        </blockquote>
        <p>
Um....
</p>
        <p>
Wow.
</p>
        <p>
Let's start with the logical fallacy in the first section. Do I trust a doctor with
diagnosing my mental problems if he tells me he's got 20 years of experience? Generally,
yes, unless I have reasons to doubt this. If the guy picks up a skull-drill and starts
looking for a place to start boring into my skull, sure, I'll start to question his
judgement.... But what does this have to do with anything? I wouldn't trust the guy
if he picked up a chainsaw and started firing <em>it</em> up, either.
</p>
        <p>
Look, I get the analogy: "Doctor has 20 years of experience using outdated skills",
har har. Very funny, very memorable, and totally inappropriate metaphor for the situation.
To stand here and suggest that developers who aren't using the latest-and-greatest,
so-bleeding-edge-even-saying-the-name-cuts-your-skin tools or languages or technologies
are somehow practicing lobotomies (which, by the way, are still a recommended practice
in certain mental disorder cases, I understand) in order to solve any and all mental-health
issues, is a gross mischaracterization--and the worst form of negligence--I've ever
heard suggested.
</p>
        <p>
And it comes as no surprise that it's coming from the CIO of a consulting company.
(Note to self: here's one more company I don't want anywhere <em>near </em>my clients'
IT infrastructure.)
</p>
        <p>
Let's take this analogy to its logical next step, shall we?
</p>
        <p>
COBOL is (at least) twenty years old, so therefore any use of COBOL must <em>clearly</em> be
as idiotic as drilling holes in your skull to let the demons out. So any company currently
using COBOL has no real option other than to immediately upgrade <em>all</em> of their
currently-running COBOL infrastructure (despite the fact that it's tested, works,
and cashes most of the US banking industry's checks on a daily basis) with something
vastly superior and totally untested (since we don't need experience, just knowlege),
like... oh, I dunno.... how about Ruby? Oh, no, wait, that's at least 10 years old.
Ditto for Java. And let's not even <em>think</em> about C, Perl, Python....
</p>
        <p>
I know; let's rewrite the entire financial industry's core backbone in Groovy, since
it's only, what, 6 years old at this point? I mean, sure, we'll have to do all this
over again in just four years, since that's when Groovy will turn 10 and thus obviously
begin it's long slide into mediocrity, alongside the "four humors" of medicine and
Aristotle's (completely inaccurate) anatomical depictions, but hey, that's progress,
right? Forget experience, it has <em>no value</em> compared to the "knowledge" that
comes from reading the documentation on a brand-new language, tool, library, or platform....
</p>
        <p>
What I find most appalling is this part right here:
</p>
        <blockquote>
          <p>
I honestly and proudly admit that I have no experience at all in applying Kanban. <em>But
that's just a minor inconvenience. Because I have attained the knowledge of what it
is and what it can be good for.</em></p>
        </blockquote>
        <p>
How can a developer honestly claim to <em>know</em> "what it can be good for", without
some kind of experience to back it? (Hell, I'll even accept that you have familiarity
and experience with something vaguely <em>relating</em> to the thing at hand, if you've
got it--after all, experience in Java makes you a pretty damn good C# developer, in
my mind, and vice versa.) 
</p>
        <p>
And, to make things even <em>more</em> interesting, our intrepid troll, having established
the attention-gathering headline, then proceeds to step away from the chasm, by backing
away from this "knowledge-not-experience" position in the same paragraph, just one
sentence later:
</p>
        <blockquote>
          <p>
I'm sure we're going to give it a shot, in a controlled setting, with time allocated
for a pilot and proper evaluations afterwards.
</p>
        </blockquote>
        <p>
Ah... In other words, he and his company are going to experiment with this new technique,
"in a controlled setting, with time allocated for a pilot and proper evaluations afterwards",
in order to gain <em>experience</em> with the technique and see how it works and how
it doesn't. 
</p>
        <p>
In other words....
</p>
        <p>
.... experience matters. 
</p>
        <p>
Knowledge, apparently, isn't enough--experience still matters, and it matters a lot
earlier than his "knowledge first, experience last" mantra seems to imply. Otherwise,
once you "know" something, why not apply it immediately to your mission-critical core?
</p>
        <p>
At the end of the day, buried under all the ludicrous hyperbole, he has a point: developers,
like medical professionals, must ensure they are on top of their game and spend some
time investing in themselves and their knowledge portfolio. Jay Zimmerman takes great
pains to point this out at every No Fluff Just Stuff show, and he's right: those who
spend the time to invest in their own knowledge portfolio, find themselves the last
to be fired and the first to be hired. But this doesn't mean that everything you learn
is immediately applicable, or even appropriate, to the situation at hand. Just because
you learned Groovy last weekend in Austin doesn't mean you have the right--or the
responsibility--to immediately start slipping Groovy in to the production servers.
Groovy has its share of good things, yes, but it's got its share of negative consequences,
too, and you'd better <em>damn</em> well know what they are before you start betting
the company's future on it. (No, I will not tell you what those negative consequences
are--that's <em>your</em> job, because what if it turns out I'm wrong, or they don't
apply to your particular situation?) <em>Every</em> technology, language, library
or tool has a positive/negative profile to it, and if you can't point out the pros
as well as the cons, then you don't understand the technology and you have <em>no</em> business
using it on anything except maybe a prototype that never leaves your local hard disk.
Too many projects were built with "flavor-of-the-year" tools and technologies, and
a few years later, long after the original "bleeding-edge" developer has gone on to
do a new project with a new "bleeding-edge" technology, the IT guys left to admin
and upkeep the project are struggling to find ways to keep this thing afloat.
</p>
        <p>
If you're languishing at a company that seems to resist anything and everything new,
try this exercise on: go down to the IT guys, and <em>ask</em> them why they resist.
Ask them to show you a data flow diagram of how information feeds from one system
to another (assuming they even have one). Ask them how many different operating systems
they have, how many different languages were used to create the various software programs
currently running, what tools they have to know when one of those programs fails,
and how many different data formats are currently in use. Then go find the guys currently
maintaining and updating and bug-fixing those current programs, and ask to see the
code. Figure out how long it would take you to rewrite the whole thing, and keep the
company in business while you're at it.
</p>
        <p>
There is a reason "legacy code" exists, and while we shouldn't be afraid to replace
it, we shouldn't be cavalier about tossing it out, either.
</p>
        <p>
And we <em>definitely</em> shouldn't look at anything older than five years ago and
equate it to lobotomies. COBOL had some good ideas that still echo through the industry
today, and Groovy and Scala and Ruby and F# undoubtedly have some buried mines that
we will, with benefit of ten years' hindsight, look back at in 2018 and say, "Wow,
how dumb were we to think that this was the last language we'd ever have to use!".
</p>
        <p>
That's experience talking. 
</p>
        <p>
And the funny thing is, it seems to have served us pretty well. When we don't listen
to the guys claiming to know how to use something effectively that they've never actually
used before, of course.
</p>
        <p>
          <em>Caveat emptor.</em>
        </p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=7ea05023-cdc1-439d-910d-bcff5f4ff309" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>From the &amp;quot;You Must Be Trolling for Hits&amp;quot; Department...</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,7ea05023-cdc1-439d-910d-bcff5f4ff309.aspx</guid>
      <link>http://blogs.tedneward.com/2008/07/24/From+The+QuotYou+Must+Be+Trolling+For+Hitsquot+Department.aspx</link>
      <pubDate>Thu, 24 Jul 2008 07:53:02 GMT</pubDate>
      <description>&lt;p&gt;
Recently this little gem crossed my Inbox....
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Professionalism = Knowledge First, Experience Last&lt;/strong&gt;
&lt;br&gt;
By J----- A-----
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Do you trust a doctor with diagnosing your mental problems if the doctor tells you
he's got 20 years of experience? Do you still trust that doctor when he picks up his
tools, and asks you to prepare for a lobotomy?
&lt;/p&gt;
&lt;p&gt;
Would you still be impressed if the doctor had 20 years of experience in carrying
out lobotomies?
&lt;/p&gt;
&lt;p&gt;
I am always skeptic when people tell me they have X years of experience in a certain
field or discipline, like "5 years of experience as a .NET developer", "8 years of
experience as a project manager" or "12 years of experience as a development manager".
It is as if people's professional levels need to be measured in years of practice.
&lt;/p&gt;
&lt;p&gt;
This, of course, is nonsense.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Professionalism is measured by what you are going to do &lt;em&gt;now&lt;/em&gt;...&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Are you going to use some discredited technique from half a century ago?&lt;br&gt;
•&amp;nbsp;&amp;nbsp;&amp;nbsp; Are you, as a .NET developer, going to use Response.Write, because
you've got 5 years of experience doing exactly that?&lt;br&gt;
•&amp;nbsp;&amp;nbsp;&amp;nbsp; Are you, as a project manager, going to create Gantt charts, because
that's what you've been doing for 8 years?&lt;br&gt;
•&amp;nbsp;&amp;nbsp;&amp;nbsp; Are you, as a development manager, going to micro-manage your
team members, as you did in the 12 years before now?
&lt;/p&gt;
&lt;p&gt;
If so, allow me to illustrate the value of your experience...
&lt;/p&gt;
&lt;p&gt;
(Photo of "Zero" signs)
&lt;/p&gt;
&lt;p&gt;
Here's an example of what it means to be a professional:
&lt;/p&gt;
&lt;p&gt;
There's a concept called Kanban making headlines these days in some parts of the agile
community. I honestly and proudly admit that I have no experience at all in applying
Kanban. But that's just a minor inconvenience. Because I have attained the knowledge
of what it is and what it can be good for. And now there are some planning issues
in our organization for which this Kanban-stuff might be the perfect solution. I'm
sure we're going to give it a shot, in a controlled setting, with time allocated for
a pilot and proper evaluations afterwards. That's the way a professional tries to
solve a problem.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Professionals don't match problems with their experiences. They match them
with their knowledge.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Sure, experience is useful. But only when you already have the knowledge in place.
Experience has no value when there's no knowledge to verify that you are applying
the right experience.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Knowledge Comes First, Experience Comes Last&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
This is my message to anyone who wants to be a professional software developer, a
professional project manager, or a professional development manager. 
&lt;/p&gt;
&lt;p&gt;
You must gain and apply knowledge first, and experience will help you after that.
Professionals need to know about the latest developments and techniques. 
&lt;/p&gt;
&lt;p&gt;
They certainly don't bother measuring years of experience.
&lt;/p&gt;
&lt;p&gt;
Are you still practicing lobotomies?
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Um....
&lt;/p&gt;
&lt;p&gt;
Wow.
&lt;/p&gt;
&lt;p&gt;
Let's start with the logical fallacy in the first section. Do I trust a doctor with
diagnosing my mental problems if he tells me he's got 20 years of experience? Generally,
yes, unless I have reasons to doubt this. If the guy picks up a skull-drill and starts
looking for a place to start boring into my skull, sure, I'll start to question his
judgement.... But what does this have to do with anything? I wouldn't trust the guy
if he picked up a chainsaw and started firing &lt;em&gt;it&lt;/em&gt; up, either.
&lt;/p&gt;
&lt;p&gt;
Look, I get the analogy: "Doctor has 20 years of experience using outdated skills",
har har. Very funny, very memorable, and totally inappropriate metaphor for the situation.
To stand here and suggest that developers who aren't using the latest-and-greatest,
so-bleeding-edge-even-saying-the-name-cuts-your-skin tools or languages or technologies
are somehow practicing lobotomies (which, by the way, are still a recommended practice
in certain mental disorder cases, I understand) in order to solve any and all mental-health
issues, is a gross mischaracterization--and the worst form of negligence--I've ever
heard suggested.
&lt;/p&gt;
&lt;p&gt;
And it comes as no surprise that it's coming from the CIO of a consulting company.
(Note to self: here's one more company I don't want anywhere &lt;em&gt;near &lt;/em&gt;my clients'
IT infrastructure.)
&lt;/p&gt;
&lt;p&gt;
Let's take this analogy to its logical next step, shall we?
&lt;/p&gt;
&lt;p&gt;
COBOL is (at least) twenty years old, so therefore any use of COBOL must &lt;em&gt;clearly&lt;/em&gt; be
as idiotic as drilling holes in your skull to let the demons out. So any company currently
using COBOL has no real option other than to immediately upgrade &lt;em&gt;all&lt;/em&gt; of their
currently-running COBOL infrastructure (despite the fact that it's tested, works,
and cashes most of the US banking industry's checks on a daily basis) with something
vastly superior and totally untested (since we don't need experience, just knowlege),
like... oh, I dunno.... how about Ruby? Oh, no, wait, that's at least 10 years old.
Ditto for Java. And let's not even &lt;em&gt;think&lt;/em&gt; about C, Perl, Python....
&lt;/p&gt;
&lt;p&gt;
I know; let's rewrite the entire financial industry's core backbone in Groovy, since
it's only, what, 6 years old at this point? I mean, sure, we'll have to do all this
over again in just four years, since that's when Groovy will turn 10 and thus obviously
begin it's long slide into mediocrity, alongside the "four humors" of medicine and
Aristotle's (completely inaccurate) anatomical depictions, but hey, that's progress,
right? Forget experience, it has &lt;em&gt;no value&lt;/em&gt; compared to the "knowledge" that
comes from reading the documentation on a brand-new language, tool, library, or platform....
&lt;/p&gt;
&lt;p&gt;
What I find most appalling is this part right here:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I honestly and proudly admit that I have no experience at all in applying Kanban. &lt;em&gt;But
that's just a minor inconvenience. Because I have attained the knowledge of what it
is and what it can be good for.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
How can a developer honestly claim to &lt;em&gt;know&lt;/em&gt; "what it can be good for", without
some kind of experience to back it? (Hell, I'll even accept that you have familiarity
and experience with something vaguely &lt;em&gt;relating&lt;/em&gt; to the thing at hand, if you've
got it--after all, experience in Java makes you a pretty damn good C# developer, in
my mind, and vice versa.) 
&lt;/p&gt;
&lt;p&gt;
And, to make things even &lt;em&gt;more&lt;/em&gt; interesting, our intrepid troll, having established
the attention-gathering headline, then proceeds to step away from the chasm, by backing
away from this "knowledge-not-experience" position in the same paragraph, just one
sentence later:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I'm sure we're going to give it a shot, in a controlled setting, with time allocated
for a pilot and proper evaluations afterwards.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Ah... In other words, he and his company are going to experiment with this new technique,
"in a controlled setting, with time allocated for a pilot and proper evaluations afterwards",
in order to gain &lt;em&gt;experience&lt;/em&gt; with the technique and see how it works and how
it doesn't. 
&lt;/p&gt;
&lt;p&gt;
In other words....
&lt;/p&gt;
&lt;p&gt;
.... experience matters. 
&lt;/p&gt;
&lt;p&gt;
Knowledge, apparently, isn't enough--experience still matters, and it matters a lot
earlier than his "knowledge first, experience last" mantra seems to imply. Otherwise,
once you "know" something, why not apply it immediately to your mission-critical core?
&lt;/p&gt;
&lt;p&gt;
At the end of the day, buried under all the ludicrous hyperbole, he has a point: developers,
like medical professionals, must ensure they are on top of their game and spend some
time investing in themselves and their knowledge portfolio. Jay Zimmerman takes great
pains to point this out at every No Fluff Just Stuff show, and he's right: those who
spend the time to invest in their own knowledge portfolio, find themselves the last
to be fired and the first to be hired. But this doesn't mean that everything you learn
is immediately applicable, or even appropriate, to the situation at hand. Just because
you learned Groovy last weekend in Austin doesn't mean you have the right--or the
responsibility--to immediately start slipping Groovy in to the production servers.
Groovy has its share of good things, yes, but it's got its share of negative consequences,
too, and you'd better &lt;em&gt;damn&lt;/em&gt; well know what they are before you start betting
the company's future on it. (No, I will not tell you what those negative consequences
are--that's &lt;em&gt;your&lt;/em&gt; job, because what if it turns out I'm wrong, or they don't
apply to your particular situation?) &lt;em&gt;Every&lt;/em&gt; technology, language, library
or tool has a positive/negative profile to it, and if you can't point out the pros
as well as the cons, then you don't understand the technology and you have &lt;em&gt;no&lt;/em&gt; business
using it on anything except maybe a prototype that never leaves your local hard disk.
Too many projects were built with "flavor-of-the-year" tools and technologies, and
a few years later, long after the original "bleeding-edge" developer has gone on to
do a new project with a new "bleeding-edge" technology, the IT guys left to admin
and upkeep the project are struggling to find ways to keep this thing afloat.
&lt;/p&gt;
&lt;p&gt;
If you're languishing at a company that seems to resist anything and everything new,
try this exercise on: go down to the IT guys, and &lt;em&gt;ask&lt;/em&gt; them why they resist.
Ask them to show you a data flow diagram of how information feeds from one system
to another (assuming they even have one). Ask them how many different operating systems
they have, how many different languages were used to create the various software programs
currently running, what tools they have to know when one of those programs fails,
and how many different data formats are currently in use. Then go find the guys currently
maintaining and updating and bug-fixing those current programs, and ask to see the
code. Figure out how long it would take you to rewrite the whole thing, and keep the
company in business while you're at it.
&lt;/p&gt;
&lt;p&gt;
There is a reason "legacy code" exists, and while we shouldn't be afraid to replace
it, we shouldn't be cavalier about tossing it out, either.
&lt;/p&gt;
&lt;p&gt;
And we &lt;em&gt;definitely&lt;/em&gt; shouldn't look at anything older than five years ago and
equate it to lobotomies. COBOL had some good ideas that still echo through the industry
today, and Groovy and Scala and Ruby and F# undoubtedly have some buried mines that
we will, with benefit of ten years' hindsight, look back at in 2018 and say, "Wow,
how dumb were we to think that this was the last language we'd ever have to use!".
&lt;/p&gt;
&lt;p&gt;
That's experience talking. 
&lt;/p&gt;
&lt;p&gt;
And the funny thing is, it seems to have served us pretty well. When we don't listen
to the guys claiming to know how to use something effectively that they've never actually
used before, of course.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Caveat emptor.&lt;/em&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=7ea05023-cdc1-439d-910d-bcff5f4ff309" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,7ea05023-cdc1-439d-910d-bcff5f4ff309.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=05f327f7-95ec-413f-8d41-74ad6c5a4e58</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,05f327f7-95ec-413f-8d41-74ad6c5a4e58.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,05f327f7-95ec-413f-8d41-74ad6c5a4e58.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=05f327f7-95ec-413f-8d41-74ad6c5a4e58</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The Pragmatic Programmer says, "Learn a new language every year". This is great advice,
not just because it puts new tools into your mental toolbox that you can pull out
on various occasions to get a job done, but also because it opens your mind to new
ideas and new concepts that will filter their way into your code even without explicit
language support. For example, suppose you've looked at (J/Iron)Ruby or Groovy, and
come to like the "internal iterator" approach as a way of simplifying moving across
a collection of objects in a uniform way; for political and cultural reasons, though,
you can't write code in anything but Java. You're frustrated, because local anonymous
functions (also commonly--and, I think, mistakenly--called <em>closures</em>) are
not a first-class concept in Java. Then, you later look at Haskell/ML/Scala/F#, which
makes heavy use of what Java programmers would call "static methods" to carry out
operations, and realize that this could, in fact, be adapted to Java to give you the
"internal iteration" concept over the Java Collections:
</p>
        <div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum1" style="color: #606060"> 1:</span>
              <span style="color: #0000ff">package</span> com.tedneward.util;</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum2" style="color: #606060"> 2:</span>  </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum3" style="color: #606060"> 3:</span>
              <span style="color: #0000ff">import</span> java.util.*;</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum4" style="color: #606060"> 4:</span>  </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum5" style="color: #606060"> 5:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">interface</span> Acceptor</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum6" style="color: #606060"> 6:</span> {</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum7" style="color: #606060"> 7:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">void</span> each(Object
obj);</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum8" style="color: #606060"> 8:</span> }</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum9" style="color: #606060"> 9:</span>  </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum10" style="color: #606060"> 10:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">class</span> Collection</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum11" style="color: #606060"> 11:</span> {</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum12" style="color: #606060"> 12:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> each(List
list, Acceptor acc)</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum13" style="color: #606060"> 13:</span> {</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum14" style="color: #606060"> 14:</span>
              <span style="color: #0000ff">for</span> (Object
o : list)</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum15" style="color: #606060"> 15:</span> acc.each(o);</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum16" style="color: #606060"> 16:</span> }</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum17" style="color: #606060"> 17:</span> }</pre>
            <!--CRLF-->
          </div>
        </div>
        <p>
Where using it would look like this:
</p>
        <div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum1" style="color: #606060"> 1:</span>
              <span style="color: #0000ff">import</span> com.tedneward.util.*;</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum2" style="color: #606060"> 2:</span>  </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum3" style="color: #606060"> 3:</span> List
personList = ...;</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum4" style="color: #606060"> 4:</span> Collection.each(<span style="color: #0000ff">new</span> Accpetor()
{</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum5" style="color: #606060"> 5:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">void</span> each(Object
person) {</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum6" style="color: #606060"> 6:</span> System.out.println(<span style="color: #006080">"Found
person "</span> + person + <span style="color: #006080">", isn't that nice?"</span>);</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum7" style="color: #606060"> 7:</span> }</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum8" style="color: #606060"> 8:</span> });</pre>
            <!--CRLF-->
          </div>
        </div>
        <p>
Is it <em>quite</em> as nice or as clean as using it from a language that has first-class
support for anonymous local functions? No, but slowly migrating over to this style
has a couple of definitive effects, most notably that you will start grooming the
rest of your team (who may be reluctant to pick up these new languages) towards the
new ideas that will be present in Groovy, and when they finally do see them (as they
will, eventually, unless they hide under rocks on a daily basis), they will realize
what's going on here that much more quickly, and start adding their voices to the
call to start using (J/Iron)Ruby/Groovy for certain things in the codebase you support.
</p>
        <p>
(By the way, this is <em>so</em> much easier to do in C# 2.0, thanks to generics,
static classes and anonymous delegates...
</p>
        <div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum1" style="color: #606060"> 1:</span>
              <span style="color: #0000ff">namespace</span> TedNeward.Util</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum2" style="color: #606060"> 2:</span> {</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum3" style="color: #606060"> 3:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">delegate</span>
              <span style="color: #0000ff">void</span> EachProc&lt;T&gt;(T
obj);</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum4" style="color: #606060"> 4:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">class</span> Collection</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum5" style="color: #606060"> 5:</span> {</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum6" style="color: #606060"> 6:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> each(ArrayList
list, EachProc proc)</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum7" style="color: #606060"> 7:</span> {</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum8" style="color: #606060"> 8:</span>
              <span style="color: #0000ff">foreach</span> (Object
o <span style="color: #0000ff">in</span> list)</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum9" style="color: #606060"> 9:</span> proc(o);</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum10" style="color: #606060"> 10:</span> }</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum11" style="color: #606060"> 11:</span> }</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum12" style="color: #606060"> 12:</span> }</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum13" style="color: #606060"> 13:</span>  </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum14" style="color: #606060"> 14:</span>
              <span style="color: #008000">//
...</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum15" style="color: #606060"> 15:</span>  </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum16" style="color: #606060"> 16:</span> ArrayList
personList = ...;</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum17" style="color: #606060"> 17:</span> Collection.each(list, <span style="color: #0000ff">delegate</span>(Object
person) {</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum18" style="color: #606060"> 18:</span> System.Console.WriteLine(<span style="color: #006080">"Found
"</span> + person + <span style="color: #006080">", isn't that nice?"</span>);</pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum19" style="color: #606060"> 19:</span> });</pre>
            <!--CRLF-->
          </div>
        </div>
        <p>
... though the collection classes in the .NET FCL are nowhere near as nicely designed
as those in the Java Collections library, IMHO. C# programmers take note: spend at
least a week studying the Java Collections API.)
</p>
        <p>
 
</p>
        <p>
This, then, opens the much harder question of, "Which language?" Without trying to
infer any sort of order or importance, here's a list of languages to consider, with
URLs where applicable; I invite your own suggestions, by the way, as I'm sure there's
a lot of languages I <em>don't</em> know about, and quite frankly, would love to.
The "current hotness" is to learn the languages marked in <strong>bold</strong>, so
if you want to be daring and different, try one of those that isn't. (I've provided
some links, but honestly it's kind of tiring to put all of them in; just remember
that Google is your friend, and you should be OK. :-) )
</p>
        <ul>
          <li>
Visual Basic. Yes, as in Visual Basic--if you haven't played with dynamic languages
before, try turning "Option Strict Off", write some code, and see how interacting
with the .NET FCL suddenly changes into a duck-typed scenario. If you're really curious,
have a look at the generated code in Reflector or ILDasm, and notice how the generated
code looks a lot like the generated JVM code from other dynamic languages on an execution
environment, a la Groovy. 
</li>
          <li>
            <a href="http://www.ruby-lang.org/en/">Ruby</a> (<a href="http://jruby.codehaus.org/">JRuby</a>, <a href="http://www.ironruby.net/">IronRuby</a>): 
</li>
          <li>
            <strong>
              <a href="http://groovy.codehaus.org">Groovy</a>
            </strong>: Some call this "javac
2.0"; I'm not sure it merits <em>that</em> title, or the assumption of the mantle
of "King of the JVM" that would seem to go with that title, but the fact is, Groovy's
a useful language. 
</li>
          <li>
            <strong>
              <a href="http://www.scala-lang.org">Scala</a>
            </strong>: A "SCAlable LAnguage"
for the JVM (and CLR, though that feature has been left to the community to support),
incorporating both object-oriented and functional concepts, plus a few new ideas,
into a single package. I'm obviously bullish on Scala, given the talks and articles
I've done on it. 
</li>
          <li>
            <strong>F#</strong>: Originally OCaml-on-the-CLR, now F# is starting to take on a
personality of its own as Microsoft productizes it. Like Scala and Erlang, F# will
be immediately applicable in concurrency scenarios, I think. I'm obviously bullish
on F#, given the talks, articles, and book I'm doing on it. 
</li>
          <li>
            <strong>Erlang</strong>: Functional language with a strong emphasis on parallel processing,
scalability, and concurrency. 
</li>
          <li>
Perl: People will perhaps be surprised I say this, given my public dislike of Perl's
syntax, but I think every programmer should learn Perl, and decide for themselves
what's right and what's wrong about Perl. Besides, there's clearly no argument that
Perl is one of the power tools in every *nix sysadmin's toolbox. 
</li>
          <li>
Python: Again, given my dislike of Python's significant whitespace, my suggestion
to learn it here may surprise some, but Python seems to be stepping into Perl's shoes
as the sysadmin language tool of choice, and frankly, lots of people <em>like</em> the
significant whitespace, since that's how they format their code anyway. 
</li>
          <li>
C++: The grandaddy of them all, in some ways; if you've never looked at C++ before,
you should, particularly what they're doing with templates in the Boost library. As
Scott Meyers once put it, "We're a long way from Stack&lt;T&gt;!" 
</li>
          <li>
            <a href="http://www.digitalmars.com/d/">D</a>: Walter Bright's native-compiling garbage-collected
successor to C++/Java/C#. 
</li>
          <li>
            <a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html">Objective-C</a> (part
of gcc): Great "other" object-oriented C-based language that never gathered the kind
of attention C++ did, yet ended up making its mark on the industry thanks to Steve
Jobs' love of the language and its incorporation into the NeXT (and later, Mac OS
X) toolchain. Obj-C is a message-passing object language, which has some interesting
implications in its own right. 
</li>
          <li>
Common Lisp (<a href="http://www.sbcl.org/">Steel Bank Common Lisp</a>): What happens
when you create a language that holds as a core principle that the language should
hold no clear delineation between "code" and "data"? Or that the syntactic expression
of the language should be accessible from within that langauge? You get Lisp, and
if you're not sure what I'm talking about, pick up a Lisp or a Scheme implementation
and start experimenting. 
</li>
          <li>
Scheme (<a href="http://www.plt-scheme.org/">PLT Scheme</a>, <a href="http://sisc-scheme.org/">SISC</a>):
Scheme is one of the earliest dialects of Lisp, and much of the same syntactic flexibility
and power of Lisp is in Scheme, as well. While the syntaxes are usually not directly
interchangeable, they're close enough that learning one is usually enough. 
</li>
          <li>
            <a href="http://clojure.org">Clojure</a>: Rich Hickey (who also built "dotLisp" for
the CLR) has done an amazing job of bringing Lisp to the JVM, including a few new
ideas, such as some functional concepts and an implementation of software transactional
memory, among other things. 
</li>
          <li>
            <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">ECMAScript</a> (<a href="http://www.ecma-international.org/publications/standards/Ecma-357.htm">E4X</a>, <a href="http://www.mozilla.org/rhino/">Rhino</a>, <a href="http://www.ecmascript.org/">ES4</a>):
If you've never looking at JavaScript <em>outside</em> of the browser, you're in for
a surprise--as <a href="http://www.vanderburg.org/Blog">Glenn Vanderburg</a> put it
during one of his NFJS talks, "There's a real programming language in there!". I'm
particularly fond of E4X, which integrates XML as a native primitive type, and the
Rhino implementation fully supports it, which makes it attractive to use as an XML
services implementation language. 
</li>
          <li>
Haskell (<a href="http://jaskell.codehaus.org">Jaskell</a>): One of the original functional
languages. Learning this will give a programmer a leg up on the functional concepts
that are creeping into other environments. Jaskell is an implementation of Haskell
on the JVM, and they've taken the concept of functional further, creating a build
system ("Neptune") on top of Jaskell + Ant, to yield a syntax that's... well... more
Haskellian... for building Java projects. (Whether it's better/cleaner than Ant is
debatable, but it certainly makes clear the functional nature of build scripts.) 
</li>
          <li>
ML: Another of the original functional languages. Probably don't need to learn this
if you learn Haskell, but hey, it can't hurt. 
</li>
          <li>
            <a href="http://www.heron-language.com/">Heron</a>: Heron is interesting because it
looks to take on more of the modeling aspects of programming directly into the language,
such as state transitions, which is definitely a novel idea. I'm eagerly looking forward
to future drops. (I'm not so interested in the graphical design mode, or the idea
of "executable UML", but I think there's a vein of interesting ideas here that could
be mined for other languages that aren't quite so lofty in scope.) 
</li>
          <li>
HaXe: A functional language that compiles to three different target platforms: its
own (Neko), Flash, and/or Javascript (for use in Web DOMs). 
</li>
          <li>
            <a href="http://labs.businessobjects.com/cal/">CAL</a>: A JVM-based statically-typed
language from the folks who bring you Crystal Reports. 
</li>
          <li>
            <a href="http://www.erights.org/">E</a>: An interesting tack on distributed systems
and security. Not sure if it's production-ready, but it's definitely an eye-opener
to look at. 
</li>
          <li>
            <a href="http://www.swi-prolog.org/">Prolog</a>: A language built around the idea
of logic and logical inference. Would love to see this in play as a "rules engine"
in a production system. 
</li>
          <li>
            <a href="http://nemerle.org/Main_Page">Nemerle</a>: A CLR-based language with functional
syntax and semantics, and semantic macros, similar to what we see in Lisp/Scheme. 
</li>
          <li>
            <a href="http://nice.sourceforge.net/language.html">Nice</a>: A JVM-based language
that permits multi-dispatch methods, sometimes known as multimethods. 
</li>
          <li>
OCaml: An object-functional fusion that was the immediate predecessor of F#. The HaXe
and MTASC compilers are both built in OCaml, and frankly, it's in a startlingly small
number of lines of code, highlighting how appropriate functional languages are for
building compilers and interpreters. 
</li>
          <li>
Smalltalk (<a href="http://www.squeak.org">Squeak</a>, VisualWorks, Strongtalk): Smalltalk
was widely-known as "the O-O language that all the C guys turned to in order to learn
how to build object-oriented programs", but very few people at the time understood
that Smalltalk was wildly different because of its message-passing and loosely/un-typed
semantics. Now we know better (I hope). Have a look. 
</li>
          <li>
TCL (Jacl): Tool Command Language, a procedural scripting language that has some nice
embedding capabilities. I'd be curious to try putting a TCL-based language in the
hands of end users to see if it was a good DSL base. The Jacl implementation is built
on top of the JVM. 
</li>
          <li>
Forth: The original (near as I can tell) stack-based language, in which all execution
happens on an execution stack, not unlike what we see in the JVM or CLR. Given how
much Lisp has made out of the "atoms and lists" concept, I'm curious if Forth's stack-based
approach yields a similar payoff. 
</li>
          <li>
            <a href="http://www.lua.org">Lua</a>: Dynamically-typed language that lives to be
embedded; known for its biggest embedder's popularity: World of Warcraft, along with
several other games/game engines. A great demonstration of the power of embedding
a language into an engine/environment to allow users to create emergent behavior. 
</li>
          <li>
            <a href="http://www.fandev.org">Fan</a>: Another language that seeks to incorporate
both static and dynamic typing, running on top of both the JVM or the CLR. 
</li>
          <li>
            <a href="http://factorcode.org/links.fhtml">Factor</a>: I'm curious about Factor because
it's another stack-based language, with a lot of inspiration from some of the other
languages on this list. 
</li>
          <li>
            <a href="http://boo.codehaus.org/">Boo</a>: A Python-inspired CLR language that Ayende
likes for domain-specific languages. 
</li>
          <li>
            <a href="http://www.cobra-language.org">Cobra</a>: A Python-inspired language that
seeks to encompass <em>both</em> static <em>and</em> dynamic typing into one language.
Fascinating stuff. 
</li>
          <li>
            <a href="http://slate.tunes.org/">Slate</a>: A "prototype-based object-oriented programming
language based on Self, CLOS, and Smalltalk-80." Apparently on hold due to loss of
interest from the founder, last release was 0.3.5 in August of 2005. 
</li>
          <li>
            <a href="http://www.latrobe.edu.au/philosophy/phimvt/joy.html">Joy</a>: Factor's primary
inspiration, another stack-based language. 
</li>
          <li>
            <a href="http://mythago.net/language.html">Raven</a>: A scripting language that "rips
off" from Python, Forth, Perl, and the creator's own head. 
</li>
          <li>
            <a href="http://www.canonware.com/onyx/">Onyx</a>: "Onyx is a powerful stack-based,
multi-threaded, interpreted, general purpose programming language similar to PostScript.
It can be embedded as an extension language similarly to ficl (Forth), guile (scheme),
librep (lisp dialect), s-lang, Lua, and Tcl." 
</li>
          <li>
            <a href="http://lolcode.com/specs/1.2">LOLCode</a>: No, you won't use LOLcode on a
project any time soon, but LOLCode has had so many different implementations of it
built, it's a great practice tool towards building your own languages, a la DSLs.
LOLcode has all the basic components a language would use, so if you can build a parser,
AST and execution engine (either interpreter or compiler) for LOLcode, then you've
got the basic skills in place to build an external DSL.</li>
        </ul>
        <p>
There's more, of course, but hopefully there's something in this list to keep you
busy for a while. Remember to send me your favorite new-language links, and I'll add
them to the list as seems appropriate. 
</p>
        <p>
Happy hacking!
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=05f327f7-95ec-413f-8d41-74ad6c5a4e58" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Polyglot Plurality</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,05f327f7-95ec-413f-8d41-74ad6c5a4e58.aspx</guid>
      <link>http://blogs.tedneward.com/2008/07/03/Polyglot+Plurality.aspx</link>
      <pubDate>Thu, 03 Jul 2008 02:13:10 GMT</pubDate>
      <description>&lt;p&gt;
The Pragmatic Programmer says, "Learn a new language every year". This is great advice,
not just because it puts new tools into your mental toolbox that you can pull out
on various occasions to get a job done, but also because it opens your mind to new
ideas and new concepts that will filter their way into your code even without explicit
language support. For example, suppose you've looked at (J/Iron)Ruby or Groovy, and
come to like the "internal iterator" approach as a way of simplifying moving across
a collection of objects in a uniform way; for political and cultural reasons, though,
you can't write code in anything but Java. You're frustrated, because local anonymous
functions (also commonly--and, I think, mistakenly--called &lt;em&gt;closures&lt;/em&gt;) are
not a first-class concept in Java. Then, you later look at Haskell/ML/Scala/F#, which
makes heavy use of what Java programmers would call "static methods" to carry out
operations, and realize that this could, in fact, be adapted to Java to give you the
"internal iteration" concept over the Java Collections:
&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;package&lt;/span&gt; com.tedneward.util;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt; 2:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;import&lt;/span&gt; java.util.*;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt; 4:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt; 5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; Acceptor&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt; 6:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt; 7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; each(Object
obj);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt; 8:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum9" style="color: #606060"&gt; 9:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum10" style="color: #606060"&gt; 10:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Collection&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum11" style="color: #606060"&gt; 11:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum12" style="color: #606060"&gt; 12:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; each(List
list, Acceptor acc)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum13" style="color: #606060"&gt; 13:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum14" style="color: #606060"&gt; 14:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (Object
o : list)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum15" style="color: #606060"&gt; 15:&lt;/span&gt; acc.each(o);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum16" style="color: #606060"&gt; 16:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum17" style="color: #606060"&gt; 17:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Where using it would look like this:
&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;import&lt;/span&gt; com.tedneward.util.*;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt; 2:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt; 3:&lt;/span&gt; List
personList = ...;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt; 4:&lt;/span&gt; Collection.each(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Accpetor()
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt; 5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; each(Object
person) {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt; 6:&lt;/span&gt; System.out.println(&lt;span style="color: #006080"&gt;"Found
person "&lt;/span&gt; + person + &lt;span style="color: #006080"&gt;", isn't that nice?"&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt; 7:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt; 8:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Is it &lt;em&gt;quite&lt;/em&gt; as nice or as clean as using it from a language that has first-class
support for anonymous local functions? No, but slowly migrating over to this style
has a couple of definitive effects, most notably that you will start grooming the
rest of your team (who may be reluctant to pick up these new languages) towards the
new ideas that will be present in Groovy, and when they finally do see them (as they
will, eventually, unless they hide under rocks on a daily basis), they will realize
what's going on here that much more quickly, and start adding their voices to the
call to start using (J/Iron)Ruby/Groovy for certain things in the codebase you support.
&lt;/p&gt;
&lt;p&gt;
(By the way, this is &lt;em&gt;so&lt;/em&gt; much easier to do in C# 2.0, thanks to generics,
static classes and anonymous delegates...
&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; TedNeward.Util&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt; 2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; EachProc&amp;lt;T&amp;gt;(T
obj);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt; 4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Collection&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt; 5:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt; 6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; each(ArrayList
list, EachProc proc)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt; 7:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt; 8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (Object
o &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; list)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum9" style="color: #606060"&gt; 9:&lt;/span&gt; proc(o);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum10" style="color: #606060"&gt; 10:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum11" style="color: #606060"&gt; 11:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum12" style="color: #606060"&gt; 12:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum13" style="color: #606060"&gt; 13:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum14" style="color: #606060"&gt; 14:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
...&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum15" style="color: #606060"&gt; 15:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum16" style="color: #606060"&gt; 16:&lt;/span&gt; ArrayList
personList = ...;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum17" style="color: #606060"&gt; 17:&lt;/span&gt; Collection.each(list, &lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;(Object
person) {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum18" style="color: #606060"&gt; 18:&lt;/span&gt; System.Console.WriteLine(&lt;span style="color: #006080"&gt;"Found
"&lt;/span&gt; + person + &lt;span style="color: #006080"&gt;", isn't that nice?"&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum19" style="color: #606060"&gt; 19:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
... though the collection classes in the .NET FCL are nowhere near as nicely designed
as those in the Java Collections library, IMHO. C# programmers take note: spend at
least a week studying the Java Collections API.)
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
This, then, opens the much harder question of, "Which language?" Without trying to
infer any sort of order or importance, here's a list of languages to consider, with
URLs where applicable; I invite your own suggestions, by the way, as I'm sure there's
a lot of languages I &lt;em&gt;don't&lt;/em&gt; know about, and quite frankly, would love to.
The "current hotness" is to learn the languages marked in &lt;strong&gt;bold&lt;/strong&gt;, so
if you want to be daring and different, try one of those that isn't. (I've provided
some links, but honestly it's kind of tiring to put all of them in; just remember
that Google is your friend, and you should be OK. :-) )
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Visual Basic. Yes, as in Visual Basic--if you haven't played with dynamic languages
before, try turning "Option Strict Off", write some code, and see how interacting
with the .NET FCL suddenly changes into a duck-typed scenario. If you're really curious,
have a look at the generated code in Reflector or ILDasm, and notice how the generated
code looks a lot like the generated JVM code from other dynamic languages on an execution
environment, a la Groovy. 
&lt;li&gt;
&lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; (&lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt;, &lt;a href="http://www.ironruby.net/"&gt;IronRuby&lt;/a&gt;): 
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt;&lt;/strong&gt;: Some call this "javac
2.0"; I'm not sure it merits &lt;em&gt;that&lt;/em&gt; title, or the assumption of the mantle
of "King of the JVM" that would seem to go with that title, but the fact is, Groovy's
a useful language. 
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://www.scala-lang.org"&gt;Scala&lt;/a&gt;&lt;/strong&gt;: A "SCAlable LAnguage"
for the JVM (and CLR, though that feature has been left to the community to support),
incorporating both object-oriented and functional concepts, plus a few new ideas,
into a single package. I'm obviously bullish on Scala, given the talks and articles
I've done on it. 
&lt;li&gt;
&lt;strong&gt;F#&lt;/strong&gt;: Originally OCaml-on-the-CLR, now F# is starting to take on a
personality of its own as Microsoft productizes it. Like Scala and Erlang, F# will
be immediately applicable in concurrency scenarios, I think. I'm obviously bullish
on F#, given the talks, articles, and book I'm doing on it. 
&lt;li&gt;
&lt;strong&gt;Erlang&lt;/strong&gt;: Functional language with a strong emphasis on parallel processing,
scalability, and concurrency. 
&lt;li&gt;
Perl: People will perhaps be surprised I say this, given my public dislike of Perl's
syntax, but I think every programmer should learn Perl, and decide for themselves
what's right and what's wrong about Perl. Besides, there's clearly no argument that
Perl is one of the power tools in every *nix sysadmin's toolbox. 
&lt;li&gt;
Python: Again, given my dislike of Python's significant whitespace, my suggestion
to learn it here may surprise some, but Python seems to be stepping into Perl's shoes
as the sysadmin language tool of choice, and frankly, lots of people &lt;em&gt;like&lt;/em&gt; the
significant whitespace, since that's how they format their code anyway. 
&lt;li&gt;
C++: The grandaddy of them all, in some ways; if you've never looked at C++ before,
you should, particularly what they're doing with templates in the Boost library. As
Scott Meyers once put it, "We're a long way from Stack&amp;lt;T&amp;gt;!" 
&lt;li&gt;
&lt;a href="http://www.digitalmars.com/d/"&gt;D&lt;/a&gt;: Walter Bright's native-compiling garbage-collected
successor to C++/Java/C#. 
&lt;li&gt;
&lt;a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html"&gt;Objective-C&lt;/a&gt; (part
of gcc): Great "other" object-oriented C-based language that never gathered the kind
of attention C++ did, yet ended up making its mark on the industry thanks to Steve
Jobs' love of the language and its incorporation into the NeXT (and later, Mac OS
X) toolchain. Obj-C is a message-passing object language, which has some interesting
implications in its own right. 
&lt;li&gt;
Common Lisp (&lt;a href="http://www.sbcl.org/"&gt;Steel Bank Common Lisp&lt;/a&gt;): What happens
when you create a language that holds as a core principle that the language should
hold no clear delineation between "code" and "data"? Or that the syntactic expression
of the language should be accessible from within that langauge? You get Lisp, and
if you're not sure what I'm talking about, pick up a Lisp or a Scheme implementation
and start experimenting. 
&lt;li&gt;
Scheme (&lt;a href="http://www.plt-scheme.org/"&gt;PLT Scheme&lt;/a&gt;, &lt;a href="http://sisc-scheme.org/"&gt;SISC&lt;/a&gt;):
Scheme is one of the earliest dialects of Lisp, and much of the same syntactic flexibility
and power of Lisp is in Scheme, as well. While the syntaxes are usually not directly
interchangeable, they're close enough that learning one is usually enough. 
&lt;li&gt;
&lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt;: Rich Hickey (who also built "dotLisp" for
the CLR) has done an amazing job of bringing Lisp to the JVM, including a few new
ideas, such as some functional concepts and an implementation of software transactional
memory, among other things. 
&lt;li&gt;
&lt;a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm"&gt;ECMAScript&lt;/a&gt; (&lt;a href="http://www.ecma-international.org/publications/standards/Ecma-357.htm"&gt;E4X&lt;/a&gt;, &lt;a href="http://www.mozilla.org/rhino/"&gt;Rhino&lt;/a&gt;, &lt;a href="http://www.ecmascript.org/"&gt;ES4&lt;/a&gt;):
If you've never looking at JavaScript &lt;em&gt;outside&lt;/em&gt; of the browser, you're in for
a surprise--as &lt;a href="http://www.vanderburg.org/Blog"&gt;Glenn Vanderburg&lt;/a&gt; put it
during one of his NFJS talks, "There's a real programming language in there!". I'm
particularly fond of E4X, which integrates XML as a native primitive type, and the
Rhino implementation fully supports it, which makes it attractive to use as an XML
services implementation language. 
&lt;li&gt;
Haskell (&lt;a href="http://jaskell.codehaus.org"&gt;Jaskell&lt;/a&gt;): One of the original functional
languages. Learning this will give a programmer a leg up on the functional concepts
that are creeping into other environments. Jaskell is an implementation of Haskell
on the JVM, and they've taken the concept of functional further, creating a build
system ("Neptune") on top of Jaskell + Ant, to yield a syntax that's... well... more
Haskellian... for building Java projects. (Whether it's better/cleaner than Ant is
debatable, but it certainly makes clear the functional nature of build scripts.) 
&lt;li&gt;
ML: Another of the original functional languages. Probably don't need to learn this
if you learn Haskell, but hey, it can't hurt. 
&lt;li&gt;
&lt;a href="http://www.heron-language.com/"&gt;Heron&lt;/a&gt;: Heron is interesting because it
looks to take on more of the modeling aspects of programming directly into the language,
such as state transitions, which is definitely a novel idea. I'm eagerly looking forward
to future drops. (I'm not so interested in the graphical design mode, or the idea
of "executable UML", but I think there's a vein of interesting ideas here that could
be mined for other languages that aren't quite so lofty in scope.) 
&lt;li&gt;
HaXe: A functional language that compiles to three different target platforms: its
own (Neko), Flash, and/or Javascript (for use in Web DOMs). 
&lt;li&gt;
&lt;a href="http://labs.businessobjects.com/cal/"&gt;CAL&lt;/a&gt;: A JVM-based statically-typed
language from the folks who bring you Crystal Reports. 
&lt;li&gt;
&lt;a href="http://www.erights.org/"&gt;E&lt;/a&gt;: An interesting tack on distributed systems
and security. Not sure if it's production-ready, but it's definitely an eye-opener
to look at. 
&lt;li&gt;
&lt;a href="http://www.swi-prolog.org/"&gt;Prolog&lt;/a&gt;: A language built around the idea
of logic and logical inference. Would love to see this in play as a "rules engine"
in a production system. 
&lt;li&gt;
&lt;a href="http://nemerle.org/Main_Page"&gt;Nemerle&lt;/a&gt;: A CLR-based language with functional
syntax and semantics, and semantic macros, similar to what we see in Lisp/Scheme. 
&lt;li&gt;
&lt;a href="http://nice.sourceforge.net/language.html"&gt;Nice&lt;/a&gt;: A JVM-based language
that permits multi-dispatch methods, sometimes known as multimethods. 
&lt;li&gt;
OCaml: An object-functional fusion that was the immediate predecessor of F#. The HaXe
and MTASC compilers are both built in OCaml, and frankly, it's in a startlingly small
number of lines of code, highlighting how appropriate functional languages are for
building compilers and interpreters. 
&lt;li&gt;
Smalltalk (&lt;a href="http://www.squeak.org"&gt;Squeak&lt;/a&gt;, VisualWorks, Strongtalk): Smalltalk
was widely-known as "the O-O language that all the C guys turned to in order to learn
how to build object-oriented programs", but very few people at the time understood
that Smalltalk was wildly different because of its message-passing and loosely/un-typed
semantics. Now we know better (I hope). Have a look. 
&lt;li&gt;
TCL (Jacl): Tool Command Language, a procedural scripting language that has some nice
embedding capabilities. I'd be curious to try putting a TCL-based language in the
hands of end users to see if it was a good DSL base. The Jacl implementation is built
on top of the JVM. 
&lt;li&gt;
Forth: The original (near as I can tell) stack-based language, in which all execution
happens on an execution stack, not unlike what we see in the JVM or CLR. Given how
much Lisp has made out of the "atoms and lists" concept, I'm curious if Forth's stack-based
approach yields a similar payoff. 
&lt;li&gt;
&lt;a href="http://www.lua.org"&gt;Lua&lt;/a&gt;: Dynamically-typed language that lives to be
embedded; known for its biggest embedder's popularity: World of Warcraft, along with
several other games/game engines. A great demonstration of the power of embedding
a language into an engine/environment to allow users to create emergent behavior. 
&lt;li&gt;
&lt;a href="http://www.fandev.org"&gt;Fan&lt;/a&gt;: Another language that seeks to incorporate
both static and dynamic typing, running on top of both the JVM or the CLR. 
&lt;li&gt;
&lt;a href="http://factorcode.org/links.fhtml"&gt;Factor&lt;/a&gt;: I'm curious about Factor because
it's another stack-based language, with a lot of inspiration from some of the other
languages on this list. 
&lt;li&gt;
&lt;a href="http://boo.codehaus.org/"&gt;Boo&lt;/a&gt;: A Python-inspired CLR language that Ayende
likes for domain-specific languages. 
&lt;li&gt;
&lt;a href="http://www.cobra-language.org"&gt;Cobra&lt;/a&gt;: A Python-inspired language that
seeks to encompass &lt;em&gt;both&lt;/em&gt; static &lt;em&gt;and&lt;/em&gt; dynamic typing into one language.
Fascinating stuff. 
&lt;li&gt;
&lt;a href="http://slate.tunes.org/"&gt;Slate&lt;/a&gt;: A "prototype-based object-oriented programming
language based on Self, CLOS, and Smalltalk-80." Apparently on hold due to loss of
interest from the founder, last release was 0.3.5 in August of 2005. 
&lt;li&gt;
&lt;a href="http://www.latrobe.edu.au/philosophy/phimvt/joy.html"&gt;Joy&lt;/a&gt;: Factor's primary
inspiration, another stack-based language. 
&lt;li&gt;
&lt;a href="http://mythago.net/language.html"&gt;Raven&lt;/a&gt;: A scripting language that "rips
off" from Python, Forth, Perl, and the creator's own head. 
&lt;li&gt;
&lt;a href="http://www.canonware.com/onyx/"&gt;Onyx&lt;/a&gt;: "Onyx is a powerful stack-based,
multi-threaded, interpreted, general purpose programming language similar to PostScript.
It can be embedded as an extension language similarly to ficl (Forth), guile (scheme),
librep (lisp dialect), s-lang, Lua, and Tcl." 
&lt;li&gt;
&lt;a href="http://lolcode.com/specs/1.2"&gt;LOLCode&lt;/a&gt;: No, you won't use LOLcode on a
project any time soon, but LOLCode has had so many different implementations of it
built, it's a great practice tool towards building your own languages, a la DSLs.
LOLcode has all the basic components a language would use, so if you can build a parser,
AST and execution engine (either interpreter or compiler) for LOLcode, then you've
got the basic skills in place to build an external DSL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
There's more, of course, but hopefully there's something in this list to keep you
busy for a while. Remember to send me your favorite new-language links, and I'll add
them to the list as seems appropriate. 
&lt;/p&gt;
&lt;p&gt;
Happy hacking!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=05f327f7-95ec-413f-8d41-74ad6c5a4e58" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,05f327f7-95ec-413f-8d41-74ad6c5a4e58.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Visual Basic</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=a00766d9-6994-4611-8bc1-e6b169167949</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,a00766d9-6994-4611-8bc1-e6b169167949.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,a00766d9-6994-4611-8bc1-e6b169167949.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a00766d9-6994-4611-8bc1-e6b169167949</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html">Steve
Yegge posted the transcript</a> from a talk on dynamic languages that he gave at Stanford.
</p>
        <p>
          <a href="http://beust.com/weblog/archives/000483.html">Cedric Beust posted a response</a> to
Steve's talk, espousing statically-typed languages.
</p>
        <p>
Numerous comments and flamewars erupted, not to mention a Star Wars analogy (which <em>always</em> makes
things more fun).
</p>
        <p>
This is my feeble attempt to play galactic peacemaker. Or at least galactic color
commentary and play-by-play. I have no doubts about its efficacy, and that it will
only fan the flames, for that's how these things work. Still, I feel a certain perverse
pleasure in pretending, so....
</p>
        <p>
Enjoy the carnage that results.
</p>
        <hr />
        <p>
First of all, let me be very honest: I like Steve's talk. I think he does a pretty
good job of representing the negatives and positives of dynamic languages, though
there are obviously places where I'm going to disagree:
</p>
        <ul>
          <li>
            <em>"Because we all know that C++ has some very serious problems, that organizations,
you know, put hundreds of staff years into fixing. Portability across compiler upgrades,
across platforms, I mean the list goes on and on and on. C++ is like an evolutionary
sort of dead-end. But, you know, it's fast, right?"</em> Funny, I doubt Bjarne Stroustrup
or Herb Sutter would agree with the "evolutionary dead-end" statement, but they're
biased, so let's put that aside for a moment. Have organizations put hundreds of staff
years into fixing the problems of C++? Possibly--it would be good to know what Steve
considers the "very serious problems" of C++, because that list he does give (compiler/platform/language
upgrades and portability across platforms) seems problematic regardless of the langauge
or platform you choose--Lord knows we saw that with Java, and Lord knows we see it
with ECMAScript in the browser, too. The larger question should be, can, and does,
the language evolve? Clearly, based on the work in the Boost libraries and the C++0X
standards work, the answer is yes, every bit as much as Java or C#/.NET is, and arguably
much more so than what we're seeing in some of the dynamic languages. C++ is getting
a standardized memory model, which will make a portable threading package possible,
as well as lambda expressions, which is a far cry from the language that <em>I</em> grew
up with. That seems evolutionary to me. What's more, Bjarne has said, point-blank,
that he prefers taking a slow approach to adopting new features or ideas, so that
it can be "done right", and I think that's every bit a fair position to take, regardless
of whether I agree with it or not. (I'd probably wish for a faster adoption curve,
but that's me.) Oh, and if you're thinking that C++'s problems stem from its memory
management approach, you've never written C++ with a garbage collector library. 
</li>
          <li>
            <em>"And so you ask them, why not use, like, D? Or Objective-C. And they say, "well,
what if there's a garbage collection pause?" "</em> Ah, yes, the "we fear garbage
collection" argument. I would <em>hope</em> that Java and C#/.NET have put that particular
debate to rest by now, but in the event that said dragon's not yet slain, let's do
so now: GC <em>does</em> soak up some cycles, but for the most part, for most applications,
the cost is lost in the noise of everything else. As with all things performance related,
however, profile. 
</li>
          <li>
            <em>"And so, you know, their whole argument is based on these fallacious, you know,
sort of almost pseudo-religious... and often it's the case that they're actually based
on things that used to be true, but they're not really true anymore, and we're gonna
get to some of the interesting ones here."</em> Steve, almost <em>all</em> of these
discussions are pseudo-religious in nature. For some reason, programmers like to identify
themselves in terms of the language they use, and that just sets up the religious
nature of the debate from the get-go. 
</li>
          <li>
            <em>"You know how there's Moore's Law, and there are all these conjectures in our
industry that involve, you know, how things work. And one of them is that languages
get replaced every ten years. ... Because that's what was happening up until like
1995. But the barriers to adoption are really high."</em> I can't tell from the transcript
of Steve's talk if this is <em>his</em> opinion, or that this is a conjecture/belief
of the industry; in either case, I thoroughly disagree with this sentiment--the barriers
to entry to create your own language have <em>never</em> been lower than today, and
various elements of research work and available projects just keep making it easier
and easier to do, particularly if you target one of the available execution engines.
Now, granted, if you want your language to look <em>different</em> from the other
languages out there, or if you want to do some seriously cool stuff, yes, there's
a fair amount of work you still have to do... but that's always going to be the case.
As we find ways to make it easier to build what's "cool" today, the definition of
what's "cool" rises in result. (Nowhere is this more clear than in the game industry,
for example.) Moore's Law begets Ballmer's Corollary: <em>User expectations double
every eighteen months, requiring us to use up all that power trying to meet those
expectations with fancier ways of doing things</em>. 
</li>
          <li>
It's a section that's too long to quote directly here, but Steve goes on to talk about
how programmers aren't <em>using</em> these alternative languages, and that if you
even suggest trying to use D or Scala or [fill in the blank], you're going to get <em>"lynched
for trying to use a language that the other engineers don't know. ... And [my intern]
is, like, "well I understand the argument" and I'm like "No, no, no! You've never
been in a company where there's an engineer with a Computer Science degree and ten
years of experience, an architect, who's in your face screaming at you, with spittle
flying on you, because you suggested using, you know... </em><a href="http://www.digitalmars.com/d"><em>D</em></a><em>.
Or </em><a href="http://www.haskell.org/"><em>Haskell</em></a><em>. Or Lisp, or </em><a href="http://www.amazon.com/gp/product/193435600X?ie=UTF8&amp;tag=steveysblogra-20&amp;link_code=wql&amp;camp=212361&amp;creative=380601"><em>Erlang</em></a><em>,
or take your pick." "</em> Steve, with all due respect to your experience, I know
plenty of engineers and companies who <em>are</em> using some of these "alternative"
languages, and they're having some good success. But frankly, if you work in a company
where an architect is "in your face screaming at you, with spittle flying on you",
frankly, it's time to move on, because that company is <em>never</em> going to try
anything new. Period. I don't care if we're talking about languages, Spring, agile
approaches, or trying a new place for lunch today. Companies get into a rut just as
much as individuals do, and if the company doesn't challenge that rut every so often,
they're going to get bypassed. Period, end of story. That doesn't mean trying every
new thing under the sun on your next "mission-critical" project, but for God's sake,
Mr. CTO, do you really want to wait until your competition has bypassed you before
adopting something new? There's a lot of project work that goes on that has room for
some experimentation and experience-gathering before utilizing something on the next
big project. 
</li>
          <li>
            <em>"I made the famously, horribly, career-shatteringly bad mistake of trying to use
Ruby at Google, for this project. ... And I became, very quickly, I mean almost overnight,
the Most Hated Person At Google. And, uh, and I'd have arguments with people about
it, and they'd be like Nooooooo, WHAT IF... And ultimately, you know, ultimately they
actually convinced me that they were right, in the sense that there actually were
a few things. There were some taxes that I was imposing on the systems people, where
they were gonna have to have some maintenance issues that they wouldn't have [otherwise
had]. Those reasons I thought were good ones."</em> Recognizing the cost of deploying
a new platform into the IT sphere is a <em>huge</em> deal that programmers frequently
try to ignore in their zeal to adopt something new, and as a result, IT departments
frequently swing the <em>other</em> way, resisting all change until it becomes inevitable.
This is where running on top of one of the existing execution environments (the JVM
or the CLR in particular) becomes so powerful--the actual deployment platform doesn't
change, and the IT guys remain more or less disconnected from the whole scenario.
This is the principal advantage JRuby and IronPython and Jython and IronRuby will
have over their native-interpreted counterparts. As for maintenance issues, aside
from the "somebody's gonna have to learn this language" tax (which is a real tax but
far less costly, I believe, than most people think it to be), I'm not sure what issues
would crop up--the IT guys don't usually change your Java or C# or Visual Basic code
in production, do they? 
</li>
          <li>
Steve then gets into the discussion about tools around dynamic languages, and I heartily
agree with him: the tool vendors have a much deeper toolchest than we (non-tool vendor
programmers) give them credit for, and they're proving it left and right as IDEs get
better and better for dynamic languages like Groovy and Ruby. In some areas, though,
I think we as developers lean too strongly against our tools, expecting them to be
able to do the thinking <em>for</em> us, and getting all grumpy when they can't or
don't. Granted, I don't want to give up my IntelliJ any time soon, but let's think
about this for a second: if I can't program Java today without IntelliJ, then is that
my fault, the language's fault, the industry's fault, or some combination thereof?
Or is it maybe just a fact of progress? (Would anybody consider building assembly
language in Notepad today? Does that make assembly language <em>wrong</em>? Or just
the wrong tool for the job?) 
</li>
          <li>
Steve's point about how Java IDE's miss the Reflective case is a good one, and one
that every Java programmer should consider. How much of your Java (or C# or C++) code
actually <em>isn't</em> capturable directly in the IDE? 
</li>
          <li>
Steve then goes into the ubiquitous Java-generics rant, and I'll have to admit, he's
got some good points here--why <em>didn't</em> we (Java, though this applies just
as equally to C#) just let the runtime throw the exception when the cast fails, and
otherwise just let things go? My guess is that there's probably some good rationale
that presumes you already accept the necessity of more verbose syntax in exchange
for knowing where the cast might potentially fail, even though there's plenty of other
places in the language where exceptions can be thrown <em>without</em> that verbose
syntax warning you of that fact, array indexers being a big one. One thing I will
point out, however, in what I believe is a refutation of what Steve's suggesting in
this discussion: from my research in the area and my memory about the subject from
way back when, the javac compiler really <em>doesn't</em> do much in the way of optimizations,
and hasn't tried since about JDK 1.1, for the precise reason he points out: the JITter's
going to optimize all this stuff anyway, so it's easier to just relax and let the
JITter do the heavy lifting. 
</li>
          <li>
The discussion about optimizations is interesting, and while I think he glosses over
some issues and hyper-focuses on others, two points stand out, in my mind: performance
hits often come from places you don't expect, and that micro-benchmarks generally
don't prove much of anything. Sometimes that hit will come from the language, and
sometimes that hit will come from something entirely differently. <em>Profile first</em>.
Don't let your intuition get in the way, because your intuition sucks. Mine does,
too, by the way--there's just too many moving parts to be able to keep it all straight
in your head.</li>
        </ul>
        <p>
Steve then launches into a series of Q&amp;A with the audience, but we'll let the
light dim on that stage, and turn our attention over to Cedric's response.
</p>
        <ul>
          <li>
            <em>"... the overall idea is that dynamically typed languages are on the rise and
statically typed languages are on their way out."</em> Actually, the transcript <em>I</em> read
seemed to imply that Steve thought that dynamically typed languages are cool but that
nobody will use them for a variety of reasons, some of which he agreed with. I thoroughly
disagree with Steve's conclusion there, by the way, but so be it ... 
</li>
          <li>
            <em>"I'm happy to be the Luke Skywalker to his Darth Vader. ... Evil shall not prevail."</em> Yes,
let's not let this debate fall into the <em>pseudo</em>-religious category, shall
we? Fully religious debates have <em>such</em> a better track record of success, so
let's just make it "good vs evil", in order to <em>ensure</em> emotions get all neatly
wrapped throughout. Just remember, Cedric, even Satan can quote the Bible... and it
was Jesus telling us that, so if you disagree with anything I say below you must be
some kind of Al-Qaeda terrorist. Or something. 
<ul><li><em>[Editor's note: Oh, shit, he did NOT just call Cedric a terrorist and a Satanist
and invoke the name of Christ in all this. Time to roll out the disclaimer... "Ladies
and gentlemen, the views and opinions expressed in this blog entry...."]</em></li><li><em>[Author's note: For the humor-challenged in the crowd, no I do </em>not<em> think
Cedric is a terrorist. I </em>like<em> Cedric, and hopefully he still likes me, too.
Of course, I have also been accused of being the Antichrist, so what that says about
Cedric I'm not sure.]</em></li></ul></li>
          <li>
Cedric on Scala: 
<ul><li><em>"Have you taken a look at implicits? Seriously? Just when I thought we were not
just done realizing that global variables are bad, but we have actually come up with
better ways to leverage the concept with DI frameworks such as Guice, Scala knocks
the wind out of us with implicits and all our hardly earned knowledge about side effects
is going down the drain again."</em> Umm.... Cedric? One reaction comes to mind here,
and it's best expressed as.... WTF?!? Implicits are not global variables or DI, they're
more a way of doing conversions, a la autoboxing but more flexible. I agree that casual
use of implicits can get you in trouble, but I'd have thought Scala's "there are no
operators just methods with funny names" would be the more disconcerting of the two. 
</li><li><em>"As for pattern matching, it makes me feel as if all the careful data abstraction
that I have built inside my objects in order to isolate them from the unforgiving
world are, again, thrown out of the window because I am now forced to write deconstructors
to expose all this state just so my classes can be put in a statement that doesn't
even have the courtesy to dress up as something that doesn't smell like a switch/case..."</em> I
suppose if you looked at pattern-matching and saw nothing more than a switch/case,
then I'd agree with you, but it turns out that pattern-matching is a lot more powerful
than just being a switch/case. I <em>think</em> what Cedric's opposing is the fact
that pattern-matching can actually bind to variables expressed in the individual match
clauses, which might look like deconstructors exposing state... but that's not the
way they get used, from what I've seen thus far. But, hey, just because the language
offers it, people will use it wrongly, right? So God forbid a language's library should
allow me to, say, execute private methods or access private fields....</li></ul></li>
          <li>
Cedric on the difficulty to impose a non-mainstream language in the industry: <em>"Let
me turn the table on you and imagine that one of your coworkers comes to you and tells
you that he really wants to implement his part of the project in this awesome language
called Draco. How would you react? Well, you're a pragmatic kind of guy and even though
the idea seems wacky, I'm sure you would start by doing some homework (which would
show you that Draco was an awesome language used back in the days on the Amiga). Reading
up on Draco, you realize that it's indeed a very cool language that has some features
that are a good match for the problem at hand. But even as you realize this, you already
know what you need to tell that guy, right? Probably something like "You're out of
your mind, go back to Eclipse and get cranking". And suddenly, you've become *that*
guy. Just because you showed some common sense."</em> If, I suppose, we equate "common
sense" with "thinking the way Cedric does", sure, that makes sense. But you know,
if it turned out that I was writing something that targeted the Amiga, and Draco did,
in fact, give us a huge boost on the competition, and the drawbacks of using Draco
seemed to pale next to the advantages of using it, then... Well, gawrsh, boss, it
jus' might make <em>sense</em> to use 'dis har Draco thang, even tho it ain't Java.
This is called <em>risk mitigation</em>, and frankly, it's something too few companies
go through because they've "standardized" on a language and API set across the company
that's hardly applicable to the problem at hand. Don't get me wrong--you don't want
the opposite extreme, which is total anarchy in the operations center as people use
any and all languages/platforms available to them on a willy-nilly basis, but the
funny thing is, this is a <em>continuum</em>, not a binary switch. This is where languages-on-execution-engines
(like the JVM or CLR) gets such a great win-win condition: IT can just think in terms
of supporting the JVM or CLR, and developers can then think in whatever language they
want, so long it compiles/runs on those platforms. 
</li>
          <li>
Cedric on building tools for dynamic languages: <em>"I still strongly disagree with
that. It is different *and* harder (and in some cases, </em><a href="http://beust.com/weblog/archives/000414.html"><em>impossible</em></a><em>).
Your point regarding the fact that static refactoring doesn't cover 100% of the cases
is well taken, but it's 1) darn close to 100% and 2) getting closer to it much faster
than any dynamic tool ever could. By the way, Java refactorings correcting comments,
XML and property files are getting pretty common these days, but good luck trying
to perform a reliable method renaming in 100 Ruby files."</em> I'm not going to weigh
in here, since I don't write tools for either dynamic or static languages, but watching
what the IntelliJ IDEA guys are doing with Groovy, and what the NetBeans guys are
doing with Ruby, I'm more inclined to believe in what Steve thinks than what Cedric
does. As for the "reliable method renaming in 100 Ruby files", I don't know this for
a fact, but I'll be willing to be that we're a lot closer to that than Cedric thinks
we are. <em>(I'd love to hear comments from somebody neck-deep in the Ruby crowd who's
done this and their experience doing so.)</em></li>
          <li>
Cedric on generics: <em>"I no longer bother trying to understand why complex Generic
examples are so... well, darn complex. Yes, it's pretty darn hard to follow sometimes,
but here are a few points for you to ponder: </em><ul><li><em>90% of the Java programmers (including myself) only ever use Generics for Collections. </em></li><li><em>These same programmers never go as far as nesting two Generic declarations. </em></li><li><em>For API developers and users alike, Generics are a huge progress. </em></li><li><em>Scala still requires you to understand covariance and contravariance (but with
different rules. People seem to say that Scala's rules are simpler, I'm not so sure,
but not interested in finding out for the aforementioned reasons)."</em></li></ul>
Honestly, Cedric, the fact that 90% of the Java programmers are only using generics
for collections doesn't sway me in the slightest. 90% of the world's population doesn't
use Calculus, either, but that doesn't mean that it's not useful, or that we shouldn't
be trying to improve our understanding of it and how to do useful things with it.
After looking at what the C++ community has done with templates (the Boost libraries)
and what .NET is doing with its generic system (LINQ and F# to cite two examples),
I think Java missed a <em>huge</em> opportunity with generics. Type erasure may have
made sense in a world where Java was the only practical language on top of the JVM,
but in a world that's coming to accept Groovy and JRuby and Scala as potential equals
on the JVM, it makes no sense whatsoever. Meanwhile, when thinking about Scala, let's
take careful note that a Scala programmer can go a <em>long</em> way with the langauge
before having to think about covariance, contravariance, upper and lower type bounds,
simpler or not. (For what it's worth, I agree with you, I'm not sure if they're simpler,
either.) 
</li>
          <li>
Cedric on dynamic language performance: <em>"What will keep preventing dynamically
typed languages from displacing statically typed ones in large scale software is not
performance, it's the simple fact that it's impossible to make sense of a giant ball
of typeless source files, which causes automatic refactorings to be unreliable, hence
hardly applicable, which in turn makes developers scared of refactoring. And it's
all downhill from there. Hello bit rot."</em> There's a certain circular logic here--if
we presume that IDEs can't make sense of "typeless source files" (I wasn't aware that <em>any</em> source
file was statically typed, honestly--this must be something Google teaches), then
it follows that refactoring will be impossible or at least unreliable, and thus a
giant ball of them will be unmanageable. I disagree with Cedric's premise--that IDEs
can't make sense of dynamic language code--so therefore I disagree with the entire
logical chain as a result. What I <em>don't</em> disagree with is the implicit presumption
that the larger the dynamic language source base, the harder it is to keep straight
in your head. In fact, I'll even amend that statement further: the larger the source
base (dynamic or otherwise), the harder it is to keep straight in your head. Abstractions
are key to the long-term success of any project, so the language I work with had best
be able to help me create those abstractions, or I'm in trouble once I cross a certain
threshold. That's true regardless of the language: C++, Java, C#, Ruby, or whatever.
That's one of the reasons I'm spending time trying to get my head around Lisp and
Scheme, because those languages were all about building abstractions upon abstractions
upon abstractions, but in libraries, rather than in the language itself, so they could
be swapped out and replaced with something else when the abstractions failed or needed
evolution. 
</li>
          <li>
Cedric on program unmaintainability: <em>"I hate giving anecdotal evidence to support
my points, but that won't stop me from telling a short story that happened to me just
two weeks ago: I found myself in this very predicament when trying to improve a Ruby
program that 1) I just wrote a few days before and 2) is 200 lines long. I was staring
at an object, trying to remember what it does, failing, searching manually in emacs
where it was declared, found it as a "Hash", and then realized I still had no idea
what the darn thing is. You see my point..."</em> Ain't nothing wrong with anecdotal
evidence, Cedric. We all have it, and if we all examine it <em>en masse</em>, some
interesting patterns can emerge. Funny thing is, I've had exactly the same experience
with C++ code, Java code, and C# code. What does that tell you? It tells me that I
probably should have cooked up some better abstractions for those particular snippets,
and that's what I ended up doing. As a matter of fact, I just helped a buddy of mine
untangle some Ruby code to turn it into C#, and despite the fact that he's never written
(or read) a Ruby program in his life, we managed to flip it over to C# in a couple
of hours, including the execution of Ruby code blocks (I <em>love</em> anonymous methods)
stored in a string-keyed hash within an array. And this was Ruby code that neither
of us had ever seen before, much less written it a few days prior. 
</li>
          <li>
Cedric (and Steve) on error messages: <em>"[Steve said] And the weird thing is, I
realized early in my career that I would actually rather have a runtime error than
a compile error. [Cedric responded] You probably already know this, but you drew the
wrong conclusion. You didn't want a runtime error, you wanted a clear error. One that
doesn't lie to you, like CFront (and a lot of C++ compilers even today, I hear) used
to spit in our faces. And once I have a clear error message, I much prefer to have
it as early as possible, thank you very much."</em> Honestly, I agree with Cedric
here: I would much prefer errors <em>before</em> execution, as early as possible,
so that there's less chance of my users finding the errors I haven't found yet. And
I agree that some of the error messages we sometimes get are pretty incomprehensible,
particularly from the C++ compiler during template expansion. But how is that different
from the ubiquitous Java "ClassCastException: Cannot cast Person to Person" that arises
from time to time? Once you know what the message is telling you, it's easy to know
how to fix it, but getting to the point of knowing what the error message is telling
you requires a good working understanding of Java ClassLoaders. Do we really expect
that any tool--static or dynamic, compiler or runtime, is going to be able to produce
error messages that somehow precludes the need to have the necessary background to
understand it? <em>All errors are relative to the context from which they are born.</em> If
you lack that context, the error message, no matter how well-written or phrased, is
useless. 
</li>
          <li>
Cedric on "The dynamic nuclear winter": <em>"[Steve said] And everybody else went
and chased static. And they've been doing it like crazy. And they've, in my opinion,
reached the theoretical bounds of what they can deliver, and it has FAILED. [Cedric
responded] Quite honestly, words fail me here."</em> Wow. Just... wow. I can't agree
with Steve at all, that static(ically typed languages) has FAILED, or that they've
reached the theoretical bounds of what they can deliver, but neither can I say with
complete confidence that statically-typed languages are The Way Forward, either. I
think, for the time, chasing statically-typed languages was the right thing to do,
because for a long time we were in a position where programmer time was cheaper than
computer time; now, I believe that this particular metric has flipped, and that it's
time we started thinking about what the costs of programmer time really are. (Frankly,
I'd love to see a double-blind study on this, but I've no idea how one would carry
that out in a scientific manner.)</li>
        </ul>
        <p>
So.... what's left?
</p>
        <p>
Oh, right: if Steve/Vader is Cedric/Luke's father, then who is Cedric/Luke's sister,
and why is she wearing a copper-wire bikini while strangling the Haskell/ML crowd/Jabba
the Hutt?
</p>
        <p>
Maybe this whole Star Wars analogy thing was a bad idea.
</p>
        <hr />
        <p>
Look, at the end of the day, the whole static-vs-dynamic thing is a red herring. <em>It
doesn't matter</em>. The crucial question is whether or not the language being used
does two things, and how well it does them:
</p>
        <ol>
          <li>
Provide the ability to express the concept in your head, and 
</li>
          <li>
Provide the ability to evolve as the concepts in your head evolve</li>
        </ol>
        <p>
There are certain things that are just impossible to do in C++, for example. I cannot
represent the C++ AST inside the program itself. (Before you jump all over me, C++ers
of the world, take careful note: I'm <em>not</em> saying that C++ cannot represent
an AST, but an AST of <em>itself</em>, at the time it is executing.) This is something
dynamic languages--most notably Lisp, but also other languages, including Ruby--do
pretty well, because they're building the AST at runtime anyway, in order to execute
the code in the first place. <em>Could</em> C++ do this? Perhaps, but the larger question
is, would any self-respecting C++ programmer <em>want</em> to? Look at your average
Ruby program--80% to 90% (the number may vary, but most of the Rubyists I talk to
agree its somewhere in this range) of the program isn't really using the meta-object
capabilities of the language, and is just a "simpler/easier/scarier/unchecked" object
language. Most of the weird-*ss Rubyisms don't show up in your average Ruby program,
but are buried away in some library someplace, and away from the view of the average
Ruby programmer.
</p>
        <p>
Keep the simple things simple, and make the hard things possible. That' should be
the overriding goal of any language, library, or platform.
</p>
        <p>
Erik Meijer coined this idea first, and I like it a lot: Why can't we operate on a
basic principle of "static when we can (or should), dynamic otherwise"? (Reverse that
if it makes you feel better: "dynamic when we can, static otherwise", because the
difference is really only one of gradation. It's also an interesting point for discussion,
just how much of each is necessary/desirable.) Doing this means we get the best of
both worlds, and we can stop this Galactic Civil War before anybody's planet gets
blown up.
</p>
        <p>
'Cuz that would suck.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=a00766d9-6994-4611-8bc1-e6b169167949" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Guide you, the Force should</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,a00766d9-6994-4611-8bc1-e6b169167949.aspx</guid>
      <link>http://blogs.tedneward.com/2008/05/19/Guide+You+The+Force+Should.aspx</link>
      <pubDate>Mon, 19 May 2008 04:34:54 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html"&gt;Steve
Yegge posted the transcript&lt;/a&gt; from a talk on dynamic languages that he gave at Stanford.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://beust.com/weblog/archives/000483.html"&gt;Cedric Beust posted a response&lt;/a&gt; to
Steve's talk, espousing statically-typed languages.
&lt;/p&gt;
&lt;p&gt;
Numerous comments and flamewars erupted, not to mention a Star Wars analogy (which &lt;em&gt;always&lt;/em&gt; makes
things more fun).
&lt;/p&gt;
&lt;p&gt;
This is my feeble attempt to play galactic peacemaker. Or at least galactic color
commentary and play-by-play. I have no doubts about its efficacy, and that it will
only fan the flames, for that's how these things work. Still, I feel a certain perverse
pleasure in pretending, so....
&lt;/p&gt;
&lt;p&gt;
Enjoy the carnage that results.
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
First of all, let me be very honest: I like Steve's talk. I think he does a pretty
good job of representing the negatives and positives of dynamic languages, though
there are obviously places where I'm going to disagree:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;"Because we all know that C++ has some very serious problems, that organizations,
you know, put hundreds of staff years into fixing. Portability across compiler upgrades,
across platforms, I mean the list goes on and on and on. C++ is like an evolutionary
sort of dead-end. But, you know, it's fast, right?"&lt;/em&gt; Funny, I doubt Bjarne Stroustrup
or Herb Sutter would agree with the "evolutionary dead-end" statement, but they're
biased, so let's put that aside for a moment. Have organizations put hundreds of staff
years into fixing the problems of C++? Possibly--it would be good to know what Steve
considers the "very serious problems" of C++, because that list he does give (compiler/platform/language
upgrades and portability across platforms) seems problematic regardless of the langauge
or platform you choose--Lord knows we saw that with Java, and Lord knows we see it
with ECMAScript in the browser, too. The larger question should be, can, and does,
the language evolve? Clearly, based on the work in the Boost libraries and the C++0X
standards work, the answer is yes, every bit as much as Java or C#/.NET is, and arguably
much more so than what we're seeing in some of the dynamic languages. C++ is getting
a standardized memory model, which will make a portable threading package possible,
as well as lambda expressions, which is a far cry from the language that &lt;em&gt;I&lt;/em&gt; grew
up with. That seems evolutionary to me. What's more, Bjarne has said, point-blank,
that he prefers taking a slow approach to adopting new features or ideas, so that
it can be "done right", and I think that's every bit a fair position to take, regardless
of whether I agree with it or not. (I'd probably wish for a faster adoption curve,
but that's me.) Oh, and if you're thinking that C++'s problems stem from its memory
management approach, you've never written C++ with a garbage collector library. 
&lt;li&gt;
&lt;em&gt;"And so you ask them, why not use, like, D? Or Objective-C. And they say, "well,
what if there's a garbage collection pause?" "&lt;/em&gt; Ah, yes, the "we fear garbage
collection" argument. I would &lt;em&gt;hope&lt;/em&gt; that Java and C#/.NET have put that particular
debate to rest by now, but in the event that said dragon's not yet slain, let's do
so now: GC &lt;em&gt;does&lt;/em&gt; soak up some cycles, but for the most part, for most applications,
the cost is lost in the noise of everything else. As with all things performance related,
however, profile. 
&lt;li&gt;
&lt;em&gt;"And so, you know, their whole argument is based on these fallacious, you know,
sort of almost pseudo-religious... and often it's the case that they're actually based
on things that used to be true, but they're not really true anymore, and we're gonna
get to some of the interesting ones here."&lt;/em&gt; Steve, almost &lt;em&gt;all&lt;/em&gt; of these
discussions are pseudo-religious in nature. For some reason, programmers like to identify
themselves in terms of the language they use, and that just sets up the religious
nature of the debate from the get-go. 
&lt;li&gt;
&lt;em&gt;"You know how there's Moore's Law, and there are all these conjectures in our
industry that involve, you know, how things work. And one of them is that languages
get replaced every ten years. ... Because that's what was happening up until like
1995. But the barriers to adoption are really high."&lt;/em&gt; I can't tell from the transcript
of Steve's talk if this is &lt;em&gt;his&lt;/em&gt; opinion, or that this is a conjecture/belief
of the industry; in either case, I thoroughly disagree with this sentiment--the barriers
to entry to create your own language have &lt;em&gt;never&lt;/em&gt; been lower than today, and
various elements of research work and available projects just keep making it easier
and easier to do, particularly if you target one of the available execution engines.
Now, granted, if you want your language to look &lt;em&gt;different&lt;/em&gt; from the other
languages out there, or if you want to do some seriously cool stuff, yes, there's
a fair amount of work you still have to do... but that's always going to be the case.
As we find ways to make it easier to build what's "cool" today, the definition of
what's "cool" rises in result. (Nowhere is this more clear than in the game industry,
for example.) Moore's Law begets Ballmer's Corollary: &lt;em&gt;User expectations double
every eighteen months, requiring us to use up all that power trying to meet those
expectations with fancier ways of doing things&lt;/em&gt;. 
&lt;li&gt;
It's a section that's too long to quote directly here, but Steve goes on to talk about
how programmers aren't &lt;em&gt;using&lt;/em&gt; these alternative languages, and that if you
even suggest trying to use D or Scala or [fill in the blank], you're going to get &lt;em&gt;"lynched
for trying to use a language that the other engineers don't know. ... And [my intern]
is, like, "well I understand the argument" and I'm like "No, no, no! You've never
been in a company where there's an engineer with a Computer Science degree and ten
years of experience, an architect, who's in your face screaming at you, with spittle
flying on you, because you suggested using, you know... &lt;/em&gt;&lt;a href="http://www.digitalmars.com/d"&gt;&lt;em&gt;D&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.
Or &lt;/em&gt;&lt;a href="http://www.haskell.org/"&gt;&lt;em&gt;Haskell&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Or Lisp, or &lt;/em&gt;&lt;a href="http://www.amazon.com/gp/product/193435600X?ie=UTF8&amp;amp;tag=steveysblogra-20&amp;amp;link_code=wql&amp;amp;camp=212361&amp;amp;creative=380601"&gt;&lt;em&gt;Erlang&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
or take your pick." "&lt;/em&gt; Steve, with all due respect to your experience, I know
plenty of engineers and companies who &lt;em&gt;are&lt;/em&gt; using some of these "alternative"
languages, and they're having some good success. But frankly, if you work in a company
where an architect is "in your face screaming at you, with spittle flying on you",
frankly, it's time to move on, because that company is &lt;em&gt;never&lt;/em&gt; going to try
anything new. Period. I don't care if we're talking about languages, Spring, agile
approaches, or trying a new place for lunch today. Companies get into a rut just as
much as individuals do, and if the company doesn't challenge that rut every so often,
they're going to get bypassed. Period, end of story. That doesn't mean trying every
new thing under the sun on your next "mission-critical" project, but for God's sake,
Mr. CTO, do you really want to wait until your competition has bypassed you before
adopting something new? There's a lot of project work that goes on that has room for
some experimentation and experience-gathering before utilizing something on the next
big project. 
&lt;li&gt;
&lt;em&gt;"I made the famously, horribly, career-shatteringly bad mistake of trying to use
Ruby at Google, for this project. ... And I became, very quickly, I mean almost overnight,
the Most Hated Person At Google. And, uh, and I'd have arguments with people about
it, and they'd be like Nooooooo, WHAT IF... And ultimately, you know, ultimately they
actually convinced me that they were right, in the sense that there actually were
a few things. There were some taxes that I was imposing on the systems people, where
they were gonna have to have some maintenance issues that they wouldn't have [otherwise
had]. Those reasons I thought were good ones."&lt;/em&gt; Recognizing the cost of deploying
a new platform into the IT sphere is a &lt;em&gt;huge&lt;/em&gt; deal that programmers frequently
try to ignore in their zeal to adopt something new, and as a result, IT departments
frequently swing the &lt;em&gt;other&lt;/em&gt; way, resisting all change until it becomes inevitable.
This is where running on top of one of the existing execution environments (the JVM
or the CLR in particular) becomes so powerful--the actual deployment platform doesn't
change, and the IT guys remain more or less disconnected from the whole scenario.
This is the principal advantage JRuby and IronPython and Jython and IronRuby will
have over their native-interpreted counterparts. As for maintenance issues, aside
from the "somebody's gonna have to learn this language" tax (which is a real tax but
far less costly, I believe, than most people think it to be), I'm not sure what issues
would crop up--the IT guys don't usually change your Java or C# or Visual Basic code
in production, do they? 
&lt;li&gt;
Steve then gets into the discussion about tools around dynamic languages, and I heartily
agree with him: the tool vendors have a much deeper toolchest than we (non-tool vendor
programmers) give them credit for, and they're proving it left and right as IDEs get
better and better for dynamic languages like Groovy and Ruby. In some areas, though,
I think we as developers lean too strongly against our tools, expecting them to be
able to do the thinking &lt;em&gt;for&lt;/em&gt; us, and getting all grumpy when they can't or
don't. Granted, I don't want to give up my IntelliJ any time soon, but let's think
about this for a second: if I can't program Java today without IntelliJ, then is that
my fault, the language's fault, the industry's fault, or some combination thereof?
Or is it maybe just a fact of progress? (Would anybody consider building assembly
language in Notepad today? Does that make assembly language &lt;em&gt;wrong&lt;/em&gt;? Or just
the wrong tool for the job?) 
&lt;li&gt;
Steve's point about how Java IDE's miss the Reflective case is a good one, and one
that every Java programmer should consider. How much of your Java (or C# or C++) code
actually &lt;em&gt;isn't&lt;/em&gt; capturable directly in the IDE? 
&lt;li&gt;
Steve then goes into the ubiquitous Java-generics rant, and I'll have to admit, he's
got some good points here--why &lt;em&gt;didn't&lt;/em&gt; we (Java, though this applies just
as equally to C#) just let the runtime throw the exception when the cast fails, and
otherwise just let things go? My guess is that there's probably some good rationale
that presumes you already accept the necessity of more verbose syntax in exchange
for knowing where the cast might potentially fail, even though there's plenty of other
places in the language where exceptions can be thrown &lt;em&gt;without&lt;/em&gt; that verbose
syntax warning you of that fact, array indexers being a big one. One thing I will
point out, however, in what I believe is a refutation of what Steve's suggesting in
this discussion: from my research in the area and my memory about the subject from
way back when, the javac compiler really &lt;em&gt;doesn't&lt;/em&gt; do much in the way of optimizations,
and hasn't tried since about JDK 1.1, for the precise reason he points out: the JITter's
going to optimize all this stuff anyway, so it's easier to just relax and let the
JITter do the heavy lifting. 
&lt;li&gt;
The discussion about optimizations is interesting, and while I think he glosses over
some issues and hyper-focuses on others, two points stand out, in my mind: performance
hits often come from places you don't expect, and that micro-benchmarks generally
don't prove much of anything. Sometimes that hit will come from the language, and
sometimes that hit will come from something entirely differently. &lt;em&gt;Profile first&lt;/em&gt;.
Don't let your intuition get in the way, because your intuition sucks. Mine does,
too, by the way--there's just too many moving parts to be able to keep it all straight
in your head.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Steve then launches into a series of Q&amp;amp;A with the audience, but we'll let the
light dim on that stage, and turn our attention over to Cedric's response.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;"... the overall idea is that dynamically typed languages are on the rise and
statically typed languages are on their way out."&lt;/em&gt; Actually, the transcript &lt;em&gt;I&lt;/em&gt; read
seemed to imply that Steve thought that dynamically typed languages are cool but that
nobody will use them for a variety of reasons, some of which he agreed with. I thoroughly
disagree with Steve's conclusion there, by the way, but so be it ... 
&lt;li&gt;
&lt;em&gt;"I'm happy to be the Luke Skywalker to his Darth Vader. ... Evil shall not prevail."&lt;/em&gt; Yes,
let's not let this debate fall into the &lt;em&gt;pseudo&lt;/em&gt;-religious category, shall
we? Fully religious debates have &lt;em&gt;such&lt;/em&gt; a better track record of success, so
let's just make it "good vs evil", in order to &lt;em&gt;ensure&lt;/em&gt; emotions get all neatly
wrapped throughout. Just remember, Cedric, even Satan can quote the Bible... and it
was Jesus telling us that, so if you disagree with anything I say below you must be
some kind of Al-Qaeda terrorist. Or something. 
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;[Editor's note: Oh, shit, he did NOT just call Cedric a terrorist and a Satanist
and invoke the name of Christ in all this. Time to roll out the disclaimer... "Ladies
and gentlemen, the views and opinions expressed in this blog entry...."]&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;[Author's note: For the humor-challenged in the crowd, no I do &lt;/em&gt;not&lt;em&gt; think
Cedric is a terrorist. I &lt;/em&gt;like&lt;em&gt; Cedric, and hopefully he still likes me, too.
Of course, I have also been accused of being the Antichrist, so what that says about
Cedric I'm not sure.]&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Cedric on Scala: 
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;"Have you taken a look at implicits? Seriously? Just when I thought we were not
just done realizing that global variables are bad, but we have actually come up with
better ways to leverage the concept with DI frameworks such as Guice, Scala knocks
the wind out of us with implicits and all our hardly earned knowledge about side effects
is going down the drain again."&lt;/em&gt; Umm.... Cedric? One reaction comes to mind here,
and it's best expressed as.... WTF?!? Implicits are not global variables or DI, they're
more a way of doing conversions, a la autoboxing but more flexible. I agree that casual
use of implicits can get you in trouble, but I'd have thought Scala's "there are no
operators just methods with funny names" would be the more disconcerting of the two. 
&lt;li&gt;
&lt;em&gt;"As for pattern matching, it makes me feel as if all the careful data abstraction
that I have built inside my objects in order to isolate them from the unforgiving
world are, again, thrown out of the window because I am now forced to write deconstructors
to expose all this state just so my classes can be put in a statement that doesn't
even have the courtesy to dress up as something that doesn't smell like a switch/case..."&lt;/em&gt; I
suppose if you looked at pattern-matching and saw nothing more than a switch/case,
then I'd agree with you, but it turns out that pattern-matching is a lot more powerful
than just being a switch/case. I &lt;em&gt;think&lt;/em&gt; what Cedric's opposing is the fact
that pattern-matching can actually bind to variables expressed in the individual match
clauses, which might look like deconstructors exposing state... but that's not the
way they get used, from what I've seen thus far. But, hey, just because the language
offers it, people will use it wrongly, right? So God forbid a language's library should
allow me to, say, execute private methods or access private fields....&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Cedric on the difficulty to impose a non-mainstream language in the industry: &lt;em&gt;"Let
me turn the table on you and imagine that one of your coworkers comes to you and tells
you that he really wants to implement his part of the project in this awesome language
called Draco. How would you react? Well, you're a pragmatic kind of guy and even though
the idea seems wacky, I'm sure you would start by doing some homework (which would
show you that Draco was an awesome language used back in the days on the Amiga). Reading
up on Draco, you realize that it's indeed a very cool language that has some features
that are a good match for the problem at hand. But even as you realize this, you already
know what you need to tell that guy, right? Probably something like "You're out of
your mind, go back to Eclipse and get cranking". And suddenly, you've become *that*
guy. Just because you showed some common sense."&lt;/em&gt; If, I suppose, we equate "common
sense" with "thinking the way Cedric does", sure, that makes sense. But you know,
if it turned out that I was writing something that targeted the Amiga, and Draco did,
in fact, give us a huge boost on the competition, and the drawbacks of using Draco
seemed to pale next to the advantages of using it, then... Well, gawrsh, boss, it
jus' might make &lt;em&gt;sense&lt;/em&gt; to use 'dis har Draco thang, even tho it ain't Java.
This is called &lt;em&gt;risk mitigation&lt;/em&gt;, and frankly, it's something too few companies
go through because they've "standardized" on a language and API set across the company
that's hardly applicable to the problem at hand. Don't get me wrong--you don't want
the opposite extreme, which is total anarchy in the operations center as people use
any and all languages/platforms available to them on a willy-nilly basis, but the
funny thing is, this is a &lt;em&gt;continuum&lt;/em&gt;, not a binary switch. This is where languages-on-execution-engines
(like the JVM or CLR) gets such a great win-win condition: IT can just think in terms
of supporting the JVM or CLR, and developers can then think in whatever language they
want, so long it compiles/runs on those platforms. 
&lt;li&gt;
Cedric on building tools for dynamic languages: &lt;em&gt;"I still strongly disagree with
that. It is different *and* harder (and in some cases, &lt;/em&gt;&lt;a href="http://beust.com/weblog/archives/000414.html"&gt;&lt;em&gt;impossible&lt;/em&gt;&lt;/a&gt;&lt;em&gt;).
Your point regarding the fact that static refactoring doesn't cover 100% of the cases
is well taken, but it's 1) darn close to 100% and 2) getting closer to it much faster
than any dynamic tool ever could. By the way, Java refactorings correcting comments,
XML and property files are getting pretty common these days, but good luck trying
to perform a reliable method renaming in 100 Ruby files."&lt;/em&gt; I'm not going to weigh
in here, since I don't write tools for either dynamic or static languages, but watching
what the IntelliJ IDEA guys are doing with Groovy, and what the NetBeans guys are
doing with Ruby, I'm more inclined to believe in what Steve thinks than what Cedric
does. As for the "reliable method renaming in 100 Ruby files", I don't know this for
a fact, but I'll be willing to be that we're a lot closer to that than Cedric thinks
we are. &lt;em&gt;(I'd love to hear comments from somebody neck-deep in the Ruby crowd who's
done this and their experience doing so.)&lt;/em&gt; 
&lt;li&gt;
Cedric on generics: &lt;em&gt;"I no longer bother trying to understand why complex Generic
examples are so... well, darn complex. Yes, it's pretty darn hard to follow sometimes,
but here are a few points for you to ponder: &lt;/em&gt; 
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;90% of the Java programmers (including myself) only ever use Generics for Collections. &lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;These same programmers never go as far as nesting two Generic declarations. &lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;For API developers and users alike, Generics are a huge progress. &lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Scala still requires you to understand covariance and contravariance (but with
different rules. People seem to say that Scala's rules are simpler, I'm not so sure,
but not interested in finding out for the aforementioned reasons)."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
Honestly, Cedric, the fact that 90% of the Java programmers are only using generics
for collections doesn't sway me in the slightest. 90% of the world's population doesn't
use Calculus, either, but that doesn't mean that it's not useful, or that we shouldn't
be trying to improve our understanding of it and how to do useful things with it.
After looking at what the C++ community has done with templates (the Boost libraries)
and what .NET is doing with its generic system (LINQ and F# to cite two examples),
I think Java missed a &lt;em&gt;huge&lt;/em&gt; opportunity with generics. Type erasure may have
made sense in a world where Java was the only practical language on top of the JVM,
but in a world that's coming to accept Groovy and JRuby and Scala as potential equals
on the JVM, it makes no sense whatsoever. Meanwhile, when thinking about Scala, let's
take careful note that a Scala programmer can go a &lt;em&gt;long&lt;/em&gt; way with the langauge
before having to think about covariance, contravariance, upper and lower type bounds,
simpler or not. (For what it's worth, I agree with you, I'm not sure if they're simpler,
either.) 
&lt;li&gt;
Cedric on dynamic language performance: &lt;em&gt;"What will keep preventing dynamically
typed languages from displacing statically typed ones in large scale software is not
performance, it's the simple fact that it's impossible to make sense of a giant ball
of typeless source files, which causes automatic refactorings to be unreliable, hence
hardly applicable, which in turn makes developers scared of refactoring. And it's
all downhill from there. Hello bit rot."&lt;/em&gt; There's a certain circular logic here--if
we presume that IDEs can't make sense of "typeless source files" (I wasn't aware that &lt;em&gt;any&lt;/em&gt; source
file was statically typed, honestly--this must be something Google teaches), then
it follows that refactoring will be impossible or at least unreliable, and thus a
giant ball of them will be unmanageable. I disagree with Cedric's premise--that IDEs
can't make sense of dynamic language code--so therefore I disagree with the entire
logical chain as a result. What I &lt;em&gt;don't&lt;/em&gt; disagree with is the implicit presumption
that the larger the dynamic language source base, the harder it is to keep straight
in your head. In fact, I'll even amend that statement further: the larger the source
base (dynamic or otherwise), the harder it is to keep straight in your head. Abstractions
are key to the long-term success of any project, so the language I work with had best
be able to help me create those abstractions, or I'm in trouble once I cross a certain
threshold. That's true regardless of the language: C++, Java, C#, Ruby, or whatever.
That's one of the reasons I'm spending time trying to get my head around Lisp and
Scheme, because those languages were all about building abstractions upon abstractions
upon abstractions, but in libraries, rather than in the language itself, so they could
be swapped out and replaced with something else when the abstractions failed or needed
evolution. 
&lt;li&gt;
Cedric on program unmaintainability: &lt;em&gt;"I hate giving anecdotal evidence to support
my points, but that won't stop me from telling a short story that happened to me just
two weeks ago: I found myself in this very predicament when trying to improve a Ruby
program that 1) I just wrote a few days before and 2) is 200 lines long. I was staring
at an object, trying to remember what it does, failing, searching manually in emacs
where it was declared, found it as a "Hash", and then realized I still had no idea
what the darn thing is. You see my point..."&lt;/em&gt; Ain't nothing wrong with anecdotal
evidence, Cedric. We all have it, and if we all examine it &lt;em&gt;en masse&lt;/em&gt;, some
interesting patterns can emerge. Funny thing is, I've had exactly the same experience
with C++ code, Java code, and C# code. What does that tell you? It tells me that I
probably should have cooked up some better abstractions for those particular snippets,
and that's what I ended up doing. As a matter of fact, I just helped a buddy of mine
untangle some Ruby code to turn it into C#, and despite the fact that he's never written
(or read) a Ruby program in his life, we managed to flip it over to C# in a couple
of hours, including the execution of Ruby code blocks (I &lt;em&gt;love&lt;/em&gt; anonymous methods)
stored in a string-keyed hash within an array. And this was Ruby code that neither
of us had ever seen before, much less written it a few days prior. 
&lt;li&gt;
Cedric (and Steve) on error messages: &lt;em&gt;"[Steve said] And the weird thing is, I
realized early in my career that I would actually rather have a runtime error than
a compile error. [Cedric responded] You probably already know this, but you drew the
wrong conclusion. You didn't want a runtime error, you wanted a clear error. One that
doesn't lie to you, like CFront (and a lot of C++ compilers even today, I hear) used
to spit in our faces. And once I have a clear error message, I much prefer to have
it as early as possible, thank you very much."&lt;/em&gt; Honestly, I agree with Cedric
here: I would much prefer errors &lt;em&gt;before&lt;/em&gt; execution, as early as possible,
so that there's less chance of my users finding the errors I haven't found yet. And
I agree that some of the error messages we sometimes get are pretty incomprehensible,
particularly from the C++ compiler during template expansion. But how is that different
from the ubiquitous Java "ClassCastException: Cannot cast Person to Person" that arises
from time to time? Once you know what the message is telling you, it's easy to know
how to fix it, but getting to the point of knowing what the error message is telling
you requires a good working understanding of Java ClassLoaders. Do we really expect
that any tool--static or dynamic, compiler or runtime, is going to be able to produce
error messages that somehow precludes the need to have the necessary background to
understand it? &lt;em&gt;All errors are relative to the context from which they are born.&lt;/em&gt; If
you lack that context, the error message, no matter how well-written or phrased, is
useless. 
&lt;li&gt;
Cedric on "The dynamic nuclear winter": &lt;em&gt;"[Steve said] And everybody else went
and chased static. And they've been doing it like crazy. And they've, in my opinion,
reached the theoretical bounds of what they can deliver, and it has FAILED. [Cedric
responded] Quite honestly, words fail me here."&lt;/em&gt; Wow. Just... wow. I can't agree
with Steve at all, that static(ically typed languages) has FAILED, or that they've
reached the theoretical bounds of what they can deliver, but neither can I say with
complete confidence that statically-typed languages are The Way Forward, either. I
think, for the time, chasing statically-typed languages was the right thing to do,
because for a long time we were in a position where programmer time was cheaper than
computer time; now, I believe that this particular metric has flipped, and that it's
time we started thinking about what the costs of programmer time really are. (Frankly,
I'd love to see a double-blind study on this, but I've no idea how one would carry
that out in a scientific manner.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
So.... what's left?
&lt;/p&gt;
&lt;p&gt;
Oh, right: if Steve/Vader is Cedric/Luke's father, then who is Cedric/Luke's sister,
and why is she wearing a copper-wire bikini while strangling the Haskell/ML crowd/Jabba
the Hutt?
&lt;/p&gt;
&lt;p&gt;
Maybe this whole Star Wars analogy thing was a bad idea.
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
Look, at the end of the day, the whole static-vs-dynamic thing is a red herring. &lt;em&gt;It
doesn't matter&lt;/em&gt;. The crucial question is whether or not the language being used
does two things, and how well it does them:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Provide the ability to express the concept in your head, and 
&lt;li&gt;
Provide the ability to evolve as the concepts in your head evolve&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
There are certain things that are just impossible to do in C++, for example. I cannot
represent the C++ AST inside the program itself. (Before you jump all over me, C++ers
of the world, take careful note: I'm &lt;em&gt;not&lt;/em&gt; saying that C++ cannot represent
an AST, but an AST of &lt;em&gt;itself&lt;/em&gt;, at the time it is executing.) This is something
dynamic languages--most notably Lisp, but also other languages, including Ruby--do
pretty well, because they're building the AST at runtime anyway, in order to execute
the code in the first place. &lt;em&gt;Could&lt;/em&gt; C++ do this? Perhaps, but the larger question
is, would any self-respecting C++ programmer &lt;em&gt;want&lt;/em&gt; to? Look at your average
Ruby program--80% to 90% (the number may vary, but most of the Rubyists I talk to
agree its somewhere in this range) of the program isn't really using the meta-object
capabilities of the language, and is just a "simpler/easier/scarier/unchecked" object
language. Most of the weird-*ss Rubyisms don't show up in your average Ruby program,
but are buried away in some library someplace, and away from the view of the average
Ruby programmer.
&lt;/p&gt;
&lt;p&gt;
Keep the simple things simple, and make the hard things possible. That' should be
the overriding goal of any language, library, or platform.
&lt;/p&gt;
&lt;p&gt;
Erik Meijer coined this idea first, and I like it a lot: Why can't we operate on a
basic principle of "static when we can (or should), dynamic otherwise"? (Reverse that
if it makes you feel better: "dynamic when we can, static otherwise", because the
difference is really only one of gradation. It's also an interesting point for discussion,
just how much of each is necessary/desirable.) Doing this means we get the best of
both worlds, and we can stop this Galactic Civil War before anybody's planet gets
blown up.
&lt;/p&gt;
&lt;p&gt;
'Cuz that would suck.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=a00766d9-6994-4611-8bc1-e6b169167949" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,a00766d9-6994-4611-8bc1-e6b169167949.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>F#</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=94fda66c-4dda-438c-af27-a53a8e0692c8</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,94fda66c-4dda-438c-af27-a53a8e0692c8.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,94fda66c-4dda-438c-af27-a53a8e0692c8.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=94fda66c-4dda-438c-af27-a53a8e0692c8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently, a former student asked me,
</p>
        <blockquote>
          <p>
I was in a .NET web services training class that you gave probably 4 or so years ago
on-site at a <em>[company name]</em> office in <em>[city]</em>, north of Atlanta. 
At that time I asked you for a list of the technical blogs that you read, and I am
curious which blogs you are reading now.  I am now with a small company where
I have to be a jack of all trades, in the last year I have worked in C++ and Perl
backend type projects and web frontend projects with Java, C#, and RoR, so I find
your perspective interesting since you also work with various technologies and aren't
a zealot for a specific one.
</p>
          <p>
Any way, please either respond by email or in your blog, because I think that others
may be interested in the list also.
</p>
        </blockquote>
        <p>
As one might expect, my blog list is a bit eclectic, but I suppose that's part of
the charm of somebody looking to study Java, .NET, C++, Smalltalk, Ruby, Parrot, LLVM,
and other languages and environments. So, without further ado, I've pasted in the
contents of my OPML file for cut&amp;paste and easy import.
</p>
        <p>
Having said that, though, I would strongly suggest <em>not</em> just blindly importing
the whole set of feeds into your nearest RSS reader, but take a moment and go visit
each one before you add it. It takes longer, granted, but the time spent is a worthy
investment--you don't want to have to declare "blog bankruptcy".
</p>
        <blockquote>
          <p>
            <em>Editor's note: We pause here as readers look at each other and go... "WTF?!?"</em>
          </p>
        </blockquote>
        <p>
"Blog bankruptcy" is a condition similar to "email bankruptcy", when otherwise perfectly
high-functioning people give up on trying to catch up to the flood of messages in
their email client's Inbox and delete the whole mess (usually with some kind of public
apology explaining why and asking those who've emailed them in the past to resend
something if it was really important), effectively trying to "start over" with their
email in much the same way that Chapter Seven or Chapter Eleven allows companies to
"start over" with their creditors, or declaring bankruptcy allows private citizens
to do the same with theirs. "Blog bankruptcy" is a similar kind of condition: your
RSS reader becomes so full of stuff that you can't keep up, and you can't even remember
which blogs were the interesting ones, so you nuke the whole thing and get away from
the blog-reading thing for a while.
</p>
        <p>
This happened to me, in fact: a few years ago, when I became the editor-in-chief of
TheServerSide.NET, I asked a few folks for their OPML lists, so that I could quickly
and easily build a list of blogs that would "tune me in" to the software industry
around me, and many of them quite agreeably complied. I took my RSS reader (Newsgator,
at the time) and dutifully imported all of them, and ended up with a collection of
blogs that was easily into the hundreds of feeds long. And, over time, I found myself
reading fewer and fewer blogs, mostly because the whole set was so... <em>intimidating</em>.
I mean, I would pick at the list of blogs and their entries in the same way that I
picked at vegetables on my plate as a child--half-heartedly, with no real enthusiasm,
as if this was something my parents were forcing me to do. That just ruined the experience
of blog-reading for me, and eventually (after I left TSS.NET for other pastures),
I nuked the whole thing--even going so far as to uninstall my copy of Newsgator--and
gave up.
</p>
        <p>
Naturally, I missed it, and slowly over time began to rebuild the list, this time,
taking each feed one at a time, carefully weighing what value the feed was to me and
selecting only those that I thought had a high signal-to-noise ratio. (This is partly
why I don't include much "personal" info in this blog--I found myself routinely stripping
away those blogs that had more personal content and less technical content, and I
figured if I didn't want to read it, others probably felt the same way.) Over the
last year or two, I've rebuilt the list to the point where I probably need to prune
a bit and close a few of them back down, but for now, I'm happy with the list I've
got.
</p>
        <p>
And speaking of which....
</p>
        <div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum1" style="color: #606060"> 1:</span>
              <span style="color: #0000ff">&lt;?</span>
              <span style="color: #800000">xml</span>
              <span style="color: #ff0000">version</span>
              <span style="color: #0000ff">="1.0"</span>?<span style="color: #0000ff">&gt;</span></pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum2" style="color: #606060"> 2:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">opml</span>
              <span style="color: #ff0000">version</span>
              <span style="color: #0000ff">="1.0"</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum3" style="color: #606060"> 3:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">head</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum4" style="color: #606060"> 4:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">title</span>
              <span style="color: #0000ff">&gt;</span>OPML
exported from Outlook<span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span></pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum5" style="color: #606060"> 5:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">dateCreated</span>
              <span style="color: #0000ff">&gt;</span>Thu,
15 May 2008 20:55:19 -0700<span style="color: #0000ff">&lt;/</span><span style="color: #800000">dateCreated</span><span style="color: #0000ff">&gt;</span></pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum6" style="color: #606060"> 6:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">dateModified</span>
              <span style="color: #0000ff">&gt;</span>Thu,
15 May 2008 20:55:19 -0700<span style="color: #0000ff">&lt;/</span><span style="color: #800000">dateModified</span><span style="color: #0000ff">&gt;</span></pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum7" style="color: #606060"> 7:</span>
              <span style="color: #0000ff">&lt;/</span>
              <span style="color: #800000">head</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum8" style="color: #606060"> 8:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">body</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum9" style="color: #606060"> 9:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="If
broken it is, fix it you should"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum10" style="color: #606060"> 10:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/tess/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum11" style="color: #606060"> 11:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Artima
Developer Buzz"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum12" style="color: #606060"> 12:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://www.artima.com/news/feeds/news.rss"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum13" style="color: #606060"> 13:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Artima
Weblogs"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum14" style="color: #606060"> 14:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://www.artima.com/weblogs/feeds/weblogs.rss"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum15" style="color: #606060"> 15:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Artima
Chapters Library"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum16" style="color: #606060"> 16:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://www.artima.com/chapters/feeds/chapters.rss"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum17" style="color: #606060"> 17:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Neal
Gafter's blog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum18" style="color: #606060"> 18:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://gafter.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum19" style="color: #606060"> 19:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Room
101"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum20" style="color: #606060"> 20:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://gbracha.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum21" style="color: #606060"> 21:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Kelly
O'Hair's Blog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum22" style="color: #606060"> 22:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://weblogs.java.net/blog/kellyohair/index.rdf"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum23" style="color: #606060"> 23:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="John
Rose @ Sun"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum24" style="color: #606060"> 24:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.sun.com/jrose/feed/entries/atom"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum25" style="color: #606060"> 25:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="The
Daily WTF"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum26" style="color: #606060"> 26:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://syndication.thedailywtf.com/TheDailyWtf"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum27" style="color: #606060"> 27:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Brad
Wilson"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum28" style="color: #606060"> 28:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.feedburner.com/BradWilson"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum29" style="color: #606060"> 29:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Mike
Stall's .NET Debugging Blog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum30" style="color: #606060"> 30:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/jmstall/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum31" style="color: #606060"> 31:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Stevey's
Blog Rants"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum32" style="color: #606060"> 32:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://steve-yegge.blogspot.com/atom.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum33" style="color: #606060"> 33:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Brendan's
Roadmap Updates"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum34" style="color: #606060"> 34:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://weblogs.mozillazine.org/roadmap/index.rdf"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum35" style="color: #606060"> 35:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="pl
patterns"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum36" style="color: #606060"> 36:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://plpatterns.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum37" style="color: #606060"> 37:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Joel
Pobar's weblog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum38" style="color: #606060"> 38:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.feedburner.com/callvirt"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum39" style="color: #606060"> 39:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Let&amp;amp;#39;s
Kill Dave!"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum40" style="color: #606060"> 40:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://letskilldave.com/rss.aspx"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum41" style="color: #606060"> 41:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Why
does everything suck?"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum42" style="color: #606060"> 42:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://whydoeseverythingsuck.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum43" style="color: #606060"> 43:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="cdiggins.com"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://cdiggins.com/feed"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum44" style="color: #606060"> 44:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="LukeH's
WebLog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum45" style="color: #606060"> 45:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/lukeh/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum46" style="color: #606060"> 46:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Jomo
Fisher -- Sharp Things"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum47" style="color: #606060"> 47:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/jomo_fisher/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum48" style="color: #606060"> 48:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Chance
Coble"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum49" style="color: #606060"> 49:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://leibnizdream.wordpress.com/feed/"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum50" style="color: #606060"> 50:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Don
Syme's WebLog on F# and Other Research Projects"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum51" style="color: #606060"> 51:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/dsyme/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum52" style="color: #606060"> 52:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="David
Broman's CLR Profiling API Blog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum53" style="color: #606060"> 53:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/davbr/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum54" style="color: #606060"> 54:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="JScript
Blog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum55" style="color: #606060"> 55:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/jscript/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum56" style="color: #606060"> 56:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Yet
Another Language Geek"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum57" style="color: #606060"> 57:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/wesdyer/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum58" style="color: #606060"> 58:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">=".NET
Languages Weblog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum59" style="color: #606060"> 59:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://www.dotnetlanguages.net/DNL/Rss.aspx"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum60" style="color: #606060"> 60:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="DevHawk"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum61" style="color: #606060"> 61:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.feedburner.com/Devhawk"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum62" style="color: #606060"> 62:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="The
Cobra Programming Language"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum63" style="color: #606060"> 63:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://cobralang.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum64" style="color: #606060"> 64:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Code
Miscellany"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum65" style="color: #606060"> 65:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://codemiscellany.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum66" style="color: #606060"> 66:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Fred,
Let it go!"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum67" style="color: #606060"> 67:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://freddy33.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum68" style="color: #606060"> 68:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Codedependent"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum69" style="color: #606060"> 69:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://graphics-geek.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum70" style="color: #606060"> 70:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Presentation
Zen"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum71" style="color: #606060"> 71:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://www.presentationzen.com/presentationzen/index.rdf"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum72" style="color: #606060"> 72:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="The
Extreme Presentation(tm) Method"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum73" style="color: #606060"> 73:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://extremepresentation.typepad.com/blog/index.rdf"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum74" style="color: #606060"> 74:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="ZapThink"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum75" style="color: #606060"> 75:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.feedburner.com/zapthink"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum76" style="color: #606060"> 76:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Chris
Smith's completely unique view"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum77" style="color: #606060"> 77:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.feedburner.com/ChrisSmithsCompletelyUniqueView"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum78" style="color: #606060"> 78:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Code
Commit"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum79" style="color: #606060"> 79:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.codecommit.com/codecommit"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum80" style="color: #606060"> 80:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum81" style="color: #606060"> 81:</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Comments
on Ola Bini: Programming Language Synchronicity: A New Hope: Polyglotism"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum82" style="color: #606060"> 82:</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum83" style="color: #606060"> 83:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://ola-bini.blogspot.com/feeds/5778383724683099288/comments/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum84" style="color: #606060"> 84:</span>
              <span style="color: #0000ff">&lt;/</span>
              <span style="color: #800000">body</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum85" style="color: #606060"> 85:</span>
              <span style="color: #0000ff">&lt;/</span>
              <span style="color: #800000">opml</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
          </div>
        </div>
        <p>
Happy reading.....
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=94fda66c-4dda-438c-af27-a53a8e0692c8" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Blogs I'm currently reading</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,94fda66c-4dda-438c-af27-a53a8e0692c8.aspx</guid>
      <link>http://blogs.tedneward.com/2008/05/16/Blogs+Im+Currently+Reading.aspx</link>
      <pubDate>Fri, 16 May 2008 07:08:07 GMT</pubDate>
      <description>&lt;p&gt;
Recently, a former student asked me,
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I was in a .NET web services training class that you gave probably 4 or so years ago
on-site at a &lt;em&gt;[company name]&lt;/em&gt; office in &lt;em&gt;[city]&lt;/em&gt;, north of Atlanta.&amp;nbsp;
At that time I asked you for a list of the technical blogs that you read, and I am
curious which blogs you are reading now.&amp;nbsp; I am now with a small company where
I have to be a jack of all trades, in the last year I have worked in C++ and Perl
backend type projects and web frontend projects with Java, C#, and RoR, so I find
your perspective interesting since you also work with various technologies and aren't
a zealot for a specific one.
&lt;/p&gt;
&lt;p&gt;
Any way, please either respond by email or in your blog, because I think that others
may be interested in the list also.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
As one might expect, my blog list is a bit eclectic, but I suppose that's part of
the charm of somebody looking to study Java, .NET, C++, Smalltalk, Ruby, Parrot, LLVM,
and other languages and environments. So, without further ado, I've pasted in the
contents of my OPML file for cut&amp;amp;paste and easy import.
&lt;/p&gt;
&lt;p&gt;
Having said that, though, I would strongly suggest &lt;em&gt;not&lt;/em&gt; just blindly importing
the whole set of feeds into your nearest RSS reader, but take a moment and go visit
each one before you add it. It takes longer, granted, but the time spent is a worthy
investment--you don't want to have to declare "blog bankruptcy".
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Editor's note: We pause here as readers look at each other and go... "WTF?!?"&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
"Blog bankruptcy" is a condition similar to "email bankruptcy", when otherwise perfectly
high-functioning people give up on trying to catch up to the flood of messages in
their email client's Inbox and delete the whole mess (usually with some kind of public
apology explaining why and asking those who've emailed them in the past to resend
something if it was really important), effectively trying to "start over" with their
email in much the same way that Chapter Seven or Chapter Eleven allows companies to
"start over" with their creditors, or declaring bankruptcy allows private citizens
to do the same with theirs. "Blog bankruptcy" is a similar kind of condition: your
RSS reader becomes so full of stuff that you can't keep up, and you can't even remember
which blogs were the interesting ones, so you nuke the whole thing and get away from
the blog-reading thing for a while.
&lt;/p&gt;
&lt;p&gt;
This happened to me, in fact: a few years ago, when I became the editor-in-chief of
TheServerSide.NET, I asked a few folks for their OPML lists, so that I could quickly
and easily build a list of blogs that would "tune me in" to the software industry
around me, and many of them quite agreeably complied. I took my RSS reader (Newsgator,
at the time) and dutifully imported all of them, and ended up with a collection of
blogs that was easily into the hundreds of feeds long. And, over time, I found myself
reading fewer and fewer blogs, mostly because the whole set was so... &lt;em&gt;intimidating&lt;/em&gt;.
I mean, I would pick at the list of blogs and their entries in the same way that I
picked at vegetables on my plate as a child--half-heartedly, with no real enthusiasm,
as if this was something my parents were forcing me to do. That just ruined the experience
of blog-reading for me, and eventually (after I left TSS.NET for other pastures),
I nuked the whole thing--even going so far as to uninstall my copy of Newsgator--and
gave up.
&lt;/p&gt;
&lt;p&gt;
Naturally, I missed it, and slowly over time began to rebuild the list, this time,
taking each feed one at a time, carefully weighing what value the feed was to me and
selecting only those that I thought had a high signal-to-noise ratio. (This is partly
why I don't include much "personal" info in this blog--I found myself routinely stripping
away those blogs that had more personal content and less technical content, and I
figured if I didn't want to read it, others probably felt the same way.) Over the
last year or two, I've rebuilt the list to the point where I probably need to prune
a bit and close a few of them back down, but for now, I'm happy with the list I've
got.
&lt;/p&gt;
&lt;p&gt;
And speaking of which....
&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="1.0"&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt; 2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;opml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="1.0"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt; 4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;OPML
exported from Outlook&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt; 5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;dateCreated&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Thu,
15 May 2008 20:55:19 -0700&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;dateCreated&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt; 6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;dateModified&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Thu,
15 May 2008 20:55:19 -0700&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;dateModified&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt; 7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt; 8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum9" style="color: #606060"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="If
broken it is, fix it you should"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum10" style="color: #606060"&gt; 10:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/tess/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum11" style="color: #606060"&gt; 11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Artima
Developer Buzz"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum12" style="color: #606060"&gt; 12:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.artima.com/news/feeds/news.rss"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum13" style="color: #606060"&gt; 13:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Artima
Weblogs"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum14" style="color: #606060"&gt; 14:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.artima.com/weblogs/feeds/weblogs.rss"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum15" style="color: #606060"&gt; 15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Artima
Chapters Library"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum16" style="color: #606060"&gt; 16:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.artima.com/chapters/feeds/chapters.rss"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum17" style="color: #606060"&gt; 17:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Neal
Gafter's blog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum18" style="color: #606060"&gt; 18:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://gafter.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum19" style="color: #606060"&gt; 19:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Room
101"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum20" style="color: #606060"&gt; 20:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://gbracha.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum21" style="color: #606060"&gt; 21:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Kelly
O'Hair's Blog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum22" style="color: #606060"&gt; 22:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://weblogs.java.net/blog/kellyohair/index.rdf"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum23" style="color: #606060"&gt; 23:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="John
Rose @ Sun"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum24" style="color: #606060"&gt; 24:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.sun.com/jrose/feed/entries/atom"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum25" style="color: #606060"&gt; 25:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="The
Daily WTF"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum26" style="color: #606060"&gt; 26:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://syndication.thedailywtf.com/TheDailyWtf"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum27" style="color: #606060"&gt; 27:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Brad
Wilson"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum28" style="color: #606060"&gt; 28:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.feedburner.com/BradWilson"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum29" style="color: #606060"&gt; 29:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Mike
Stall's .NET Debugging Blog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum30" style="color: #606060"&gt; 30:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/jmstall/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum31" style="color: #606060"&gt; 31:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Stevey's
Blog Rants"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum32" style="color: #606060"&gt; 32:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://steve-yegge.blogspot.com/atom.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum33" style="color: #606060"&gt; 33:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Brendan's
Roadmap Updates"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum34" style="color: #606060"&gt; 34:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://weblogs.mozillazine.org/roadmap/index.rdf"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum35" style="color: #606060"&gt; 35:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="pl
patterns"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum36" style="color: #606060"&gt; 36:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://plpatterns.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum37" style="color: #606060"&gt; 37:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Joel
Pobar's weblog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum38" style="color: #606060"&gt; 38:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.feedburner.com/callvirt"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum39" style="color: #606060"&gt; 39:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Let&amp;amp;amp;#39;s
Kill Dave!"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum40" style="color: #606060"&gt; 40:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://letskilldave.com/rss.aspx"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum41" style="color: #606060"&gt; 41:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Why
does everything suck?"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum42" style="color: #606060"&gt; 42:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://whydoeseverythingsuck.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum43" style="color: #606060"&gt; 43:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="cdiggins.com"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://cdiggins.com/feed"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum44" style="color: #606060"&gt; 44:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="LukeH's
WebLog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum45" style="color: #606060"&gt; 45:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/lukeh/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum46" style="color: #606060"&gt; 46:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Jomo
Fisher -- Sharp Things"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum47" style="color: #606060"&gt; 47:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/jomo_fisher/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum48" style="color: #606060"&gt; 48:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Chance
Coble"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum49" style="color: #606060"&gt; 49:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://leibnizdream.wordpress.com/feed/"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum50" style="color: #606060"&gt; 50:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Don
Syme's WebLog on F# and Other Research Projects"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum51" style="color: #606060"&gt; 51:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/dsyme/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum52" style="color: #606060"&gt; 52:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="David
Broman's CLR Profiling API Blog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum53" style="color: #606060"&gt; 53:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/davbr/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum54" style="color: #606060"&gt; 54:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="JScript
Blog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum55" style="color: #606060"&gt; 55:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/jscript/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum56" style="color: #606060"&gt; 56:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Yet
Another Language Geek"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum57" style="color: #606060"&gt; 57:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/wesdyer/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum58" style="color: #606060"&gt; 58:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=".NET
Languages Weblog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum59" style="color: #606060"&gt; 59:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.dotnetlanguages.net/DNL/Rss.aspx"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum60" style="color: #606060"&gt; 60:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="DevHawk"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum61" style="color: #606060"&gt; 61:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.feedburner.com/Devhawk"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum62" style="color: #606060"&gt; 62:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="The
Cobra Programming Language"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum63" style="color: #606060"&gt; 63:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://cobralang.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum64" style="color: #606060"&gt; 64:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Code
Miscellany"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum65" style="color: #606060"&gt; 65:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://codemiscellany.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum66" style="color: #606060"&gt; 66:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Fred,
Let it go!"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum67" style="color: #606060"&gt; 67:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://freddy33.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum68" style="color: #606060"&gt; 68:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Codedependent"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum69" style="color: #606060"&gt; 69:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://graphics-geek.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum70" style="color: #606060"&gt; 70:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Presentation
Zen"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum71" style="color: #606060"&gt; 71:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.presentationzen.com/presentationzen/index.rdf"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum72" style="color: #606060"&gt; 72:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="The
Extreme Presentation(tm) Method"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum73" style="color: #606060"&gt; 73:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://extremepresentation.typepad.com/blog/index.rdf"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum74" style="color: #606060"&gt; 74:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ZapThink"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum75" style="color: #606060"&gt; 75:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.feedburner.com/zapthink"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum76" style="color: #606060"&gt; 76:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Chris
Smith's completely unique view"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum77" style="color: #606060"&gt; 77:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.feedburner.com/ChrisSmithsCompletelyUniqueView"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum78" style="color: #606060"&gt; 78:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Code
Commit"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum79" style="color: #606060"&gt; 79:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.codecommit.com/codecommit"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum80" style="color: #606060"&gt; 80:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum81" style="color: #606060"&gt; 81:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Comments
on Ola Bini: Programming Language Synchronicity: A New Hope: Polyglotism"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum82" style="color: #606060"&gt; 82:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum83" style="color: #606060"&gt; 83:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://ola-bini.blogspot.com/feeds/5778383724683099288/comments/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum84" style="color: #606060"&gt; 84:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum85" style="color: #606060"&gt; 85:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;opml&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Happy reading.....
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=94fda66c-4dda-438c-af27-a53a8e0692c8" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,94fda66c-4dda-438c-af27-a53a8e0692c8.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>F#</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=4a44324b-e95c-4ba9-b5ab-a38e8166cdb4</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,4a44324b-e95c-4ba9-b5ab-a38e8166cdb4.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,4a44324b-e95c-4ba9-b5ab-a38e8166cdb4.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4a44324b-e95c-4ba9-b5ab-a38e8166cdb4</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Not too long ago, <a href="http://pluralsight.com/blogs/dbox/archive/2008/04/29/50808.aspx">Don
wrote</a>:
</p>
        <blockquote>
          <p>
The three most “personal” choices a developer makes are language, tool, and OS.
</p>
        </blockquote>
        <p>
No.
</p>
        <p>
That may be true for somebody who works for a large commercial or open source vendor,
whose team is building something that fits into one of those three categories and
wants to see that language/tool/OS succeed.
</p>
        <p>
That is not where most of us live. If you do, certainly, you are welcome to your opinion,
but please accept with good grace that your agenda is not the same as my own.
</p>
        <p>
Most of us in the practitioner space are <em>using</em> languages, tools and OSes
to solve customer problems, and making the decision to use a particular language,
tool or OS a personal one generally gets us into trouble--how many developers do you
know that identify themselves so closely with that decision that they include it in
their personal metadata? 
</p>
        <p>
"Hi, I'm Joe, and I'm a Java programmer."
</p>
        <p>
Or, "Oh, good God, you're running Windows? What are you, some kind of Micro$oft lover
or something?"
</p>
        <p>
Or, "Linux? You really <em>are</em> a geek, aren't you? Recompiled your kernel lately
(snicker, snicker)?"
</p>
        <p>
Sorry, but all of those make me want to hurl. Of these kinds of statements are technical
zealotry and flame wars built. When programmers embed their choice so deeply into
their psyche that it becomes the tagline by which they identify themselves, it becomes
an "ego" thing instead of a "tool" thing. 
</p>
        <p>
What's more, it involves customers and people outside the field in an argument that
has <em>nothing</em> to do with them. Think about it for a second; the last time you
hired a contractor to add a deck to your house, what's your reaction when they introduce
themselves as,
</p>
        <p>
"Hi, I'm Kim, and I'm a Craftsman contractor."
</p>
        <p>
Or, overheard at the job site, "Oh, good God, you're using a Skil? What are you, some
kind of nut or something?"
</p>
        <p>
Or, as you look at the tools on their belt, "Nokita? You really <em>are</em> a geek,
aren't you? Rebuilt your tools from scratch lately (snicker, snicker)?"
</p>
        <p>
Do you, the customer, <em>really</em> care what kind of tools they use? Or do you
care more for the quality of solution they build for you?
</p>
        <p>
It's hard to imagine how the discussion can even come up, it's so ludicrous.
</p>
        <p>
Try this one on, instead:
</p>
        <p>
"Hi, I'm Ted, and I'm a programmer."
</p>
        <p>
I use a variety of languages, tools, and OSes, and my choice of which to use are all
geared around a single end goal: not to promote my own social or political agenda,
but to <em>make my customer happy</em>. 
</p>
        <p>
Sometimes that means using C# on Windows. Sometimes that means using Java on Linux.
Sometimes that means Ruby on Mac OS X. Sometimes that means creating a DSL. Sometimes
that means using EJB, or Spring, or F#, or Scala, or FXCop, or FindBugs, or log4j,
or ... <em>ad infinitum</em>.
</p>
        <p>
Don't get me wrong, I have my opinions, just as contractors (and truck drivers, it
turns out) do. And, like most professionals in their field, I'm happy to share those
opinions with others in my field, and also with my customers when they ask: I think
C# provides a good answer in certain contexts, and that Java provides an equally good
answer, but in different contexts. I will be happy to explain my recommendation on
which languages, tools and OSes to use, because unlike the contractor, the languages,
tools, and OSes I use <em>will</em> be visible to the customer when the software goes
into Production, at a variety of levels, and thus, the customer should be involved
in that decision. (Sometimes the situation is really one where the customer won't
see it, in which case the developer can have full confidence in whatever language/tool/OS
they choose... but that's far more often the exception than the rule, and will generally
only be true in cases where the developer is providing a complete customer "hands-off"
hosting solution.)
</p>
        <p>
I choose to be pro-choice.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4a44324b-e95c-4ba9-b5ab-a38e8166cdb4" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>I'm Pro-Choice... Pro Programmer Choice, that is</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,4a44324b-e95c-4ba9-b5ab-a38e8166cdb4.aspx</guid>
      <link>http://blogs.tedneward.com/2008/05/11/Im+ProChoice+Pro+Programmer+Choice+That+Is.aspx</link>
      <pubDate>Sun, 11 May 2008 04:20:46 GMT</pubDate>
      <description>&lt;p&gt;
Not too long ago, &lt;a href="http://pluralsight.com/blogs/dbox/archive/2008/04/29/50808.aspx"&gt;Don
wrote&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
The three most “personal” choices a developer makes are language, tool, and OS.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
No.
&lt;/p&gt;
&lt;p&gt;
That may be true for somebody who works for a large commercial or open source vendor,
whose team is building something that fits into one of those three categories and
wants to see that language/tool/OS succeed.
&lt;/p&gt;
&lt;p&gt;
That is not where most of us live. If you do, certainly, you are welcome to your opinion,
but please accept with good grace that your agenda is not the same as my own.
&lt;/p&gt;
&lt;p&gt;
Most of us in the practitioner space are &lt;em&gt;using&lt;/em&gt; languages, tools and OSes
to solve customer problems, and making the decision to use a particular language,
tool or OS a personal one generally gets us into trouble--how many developers do you
know that identify themselves so closely with that decision that they include it in
their personal metadata? 
&lt;/p&gt;
&lt;p&gt;
"Hi, I'm Joe, and I'm a Java programmer."
&lt;/p&gt;
&lt;p&gt;
Or, "Oh, good God, you're running Windows? What are you, some kind of Micro$oft lover
or something?"
&lt;/p&gt;
&lt;p&gt;
Or, "Linux? You really &lt;em&gt;are&lt;/em&gt; a geek, aren't you? Recompiled your kernel lately
(snicker, snicker)?"
&lt;/p&gt;
&lt;p&gt;
Sorry, but all of those make me want to hurl. Of these kinds of statements are technical
zealotry and flame wars built. When programmers embed their choice so deeply into
their psyche that it becomes the tagline by which they identify themselves, it becomes
an "ego" thing instead of a "tool" thing. 
&lt;/p&gt;
&lt;p&gt;
What's more, it involves customers and people outside the field in an argument that
has &lt;em&gt;nothing&lt;/em&gt; to do with them. Think about it for a second; the last time you
hired a contractor to add a deck to your house, what's your reaction when they introduce
themselves as,
&lt;/p&gt;
&lt;p&gt;
"Hi, I'm Kim, and I'm a Craftsman contractor."
&lt;/p&gt;
&lt;p&gt;
Or, overheard at the job site, "Oh, good God, you're using a Skil? What are you, some
kind of nut or something?"
&lt;/p&gt;
&lt;p&gt;
Or, as you look at the tools on their belt, "Nokita? You really &lt;em&gt;are&lt;/em&gt; a geek,
aren't you? Rebuilt your tools from scratch lately (snicker, snicker)?"
&lt;/p&gt;
&lt;p&gt;
Do you, the customer, &lt;em&gt;really&lt;/em&gt; care what kind of tools they use? Or do you
care more for the quality of solution they build for you?
&lt;/p&gt;
&lt;p&gt;
It's hard to imagine how the discussion can even come up, it's so ludicrous.
&lt;/p&gt;
&lt;p&gt;
Try this one on, instead:
&lt;/p&gt;
&lt;p&gt;
"Hi, I'm Ted, and I'm a programmer."
&lt;/p&gt;
&lt;p&gt;
I use a variety of languages, tools, and OSes, and my choice of which to use are all
geared around a single end goal: not to promote my own social or political agenda,
but to &lt;em&gt;make my customer happy&lt;/em&gt;. 
&lt;/p&gt;
&lt;p&gt;
Sometimes that means using C# on Windows. Sometimes that means using Java on Linux.
Sometimes that means Ruby on Mac OS X. Sometimes that means creating a DSL. Sometimes
that means using EJB, or Spring, or F#, or Scala, or FXCop, or FindBugs, or log4j,
or ... &lt;em&gt;ad infinitum&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
Don't get me wrong, I have my opinions, just as contractors (and truck drivers, it
turns out) do. And, like most professionals in their field, I'm happy to share those
opinions with others in my field, and also with my customers when they ask: I think
C# provides a good answer in certain contexts, and that Java provides an equally good
answer, but in different contexts. I will be happy to explain my recommendation on
which languages, tools and OSes to use, because unlike the contractor, the languages,
tools, and OSes I use &lt;em&gt;will&lt;/em&gt; be visible to the customer when the software goes
into Production, at a variety of levels, and thus, the customer should be involved
in that decision. (Sometimes the situation is really one where the customer won't
see it, in which case the developer can have full confidence in whatever language/tool/OS
they choose... but that's far more often the exception than the rule, and will generally
only be true in cases where the developer is providing a complete customer "hands-off"
hosting solution.)
&lt;/p&gt;
&lt;p&gt;
I choose to be pro-choice.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4a44324b-e95c-4ba9-b5ab-a38e8166cdb4" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,4a44324b-e95c-4ba9-b5ab-a38e8166cdb4.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=4b62543c-6d8c-49b9-ae71-3924542c04c0</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,4b62543c-6d8c-49b9-ae71-3924542c04c0.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,4b62543c-6d8c-49b9-ae71-3924542c04c0.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4b62543c-6d8c-49b9-ae71-3924542c04c0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple of folks have taken me to task over some of the things I said... or didn't
say... in my last blog piece. So, in no particular order, let's discuss.
</p>
        <p>
A few commented on how I left out commentary on language X, Y or Z. That wasn't an
accidental slip or surge of forgetfulness, but I didn't want to rattle off a laundry
list of every language I've run across or am exploring, since that list would be much,
much longer and arguably of little to no additional benefit. Having said that, though,
a more comprehensive list (and more comprehensive explanation and thought process)
is probably deserved, so expect to see that from me before long, maybe in the next
week or two.
</p>
        <p>
          <a href="http://steve.vinoski.net/blog/2008/05/01/erlang-its-about-reliability/">Steve
Vinoski wrote</a>:
</p>
        <blockquote>
          <p>
In a <a href="http://blogs.tedneward.com/2008/04/29/Groovy+Or+JRuby.aspx">recent post,
Ted Neward</a> gives a brief description of a variety of programming languages. It’s
a useful post; I’ve known Ted for awhile now, and he’s quite knowledgeable about such
things. Still, I have to comment on what he says about Erlang....  I might have
said it like this:
</p>
          <blockquote>
            <p>
              <em>
                <strong>Erlang</strong>. Joe Armstrong’s baby was built to solve a specific set
of problems at Ericsson, and from it we can learn a phenomenal amount about building
highly reliable systems that can also support massive concurrency. The fact that it
runs on its own interpreter, good; otherwise, the reliability wouldn’t be there and
it would be just another curious but useless concurrency-oriented language experiment.</em>
            </p>
          </blockquote>
          <p>
Far too many blog posts and articles that touch on Erlang completely miss the point
that reliability is an extremely important aspect of the language. 
</p>
          <p>
To achieve reliability, you have to accept the fact that failure <em>will</em> occur,
Once you accept that, then other things fall into place: you need to be able to restart
things quickly, and to do that, processes need to be cheap. If something fails, you
don’t want it taking everything else with it, so you need to at least minimize, if
not eliminate, sharing, which leads you to message passing. You also need monitoring
capabilities that can detect failed processes and restart them (BTW in the same posting
Ted seems to claim that Erlang has no monitoring capabilities, which baffles me). 
</p>
          <p>
Massive concurrency capabilities become far easier with an architecture that provides
lightweight processes that share nothing, but that doesn’t mean that once you design
it, the rest is just a simple matter of programming. Rather, actually <em>implementing</em> all
this in a way that delivers what’s needed and performs more than adequately for production-quality
systems is an incredibly enormous challenge, one that the Erlang development team
has quite admirably met, and that’s an understatement if there ever was one. 
</p>
          <p>
They come for the concurrency but they stay for the reliability. Do any other “Erlang-like”
languages have real, live, production systems in the field that have been running
non-stop for years? (That’s not a rhetorical question; if you know of any such languages,
please let me know.) Next time you see yet another posting about Erlang and concurrency,
especially those of the form “Erlang-like concurrency in language X!” just ask the
author: where’s the reliability?
</p>
        </blockquote>
        <p>
As he says, Steve and I have known each other for a while now, so I'm fairly comfortable
in saying, Mr. Vinoski, you conflate two ideas together in your assessment of Erlang,
and teasing those two things apart reveals a great deal about Erlang, reliability,
and the greater world at large.
</p>
        <p>
Erlang's reliability model--that is, the spawn-a-thousand-processes model--is not
unique to Erlang. In fact, it's been the model for Unix programs and servers, most
notably the Apache web server, for decades. When building a robust system under Unix,
a master-slave model, in which a master process spawns (and monitors) <em>n</em> number
of child processes to do the actual work, offers that same kind of reliability and
robustness. If one of these processes fail (due to corrupted memory access, operating
system fault, or what-have-you), the process can simply die and be replaced by a new
child process. Under the Windows model, which stresses threads rather than processes,
corrupted memory access tearing down the process brings down the entire system; this
is partly why .NET chose to create the AppDomain model, which looks and feels remarkably
like the lightweight process model. (It still can't stop a random rogue pointer access
from tearing down the entire process, but if we assume that future servers will be
written all in managed code, it offers the same kind of reliability that the process
model does so long as your kernel drivers don't crash.)
</p>
        <p>
There is no reason a VM (JVM, CLR, Parrot, etc) could not do this. In fact, here's
the kicker: it would be <em>easier</em> for a VM environment to do this, because VM's,
by their nature, seek to abstract away the details of the underlying platform that
muddy up the picture. It would be relatively simple to take an Actors-based Java application,
such as that currently being built in Scala, and move it away from a threads-based
model and over to a process-based model (with the JVM constuction/teardown being handled
entirely by underlying infrastructure) with little to no impact on the programming
model.
</p>
        <p>
As to Steve's comment that the Erlang interpreter isn't monitorable, I never said
that--I said that Erlang was not monitorable using current IT operations monitoring
tools. The JVM and CLR both have gone to great lengths to build infrastructure hooks
that make it easy to keep an eye not only on what's going on at the process level
("Is it up? Is it down?") but also what's going on inside the system ("How many requests
have we processed in the last hour? How many of those were successful? How many database
connections have been created?" and so on). Nothing says that Erlang--or any other
system--can't do that, but it requires the Erlang developer build that infrastructure
him-or-herself, which usually means it's either not going to get done, making life
harder for the IT support staff, or else it gets done to a minimalist level, making
life harder for the IT support staff.
</p>
        <p>
So given that an execution engine could easily adopt the model that gives Erlang its
reliability, and that using Erlang means a lot more work to get the monitorability
and manageability (which is a necessary side-effect requirement of accepting that
failure happens), hopefully my reasons for saying that Erlang (or Ruby's or any other
native-implemented language) is a non-starter for me becomes more clear.
</p>
        <p>
Meanwhile, <a href="http://patricklogan.blogspot.com/2008/05/huh-fact-that-it-runs-on-its-own.html">Patrick
Logan offers up some sharp words</a> about my preference for VMs:
</p>
        <blockquote>
          <p>
What is this <a href="http://blogs.tedneward.com/2008/04/29/Groovy+Or+JRuby.aspx">obsession
with some virtual machine being the one</a>, true byte code? The Java Virtual Machine,
the CLR, Parrot, whatever. Give it up. 
</p>
          <p>
I agree <a href="http://steve.vinoski.net/blog/2008/05/01/erlang-its-about-reliability/">with
Steve Vinoski</a>... 
</p>
          <blockquote>
            <em>The fact that it runs on its own interpreter, good; otherwise,
the reliability wouldn’t be there. </em>
          </blockquote>We need to get over our thinking
about "One VM to bring them all and in the darkness bind them". Instead we should
be focused on improving interprocess communication among various languages. This can
be done with HTTP and XMPP. And we should expecially be focused on reliability, deployment,
starting and stopping locally or remotely, etc. XMPP's "presence" provides Erlang-process-like
linking of a sort as well. 
<p>
With Erlang's JInterface for Java then a Java process can look like an Erlang process
(distributed or remote). Two or more Java processes can use JInterface to communicate
and "link" reliably and Erlang virtual machines and libraries, save this one single
.jar, do not have to be anywhere in sight. 
</p><p>
To obsess about a single VM is to remain stuck at about 1980 and UCSD Pascal's p-code.
It just should not matter today, and certainly not tomorrow. The forest is now much
more important than any given tree. 
</p><p>
Pay attention to <a href="http://www.infoq.com/interviews/project-zero-cuomo">the
new JVM from IBM</a> in support of their lightweight, fast-start, single-purpose process
philosophy embodied in Project Zero. It's not intended to be a big honkin' run everything
forever virtual machine. It will support JVM languages and the more the merrier in
the sense that such a JVM will enable lightweight pieces to be stiched together dynamically.
However the intention is to perform some interprocess communication and then get out
of the way. Exactly the right approach for any virtual machine. 
</p><p>
Jini clearly is *the* most important thing about Java, ever. But it's lost. Gone.
Buh-bye. Pity.
</p></blockquote>
        <p>
"We need to get over our thinking about "One VM to bring them all and in the darkness
bind them". " <em>Huh?</em> How did we go from "I like virtual machine/execution environments
because of the support they give my code for free" to "One VM to bring them all and
in the darkness bind them"? I truly fail to see the logical connection there. My love
for both the JVM <em>and</em> the CLR has hopefully made itself clear, but maybe Patrick's
only subscribed to the Java/J2EE category bits of my RSS feed. Fact is, I'm coming
to like any virtual machine/execution environment that offers a layer of abstraction
over the details of the underlying platform itself, because developers do not want
to deal with those details. They want to be able to get at them when it becomes necessary,
granted, but the actual details should remain hidden (as best they can, anyway) until
that time.
</p>
        <p>
"Instead we should be focused on improving interprocess communication among various
languages. This can be done with HTTP and XMPP."  I'm sorry, but I'm getting
very very tired of this "HTTP is the best way to communicate" meme that surrounds
the Internet. Yes, HTTP was successful. Nobody is arguing with this. So is FTP. So
is SMTP and POP3. So, for that matter, is XMPP. <em>Each serves a useful purpose,
solving a particular problem.</em> Let's not try to force everything down a single
pipe, shall we? I would hate to be so focused on the tree of HTTP that we lose sight
of the forest of communication protocols.
</p>
        <p>
"And we should expecially <em>[sic]</em> be focused on reliability, deployment, starting
and stopping locally or remotely, etc. XMPP's "presence" provides Erlang-process-like
linking of a sort as well." <em>Yes!</em> XMPP's "presence" aspect is a powerful one,
and heavily underutilized. "Presence", however, is really just a specific form of
"discovery", and quite frankly our enterprise systems need to explore more "discovery"-based
approaches, particularly for resource acquisition and monitoring. I've talked about
this for years.
</p>
        <p>
"To obsess about a single VM is to remain stuck at about 1980 and UCSD Pascal's p-code."
Great one-liner... with no supporting logic, granted, but I'm sure it drew a cheer
from the faithful.
</p>
        <p>
"It just should not matter today, and certainly not tomorrow." For what reason? Based
on what concepts? Look, as much as we want to try and abstract ourselves away from
everything, at some point rubber must meet road, and the semantic details of the platform
you're using--virtual or otherwise--make a huge difference about how you build systems.
For example, Erlang's many-child-processes model works well on Unix, but not as well
on Windows, owing to the heavier startup costs of creating a process under Windows.
For applications that will involve spinning up thousands of processes, Windows is
probably not a good platform to use.
</p>
        <blockquote>
          <p>
            <em>Disclaimer: This "it's heavier to spin up processes on Windows than Unix" belief
is one I've not verified personally; I'm trusting what I've heard from other sources
I know and trust. Under later Windows releases, this may have changed, but my understanding
is that it is still much much faster to spin up a thread on Windows than a separate
process, and that it is only marginally faster to spin up a thread on Unix than a
process, because many Unixes use the process model to "fake" threads, the so-called
LightWeightProcess model.</em>
          </p>
        </blockquote>
        <p>
"The forest is now much more important than any given tree." <em>Yes!</em> And that
means you have to keep an eye on the forest as a whole, which underscores the need
for monitoring and managing capabilities in your programs. Do you want to build this
by hand?
</p>
        <p>
"Pay attention to <a href="http://www.infoq.com/interviews/project-zero-cuomo">the
new JVM from IBM</a> in support of their lightweight, fast-start, single-purpose process
philosophy embodied in Project Zero. It's not intended to be a big honkin' run everything
forever virtual machine. It will support JVM languages and the more the merrier in
the sense that such a JVM will enable lightweight pieces to be stiched together dynamically.
However the intention is to perform some interprocess communication and then get out
of the way. Exactly the right approach for any virtual machine." <em>Yes!</em> You
make my point for me--the point of the virtual machine/execution environment is to
reduce the noise a developer must face, and if IBM's new VM gains us additional reliability
by silently moving work and data between processes, great! But the only way you take
advantage of this is by <em>writing to the JVM</em>. (Or CLR, or Parrot, or whatever.)
If you don't, and instead choose to write to something that doesn't abstract away
from the OS, you have to write all of this supporting infrastructure code yourself.
That sounds like fun, right? Not to mention highly business-ROI-focused?
</p>
        <p>
"Jini clearly is *the* most important thing about Java, ever. But it's lost. Gone.
Buh-bye. Pity." Jini was cool. I liked Jini. Jini got nowhere because Sun all but
abandoned it in its zeal to push the client-server EJB model of life. <em>sigh</em> I
wish they had sought to incorporate more of the discovery elements of Jini into the
J2EE stack (see the previous paragraph). But they didn't, and as a result, Jini is
all but dead.
</p>
        <blockquote>
          <p>
            <em>Disclaimer: I know, I know, Jini isn't really dead. The bits are still there,
you can still download them and run them, and there is a rabidly zealous community
of supporters out there, but as a tool in widespread use and a good bet for an IT
department, it's a non-starter. Oh, and if you're one of those rabidly zealous supporters,
don't bother emailing me to tell me how wrong I am, I won't respond. Don't forget
that FoxPro and OS/2 still have a rabidly zealous community of supporters out there,
too.</em>
          </p>
        </blockquote>
        <p>
Frankly, a comment on Patrick's blog entry really captures my point precisely, so
(hopefully with permission) I will repeat it here:
</p>
        <blockquote>
          <p>
The only argument you made that I can find against sharing VMs is that people should
be focusing on other things. But the main reason for sharing VMs is to allow people
to focus on other things, instead of focusing on creating yet another VM.
</p>
          <p>
You write as if you think creating an entirely new VM from scratch would be easier
than targeting a common VM. Is that really what you think?
</p>
        </blockquote>
        <p>
Couldn't have said it better... though that never stops me from trying. ;-)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4b62543c-6d8c-49b9-ae71-3924542c04c0" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Thinking in Language</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,4b62543c-6d8c-49b9-ae71-3924542c04c0.aspx</guid>
      <link>http://blogs.tedneward.com/2008/05/09/Thinking+In+Language.aspx</link>
      <pubDate>Fri, 09 May 2008 06:30:33 GMT</pubDate>
      <description>&lt;p&gt;
A couple of folks have taken me to task over some of the things I said... or didn't
say... in my last blog piece. So, in no particular order, let's discuss.
&lt;/p&gt;
&lt;p&gt;
A few commented on how I left out commentary on language X, Y or Z. That wasn't an
accidental slip or surge of forgetfulness, but I didn't want to rattle off a laundry
list of every language I've run across or am exploring, since that list would be much,
much longer and arguably of little to no additional benefit. Having said that, though,
a more comprehensive list (and more comprehensive explanation and thought process)
is probably deserved, so expect to see that from me before long, maybe in the next
week or two.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://steve.vinoski.net/blog/2008/05/01/erlang-its-about-reliability/"&gt;Steve
Vinoski wrote&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
In a &lt;a href="http://blogs.tedneward.com/2008/04/29/Groovy+Or+JRuby.aspx"&gt;recent post,
Ted Neward&lt;/a&gt; gives a brief description of a variety of programming languages. It’s
a useful post; I’ve known Ted for awhile now, and he’s quite knowledgeable about such
things. Still, I have to comment on what he says about Erlang....&amp;nbsp; I might have
said it like this:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;Erlang&lt;/strong&gt;. Joe Armstrong’s baby was built to solve a specific set
of problems at Ericsson, and from it we can learn a phenomenal amount about building
highly reliable systems that can also support massive concurrency. The fact that it
runs on its own interpreter, good; otherwise, the reliability wouldn’t be there and
it would be just another curious but useless concurrency-oriented language experiment.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Far too many blog posts and articles that touch on Erlang completely miss the point
that reliability is an extremely important aspect of the language. 
&lt;p&gt;
To achieve reliability, you have to accept the fact that failure &lt;em&gt;will&lt;/em&gt; occur,
Once you accept that, then other things fall into place: you need to be able to restart
things quickly, and to do that, processes need to be cheap. If something fails, you
don’t want it taking everything else with it, so you need to at least minimize, if
not eliminate, sharing, which leads you to message passing. You also need monitoring
capabilities that can detect failed processes and restart them (BTW in the same posting
Ted seems to claim that Erlang has no monitoring capabilities, which baffles me). 
&lt;p&gt;
Massive concurrency capabilities become far easier with an architecture that provides
lightweight processes that share nothing, but that doesn’t mean that once you design
it, the rest is just a simple matter of programming. Rather, actually &lt;em&gt;implementing&lt;/em&gt; all
this in a way that delivers what’s needed and performs more than adequately for production-quality
systems is an incredibly enormous challenge, one that the Erlang development team
has quite admirably met, and that’s an understatement if there ever was one. 
&lt;p&gt;
They come for the concurrency but they stay for the reliability. Do any other “Erlang-like”
languages have real, live, production systems in the field that have been running
non-stop for years? (That’s not a rhetorical question; if you know of any such languages,
please let me know.) Next time you see yet another posting about Erlang and concurrency,
especially those of the form “Erlang-like concurrency in language X!” just ask the
author: where’s the reliability?
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
As he says, Steve and I have known each other for a while now, so I'm fairly comfortable
in saying, Mr. Vinoski, you conflate two ideas together in your assessment of Erlang,
and teasing those two things apart reveals a great deal about Erlang, reliability,
and the greater world at large.
&lt;/p&gt;
&lt;p&gt;
Erlang's reliability model--that is, the spawn-a-thousand-processes model--is not
unique to Erlang. In fact, it's been the model for Unix programs and servers, most
notably the Apache web server, for decades. When building a robust system under Unix,
a master-slave model, in which a master process spawns (and monitors) &lt;em&gt;n&lt;/em&gt; number
of child processes to do the actual work, offers that same kind of reliability and
robustness. If one of these processes fail (due to corrupted memory access, operating
system fault, or what-have-you), the process can simply die and be replaced by a new
child process. Under the Windows model, which stresses threads rather than processes,
corrupted memory access tearing down the process brings down the entire system; this
is partly why .NET chose to create the AppDomain model, which looks and feels remarkably
like the lightweight process model. (It still can't stop a random rogue pointer access
from tearing down the entire process, but if we assume that future servers will be
written all in managed code, it offers the same kind of reliability that the process
model does so long as your kernel drivers don't crash.)
&lt;/p&gt;
&lt;p&gt;
There is no reason a VM (JVM, CLR, Parrot, etc) could not do this. In fact, here's
the kicker: it would be &lt;em&gt;easier&lt;/em&gt; for a VM environment to do this, because VM's,
by their nature, seek to abstract away the details of the underlying platform that
muddy up the picture. It would be relatively simple to take an Actors-based Java application,
such as that currently being built in Scala, and move it away from a threads-based
model and over to a process-based model (with the JVM constuction/teardown being handled
entirely by underlying infrastructure) with little to no impact on the programming
model.
&lt;/p&gt;
&lt;p&gt;
As to Steve's comment that the Erlang interpreter isn't monitorable, I never said
that--I said that Erlang was not monitorable using current IT operations monitoring
tools. The JVM and CLR both have gone to great lengths to build infrastructure hooks
that make it easy to keep an eye not only on what's going on at the process level
("Is it up? Is it down?") but also what's going on inside the system ("How many requests
have we processed in the last hour? How many of those were successful? How many database
connections have been created?" and so on). Nothing says that Erlang--or any other
system--can't do that, but it requires the Erlang developer build that infrastructure
him-or-herself, which usually means it's either not going to get done, making life
harder for the IT support staff, or else it gets done to a minimalist level, making
life harder for the IT support staff.
&lt;/p&gt;
&lt;p&gt;
So given that an execution engine could easily adopt the model that gives Erlang its
reliability, and that using Erlang means a lot more work to get the monitorability
and manageability (which is a necessary side-effect requirement of accepting that
failure happens), hopefully my reasons for saying that Erlang (or Ruby's or any other
native-implemented language) is a non-starter for me becomes more clear.
&lt;/p&gt;
&lt;p&gt;
Meanwhile, &lt;a href="http://patricklogan.blogspot.com/2008/05/huh-fact-that-it-runs-on-its-own.html"&gt;Patrick
Logan offers up some sharp words&lt;/a&gt; about my preference for VMs:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
What is this &lt;a href="http://blogs.tedneward.com/2008/04/29/Groovy+Or+JRuby.aspx"&gt;obsession
with some virtual machine being the one&lt;/a&gt;, true byte code? The Java Virtual Machine,
the CLR, Parrot, whatever. Give it up. 
&lt;p&gt;
I agree &lt;a href="http://steve.vinoski.net/blog/2008/05/01/erlang-its-about-reliability/"&gt;with
Steve Vinoski&lt;/a&gt;... &lt;blockquote&gt;&lt;em&gt;The fact that it runs on its own interpreter,
good; otherwise, the reliability wouldn’t be there. &lt;/em&gt;&lt;/blockquote&gt;We need to get
over our thinking about "One VM to bring them all and in the darkness bind them".
Instead we should be focused on improving interprocess communication among various
languages. This can be done with HTTP and XMPP. And we should expecially be focused
on reliability, deployment, starting and stopping locally or remotely, etc. XMPP's
"presence" provides Erlang-process-like linking of a sort as well. 
&lt;p&gt;
With Erlang's JInterface for Java then a Java process can look like an Erlang process
(distributed or remote). Two or more Java processes can use JInterface to communicate
and "link" reliably and Erlang virtual machines and libraries, save this one single
.jar, do not have to be anywhere in sight. 
&lt;p&gt;
To obsess about a single VM is to remain stuck at about 1980 and UCSD Pascal's p-code.
It just should not matter today, and certainly not tomorrow. The forest is now much
more important than any given tree. 
&lt;p&gt;
Pay attention to &lt;a href="http://www.infoq.com/interviews/project-zero-cuomo"&gt;the
new JVM from IBM&lt;/a&gt; in support of their lightweight, fast-start, single-purpose process
philosophy embodied in Project Zero. It's not intended to be a big honkin' run everything
forever virtual machine. It will support JVM languages and the more the merrier in
the sense that such a JVM will enable lightweight pieces to be stiched together dynamically.
However the intention is to perform some interprocess communication and then get out
of the way. Exactly the right approach for any virtual machine. 
&lt;p&gt;
Jini clearly is *the* most important thing about Java, ever. But it's lost. Gone.
Buh-bye. Pity.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
"We need to get over our thinking about "One VM to bring them all and in the darkness
bind them". " &lt;em&gt;Huh?&lt;/em&gt; How did we go from "I like virtual machine/execution environments
because of the support they give my code for free" to "One VM to bring them all and
in the darkness bind them"? I truly fail to see the logical connection there. My love
for both the JVM &lt;em&gt;and&lt;/em&gt; the CLR has hopefully made itself clear, but maybe Patrick's
only subscribed to the Java/J2EE category bits of my RSS feed. Fact is, I'm coming
to like any virtual machine/execution environment that offers a layer of abstraction
over the details of the underlying platform itself, because developers do not want
to deal with those details. They want to be able to get at them when it becomes necessary,
granted, but the actual details should remain hidden (as best they can, anyway) until
that time.
&lt;/p&gt;
&lt;p&gt;
"Instead we should be focused on improving interprocess communication among various
languages. This can be done with HTTP and XMPP."&amp;nbsp; I'm sorry, but I'm getting
very very tired of this "HTTP is the best way to communicate" meme that surrounds
the Internet. Yes, HTTP was successful. Nobody is arguing with this. So is FTP. So
is SMTP and POP3. So, for that matter, is XMPP. &lt;em&gt;Each serves a useful purpose,
solving a particular problem.&lt;/em&gt; Let's not try to force everything down a single
pipe, shall we? I would hate to be so focused on the tree of HTTP that we lose sight
of the forest of communication protocols.
&lt;/p&gt;
&lt;p&gt;
"And we should expecially &lt;em&gt;[sic]&lt;/em&gt; be focused on reliability, deployment, starting
and stopping locally or remotely, etc. XMPP's "presence" provides Erlang-process-like
linking of a sort as well." &lt;em&gt;Yes!&lt;/em&gt; XMPP's "presence" aspect is a powerful one,
and heavily underutilized. "Presence", however, is really just a specific form of
"discovery", and quite frankly our enterprise systems need to explore more "discovery"-based
approaches, particularly for resource acquisition and monitoring. I've talked about
this for years.
&lt;/p&gt;
&lt;p&gt;
"To obsess about a single VM is to remain stuck at about 1980 and UCSD Pascal's p-code."
Great one-liner... with no supporting logic, granted, but I'm sure it drew a cheer
from the faithful.
&lt;/p&gt;
&lt;p&gt;
"It just should not matter today, and certainly not tomorrow." For what reason? Based
on what concepts? Look, as much as we want to try and abstract ourselves away from
everything, at some point rubber must meet road, and the semantic details of the platform
you're using--virtual or otherwise--make a huge difference about how you build systems.
For example, Erlang's many-child-processes model works well on Unix, but not as well
on Windows, owing to the heavier startup costs of creating a process under Windows.
For applications that will involve spinning up thousands of processes, Windows is
probably not a good platform to use.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Disclaimer: This "it's heavier to spin up processes on Windows than Unix" belief
is one I've not verified personally; I'm trusting what I've heard from other sources
I know and trust. Under later Windows releases, this may have changed, but my understanding
is that it is still much much faster to spin up a thread on Windows than a separate
process, and that it is only marginally faster to spin up a thread on Unix than a
process, because many Unixes use the process model to "fake" threads, the so-called
LightWeightProcess model.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
"The forest is now much more important than any given tree." &lt;em&gt;Yes!&lt;/em&gt; And that
means you have to keep an eye on the forest as a whole, which underscores the need
for monitoring and managing capabilities in your programs. Do you want to build this
by hand?
&lt;/p&gt;
&lt;p&gt;
"Pay attention to &lt;a href="http://www.infoq.com/interviews/project-zero-cuomo"&gt;the
new JVM from IBM&lt;/a&gt; in support of their lightweight, fast-start, single-purpose process
philosophy embodied in Project Zero. It's not intended to be a big honkin' run everything
forever virtual machine. It will support JVM languages and the more the merrier in
the sense that such a JVM will enable lightweight pieces to be stiched together dynamically.
However the intention is to perform some interprocess communication and then get out
of the way. Exactly the right approach for any virtual machine." &lt;em&gt;Yes!&lt;/em&gt; You
make my point for me--the point of the virtual machine/execution environment is to
reduce the noise a developer must face, and if IBM's new VM gains us additional reliability
by silently moving work and data between processes, great! But the only way you take
advantage of this is by &lt;em&gt;writing to the JVM&lt;/em&gt;. (Or CLR, or Parrot, or whatever.)
If you don't, and instead choose to write to something that doesn't abstract away
from the OS, you have to write all of this supporting infrastructure code yourself.
That sounds like fun, right? Not to mention highly business-ROI-focused?
&lt;/p&gt;
&lt;p&gt;
"Jini clearly is *the* most important thing about Java, ever. But it's lost. Gone.
Buh-bye. Pity." Jini was cool. I liked Jini. Jini got nowhere because Sun all but
abandoned it in its zeal to push the client-server EJB model of life. &lt;em&gt;sigh&lt;/em&gt; I
wish they had sought to incorporate more of the discovery elements of Jini into the
J2EE stack (see the previous paragraph). But they didn't, and as a result, Jini is
all but dead.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Disclaimer: I know, I know, Jini isn't really dead. The bits are still there,
you can still download them and run them, and there is a rabidly zealous community
of supporters out there, but as a tool in widespread use and a good bet for an IT
department, it's a non-starter. Oh, and if you're one of those rabidly zealous supporters,
don't bother emailing me to tell me how wrong I am, I won't respond. Don't forget
that FoxPro and OS/2 still have a rabidly zealous community of supporters out there,
too.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Frankly, a comment on Patrick's blog entry really captures my point precisely, so
(hopefully with permission) I will repeat it here:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
The only argument you made that I can find against sharing VMs is that people should
be focusing on other things. But the main reason for sharing VMs is to allow people
to focus on other things, instead of focusing on creating yet another VM.
&lt;/p&gt;
&lt;p&gt;
You write as if you think creating an entirely new VM from scratch would be easier
than targeting a common VM. Is that really what you think?
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Couldn't have said it better... though that never stops me from trying. ;-)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4b62543c-6d8c-49b9-ae71-3924542c04c0" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,4b62543c-6d8c-49b9-ae71-3924542c04c0.aspx</comments>
      <category>.NET</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Parrot</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=b490ca97-7027-4773-ba0a-41d631c9e20c</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,b490ca97-7027-4773-ba0a-41d631c9e20c.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,b490ca97-7027-4773-ba0a-41d631c9e20c.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=b490ca97-7027-4773-ba0a-41d631c9e20c</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Kohsuke Kawagachi has posted a blog entry describing how to watch the assembly code
get generated by the JVM during execution, using a non-product (debug or fastdebug)
build of Hotspot and the -XX:+PrintOptoAssembly flag, a trick he says he learned while
at TheServerSide Java Symposium a few weeks ago in Vegas. He goes on to do some analysis
of the generated assembly instructions, offering up some interesting insights into
the JVM's inner workings.
</p>
        <p>
There's only one problem with this: the flag doesn't exist.
</p>
        <p>
Looking at the source for the most recent builds of the JVM (b24, plus whatever new
changesets have been applied to the Mercurial repositories since then), and in particular
at the "globals.hpp" file (jdk7/hotspot/src/share/vm/runtime/globals.hpp), where all
the -XX flags are described, no such flag exists. It obviously must have at one point,
since he's obviously been able to use it to get an assembly dump (as must whomever
taught him how to do it), but it's not there anymore.
</p>
        <p>
OK, OK, I lied. It never was there for the client build (near as I can tell), but
it <em>is</em> there if you squint hard enough (jdk7/hotspot/src/share/vm/opto/c2_globals.hpp),
but as the pathname to the source file implies, it's only there for the server build,
which is why Kohsuke has to specify the "-server" flag on the command line; if you
leave that off, you get an error message from the JVM saying the flag is unrecognized,
leading you to believe Kohsuke (and whomever taught him this trick) is clearly a few
megs shy in their mental heap. So when you try this trick, make sure to use "-server",
and make sure to run methods enough to force JIT to take place (or set the JIT threshold 
using -XX:CompileThreshold=1) in order to see the assembly actually get generated.
</p>
        <p>
Oh, and make sure to swing the dead chicken--fresh, not frozen--by the neck over your
head three times, counterclockwise, while facing the moon and chanting, "Ohwah...
Tanidd... Eyah... Tiam...". If you don't, the whole thing won't work. Seriously.
</p>
        <p>
...
</p>
        <p>
Ever feel like that's how we tune the JVM? Me too. The whole thing is this huge black
box, and it's nearly impossible to extract any kind of useful information without
wandering into the scores of mysterious "-XX" flags, each of which is barely documented,
not guaranteed to do anything visibly useful, and barely understood by anybody outside
of Sun.
</p>
        <p>
Hey, at least we <em>have</em> those flags in the JVM; the CLR developers have to
take whatever the Microsoft guys give them. ("And they'll <em>like </em>it, too! Why,
when I was their age, I had to program using nothing but pebbles by the side of the
road on my way to school! Uphill! Both ways! In the raging blizzards of Arizona!")
</p>
        <p>
Interestingly enough, this conversation got me into an argument with a friend of mine
who works for Sun.
</p>
        <p>
During the conversation, I mentioned that I was annoyed at the difficulty a Java developer
has in trying to see how the Java code he/she writes turns into assembly, making it
hard to understand what's really happening inside the black box. After all, the CLR
makes this pretty trivial--when you set a breakpoint in Visual Studio, if you have
the right flags turned on, your C# or VB source is displayed alongside the actual
native instructions, making it fairly easy to see that the JITted code. This was always
of great help when trying to prove to skeptical C++ developers that the CLR wasn't
entirely brain-dead, and did a lot of the optimizations their favorite C++ compiler
did, in some cases even better than the C++ compiler might have done. "Why don't we
have some kind of double-X-show-me-the-code flag, so I can do the same with the JVM?",
I lamented. 
</p>
        <p>
His contention was that this lack of a flag is a <em>good</em> thing. 
</p>
        <p>
Convinced I was misunderstanding his position, I asked him what he meant by that,
and he said, roughly paraphrasing, that there are only about 20 or so people in the
world who could look at that assembly dump and not draw incredibly misguided impressions
of how the JVM operates internally; more importantly, because so few people could
do anything useful with that output, it was to our collective benefit that this information
was so hard to obtain.
</p>
        <p>
To quote one of my favorite comedians, "Well excuuuuuuuuuuse ME." I was a bit... taken
aback, shall we say.
</p>
        <p>
I understand his point--that sometimes knowledge without the right context around
it can lead to misinterpretation and misunderstanding. I'll agree totally with the
assertion that the JVM is an incredibly complex piece of software that does some <em>very</em> sophisticated
runtime analysis to get Java code to run faster and faster. I'll even grant you that
the <em>timing</em> involved in displaying the assembly dump is critical, since Hotspot
re-JITs methods that get used repeatedly, something the CLR has talked about ("code
pitching") but thus far hasn't executed on.
</p>
        <p>
But this idea that only a certain select group of people are smart enough and understand
the JVM well enough to interpret the results correctly? That's dangerous, on several
levels.
</p>
        <p>
First, it's potentially an elitist attitude to take, essentially presenting a "We
look down on you poor peasants who just don't get it" persona, and if word gets out
that this is how Sun views Java developers as a whole, then it's a black mark on Sun's
PR image and causes them some major pain and credibility loss. Now, let me brutally
frank here: For the record, I <em>don't</em> think this is the case--everybody I've
met at Sun thus far is helpful and down-to-earth, and scary-smart. I have a hard time
believing that they're secretly thumbing their nose at me. I suppose it's possible,
but it's also possible that Bill Gates and Scott McNealy were in cahoots the whole
time, too.
</p>
        <p>
Second, and more importantly, there will never be any more than those 20 people we
have now, unless Sun works to open the deep dark internals of the JVM to more people.
I know I'm not alone in the world in wanting to know how the JVM works at the same
level as I know how the CLR works, and now that the OpenJDK is up and running, if
Sun wants to see any patches or feature enhancements from the community, then they
need to invest in more educational infrastructure to get those of us who are interested
in this stuff more up to speed on the topic.
</p>
        <p>
Third, and most important of all, <em>so long as the JVM remains a black box, the
"myths, legends and lore" will haunt us forever.</em> Remember when all the Java performance
articles went on and on about how method marked "final" were better-performing and
so therefore should be how you write your Java code? Now, close to ten years later,
we can look back at that and laugh, seeing it for the micro-optimization it is, but
if challenged on this idea, <em>we have no proof.</em> There is no way to create demonstrable
evidence to prove or disprove this point. Which means, then, that Java developers
can argue this back and forth based on nothing more than our mental model of the JVM
and what "logically makes sense".
</p>
        <blockquote>
          <p>
            <em>Some will suggest that we can use micro-benchmarks to compare the two options
and see how, after a million iterations, the total elapsed time compares. Brian Goetz
has spent a lot of time and energy refuting this myth, but to put it in some degree
of perspective, a micro-benchmark to prove or disprove the performance benefits of
"final" methods is like changing the motor oil in your car and then driving across
the country over and over again, measuring how long until the engine explodes. You
can do it, but there's going to be so much noise from everything else around the experiment--weather,
your habits as a driver, the speeds at which you're driving, and so on--that the results
will be essentially meaningless unless there is a huge disparity, capable of shining
through the noise.</em>
          </p>
        </blockquote>
        <p>
This is a position born out across history--we've never been able to understand a
system until we can observe it from outside the system; examples abound, such as the
early medical understanding of Aristotle's theories weighed against the medical experiments
performed by the Renaissance thinkers. One story says a skeptic, looking at the body
in front of him disproving one of Aristotle's theories, shook his head and said, "I
would believe you except that it was Aristotle who said it." When mental models are
built on faith, rather than on fact and evidence, progress cannot reasonably occur.
</p>
        <p>
Don't think the analogy holds? How long did we as Java developers hold faith with
the idea that object pools were a good idea, and that objects are expensive to create,
despite the fact that the Hotspot FAQ has explicitly told us otherwise since JDK 1.3?
I <em>still</em> run into Java developers who insist that object pools are a good
idea all across the board. I show them the Hotspot FAQ page, and they shake their
head and say, "I would believe you except that it was (so-and-so article author) who
said it."
</p>
        <blockquote>
          <p>
            <em>Oh, and don't get me started on a near-total opacity of the Parrot and Ruby environments,
among others--this isn't a "static vs dynamic" thing, this is something everybody
running on a managed platform needs to be able to do.</em>
          </p>
        </blockquote>
        <p>
I'm tired of arguing from a position of faith. I want evidence to either prove or
disprove my assertions, and more importantly, I want my mental model of how the JVM
operates to improve until it's more reflective of and closer to the reality. I can't
do that until the JVM offers up some mechanisms for gathering that evidence, or at
least for gathering it more easily and comprehensively. You shouldn't have to be a
JVM expert to get some verification that your understanding of how the JVM works is
correct or incorrect.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=b490ca97-7027-4773-ba0a-41d631c9e20c" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>The Complexities of Black Boxes</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,b490ca97-7027-4773-ba0a-41d631c9e20c.aspx</guid>
      <link>http://blogs.tedneward.com/2008/04/06/The+Complexities+Of+Black+Boxes.aspx</link>
      <pubDate>Sun, 06 Apr 2008 07:48:50 GMT</pubDate>
      <description>&lt;p&gt;
Kohsuke Kawagachi has posted a blog entry describing how to watch the assembly code
get generated by the JVM during execution, using a non-product (debug or fastdebug)
build of Hotspot and the -XX:+PrintOptoAssembly flag, a trick he says he learned while
at TheServerSide Java Symposium a few weeks ago in Vegas. He goes on to do some analysis
of the generated assembly instructions, offering up some interesting insights into
the JVM's inner workings.
&lt;/p&gt;
&lt;p&gt;
There's only one problem with this: the flag doesn't exist.
&lt;/p&gt;
&lt;p&gt;
Looking at the source for the most recent builds of the JVM (b24, plus whatever new
changesets have been applied to the Mercurial repositories since then), and in particular
at the "globals.hpp" file (jdk7/hotspot/src/share/vm/runtime/globals.hpp), where all
the -XX flags are described, no such flag exists. It obviously must have at one point,
since he's obviously been able to use it to get an assembly dump (as must whomever
taught him how to do it), but it's not there anymore.
&lt;/p&gt;
&lt;p&gt;
OK, OK, I lied. It never was there for the client build (near as I can tell), but
it &lt;em&gt;is&lt;/em&gt; there if you squint hard enough (jdk7/hotspot/src/share/vm/opto/c2_globals.hpp),
but as the pathname to the source file implies, it's only there for the server build,
which is why Kohsuke has to specify the "-server" flag on the command line; if you
leave that off, you get an error message from the JVM saying the flag is unrecognized,
leading you to believe Kohsuke (and whomever taught him this trick) is clearly a few
megs shy in their mental heap. So when you try this trick, make sure to use "-server",
and make sure to run methods enough to force JIT to take place (or set the JIT threshold&amp;nbsp;
using -XX:CompileThreshold=1) in order to see the assembly actually get generated.
&lt;/p&gt;
&lt;p&gt;
Oh, and make sure to swing the dead chicken--fresh, not frozen--by the neck over your
head three times, counterclockwise, while facing the moon and chanting, "Ohwah...
Tanidd... Eyah... Tiam...". If you don't, the whole thing won't work. Seriously.
&lt;/p&gt;
&lt;p&gt;
...
&lt;/p&gt;
&lt;p&gt;
Ever feel like that's how we tune the JVM? Me too. The whole thing is this huge black
box, and it's nearly impossible to extract any kind of useful information without
wandering into the scores of mysterious "-XX" flags, each of which is barely documented,
not guaranteed to do anything visibly useful, and barely understood by anybody outside
of Sun.
&lt;/p&gt;
&lt;p&gt;
Hey, at least we &lt;em&gt;have&lt;/em&gt; those flags in the JVM; the CLR developers have to
take whatever the Microsoft guys give them. ("And they'll &lt;em&gt;like &lt;/em&gt;it, too! Why,
when I was their age, I had to program using nothing but pebbles by the side of the
road on my way to school! Uphill! Both ways! In the raging blizzards of Arizona!")
&lt;/p&gt;
&lt;p&gt;
Interestingly enough, this conversation got me into an argument with a friend of mine
who works for Sun.
&lt;/p&gt;
&lt;p&gt;
During the conversation, I mentioned that I was annoyed at the difficulty a Java developer
has in trying to see how the Java code he/she writes turns into assembly, making it
hard to understand what's really happening inside the black box. After all, the CLR
makes this pretty trivial--when you set a breakpoint in Visual Studio, if you have
the right flags turned on, your C# or VB source is displayed alongside the actual
native instructions, making it fairly easy to see that the JITted code. This was always
of great help when trying to prove to skeptical C++ developers that the CLR wasn't
entirely brain-dead, and did a lot of the optimizations their favorite C++ compiler
did, in some cases even better than the C++ compiler might have done. "Why don't we
have some kind of double-X-show-me-the-code flag, so I can do the same with the JVM?",
I lamented. 
&lt;/p&gt;
&lt;p&gt;
His contention was that this lack of a flag is a &lt;em&gt;good&lt;/em&gt; thing. 
&lt;/p&gt;
&lt;p&gt;
Convinced I was misunderstanding his position, I asked him what he meant by that,
and he said, roughly paraphrasing, that there are only about 20 or so people in the
world who could look at that assembly dump and not draw incredibly misguided impressions
of how the JVM operates internally; more importantly, because so few people could
do anything useful with that output, it was to our collective benefit that this information
was so hard to obtain.
&lt;/p&gt;
&lt;p&gt;
To quote one of my favorite comedians, "Well excuuuuuuuuuuse ME." I was a bit... taken
aback, shall we say.
&lt;/p&gt;
&lt;p&gt;
I understand his point--that sometimes knowledge without the right context around
it can lead to misinterpretation and misunderstanding. I'll agree totally with the
assertion that the JVM is an incredibly complex piece of software that does some &lt;em&gt;very&lt;/em&gt; sophisticated
runtime analysis to get Java code to run faster and faster. I'll even grant you that
the &lt;em&gt;timing&lt;/em&gt; involved in displaying the assembly dump is critical, since Hotspot
re-JITs methods that get used repeatedly, something the CLR has talked about ("code
pitching") but thus far hasn't executed on.
&lt;/p&gt;
&lt;p&gt;
But this idea that only a certain select group of people are smart enough and understand
the JVM well enough to interpret the results correctly? That's dangerous, on several
levels.
&lt;/p&gt;
&lt;p&gt;
First, it's potentially an elitist attitude to take, essentially presenting a "We
look down on you poor peasants who just don't get it" persona, and if word gets out
that this is how Sun views Java developers as a whole, then it's a black mark on Sun's
PR image and causes them some major pain and credibility loss. Now, let me brutally
frank here: For the record, I &lt;em&gt;don't&lt;/em&gt; think this is the case--everybody I've
met at Sun thus far is helpful and down-to-earth, and scary-smart. I have a hard time
believing that they're secretly thumbing their nose at me. I suppose it's possible,
but it's also possible that Bill Gates and Scott McNealy were in cahoots the whole
time, too.
&lt;/p&gt;
&lt;p&gt;
Second, and more importantly, there will never be any more than those 20 people we
have now, unless Sun works to open the deep dark internals of the JVM to more people.
I know I'm not alone in the world in wanting to know how the JVM works at the same
level as I know how the CLR works, and now that the OpenJDK is up and running, if
Sun wants to see any patches or feature enhancements from the community, then they
need to invest in more educational infrastructure to get those of us who are interested
in this stuff more up to speed on the topic.
&lt;/p&gt;
&lt;p&gt;
Third, and most important of all, &lt;em&gt;so long as the JVM remains a black box, the
"myths, legends and lore" will haunt us forever.&lt;/em&gt; Remember when all the Java performance
articles went on and on about how method marked "final" were better-performing and
so therefore should be how you write your Java code? Now, close to ten years later,
we can look back at that and laugh, seeing it for the micro-optimization it is, but
if challenged on this idea, &lt;em&gt;we have no proof.&lt;/em&gt; There is no way to create demonstrable
evidence to prove or disprove this point. Which means, then, that Java developers
can argue this back and forth based on nothing more than our mental model of the JVM
and what "logically makes sense".
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Some will suggest that we can use micro-benchmarks to compare the two options
and see how, after a million iterations, the total elapsed time compares. Brian Goetz
has spent a lot of time and energy refuting this myth, but to put it in some degree
of perspective, a micro-benchmark to prove or disprove the performance benefits of
"final" methods is like changing the motor oil in your car and then driving across
the country over and over again, measuring how long until the engine explodes. You
can do it, but there's going to be so much noise from everything else around the experiment--weather,
your habits as a driver, the speeds at which you're driving, and so on--that the results
will be essentially meaningless unless there is a huge disparity, capable of shining
through the noise.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This is a position born out across history--we've never been able to understand a
system until we can observe it from outside the system; examples abound, such as the
early medical understanding of Aristotle's theories weighed against the medical experiments
performed by the Renaissance thinkers. One story says a skeptic, looking at the body
in front of him disproving one of Aristotle's theories, shook his head and said, "I
would believe you except that it was Aristotle who said it." When mental models are
built on faith, rather than on fact and evidence, progress cannot reasonably occur.
&lt;/p&gt;
&lt;p&gt;
Don't think the analogy holds? How long did we as Java developers hold faith with
the idea that object pools were a good idea, and that objects are expensive to create,
despite the fact that the Hotspot FAQ has explicitly told us otherwise since JDK 1.3?
I &lt;em&gt;still&lt;/em&gt; run into Java developers who insist that object pools are a good
idea all across the board. I show them the Hotspot FAQ page, and they shake their
head and say, "I would believe you except that it was (so-and-so article author) who
said it."
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Oh, and don't get me started on a near-total opacity of the Parrot and Ruby environments,
among others--this isn't a "static vs dynamic" thing, this is something everybody
running on a managed platform needs to be able to do.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I'm tired of arguing from a position of faith. I want evidence to either prove or
disprove my assertions, and more importantly, I want my mental model of how the JVM
operates to improve until it's more reflective of and closer to the reality. I can't
do that until the JVM offers up some mechanisms for gathering that evidence, or at
least for gathering it more easily and comprehensively. You shouldn't have to be a
JVM expert to get some verification that your understanding of how the JVM works is
correct or incorrect.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=b490ca97-7027-4773-ba0a-41d631c9e20c" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,b490ca97-7027-4773-ba0a-41d631c9e20c.aspx</comments>
      <category>.NET</category>
      <category>Java/J2EE</category>
      <category>LLVM</category>
      <category>Parrot</category>
      <category>Ruby</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=c69ffbd1-5107-4a2a-aa34-6419dd855035</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,c69ffbd1-5107-4a2a-aa34-6419dd855035.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,c69ffbd1-5107-4a2a-aa34-6419dd855035.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c69ffbd1-5107-4a2a-aa34-6419dd855035</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Apparently, I'm drawing enough of an audience through this blog that various folks
have started to send me press releases and notifications and requests for... well,
I dunno exactly, but I'm assuming some blogging love of some kind. I'm always a little
leery about that particular subject, because it always has this dangerous potential
to turn the blog into a less-credible marketing device, but people at conferences
have suggested that they really are interested in what I think about various products
and tools, so perhaps it's time to amend my stance on this.
</p>
        <p>
With that in mind, if you are a vendor and have a product that you'd like me to take
a look at and (possibly) offer up a review here, here's the basic rules:
</p>
        <ol>
          <li>
No guarantees. Sending me something will in no way guarantee that I will review your
product, for several reasons, two of which being (a) I get really busy sometimes,
and (b) I may have no interest whatsoever in your product and I refuse to pretend
to do so. (Readers can usually tell when the reviewer isn't all that excited about
the subject, I've found.)</li>
          <li>
If you're not going to send me a "real" version (meaning not the time-locked or feature-crippled
demo), don't bother. I have no idea when I will get around to a review, and I have
no desire to review something that isn't "the real deal". I will in turn promise that
the licensed version you send me (if necessary) will not be used for any purpose other
than my own research and exploration (signing contract if necessary to give you that
"fresh-from-the-lawyer's-office" warm and fuzzy feeling).</li>
          <li>
I say what I think, pro and con. I will not edit my review to suit your marketing
purpose, and if you ask me to do so I will simply note in the review that you have
asked me to do so. I retain full editorial control over what I say about your product.</li>
          <li>
Having established #1, I will try to be as fair as I can about your product, and point
out things that I liked and things that I didn't. (Of course, if I hated it from top
to bottom, I may end up with the only positive thing being "It didn't set the atmosphere
on fire when I started the app", but hey, that's something positive, right?)</li>
          <li>
Also in the spirit of #1, if you send me mail answering questions or complaints in
my review, I will of course amend the review with your comments. You are always welcome
to post comments to the blog entry itself, too. Unless you insult my grandmother,
then I will have to get all DELETE-key on you.</li>
        </ol>
        <p>
The reason I'm posting this here is twofold: one, so my faithful audience of four
blog readers will know the rules under which I'm looking at these products and (hopefully)
realize that I'm not financially vested in any of these products, and two, so the
various vendor folks can read this and know what the rules are up front before even
asking.
</p>
        <p>
I know it sounds a little cheeky to lay this out. The image I get in my head is that
of the kid at Christmas declaring to his grandparents as they walk through the door,
presents in hand, "Make sure it's not a scratchy sweater, I hate scratchy sweaters.
And G.I. Joe was only popular when my Dad was a kid. And if you give me another lunchbox
I will scream until you buy me something cool, like a new GameBoy." Ugh. But I value
the trust that people seem to have in me, and so I risk the perception of cheekiness
for this tiny window in time in order to (hopefully) establish full disclosure over
the reviews that come to pass (which, by the way, will always have the category "review"
applied to them, so you know which is an official review and which is just me exploring,
like the LLVM and Parrot posts of recent time).
</p>
        <p>
We now return you to the regularly-scheduled blog.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c69ffbd1-5107-4a2a-aa34-6419dd855035" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Rules for Review</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,c69ffbd1-5107-4a2a-aa34-6419dd855035.aspx</guid>
      <link>http://blogs.tedneward.com/2008/03/28/Rules+For+Review.aspx</link>
      <pubDate>Fri, 28 Mar 2008 11:18:12 GMT</pubDate>
      <description>&lt;p&gt;
Apparently, I'm drawing enough of an audience through this blog that various folks
have started to send me press releases and notifications and requests for... well,
I dunno exactly, but I'm assuming some blogging love of some kind. I'm always a little
leery about that particular subject, because it always has this dangerous potential
to turn the blog into a less-credible marketing device, but people at conferences
have suggested that they really are interested in what I think about various products
and tools, so perhaps it's time to amend my stance on this.
&lt;/p&gt;
&lt;p&gt;
With that in mind, if you are a vendor and have a product that you'd like me to take
a look at and (possibly) offer up a review here, here's the basic rules:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
No guarantees. Sending me something will in no way guarantee that I will review your
product, for several reasons, two of which being (a) I get really busy sometimes,
and (b) I may have no interest whatsoever in your product and I refuse to pretend
to do so. (Readers can usually tell when the reviewer isn't all that excited about
the subject, I've found.)&lt;/li&gt;
&lt;li&gt;
If you're not going to send me a "real" version (meaning not the time-locked or feature-crippled
demo), don't bother. I have no idea when I will get around to a review, and I have
no desire to review something that isn't "the real deal". I will in turn promise that
the licensed version you send me (if necessary) will not be used for any purpose other
than my own research and exploration (signing contract if necessary to give you that
"fresh-from-the-lawyer's-office" warm and fuzzy feeling).&lt;/li&gt;
&lt;li&gt;
I say what I think, pro and con. I will not edit my review to suit your marketing
purpose, and if you ask me to do so I will simply note in the review that you have
asked me to do so. I retain full editorial control over what I say about your product.&lt;/li&gt;
&lt;li&gt;
Having established #1, I will try to be as fair as I can about your product, and point
out things that I liked and things that I didn't. (Of course, if I hated it from top
to bottom, I may end up with the only positive thing being "It didn't set the atmosphere
on fire when I started the app", but hey, that's something positive, right?)&lt;/li&gt;
&lt;li&gt;
Also in the spirit of #1, if you send me mail answering questions or complaints in
my review, I will of course amend the review with your comments. You are always welcome
to post comments to the blog entry itself, too. Unless you insult my grandmother,
then I will have to get all DELETE-key on you.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The reason I'm posting this here is twofold: one, so my faithful audience of four
blog readers will know the rules under which I'm looking at these products and (hopefully)
realize that I'm not financially vested in any of these products, and two, so the
various vendor folks can read this and know what the rules are up front before even
asking.
&lt;/p&gt;
&lt;p&gt;
I know it sounds a little cheeky to lay this out. The image I get in my head is that
of the kid at Christmas declaring to his grandparents as they walk through the door,
presents in hand, "Make sure it's not a scratchy sweater, I hate scratchy sweaters.
And G.I. Joe was only popular when my Dad was a kid. And if you give me another lunchbox
I will scream until you buy me something cool, like a new GameBoy." Ugh. But I value
the trust that people seem to have in me, and so I risk the perception of cheekiness
for this tiny window in time in order to (hopefully) establish full disclosure over
the reviews that come to pass (which, by the way, will always have the category "review"
applied to them, so you know which is an official review and which is just me exploring,
like the LLVM and Parrot posts of recent time).
&lt;/p&gt;
&lt;p&gt;
We now return you to the regularly-scheduled blog.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c69ffbd1-5107-4a2a-aa34-6419dd855035" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,c69ffbd1-5107-4a2a-aa34-6419dd855035.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>VMWare</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=a5152352-9d77-4bd5-8cc5-31c75443ea90</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,a5152352-9d77-4bd5-8cc5-31c75443ea90.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,a5152352-9d77-4bd5-8cc5-31c75443ea90.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a5152352-9d77-4bd5-8cc5-31c75443ea90</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple of people have asked me over the last few weeks, so it's probably worth saying
out loud: 
</p>
        <p>
No, I don't work for a large company, so yes, I'm available for consulting and research
projects. If you've got one of those burning questions like, "How would our company/project/department/whatever
make use of JRuby-and-Rails, and what would the impact to the rest of the system be",
or "Could using F# help us write applications faster", or "How would we best integrate
Groovy into our application", or "How does the new Adobe Flex/AIR move help us build
richer client apps", or "How do we improve the performance of our Java/.NET app",
or other questions along those lines, drop me a line and let's talk. Not only will
I cook up a prototype describing the answer, but I'll meet with your management and
explain the consequences of the research, both pro and con, for them to evaluate.
</p>
        <p>
Shameless call for consulting complete, now back to the regularly-scheduled programming.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=a5152352-9d77-4bd5-8cc5-31c75443ea90" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Reminder</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,a5152352-9d77-4bd5-8cc5-31c75443ea90.aspx</guid>
      <link>http://blogs.tedneward.com/2008/03/22/Reminder.aspx</link>
      <pubDate>Sat, 22 Mar 2008 10:43:18 GMT</pubDate>
      <description>&lt;p&gt;
A couple of people have asked me over the last few weeks, so it's probably worth saying
out loud: 
&lt;/p&gt;
&lt;p&gt;
No, I don't work for a large company, so yes, I'm available for consulting and research
projects. If you've got one of those burning questions like, "How would our company/project/department/whatever
make use of JRuby-and-Rails, and what would the impact to the rest of the system be",
or "Could using F# help us write applications faster", or "How would we best integrate
Groovy into our application", or "How does the new Adobe Flex/AIR move help us build
richer client apps", or "How do we improve the performance of our Java/.NET app",
or other questions along those lines, drop me a line and let's talk. Not only will
I cook up a prototype describing the answer, but I'll meet with your management and
explain the consequences of the research, both pro and con, for them to evaluate.
&lt;/p&gt;
&lt;p&gt;
Shameless call for consulting complete, now back to the regularly-scheduled programming.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=a5152352-9d77-4bd5-8cc5-31c75443ea90" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,a5152352-9d77-4bd5-8cc5-31c75443ea90.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>VMWare</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=36b0ccfa-17e4-4397-a237-f714b3270582</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,36b0ccfa-17e4-4397-a237-f714b3270582.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,36b0ccfa-17e4-4397-a237-f714b3270582.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=36b0ccfa-17e4-4397-a237-f714b3270582</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
LLVM definitely does some interesting things as part of its toolchain.
</p>
        <p>
Consider the humble HelloWorld:
</p>
        <blockquote>
          <div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4">
            <div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum1" style="color: #606060"> 1:</span>
                <span style="color: #cc6633">#include</span> &lt;stdio.h&gt;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum2" style="color: #606060"> 2:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum3" style="color: #606060"> 3:</span>
                <span style="color: #0000ff">int</span> main()
{</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum4" style="color: #606060"> 4:</span> printf(<span style="color: #006080">"hello
world\n"</span>);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum5" style="color: #606060"> 5:</span>
                <span style="color: #0000ff">return</span> 0;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum6" style="color: #606060"> 6:</span> }</pre>
              <!--CRLF-->
            </div>
          </div>
        </blockquote>
        <p>
Assuming you have a functioning llvm and llvm-gcc working on your system, you can
compile it into LLVM bitcode. This bitcode is directly executable using the lli.exe
from llvm:
</p>
        <blockquote>
          <p>
            <font face="Courier New">$ lli &lt; hello.bc<br />
hello world</font>
          </p>
        </blockquote>
        <p>
Meh. Not so interesting. Let's look at the LLVM bitcode for the code, though--that's
interesting as a first peek at what LLVM bitcode might look like:
</p>
        <blockquote>
          <div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4">
            <div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum1" style="color: #606060"> 1:</span> ;
ModuleID = <span style="color: #006080">'&lt;stdin&gt;'</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum2" style="color: #606060"> 2:</span> target
datalayout = <span style="color: #006080">"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum3" style="color: #606060"> 3:</span> target
triple = <span style="color: #006080">"mingw32"</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum4" style="color: #606060"> 4:</span> @.str
= internal constant [12 x i8] c<span style="color: #006080">"hello world\00"</span> ;
&lt;[12 x i8]*&gt; [#uses=1] </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum5" style="color: #606060"> 5:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum6" style="color: #606060"> 6:</span> define
i32 @main() {</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum7" style="color: #606060"> 7:</span> entry:</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum8" style="color: #606060"> 8:</span> %tmp2
= tail call i32 @puts( i8* getelementptr ([12 x i8]* @.str, i32 0, i32 0) ) ; &lt;i32&gt;
[#uses=0]</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum9" style="color: #606060"> 9:</span> ret
i32 0</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum10" style="color: #606060"> 10:</span> } </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum11" style="color: #606060"> 11:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum12" style="color: #606060"> 12:</span> declare
i32 @puts(i8*)</pre>
              <!--CRLF-->
            </div>
          </div>
        </blockquote>
        <p>
Hmm. Now of course, LLVM also has to be able to get down to actual machine instructions,
and in point of fact there is a tool in the LLVM toolchain, called llc, that can do
this transformation ahead-of-time, like so:
</p>
        <blockquote>
          <p>
            <font face="Courier New">$ llc hello.bc -o hello.bc.s -march x86</font>
          </p>
        </blockquote>
        <p>
And, looking at the results, we see...
</p>
        <blockquote>
          <div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4">
            <div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum1" style="color: #606060"> 1:</span> .text</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum2" style="color: #606060"> 2:</span> .align
16</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum3" style="color: #606060"> 3:</span> .globl
_main</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum4" style="color: #606060"> 4:</span> .def
_main; .scl 2; .type 32; .endef</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum5" style="color: #606060"> 5:</span> n:</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum6" style="color: #606060"> 6:</span> pushl
%ebp</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum7" style="color: #606060"> 7:</span> movl
%esp, %ebp</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum8" style="color: #606060"> 8:</span> subl
$8, %esp</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum9" style="color: #606060"> 9:</span> andl
$4294967280, %esp</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum10" style="color: #606060"> 10:</span> movl
$16, %eax</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum11" style="color: #606060"> 11:</span> call
__alloca</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum12" style="color: #606060"> 12:</span> call
___main</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum13" style="color: #606060"> 13:</span> movl
$_.str, (%esp)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum14" style="color: #606060"> 14:</span> call
_puts</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum15" style="color: #606060"> 15:</span> xorl
%eax, %eax</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum16" style="color: #606060"> 16:</span> movl
%ebp, %esp</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum17" style="color: #606060"> 17:</span> popl
%ebp</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum18" style="color: #606060"> 18:</span> ret</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum19" style="color: #606060"> 19:</span> .data</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum20" style="color: #606060"> 20:</span> r:
# .str</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum21" style="color: #606060"> 21:</span> .asciz <span style="color: #006080">"hello
world"</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum22" style="color: #606060"> 22:</span> .def
_puts; .scl 2; .type 32; .endef</pre>
              <!--CRLF-->
            </div>
          </div>
        </blockquote>
        <p>
Bleah. Assembly language, and in NASM format, to boot. (What did you expect, anyway?)
</p>
        <p>
Of course, assembly language and C were always considered fairly close together in
terms of their abstraction layer (C was designed as a replacement for assembly language
when porting Unix, remember), so it might not be too hard to...
</p>
        <blockquote>
          <p>
            <font face="Courier New">$ llc hello.bc -o hello.bc.c -march c</font>
          </p>
        </blockquote>
        <p>
And get...
</p>
        <blockquote>
          <div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4">
            <div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum1" style="color: #606060"> 1:</span>
                <span style="color: #008000">/*
Provide Declarations */</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum2" style="color: #606060"> 2:</span>
                <span style="color: #cc6633">#include</span> &lt;stdarg.h&gt;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum3" style="color: #606060"> 3:</span>
                <span style="color: #cc6633">#include</span> &lt;setjmp.h&gt;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum4" style="color: #606060"> 4:</span>
                <span style="color: #008000">/*
get a declaration for alloca */</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum5" style="color: #606060"> 5:</span>
                <span style="color: #cc6633">#if</span> defined(__CYGWIN__)
|| defined(__MINGW32__)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum6" style="color: #606060"> 6:</span>
                <span style="color: #cc6633">#define</span> alloca(x)
__builtin_alloca((x))</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum7" style="color: #606060"> 7:</span>
                <span style="color: #cc6633">#define</span> _alloca(x)
__builtin_alloca((x))</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum8" style="color: #606060"> 8:</span>
                <span style="color: #cc6633">#elif</span> defined(__APPLE__)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum9" style="color: #606060"> 9:</span>
                <span style="color: #0000ff">extern</span>
                <span style="color: #0000ff">void</span> *__builtin_alloca(<span style="color: #0000ff">unsigned</span><span style="color: #0000ff">long</span>);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum10" style="color: #606060"> 10:</span>
                <span style="color: #cc6633">#define</span> alloca(x)
__builtin_alloca(x)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum11" style="color: #606060"> 11:</span>
                <span style="color: #cc6633">#define</span> longjmp
_longjmp</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum12" style="color: #606060"> 12:</span>
                <span style="color: #cc6633">#define</span> setjmp
_setjmp</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum13" style="color: #606060"> 13:</span>
                <span style="color: #cc6633">#elif</span> defined(__sun__)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum14" style="color: #606060"> 14:</span>
                <span style="color: #cc6633">#if</span> defined(__sparcv9)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum15" style="color: #606060"> 15:</span>
                <span style="color: #0000ff">extern</span>
                <span style="color: #0000ff">void</span> *__builtin_alloca(<span style="color: #0000ff">unsigned</span><span style="color: #0000ff">long</span>);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum16" style="color: #606060"> 16:</span>
                <span style="color: #cc6633">#else</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum17" style="color: #606060"> 17:</span>
                <span style="color: #0000ff">extern</span>
                <span style="color: #0000ff">void</span> *__builtin_alloca(<span style="color: #0000ff">unsigned</span><span style="color: #0000ff">int</span>);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum18" style="color: #606060"> 18:</span>
                <span style="color: #cc6633">#endif</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum19" style="color: #606060"> 19:</span>
                <span style="color: #cc6633">#define</span> alloca(x)
__builtin_alloca(x)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum20" style="color: #606060"> 20:</span>
                <span style="color: #cc6633">#elif</span> defined(__FreeBSD__)
|| defined(__NetBSD__) || defined(__OpenBSD__)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum21" style="color: #606060"> 21:</span>
                <span style="color: #cc6633">#define</span> alloca(x)
__builtin_alloca(x)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum22" style="color: #606060"> 22:</span>
                <span style="color: #cc6633">#elif</span> defined(_MSC_VER)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum23" style="color: #606060"> 23:</span>
                <span style="color: #cc6633">#define</span>
                <span style="color: #0000ff">inline</span> _inline</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum24" style="color: #606060"> 24:</span>
                <span style="color: #cc6633">#define</span> alloca(x)
_alloca(x)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum25" style="color: #606060"> 25:</span>
                <span style="color: #cc6633">#else</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum26" style="color: #606060"> 26:</span>
                <span style="color: #cc6633">#include</span> &lt;alloca.h&gt;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum27" style="color: #606060"> 27:</span>
                <span style="color: #cc6633">#endif</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum28" style="color: #606060"> 28:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum29" style="color: #606060"> 29:</span>
                <span style="color: #cc6633">#ifndef</span> __GNUC__ <span style="color: #008000">/*
Can only support "linkonce" vars with GCC */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum30" style="color: #606060"> 30:</span>
                <span style="color: #cc6633">#define</span> __attribute__(X)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum31" style="color: #606060"> 31:</span>
                <span style="color: #cc6633">#endif</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum32" style="color: #606060"> 32:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum33" style="color: #606060"> 33:</span>
                <span style="color: #cc6633">#if</span> defined(__GNUC__)
&amp;&amp; defined(__APPLE_CC__)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum34" style="color: #606060"> 34:</span>
                <span style="color: #cc6633">#define</span> __EXTERNAL_WEAK__
__attribute__((weak_import))</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum35" style="color: #606060"> 35:</span>
                <span style="color: #cc6633">#elif</span> defined(__GNUC__)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum36" style="color: #606060"> 36:</span>
                <span style="color: #cc6633">#define</span> __EXTERNAL_WEAK__
__attribute__((weak))</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum37" style="color: #606060"> 37:</span>
                <span style="color: #cc6633">#else</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum38" style="color: #606060"> 38:</span>
                <span style="color: #cc6633">#define</span> __EXTERNAL_WEAK__</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum39" style="color: #606060"> 39:</span>
                <span style="color: #cc6633">#endif</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum40" style="color: #606060"> 40:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum41" style="color: #606060"> 41:</span>
                <span style="color: #cc6633">#if</span> defined(__GNUC__)
&amp;&amp; defined(__APPLE_CC__)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum42" style="color: #606060"> 42:</span>
                <span style="color: #cc6633">#define</span> __ATTRIBUTE_WEAK__</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum43" style="color: #606060"> 43:</span>
                <span style="color: #cc6633">#elif</span> defined(__GNUC__)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum44" style="color: #606060"> 44:</span>
                <span style="color: #cc6633">#define</span> __ATTRIBUTE_WEAK__
__attribute__((weak))</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum45" style="color: #606060"> 45:</span>
                <span style="color: #cc6633">#else</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum46" style="color: #606060"> 46:</span>
                <span style="color: #cc6633">#define</span> __ATTRIBUTE_WEAK__</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum47" style="color: #606060"> 47:</span>
                <span style="color: #cc6633">#endif</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum48" style="color: #606060"> 48:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum49" style="color: #606060"> 49:</span>
                <span style="color: #cc6633">#if</span> defined(__GNUC__)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum50" style="color: #606060"> 50:</span>
                <span style="color: #cc6633">#define</span> __HIDDEN__
__attribute__((visibility(<span style="color: #006080">"hidden"</span>)))</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum51" style="color: #606060"> 51:</span>
                <span style="color: #cc6633">#endif</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum52" style="color: #606060"> 52:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum53" style="color: #606060"> 53:</span>
                <span style="color: #cc6633">#ifdef</span> __GNUC__</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum54" style="color: #606060"> 54:</span>
                <span style="color: #cc6633">#define</span> LLVM_NAN(NanStr)
__builtin_nan(NanStr) <span style="color: #008000">/* Double */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum55" style="color: #606060"> 55:</span>
                <span style="color: #cc6633">#define</span> LLVM_NANF(NanStr)
__builtin_nanf(NanStr) <span style="color: #008000">/* Float */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum56" style="color: #606060"> 56:</span>
                <span style="color: #cc6633">#define</span> LLVM_NANS(NanStr)
__builtin_nans(NanStr) <span style="color: #008000">/* Double */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum57" style="color: #606060"> 57:</span>
                <span style="color: #cc6633">#define</span> LLVM_NANSF(NanStr)
__builtin_nansf(NanStr) <span style="color: #008000">/* Float */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum58" style="color: #606060"> 58:</span>
                <span style="color: #cc6633">#define</span> LLVM_INF
__builtin_inf() <span style="color: #008000">/* Double */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum59" style="color: #606060"> 59:</span>
                <span style="color: #cc6633">#define</span> LLVM_INFF
__builtin_inff() <span style="color: #008000">/* Float */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum60" style="color: #606060"> 60:</span>
                <span style="color: #cc6633">#define</span> LLVM_PREFETCH(addr,rw,locality)
__builtin_prefetch(addr,rw,locality)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum61" style="color: #606060"> 61:</span>
                <span style="color: #cc6633">#define</span> __ATTRIBUTE_CTOR__
__attribute__((constructor))</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum62" style="color: #606060"> 62:</span>
                <span style="color: #cc6633">#define</span> __ATTRIBUTE_DTOR__
__attribute__((destructor))</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum63" style="color: #606060"> 63:</span>
                <span style="color: #cc6633">#define</span> LLVM_ASM
__asm__</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum64" style="color: #606060"> 64:</span>
                <span style="color: #cc6633">#else</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum65" style="color: #606060"> 65:</span>
                <span style="color: #cc6633">#define</span> LLVM_NAN(NanStr)
((<span style="color: #0000ff">double</span>)0.0) <span style="color: #008000">/*
Double */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum66" style="color: #606060"> 66:</span>
                <span style="color: #cc6633">#define</span> LLVM_NANF(NanStr)
0.0F <span style="color: #008000">/* Float */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum67" style="color: #606060"> 67:</span>
                <span style="color: #cc6633">#define</span> LLVM_NANS(NanStr)
((<span style="color: #0000ff">double</span>)0.0) <span style="color: #008000">/*
Double */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum68" style="color: #606060"> 68:</span>
                <span style="color: #cc6633">#define</span> LLVM_NANSF(NanStr)
0.0F <span style="color: #008000">/* Float */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum69" style="color: #606060"> 69:</span>
                <span style="color: #cc6633">#define</span> LLVM_INF
((<span style="color: #0000ff">double</span>)0.0) <span style="color: #008000">/*
Double */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum70" style="color: #606060"> 70:</span>
                <span style="color: #cc6633">#define</span> LLVM_INFF
0.0F <span style="color: #008000">/* Float */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum71" style="color: #606060"> 71:</span>
                <span style="color: #cc6633">#define</span> LLVM_PREFETCH(addr,rw,locality) <span style="color: #008000">/*
PREFETCH */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum72" style="color: #606060"> 72:</span>
                <span style="color: #cc6633">#define</span> __ATTRIBUTE_CTOR__</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum73" style="color: #606060"> 73:</span>
                <span style="color: #cc6633">#define</span> __ATTRIBUTE_DTOR__</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum74" style="color: #606060"> 74:</span>
                <span style="color: #cc6633">#define</span> LLVM_ASM(X)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum75" style="color: #606060"> 75:</span>
                <span style="color: #cc6633">#endif</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum76" style="color: #606060"> 76:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum77" style="color: #606060"> 77:</span>
                <span style="color: #cc6633">#if</span> __GNUC__
&lt; 4 <span style="color: #008000">/* Old GCC's, or compilers not GCC */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum78" style="color: #606060"> 78:</span>
                <span style="color: #cc6633">#define</span> __builtin_stack_save()
0 <span style="color: #008000">/* not implemented */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum79" style="color: #606060"> 79:</span>
                <span style="color: #cc6633">#define</span> __builtin_stack_restore(X) <span style="color: #008000">/*
noop */</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum80" style="color: #606060"> 80:</span>
                <span style="color: #cc6633">#endif</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum81" style="color: #606060"> 81:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum82" style="color: #606060"> 82:</span>
                <span style="color: #cc6633">#define</span> CODE_FOR_MAIN() <span style="color: #008000">/*
Any target-specific code for main()*/</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum83" style="color: #606060"> 83:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum84" style="color: #606060"> 84:</span>
                <span style="color: #cc6633">#ifndef</span> __cplusplus</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum85" style="color: #606060"> 85:</span>
                <span style="color: #0000ff">typedef</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">char</span>
                <span style="color: #0000ff">bool</span>;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum86" style="color: #606060"> 86:</span>
                <span style="color: #cc6633">#endif</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum87" style="color: #606060"> 87:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum88" style="color: #606060"> 88:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum89" style="color: #606060"> 89:</span>
                <span style="color: #008000">/*
Support for floating point constants */</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum90" style="color: #606060"> 90:</span>
                <span style="color: #0000ff">typedef</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">long</span>
                <span style="color: #0000ff">long</span> ConstantDoubleTy;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum91" style="color: #606060"> 91:</span>
                <span style="color: #0000ff">typedef</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">int</span> ConstantFloatTy;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum92" style="color: #606060"> 92:</span>
                <span style="color: #0000ff">typedef</span>
                <span style="color: #0000ff">struct</span> { <span style="color: #0000ff">unsigned</span><span style="color: #0000ff">long</span><span style="color: #0000ff">long</span> f1; <span style="color: #0000ff">unsigned</span><span style="color: #0000ff">short</span> f2; <span style="color: #0000ff">unsigned</span><span style="color: #0000ff">short</span> pad[3];
} ConstantFP80Ty;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum93" style="color: #606060"> 93:</span>
                <span style="color: #0000ff">typedef</span>
                <span style="color: #0000ff">struct</span> { <span style="color: #0000ff">unsigned</span><span style="color: #0000ff">long</span><span style="color: #0000ff">long</span> f1; <span style="color: #0000ff">unsigned</span><span style="color: #0000ff">long</span><span style="color: #0000ff">long</span> f2;
} ConstantFP128Ty;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum94" style="color: #606060"> 94:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum95" style="color: #606060"> 95:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum96" style="color: #606060"> 96:</span>
                <span style="color: #008000">/*
Global Declarations */</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum97" style="color: #606060"> 97:</span>
                <span style="color: #008000">/*
Helper union for bitcasts */</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum98" style="color: #606060"> 98:</span>
                <span style="color: #0000ff">typedef</span>
                <span style="color: #0000ff">union</span> {</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum99" style="color: #606060"> 99:</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">int</span> Int32;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum100" style="color: #606060"> 100:</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">long</span>
                <span style="color: #0000ff">long</span> Int64;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum101" style="color: #606060"> 101:</span>
                <span style="color: #0000ff">float</span> Float;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum102" style="color: #606060"> 102:</span>
                <span style="color: #0000ff">double</span> Double;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum103" style="color: #606060"> 103:</span> }
llvmBitCastUnion;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum104" style="color: #606060"> 104:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum105" style="color: #606060"> 105:</span>
                <span style="color: #008000">/*
External Global Variable Declarations */</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum106" style="color: #606060"> 106:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum107" style="color: #606060"> 107:</span>
                <span style="color: #008000">/*
Function Declarations */</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum108" style="color: #606060"> 108:</span>
                <span style="color: #0000ff">double</span> fmod(<span style="color: #0000ff">double</span>, <span style="color: #0000ff">double</span>);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum109" style="color: #606060"> 109:</span>
                <span style="color: #0000ff">float</span> fmodf(<span style="color: #0000ff">float</span>, <span style="color: #0000ff">float</span>);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum110" style="color: #606060"> 110:</span>
                <span style="color: #0000ff">long</span>
                <span style="color: #0000ff">double</span> fmodl(<span style="color: #0000ff">long</span><span style="color: #0000ff">double</span>, <span style="color: #0000ff">long</span><span style="color: #0000ff">double</span>);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum111" style="color: #606060"> 111:</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">int</span> main(<span style="color: #0000ff">void</span>);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum112" style="color: #606060"> 112:</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">int</span> puts(<span style="color: #0000ff">unsigned</span><span style="color: #0000ff">char</span> *);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum113" style="color: #606060"> 113:</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">char</span> *malloc();</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum114" style="color: #606060"> 114:</span>
                <span style="color: #0000ff">void</span> free(<span style="color: #0000ff">unsigned</span><span style="color: #0000ff">char</span> *);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum115" style="color: #606060"> 115:</span>
                <span style="color: #0000ff">void</span> abort(<span style="color: #0000ff">void</span>);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum116" style="color: #606060"> 116:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum117" style="color: #606060"> 117:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum118" style="color: #606060"> 118:</span>
                <span style="color: #008000">/*
Global Variable Declarations */</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum119" style="color: #606060"> 119:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">char</span> _2E_str[12];</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum120" style="color: #606060"> 120:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum121" style="color: #606060"> 121:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum122" style="color: #606060"> 122:</span>
                <span style="color: #008000">/*
Global Variable Definitions and Initialization */</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum123" style="color: #606060"> 123:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">char</span> _2E_str[12]
= <span style="color: #006080">"hello world"</span>;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum124" style="color: #606060"> 124:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum125" style="color: #606060"> 125:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum126" style="color: #606060"> 126:</span>
                <span style="color: #008000">/*
Function Bodies */</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum127" style="color: #606060"> 127:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_ord(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X == X &amp;&amp; Y == Y; }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum128" style="color: #606060"> 128:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_uno(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X != X || Y != Y; }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum129" style="color: #606060"> 129:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_ueq(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X == Y || llvm_fcmp_uno(X, Y); }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum130" style="color: #606060"> 130:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_une(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X != Y; }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum131" style="color: #606060"> 131:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_ult(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X &lt; Y || llvm_fcmp_uno(X, Y); }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum132" style="color: #606060"> 132:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_ugt(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X &gt; Y || llvm_fcmp_uno(X, Y); }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum133" style="color: #606060"> 133:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_ule(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X &lt;= Y || llvm_fcmp_uno(X, Y); }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum134" style="color: #606060"> 134:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_uge(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X &gt;= Y || llvm_fcmp_uno(X, Y); }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum135" style="color: #606060"> 135:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_oeq(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X == Y ; }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum136" style="color: #606060"> 136:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_one(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X != Y &amp;&amp; llvm_fcmp_ord(X, Y);
}</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum137" style="color: #606060"> 137:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_olt(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X &lt; Y ; }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum138" style="color: #606060"> 138:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_ogt(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X &gt; Y ; }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum139" style="color: #606060"> 139:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_ole(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X &lt;= Y ; }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum140" style="color: #606060"> 140:</span>
                <span style="color: #0000ff">static</span>
                <span style="color: #0000ff">inline</span>
                <span style="color: #0000ff">int</span> llvm_fcmp_oge(<span style="color: #0000ff">double</span> X, <span style="color: #0000ff">double</span> Y)
{ <span style="color: #0000ff">return</span> X &gt;= Y ; }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum141" style="color: #606060"> 141:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum142" style="color: #606060"> 142:</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">int</span> main(<span style="color: #0000ff">void</span>)
{</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum143" style="color: #606060"> 143:</span>
                <span style="color: #0000ff">unsigned</span>
                <span style="color: #0000ff">int</span> llvm_cbe_tmp2;</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum144" style="color: #606060"> 144:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum145" style="color: #606060"> 145:</span> CODE_FOR_MAIN();</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum146" style="color: #606060"> 146:</span> llvm_cbe_tmp2
= <span style="color: #008000">/*tail*/</span> puts((&amp;(_2E_str[((<span style="color: #0000ff">signed</span><span style="color: #0000ff">int</span> )((<span style="color: #0000ff">unsigned</span><span style="color: #0000ff">int</span> )0))])));</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum147" style="color: #606060"> 147:</span>
                <span style="color: #0000ff">return</span> ((<span style="color: #0000ff">unsigned</span><span style="color: #0000ff">int</span> )0);</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum148" style="color: #606060"> 148:</span> }</pre>
              <!--CRLF-->
            </div>
          </div>
        </blockquote>
        <p>
Granted, it's some ugly-looking C code, with all those preprocessor fragments floating
around in there, but if you take a few moments and go down to the main() definition,
it's C to bitcode to C. We've come full circle.
</p>
        <p>
Looking back at that first disassembly dump, I'm struck by how LLVM bitcode looks
a lot like any other high-level assembly or low-level virtual machine language, even
reminiscent of MSIL. In fact, there's probably a pretty close correlation between
LLVM bitcode and MSIL.
</p>
        <p>
In point of fact, LLVM knows this, too:
</p>
        <blockquote>
          <p>
            <font face="Courier New">$ llc hello.bc -o hello.bc.il -march msil</font>
          </p>
        </blockquote>
        <p>
And check out what it generates:
</p>
        <blockquote>
          <div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4">
            <div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum1" style="color: #606060"> 1:</span> .assembly <span style="color: #0000ff">extern</span> mscorlib
{}</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum2" style="color: #606060"> 2:</span> .assembly
MSIL {}</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum3" style="color: #606060"> 3:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum4" style="color: #606060"> 4:</span>
                <span style="color: #008000">//
External</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum5" style="color: #606060"> 5:</span> .method <span style="color: #0000ff">static</span> hidebysig
pinvokeimpl(<span style="color: #006080">"MSVCRT.DLL"</span>)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum6" style="color: #606060"> 6:</span>
                <span style="color: #0000ff">unsigned</span> int32
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) <span style="color: #006080">'puts'</span>(<span style="color: #0000ff">void</span>*
) preservesig {}</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum7" style="color: #606060"> 7:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum8" style="color: #606060"> 8:</span> .method <span style="color: #0000ff">static</span> hidebysig
pinvokeimpl(<span style="color: #006080">"MSVCRT.DLL"</span>)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum9" style="color: #606060"> 9:</span> vararg <span style="color: #0000ff">void</span>*
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) <span style="color: #006080">'malloc'</span>()
preservesig {}</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum10" style="color: #606060"> 10:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum11" style="color: #606060"> 11:</span> .method <span style="color: #0000ff">static</span> hidebysig
pinvokeimpl(<span style="color: #006080">"MSVCRT.DLL"</span>)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum12" style="color: #606060"> 12:</span>
                <span style="color: #0000ff">void</span> modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) <span style="color: #006080">'free'</span>(<span style="color: #0000ff">void</span>*
) preservesig {}</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum13" style="color: #606060"> 13:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum14" style="color: #606060"> 14:</span> .method <span style="color: #0000ff">public</span> hidebysig <span style="color: #0000ff">static</span> pinvokeimpl(<span style="color: #006080">"KERNEL32.DLL"</span> ansi
winapi) native <span style="color: #0000ff">int</span> LoadLibrary(string) preservesig
{}</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum15" style="color: #606060"> 15:</span> .method <span style="color: #0000ff">public</span> hidebysig <span style="color: #0000ff">static</span> pinvokeimpl(<span style="color: #006080">"KERNEL32.DLL"</span> ansi
winapi) native <span style="color: #0000ff">int</span> GetProcAddress(native <span style="color: #0000ff">int</span>,
string) preservesig {}</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum16" style="color: #606060"> 16:</span> .method <span style="color: #0000ff">private</span><span style="color: #0000ff">static</span><span style="color: #0000ff">void</span>*
$MSIL_Import(string lib,string sym)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum17" style="color: #606060"> 17:</span>
                <span style="color: #cc6633">managed</span> cil</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum18" style="color: #606060"> 18:</span> {</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum19" style="color: #606060"> 19:</span> ldarg
lib</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum20" style="color: #606060"> 20:</span> call
native <span style="color: #0000ff">int</span> LoadLibrary(string)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum21" style="color: #606060"> 21:</span> ldarg
sym</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum22" style="color: #606060"> 22:</span> call
native <span style="color: #0000ff">int</span> GetProcAddress(native <span style="color: #0000ff">int</span>,string)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum23" style="color: #606060"> 23:</span> dup</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum24" style="color: #606060"> 24:</span> brtrue
L_01</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum25" style="color: #606060"> 25:</span> ldstr <span style="color: #006080">"Can
no import variable"</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum26" style="color: #606060"> 26:</span> newobj
instance <span style="color: #0000ff">void</span> [mscorlib]System.Exception::.ctor(string)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum27" style="color: #606060"> 27:</span>
                <span style="color: #0000ff">throw</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum28" style="color: #606060"> 28:</span> L_01:</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum29" style="color: #606060"> 29:</span> ret</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum30" style="color: #606060"> 30:</span> }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum31" style="color: #606060"> 31:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum32" style="color: #606060"> 32:</span> .method <span style="color: #0000ff">static</span><span style="color: #0000ff">private</span><span style="color: #0000ff">void</span> $MSIL_Init() <span style="color: #cc6633">managed</span> cil</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum33" style="color: #606060"> 33:</span> {</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum34" style="color: #606060"> 34:</span> ret</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum35" style="color: #606060"> 35:</span> }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum36" style="color: #606060"> 36:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum37" style="color: #606060"> 37:</span>
                <span style="color: #008000">//
Declarations</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum38" style="color: #606060"> 38:</span> .<span style="color: #0000ff">class</span> value <span style="color: #0000ff">explicit</span> ansi
sealed <span style="color: #006080">'unsigned int8 [12]'</span> { .pack 1 .size 12
}</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum39" style="color: #606060"> 39:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum40" style="color: #606060"> 40:</span>
                <span style="color: #008000">//
Definitions</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum41" style="color: #606060"> 41:</span> .field <span style="color: #0000ff">static</span><span style="color: #0000ff">private</span> valuetype <span style="color: #006080">'unsigned
int8 [12]'</span><span style="color: #006080">'.str'</span> at <span style="color: #006080">'.str$data'</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum42" style="color: #606060"> 42:</span> .data <span style="color: #006080">'.str$data'</span> =
{</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum43" style="color: #606060"> 43:</span> int8
(104),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum44" style="color: #606060"> 44:</span> int8
(101),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum45" style="color: #606060"> 45:</span> int8
(108),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum46" style="color: #606060"> 46:</span> int8
(108),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum47" style="color: #606060"> 47:</span> int8
(111),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum48" style="color: #606060"> 48:</span> int8
(32),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum49" style="color: #606060"> 49:</span> int8
(119),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum50" style="color: #606060"> 50:</span> int8
(111),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum51" style="color: #606060"> 51:</span> int8
(114),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum52" style="color: #606060"> 52:</span> int8
(108),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum53" style="color: #606060"> 53:</span> int8
(100),</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum54" style="color: #606060"> 54:</span> int8
(0) [1]</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum55" style="color: #606060"> 55:</span> }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum56" style="color: #606060"> 56:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum57" style="color: #606060"> 57:</span>
                <span style="color: #008000">//
Startup code</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum58" style="color: #606060"> 58:</span> .method <span style="color: #0000ff">static</span><span style="color: #0000ff">public</span> int32
$MSIL_Startup() {</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum59" style="color: #606060"> 59:</span> .entrypoint</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum60" style="color: #606060"> 60:</span> .locals
(native <span style="color: #0000ff">int</span> i)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum61" style="color: #606060"> 61:</span> .locals
(native <span style="color: #0000ff">int</span> argc)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum62" style="color: #606060"> 62:</span> .locals
(native <span style="color: #0000ff">int</span> ptr)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum63" style="color: #606060"> 63:</span> .locals
(<span style="color: #0000ff">void</span>* argv)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum64" style="color: #606060"> 64:</span> .locals
(string[] args)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum65" style="color: #606060"> 65:</span> call
string[] [mscorlib]System.Environment::GetCommandLineArgs()</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum66" style="color: #606060"> 66:</span> dup</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum67" style="color: #606060"> 67:</span> stloc
args</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum68" style="color: #606060"> 68:</span> ldlen</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum69" style="color: #606060"> 69:</span> conv.i4</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum70" style="color: #606060"> 70:</span> dup</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum71" style="color: #606060"> 71:</span> stloc
argc</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum72" style="color: #606060"> 72:</span> ldc.i4
4</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum73" style="color: #606060"> 73:</span> mul</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum74" style="color: #606060"> 74:</span> localloc</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum75" style="color: #606060"> 75:</span> stloc
argv</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum76" style="color: #606060"> 76:</span> ldc.i4.0</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum77" style="color: #606060"> 77:</span> stloc
i</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum78" style="color: #606060"> 78:</span> L_01:</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum79" style="color: #606060"> 79:</span> ldloc
i</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum80" style="color: #606060"> 80:</span> ldloc
argc</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum81" style="color: #606060"> 81:</span> ceq</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum82" style="color: #606060"> 82:</span> brtrue
L_02</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum83" style="color: #606060"> 83:</span> ldloc
args</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum84" style="color: #606060"> 84:</span> ldloc
i</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum85" style="color: #606060"> 85:</span> ldelem.ref</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum86" style="color: #606060"> 86:</span> call
native <span style="color: #0000ff">int</span> [mscorlib]System.Runtime.InteropServices.Marshal::StringToHGlobalAnsi(string)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum87" style="color: #606060"> 87:</span> stloc
ptr</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum88" style="color: #606060"> 88:</span> ldloc
argv</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum89" style="color: #606060"> 89:</span> ldloc
i</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum90" style="color: #606060"> 90:</span> ldc.i4
4</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum91" style="color: #606060"> 91:</span> mul</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum92" style="color: #606060"> 92:</span> add</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum93" style="color: #606060"> 93:</span> ldloc
ptr</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum94" style="color: #606060"> 94:</span> stind.i</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum95" style="color: #606060"> 95:</span> ldloc
i</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum96" style="color: #606060"> 96:</span> ldc.i4.1</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum97" style="color: #606060"> 97:</span> add</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum98" style="color: #606060"> 98:</span> stloc
i</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum99" style="color: #606060"> 99:</span> br
L_01</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum100" style="color: #606060"> 100:</span> L_02:</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum101" style="color: #606060"> 101:</span> call <span style="color: #0000ff">void</span> $MSIL_Init()</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum102" style="color: #606060"> 102:</span> call <span style="color: #0000ff">unsigned</span> int32
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) main()</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum103" style="color: #606060"> 103:</span> conv.i4</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum104" style="color: #606060"> 104:</span> ret</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum105" style="color: #606060"> 105:</span> }</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum106" style="color: #606060"> 106:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum107" style="color: #606060"> 107:</span> .method <span style="color: #0000ff">static</span><span style="color: #0000ff">public</span><span style="color: #0000ff">unsigned</span> int32
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) <span style="color: #006080">'main'</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum108" style="color: #606060"> 108:</span> ()
cil <span style="color: #cc6633">managed</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum109" style="color: #606060"> 109:</span> {</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum110" style="color: #606060"> 110:</span> .locals
(<span style="color: #0000ff">unsigned</span> int32 <span style="color: #006080">'ltmp_0_1'</span>)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum111" style="color: #606060"> 111:</span> .maxstack
16</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum112" style="color: #606060"> 112:</span> ltmp_1_2:</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum113" style="color: #606060"> 113:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum114" style="color: #606060"> 114:</span>
                <span style="color: #008000">//
%tmp2 = tail call i32 @puts( i8* getelementptr ([12 x i8]* @.str, i32 0, i32 0) )
; &lt;i32&gt; [#uses=0]</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum115" style="color: #606060"> 115:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum116" style="color: #606060"> 116:</span> ldsflda
valuetype <span style="color: #006080">'unsigned int8 [12]'</span><span style="color: #006080">'.str'</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum117" style="color: #606060"> 117:</span> conv.u4</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum118" style="color: #606060"> 118:</span> call <span style="color: #0000ff">unsigned</span> int32
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) <span style="color: #006080">'puts'</span>(<span style="color: #0000ff">void</span>*
)</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum119" style="color: #606060"> 119:</span> stloc <span style="color: #006080">'ltmp_0_1'</span></pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum120" style="color: #606060"> 120:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum121" style="color: #606060"> 121:</span>
                <span style="color: #008000">//
ret i32 0</span>
              </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum122" style="color: #606060"> 122:</span>  </pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum123" style="color: #606060"> 123:</span> ldc.i4
0</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum124" style="color: #606060"> 124:</span> ret</pre>
              <!--CRLF-->
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span id="lnum125" style="color: #606060"> 125:</span> }</pre>
              <!--CRLF-->
            </div>
          </div>
        </blockquote>
        <p>
Holy frickin' crap. I think I'm in love.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=36b0ccfa-17e4-4397-a237-f714b3270582" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Some interesting tidbits about LLVM</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,36b0ccfa-17e4-4397-a237-f714b3270582.aspx</guid>
      <link>http://blogs.tedneward.com/2008/02/24/Some+Interesting+Tidbits+About+LLVM.aspx</link>
      <pubDate>Sun, 24 Feb 2008 13:00:17 GMT</pubDate>
      <description>&lt;p&gt;
LLVM definitely does some interesting things as part of its toolchain.
&lt;/p&gt;
&lt;p&gt;
Consider the humble HelloWorld:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt; 1:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#include&lt;/span&gt; &amp;lt;stdio.h&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt; 2:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; main()
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt; 4:&lt;/span&gt; printf(&lt;span style="color: #006080"&gt;"hello
world\n"&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt; 5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; 0;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt; 6:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Assuming you have a functioning llvm and llvm-gcc working on your system, you can
compile it into LLVM bitcode. This bitcode is directly executable using the lli.exe
from llvm:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;$ lli &amp;lt; hello.bc&lt;br&gt;
hello world&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Meh. Not so interesting. Let's look at the LLVM bitcode for the code, though--that's
interesting as a first peek at what LLVM bitcode might look like:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt; 1:&lt;/span&gt; ;
ModuleID = &lt;span style="color: #006080"&gt;'&amp;lt;stdin&amp;gt;'&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt; 2:&lt;/span&gt; target
datalayout = &lt;span style="color: #006080"&gt;"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt; 3:&lt;/span&gt; target
triple = &lt;span style="color: #006080"&gt;"mingw32"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt; 4:&lt;/span&gt; @.str
= internal constant [12 x i8] c&lt;span style="color: #006080"&gt;"hello world\00"&lt;/span&gt; ;
&amp;lt;[12 x i8]*&amp;gt; [#uses=1] &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt; 5:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt; 6:&lt;/span&gt; define
i32 @main() {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt; 7:&lt;/span&gt; entry:&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt; 8:&lt;/span&gt; %tmp2
= tail call i32 @puts( i8* getelementptr ([12 x i8]* @.str, i32 0, i32 0) ) ; &amp;lt;i32&amp;gt;
[#uses=0]&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum9" style="color: #606060"&gt; 9:&lt;/span&gt; ret
i32 0&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum10" style="color: #606060"&gt; 10:&lt;/span&gt; } &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum11" style="color: #606060"&gt; 11:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum12" style="color: #606060"&gt; 12:&lt;/span&gt; declare
i32 @puts(i8*)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Hmm. Now of course, LLVM also has to be able to get down to actual machine instructions,
and in point of fact there is a tool in the LLVM toolchain, called llc, that can do
this transformation ahead-of-time, like so:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;$ llc hello.bc -o hello.bc.s -march x86&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
And, looking at the results, we see...
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt; 1:&lt;/span&gt; .text&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt; 2:&lt;/span&gt; .align
16&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt; 3:&lt;/span&gt; .globl
_main&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt; 4:&lt;/span&gt; .def
_main; .scl 2; .type 32; .endef&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt; 5:&lt;/span&gt; n:&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt; 6:&lt;/span&gt; pushl
%ebp&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt; 7:&lt;/span&gt; movl
%esp, %ebp&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt; 8:&lt;/span&gt; subl
$8, %esp&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum9" style="color: #606060"&gt; 9:&lt;/span&gt; andl
$4294967280, %esp&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum10" style="color: #606060"&gt; 10:&lt;/span&gt; movl
$16, %eax&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum11" style="color: #606060"&gt; 11:&lt;/span&gt; call
__alloca&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum12" style="color: #606060"&gt; 12:&lt;/span&gt; call
___main&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum13" style="color: #606060"&gt; 13:&lt;/span&gt; movl
$_.str, (%esp)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum14" style="color: #606060"&gt; 14:&lt;/span&gt; call
_puts&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum15" style="color: #606060"&gt; 15:&lt;/span&gt; xorl
%eax, %eax&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum16" style="color: #606060"&gt; 16:&lt;/span&gt; movl
%ebp, %esp&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum17" style="color: #606060"&gt; 17:&lt;/span&gt; popl
%ebp&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum18" style="color: #606060"&gt; 18:&lt;/span&gt; ret&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum19" style="color: #606060"&gt; 19:&lt;/span&gt; .data&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum20" style="color: #606060"&gt; 20:&lt;/span&gt; r:
# .str&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum21" style="color: #606060"&gt; 21:&lt;/span&gt; .asciz &lt;span style="color: #006080"&gt;"hello
world"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum22" style="color: #606060"&gt; 22:&lt;/span&gt; .def
_puts; .scl 2; .type 32; .endef&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Bleah. Assembly language, and in NASM format, to boot. (What did you expect, anyway?)
&lt;/p&gt;
&lt;p&gt;
Of course, assembly language and C were always considered fairly close together in
terms of their abstraction layer (C was designed as a replacement for assembly language
when porting Unix, remember), so it might not be too hard to...
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;$ llc hello.bc -o hello.bc.c -march c&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
And get...
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt; 1:&lt;/span&gt; &lt;span style="color: #008000"&gt;/*
Provide Declarations */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt; 2:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#include&lt;/span&gt; &amp;lt;stdarg.h&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt; 3:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#include&lt;/span&gt; &amp;lt;setjmp.h&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt; 4:&lt;/span&gt; &lt;span style="color: #008000"&gt;/*
get a declaration for alloca */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt; 5:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#if&lt;/span&gt; defined(__CYGWIN__)
|| defined(__MINGW32__)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt; 6:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; alloca(x)
__builtin_alloca((x))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt; 7:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; _alloca(x)
__builtin_alloca((x))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt; 8:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#elif&lt;/span&gt; defined(__APPLE__)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum9" style="color: #606060"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; *__builtin_alloca(&lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum10" style="color: #606060"&gt; 10:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; alloca(x)
__builtin_alloca(x)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum11" style="color: #606060"&gt; 11:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; longjmp
_longjmp&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum12" style="color: #606060"&gt; 12:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; setjmp
_setjmp&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum13" style="color: #606060"&gt; 13:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#elif&lt;/span&gt; defined(__sun__)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum14" style="color: #606060"&gt; 14:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#if&lt;/span&gt; defined(__sparcv9)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum15" style="color: #606060"&gt; 15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; *__builtin_alloca(&lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum16" style="color: #606060"&gt; 16:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum17" style="color: #606060"&gt; 17:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; *__builtin_alloca(&lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum18" style="color: #606060"&gt; 18:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum19" style="color: #606060"&gt; 19:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; alloca(x)
__builtin_alloca(x)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum20" style="color: #606060"&gt; 20:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#elif&lt;/span&gt; defined(__FreeBSD__)
|| defined(__NetBSD__) || defined(__OpenBSD__)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum21" style="color: #606060"&gt; 21:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; alloca(x)
__builtin_alloca(x)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum22" style="color: #606060"&gt; 22:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#elif&lt;/span&gt; defined(_MSC_VER)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum23" style="color: #606060"&gt; 23:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; _inline&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum24" style="color: #606060"&gt; 24:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; alloca(x)
_alloca(x)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum25" style="color: #606060"&gt; 25:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum26" style="color: #606060"&gt; 26:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#include&lt;/span&gt; &amp;lt;alloca.h&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum27" style="color: #606060"&gt; 27:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum28" style="color: #606060"&gt; 28:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum29" style="color: #606060"&gt; 29:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#ifndef&lt;/span&gt; __GNUC__ &lt;span style="color: #008000"&gt;/*
Can only support "linkonce" vars with GCC */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum30" style="color: #606060"&gt; 30:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __attribute__(X)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum31" style="color: #606060"&gt; 31:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum32" style="color: #606060"&gt; 32:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum33" style="color: #606060"&gt; 33:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#if&lt;/span&gt; defined(__GNUC__)
&amp;amp;&amp;amp; defined(__APPLE_CC__)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum34" style="color: #606060"&gt; 34:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __EXTERNAL_WEAK__
__attribute__((weak_import))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum35" style="color: #606060"&gt; 35:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#elif&lt;/span&gt; defined(__GNUC__)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum36" style="color: #606060"&gt; 36:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __EXTERNAL_WEAK__
__attribute__((weak))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum37" style="color: #606060"&gt; 37:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum38" style="color: #606060"&gt; 38:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __EXTERNAL_WEAK__&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum39" style="color: #606060"&gt; 39:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum40" style="color: #606060"&gt; 40:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum41" style="color: #606060"&gt; 41:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#if&lt;/span&gt; defined(__GNUC__)
&amp;amp;&amp;amp; defined(__APPLE_CC__)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum42" style="color: #606060"&gt; 42:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __ATTRIBUTE_WEAK__&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum43" style="color: #606060"&gt; 43:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#elif&lt;/span&gt; defined(__GNUC__)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum44" style="color: #606060"&gt; 44:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __ATTRIBUTE_WEAK__
__attribute__((weak))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum45" style="color: #606060"&gt; 45:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum46" style="color: #606060"&gt; 46:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __ATTRIBUTE_WEAK__&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum47" style="color: #606060"&gt; 47:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum48" style="color: #606060"&gt; 48:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum49" style="color: #606060"&gt; 49:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#if&lt;/span&gt; defined(__GNUC__)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum50" style="color: #606060"&gt; 50:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __HIDDEN__
__attribute__((visibility(&lt;span style="color: #006080"&gt;"hidden"&lt;/span&gt;)))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum51" style="color: #606060"&gt; 51:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum52" style="color: #606060"&gt; 52:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum53" style="color: #606060"&gt; 53:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#ifdef&lt;/span&gt; __GNUC__&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum54" style="color: #606060"&gt; 54:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_NAN(NanStr)
__builtin_nan(NanStr) &lt;span style="color: #008000"&gt;/* Double */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum55" style="color: #606060"&gt; 55:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_NANF(NanStr)
__builtin_nanf(NanStr) &lt;span style="color: #008000"&gt;/* Float */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum56" style="color: #606060"&gt; 56:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_NANS(NanStr)
__builtin_nans(NanStr) &lt;span style="color: #008000"&gt;/* Double */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum57" style="color: #606060"&gt; 57:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_NANSF(NanStr)
__builtin_nansf(NanStr) &lt;span style="color: #008000"&gt;/* Float */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum58" style="color: #606060"&gt; 58:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_INF
__builtin_inf() &lt;span style="color: #008000"&gt;/* Double */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum59" style="color: #606060"&gt; 59:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_INFF
__builtin_inff() &lt;span style="color: #008000"&gt;/* Float */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum60" style="color: #606060"&gt; 60:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_PREFETCH(addr,rw,locality)
__builtin_prefetch(addr,rw,locality)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum61" style="color: #606060"&gt; 61:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __ATTRIBUTE_CTOR__
__attribute__((constructor))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum62" style="color: #606060"&gt; 62:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __ATTRIBUTE_DTOR__
__attribute__((destructor))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum63" style="color: #606060"&gt; 63:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_ASM
__asm__&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum64" style="color: #606060"&gt; 64:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum65" style="color: #606060"&gt; 65:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_NAN(NanStr)
((&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;)0.0) &lt;span style="color: #008000"&gt;/*
Double */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum66" style="color: #606060"&gt; 66:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_NANF(NanStr)
0.0F &lt;span style="color: #008000"&gt;/* Float */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum67" style="color: #606060"&gt; 67:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_NANS(NanStr)
((&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;)0.0) &lt;span style="color: #008000"&gt;/*
Double */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum68" style="color: #606060"&gt; 68:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_NANSF(NanStr)
0.0F &lt;span style="color: #008000"&gt;/* Float */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum69" style="color: #606060"&gt; 69:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_INF
((&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;)0.0) &lt;span style="color: #008000"&gt;/*
Double */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum70" style="color: #606060"&gt; 70:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_INFF
0.0F &lt;span style="color: #008000"&gt;/* Float */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum71" style="color: #606060"&gt; 71:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_PREFETCH(addr,rw,locality) &lt;span style="color: #008000"&gt;/*
PREFETCH */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum72" style="color: #606060"&gt; 72:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __ATTRIBUTE_CTOR__&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum73" style="color: #606060"&gt; 73:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __ATTRIBUTE_DTOR__&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum74" style="color: #606060"&gt; 74:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; LLVM_ASM(X)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum75" style="color: #606060"&gt; 75:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum76" style="color: #606060"&gt; 76:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum77" style="color: #606060"&gt; 77:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#if&lt;/span&gt; __GNUC__
&amp;lt; 4 &lt;span style="color: #008000"&gt;/* Old GCC's, or compilers not GCC */&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum78" style="color: #606060"&gt; 78:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __builtin_stack_save()
0 &lt;span style="color: #008000"&gt;/* not implemented */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum79" style="color: #606060"&gt; 79:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; __builtin_stack_restore(X) &lt;span style="color: #008000"&gt;/*
noop */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum80" style="color: #606060"&gt; 80:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum81" style="color: #606060"&gt; 81:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum82" style="color: #606060"&gt; 82:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#define&lt;/span&gt; CODE_FOR_MAIN() &lt;span style="color: #008000"&gt;/*
Any target-specific code for main()*/&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum83" style="color: #606060"&gt; 83:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum84" style="color: #606060"&gt; 84:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#ifndef&lt;/span&gt; __cplusplus&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum85" style="color: #606060"&gt; 85:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;typedef&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;char&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum86" style="color: #606060"&gt; 86:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#endif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum87" style="color: #606060"&gt; 87:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum88" style="color: #606060"&gt; 88:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum89" style="color: #606060"&gt; 89:&lt;/span&gt; &lt;span style="color: #008000"&gt;/*
Support for floating point constants */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum90" style="color: #606060"&gt; 90:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;typedef&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; ConstantDoubleTy;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum91" style="color: #606060"&gt; 91:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;typedef&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ConstantFloatTy;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum92" style="color: #606060"&gt; 92:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;typedef&lt;/span&gt; &lt;span style="color: #0000ff"&gt;struct&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; f1; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;short&lt;/span&gt; f2; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;short&lt;/span&gt; pad[3];
} ConstantFP80Ty;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum93" style="color: #606060"&gt; 93:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;typedef&lt;/span&gt; &lt;span style="color: #0000ff"&gt;struct&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; f1; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; f2;
} ConstantFP128Ty;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum94" style="color: #606060"&gt; 94:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum95" style="color: #606060"&gt; 95:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum96" style="color: #606060"&gt; 96:&lt;/span&gt; &lt;span style="color: #008000"&gt;/*
Global Declarations */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum97" style="color: #606060"&gt; 97:&lt;/span&gt; &lt;span style="color: #008000"&gt;/*
Helper union for bitcasts */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum98" style="color: #606060"&gt; 98:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;typedef&lt;/span&gt; &lt;span style="color: #0000ff"&gt;union&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum99" style="color: #606060"&gt; 99:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Int32;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum100" style="color: #606060"&gt; 100:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; Int64;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum101" style="color: #606060"&gt; 101:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;float&lt;/span&gt; Float;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum102" style="color: #606060"&gt; 102:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Double;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum103" style="color: #606060"&gt; 103:&lt;/span&gt; }
llvmBitCastUnion;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum104" style="color: #606060"&gt; 104:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum105" style="color: #606060"&gt; 105:&lt;/span&gt; &lt;span style="color: #008000"&gt;/*
External Global Variable Declarations */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum106" style="color: #606060"&gt; 106:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum107" style="color: #606060"&gt; 107:&lt;/span&gt; &lt;span style="color: #008000"&gt;/*
Function Declarations */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum108" style="color: #606060"&gt; 108:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; fmod(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum109" style="color: #606060"&gt; 109:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;float&lt;/span&gt; fmodf(&lt;span style="color: #0000ff"&gt;float&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;float&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum110" style="color: #606060"&gt; 110:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; fmodl(&lt;span style="color: #0000ff"&gt;long&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum111" style="color: #606060"&gt; 111:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum112" style="color: #606060"&gt; 112:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; puts(&lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;char&lt;/span&gt; *);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum113" style="color: #606060"&gt; 113:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;char&lt;/span&gt; *malloc();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum114" style="color: #606060"&gt; 114:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; free(&lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;char&lt;/span&gt; *);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum115" style="color: #606060"&gt; 115:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; abort(&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum116" style="color: #606060"&gt; 116:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum117" style="color: #606060"&gt; 117:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum118" style="color: #606060"&gt; 118:&lt;/span&gt; &lt;span style="color: #008000"&gt;/*
Global Variable Declarations */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum119" style="color: #606060"&gt; 119:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;char&lt;/span&gt; _2E_str[12];&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum120" style="color: #606060"&gt; 120:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum121" style="color: #606060"&gt; 121:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum122" style="color: #606060"&gt; 122:&lt;/span&gt; &lt;span style="color: #008000"&gt;/*
Global Variable Definitions and Initialization */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum123" style="color: #606060"&gt; 123:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;char&lt;/span&gt; _2E_str[12]
= &lt;span style="color: #006080"&gt;"hello world"&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum124" style="color: #606060"&gt; 124:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum125" style="color: #606060"&gt; 125:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum126" style="color: #606060"&gt; 126:&lt;/span&gt; &lt;span style="color: #008000"&gt;/*
Function Bodies */&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum127" style="color: #606060"&gt; 127:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_ord(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X == X &amp;amp;&amp;amp; Y == Y; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum128" style="color: #606060"&gt; 128:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_uno(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X != X || Y != Y; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum129" style="color: #606060"&gt; 129:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_ueq(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X == Y || llvm_fcmp_uno(X, Y); }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum130" style="color: #606060"&gt; 130:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_une(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X != Y; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum131" style="color: #606060"&gt; 131:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_ult(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X &amp;lt; Y || llvm_fcmp_uno(X, Y); }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum132" style="color: #606060"&gt; 132:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_ugt(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X &amp;gt; Y || llvm_fcmp_uno(X, Y); }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum133" style="color: #606060"&gt; 133:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_ule(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X &amp;lt;= Y || llvm_fcmp_uno(X, Y); }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum134" style="color: #606060"&gt; 134:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_uge(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X &amp;gt;= Y || llvm_fcmp_uno(X, Y); }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum135" style="color: #606060"&gt; 135:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_oeq(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X == Y ; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum136" style="color: #606060"&gt; 136:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_one(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X != Y &amp;amp;&amp;amp; llvm_fcmp_ord(X, Y);
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum137" style="color: #606060"&gt; 137:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_olt(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X &amp;lt; Y ; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum138" style="color: #606060"&gt; 138:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_ogt(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X &amp;gt; Y ; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum139" style="color: #606060"&gt; 139:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_ole(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X &amp;lt;= Y ; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum140" style="color: #606060"&gt; 140:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;inline&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_fcmp_oge(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; X, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Y)
{ &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; X &amp;gt;= Y ; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum141" style="color: #606060"&gt; 141:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum142" style="color: #606060"&gt; 142:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; main(&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;)
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum143" style="color: #606060"&gt; 143:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; llvm_cbe_tmp2;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum144" style="color: #606060"&gt; 144:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum145" style="color: #606060"&gt; 145:&lt;/span&gt; CODE_FOR_MAIN();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum146" style="color: #606060"&gt; 146:&lt;/span&gt; llvm_cbe_tmp2
= &lt;span style="color: #008000"&gt;/*tail*/&lt;/span&gt; puts((&amp;amp;(_2E_str[((&lt;span style="color: #0000ff"&gt;signed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; )((&lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; )0))])));&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum147" style="color: #606060"&gt; 147:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ((&lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; )0);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum148" style="color: #606060"&gt; 148:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Granted, it's some ugly-looking C code, with all those preprocessor fragments floating
around in there, but if you take a few moments and go down to the main() definition,
it's C to bitcode to C. We've come full circle.
&lt;/p&gt;
&lt;p&gt;
Looking back at that first disassembly dump, I'm struck by how LLVM bitcode looks
a lot like any other high-level assembly or low-level virtual machine language, even
reminiscent of MSIL. In fact, there's probably a pretty close correlation between
LLVM bitcode and MSIL.
&lt;/p&gt;
&lt;p&gt;
In point of fact, LLVM knows this, too:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;$ llc hello.bc -o hello.bc.il -march msil&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
And check out what it generates:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt; 1:&lt;/span&gt; .assembly &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; mscorlib
{}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt; 2:&lt;/span&gt; .assembly
MSIL {}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt; 3:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt; 4:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
External&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt; 5:&lt;/span&gt; .method &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; hidebysig
pinvokeimpl(&lt;span style="color: #006080"&gt;"MSVCRT.DLL"&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt; 6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; int32
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) &lt;span style="color: #006080"&gt;'puts'&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;*
) preservesig {}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt; 7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt; 8:&lt;/span&gt; .method &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; hidebysig
pinvokeimpl(&lt;span style="color: #006080"&gt;"MSVCRT.DLL"&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum9" style="color: #606060"&gt; 9:&lt;/span&gt; vararg &lt;span style="color: #0000ff"&gt;void&lt;/span&gt;*
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) &lt;span style="color: #006080"&gt;'malloc'&lt;/span&gt;()
preservesig {}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum10" style="color: #606060"&gt; 10:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum11" style="color: #606060"&gt; 11:&lt;/span&gt; .method &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; hidebysig
pinvokeimpl(&lt;span style="color: #006080"&gt;"MSVCRT.DLL"&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum12" style="color: #606060"&gt; 12:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) &lt;span style="color: #006080"&gt;'free'&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;*
) preservesig {}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum13" style="color: #606060"&gt; 13:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum14" style="color: #606060"&gt; 14:&lt;/span&gt; .method &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; hidebysig &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; pinvokeimpl(&lt;span style="color: #006080"&gt;"KERNEL32.DLL"&lt;/span&gt; ansi
winapi) native &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; LoadLibrary(string) preservesig
{}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum15" style="color: #606060"&gt; 15:&lt;/span&gt; .method &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; hidebysig &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; pinvokeimpl(&lt;span style="color: #006080"&gt;"KERNEL32.DLL"&lt;/span&gt; ansi
winapi) native &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; GetProcAddress(native &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;,
string) preservesig {}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum16" style="color: #606060"&gt; 16:&lt;/span&gt; .method &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt;*
$MSIL_Import(string lib,string sym)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum17" style="color: #606060"&gt; 17:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;managed&lt;/span&gt; cil&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum18" style="color: #606060"&gt; 18:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum19" style="color: #606060"&gt; 19:&lt;/span&gt; ldarg
lib&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum20" style="color: #606060"&gt; 20:&lt;/span&gt; call
native &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; LoadLibrary(string)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum21" style="color: #606060"&gt; 21:&lt;/span&gt; ldarg
sym&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum22" style="color: #606060"&gt; 22:&lt;/span&gt; call
native &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; GetProcAddress(native &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;,string)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum23" style="color: #606060"&gt; 23:&lt;/span&gt; dup&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum24" style="color: #606060"&gt; 24:&lt;/span&gt; brtrue
L_01&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum25" style="color: #606060"&gt; 25:&lt;/span&gt; ldstr &lt;span style="color: #006080"&gt;"Can
no import variable"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum26" style="color: #606060"&gt; 26:&lt;/span&gt; newobj
instance &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; [mscorlib]System.Exception::.ctor(string)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum27" style="color: #606060"&gt; 27:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum28" style="color: #606060"&gt; 28:&lt;/span&gt; L_01:&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum29" style="color: #606060"&gt; 29:&lt;/span&gt; ret&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum30" style="color: #606060"&gt; 30:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum31" style="color: #606060"&gt; 31:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum32" style="color: #606060"&gt; 32:&lt;/span&gt; .method &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; $MSIL_Init() &lt;span style="color: #cc6633"&gt;managed&lt;/span&gt; cil&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum33" style="color: #606060"&gt; 33:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum34" style="color: #606060"&gt; 34:&lt;/span&gt; ret&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum35" style="color: #606060"&gt; 35:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum36" style="color: #606060"&gt; 36:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum37" style="color: #606060"&gt; 37:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
Declarations&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum38" style="color: #606060"&gt; 38:&lt;/span&gt; .&lt;span style="color: #0000ff"&gt;class&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;explicit&lt;/span&gt; ansi
sealed &lt;span style="color: #006080"&gt;'unsigned int8 [12]'&lt;/span&gt; { .pack 1 .size 12
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum39" style="color: #606060"&gt; 39:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum40" style="color: #606060"&gt; 40:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
Definitions&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum41" style="color: #606060"&gt; 41:&lt;/span&gt; .field &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; valuetype &lt;span style="color: #006080"&gt;'unsigned
int8 [12]'&lt;/span&gt; &lt;span style="color: #006080"&gt;'.str'&lt;/span&gt; at &lt;span style="color: #006080"&gt;'.str$data'&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum42" style="color: #606060"&gt; 42:&lt;/span&gt; .data &lt;span style="color: #006080"&gt;'.str$data'&lt;/span&gt; =
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum43" style="color: #606060"&gt; 43:&lt;/span&gt; int8
(104),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum44" style="color: #606060"&gt; 44:&lt;/span&gt; int8
(101),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum45" style="color: #606060"&gt; 45:&lt;/span&gt; int8
(108),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum46" style="color: #606060"&gt; 46:&lt;/span&gt; int8
(108),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum47" style="color: #606060"&gt; 47:&lt;/span&gt; int8
(111),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum48" style="color: #606060"&gt; 48:&lt;/span&gt; int8
(32),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum49" style="color: #606060"&gt; 49:&lt;/span&gt; int8
(119),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum50" style="color: #606060"&gt; 50:&lt;/span&gt; int8
(111),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum51" style="color: #606060"&gt; 51:&lt;/span&gt; int8
(114),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum52" style="color: #606060"&gt; 52:&lt;/span&gt; int8
(108),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum53" style="color: #606060"&gt; 53:&lt;/span&gt; int8
(100),&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum54" style="color: #606060"&gt; 54:&lt;/span&gt; int8
(0) [1]&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum55" style="color: #606060"&gt; 55:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum56" style="color: #606060"&gt; 56:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum57" style="color: #606060"&gt; 57:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
Startup code&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum58" style="color: #606060"&gt; 58:&lt;/span&gt; .method &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; int32
$MSIL_Startup() {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum59" style="color: #606060"&gt; 59:&lt;/span&gt; .entrypoint&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum60" style="color: #606060"&gt; 60:&lt;/span&gt; .locals
(native &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum61" style="color: #606060"&gt; 61:&lt;/span&gt; .locals
(native &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; argc)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum62" style="color: #606060"&gt; 62:&lt;/span&gt; .locals
(native &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ptr)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum63" style="color: #606060"&gt; 63:&lt;/span&gt; .locals
(&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;* argv)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum64" style="color: #606060"&gt; 64:&lt;/span&gt; .locals
(string[] args)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum65" style="color: #606060"&gt; 65:&lt;/span&gt; call
string[] [mscorlib]System.Environment::GetCommandLineArgs()&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum66" style="color: #606060"&gt; 66:&lt;/span&gt; dup&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum67" style="color: #606060"&gt; 67:&lt;/span&gt; stloc
args&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum68" style="color: #606060"&gt; 68:&lt;/span&gt; ldlen&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum69" style="color: #606060"&gt; 69:&lt;/span&gt; conv.i4&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum70" style="color: #606060"&gt; 70:&lt;/span&gt; dup&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum71" style="color: #606060"&gt; 71:&lt;/span&gt; stloc
argc&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum72" style="color: #606060"&gt; 72:&lt;/span&gt; ldc.i4
4&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum73" style="color: #606060"&gt; 73:&lt;/span&gt; mul&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum74" style="color: #606060"&gt; 74:&lt;/span&gt; localloc&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum75" style="color: #606060"&gt; 75:&lt;/span&gt; stloc
argv&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum76" style="color: #606060"&gt; 76:&lt;/span&gt; ldc.i4.0&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum77" style="color: #606060"&gt; 77:&lt;/span&gt; stloc
i&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum78" style="color: #606060"&gt; 78:&lt;/span&gt; L_01:&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum79" style="color: #606060"&gt; 79:&lt;/span&gt; ldloc
i&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum80" style="color: #606060"&gt; 80:&lt;/span&gt; ldloc
argc&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum81" style="color: #606060"&gt; 81:&lt;/span&gt; ceq&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum82" style="color: #606060"&gt; 82:&lt;/span&gt; brtrue
L_02&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum83" style="color: #606060"&gt; 83:&lt;/span&gt; ldloc
args&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum84" style="color: #606060"&gt; 84:&lt;/span&gt; ldloc
i&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum85" style="color: #606060"&gt; 85:&lt;/span&gt; ldelem.ref&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum86" style="color: #606060"&gt; 86:&lt;/span&gt; call
native &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; [mscorlib]System.Runtime.InteropServices.Marshal::StringToHGlobalAnsi(string)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum87" style="color: #606060"&gt; 87:&lt;/span&gt; stloc
ptr&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum88" style="color: #606060"&gt; 88:&lt;/span&gt; ldloc
argv&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum89" style="color: #606060"&gt; 89:&lt;/span&gt; ldloc
i&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum90" style="color: #606060"&gt; 90:&lt;/span&gt; ldc.i4
4&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum91" style="color: #606060"&gt; 91:&lt;/span&gt; mul&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum92" style="color: #606060"&gt; 92:&lt;/span&gt; add&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum93" style="color: #606060"&gt; 93:&lt;/span&gt; ldloc
ptr&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum94" style="color: #606060"&gt; 94:&lt;/span&gt; stind.i&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum95" style="color: #606060"&gt; 95:&lt;/span&gt; ldloc
i&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum96" style="color: #606060"&gt; 96:&lt;/span&gt; ldc.i4.1&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum97" style="color: #606060"&gt; 97:&lt;/span&gt; add&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum98" style="color: #606060"&gt; 98:&lt;/span&gt; stloc
i&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum99" style="color: #606060"&gt; 99:&lt;/span&gt; br
L_01&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum100" style="color: #606060"&gt; 100:&lt;/span&gt; L_02:&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum101" style="color: #606060"&gt; 101:&lt;/span&gt; call &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; $MSIL_Init()&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum102" style="color: #606060"&gt; 102:&lt;/span&gt; call &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; int32
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) main()&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum103" style="color: #606060"&gt; 103:&lt;/span&gt; conv.i4&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum104" style="color: #606060"&gt; 104:&lt;/span&gt; ret&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum105" style="color: #606060"&gt; 105:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum106" style="color: #606060"&gt; 106:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum107" style="color: #606060"&gt; 107:&lt;/span&gt; .method &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; int32
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) &lt;span style="color: #006080"&gt;'main'&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum108" style="color: #606060"&gt; 108:&lt;/span&gt; ()
cil &lt;span style="color: #cc6633"&gt;managed&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum109" style="color: #606060"&gt; 109:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum110" style="color: #606060"&gt; 110:&lt;/span&gt; .locals
(&lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; int32 &lt;span style="color: #006080"&gt;'ltmp_0_1'&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum111" style="color: #606060"&gt; 111:&lt;/span&gt; .maxstack
16&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum112" style="color: #606060"&gt; 112:&lt;/span&gt; ltmp_1_2:&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum113" style="color: #606060"&gt; 113:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum114" style="color: #606060"&gt; 114:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
%tmp2 = tail call i32 @puts( i8* getelementptr ([12 x i8]* @.str, i32 0, i32 0) )
; &amp;lt;i32&amp;gt; [#uses=0]&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum115" style="color: #606060"&gt; 115:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum116" style="color: #606060"&gt; 116:&lt;/span&gt; ldsflda
valuetype &lt;span style="color: #006080"&gt;'unsigned int8 [12]'&lt;/span&gt; &lt;span style="color: #006080"&gt;'.str'&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum117" style="color: #606060"&gt; 117:&lt;/span&gt; conv.u4&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum118" style="color: #606060"&gt; 118:&lt;/span&gt; call &lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; int32
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) &lt;span style="color: #006080"&gt;'puts'&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;*
)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum119" style="color: #606060"&gt; 119:&lt;/span&gt; stloc &lt;span style="color: #006080"&gt;'ltmp_0_1'&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum120" style="color: #606060"&gt; 120:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum121" style="color: #606060"&gt; 121:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
ret i32 0&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum122" style="color: #606060"&gt; 122:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum123" style="color: #606060"&gt; 123:&lt;/span&gt; ldc.i4
0&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum124" style="color: #606060"&gt; 124:&lt;/span&gt; ret&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum125" style="color: #606060"&gt; 125:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Holy frickin' crap. I think I'm in love.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=36b0ccfa-17e4-4397-a237-f714b3270582" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,36b0ccfa-17e4-4397-a237-f714b3270582.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Languages</category>
      <category>LLVM</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=229f99f9-1567-4515-b7ba-7262063f329f</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,229f99f9-1567-4515-b7ba-7262063f329f.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,229f99f9-1567-4515-b7ba-7262063f329f.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=229f99f9-1567-4515-b7ba-7262063f329f</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As I've mentioned in passing, one of the things I'm playing with in my spare time
(or will play with, now that I've got everything working, I think) is the <a href="http://llvm.org">LLVM
toolchain</a>. In essence, it looks to be a parallel to Microsoft's Phoenix, except
that it's out, it's been in use in production environments (Apple is a major contributor
to the project and uses it pretty extensively, it seems), and it supports not only
C/C++ and Objective-C, but also Ada and Fortran. It's also a useful back-end for people
writing languages, hence my interest.
</p>
        <p>
One of the things that appeals about LLVM is that it uses an "intermediate representation"
that in many ways reminds me of Phoenix's Low IR, though I'm sure there are significant
differences that I'm not well-practiced enough to spot. Consider this bit of Fibonacci
code, for example:
</p>
        <blockquote>
          <div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
            <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 1:</span> define
i32 @fib(i32 %AnArg) {</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 2:</span> EntryBlock:</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 3:</span> %cond
= icmp sle i32 %AnArg, 2 ; &lt;i1&gt; [#uses=1]</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 4:</span> br
i1 %cond, label %<span style="color: #0000ff">return</span>, label %recurse</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 5:</span>  </pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 6:</span>
                <span style="color: #0000ff">return</span>:
; preds = %EntryBlock</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 7:</span> ret
i32 1</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 8:</span>  </pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 9:</span> recurse:
; preds = %EntryBlock</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 10:</span> %arg
= sub i32 %AnArg, 1 ; &lt;i32&gt; [#uses=1]</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 11:</span> %fibx1
= tail call i32 @fib( i32 %arg ) ; &lt;i32&gt; [#uses=1]</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 12:</span> %arg1
= sub i32 %AnArg, 2 ; &lt;i32&gt; [#uses=1]</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 13:</span> %fibx2
= tail call i32 @fib( i32 %arg1 ) ; &lt;i32&gt; [#uses=1]</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 14:</span> %addresult
= add i32 %fibx1, %fibx2 ; &lt;i32&gt; [#uses=1]</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 15:</span> ret
i32 %addresult</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 16:</span> }</pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 17:</span>  </pre>
              <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
                <span style="color: #606060"> 18:</span> declare <span style="color: #0000ff">void</span> @abort()</pre>
            </div>
          </div>
        </blockquote>
        <p>
It's rather interesting to imagine this as a direct by-product of that first pass
off of the hypothetical Universal AST....
</p>
        <p>
Getting this thing to build has been an exercise of patience, however.
</p>
        <p>
The documentation on the website, while extensive, isn't very Windows-friendly. For
example, there's a page that describes how to build it with Visual Studio, but it's
a touch out-of-date. On top of that, it turns out that the VS/LLVM tools can't <em>compile</em> to
LLVM bitcode, only execute it once it's in that format; you need "llvm-gcc" to compile
to bitcode, which means you're left with a two-machine solution: a *nix box using
llvm-gcc to compile the code, and then your Windows box to run it. Ugh.
</p>
        <p>
Fortunately, Windows users have two choices for dealing with *nix solutions: Cygwin
and MinGW32. The first tries to lay down a *nix-like layer on top of the Win32 APIs
(meaning everything depends on cygwin1.dll once built), the second tries to provide
an adapter layer such that when a *nix tool is done building, it has no dependencies
beyond what you'd see from any other Win32 app. Debates rage about the validity of
each, and rather than seem like I'm coming down in favor of one or the other, I'll
simply note that I have both installed in my Languages VMWare image now, and leave
it at that.
</p>
        <p>
Building LLVM with MinGW was a bit more painful than I expected, however, so for a
long time I just didn't bother. Last night that changed, thanks to Anton Korobeynikov,
who spent the better part of three or four hours in back-and-forth email conversation
with me, walking me patiently through the step-by-step of getting MinGW and msys up
and running on my machine long enough to build the LLVM 2.2+ (meaning the tip beyond
the current 2.2 release) code base. I can't thank him enough--both for the direct
help in getting the MinGW bits up and in the right places as well as for the casual
conversation about MinGW along the way--so I thought I'd replicate what we did on
my box to the 'Net in an attempt to spare others the effort.
</p>
        <p>
First, there's a pile of tarballs from the MinGW download page that require <a href="http://sourceforge.net/project/showfiles.php?group_id=2435">downloading</a> and
extracting:
</p>
        <ul>
          <li>
gcc-g++-3.4.5-20060117-1.tar.gz</li>
          <li>
binutils-2.18.50-20080109.tar.gz</li>
          <li>
mingw-runtime-3.14.tar.gz</li>
          <li>
gcc-core-3.4.5-20060117-1.tar.gz</li>
          <li>
w32api-3.11.tar.gz</li>
        </ul>
        <p>
Note that I also pulled down the other gcc- tarballs (gcj, objc and so on), just because
I wanted to play with the MinGW versions of these tools. Extract all of these into
a directory; on my system, that's C:/Prg/MinGW.
</p>
        <p>
          <em>(There is a .exe installer on the Sourceforge page that supposedly manages all
this for you, but it installed the binutils-2.17 package instead of 2.18, and I couldn't
figure out how to get it to grab 2.18. All it does is download these packages and
extract them, so going without it isn't a huge ordeal.)</em>
        </p>
        <p>
By the way, if you're curious about experimenting with gcj as well (hey, it's a Java
compiler that compiles to native code--that's interesting in its own right, if you
ask me), take careful note that as it stands right now in the installation process,
you can run gcj but can't compile Hello.java with it--it complains about a missing
library, "iconv". <a href="http://www.autexier.de/jmau/dev/gcj.html">This is a known
bug</a>, it seems, and the solution is to install <a href="http://gnuwin32.sourceforge.net/packages/libiconv.htm">libiconv</a> from
the <a href="http://gnuwin32.sourceforge.net/">GnuWin32 project</a>--just extract
the "bin" and "lib" packages into C:/Prg/MinGW.
</p>
        <p>
At this point, you're done with C:/Prg/MinGW32.
</p>
        <p>
Next, there's a couple of installers and additional tarballs that need downloading
and extracting:
</p>
        <ul>
          <li>
MSYS-1.0.10.exe</li>
          <li>
msysDTK-1.0.1.exe</li>
          <li>
bash-3.1-MSYS-1.0.11-1.tar.bz2</li>
          <li>
bison-2.3-MSYS-1.0.11.tar.bz2</li>
          <li>
flex-2.5.33-MSYS-1.0.11.tar.bz2</li>
          <li>
regex-0.12-MSYS-1.0.11.tar.bz2 (required by flex)</li>
        </ul>
        <p>
The first two just execute and install; on my system, that is C:/Prg/msys/1.0. The
next one just extracts into the C:/Prg/msys/1.0 directory. The last three are a tad
tricky, however--apparently they assume that everything should be installed into a
top-level "usr" directory, and that's not <em>quite</em> where we want them; we want
them. Apparently, we want them installed directly (so that "/usr/bin" from bison goes
into "/bin" inside of "C:/Prg/msys/1.0"), so extract these to a temporary directory,
then xcopy everything <em>inside</em> the temp/usr directory over to C:/Prg/msys/1.0.
(That is, "cd temp", then "cd usr", then "xcopy /s/e * C:/Prg/msys/1.0".)
</p>
        <p>
At this point, we're done with the setup--create a directory into which you want LLVM
built (on my system, that's C:/Prg/LLVM/msys-build, where the source from SVN is held
in C:/Prg/LLVM/llvm-svn), and execute the "configure" script in this directory (that
is, "cd C:/Prg/LLVM/msys-build" and "../llvm-svn/configure"). The script will deposit
a bunch of makefiles and directories into the build directory, after which a simple
"make" suffices to build everything (in Debug; if you want Release, do "make ENABLE_OPTIMIZED=1",
as per the LLVM documentation).
</p>
        <p>
Thanks again, Anton! Now can you help me get llvm-gcc working? :-)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=229f99f9-1567-4515-b7ba-7262063f329f" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Building LLVM on Windows using MinGW32</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,229f99f9-1567-4515-b7ba-7262063f329f.aspx</guid>
      <link>http://blogs.tedneward.com/2008/02/24/Building+LLVM+On+Windows+Using+MinGW32.aspx</link>
      <pubDate>Sun, 24 Feb 2008 04:34:35 GMT</pubDate>
      <description>&lt;p&gt;
As I've mentioned in passing, one of the things I'm playing with in my spare time
(or will play with, now that I've got everything working, I think) is the &lt;a href="http://llvm.org"&gt;LLVM
toolchain&lt;/a&gt;. In essence, it looks to be a parallel to Microsoft's Phoenix, except
that it's out, it's been in use in production environments (Apple is a major contributor
to the project and uses it pretty extensively, it seems), and it supports not only
C/C++ and Objective-C, but also Ada and Fortran. It's also a useful back-end for people
writing languages, hence my interest.
&lt;/p&gt;
&lt;p&gt;
One of the things that appeals about LLVM is that it uses an "intermediate representation"
that in many ways reminds me of Phoenix's Low IR, though I'm sure there are significant
differences that I'm not well-practiced enough to spot. Consider this bit of Fibonacci
code, for example:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 1:&lt;/span&gt; define
i32 @fib(i32 %AnArg) {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 2:&lt;/span&gt; EntryBlock:&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 3:&lt;/span&gt; %cond
= icmp sle i32 %AnArg, 2 ; &amp;lt;i1&amp;gt; [#uses=1]&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 4:&lt;/span&gt; br
i1 %cond, label %&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;, label %recurse&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 5:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;:
; preds = %EntryBlock&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 7:&lt;/span&gt; ret
i32 1&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 8:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 9:&lt;/span&gt; recurse:
; preds = %EntryBlock&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 10:&lt;/span&gt; %arg
= sub i32 %AnArg, 1 ; &amp;lt;i32&amp;gt; [#uses=1]&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 11:&lt;/span&gt; %fibx1
= tail call i32 @fib( i32 %arg ) ; &amp;lt;i32&amp;gt; [#uses=1]&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 12:&lt;/span&gt; %arg1
= sub i32 %AnArg, 2 ; &amp;lt;i32&amp;gt; [#uses=1]&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 13:&lt;/span&gt; %fibx2
= tail call i32 @fib( i32 %arg1 ) ; &amp;lt;i32&amp;gt; [#uses=1]&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 14:&lt;/span&gt; %addresult
= add i32 %fibx1, %fibx2 ; &amp;lt;i32&amp;gt; [#uses=1]&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 15:&lt;/span&gt; ret
i32 %addresult&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 16:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 17:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 18:&lt;/span&gt; declare &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; @abort()&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
It's rather interesting to imagine this as a direct by-product of that first pass
off of the hypothetical Universal AST....
&lt;/p&gt;
&lt;p&gt;
Getting this thing to build has been an exercise of patience, however.
&lt;/p&gt;
&lt;p&gt;
The documentation on the website, while extensive, isn't very Windows-friendly. For
example, there's a page that describes how to build it with Visual Studio, but it's
a touch out-of-date. On top of that, it turns out that the VS/LLVM tools can't &lt;em&gt;compile&lt;/em&gt; to
LLVM bitcode, only execute it once it's in that format; you need "llvm-gcc" to compile
to bitcode, which means you're left with a two-machine solution: a *nix box using
llvm-gcc to compile the code, and then your Windows box to run it. Ugh.
&lt;/p&gt;
&lt;p&gt;
Fortunately, Windows users have two choices for dealing with *nix solutions: Cygwin
and MinGW32. The first tries to lay down a *nix-like layer on top of the Win32 APIs
(meaning everything depends on cygwin1.dll once built), the second tries to provide
an adapter layer such that when a *nix tool is done building, it has no dependencies
beyond what you'd see from any other Win32 app. Debates rage about the validity of
each, and rather than seem like I'm coming down in favor of one or the other, I'll
simply note that I have both installed in my Languages VMWare image now, and leave
it at that.
&lt;/p&gt;
&lt;p&gt;
Building LLVM with MinGW was a bit more painful than I expected, however, so for a
long time I just didn't bother. Last night that changed, thanks to Anton Korobeynikov,
who spent the better part of three or four hours in back-and-forth email conversation
with me, walking me patiently through the step-by-step of getting MinGW and msys up
and running on my machine long enough to build the LLVM 2.2+ (meaning the tip beyond
the current 2.2 release) code base. I can't thank him enough--both for the direct
help in getting the MinGW bits up and in the right places as well as for the casual
conversation about MinGW along the way--so I thought I'd replicate what we did on
my box to the 'Net in an attempt to spare others the effort.
&lt;/p&gt;
&lt;p&gt;
First, there's a pile of tarballs from the MinGW download page that require &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=2435"&gt;downloading&lt;/a&gt; and
extracting:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
gcc-g++-3.4.5-20060117-1.tar.gz&lt;/li&gt;
&lt;li&gt;
binutils-2.18.50-20080109.tar.gz&lt;/li&gt;
&lt;li&gt;
mingw-runtime-3.14.tar.gz&lt;/li&gt;
&lt;li&gt;
gcc-core-3.4.5-20060117-1.tar.gz&lt;/li&gt;
&lt;li&gt;
w32api-3.11.tar.gz&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Note that I also pulled down the other gcc- tarballs (gcj, objc and so on), just because
I wanted to play with the MinGW versions of these tools. Extract all of these into
a directory; on my system, that's C:/Prg/MinGW.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;(There is a .exe installer on the Sourceforge page that supposedly manages all
this for you, but it installed the binutils-2.17 package instead of 2.18, and I couldn't
figure out how to get it to grab 2.18. All it does is download these packages and
extract them, so going without it isn't a huge ordeal.)&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
By the way, if you're curious about experimenting with gcj as well (hey, it's a Java
compiler that compiles to native code--that's interesting in its own right, if you
ask me), take careful note that as it stands right now in the installation process,
you can run gcj but can't compile Hello.java with it--it complains about a missing
library, "iconv". &lt;a href="http://www.autexier.de/jmau/dev/gcj.html"&gt;This is a known
bug&lt;/a&gt;, it seems, and the solution is to install &lt;a href="http://gnuwin32.sourceforge.net/packages/libiconv.htm"&gt;libiconv&lt;/a&gt; from
the &lt;a href="http://gnuwin32.sourceforge.net/"&gt;GnuWin32 project&lt;/a&gt;--just extract
the "bin" and "lib" packages into C:/Prg/MinGW.
&lt;/p&gt;
&lt;p&gt;
At this point, you're done with C:/Prg/MinGW32.
&lt;/p&gt;
&lt;p&gt;
Next, there's a couple of installers and additional tarballs that need downloading
and extracting:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
MSYS-1.0.10.exe&lt;/li&gt;
&lt;li&gt;
msysDTK-1.0.1.exe&lt;/li&gt;
&lt;li&gt;
bash-3.1-MSYS-1.0.11-1.tar.bz2&lt;/li&gt;
&lt;li&gt;
bison-2.3-MSYS-1.0.11.tar.bz2&lt;/li&gt;
&lt;li&gt;
flex-2.5.33-MSYS-1.0.11.tar.bz2&lt;/li&gt;
&lt;li&gt;
regex-0.12-MSYS-1.0.11.tar.bz2 (required by flex)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The first two just execute and install; on my system, that is C:/Prg/msys/1.0. The
next one just extracts into the C:/Prg/msys/1.0 directory. The last three are a tad
tricky, however--apparently they assume that everything should be installed into a
top-level "usr" directory, and that's not &lt;em&gt;quite&lt;/em&gt; where we want them; we want
them. Apparently, we want them installed directly (so that "/usr/bin" from bison goes
into "/bin" inside of "C:/Prg/msys/1.0"), so extract these to a temporary directory,
then xcopy everything &lt;em&gt;inside&lt;/em&gt; the temp/usr directory over to C:/Prg/msys/1.0.
(That is, "cd temp", then "cd usr", then "xcopy /s/e * C:/Prg/msys/1.0".)
&lt;/p&gt;
&lt;p&gt;
At this point, we're done with the setup--create a directory into which you want LLVM
built (on my system, that's C:/Prg/LLVM/msys-build, where the source from SVN is held
in C:/Prg/LLVM/llvm-svn), and execute the "configure" script in this directory (that
is, "cd C:/Prg/LLVM/msys-build" and "../llvm-svn/configure"). The script will deposit
a bunch of makefiles and directories into the build directory, after which a simple
"make" suffices to build everything (in Debug; if you want Release, do "make ENABLE_OPTIMIZED=1",
as per the LLVM documentation).
&lt;/p&gt;
&lt;p&gt;
Thanks again, Anton! Now can you help me get llvm-gcc working? :-)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=229f99f9-1567-4515-b7ba-7262063f329f" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,229f99f9-1567-4515-b7ba-7262063f329f.aspx</comments>
      <category>C++</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Windows</category>
    </item>
  </channel>
</rss>