<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:rawvoice="http://www.rawvoice.com/rawvoiceRssModule/"
	>
<channel>
	<title>Comments on: Functional Language Adoption</title>
	<atom:link href="http://enfranchisedmind.com/blog/posts/functional-language-adoption/feed/" rel="self" type="application/rss+xml" />
	<link>http://enfranchisedmind.com/blog/posts/functional-language-adoption/</link>
	<description>programming, politics, &#38; other religious issues</description>
	<lastBuildDate>Wed, 08 Feb 2012 14:16:00 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>By: Henrik</title>
		<link>http://enfranchisedmind.com/blog/posts/functional-language-adoption/#comment-33092</link>
		<dc:creator>Henrik</dc:creator>
		<pubDate>Wed, 30 Apr 2008 13:26:57 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/06/28/271#comment-33092</guid>
		<description>I stumbled across this article when hunting for interesting reading regarding parallelization. 

I thought I&#039;d mention the D programming language here.  The 2.0 implementation of the language is currently being equipped with &quot;safe&quot; and a &quot;functional&quot; subsets (more about safeD here: http://www.digitalmars.com/d/2.0/safed.html ). 
The functional subset is, as far as I understand, not entirely implemented yet. It is being prepared for, however, and the goal is to be able to create purely functional parts of a program, that can communicate, but not interact, with the imperative pats. Eventually this will mean automatic concurrency for the purely functional parts of the program. There&#039;s a presentation about this here: http://www.digitalmars.com/d/2.0/accu-functional.pdf</description>
		<content:encoded><![CDATA[<p>I stumbled across this article when hunting for interesting reading regarding parallelization. </p>
<p>I thought I&#8217;d mention the D programming language here.  The 2.0 implementation of the language is currently being equipped with &#8220;safe&#8221; and a &#8220;functional&#8221; subsets (more about safeD here: <a href="http://www.digitalmars.com/d/2.0/safed.html" rel="nofollow">http://www.digitalmars.com/d/2.0/safed.html</a> ).<br />
The functional subset is, as far as I understand, not entirely implemented yet. It is being prepared for, however, and the goal is to be able to create purely functional parts of a program, that can communicate, but not interact, with the imperative pats. Eventually this will mean automatic concurrency for the purely functional parts of the program. There&#8217;s a presentation about this here: <a href="http://www.digitalmars.com/d/2.0/accu-functional.pdf" rel="nofollow">http://www.digitalmars.com/d/2.0/accu-functional.pdf</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jon Harrop</title>
		<link>http://enfranchisedmind.com/blog/posts/functional-language-adoption/#comment-31691</link>
		<dc:creator>Jon Harrop</dc:creator>
		<pubDate>Sun, 16 Sep 2007 02:16:58 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/06/28/271#comment-31691</guid>
		<description>If you&#039;re interested in concurrency then you might like to look at F#&#039;s new asynchronous programming constructs.</description>
		<content:encoded><![CDATA[<p>If you&#8217;re interested in concurrency then you might like to look at F#&#8217;s new asynchronous programming constructs.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Enfranchised Mind &#187; Venkat on Functional Languages: I Knew He Was Smart</title>
		<link>http://enfranchisedmind.com/blog/posts/functional-language-adoption/#comment-31367</link>
		<dc:creator>Enfranchised Mind &#187; Venkat on Functional Languages: I Knew He Was Smart</dc:creator>
		<pubDate>Sat, 14 Jul 2007 16:37:07 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/06/28/271#comment-31367</guid>
		<description>[...] hey hey! It&#8217;s like he reads this blog or something. It&#8217;s nice to know that this idea doesn&#8217;t just exist in the head of Brian [...]</description>
		<content:encoded><![CDATA[<p>[...] hey hey! It&#8217;s like he reads this blog or something. It&#8217;s nice to know that this idea doesn&#8217;t just exist in the head of Brian [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brian</title>
		<link>http://enfranchisedmind.com/blog/posts/functional-language-adoption/#comment-31161</link>
		<dc:creator>Brian</dc:creator>
		<pubDate>Fri, 29 Jun 2007 00:59:07 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/06/28/271#comment-31161</guid>
		<description>An additional comment- message passing is not a complete solution.  I think it&#039;s an important part of the solution, but it isn&#039;t sufficient.

Some of the problems with message passing are:

1) Scaling of the number of processes used is not automatic, but is instead a design decision.  Changing the number of processes requires a rearchitecturing of the code base.

2) It doesn&#039;t eliminate deadlocks- and worse yet, it makes deadlocks much harder to detect (as they take the form of &quot;thread 1 is waiting for a message that only thread 2 will send, while thread 2 is waiting for a message that only thread 1 will send&quot;, and it&#039;s really hard to prove the &quot;only thread X will send this message&quot;).  It does make deadlocks less common, however.

3) It doesn&#039;t eliminate race conditions, at least if race conditions are specified as &quot;event X should not happen between when I send/receive message A and when I send/receive message B&quot;.  Again, race conditions are signfigiantly reduced, but not eliminated.

4) It does not solve the composition problem- if I want to take an object out of data structure A &quot;owned&quot; by thread 1, and insert it into data structure B &quot;owned&quot; by thread 2, without any other thread (except threads 1 and 2, obviously) seeing it in either both data structures or neither data structures, without introducing either race conditions or deadlocks.

It does deal with high latency/low bandwidth connections (especially network connections, but signifigantly non-uniform ccNUMA also counts) much better, allow for process failure, and can be retrofitted into existing, single-threaded languages (See JoCaml, MPI, etc.).  But the above reasons are why I don&#039;t think it&#039;s sufficient- especially not when you&#039;re looking at designing a program with hundreds or thousands of threads.</description>
		<content:encoded><![CDATA[<p>An additional comment- message passing is not a complete solution.  I think it&#8217;s an important part of the solution, but it isn&#8217;t sufficient.</p>
<p>Some of the problems with message passing are:</p>
<p>1) Scaling of the number of processes used is not automatic, but is instead a design decision.  Changing the number of processes requires a rearchitecturing of the code base.</p>
<p>2) It doesn&#8217;t eliminate deadlocks- and worse yet, it makes deadlocks much harder to detect (as they take the form of &#8220;thread 1 is waiting for a message that only thread 2 will send, while thread 2 is waiting for a message that only thread 1 will send&#8221;, and it&#8217;s really hard to prove the &#8220;only thread X will send this message&#8221;).  It does make deadlocks less common, however.</p>
<p>3) It doesn&#8217;t eliminate race conditions, at least if race conditions are specified as &#8220;event X should not happen between when I send/receive message A and when I send/receive message B&#8221;.  Again, race conditions are signfigiantly reduced, but not eliminated.</p>
<p>4) It does not solve the composition problem- if I want to take an object out of data structure A &#8220;owned&#8221; by thread 1, and insert it into data structure B &#8220;owned&#8221; by thread 2, without any other thread (except threads 1 and 2, obviously) seeing it in either both data structures or neither data structures, without introducing either race conditions or deadlocks.</p>
<p>It does deal with high latency/low bandwidth connections (especially network connections, but signifigantly non-uniform ccNUMA also counts) much better, allow for process failure, and can be retrofitted into existing, single-threaded languages (See JoCaml, MPI, etc.).  But the above reasons are why I don&#8217;t think it&#8217;s sufficient- especially not when you&#8217;re looking at designing a program with hundreds or thousands of threads.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brian</title>
		<link>http://enfranchisedmind.com/blog/posts/functional-language-adoption/#comment-31159</link>
		<dc:creator>Brian</dc:creator>
		<pubDate>Fri, 29 Jun 2007 00:40:37 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/06/28/271#comment-31159</guid>
		<description>Multiprocessing has been around forever.  Remember that Multics from the 1960&#039;s was designed for asymmetric multiprocessing- basically the equivelent of shoving both a PowerPC and an x86 into the same box.

What has changed is that the free ride of single-process performance has ended.  Numerical algorithms generally parallelize easily- parallelizing everything is work.  The logic used to be why bother to spend the time and effort to parallelize any given code base, because by the time you&#039;re done, faster processors will have come out giving you that speed up for free.  

But that doesn&#039;t apply any more.  And the situation is worse.  Multiprocessor used to mean 2-8 cpus, maybe as high as 64 in extreme cases.  Now, the number of cores per cpu is doubling every generation.  And multi-chip boxes are becoming much more common, as going from 2 (1 dual core chip) to 4 (2 dual core chips) is less weird- especially as those quad cores are comming out anways.

And I think we&#039;ll see an explosion in cores in the near future, as processor makers &quot;back-date&quot; when they gave up on single-threaded performance.  If you can make a CPU that is 95% as fast for 1/4th the number of transistors, you can give a 3.8x speed up by giving more of the smaller processors, and in effect &quot;back-dating&quot; when you started adding more processors by two generations.   And then they&#039;ll start eyeing giving you 16 processors in the same realestate, each at 80% the speed... 

Add all of this up, and I expect that within five or so years, you&#039;ll be seeing work stations with hundreds of cores in them- and home boxes with as many cores as the largest servers of ten years ago had.  Single chips will have hundreds, possibly thousands, of processors.  And large boxes will harness hundreds of these chips.  And the range of multithreaded computers will increase wildly- while it used to be that even multithreaded code only had to deal with one, maybe two, orders of magnitude range in the number of cpus (the top end Sun and SGI servers having ~100 processors), we&#039;ll be seeing differents of three, even four, orders of magnitude.  

Sometimes a difference in degree is a difference in kind.  Building a bridge over the English Channel is a fundamentally different undertaking than building a bridge over Old Man&#039;s Creek.  Different technologies are called for.

This is the point at which functional languages become a necessity- and programmers will have the choice of learn or die.  I can not imagine writting a program that effectively uses anywhere from 1 to 1024 processors using old style mutable data structures, threads, and locks.</description>
		<content:encoded><![CDATA[<p>Multiprocessing has been around forever.  Remember that Multics from the 1960&#8242;s was designed for asymmetric multiprocessing- basically the equivelent of shoving both a PowerPC and an x86 into the same box.</p>
<p>What has changed is that the free ride of single-process performance has ended.  Numerical algorithms generally parallelize easily- parallelizing everything is work.  The logic used to be why bother to spend the time and effort to parallelize any given code base, because by the time you&#8217;re done, faster processors will have come out giving you that speed up for free.  </p>
<p>But that doesn&#8217;t apply any more.  And the situation is worse.  Multiprocessor used to mean 2-8 cpus, maybe as high as 64 in extreme cases.  Now, the number of cores per cpu is doubling every generation.  And multi-chip boxes are becoming much more common, as going from 2 (1 dual core chip) to 4 (2 dual core chips) is less weird- especially as those quad cores are comming out anways.</p>
<p>And I think we&#8217;ll see an explosion in cores in the near future, as processor makers &#8220;back-date&#8221; when they gave up on single-threaded performance.  If you can make a CPU that is 95% as fast for 1/4th the number of transistors, you can give a 3.8x speed up by giving more of the smaller processors, and in effect &#8220;back-dating&#8221; when you started adding more processors by two generations.   And then they&#8217;ll start eyeing giving you 16 processors in the same realestate, each at 80% the speed&#8230; </p>
<p>Add all of this up, and I expect that within five or so years, you&#8217;ll be seeing work stations with hundreds of cores in them- and home boxes with as many cores as the largest servers of ten years ago had.  Single chips will have hundreds, possibly thousands, of processors.  And large boxes will harness hundreds of these chips.  And the range of multithreaded computers will increase wildly- while it used to be that even multithreaded code only had to deal with one, maybe two, orders of magnitude range in the number of cpus (the top end Sun and SGI servers having ~100 processors), we&#8217;ll be seeing differents of three, even four, orders of magnitude.  </p>
<p>Sometimes a difference in degree is a difference in kind.  Building a bridge over the English Channel is a fundamentally different undertaking than building a bridge over Old Man&#8217;s Creek.  Different technologies are called for.</p>
<p>This is the point at which functional languages become a necessity- and programmers will have the choice of learn or die.  I can not imagine writting a program that effectively uses anywhere from 1 to 1024 processors using old style mutable data structures, threads, and locks.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

