<?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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: &#8220;Hello World!&#8221;</title>
	<atom:link href="http://gowers.wordpress.com/2010/03/20/hello-world-2/feed/" rel="self" type="application/rss+xml" />
	<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/</link>
	<description>Mathematics related discussions</description>
	<lastBuildDate>Wed, 19 Jun 2013 13:39:38 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>By: Lars Hellström</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-39264</link>
		<dc:creator><![CDATA[Lars Hellström]]></dc:creator>
		<pubDate>Tue, 09 Apr 2013 13:08:42 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-39264</guid>
		<description><![CDATA[Perceptive remarks, but regarding differential forms, I would say that these really are one of the things where one benefits greatly from having them explained by a living lecturer. The difficulty often lies in the context, in matters such as &quot;how one should think about them&quot;, &quot;why one should do X&quot;, and &quot;how things fit together&quot;, rather than in details of proof formalia. The difficulty is in learning to apply the right perspective.

Categories can be like that too. As can C compilers.]]></description>
		<content:encoded><![CDATA[<p>Perceptive remarks, but regarding differential forms, I would say that these really are one of the things where one benefits greatly from having them explained by a living lecturer. The difficulty often lies in the context, in matters such as &#8220;how one should think about them&#8221;, &#8220;why one should do X&#8221;, and &#8220;how things fit together&#8221;, rather than in details of proof formalia. The difficulty is in learning to apply the right perspective.</p>
<p>Categories can be like that too. As can C compilers.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: I&#8217;m not dead yet! &#171; Blog in a Vat</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-10814</link>
		<dc:creator><![CDATA[I&#8217;m not dead yet! &#171; Blog in a Vat]]></dc:creator>
		<pubDate>Mon, 11 Apr 2011 04:32:37 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-10814</guid>
		<description><![CDATA[[...] fear of publicly declaring idiotic things is a healthy one to have, but let me illustrate with an example: I have recently decided that it is high time I learnt to program in a more traditional language, [...]]]></description>
		<content:encoded><![CDATA[<p>[...] fear of publicly declaring idiotic things is a healthy one to have, but let me illustrate with an example: I have recently decided that it is high time I learnt to program in a more traditional language, [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: anon</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-9087</link>
		<dc:creator><![CDATA[anon]]></dc:creator>
		<pubDate>Sun, 22 Aug 2010 02:52:07 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-9087</guid>
		<description><![CDATA[Well the GRADSTUDENT joke is not so funny, I find. A little bit condescending ...
I hope it doesn&#039;t stick around very long.]]></description>
		<content:encoded><![CDATA[<p>Well the GRADSTUDENT joke is not so funny, I find. A little bit condescending &#8230;<br />
I hope it doesn&#8217;t stick around very long.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jason T. Miller</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7612</link>
		<dc:creator><![CDATA[Jason T. Miller]]></dc:creator>
		<pubDate>Sat, 08 May 2010 08:09:09 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7612</guid>
		<description><![CDATA[&quot;A language that doesn&#039;t affect the way you think about programming, is not worth knowing.&quot;
    -- Alan Perlis (ref: http://norvig.com/21-days.html)

While I more or less agree, as with all aphorisms, counterexamples are legion. In this case, the usual suspects are &quot;environmental factors&quot;:
  - Lack of library support and the like: the so-called &quot;Turing tar-pit&quot;: While Mathematica can solve systems of polynomial equations &quot;out of the box,&quot; Gröbner basis algorithms could also be implemented in, say, Brainf**k. These alternatives are only equivalent in theory. Contrarily, it&#039;d probably be easier to implement the Risch algorithm in ARM assembler than it would be to convince Wolfram to port Mathematica to some random embedded platform.
  - Communication overhead: No code is an island. It might be easier to learn C# than to code up a translator in GRADSTUDENT.
  - Politics: rightly or wrongly, there exist &quot;powers that be&quot; that, on occasion, demand a particular implementation language. Even in the &quot;wrongly&quot; case, the shortest distance between two points is often through compliance.

And so on. But your comment that you &quot;just want to learn some language, after which it should be easy to adapt to another one&quot; is perceptive and correct; the risk you might pick up some &quot;bad habits&quot; along the way is, in my experience (IT and CS, mostly), overestimated. The reason why you can&#039;t teach an old dog new tricks is not that he is incapable, but that he doesn&#039;t care to learn. When it comes down to it, &quot;bad habits&quot; are simply &quot;the devil you know,&quot; and a sort of skeptical conservatism is not only understandable, but commendable in such a marketing-driven field as information technology. A more elegant proof does not invalidate a messy proof; that a &quot;better way&quot; exists does not make all others senseless folly.

The most important thing, I&#039;d say, is that you&#039;ll be &quot;getting your hands dirty,&quot; one way or another. By way of analogy, consider this: recently, I was in a so-called &quot;advanced calculus&quot; course, moving a bit more slowly than anticipated by the professor and the syllabus; one of the students was clearly frustrated because he &quot;really wanted to learn differential forms.&quot; The syllabus and textbook ended with Stokes&#039; Theorem; everything was in R^n, so we&#039;re really just talking about translating what he &quot;already knows&quot; into &quot;another language,&quot; and maybe kicking it up a dimension or n because we can. Assuming he met the prerequisites for the course, viz., linear algebra and multivariable calculus, I never quite figured out why he was waiting for what he was waiting for. If he didn&#039;t know the FTC or Fubini&#039;s Theorem, he wouldn&#039;t have been there; the algebra is easy (d^2 = 0, f*dx = df*x = d(x o f)?), and partitions of unity are just a matter of working through a few simple proofs. &quot;A little thought,&quot; Thoreau once wrote, &quot;is sexton to all the world.&quot; In this case, the necessary thought is trivial: whatever integrals he needs to get the hang of things; whatever proofs he needs to understand why they work out? But he didn&#039;t know this, as he never bothered to try. &quot;Not everyone things as you do,&quot; I&#039;m told, and that I overestimate people. But if he wants to learn forms, and he&#039;s capable of undergraduate calculus and algebra, what, exactly, am I overestimating? I&#039;m not expecting he&#039;ll _invent_ the bloody things, or work out their applications to cohomology or mathematical physics while he&#039;s folding laundry. And I&#039;m not that bright --- as I&#039;m constitutionally incapable of memorization, I doubt I&#039;d have been able to pass undergraduate calculus if I _hadn&#039;t_ known forms.

To abuse the analogy a bit, an equivalent &quot;bad habit&quot; might be using the Hodge dual to work out the curl of a vector field in spherical coordinates in order to apply the classical Stokes&#039; Theorem in R^3 in terms of forms. Pointless, perhaps, though educational in more ways than one. And, from a strictly practical perspective, whatever works, no? But this is hardly a reason to avoid learning calculus in the first place. After all, where would Cartan have been had Newton refused his education on account of a potential &quot;better way?&quot;]]></description>
		<content:encoded><![CDATA[<p>&#8220;A language that doesn&#8217;t affect the way you think about programming, is not worth knowing.&#8221;<br />
    &#8212; Alan Perlis (ref: <a href="http://norvig.com/21-days.html" rel="nofollow">http://norvig.com/21-days.html</a>)</p>
<p>While I more or less agree, as with all aphorisms, counterexamples are legion. In this case, the usual suspects are &#8220;environmental factors&#8221;:<br />
  &#8211; Lack of library support and the like: the so-called &#8220;Turing tar-pit&#8221;: While Mathematica can solve systems of polynomial equations &#8220;out of the box,&#8221; Gröbner basis algorithms could also be implemented in, say, Brainf**k. These alternatives are only equivalent in theory. Contrarily, it&#8217;d probably be easier to implement the Risch algorithm in ARM assembler than it would be to convince Wolfram to port Mathematica to some random embedded platform.<br />
  &#8211; Communication overhead: No code is an island. It might be easier to learn C# than to code up a translator in GRADSTUDENT.<br />
  &#8211; Politics: rightly or wrongly, there exist &#8220;powers that be&#8221; that, on occasion, demand a particular implementation language. Even in the &#8220;wrongly&#8221; case, the shortest distance between two points is often through compliance.</p>
<p>And so on. But your comment that you &#8220;just want to learn some language, after which it should be easy to adapt to another one&#8221; is perceptive and correct; the risk you might pick up some &#8220;bad habits&#8221; along the way is, in my experience (IT and CS, mostly), overestimated. The reason why you can&#8217;t teach an old dog new tricks is not that he is incapable, but that he doesn&#8217;t care to learn. When it comes down to it, &#8220;bad habits&#8221; are simply &#8220;the devil you know,&#8221; and a sort of skeptical conservatism is not only understandable, but commendable in such a marketing-driven field as information technology. A more elegant proof does not invalidate a messy proof; that a &#8220;better way&#8221; exists does not make all others senseless folly.</p>
<p>The most important thing, I&#8217;d say, is that you&#8217;ll be &#8220;getting your hands dirty,&#8221; one way or another. By way of analogy, consider this: recently, I was in a so-called &#8220;advanced calculus&#8221; course, moving a bit more slowly than anticipated by the professor and the syllabus; one of the students was clearly frustrated because he &#8220;really wanted to learn differential forms.&#8221; The syllabus and textbook ended with Stokes&#8217; Theorem; everything was in R^n, so we&#8217;re really just talking about translating what he &#8220;already knows&#8221; into &#8220;another language,&#8221; and maybe kicking it up a dimension or n because we can. Assuming he met the prerequisites for the course, viz., linear algebra and multivariable calculus, I never quite figured out why he was waiting for what he was waiting for. If he didn&#8217;t know the FTC or Fubini&#8217;s Theorem, he wouldn&#8217;t have been there; the algebra is easy (d^2 = 0, f*dx = df*x = d(x o f)?), and partitions of unity are just a matter of working through a few simple proofs. &#8220;A little thought,&#8221; Thoreau once wrote, &#8220;is sexton to all the world.&#8221; In this case, the necessary thought is trivial: whatever integrals he needs to get the hang of things; whatever proofs he needs to understand why they work out? But he didn&#8217;t know this, as he never bothered to try. &#8220;Not everyone things as you do,&#8221; I&#8217;m told, and that I overestimate people. But if he wants to learn forms, and he&#8217;s capable of undergraduate calculus and algebra, what, exactly, am I overestimating? I&#8217;m not expecting he&#8217;ll _invent_ the bloody things, or work out their applications to cohomology or mathematical physics while he&#8217;s folding laundry. And I&#8217;m not that bright &#8212; as I&#8217;m constitutionally incapable of memorization, I doubt I&#8217;d have been able to pass undergraduate calculus if I _hadn&#8217;t_ known forms.</p>
<p>To abuse the analogy a bit, an equivalent &#8220;bad habit&#8221; might be using the Hodge dual to work out the curl of a vector field in spherical coordinates in order to apply the classical Stokes&#8217; Theorem in R^3 in terms of forms. Pointless, perhaps, though educational in more ways than one. And, from a strictly practical perspective, whatever works, no? But this is hardly a reason to avoid learning calculus in the first place. After all, where would Cartan have been had Newton refused his education on account of a potential &#8220;better way?&#8221;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: obryant</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7202</link>
		<dc:creator><![CDATA[obryant]]></dc:creator>
		<pubDate>Sat, 24 Apr 2010 23:18:19 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7202</guid>
		<description><![CDATA[@Stephane: The compiler for GRADSTUDENT is only distributed to people with a Ph.D. I think you need a Fields Medal (or equivalent) before you can get the compiler for BLOG; at least, I don&#039;t have it.]]></description>
		<content:encoded><![CDATA[<p>@Stephane: The compiler for GRADSTUDENT is only distributed to people with a Ph.D. I think you need a Fields Medal (or equivalent) before you can get the compiler for BLOG; at least, I don&#8217;t have it.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: John Armstrong</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7201</link>
		<dc:creator><![CDATA[John Armstrong]]></dc:creator>
		<pubDate>Sat, 24 Apr 2010 22:33:45 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7201</guid>
		<description><![CDATA[Stephane is an adept user of SUBTLE.  In case I&#039;m wrong, I&#039;ve whipped up a quick subroutine in FACEPALM.]]></description>
		<content:encoded><![CDATA[<p>Stephane is an adept user of SUBTLE.  In case I&#8217;m wrong, I&#8217;ve whipped up a quick subroutine in FACEPALM.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Stephane</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7200</link>
		<dc:creator><![CDATA[Stephane]]></dc:creator>
		<pubDate>Sat, 24 Apr 2010 20:51:23 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7200</guid>
		<description><![CDATA[Silly question maybe but I&#039;ve tried to google BLOG and GRADSTUDENT but couldn&#039;t find a site where I could learn about those languages or download a compiler... Can anyone help ?]]></description>
		<content:encoded><![CDATA[<p>Silly question maybe but I&#8217;ve tried to google BLOG and GRADSTUDENT but couldn&#8217;t find a site where I could learn about those languages or download a compiler&#8230; Can anyone help ?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Peter Lund</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7114</link>
		<dc:creator><![CDATA[Peter Lund]]></dc:creator>
		<pubDate>Thu, 15 Apr 2010 10:38:59 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7114</guid>
		<description><![CDATA[Fredrik, actually it&#039;s recommended to both ask for all warnings and warnings ;)

(No, there&#039;s no missing word in that sentence.)

Take these command lines:
1) gcc -W ....
2) gcc -Wall ...
3) gcc -W -Wall ...

One would think that #1 turned on warnings and that would be that.  As it turns out, there are many, many warnings in the gcc compiler and lots of macho programmers didn&#039;t like to be told that their code was bad, so -W only turns on some of them (those with the lowest false negative rate, roughly).

#2 then turns on all the warnings, right?  No.  Some of them pissed some people off too much so it only turns most of them on.

#3 turns all of them on (as far as I know).

For anal retentive reasons, the gcc programmers are slowly deprecating -W in #3 in favour of -Wextra but the rest of the world pretty much ignores that.

Summary:  always use &#039;-W -Wall&#039; with gcc unless you have a really good reason not to.  And Python is a really good language (if a bit slow for certain things).  Highly recommended.  And there&#039;s work under way to make it faster (Unladen Swallow, PyPy) so it&#039;ll probably be faster in a couple of years.]]></description>
		<content:encoded><![CDATA[<p>Fredrik, actually it&#8217;s recommended to both ask for all warnings and warnings <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>(No, there&#8217;s no missing word in that sentence.)</p>
<p>Take these command lines:<br />
1) gcc -W &#8230;.<br />
2) gcc -Wall &#8230;<br />
3) gcc -W -Wall &#8230;</p>
<p>One would think that #1 turned on warnings and that would be that.  As it turns out, there are many, many warnings in the gcc compiler and lots of macho programmers didn&#8217;t like to be told that their code was bad, so -W only turns on some of them (those with the lowest false negative rate, roughly).</p>
<p>#2 then turns on all the warnings, right?  No.  Some of them pissed some people off too much so it only turns most of them on.</p>
<p>#3 turns all of them on (as far as I know).</p>
<p>For anal retentive reasons, the gcc programmers are slowly deprecating -W in #3 in favour of -Wextra but the rest of the world pretty much ignores that.</p>
<p>Summary:  always use &#8216;-W -Wall&#8217; with gcc unless you have a really good reason not to.  And Python is a really good language (if a bit slow for certain things).  Highly recommended.  And there&#8217;s work under way to make it faster (Unladen Swallow, PyPy) so it&#8217;ll probably be faster in a couple of years.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Example</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7112</link>
		<dc:creator><![CDATA[Example]]></dc:creator>
		<pubDate>Thu, 15 Apr 2010 02:28:33 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7112</guid>
		<description><![CDATA[The very basic things, like reading and writing stuff to the screen BASIC style are easier in C++ then in C.  I learned C++ in the 90&#039;s and C just seemed like an annoying headache.  The OOP stuff in C++ can be hard for some people to grok right away (like the difference between objects and classes) but that shouldn&#039;t be hard for a mathematician. 

Java is like a simplified version of C++. 

And Python is supposedly what most people say is the easiest programming language these days.]]></description>
		<content:encoded><![CDATA[<p>The very basic things, like reading and writing stuff to the screen BASIC style are easier in C++ then in C.  I learned C++ in the 90&#8242;s and C just seemed like an annoying headache.  The OOP stuff in C++ can be hard for some people to grok right away (like the difference between objects and classes) but that shouldn&#8217;t be hard for a mathematician. </p>
<p>Java is like a simplified version of C++. </p>
<p>And Python is supposedly what most people say is the easiest programming language these days.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Michael</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7111</link>
		<dc:creator><![CDATA[Michael]]></dc:creator>
		<pubDate>Wed, 14 Apr 2010 22:23:51 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7111</guid>
		<description><![CDATA[Only, don&#039;t use the tutorial sigfpe links, use the immortal LYAH http://learnyouahaskell.com/]]></description>
		<content:encoded><![CDATA[<p>Only, don&#8217;t use the tutorial sigfpe links, use the immortal LYAH <a href="http://learnyouahaskell.com/" rel="nofollow">http://learnyouahaskell.com/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Functional Composer</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7109</link>
		<dc:creator><![CDATA[Functional Composer]]></dc:creator>
		<pubDate>Wed, 14 Apr 2010 17:27:33 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7109</guid>
		<description><![CDATA[Mr. Gowers, You should be learning Haskell! It is a beautiful language and once you see what you can do with elegant compositions you will never want to use a C family language again.

http://hackage.haskell.org/platform/mac.html

And if you have any questions, let us help: http://www.reddit.com/r/haskell]]></description>
		<content:encoded><![CDATA[<p>Mr. Gowers, You should be learning Haskell! It is a beautiful language and once you see what you can do with elegant compositions you will never want to use a C family language again.</p>
<p><a href="http://hackage.haskell.org/platform/mac.html" rel="nofollow">http://hackage.haskell.org/platform/mac.html</a></p>
<p>And if you have any questions, let us help: <a href="http://www.reddit.com/r/haskell" rel="nofollow">http://www.reddit.com/r/haskell</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Carl Smotricz</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7107</link>
		<dc:creator><![CDATA[Carl Smotricz]]></dc:creator>
		<pubDate>Wed, 14 Apr 2010 14:28:52 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7107</guid>
		<description><![CDATA[I&#039;m late to the party but I&#039;d like to contribute anyway.

For a mathematician who isn&#039;t really interested in the ugliness of #include etc., I&#039;d recommend J. It&#039;s an interpreted language and even more terse than mathematical formulaic language. I never cease to be amazed at the breathtakingly short solutions to Project Euler problems that are done in J. Of the first 30 problems or so, many involving stuff like palindromic primes, most had J solutions no more than 2 lines long. One reason why mathematicians like J is that J handles matrices like vectors like scalars with no extra effort, like handcrafted loops.

Yes, the J language complete with development environment is free and available for the Mac.]]></description>
		<content:encoded><![CDATA[<p>I&#8217;m late to the party but I&#8217;d like to contribute anyway.</p>
<p>For a mathematician who isn&#8217;t really interested in the ugliness of #include etc., I&#8217;d recommend J. It&#8217;s an interpreted language and even more terse than mathematical formulaic language. I never cease to be amazed at the breathtakingly short solutions to Project Euler problems that are done in J. Of the first 30 problems or so, many involving stuff like palindromic primes, most had J solutions no more than 2 lines long. One reason why mathematicians like J is that J handles matrices like vectors like scalars with no extra effort, like handcrafted loops.</p>
<p>Yes, the J language complete with development environment is free and available for the Mac.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: antoniocangiano</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7065</link>
		<dc:creator><![CDATA[antoniocangiano]]></dc:creator>
		<pubDate>Tue, 06 Apr 2010 03:22:55 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7065</guid>
		<description><![CDATA[Prof. Gowers, whether you decide to continue your journey with C or (better) Python, I would highly suggest that you check out Project Euler (http://projecteuler.net).

Most of the initial problems can be resolved with rudimentary knowledge of any programming language. I personally love how some of the problems cannot be resolved with a naive, brute force algorithm, but require a certain degree of mathematical insight. As a mathematician, you will no doubt love this site and its exercises.

Another interesting programming language for you to learn at a later stage would be Haskell. You&#039;ll probably love the language for the same reason why mathematically challenged programmers hate it.

For example, consider the following line of Haskell code:

[n &#124; n &lt;- [1..], n `mod` 3 /= 0]

You can probably guess what this does, considering that it&#039;s so close to mathematical notation. The line above represents an infinite list of natural numbers that are not multiples of 3. Thanks to lazy evaluation, we can play with data structures that represents countably infinite sets.

For example, in Haskell I could write:

take 5 [x &#124; x &lt;- [1..], x `mod` 3 /= 0]

And I would obtain the first 5 natural numbers that are not multiples of 3:

[1,2,4,5,7]

This is a simple example, but it should give you a taste of the nice stuff that is possible in Haskell. For the time being, I&#039;d suggest focusing on the essentials though. C or Python will definitely help you build a solid foundation on how to instruct the computer to do the calculations you require it to.

Finally, should you have any programming questions, feel free to drop me a line by email any time, and I will be more than happy to help.]]></description>
		<content:encoded><![CDATA[<p>Prof. Gowers, whether you decide to continue your journey with C or (better) Python, I would highly suggest that you check out Project Euler (<a href="http://projecteuler.net" rel="nofollow">http://projecteuler.net</a>).</p>
<p>Most of the initial problems can be resolved with rudimentary knowledge of any programming language. I personally love how some of the problems cannot be resolved with a naive, brute force algorithm, but require a certain degree of mathematical insight. As a mathematician, you will no doubt love this site and its exercises.</p>
<p>Another interesting programming language for you to learn at a later stage would be Haskell. You&#8217;ll probably love the language for the same reason why mathematically challenged programmers hate it.</p>
<p>For example, consider the following line of Haskell code:</p>
<p>[n | n &lt;- [1..], n `mod` 3 /= 0]</p>
<p>You can probably guess what this does, considering that it&#039;s so close to mathematical notation. The line above represents an infinite list of natural numbers that are not multiples of 3. Thanks to lazy evaluation, we can play with data structures that represents countably infinite sets.</p>
<p>For example, in Haskell I could write:</p>
<p>take 5 [x | x &lt;- [1..], x `mod` 3 /= 0]</p>
<p>And I would obtain the first 5 natural numbers that are not multiples of 3:</p>
<p>[1,2,4,5,7]</p>
<p>This is a simple example, but it should give you a taste of the nice stuff that is possible in Haskell. For the time being, I&#039;d suggest focusing on the essentials though. C or Python will definitely help you build a solid foundation on how to instruct the computer to do the calculations you require it to.</p>
<p>Finally, should you have any programming questions, feel free to drop me a line by email any time, and I will be more than happy to help.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dima</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-7027</link>
		<dc:creator><![CDATA[Dima]]></dc:creator>
		<pubDate>Fri, 02 Apr 2010 04:02:45 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-7027</guid>
		<description><![CDATA[ in 2010 there is very little need to even touch C or C++ for doing scientific computations (unless one does something very special, demanding fast low-level access to (almost) bare-bones computer, like fast arbitrary precision arithmetic).
 
They take perhaps 5 times more time to write and debug an average complexity code, say, something like an algorithm for finding a maximal weight matching in a bipartite graph, resulting in a code that is perhaps 2 to 5 times faster than the one written in, say, Python. OK, so you have to wait for answers a little longer, but you would say much more time in coding/debugging. And there are easy ways to call these special-purpose packages written in C/C++ from Python, should you need one.]]></description>
		<content:encoded><![CDATA[<p> in 2010 there is very little need to even touch C or C++ for doing scientific computations (unless one does something very special, demanding fast low-level access to (almost) bare-bones computer, like fast arbitrary precision arithmetic).</p>
<p>They take perhaps 5 times more time to write and debug an average complexity code, say, something like an algorithm for finding a maximal weight matching in a bipartite graph, resulting in a code that is perhaps 2 to 5 times faster than the one written in, say, Python. OK, so you have to wait for answers a little longer, but you would say much more time in coding/debugging. And there are easy ways to call these special-purpose packages written in C/C++ from Python, should you need one.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jonathanfine</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6957</link>
		<dc:creator><![CDATA[jonathanfine]]></dc:creator>
		<pubDate>Sun, 28 Mar 2010 18:02:55 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6957</guid>
		<description><![CDATA[The best language for a task often depend on what resources are already available to solve the problem at hand.

I had a recent project: compute the flag vectors of all the full dimensional 01-polytopes in dimension 5.  Fortunately, a list of such polytopes (there are over a million of them) has already been computed.

I modifed the C-program that accesses this list (it is binary data) to produce the list in the form I needed.

I used a little bit of Perl so I could use polymake (which can be scripted with Perl) to compute the flage vectors and print out the results.

I used Python (and in particular numpy) so that I could do some calculations on these flag vectors.  I also used Python to glue everything together.

Next, I want to determine the rank of certain quite large sets of flag vectors, but numpy doesn&#039;t provide this.  Nor does it provide arbitrary precision integers.  So I might find myself using pari/gp for that bit.

So, in part, my advice would be to use the language that already has a community doing calculations similar to the ones you want to do.

By the way, it took about 15 Ghz days to compute the flag vectors.  I enjoyed the GRADSTUDENT joke. Even the best use it sometimes.

From Knuth&#039;s &#039;Digital Typography&#039;, p505 &quot;I was time to revise the draft of 13 May [1978] so that research assistants [grad students] Michael Plass and Frank Liang could prepare a prototype implementation [of TeX] while he [Knuth] was away [on a month-long trip].&quot;]]></description>
		<content:encoded><![CDATA[<p>The best language for a task often depend on what resources are already available to solve the problem at hand.</p>
<p>I had a recent project: compute the flag vectors of all the full dimensional 01-polytopes in dimension 5.  Fortunately, a list of such polytopes (there are over a million of them) has already been computed.</p>
<p>I modifed the C-program that accesses this list (it is binary data) to produce the list in the form I needed.</p>
<p>I used a little bit of Perl so I could use polymake (which can be scripted with Perl) to compute the flage vectors and print out the results.</p>
<p>I used Python (and in particular numpy) so that I could do some calculations on these flag vectors.  I also used Python to glue everything together.</p>
<p>Next, I want to determine the rank of certain quite large sets of flag vectors, but numpy doesn&#8217;t provide this.  Nor does it provide arbitrary precision integers.  So I might find myself using pari/gp for that bit.</p>
<p>So, in part, my advice would be to use the language that already has a community doing calculations similar to the ones you want to do.</p>
<p>By the way, it took about 15 Ghz days to compute the flag vectors.  I enjoyed the GRADSTUDENT joke. Even the best use it sometimes.</p>
<p>From Knuth&#8217;s &#8216;Digital Typography&#8217;, p505 &#8220;I was time to revise the draft of 13 May [1978] so that research assistants [grad students] Michael Plass and Frank Liang could prepare a prototype implementation [of TeX] while he [Knuth] was away [on a month-long trip].&#8221;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Radu Grigore</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6891</link>
		<dc:creator><![CDATA[Radu Grigore]]></dc:creator>
		<pubDate>Tue, 23 Mar 2010 17:12:43 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6891</guid>
		<description><![CDATA[Last year I taught a C course for beginner programmers. I wrote then some advice to students. Most of it doesn&#039;t apply to you, but there are bits that &lt;i&gt;might&lt;/i&gt; be useful to you. I copy-pasted them below. This is my third comment in a day on this post so I feel like spamming. I promise it&#039;s the last one. :)

Start by setting up a work environment. It should at the very least allow you to easily compile, run, and test your program. If these three tasks are hard then you do not have a proper working environment.

Your program must compile at all times. If the compiler reports an error, never fix it by randomly changing code in the vicinity of the error. Fixing the code without understanding what was wrong in the first place is worse than not fixing it at all: You missed an opportunity to learn. If you have a big pile of code with &lt;10 errors then it&#039;s like trying to learn how to swim by asking someone to drop you off in the middle of the Atlantic. You won&#039;t learn to swim. Most likely you&#039;ll just die. So don&#039;t do it. Write your program incrementally. Keep it compiling. Run it from time to time and check that it does what you expect. This means that you should think about what you expect before running the program. Any mismatch between what you expected to happen and what happened is an opportunity to learn. Don&#039;t miss it. Try to understand what is happening.

Whenever you have an issue you can&#039;t explain it helps to try to reproduce it on the simplest example. If the issue is a compilation error, then make a copy of your program and then systematically trim down the code in a way that preserves the error. Do this until you get to the smallest possible program that still exhibits the error. That is, there&#039;s nothing more you can trim without making the error go away. By the time you get to this step you probably know what was wrong, you can fix the problem in the small example, test, and then repeat the fix in your big program. If the example is tiny and you still don&#039;t know what&#039;s wrong then ask in the forum (or a demonstrator if you are in the lab).

You should test your program as it grows by running it. Once it approaches what you think is close to a final solution your testing must become more thorough. Do not just run the program, type in the input, and look at the output on the screen. Write all your tests (inputs and outputs) in files so that you can retest easily after you change the program. [The point here was that it should be easy to re-run the tests. There are fancier ways of doing it than just putting the input/output in paired files.]

What to do if the program does not do what you expect? First, do the easy thing: Run the compiler with all warnings turned on (-W -Wall -pedantic) and check if any causes the problem. In any case, get rid of them. Then run your program with valgrind to make sure it&#039;s not the fault of nasal demons. If it is, then try to isolate the problem in the same way as you isolate a compiler error: Trim down a copy of your program.

There are two basic debugging strategies: (1) read the program carefully and (2) trace your program for particular runs. The latter is easier but as you become more experienced you&#039;ll see that the former is much faster for simple bugs. Anyway, how do you trace a particular run of you program? Read the program having in mind a particular input. At each step think what are the values of the variables. If you feel lazy (and that&#039;s often a good thing when you are a programmer; we are after all in the business of automating stuff), then put printf statements that print the values of variables at intermediate points and check when their values diverge from what you expect. Another option is to use a tool like gdb that lets you go step by step thru the program.]]></description>
		<content:encoded><![CDATA[<p>Last year I taught a C course for beginner programmers. I wrote then some advice to students. Most of it doesn&#8217;t apply to you, but there are bits that <i>might</i> be useful to you. I copy-pasted them below. This is my third comment in a day on this post so I feel like spamming. I promise it&#8217;s the last one. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Start by setting up a work environment. It should at the very least allow you to easily compile, run, and test your program. If these three tasks are hard then you do not have a proper working environment.</p>
<p>Your program must compile at all times. If the compiler reports an error, never fix it by randomly changing code in the vicinity of the error. Fixing the code without understanding what was wrong in the first place is worse than not fixing it at all: You missed an opportunity to learn. If you have a big pile of code with &lt;10 errors then it&#8217;s like trying to learn how to swim by asking someone to drop you off in the middle of the Atlantic. You won&#8217;t learn to swim. Most likely you&#8217;ll just die. So don&#8217;t do it. Write your program incrementally. Keep it compiling. Run it from time to time and check that it does what you expect. This means that you should think about what you expect before running the program. Any mismatch between what you expected to happen and what happened is an opportunity to learn. Don&#8217;t miss it. Try to understand what is happening.</p>
<p>Whenever you have an issue you can&#8217;t explain it helps to try to reproduce it on the simplest example. If the issue is a compilation error, then make a copy of your program and then systematically trim down the code in a way that preserves the error. Do this until you get to the smallest possible program that still exhibits the error. That is, there&#8217;s nothing more you can trim without making the error go away. By the time you get to this step you probably know what was wrong, you can fix the problem in the small example, test, and then repeat the fix in your big program. If the example is tiny and you still don&#8217;t know what&#8217;s wrong then ask in the forum (or a demonstrator if you are in the lab).</p>
<p>You should test your program as it grows by running it. Once it approaches what you think is close to a final solution your testing must become more thorough. Do not just run the program, type in the input, and look at the output on the screen. Write all your tests (inputs and outputs) in files so that you can retest easily after you change the program. [The point here was that it should be easy to re-run the tests. There are fancier ways of doing it than just putting the input/output in paired files.]</p>
<p>What to do if the program does not do what you expect? First, do the easy thing: Run the compiler with all warnings turned on (-W -Wall -pedantic) and check if any causes the problem. In any case, get rid of them. Then run your program with valgrind to make sure it&#8217;s not the fault of nasal demons. If it is, then try to isolate the problem in the same way as you isolate a compiler error: Trim down a copy of your program.</p>
<p>There are two basic debugging strategies: (1) read the program carefully and (2) trace your program for particular runs. The latter is easier but as you become more experienced you&#8217;ll see that the former is much faster for simple bugs. Anyway, how do you trace a particular run of you program? Read the program having in mind a particular input. At each step think what are the values of the variables. If you feel lazy (and that&#8217;s often a good thing when you are a programmer; we are after all in the business of automating stuff), then put printf statements that print the values of variables at intermediate points and check when their values diverge from what you expect. Another option is to use a tool like gdb that lets you go step by step thru the program.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Radu Grigore</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6887</link>
		<dc:creator><![CDATA[Radu Grigore]]></dc:creator>
		<pubDate>Tue, 23 Mar 2010 15:48:40 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6887</guid>
		<description><![CDATA[C is good at controlling what the computer does in detail. That&#039;s &lt;i&gt;good&lt;/i&gt;: (1) you can tell the computer exactly what to do and (2) you understand better how the computer works. It&#039;s also &lt;i&gt;bad&lt;/i&gt;: sometimes you have to specify details you really don&#039;t care about.

Binaries aren&#039;t that portable, so I wouldn&#039;t say that&#039;s an advantage of C.]]></description>
		<content:encoded><![CDATA[<p>C is good at controlling what the computer does in detail. That&#8217;s <i>good</i>: (1) you can tell the computer exactly what to do and (2) you understand better how the computer works. It&#8217;s also <i>bad</i>: sometimes you have to specify details you really don&#8217;t care about.</p>
<p>Binaries aren&#8217;t that portable, so I wouldn&#8217;t say that&#8217;s an advantage of C.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Radu Grigore</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6883</link>
		<dc:creator><![CDATA[Radu Grigore]]></dc:creator>
		<pubDate>Tue, 23 Mar 2010 13:00:15 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6883</guid>
		<description><![CDATA[You should get a CS grad student to help with things like figuring out how to do input/output and what stdio.h means. It is much quicker and, since the main barrier is to find the right information, I think you don&#039;t gain much doing it alone. (I think it&#039;s better if you do it yourself, using GRADSTUDENT as a very effective search engine.) I&#039;m sure there must be at least one grad student around who would be &lt;i&gt;happy&lt;/i&gt; to help. (I&#039;d be, but I&#039;m not close.)

My opinion about the programming language to learn: One at a time, and don&#039;t stop. :) It gets quite fast to grok a new language after a time. The slow part is fitting all the available libraries into your head, which you need to do only for the language you prefer and use most often.

&lt;a href=&quot;http://mitpress.mit.edu/sicp/&quot; rel=&quot;nofollow&quot;&gt;SICP&lt;/a&gt; was already mentioned. It&#039;s probably good if you decide to learn some LISP variety. &lt;a href=&quot;http://www.htdp.org/&quot; rel=&quot;nofollow&quot;&gt;HTDP&lt;/a&gt; has a similar style and it&#039;s also using Scheme (a LISP variety). The content is quite simple and every working programmer should be familiar with those concepts.

Having read your brief intro to math, I suspect you&#039;ll like Knuth&#039;s &lt;a href=&quot;http://www-cs-faculty.stanford.edu/~uno/taocp.html&quot; rel=&quot;nofollow&quot;&gt;TAoCP&lt;/a&gt;. For example, Section 1.2.2 describes logarithms in a very similar way you do. One exercise for that section asks for an algorithm that computes b^x for 0&#8804;x&lt;1 that uses only shifting, addition, and subtraction. The main benefit for you would probably be finding (more) connections between what you know (math) and (low-level) programming. TAoCP, however, is not a good place to learn a programming language. So it doesn&#039;t directly address your goal. I just couldn&#039;t resist mentioning it. :)

I agree with timur that solving (preferably easy) problems on &lt;a href=&quot;http://www.topcoder.com/wiki/display/tc/How+To+Compete+in+Algorithm+Competitions&quot; rel=&quot;nofollow&quot;&gt;TopCoder&lt;/a&gt; is a great way to learn C/C++, Java, or C#, especially because you can view countless solutions written by others. The best way to try it to make an account, install the Kawigi plugin for the Arena, and go to practice rooms. (Setting this up is an example of a situation in which a (CS) grad student would be useful.)]]></description>
		<content:encoded><![CDATA[<p>You should get a CS grad student to help with things like figuring out how to do input/output and what stdio.h means. It is much quicker and, since the main barrier is to find the right information, I think you don&#8217;t gain much doing it alone. (I think it&#8217;s better if you do it yourself, using GRADSTUDENT as a very effective search engine.) I&#8217;m sure there must be at least one grad student around who would be <i>happy</i> to help. (I&#8217;d be, but I&#8217;m not close.)</p>
<p>My opinion about the programming language to learn: One at a time, and don&#8217;t stop. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  It gets quite fast to grok a new language after a time. The slow part is fitting all the available libraries into your head, which you need to do only for the language you prefer and use most often.</p>
<p><a href="http://mitpress.mit.edu/sicp/" rel="nofollow">SICP</a> was already mentioned. It&#8217;s probably good if you decide to learn some LISP variety. <a href="http://www.htdp.org/" rel="nofollow">HTDP</a> has a similar style and it&#8217;s also using Scheme (a LISP variety). The content is quite simple and every working programmer should be familiar with those concepts.</p>
<p>Having read your brief intro to math, I suspect you&#8217;ll like Knuth&#8217;s <a href="http://www-cs-faculty.stanford.edu/~uno/taocp.html" rel="nofollow">TAoCP</a>. For example, Section 1.2.2 describes logarithms in a very similar way you do. One exercise for that section asks for an algorithm that computes b^x for 0&le;x&lt;1 that uses only shifting, addition, and subtraction. The main benefit for you would probably be finding (more) connections between what you know (math) and (low-level) programming. TAoCP, however, is not a good place to learn a programming language. So it doesn&#8217;t directly address your goal. I just couldn&#8217;t resist mentioning it. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I agree with timur that solving (preferably easy) problems on <a href="http://www.topcoder.com/wiki/display/tc/How+To+Compete+in+Algorithm+Competitions" rel="nofollow">TopCoder</a> is a great way to learn C/C++, Java, or C#, especially because you can view countless solutions written by others. The best way to try it to make an account, install the Kawigi plugin for the Arena, and go to practice rooms. (Setting this up is an example of a situation in which a (CS) grad student would be useful.)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Américo Tavares</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6881</link>
		<dc:creator><![CDATA[Américo Tavares]]></dc:creator>
		<pubDate>Tue, 23 Mar 2010 11:40:20 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6881</guid>
		<description><![CDATA[I ran the program in IDLE (Integrated Development Environment for Python),

 “IDLE is a basic editor and interpreter environment  (...). Good for beginners, it also serves as clear example code for those wanting to implement a moderately sophisticated, multi-platform GUI application.”]]></description>
		<content:encoded><![CDATA[<p>I ran the program in IDLE (Integrated Development Environment for Python),</p>
<p> “IDLE is a basic editor and interpreter environment  (&#8230;). Good for beginners, it also serves as clear example code for those wanting to implement a moderately sophisticated, multi-platform GUI application.”</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: conformal</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6878</link>
		<dc:creator><![CDATA[conformal]]></dc:creator>
		<pubDate>Tue, 23 Mar 2010 09:20:41 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6878</guid>
		<description><![CDATA[What about an experimental functional logic programming language, based on the Haskell language: magicseries.curry http://www.curry-language.org/ AquaCurry http://danae.uni-muenster.de/~lux/curry/]]></description>
		<content:encoded><![CDATA[<p>What about an experimental functional logic programming language, based on the Haskell language: magicseries.curry <a href="http://www.curry-language.org/" rel="nofollow">http://www.curry-language.org/</a> AquaCurry <a href="http://danae.uni-muenster.de/~lux/curry/" rel="nofollow">http://danae.uni-muenster.de/~lux/curry/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Hans Lundmark</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6877</link>
		<dc:creator><![CDATA[Hans Lundmark]]></dc:creator>
		<pubDate>Tue, 23 Mar 2010 08:25:00 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6877</guid>
		<description><![CDATA[I&#039;d say start with Python, since it&#039;s convenient, popular and relatively simple. As you already seem to have noticed, you will be able to get started very quickly with Python.

Later on, you might want to have a look at Haskell. I recently spent quite a lot of time getting acquainted with it, which I certainly don&#039;t regret. I think it&#039;s not an exaggeration to say that learning Haskell will change the way you think about programming.
It encourages a way of thinking which should appeal to most mathematicians: a very high level of abstraction, strong emphasis on functions in the mathematical sense (with clearly defined domain and codomain and no side effects), higher-order functions that take other functions as arguments, building new functions by composing old ones without necessarily naming the arguments (like saying f=g \circ h instead of f(x)=g(h(x))), and so on. Like Python, Haskell can be run in interactive mode, so that you can experiment at the command line.]]></description>
		<content:encoded><![CDATA[<p>I&#8217;d say start with Python, since it&#8217;s convenient, popular and relatively simple. As you already seem to have noticed, you will be able to get started very quickly with Python.</p>
<p>Later on, you might want to have a look at Haskell. I recently spent quite a lot of time getting acquainted with it, which I certainly don&#8217;t regret. I think it&#8217;s not an exaggeration to say that learning Haskell will change the way you think about programming.<br />
It encourages a way of thinking which should appeal to most mathematicians: a very high level of abstraction, strong emphasis on functions in the mathematical sense (with clearly defined domain and codomain and no side effects), higher-order functions that take other functions as arguments, building new functions by composing old ones without necessarily naming the arguments (like saying f=g \circ h instead of f(x)=g(h(x))), and so on. Like Python, Haskell can be run in interactive mode, so that you can experiment at the command line.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: conformal</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6875</link>
		<dc:creator><![CDATA[conformal]]></dc:creator>
		<pubDate>Tue, 23 Mar 2010 07:51:44 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6875</guid>
		<description><![CDATA[Showdown; identical algorithm, C versus C++: The 3% difference in C++&#039;s favour was a surprise - it was a consistent, although small win over all the runs. http://unthought.net/c++/c_vs_c++.html]]></description>
		<content:encoded><![CDATA[<p>Showdown; identical algorithm, C versus C++: The 3% difference in C++&#8217;s favour was a surprise &#8211; it was a consistent, although small win over all the runs. <a href="http://unthought.net/c++/c_vs_c++.html" rel="nofollow">http://unthought.net/c++/c_vs_c++.html</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Anonymous</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6873</link>
		<dc:creator><![CDATA[Anonymous]]></dc:creator>
		<pubDate>Tue, 23 Mar 2010 06:03:10 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6873</guid>
		<description><![CDATA[I agree with : &quot;Picking something and learning it reasonably well seems like a good strategy&quot;

You can invest a lot of time learning a language and there is always a feeling that maybe your efforts could have been directed toward more positive ends.

If you choose to learn C, there probably isn&#039;t a better book than Kernigan and Ritchie&#039;s  &quot;the C programming language&quot; - a very clean and concise description of the language which doesn&#039;t take very long to read.

As others have pointed out, there is a wealth of highly optimised numerics code written in C (diagonalization of matrices, etc.) that is freely available from the gnu software project (along with bound volumes of the documentation for a small charge).

A working knowledge of C also makes it easier to learn C++ which is a far more flexible language.
However, C++ is also a much larger investment in time. For myself, it took me a few years before I started to get my head around the language (where I didn&#039;t always wonder if there might be some far better way to write my particular bit of code).

To learn C++, there are two excellent books written by the creator of C++ (B. Stroustrup). The books are thick but don&#039;t be put off by this - the author devotes quite a lot of space to explaining how the language works, and provides you with many different examples of how to write the same piece of code (which you will appreciate later).

Finally, you may hear somewhere down the road that C++ is an inherently &#039;slower&#039; language than C or Fortran. I don&#039;t think this has been borne out over time, and if I had to learn C++ all over again, I would have liked it if someone had suggested to me the eye opening little book by Bulka and Mayhew (&quot;Efficient C++: performance programming techniques&quot;).

As far as graphics go, a lot of people seem to be using the ace graphics program (I think it&#039;s called &#039;xmgrace&#039;) which is also free, and practically self explanatory (I have the mac version). The gnu project distributes a simpler graphics program called gnuplot.]]></description>
		<content:encoded><![CDATA[<p>I agree with : &#8220;Picking something and learning it reasonably well seems like a good strategy&#8221;</p>
<p>You can invest a lot of time learning a language and there is always a feeling that maybe your efforts could have been directed toward more positive ends.</p>
<p>If you choose to learn C, there probably isn&#8217;t a better book than Kernigan and Ritchie&#8217;s  &#8220;the C programming language&#8221; &#8211; a very clean and concise description of the language which doesn&#8217;t take very long to read.</p>
<p>As others have pointed out, there is a wealth of highly optimised numerics code written in C (diagonalization of matrices, etc.) that is freely available from the gnu software project (along with bound volumes of the documentation for a small charge).</p>
<p>A working knowledge of C also makes it easier to learn C++ which is a far more flexible language.<br />
However, C++ is also a much larger investment in time. For myself, it took me a few years before I started to get my head around the language (where I didn&#8217;t always wonder if there might be some far better way to write my particular bit of code).</p>
<p>To learn C++, there are two excellent books written by the creator of C++ (B. Stroustrup). The books are thick but don&#8217;t be put off by this &#8211; the author devotes quite a lot of space to explaining how the language works, and provides you with many different examples of how to write the same piece of code (which you will appreciate later).</p>
<p>Finally, you may hear somewhere down the road that C++ is an inherently &#8216;slower&#8217; language than C or Fortran. I don&#8217;t think this has been borne out over time, and if I had to learn C++ all over again, I would have liked it if someone had suggested to me the eye opening little book by Bulka and Mayhew (&#8220;Efficient C++: performance programming techniques&#8221;).</p>
<p>As far as graphics go, a lot of people seem to be using the ace graphics program (I think it&#8217;s called &#8216;xmgrace&#8217;) which is also free, and practically self explanatory (I have the mac version). The gnu project distributes a simpler graphics program called gnuplot.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Steve Witham</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6871</link>
		<dc:creator><![CDATA[Steve Witham]]></dc:creator>
		<pubDate>Tue, 23 Mar 2010 05:00:52 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6871</guid>
		<description><![CDATA[Aside from being great, Python is BASIC-like in the ways you mention:

&gt; print 2010 - 1987, &quot;skidoo&quot;
23 skidoo

Read Guido&#039;s tutorial:  http://docs.python.org/tutorial/
As language tutorials go, it&#039;s really clear, and quick if you skim the parts you don&#039;t currently care about (e.g. don&#039;t worry about your PATH, just type python).

On the Mac, the easiest way to get gcc, emacs, make, man pages, and all the stuff Unix people are used to is to install XCode and then ignore XCode, 

But the Apple emacs only runs black and white in your Terminal window with no mouse cursor; I recommend Aquamacs, http://aquamacs.org/
Put it in your dock and you can drop files on it to edit them, with the right settings they come up in tabs.  Did you know Firefox uses emacs key bindings?

Two stupid but essential Mac command line tricks: 

1) in Terminal, type:   open .    (period meaning current directory)
The current directory opens as a Finder window.

2) with both a Terminal window and a Finder window open,
Type cd in the terminal, 
drag the little icon from the top of the finder window over to the terminal, 
it pastes in the path of that folder, 
hit return, you&#039;re there.]]></description>
		<content:encoded><![CDATA[<p>Aside from being great, Python is BASIC-like in the ways you mention:</p>
<p>&gt; print 2010 &#8211; 1987, &#8220;skidoo&#8221;<br />
23 skidoo</p>
<p>Read Guido&#8217;s tutorial:  <a href="http://docs.python.org/tutorial/" rel="nofollow">http://docs.python.org/tutorial/</a><br />
As language tutorials go, it&#8217;s really clear, and quick if you skim the parts you don&#8217;t currently care about (e.g. don&#8217;t worry about your PATH, just type python).</p>
<p>On the Mac, the easiest way to get gcc, emacs, make, man pages, and all the stuff Unix people are used to is to install XCode and then ignore XCode, </p>
<p>But the Apple emacs only runs black and white in your Terminal window with no mouse cursor; I recommend Aquamacs, <a href="http://aquamacs.org/" rel="nofollow">http://aquamacs.org/</a><br />
Put it in your dock and you can drop files on it to edit them, with the right settings they come up in tabs.  Did you know Firefox uses emacs key bindings?</p>
<p>Two stupid but essential Mac command line tricks: </p>
<p>1) in Terminal, type:   open .    (period meaning current directory)<br />
The current directory opens as a Finder window.</p>
<p>2) with both a Terminal window and a Finder window open,<br />
Type cd in the terminal,<br />
drag the little icon from the top of the finder window over to the terminal,<br />
it pastes in the path of that folder,<br />
hit return, you&#8217;re there.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Toby Gee</title>
		<link>http://gowers.wordpress.com/2010/03/20/hello-world-2/#comment-6866</link>
		<dc:creator><![CDATA[Toby Gee]]></dc:creator>
		<pubDate>Mon, 22 Mar 2010 12:03:08 +0000</pubDate>
		<guid isPermaLink="false">http://gowers.wordpress.com/?p=1581#comment-6866</guid>
		<description><![CDATA[I&#039;m certainly in no position to make recommendations (I&#039;m in a similar position to you), but Python/SAGE does seem like the &quot;obvious&quot; answer, for the reasons mentioned above.

That said, the only programming I&#039;ve done in the last 20 years or so was to work through (almost) all of this book (SICP): 

http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&amp;tid=3305

which I really can&#039;t recommend enough. It is genuinely one of the best books of any kind that I&#039;ve ever read, and I think that all mathematicians would enjoy it enormously.]]></description>
		<content:encoded><![CDATA[<p>I&#8217;m certainly in no position to make recommendations (I&#8217;m in a similar position to you), but Python/SAGE does seem like the &#8220;obvious&#8221; answer, for the reasons mentioned above.</p>
<p>That said, the only programming I&#8217;ve done in the last 20 years or so was to work through (almost) all of this book (SICP): </p>
<p><a href="http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&#038;tid=3305" rel="nofollow">http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&#038;tid=3305</a></p>
<p>which I really can&#8217;t recommend enough. It is genuinely one of the best books of any kind that I&#8217;ve ever read, and I think that all mathematicians would enjoy it enormously.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
