<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>eric the fruitbat</title>
	<atom:link href="http://www.cogitolingua.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cogitolingua.net/blog</link>
	<description>Sounding out the Noosphere.</description>
	<lastBuildDate>Fri, 03 Feb 2012 23:40:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>The Good IR: Other Control Flow Structures</title>
		<link>http://www.cogitolingua.net/blog/2012/02/01/the-good-ir-other-control-flow-structures/</link>
		<comments>http://www.cogitolingua.net/blog/2012/02/01/the-good-ir-other-control-flow-structures/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 02:39:58 +0000</pubDate>
		<dc:creator>erich</dc:creator>
				<category><![CDATA[Comp*]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.cogitolingua.net/blog/?p=1360</guid>
		<description><![CDATA[<p>In my last post on The Good IR, I had arrived at a representation with two invariants:</p> Only BasicBlock’s carry information about the ControlFlowGraph; No other edges are allowed between BasicBlocks. All BasicBlocks end with a control transfer Instruction. <p>I focused that post solely on the if-then-else control flow structure. I would now like to [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://www.cogitolingua.net/blog//2012/01/27/the-good-ir/">last post</a> on The Good IR, I had arrived at a representation with two invariants:</p>
<ol>
<li>Only BasicBlock’s carry information about the ControlFlowGraph; No other edges are allowed between BasicBlocks.
<li>All BasicBlocks end with a control transfer Instruction.
</ol>
<p>I focused that post solely on the if-then-else control flow structure. I would now like to demonstrate how those invariants translate to the while-loop and if-without-else. Although other languages have do-while, for-loop, and switch-case, I won&#8217;t be addressing those now. Instead I&#8217;m limiting my focus on a much simpler language (that used by CS241 here at UCI). I want to get a clear picture of how the if-else and while-loop work, before complicating the picture with Return. So, for this post, I&#8217;m assuming that we have &#8216;the usual case&#8217; where the &#8216;stuff&#8217; inside the body of a loop or branch of an if-then doesn&#8217;t proceeds &#8216;normally&#8217; and doesn&#8217;t exit the function.</p>
<table>
<tr>
<th colspan=3>While Loop</th>
</tr>
<tr>
<td>
<pre>
while (cond) {
    // stuff
}
</pre>
</td>
<td>
<a href="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/while-loop.png"><img src="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/while-loop-291x300.png" alt="" title="while-loop" width="291" height="300" class="alignnone size-medium wp-image-1401" /></a>
</td>
<td>
<a href="http://www.cogitolingua.net/blog/wp-content/uploads/2012/02/while-loop-degenerate.png"><img src="http://www.cogitolingua.net/blog/wp-content/uploads/2012/02/while-loop-degenerate-171x300.png" alt="" title="while-loop-degenerate" width="171" height="300" class="alignright size-medium wp-image-1414" /></a>
</td>
</tr>
</table>
<p>We should not two important aspect of the illustration:</p>
<ol>
<li>The body of the loop is fully general. That is, I wanted to make clear that the &#8216;stuff&#8217; in the loop body might have control structures which cause a separation of the first block of the body from the last block. This separation is indicated by a series of small orange blocks.</li>
<li>Not in the illustration is a restriction on the instructions in the loop header. During a parse, when the loop is encountered we must create a new block to store two items: The instructions for evaluating the loop condition and the ConditionalBranch. We do <em>not</em> include instructions for any statement prior to the loop condition, even if such statement appear in the source program. We do this because, we wish to evaluate <em>only</em> the conditional and <em>no other</em> instructions, when control is restored on the loop&#8217;s backward control flow edge.</li>
</ol>
<p>Given these observations. The presence of UnconditionalJump and ConditionalBranch is straightforward, and needs no modification from the last post.</p>
<p>Consider the degenerate case, when the loop body is empty. We could choose to draw the control flow graph omitting the body node. We decide <em>not</em> to do so, because it creates a special case. Instead we prefer that the loop body contains <em>at least one</em> block, even if that block holds only an UncoditionalJump back to the loop header block.</p>
<p>Forcing all loops to have at minimum 3 nodes: the loop-header, the body, and the exit block; gives us a stable footing for control flow optimizations which are implemented later in the compiler. It also gives us another invariant: <b>No block points back to itself</b>, all blocks always point to other blocks.</p>
<table>
<tr>
<th colspan=3>If-NoElse</th>
</tr>
<tr>
<td>
<pre>
if (cond) {
     // stuff
}
</pre>
</td>
<td>
<a href="http://www.cogitolingua.net/blog/wp-content/uploads/2012/02/if-no-else.png"><img src="http://www.cogitolingua.net/blog/wp-content/uploads/2012/02/if-no-else-221x300.png" alt="" title="if-no-else" width="221" height="300" class="alignnone size-medium wp-image-1418" /></a>
</td>
<td>
<a href="http://www.cogitolingua.net/blog/wp-content/uploads/2012/02/if-no-else-degenerate.png"><img src="http://www.cogitolingua.net/blog/wp-content/uploads/2012/02/if-no-else-degenerate-175x300.png" alt="" title="if-no-else-degenerate" width="175" height="300" class="alignnone size-medium wp-image-1420" /></a>
</td>
</tr>
</table>
<p>The if-noelse is handled similarly. We do not have to create any instructions other than ConditionalBranch and UnconditionalJump. Again, we prefer to keep that &#8216;empty&#8217; else branch. Regularizing the if-then-else to a minimum of 4 blocks: the if-header, then-block, else-block, and join-block. Always creating these blocks definitely helps the control flow graph keep an organized and uniform appearance, especially when you consider the nesting of several different control flow structures. An <a href="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/Nested-If.png">example from the last post</a> would be quite unmanageable without the presence of these &#8216;empty&#8217; blocks. In the if-then-else control structure, keeping these blocks aids in the placement of SSA &phi;-instructions, as well as control flow graph traversals.</p>
<p><b>Design Rule of Thumb:</b> Don&#8217;t have the parser optimize away empty blocks, they&#8217;re actually useful to keep around (both for SSA and CFG traversals).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cogitolingua.net/blog/2012/02/01/the-good-ir-other-control-flow-structures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transforming Heuristics</title>
		<link>http://www.cogitolingua.net/blog/2012/02/01/transforming-heuristics/</link>
		<comments>http://www.cogitolingua.net/blog/2012/02/01/transforming-heuristics/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 21:51:53 +0000</pubDate>
		<dc:creator>erich</dc:creator>
				<category><![CDATA[Comp*]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Math]]></category>

		<guid isPermaLink="false">http://www.cogitolingua.net/blog/?p=1406</guid>
		<description><![CDATA[<p>Many of the real problems in the world are NP. Things like Scheduling, Register Allocation, Routing packages, etc. In solving these really hard problems, we invent heuristics. Typically such heuristics are specific to the problem domain. For example, UPS might exploit certain characteristic about the geographical layout of the country; they face a certain subset [...]]]></description>
			<content:encoded><![CDATA[<p>Many of the real problems in the world are NP. Things like Scheduling, Register Allocation, Routing packages, etc. In solving these really hard problems, we invent heuristics. Typically such heuristics are specific to the problem domain. For example, UPS might  exploit certain characteristic about the geographical layout of the country; they face a certain subset of all possible graphs, and can exploit those features.</p>
<p>But we know that the NP problems are all reducible to each other. So, don&#8217;t the heuristics transform as well?</p>
<p>That is, given a heuristic that works well for the Knapsack problem, how well does that same heuristic (transformed) work on the Travelling Salesman Problem?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cogitolingua.net/blog/2012/02/01/transforming-heuristics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Public School, it is a Prison</title>
		<link>http://www.cogitolingua.net/blog/2012/02/01/public-school-it-is-a-prison/</link>
		<comments>http://www.cogitolingua.net/blog/2012/02/01/public-school-it-is-a-prison/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 10:32:21 +0000</pubDate>
		<dc:creator>erich</dc:creator>
				<category><![CDATA[Education]]></category>
		<category><![CDATA[Punditry]]></category>

		<guid isPermaLink="false">http://www.cogitolingua.net/blog/?p=1403</guid>
		<description><![CDATA[<p>How the Public Schools Keep Your Child a Prisoner of the State by Karen De Coster, has a few interesting links about how public schools act like prisons for both mind and body.</p> <p>A really well researched article on equality via the school system: &#8220;Compulsory schooling not only fails to achieve its egalitarian goal, but [...]]]></description>
			<content:encoded><![CDATA[<p>How the <a href="http://lewrockwell.com/decoster/decoster191.html">Public Schools Keep Your Child a Prisoner of the State</a> by Karen De Coster, has a few interesting links about how public schools act like prisons for both mind and body.</p>
<p>A really well researched article on equality via the school system:<br />
&#8220;Compulsory schooling not only fails to achieve its egalitarian goal, but by subjecting all to the same studies in lockstep fashion effectively denies them any real opportunity at all.&#8221; [<a href="http://www.honested.com/essays/resch/h_v.php">Equality" vs. "Equity</a>, ed. William F. Rickenbacker, San Francisco: Open Court Publishing, Inc./Fox &#038; Wilkes, 1998]</p>
<p>Milton Friedman points out that the tasks of funding and administration can (and should) be separated: <a href="http://www.schoolchoices.org/roo/fried1.htm">The Role of Government in Education</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cogitolingua.net/blog/2012/02/01/public-school-it-is-a-prison/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t Fear the Mistakes</title>
		<link>http://www.cogitolingua.net/blog/2012/01/31/dont-fear-the-mistakes/</link>
		<comments>http://www.cogitolingua.net/blog/2012/01/31/dont-fear-the-mistakes/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 05:13:00 +0000</pubDate>
		<dc:creator>erich</dc:creator>
				<category><![CDATA[Education]]></category>
		<category><![CDATA[Mind/Cognition]]></category>
		<category><![CDATA[Self]]></category>
		<category><![CDATA[failure]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[psychology]]></category>

		<guid isPermaLink="false">http://www.cogitolingua.net/blog/?p=1388</guid>
		<description><![CDATA[<p>During teaching, there is a fascinating (and unfortunately common) problem: Students are VERY reluctant to suggest an answer, for fear that they might be wrong.</p> <p>Salman Kahn, noticed this phenomenon after he started doing videos for his niece and nephew: (I&#8217;m paraphrasing) &#8220;The last thing they needed was for me to be there expecting an [...]]]></description>
			<content:encoded><![CDATA[<p>During teaching, there is a fascinating (and unfortunately common) problem: Students are VERY reluctant to suggest an answer, for fear that they might be wrong.</p>
<p>Salman Kahn, noticed this phenomenon after he started doing videos for his niece and nephew: (I&#8217;m paraphrasing) &#8220;The last thing they needed was for me to be there expecting an answer.&#8221;</p>
<p>Teachers at the university level are fighting a behavioral lesson that we pick up in elementary school. Although young students often have the bravery (or lack of self-awareness) that allows them to speak up in class, it&#8217;s consistently beaten out of them: There&#8217;s nothing more degrading than being laughed at by the rest of the class. The other children are so insecure themselves, that they&#8217;ll take every opportunity to pick themselves up by mocking others.</p>
<p>Also, even for the talented students, if they are praised about their intelligence they will end up taking fewer risks: and try fervently to be wrong less. This lesson comes from Carol Dweck&#8217;s work: <a href="https://www.stanford.edu/dept/psychology/cgi-bin/drupalm/cdweck">Praise for Intelligence Can Undermine Children&#8217;s Motivation and Performance</a>. [<a href="http://www.wired.com/wiredscience/2011/10/why-do-some-people-learn-faster-2/">Why do some people learn faster?</a>]</p>
<p>Naturally, almost everyone will leave the early public education system less excited than when they entered. University and College teachers then have the problem of rekindling the excitement and interest we were all born with. But to accomplish this, we must find ways of fighting the earlier training: we must encourage participation and the mistakes that come with exploring.</p>
<p>John Holt has a book, &#8220;How Children Fail&#8221;, which contains the <a href="http://www.educationreformbooks.net/failure.htm">following conclusions</a>:</p>
<ol>
<li>Schools promote an atmosphere of fear.</li>
<li>Boredom serves as another major obstacle.</li>
<li>‘Cookie-cutter’ education does not cultivate intrinsic interests and learning.</li>
<li>Mixed Signals: Parents praise curiosity and questions, school does not.</li>
<li>There is no single body of information that all children should learn.</li>
</ol>
<p>So, what can be done?</p>
<ol>
<li><b>Exercise <a href="http://en.wikipedia.org/wiki/Choice_theory">Choice Theory</a></b>. Recognize that you can cultivate a positive attitude, and change your response.</li>
<li><b>Fail more often</b>, and get used to how it feels. Routinely try to go beyond your comfort zone.</li>
<li><b>Push yourself</b>. Don&#8217;t stop at the first obstacle. Try a different approach. Don&#8217;t avoid things you dislike.</li>
<li><b>Debrief your experience.</b> If you don&#8217;t succeed, spend time to figure out why not. Brainstorm, and loop back with any new approaches.
<li>Also, Aligna Tugend&#8217;s book &#8220;Better By Mistake: The Unexpected Benefits of Being Wrong&#8221; contains still <a href="http://www.alinatugend.com/myths-about-mistakes/">more lessons</a>.</li>
</ol>
<p>That works for oneself, but what about the students?</p>
<p>If they are afraid of giving the &#8216;wrong&#8217; answer to a question, change the question to &#8220;tell me something that <em>doesn&#8217;t</em> work.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cogitolingua.net/blog/2012/01/31/dont-fear-the-mistakes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A New Field: Information Type Flow</title>
		<link>http://www.cogitolingua.net/blog/2012/01/30/a-new-field-information-type-flow/</link>
		<comments>http://www.cogitolingua.net/blog/2012/01/30/a-new-field-information-type-flow/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 18:35:17 +0000</pubDate>
		<dc:creator>erich</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Information Flow]]></category>

		<guid isPermaLink="false">http://www.cogitolingua.net/blog/?p=1354</guid>
		<description><![CDATA[<p>In my last post on Information Flow, I noticed that some flows are more informative than others. I used a switch statement for my illustrative example of that observation. But, from my experience as a software developer, I have a small aversion to switch statements. Usually, when I feel compelled to use one, it&#8217;s because [...]]]></description>
			<content:encoded><![CDATA[<p>In my last post on Information Flow, I noticed that <a href="http://www.cogitolingua.net/blog//2012/01/23/not-all-flows-are-considered-equal/">some flows are more informative than others</a>. I used a switch statement for my illustrative example of that observation. But, from my experience as a software developer, I have a small aversion to switch statements. Usually, when I feel compelled to use one, it&#8217;s because I&#8217;m not using OO design principles. It&#8217;s because that switch should really be replaced with a polymorphic dispatch.</p>
<p>So, thanks to my Super Awesome Postdoc, we coined a new field as a result. It stands to reason that Information Flow analysis can be performed on types, just as it has previously been performed on values. A collection of questions suggest themselves:</p>
<ol>
<li>Is it useful? Does sensitive/interesting/important information actually leak as a result of polymorphism? For a typical program, how much does the polymorphic dispatch reveal about your system? On the one hand, I think not so much; because the dispatch is taken on type-compatible instances. On the other, perhaps alot, if you represent much of the problem&#8217;s domain in the type system (AuthenticatedCustomer vs Guest). How do standard practices such as Design Patterns affect a programs information type flow?</li>
<li>What does the analysis entail? Does it require a statically typed language, so that you can easily identify the polymorphic call sites? Do you still have to provide instrumentation that take place at runtime?</li>
<li>What about dynamic languages? Does type-information make its way into dynamic programs? Even in a dynamic language, are the programmers developing as if they had a strongly typed world?</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.cogitolingua.net/blog/2012/01/30/a-new-field-information-type-flow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gold is Money</title>
		<link>http://www.cogitolingua.net/blog/2012/01/29/gold-is-money/</link>
		<comments>http://www.cogitolingua.net/blog/2012/01/29/gold-is-money/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 01:34:35 +0000</pubDate>
		<dc:creator>erich</dc:creator>
				<category><![CDATA[Economics]]></category>

		<guid isPermaLink="false">http://www.cogitolingua.net/blog/?p=1344</guid>
		<description><![CDATA[<p>I would like to evaluate whether or not Gold functions better than paper as a currency. This subject comes up, because of an engaging argument that I had last night about the U.S. Constitution and it&#8217;s purview of the monetary policy of the U.S. government. In particular, though the Constitution does not define what Money [...]]]></description>
			<content:encoded><![CDATA[<p>I would like to evaluate whether or not Gold functions better than paper as a currency. This subject comes up, because of an engaging argument that I had last night about the U.S. Constitution and it&#8217;s purview of the monetary policy of the U.S. government. In particular, though the Constitution does not define what Money is when it allows the Federal Government the power to &#8220;coin money&#8221; [Article 1, Section 8], it also expressly denies the States from &#8220;mak[ing] any Thing but gold and silver Coin a Tender in Payment of Debts&#8221;[Article 1, Section 10]. Why the explicit mention of precious metals? Wouldn&#8217;t a paper currency (such as any of those used <a href="http://www.ronscurrency.com/rhist.htm">throughout U.S. history</a>) be just as good, maybe better?</p>
<p>Even though Gold and Silver have a long history of being used for currency, I&#8217;ve thought often that the exercise of digging gold out of the ground, purifying it, stamping it with an insignia, and then locking it away in a vault as you trade a representational paper certificate instead, was a rather silly thing to do. (Only about 40% is actually used this way. 50% goes to jewerly and 10% to industry [<a href="http://en.wikipedia.org/wiki/Gold">wikipedia</a>]) Why should we use this stuff as money? Can&#8217;t you dispense with the gold, and just use the paper instead?</p>
<p>That great historical thinker Aristotle identifies the <a href="http://goldnews.bullionvault.com/money_aristotle_050120092">utilities essential to a currency</a>:</p>
<ul>
<li><b>Durable:</b> Money must stand the test of time and the elements. It must not fade, corrode, or change through time;
<li><b>Portable:</b> Good money needs to hold a high amount of &#8216;worth&#8217; relative to its weight and size;
<li><b>Divisible:</b> Money should be relatively easy to separate and re-combine without affecting its fundamental characteristics. An extension of this idea is that the item should be &#8220;fungible&#8221;, defined as &#8220;being freely exchangeable or replaceable, in whole or in part, for another of like nature or kind.&#8221;
<li><b>Intrinsically Valuable:</b> This value of money should be independent of any other object and contained in the money itself, starting with rarity.
</ul>
<p>Clearly, gold by its very nature is durable, portable (though not so much as paper), and divisible. But some contend the last part: it doesn&#8217;t have a clear intrinsic value other than rarity.</p>
<p>But platinum (and many other metals) are more rare than gold, why not use one of them? Still other metals are more difficult to recover from raw earth, making them more valuable as measured by the economic cost of obtaining them, why not use one of them?</p>
<p>Both of these objections can be dismissed on the basis of recognizablility: Other metals are all silvery in color, while gold stands apart for its yellowish color. This property makes it alone easily distinguishable from a counterfeit. So the &#8216;intrinsic value&#8217; of gold is actually derived from three aspects: rarity, difficulty to produce, and recognizablility. These aspects plus the other utilities make gold the best suited natural material for money. We should therefore add to the &#8216;intrinsic value&#8217; a fourth aspect: natural suitability as money.</p>
<p>But a printer can produce paper currency with fancy designs, for recognizability, and in limited quantities, for artificial rarity. Thus simulating those aspects which make gold so suitable as a currency. Also, in practice, people do not usually cut the coins in half to make change for a transaction because it trespasses upon the &#8216;borrowed trust&#8217; of the mint, defacing the stamped insignia and destroying future transaction value. So, divisibility isn&#8217;t nearly as strong as the other utilities. Paper currency can be made better than gold in rarity and portablity so it should function better as currency.</p>
<p>Yes, except for that rarity and recognizability do not automatically satisfy intrinsic value. Gold is also difficult to produce. And no matter how complex the anti-counterfeit designs raise the cost of printing, a real government would never try to make the cost of printing a bill equal to the cost of extracting the equivalent amount of gold, because paper lacks durability. Paper bills must be replaced as they wear out.</p>
<p>So, knowing this, how can a government give a paper currency an intrinsic value that the populace will respect? Declare the paper currency good for the payment of taxes. Now, some initially worthless paper, printed in limited amounts and stamped with recognizable designs becomes useful for maintaining ones lifestyle outside of a jail cell. Now people desire having at least some amount of the paper, and are therefore willing to trade to get it. So, by <a href="http://en.wikipedia.org/wiki/Gresham's_law">Gresham&#8217;s Law</a> paper rapidly becomes the only currency in circulation.</p>
<p>Further, the government now has more control over the currency supply, and has the power to practice monetary policies which can stabilize prices. It is easier for the government to print money as the economy expands than it is to extract more gold. But, it should be noted, that governments historically have not exercised this beneficial aspect of control. Rather, they routinely opt for inflationary measures which destabilize prices. Given that I harbor a strong distrust of government, I actually see this power as a drawback rather than a benefit. You see because gold is a limited chemical element, it can&#8217;t be replicated at will: So the use of gold as money prevents government from counterfeiting! Gold is more durable than any government and its printing press.</p>
<p>There is one standing objection I have not yet addressed: shouldn&#8217;t the money supply expand with the economy? Adopting a rare and finite substance such as gold prevents that flexibility. </p>
<p>I was not able to verify this on my own (even looking in google scholar), but I&#8217;ve heard Doug Casey say that the price of a tunic, sandals, and belt in ancient Rome could be purchased for about 1 troy oz gold; roughly equivalent to a fine suit, shoes, and belt today (at $2,000/oz gold). Though it wouldn&#8217;t have been possible to obtain such high quality fabrics then, the price for items functionally equivalent has remained comparable across 2,000 years of economic growth.</p>
<p>Furthermore, it should be noted that as the economy expands, so too does the technology for extracting minerals. Thus we can add to the gold/money supply as the economy grows (though maybe not at exactly the same pace). And, since the economy is now so vast and most of the gold has already been recovered we should not experience any large swings in the money supply (such as Spain experienced during the plunder of South America). Even if gold is a deflationary currency (because only a finite amount exists and extraction is asymptotically approaching zero while economic growth remains exponential) the very predictability of its supply is useful as a stable bedrock for pricing, and the inability of government to counterfeit gold prevents undue market interference for political purposes.</p>
<p>Because paper must make up for intrinsic drawbacks via government coercion, I conclude that <b>Gold is <em>natural</em> Money.</b> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.cogitolingua.net/blog/2012/01/29/gold-is-money/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Good IR</title>
		<link>http://www.cogitolingua.net/blog/2012/01/27/the-good-ir/</link>
		<comments>http://www.cogitolingua.net/blog/2012/01/27/the-good-ir/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 09:13:19 +0000</pubDate>
		<dc:creator>erich</dc:creator>
				<category><![CDATA[Comp*]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.cogitolingua.net/blog/?p=1278</guid>
		<description><![CDATA[<p>After parsing, each function can be represented as a ControlFlowGraph of BasicBlocks. Each BasicBlock holds a list of Instructions. For illustrative purposes Instructions are colored Blue and BasicBlocks are colored Orange.</p> <p>I&#8217;d now like to address the question: What should the ConditionalBranch instruction at the end of the If-Header point to?</p> Option Illustration Pro Con [...]]]></description>
			<content:encoded><![CDATA[<p>After parsing, each function can be represented as a ControlFlowGraph of BasicBlocks. Each BasicBlock holds a list of Instructions.  For illustrative purposes Instructions are colored Blue and BasicBlocks are colored Orange.</p>
<p>I&#8217;d now like to address the question: What should the ConditionalBranch instruction at the end of the If-Header point to?</p>
<table>
<tr>
<th>Option</th>
<th>Illustration</th>
<th>Pro</th>
<th>Con</th>
</tr>
<tr>
<td>Point at the following BasicBlock</td>
<td>
<a href="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/CFG_option3.png"><img src="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/CFG_option3.png" alt="" title="CFG_option3" width="181" height="200" class="alignnone size-full wp-image-1297" /></a>
</td>
<td>
<ol>
<li>Convenient: the target BasicBlock is available during parse.
</ol>
</td>
<td>
<ol>
<li>Redundant: the If-Header block has a ControlFlowGraph edge with the same destination.</li>
<li>Non-Uniform: it&#8217;s unsettling to have some instructions (such as Add/Sub/Mul/Div) point at other Instructions, but then deal with ConditionalBranch as a special case.</li>
</ol>
</td>
</tr>
<tr>
<td>Point at the first Instruction of the following BasicBlock.</td>
<td>
<a href="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/CFG_option2.png"><img src="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/CFG_option2.png" alt="" title="CFG_option2" width="181" height="200" class="alignnone size-full wp-image-1296" /></a>
</td>
<td>
<ol>
<li>Uniform: Instructions point only to other Instructions.</li>
</ol>
<td>
<ol>
<li>Redundant: The If-Header block has a ControlFlowGraph edge with the same destination.</li>
<li>Problematic: Can you guarantee that target all blocks have at least one instruction to point at?</li>
</ol>
</td>
</tr>
</table>
<p>The common drawback with both of these proposals, is that of Redundancy. At some point, during a future optimization pass, we might like to transform the ControlFlowGraph. If such a transformation requires that we update both the BasicBlock&rarr;BasicBlock edges <em>and</em> the target of ConditionalBranch Instructions, then we are more likely to have a bug. We must put forth extra effort in keeping both kinds of link synchronized.</p>
<p>We can avoid this common drawback by adding a layer of indirection/abstraction. Instead of forcing the ConditionalBranch instruction to maintain a pointer to its target, we can access the target through a function. That function can query its own BasicBlock about the outgoing ControlFlowGraph edges, and return either the target BasicBlock or the target BasicBlock&#8217;s first Instruction. By making this abstraction, not only do we avoid the extra effort of keeping redundant links synchronized, but we also promote uniformity in the design through the introduction of a new invariant: <b>Only BasicBlock&#8217;s carry information about the ControlFlowGraph; No other edges are allowed between BasicBlocks</b>.</p>
<table>
<tr>
<th>Illustration</th>
<th>Option</th>
<th>Pro</th>
<th>Con</th>
</tr>
<tr>
<td>ConditionalBranch queries its BasicBlock.</td>
<td>
<a href="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/CFG_option1.png"><img src="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/CFG_option1.png" alt="" title="CFG_option1" width="181" height="200" class="alignnone size-full wp-image-1295" /></a>
</td>
<td>
<ol>
<li>Uniform: The only links across/between BasicBlocks are control flow edges held by BasicBlocks.</li>
<li>Convenient: Do not have to synchronize redundant information.
</ol>
</td>
<td>
<ol>
<li>Performance: A function call is required when asking a ConditionalBranch for its targets.
</ol>
</td>
</tr>
</table>
<p>Now that we have decided that ConditionalBranch will return information about the targets via a function call, we visit the question: Is the branch target the successor BasicBlock or is it the successor BasicBlock&#8217;s first Instruction?</p>
<p>To answer this question, I&#8217;m going to assume that the Internal Representation can also be interpreted. Such a design has the advantage that we can verify the structure of the IR by interpreting it after construction and between transformation/optimization passes.</p>
<p>Let&#8217;s assume a simple interpreter of the form:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">Instruction i <span style="color: #000080;">=</span> function.<span style="color: #007788;">firstInstruction</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>i.<span style="color: #007788;">isEnd</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    i <span style="color: #000080;">=</span> i.<span style="color: #007788;">evaluate</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>This interpreter exploits polymorphic dispatch on the Instruction hierarchy. We can express the loop concisely because we follow the invariant: <code>evaluate</code> always returns the next instruction to be executed. This is analogous to setting the program counter (<code>pc</code>), but avoids passing the <code>pc</code> as either a function parameter (which most <code>evaluate</code> implementations will ignore) or as a global variable (yuck!). Importantly, this loop has no concept of BasicBlock&#8217;s; it evaluates only Instructions.</p>
<p>So, in the interests of keeping the interpreter loop immaculately clean, we have only one choice: ConditionalBranch must return the first Instruction of the target BasicBlock. But, this answer contains a potential pitfall: Can we guarantee that all target BasicBlocks have at least one Instruction?</p>
<p>Consider the following example code, and associated ControlFlowGraph.</p>
<table>
<tr>
<th>Code</th>
<th>ControlFlowGraph</th>
</tr>
<tr>
<td>
<pre>
if (cond1) {
    // do something 1
} else {
    if (cond2) {
        // do something 2
    }
}
</pre>
</td>
<td>
<a href="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/Nested-If.png"><img src="http://www.cogitolingua.net/blog/wp-content/uploads/2012/01/Nested-If-300x233.png" alt="" title="Nested-If" width="300" height="233" class="alignnone size-medium wp-image-1328" /></a>
</td>
</table>
<p>Notice that, those blocks which do not have instructions in them have been left blank. Suppose that <code>cond1</code> is <code>false</code> and <code>cond2</code> is <code>false</code> so that the interpreter ends up following the chain of empty BasicBlocks. We notice that there is immediately some difficulty in having the interpreter transfer from <code>ConditionalBranch(cond2)</code> to the the first instruction of the (empty) target BasicBlock. One possible solution comes to mind: Have <code>ConditionalBranch(cond2)</code> attempt to iterate the following blocks until it finds one with a first Instruction. Although this will work, it feels rather kludgy, and we should continue our search for a clean design.</p>
<p>Let&#8217;s analyze the situation in more detail. Specifically, let&#8217;s look at the last instruction of the ThenBlock. It contains code for <code>do something 1</code>, which has been left unspecified to emphasize the fact that it can be completely arbitrary. However, (because we are gifted with knowledge of assembly) we have advanced some foresight: when the instructions are finally emitted from the CodeGenerator in a linear stream, we must insert an UnconditionalJump which bypasses the code for the ElseBranch (assuming one exists), and lands the program counter at the first Instruction of the JoinBlock.</p>
<p>In our IR interpreter, the last Instruction of the code inside the ThenBlock can be arbitrary, so it will have some difficultly detecting that control should be transferred to the following JoinBlock. We can alleviate this difficulty by analogy to our foresight, and introduce an UnconditionalJump in the last BasicBlock of the ThenBranch. As with the ConditionalBranch, the UnconditionalJump will rely on the ControlFlowGraph edge (we are guaranteed only 1) of its BasicBlock to determine the following instruction during interpretation.</p>
<p>We now have two situations of BasicBlocks which end in a kind of control transfer Instruction:</p>
<ol>
<li>If-Headers and Loop-Headers, which end in a ConditionalBranch Instruction.</li>
<li>The Last BasicBlock of a ThenBranch, which ends in an UnconditionalJump.</li>
</ol>
<p>The explicit control transfer in these situations allows the interpreter to easily determine the next instruction, even though it lies in a different BasicBlock. That is, in these two cases, the interpreter does not need to know about the existence of BasicBlocks. Due to this advantage, we should try to arrange one of these two situations to our current concern: the empty BasicBlocks in the ElseBranch.</p>
<p>Only one of the two previous instructions applies: the UnconditionalJump. It certainly doesn&#8217;t hurt the semantics of the ControlFlowGraph to insert an UnconditionalJump at every edge (even fallthrough edges). So we can safely coin the invariant: <b>All BasicBlocks end with a control transfer Instruction</b> (ConditionalBranch or UnconditionalJump). This invariant unifies our design, and allows the interpreter to iterate only over Instructions.</p>
<p>Additionally, we now also have at least one Instruction (the UnconditionalJump) in every BasicBlock! So, we can positively guarantee that a ConditionalBranch is able to return the first Instruction of its target BasicBlock. Indeed, <em>all</em> control transfer Instructions are able to do likewise.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cogitolingua.net/blog/2012/01/27/the-good-ir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deliberate Practice: Learn to Type</title>
		<link>http://www.cogitolingua.net/blog/2012/01/24/deliberate-practice-learn-to-type/</link>
		<comments>http://www.cogitolingua.net/blog/2012/01/24/deliberate-practice-learn-to-type/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 09:00:51 +0000</pubDate>
		<dc:creator>erich</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[deliberate practice]]></category>
		<category><![CDATA[ergonomics]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[steno]]></category>

		<guid isPermaLink="false">http://www.cogitolingua.net/blog/?p=1267</guid>
		<description><![CDATA[<p>If you&#8217;re gonna be in the software industry. You have to communicate, not only through code but also through email, forums, IRC or IM. It&#8217;s not so important that you be a fast typing in order to bang out code really fast. Rather, you should be a fast typing so that it doesn&#8217;t hold you [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re gonna be in the software industry. You have to communicate, not only through code but also through email, forums, IRC or IM. It&#8217;s not so important that you be a fast typing in order to bang out <em>code</em> really fast. Rather, you should be a fast typing so that it doesn&#8217;t hold you back. So that you don&#8217;t have to sacrifice anything. So that you can participate in the electronically held discussions. So that you can be digitally present.</p>
<p>Don&#8217;t let the lack of little things like typing skills hold you back from practicing the larger things.</p>
<p>see:<br />
1. <a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html">Steve Yegge</a><br />
2. <a href="http://sachachua.com/blog/2011/09/deliberate-practice-typing-faster-and-emacs/">Sacha Chua</a></p>
<p>Now, go forth and practice!</p>
<p>&#8211;<br />
UPDATE: Actually, I found an even better alternative: <a href="http://stenoknight.com/wiki/Main_Page">Plover</a> which essentially turns your existing keyboard into a steno machine (provided that it supports chording). The author has a fantastic series of articles, including one about how <a href="http://stenoknight.com/WritingCoding.html">steno can drastically improve your coding.</a> Perhaps, I shouldn&#8217;t worry too much that I&#8217;ll never find a keyboard with the <a href="2012/01/21/a-configurable-keyboard/">my ideal layout</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cogitolingua.net/blog/2012/01/24/deliberate-practice-learn-to-type/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Course in Web Services</title>
		<link>http://www.cogitolingua.net/blog/2012/01/23/project-course-in-web-services/</link>
		<comments>http://www.cogitolingua.net/blog/2012/01/23/project-course-in-web-services/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 04:10:29 +0000</pubDate>
		<dc:creator>erich</dc:creator>
				<category><![CDATA[Comp*]]></category>
		<category><![CDATA[Education]]></category>

		<guid isPermaLink="false">http://www.cogitolingua.net/blog/?p=1260</guid>
		<description><![CDATA[<p>I&#8217;ve just finished reading Phillip Greenspun&#8217;s experience report, Teaching Software Engineering, which details a project course in building Web Services. Even though I personally, hate the Web&#8217;s architecture (but that&#8217;s a rant for some other time), it still remains as THE most influentential and convenient place to showcase one&#8217;s work. It&#8217;s also convenient for shopping, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just finished reading Phillip Greenspun&#8217;s experience report, <a href="http://philip.greenspun.com/teaching/teaching-software-engineering">Teaching Software Engineering</a>, which details a project course in building Web Services. Even though I personally, hate the Web&#8217;s architecture (but that&#8217;s a rant for some other time), it still remains as THE most influentential and convenient place to showcase one&#8217;s work.  It&#8217;s also convenient for shopping, learning, participating in niche communities, etc.  The Web has real business value, and is therefore un-ignorable.</p>
<p>Based on his experience with the course, Greenspun had some nice quotes, which pertain to thought&#8217;s I&#8217;ve been building recently as I&#8217;ve been digging into the question: &#8216;What makes education valuable?&#8217;.</p>
<h3>Building Real-World Skill</h3>
<blockquote><p>
We&#8217;d like our students to be able to take vague and ambitious specifications and turn them into a system design that can be built and launched within a few months, with the most important-to-users and easy-to-develop features built first and the difficult bells and whistles deferred to a second version. We&#8217;d like our students to know how to test prototypes with end-users and refine their application design once or twice within even a three-month project.</p>
<p>For every project in 6.916 Classic, we insisted on having a client. This is a person who can describe desired capabilities for an information system but offers no hint as to how to build it. The best clients are people who are in fact passionate about some sort of Internet service and completely clueless about all matters technical. Good sources of clients are dotcom CEOs, MBA students, non-profit organization directors, and university administrators.</p>
<p>we invited alumni who were working as professional software engineers to return to campus on Tuesdays and Thursday evenings to coach students during the 6 hours of supervised laboratory time per week. There are perhaps 10 alumni out there for every current MIT undergraduate.</p>
<p>The best projects were ones with clients who had the wherewithal to extend and maintain the service after the course is over, possibly by hiring the students who built it.
</p></blockquote>
<p>A plethora of useful circumstances are brought into alignment: Students are challenged in the same underspecified way that they&#8217;d face in a real job. That challenge is met by performing fast, iterative development, ala XP or Agile. They get to interact with an actual customer: deriving project worth from satisifing the client, and building experience with client rejection and other realistic bumps.  Finally, they get to forge connections in a business network, which can help them when entering the job market.</p>
<h3>Student Learning</h3>
<blockquote><p>
Software engineering is a craft and can only be learned by practice.</p>
<p>Our experience [with producing five complete internet service projects] contrasts with typical software engineering courses in which a student builds only one application (or a piece of one application) during the entire semester. Research on simple word association tasks has demonstrated that people who learned to perform quickly but not accurately would have remarkably good recall even months later and, with a bit of practice, could always be made to perform accurately. Whereas people who were slow but accurate forgot all of their skills within a month or two.
</p></blockquote>
<p>Just another example where <a href="http://www.codinghorror.com/blog/2008/08/quantity-always-trumps-quality.html">Quantity trumps Quality</a>.  People learn by actually practicing and experimenting. They do not learn by listening to lectures. Learning can be reinforced by discussion and analysis, by questioning and tweaking.</p>
<h3>Building a Portfolio</h3>
<blockquote><p>
At the end of the semester, a student in 6.916 could look back upon four or five completed Internet services. The first ones that he or she built had been done for the problem sets. They won&#8217;t have been complex. They may not have been built to a very high standard of polish. But their existence enabled nearly all students to become fluent in the arts of designing a data model, specifying a page flow, and implementing the designed system in SQL and a procedural language.</p>
<p>At the end of the semester we drill into the students&#8217; heads the cold hard facts of the world: nobody owes them attention. We have each student group prepare an overview page that is a single HTML document, with a few screen shots, that demonstrates the major functions of the Internet service that they&#8217;ve built. Visit <a href="http://philip.greenspun.com/seia/gallery/">http://philip.greenspun.com/seia/gallery/</a> to see these pages.</p>
<p>Finally, it has been fun to watch our students graduate and go onto the job market. During job interviews they are able to point their interviewer to the URL of the running Web service that they developed during 6.916. Oftentimes, the student-built service is more sophisticated and is running on a more reliable infrastructure than most of the Internet applications launched on the public Internet by the interviewer&#8217;s company!
</p></blockquote>
<p>This is where I&#8217;ll have to distinguish my school: The lessons are online, but the workshop let&#8217;s you build your <a href="http://www.codinghorror.com/blog/2004/10/a-programmers-portfolio.html">Programmer&#8217;s Portfolio</a>.</p>
<h3>Reaching for the Sky</h3>
<blockquote><p>
Universities have long taught theoretical methods for dealing with concurrency and transactions. The Internet raises new challenges in these areas. A dozen users may simultaneously ask for the same airline seat. Twenty responses to a discussion forum question may come in simultaneously. The radio or hardwired connection to a user may be interrupted halfway through an attempt to register at a site.</p>
<p>In the second problem set (&#8220;reservation system&#8221;), students built a collaborative conference room scheduling system. This raises the problem of concurrency in a natural manner. Every student can understand that you don&#8217;t want to book two people into a room at overlapping times.</p>
<p>Third, because all of the projects have a predictable shape we&#8217;ll be able to introduce distributed computing challenges merely by having students offer services to each other.
</p></blockquote>
<blockquote><p>
Students said that the &#8220;metadata&#8221; problem set was very valuable for speeding work on their projects. Students were asked to build a knowledge management system by writing a computer program to write all of the computer programs. I.e., we gave them a machine-readable language for representing the system capabilities and user experience and asked them to write a program to generate the SQL data model and then the scripts to support the user experience.
</p></blockquote>
<blockquote><p>
In the final exercise of the problem set, we ask the students to mark certain rooms as requiring fees. Users who wish to book those rooms must supply a credit card number. At MIT we hook up the servers to a live merchant account at CyberCash. Thus our better students will be able to open their credit card statements in the middle of the semester and discover a few dollars in charges made by their own Web server.
</p></blockquote>
<p>UPDATE: Greenspun also has a <a href="http://blogs.law.harvard.edu/philg/2007/08/23/improving-undergraduate-computer-science-education/">quick bullet list</a> of all the lessons learned, and outline of the course&#8217;s structure.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cogitolingua.net/blog/2012/01/23/project-course-in-web-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Not All Flows are Considered Equal</title>
		<link>http://www.cogitolingua.net/blog/2012/01/23/not-all-flows-are-considered-equal/</link>
		<comments>http://www.cogitolingua.net/blog/2012/01/23/not-all-flows-are-considered-equal/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 19:56:24 +0000</pubDate>
		<dc:creator>erich</dc:creator>
				<category><![CDATA[Information Flow]]></category>

		<guid isPermaLink="false">http://www.cogitolingua.net/blog/?p=1255</guid>
		<description><![CDATA[<p>When I was writing last post about information flow terminology, I noticed something interesting: when knowledge of control flows are used to determine the values of variables, some branches yield more information than others. Previously, I had only considered the binary if-then-else branch. Today, I shall examine a switch-case statement, which exhibits asymmetric information flow.</p> [...]]]></description>
			<content:encoded><![CDATA[<p>When I was writing last post about <a href="http://www.cogitolingua.net/blog//2012/01/19/new-terminology-in-information-flow-research/">information flow terminology</a>, I noticed something interesting: when knowledge of control flows are used to determine the values of variables, some branches yield more information than others. Previously, I had only considered the binary if-then-else branch. Today, I shall examine a switch-case statement, which exhibits asymmetric information flow.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* pick s from 1 to 3, inclusive */</span>
<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>s<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> k <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">:</span> k <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">:</span> k <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>After this code segment has executed: <code>k</code> is one of two values: <code>1</code> or <code>2</code>. However, one of these values is more informative for the observer. If an observer sees <code>k == 1</code> then she can infer that <code>s == 1</code>. On the other hand, if the observer sees <code>k == 2</code> then she can only infer <code>s != 1</code> (or <code>s in {2,3}</code> with knowledge of <code>s</code>&#8216;s distribution).</p>
<p>For control structures this simple, a static analysis could be run on the code, and provide a result graph of how influential each variable is on others. This graph could be used to quantify how much information might be leaked to an observer. Unfortunately, it comes with the limitation that each branch is considered as drawn from a uniform distribution, which may not be true of actual runtime values.</p>
<p>Nevertheless, I think the ability to statically quantify how much information can be leaked via control flow branches, might be useful for:</p>
<ol>
<li>deciding which variables need tracking,</li>
<li>where instrumentation/wrappers/labels might be omitted,</li>
<li>where inspections/checks must be inserted,</li>
<li>finding variables which fall below a certain leak threshold.</li>
</ol>
<p>I would really like such an analysis to tell me, for example, whether a variable holding a password is potentially leaked, and if so, how many bits. Or, to list me all the variables of my program in order of how much they might leak.</p>
<p>The inference here sounds like the same as in <a href="http://www.cs.toronto.edu/~hehner/PPP.pdf">Probabilistic Predicative Programming</a> by Eric C.R. Hehner (whom I met when Wayne Hayes invited him to give a Friday Seminar talk in Dec 2010), except that it runs backwards on the control flow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cogitolingua.net/blog/2012/01/23/not-all-flows-are-considered-equal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

