<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.atalasoft.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Rick Minerich's Development Wonderland : reflection</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reflection/default.aspx</link><description>Tags: reflection</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>F# Discoveries This Week 08/27/2010</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx</link><pubDate>Sat, 28 Aug 2010 00:04:06 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:20986</guid><dc:creator>RickM</dc:creator><slash:comments>1</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/20986.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=20986</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=20986</wfw:comment><description>&lt;p&gt;I’m back again with another edition of F# Discoveries this Week.&amp;#160; The most exciting announcement this week is the new F# August 2010 CTP which brings with it the ability to build your own VS2010 F# Express Edition with Visual Studio Shell and the prospect of building F# applications on Windows Phone 7.&amp;#160; Be sure to check out Daniel Mohl’s Windows Phone 7 template before getting started.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1 align="center"&gt;News and Upcoming Talks&lt;/h1&gt;  &lt;h3&gt;&lt;a href="http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!2135.entry"&gt;F# (August 2010 CTP)&lt;/a&gt;&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://blogs.msdn.com/b/dsyme/archive/2010/08/17/announcing-the-f-2-0-free-tools-for-net-4-0.aspx"&gt;Announcing the F# 2.0 Standalone Tools Update&lt;/a&gt;&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://blogs.msdn.com/b/dsyme/archive/2010/08/17/a-standing-invitation-to-f-users-to-quot-get-in-touch-quot.aspx"&gt;A standing invitation to F# users to &amp;quot;get in touch&amp;quot;&lt;/a&gt;&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://fsharpnews.blogspot.com/2010/08/don-syme-lecturing-at-functional.html"&gt;Don Syme lecturing at the F#unctional Londoners Meetup (9/9)&lt;/a&gt; &lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1 align="center"&gt;Tools and Libraries&lt;/h1&gt;  &lt;p&gt;&lt;a href="http://fdatamining.blogspot.com/2010/08/wekasharp-f-wrapper-for-weka.html"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://fdatamining.blogspot.com/2010/08/wekasharp-f-wrapper-for-weka.html"&gt;WekaSharp: An F# wrapper for Weka&lt;/a&gt; (Yin Zhu)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/52928c6e-f77f-4ebd-a2f9-9815111bfa33"&gt;F# and C# Win Phone List Template (Silverlight)&lt;/a&gt; (Daniel Mohl)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://fsai.codeplex.com/releases/view/51337&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i1:lt:e0:p0:t1282930270:&amp;amp;cd=eti_CaoC4lg&amp;amp;usg=AFQjCNFE4CEYJxUJWQ3cDzIZJ6SMG8WhhQ"&gt;fsai Release &lt;b&gt;FSharp&lt;/b&gt; AI library 1.10.0&lt;/a&gt; (Lukáš Kouřil)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://feedproxy.google.com/~r/typepad/walmsleyk/through_the_interface/~3/UvCysIY6dYA/rockscroll-my-new-favourite-visual-studio-add-in.html"&gt;RockScroll: my new favourite Visual Studio Add-In&lt;/a&gt; (Kean Walmsley)&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1 align="center"&gt;Video, Audio and Slides&lt;/h1&gt;  &lt;h3&gt;&lt;a href="http://www.sturmnet.org/blog/2010/08/24/slides-and-samples-from-f-talk-in-manche"&gt;Slides and samples from F# talk in Manchester&lt;/a&gt; (Oliver Sturm)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.trelford.com/blog/post.aspx?id=aead0ae1-9be2-4a67-9b8b-8516ace8bd2e"&gt;F# Intro Talk at NextGenUG in So’ton&lt;/a&gt; (Phillip Trelford)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://strangelights.com/blog/archive/2010/08/15/slides-from.aspx"&gt;Slides from Combinators, DSLs, HTML, and F#&lt;/a&gt; (Robert Pickering)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.inetachamps.com/Live/Presentation/ViewVideo/119"&gt;Busy .NET Developer’s Guide to F#: Basics&lt;/a&gt; (Ted Neward)&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1 align="center"&gt;Technical Articles &lt;/h1&gt;  &lt;h3&gt;&lt;a href="http://blog.ctaggart.com/2010/08/itunes-via-f-interactive.html"&gt;iTunes via F# Interactive&lt;/a&gt; (Cameron Taggart)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!2144.entry"&gt;F# for puzzles (Morse code decoder)&lt;/a&gt; (Brian McNamara)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://langexplr.blogspot.com/2010/08/extracting-elements-from-win32-resource.html"&gt;Extracting elements from Win32 resource files&lt;/a&gt; (Luis Diego Fallas)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://blogs.msdn.com/b/dsyme/archive/2010/08/16/a-variation-on-matt-moloney-s-undo-redo-quot-memento-quot-pattern.aspx&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1281985290:&amp;amp;cd=3GxHEKpf1t0&amp;amp;usg=AFQjCNEKd2idQhny1fNIgHlmfdPez_kHFA"&gt;A variation on Matt Moloney's &amp;quot;Memento&amp;quot; pattern&lt;/a&gt;&lt;b&gt;&lt;/b&gt; (Don Syme)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://techneilogy.blogspot.com/2010/08/bound-variables-in-f-what-reflection.html"&gt;Bound Variables in F#: What Reflection Reveals&lt;/a&gt; (Neil Carrier)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.ademiller.com/blogs/tech/2010/08/getting-f-running-on-a-continuous-integration-server/"&gt;Getting F# Running on a Continuous Integration Server&lt;/a&gt; (Ade Miller)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://softwareobjects.net/technology/other/how-fs-async-really-works/&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1282477894:&amp;amp;cd=k9CaH95wgpM&amp;amp;usg=AFQjCNE5hHs-c_JhaGAhddvysqJEh-kjRA"&gt;How F#'s async really works?&lt;/a&gt;&lt;b&gt;&lt;/b&gt; (George Cullen)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://techneilogy.blogspot.com/2010/08/segment-tree-in-f.html"&gt;Segment Tree in F#&lt;/a&gt;&lt;b&gt;&lt;/b&gt; (Neil Carrier)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://techneilogy.blogspot.com/2010/08/bound-variables-in-f-what-reflection.html"&gt;Bound Variables in F#: What Reflection Reveals&lt;/a&gt; (Neil Carrier)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://techneilogy.blogspot.com/2010/08/fuzzy-logic-experiments-in-f.html"&gt;Fuzzy Logic Experiments in F#&lt;/a&gt; (Neil Carrier)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://techneilogy.blogspot.com/2010/08/fuzzy-logic-in-f-example-1.html"&gt;Fuzzy Logic in F#, Example 1&lt;/a&gt; (Neil Carrier)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://techneilogy.blogspot.com/2010/08/fuzzy-logic-in-f-now-more-functional.html"&gt;Fuzzy Logic in F#, Now More Functional!&lt;/a&gt; (Neil Carrier)&lt;/h3&gt;  &lt;h3&gt;&lt;b&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://fadsworld.wordpress.com/2010/08/25/f-fun-with-windows-phone-7/&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1282782072:&amp;amp;cd=XJ2ShkoVq68&amp;amp;usg=AFQjCNEVAt95lQVSqeKm0dXE8akP53iHFA"&gt;F# “fun” with Windows Phone 7&lt;/a&gt;&lt;/b&gt; (Fahad)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://www.ginktage.com/2010/08/getting-started-with-windows-phone-development-in-f/&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1282782072:&amp;amp;cd=XJ2ShkoVq68&amp;amp;usg=AFQjCNFkiiIJ8A2z_FqyO80eFhZDFH3t6Q"&gt;Getting started with Windows Phone in F#&lt;/a&gt;&lt;b&gt;&lt;/b&gt; (Senthil Kumar)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://geekswithblogs.net/MarkPearl/archive/2010/08/10/f-ndash-euler-problem-10.aspx&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1281458885:&amp;amp;cd=77K9bIUXzKc&amp;amp;usg=AFQjCNGYPsaDckXurAteHIDLK3HWbPTgsg"&gt;Euler Problem 10&lt;/a&gt; (Mark Pearl)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://geekswithblogs.net/MarkPearl/archive/2010/08/19/f-euler-problem-16.aspx&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1282272232:&amp;amp;cd=iOkk_mPI5OU&amp;amp;usg=AFQjCNF2R_3U79eEDh20M9sCdzx8OTlFwQ"&gt;Euler Problem 16&lt;/a&gt; (Mark Pearl)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://stefanoricciardi.com/2010/08/25/project-euler-problem-9-in-f/&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1282782072:&amp;amp;cd=XJ2ShkoVq68&amp;amp;usg=AFQjCNFTZJd0PBQ7zDbA5ChBQvwh4sHQaA"&gt;Project Euler Problem 9 in F#&lt;/a&gt; (Stefano Ricciardi)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://stefanoricciardi.com/2010/08/17/project-euler-problem-8-in-f/&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1282093587:&amp;amp;cd=4z9k6saNi7w&amp;amp;usg=AFQjCNGx1unUptRzK4gbwfDu0QIHY2TlTQ"&gt;Project Euler Problem 8 in F#&lt;/a&gt; (Stefano Ricciardi)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://stefanoricciardi.com/2010/08/16/project-euler-problem-6-and-7-in-f/&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1281985290:&amp;amp;cd=3GxHEKpf1t0&amp;amp;usg=AFQjCNGChfVG9VJJM1rEr-nmTW3PPpivxA"&gt;Project Euler Problem 6 and 7 in F#&lt;/a&gt; (Stefano Ricciardi)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://bugsquash.blogspot.com/2010/08/enumerableskip-vs-seqskip.html"&gt;Enumerable.Skip vs Seq.skip&lt;/a&gt; (Mauricio Scheffer)&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1 align="center"&gt;Getting Started and Evangelism Articles&lt;/h1&gt;  &lt;h3&gt;&lt;a href="http://www.whattofix.com/blog/archives/2010/08/putting-the-fun.php"&gt;Putting the fun in functional programming&lt;/a&gt; (Daniel Markham)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://weblogs.asp.net/mehfuzh/archive/2010/08/13/back-to-school-getting-to-know-f.aspx&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1281725004:&amp;amp;cd=nWaDOrnHOkg&amp;amp;usg=AFQjCNEt4SFUTNN2qHc898t8hQw9TMZaLg"&gt;Back to school : Getting to know F#&lt;/a&gt; (Mehfuz Hossain)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://blog.goblinfactory.co.uk/archive/2010/08/22/learning-f-by-writing-c.aspx&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1282511650:&amp;amp;cd=rHNkQ7SbUSo&amp;amp;usg=AFQjCNF7jUd2cMmvStSryTOU7ARVIc_5dQ"&gt;Learning &lt;b&gt;F#&lt;/b&gt; by writing C#&lt;/a&gt; (Alan Hemmings)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://geekswithblogs.net/JoshReuben/archive/2010/08/25/f---sharper-than-c.aspx&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1282782072:&amp;amp;cd=XJ2ShkoVq68&amp;amp;usg=AFQjCNFlk5Pxb8TN4YVtIJapTEywbtotBA"&gt;&lt;b&gt;F#&lt;/b&gt; - sharper than C#&lt;/a&gt; (Josh Reuben)&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://www.dotnetconvo.com/post/view/2010/8/20/learning-f-for-c-developers&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i1:lt:e0:p0:t1282587993:&amp;amp;cd=iP9qcob4U6w&amp;amp;usg=AFQjCNFDcRBEP_8LeeTOVfwtLMl0apMk3Q"&gt;Learning F# for C# developers&lt;/a&gt; (Bill Morrissey)&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1 align="center"&gt;F# Community&lt;/h1&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://arstechnica.com/civis/viewtopic.php%3Ff%3D20%26t%3D1120310&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i1:lt:e0:p0:t1282806817:&amp;amp;cd=_I4tOE61sI8&amp;amp;usg=AFQjCNHpTr1EpLmR4n30m6hOCqbkAdSVjw"&gt;Ars Technica - What do you think of F# ?&lt;/a&gt; &lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://stackoverflow.com/questions/3484315/how-to-merge-sorted-sequences-in-f&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i1:lt:e0:p0:t1281845656:&amp;amp;cd=flQlhVWmQLE&amp;amp;usg=AFQjCNEbMY53___uEv5A5iCUSMcI0TDRTA"&gt;SO - How to merge sorted sequences in F#.&lt;/a&gt; &lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://stackoverflow.com/questions/3544036/which-to-use-c-or-f-in-this-real-world-case&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i2:lt:e0:p0:t1282544745:&amp;amp;cd=lj7VIHepRJM&amp;amp;usg=AFQjCNEdMuc-OKFR--h8n7QPnFZ8iQP5GA"&gt;SO - Which to use, C# or F#? In this &amp;quot;real world&amp;quot; case&lt;/a&gt; &lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://www.google.com/url?sa=X&amp;amp;q=http://cs.hubfs.net/forums/thread/16387.aspx&amp;amp;ct=ga&amp;amp;cad=:s7:f1:v0:d2:i1:lt:e0:p0:t1282400235:&amp;amp;cd=9vIGwKe_esA&amp;amp;usg=AFQjCNG_8qM4_ZdJz-obcLL0IyBncv2hZg"&gt;hubFS: F# Databse Application Samples &amp;amp; Articles&lt;/a&gt; &lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://cs.hubfs.net/forums/thread/16425.aspx"&gt;hubFS: MailboxProcessor.TryScan paradigm&lt;/a&gt;&lt;/h3&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx&amp;amp;;subject=F%23+Discoveries+This+Week+08%2f27%2f2010" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx&amp;amp;;title=F%23+Discoveries+This+Week+08%2f27%2f2010" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx&amp;amp;title=F%23+Discoveries+This+Week+08%2f27%2f2010" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx&amp;amp;;title=F%23+Discoveries+This+Week+08%2f27%2f2010" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx&amp;amp;;title=F%23+Discoveries+This+Week+08%2f27%2f2010&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2010/08/27/f-discoveries-this-week-08-27-2010.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=20986" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reflection/default.aspx">reflection</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/roundup/default.aspx">roundup</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/async/default.aspx">async</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Euler/default.aspx">Euler</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/puzzles/default.aspx">puzzles</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Memento/default.aspx">Memento</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/FSAI/default.aspx">FSAI</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/iTunes/default.aspx">iTunes</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Win32+Resource/default.aspx">Win32 Resource</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Weka/default.aspx">Weka</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/CI/default.aspx">CI</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Fuzzy+Logic/default.aspx">Fuzzy Logic</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/August+2010+CTP/default.aspx">August 2010 CTP</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Windows+Phone/default.aspx">Windows Phone</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/WP7/default.aspx">WP7</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/RockScroll/default.aspx">RockScroll</category></item><item><title>Discoveries This Week 05/01/2009</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx</link><pubDate>Sun, 03 May 2009 22:58:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18414</guid><dc:creator>RickM</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/18414.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=18414</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=18414</wfw:comment><description>&lt;p&gt;A few weeks off left me with renewed vigor.&amp;nbsp; This week we have some very interesting posts on reflective and reactive programming, enhancing F# by adding additional operators, IL analysis via simulation and finally, observations on the productization of F#.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://www.langnetsymposium.com/2009/talks/25-LukeHoban-FSharpProductization.html"&gt;Luke Hoban’s Lang.NET presentation on the productization of F#&lt;/a&gt;&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;A set of interesting observations from our experience taking F# over the last 18 months or so […] from a relatively mature research project […] into something that’s going to be a part of the next version of visual studio.&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I’ve just begun to watch the Lang.NET videos.&amp;nbsp; While I haven’t had a chance to watch them yet, I’ve heard from others in the community that Amanda Laucher, Jason Olson and Tomas Petricek all had &lt;a href="http://www.langnetsymposium.com/2009/talks.aspx"&gt;fantastic presentations&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://www.russiantequila.com/wordpress/?p=51"&gt;Alex P’s Thoughts on reflective programming with F#&lt;/a&gt;&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;Let's take a different approach. I'm going to bring back a piece of functionality i talked about in earlier articles - quotations, and using quotations to determine function signatures.&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The most interesting idea from this post was that of stacking discriminated unions to attach meta information to parameters.&amp;nbsp; This meta information then can be used when reflecting to determine the scope of parameter inputs. &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://mixedsyntax.wordpress.com/2009/04/28/adding-ruby-and-c-operators-to-f/"&gt;Jason Kikel on Adding Ruby and C# Operators to F#&lt;/a&gt;&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;Ruby (and in many ways Perl) has a bunch of really succinct, elegant operators that contribute to the satisfaction of using the language.&lt;/i&gt; […]&lt;i&gt; Since F# doesn’t implement many of my favorite Ruby operators, we’ll put together some implementations here.&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Quite a few useful set operators are defined in this post.&amp;nbsp; Many I feel should be included in the language.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://www.voyce.com/index.php/2009/04/24/il-analysis-using-fsharp/"&gt;Ian Voyce on IL analysis using F#&lt;/a&gt;&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;I recently needed to determine which functions were called by some of our F# code. Naively, you can use existing tools like ildasm, to disassemble a .NET DLL and then search the resulting IL source code for references. The obvious problem here though, is that you’re going to include all references whether or not they’re actually called.&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I found Ian’s method of using discriminated unions to represent IL very clever.&amp;nbsp; Also, the possibilities in directly using the AbstractIL API seem interesting.&amp;nbsp; I may have to explore this myself.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;J-C on Functional Reactive Programming in F# Parts &lt;a href="http://call-with-cc-en.blogspot.com/2008/12/functional-reactive-programming-in-f-1.html"&gt;1&lt;/a&gt;, &lt;a href="http://call-with-cc-en.blogspot.com/2009/02/functional-reactive-programming-in-f-2.html"&gt;2&lt;/a&gt; and &lt;a href="http://call-with-cc-en.blogspot.com/2009/03/functional-reactive-programming-in-f-3_18.html"&gt;3&lt;/a&gt;&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;A functional, reactive program is a program written in a functional language (where side effects are inexistent&lt;/i&gt; (sic)&lt;i&gt; or at least limited to a minimum) and producing results that depend on time, in a continuous manner on one hand and on discrete events on the other hand.&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I had not heard of Functional Reactive Programming previously.&amp;nbsp; It seems particularly useful for time sensitive domains such as robotics or game AI. &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;I apologize for the fact that I’ve disabled anonymous comments.&amp;nbsp; Given the amount of spam I was receiving I had no choice.&amp;nbsp; If you would like to leave a comment, or think you might in the future, I encourage you to take the one time step of &lt;a href="http://www.atalasoft.com/cs/user/CreateUser.aspx?ReturnUrl=/cs/blogs/RickM"&gt;creating an account&lt;/a&gt;.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx&amp;amp;;subject=Discoveries+This+Week+05%2f01%2f2009" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx&amp;amp;;title=Discoveries+This+Week+05%2f01%2f2009" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx&amp;amp;title=Discoveries+This+Week+05%2f01%2f2009" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx&amp;amp;;title=Discoveries+This+Week+05%2f01%2f2009" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx&amp;amp;;title=Discoveries+This+Week+05%2f01%2f2009&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/05/03/discoveries-this-week-05-01-2009.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18414" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/IL/default.aspx">IL</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reflection/default.aspx">reflection</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/roundup/default.aspx">roundup</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reflective/default.aspx">reflective</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reactive/default.aspx">reactive</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/productization/default.aspx">productization</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/frp/default.aspx">frp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/simulation/default.aspx">simulation</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/operators/default.aspx">operators</category></item><item><title>How to determine which language(s) were used to build a .NET assembly</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx</link><pubDate>Thu, 26 Feb 2009 11:00:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:17547</guid><dc:creator>RickM</dc:creator><slash:comments>6</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/17547.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=17547</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=17547</wfw:comment><description>&lt;p&gt;While in most cases there is no explicit information in an assembly as to which languages it was compiled from, it is possible to make an educated guess as to which languages were used.&amp;#160; This is due to the fact that each different .NET compiler leaves it’s own unique type of fingerprint.&amp;#160; In this article I discuss both my methodology for finding these fingerprints and which were unique to each language I used.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Methodology&lt;/h3&gt;  &lt;p&gt;For each language I made a new class library project.&amp;#160; I then reflected and compared each assembly to determine which unique characteristics it had.&amp;#160; It turned out that, at least for C#, F#, VB and C++, each was uniquely identifiable by the existence, or lack thereof, of certain features. &lt;/p&gt;  &lt;p&gt;So to break it down a bit.&lt;/p&gt;  &lt;p&gt;In each project I added one class and one public method in each of those classes:&lt;/p&gt;  &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:480px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  1: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CSharpClass
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  2: {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  3:     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; LocalMethod() {}
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  4: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;After compiling each of these projects into it’s own assembly, I referenced them from another testing project.&amp;#160; To grab a set of features for each language, I used the following three reflection calls:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes(VS.80).aspx"&gt;Assembly.GetTypes()&lt;/a&gt;

    &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hk0t7cax(VS.80).aspx"&gt;Assembly.GetCustomAttirbutes()&lt;/a&gt;

    &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hfkct7ct(VS.80).aspx"&gt;Module.GetFields( BindingFlags.NonPublic | BindingFlags.Static )&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then, with a simple program, I found which of these features were unique for each language.&amp;#160; This set of unique features ultimately represents a map of the imprint each compiler leaves.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;F#&lt;/h3&gt;

&lt;p&gt;A compiled F# library will only have one attribute by default:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This made it the easiest to differentiate of all the languages I tested.&amp;#160; Even more interesting, this attribute contains three fields which specify the specific version of the F# compiler used to generate the assembly:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Major&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160; int
    &lt;br /&gt;Minor&amp;#160;&amp;#160;&amp;#160; 9&amp;#160;&amp;#160;&amp;#160; int

    &lt;br /&gt;Release&amp;#160;&amp;#160;&amp;#160; 6&amp;#160;&amp;#160;&amp;#160; int &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m always impressed with how the F# team consistently goes above and beyond when it comes to the small details.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Visual Basic&lt;/h3&gt;

&lt;p&gt;The Visual Basic assembly I generated was also easily identifiable via extra types which were automatically added:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;My.MyApplication
    &lt;br /&gt;My.MyComputer

    &lt;br /&gt;My.MyProject

    &lt;br /&gt;My.MyProject+MyWebServices

    &lt;br /&gt;My.MyProject+ThreadSafeObjectProvider`1

    &lt;br /&gt;My.Resources.Resource

    &lt;br /&gt;My.MySettings

    &lt;br /&gt;My.MySettingsProperty&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you can see from this list, the existence of these types in the “My” namespace is a fairly safe indicator that the Visual Basic language was used.&amp;#160; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;C++ CLI / Managed C++&lt;/h3&gt;

&lt;p&gt;C++/CLI and Managed C++ are considered to be the same language with slightly different syntax as they share the same compiler.&amp;#160; However, there are four different compilation modes for C++ and each has somewhat different results.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;/CLR – Common Language Runtime Support&lt;/li&gt;

  &lt;li&gt;/CLR:pure – Pure Common Language Runtime Support&lt;/li&gt;

  &lt;li&gt;/CLR:safe – Safe Common Language Runtime Support&lt;/li&gt;

  &lt;li&gt;/CLR:OldSyntax – Managed C++ Syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;/CLR&lt;/strong&gt;, &lt;strong&gt;/CLR:pure&lt;/strong&gt; and &lt;strong&gt;/CLR:OldSyntax&lt;/strong&gt; settings provide easy to classify assemblies, as they all inject an enormous number of types (70+) into the assembly.&amp;#160; I verified that contained two types from the vc_attributes namespace:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;vc_attributes.YesNoMaybe
    &lt;br /&gt;vc_attributes.AccessType&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, &lt;strong&gt;/CLR:Safe&lt;/strong&gt; is much different in that it injects no types and adds no assembly attributes by default.&amp;#160; The generated assembly was almost completely clean.&amp;#160; I was forced to use Reflector to determine how to differentiate this from C#.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;C#&lt;/h3&gt;

&lt;p&gt;C# was one the most difficult to identify assembly type.&amp;#160; This is due to the fact that it has no unique types and only one unique attribute:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;System.Reflection.AssemblyConfigurationAttribute&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, this attribute is defined in the AssemblyInfo.cs file and so we can’t depend on it.&amp;#160; Up to this point it was only necessary to use two reflection calls:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes(VS.80).aspx"&gt;Assembly.GetTypes()&lt;/a&gt;

    &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hk0t7cax(VS.80).aspx"&gt;Assembly.GetCustomAttirbutes()&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was hoping to keep things very simple.&amp;#160; However, to differentance these two languages it’s necessary to go a bit further.&amp;#160; It turns out that C++ always injects an module level field into the assembly while C# does not.&amp;#160; And so by using:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hfkct7ct(VS.80).aspx"&gt;Module.GetFields(BindingFlags.NonPublic | BindingFlags.Static)&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We can check for the existence of this kind of field and so differentiate these two types.&amp;#160; &lt;/p&gt;

&lt;p&gt;After some investigation with reflector, I was able to find one particular feature unique to C#.&amp;#160; Unfortunately, it requires disassembling functions and looking at the resulting IL.&amp;#160; It seems as though a function definition&lt;strong&gt; never has a .maxstack of less than 8&lt;/strong&gt;.&amp;#160; In all other languages I observed .maxstack had been set to values as low as 0 when defined in an empty function.&amp;#160; &lt;/p&gt;

&lt;p&gt;However, as I am only currently concerned with these four languages, my testing on this matter has been very shallow and so pleae take it with a grain of salt.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;I admit that my sample Assembly set was very small and my feature set very large.&amp;#160; However, while this type of classification may not be robust enough to be applicable to a system which depended on these results being absolutely true, I’ve shown that it is in fact entirely possible to make reasonably confident guesses as to the language used to generate a .NET assembly while using only simple reflection.&amp;#160; It would be interesting to see how well this holds for obfuscated assemblies as well as other “bare minimum” compilations generated via different combinations of compiler settings.&lt;/p&gt;

&lt;p&gt;The next obvious step would be to extend what I have already written into a full &lt;a href="http://www.codeproject.com/KB/cs/BayesClassifier.aspx"&gt;Bayesian classifier&lt;/a&gt;.&amp;#160; Would be much better than a hardcoded hierarchy which would be fragile and possibly completely and repeatedly incorrect for some cases.&amp;#160; Another big advantage of using &lt;a href="http://hunch.net/?p=230"&gt;machine learning here&lt;/a&gt;, is that it would be easy to add new features and classification categories.&amp;#160; &lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;;subject=How+to+determine+which+language(s)+were+used+to+build+a+.NET+assembly" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;;title=How+to+determine+which+language(s)+were+used+to+build+a+.NET+assembly" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;title=How+to+determine+which+language(s)+were+used+to+build+a+.NET+assembly" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;;title=How+to+determine+which+language(s)+were+used+to+build+a+.NET+assembly" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;;title=How+to+determine+which+language(s)+were+used+to+build+a+.NET+assembly&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=17547" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reflection/default.aspx">reflection</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B002F00_CLI/default.aspx">C++/CLI</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/classification/default.aspx">classification</category></item><item><title>Discoveries This Week 01/09/2008</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2009/01/09/discoveries-this-week-01-09-2008.aspx</link><pubDate>Fri, 09 Jan 2009 16:37:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:17126</guid><dc:creator>RickM</dc:creator><slash:comments>3</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/17126.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=17126</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=17126</wfw:comment><description>It’s been a very exciting week. I actually had more things to post than time would allow me to write about. I’ll have to save them for next time. Blog: Daniel Spiewak’s What is Hindley-Milner? (and why is it cool?) Hindley-Milner is the algorithm all...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2009/01/09/discoveries-this-week-01-09-2008.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=17126" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/clojure/default.aspx">clojure</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/functional/default.aspx">functional</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/object+oriented/default.aspx">object oriented</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/code/default.aspx">code</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reflection/default.aspx">reflection</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/languages/default.aspx">languages</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/roundup/default.aspx">roundup</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/haskell/default.aspx">haskell</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/algorithms/default.aspx">algorithms</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/decorators/default.aspx">decorators</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/continuous+integration/default.aspx">continuous integration</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/attributes/default.aspx">attributes</category></item><item><title>The Future of Programming Languages</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx</link><pubDate>Wed, 15 Oct 2008 14:18:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:16086</guid><dc:creator>RickM</dc:creator><slash:comments>14</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/16086.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=16086</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=16086</wfw:comment><description>&lt;p&gt;Yesterday, my coworker &lt;a href="http://www.atalasoft.com/cs/blogs/loufranco/default.aspx"&gt;Lou Franco&lt;/a&gt; pointed me to a fantastic talk by Anders Hejlsberg &lt;a href="http://blog.jaoo.dk/2008/10/07/the-future-of-programming-languages/"&gt;on the future of programming languages&lt;/a&gt;.&amp;nbsp; In this talk Anders argues that the future of programming language development will be focused on three events: the explosion in the use of Dynamic Languages, the creation of many new Domain Specific Languages and the rising need for Concurrency.&amp;nbsp; &lt;/p&gt;&lt;p&gt;In this article I'm going to focus on Dynamic Typing and Metaprogramming in particular.&amp;nbsp; It's interesting to consider what the impact on the maintainability of our code from their increased prominence might be.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Dynamic vs Static Typing&lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Over the last decade the use of dynamic programming languages has exploded.&amp;nbsp; Working at the higher level of abstraction that dynamic languages provide allows the programmer to spend much more time building things and much less time worrying about the details.&amp;nbsp; For sure, when prototyping or experimenting the speed of dynamic languages is a huge boon.&amp;nbsp; However, without type checking at compile time the potential for really difficult to track down bugs is huge. &lt;br&gt;&lt;/p&gt;&lt;p&gt;Just think about the kinds of strange bugs that can happen when any type can be passed into any argument of any method.&amp;nbsp; It gets even worse when you consider that these types may be silently converting themselves.&amp;nbsp; Without great care, the number of potential execution paths in your program could skyrocket.&amp;nbsp; &lt;/p&gt;&lt;p&gt;This can be offset by really strict unit testing and
extremely high code coverage.&amp;nbsp; However, I have yet to see a large real
world project that had this level of testing.&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;p&gt;For these reasons I find the new C# "dynamic" keyword rather
worrying.&amp;nbsp; It allows the programmer to declare variables which are only
type checked at runtime instead of at compile time. I would hate to have to
maintain a code base where it was liberally used. &lt;br&gt;&lt;/p&gt;&lt;p&gt;Anders also mentions F#'s static but implied typing system.&amp;nbsp; He talks a bit about the two worlds of static and dynamic meeting in the middle in this kind of way.&amp;nbsp; I agree, this is really the best of both worlds.&amp;nbsp; You gain the "dynamic feel" but get almost none of the downsides.&amp;nbsp; The security of static types without all the extra typing. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Metaprogramming&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I agree that Metaprogramming is a powerful tool, especially for testing.&amp;nbsp; In a ecosystem designed around objects having meaning, it only makes sense to be able to ask questions about those objects and be able to dynamically manipulate how they operate.&amp;nbsp; However, I am worried that it may in some cases become a substitute for well designed architecture. &lt;/p&gt;&lt;p&gt;Also, because of it's nature, in many cases Metaprogramming necessitates the use of strings to represent information about the application.&amp;nbsp; Strings whose contents will not be checked at compile time.&amp;nbsp; Because of this it is very easy to make breaking changes to an application which won't be caught when the program is compiled. &lt;/p&gt;&lt;p&gt;Take for example the idea of a class with a single property.&amp;nbsp; In the code for the application in which that class lives, a code branch depends on reflection to check if that property exists.&amp;nbsp; If you were to rename that property that path would no longer be taken and a bug would result.&amp;nbsp; If the creator of that code had used an interface instead of reflection it would have broken at compile time. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Conclusion &lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;I'm not saying that these kinds of powerful tools shouldn't exist. They are extremely useful in many cases.&amp;nbsp; We just need to be very careful in their use.&amp;nbsp; As &lt;a href="http://www.atalasoft.com/cs/blogs/stevehawley/default.aspx"&gt;Steve Hawley&lt;/a&gt; likes to say, when you have a shiny new hammer everything starts to look like nails.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Edit&lt;/b&gt;:&amp;nbsp; I want to note that I had intended to include a
subsection on the direct modification of abstract syntax trees but ran
out of time.&amp;nbsp; Also, a good friend of mine also pointed out to me that
Lisp style macros actually do let you work with the underlying code in
a much more meaningful way than C++ style text manipulation.&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;br&gt;&lt;br&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx&amp;amp;;subject=The+Future+of+Programming+Languages" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx&amp;amp;;title=The+Future+of+Programming+Languages" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx&amp;amp;title=The+Future+of+Programming+Languages" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx&amp;amp;;title=The+Future+of+Programming+Languages" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx&amp;amp;;title=The+Future+of+Programming+Languages&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=16086" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/concurrency/default.aspx">concurrency</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/object+oriented/default.aspx">object oriented</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/talks/default.aspx">talks</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reflection/default.aspx">reflection</category></item><item><title>A .NET Assembly for Cloning Objects with Arbitrary Field Value Changes: IcManipluator</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/07/11/a-net-assembly-for-cloning-objects-with-arbitrary-field-values-changes-icmanipluator.aspx</link><pubDate>Fri, 11 Jul 2008 18:45:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14891</guid><dc:creator>RickM</dc:creator><slash:comments>3</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/14891.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=14891</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=14891</wfw:comment><description>After my last post, A Safe and Asynchronous One to Many Stream Copy Through IL and Inheritance ”, I ordered a few books and spent some time playing with generating IL. Along the way I’ve developed a library which allows you to make a franken-clone of...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/07/11/a-net-assembly-for-cloning-objects-with-arbitrary-field-values-changes-icmanipluator.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14891" width="1" height="1"&gt;</description><enclosure url="http://www.atalasoft.com/cs/blogs/rickm/attachment/14891.ashx" length="96867" type="application/x-zip-compressed" /><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/code/default.aspx">code</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/IL/default.aspx">IL</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/MSIL/default.aspx">MSIL</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/memory/default.aspx">memory</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/stack/default.aspx">stack</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/allocation/default.aspx">allocation</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/unsafe/default.aspx">unsafe</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reflection/default.aspx">reflection</category></item></channel></rss>