f# for architects hitting the sweet spot

24
F# for Architects Hitting the Sweet Spot Chris Smith, Microsoft Twitter @aChrisSmith http://blogs.msdn.com/ chrsmith

Upload: eddy

Post on 23-Feb-2016

40 views

Category:

Documents


0 download

DESCRIPTION

F# for Architects Hitting the Sweet Spot. Chris Smith, Microsoft Twitter @ aChrisSmith http://blogs.msdn.com/chrsmith. Why this talk will be awesome. F# Facts. Commonly known F# facts “Write tomorrow’s legacy code today in C#” F# will parallelize things for free - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: F# for Architects Hitting the Sweet Spot

F# for ArchitectsHitting the Sweet Spot

Chris Smith, MicrosoftTwitter @aChrisSmith

http://blogs.msdn.com/chrsmith

Page 2: F# for Architects Hitting the Sweet Spot

Why this talk will be awesome

Page 3: F# for Architects Hitting the Sweet Spot

F# Facts• Commonly known F# facts– “Write tomorrow’s legacy code today in C#”– F# will parallelize things for free– Functional programming is the future– F# developers are smarter and better looking that

other programmers– You should rewrite all your ASP.NET apps in F#

Page 4: F# for Architects Hitting the Sweet Spot

Agenda

• Before you get started• F#’s Strengths• F#’s Weaknesses• Bottom Line

Page 5: F# for Architects Hitting the Sweet Spot

F# in Five Minutes

Language

• Multi-paradigm language

• Type inferred

• Just another .NET language

Tools

• First-class language in VS2010*

• F# Interactive Window

• F# PowerPack

F# = Fun

Page 6: F# for Architects Hitting the Sweet Spot

Lap around F# in VS2010

Page 7: F# for Architects Hitting the Sweet Spot

F# Interop

F# can do…

• Classes• Generics• Delegates• Enumerations• Structures• P/Invoke

… as well as

• Function values• Discriminated unions• Pattern matching• Lazy evaluation• Records• Lists• Tuples• Computation expressions /

Monads (Über-geek stuff)

Page 8: F# for Architects Hitting the Sweet Spot

Microsoft .NET Ecosystem• Tools & Languages– Visual Studio– Expression Studio– VB, C#, F#, Iron R/P, …

• Platforms– XNA– Compact Framework– Visual Studio Tools for Office– Silverlight

Page 9: F# for Architects Hitting the Sweet Spot

So what is it good at?

Page 10: F# for Architects Hitting the Sweet Spot

Buzzwords!

F#Strongly Typed

Succinct

Functional Scalable

Explorative

Libraries

Page 11: F# for Architects Hitting the Sweet Spot

Functional vs. Object-Oriented

FP : small :: OO : large

Page 12: F# for Architects Hitting the Sweet Spot

Technical Computing• Simulation

• Computational Finance

• Large-scale Data Processing

Page 13: F# for Architects Hitting the Sweet Spot

Language Oriented Programming• Writing Parsers

• Augmenting F# Code

• Creating New Languages

• Quotations (Expression Trees)

Page 14: F# for Architects Hitting the Sweet Spot

Parallel Programming*• Immutable by default

• Parallel Extensions to .NET– Task Parallel Library– Concurrent Data Structures

• Asynchronous Workflows

*Parallel, Asynchronous, Concurrent, and Reactive Programming

Page 15: F# for Architects Hitting the Sweet Spot

Asynchronous Programming Modelusing System;using System.IO;using System.Threading; public class BulkImageProcAsync{    public const String ImageBaseName = "tmpImage-";    public const int numImages = 200;    public const int numPixels = 512 * 512;     // ProcessImage has a simple O(N) loop, and you can vary the number    // of times you repeat that loop to make the application more CPU-    // bound or more IO-bound.    public static int processImageRepeats = 20;     // Threads must decrement NumImagesToFinish, and protect    // their access to it through a mutex.    public static int NumImagesToFinish = numImages;    public static Object[] NumImagesMutex = new Object[0];    // WaitObject is signalled when all image processing is done.    public static Object[] WaitObject = new Object[0];    public class ImageStateObject    {        public byte[] pixels;        public int imageNum;        public FileStream fs;    }  

    public static void ReadInImageCallback(IAsyncResult asyncResult)    {        ImageStateObject state = (ImageStateObject)asyncResult.AsyncState;        Stream stream = state.fs;        int bytesRead = stream.EndRead(asyncResult);        if (bytesRead != numPixels)            throw new Exception(String.Format                ("In ReadInImageCallback, got the wrong number of " +                "bytes from the image: {0}.", bytesRead));        ProcessImage(state.pixels, state.imageNum);        stream.Close();         // Now write out the image.          // Using asynchronous I/O here appears not to be best practice.        // It ends up swamping the threadpool, because the threadpool        // threads are blocked on I/O requests that were just queued to        // the threadpool.         FileStream fs = new FileStream(ImageBaseName + state.imageNum +            ".done", FileMode.Create, FileAccess.Write, FileShare.None,            4096, false);        fs.Write(state.pixels, 0, numPixels);        fs.Close();         // This application model uses too much memory.        // Releasing memory as soon as possible is a good idea,         // especially global state.        state.pixels = null;        fs = null;        // Record that an image is finished now.        lock (NumImagesMutex)        {            NumImagesToFinish--;            if (NumImagesToFinish == 0)            {                Monitor.Enter(WaitObject);                Monitor.Pulse(WaitObject);                Monitor.Exit(WaitObject);            }        }    }

        public static void ProcessImagesInBulk()    {        Console.WriteLine("Processing images...  ");        long t0 = Environment.TickCount;        NumImagesToFinish = numImages;        AsyncCallback readImageCallback = new            AsyncCallback(ReadInImageCallback);        for (int i = 0; i < numImages; i++)        {            ImageStateObject state = new ImageStateObject();            state.pixels = new byte[numPixels];            state.imageNum = i;            // Very large items are read only once, so you can make the             // buffer on the FileStream very small to save memory.            FileStream fs = new FileStream(ImageBaseName + i + ".tmp",                FileMode.Open, FileAccess.Read, FileShare.Read, 1, true);            state.fs = fs;            fs.BeginRead(state.pixels, 0, numPixels, readImageCallback,                state);        }         // Determine whether all images are done being processed.          // If not, block until all are finished.        bool mustBlock = false;        lock (NumImagesMutex)        {            if (NumImagesToFinish > 0)                mustBlock = true;        }        if (mustBlock)        {            Console.WriteLine("All worker threads are queued. " +                " Blocking until they complete. numLeft: {0}",                NumImagesToFinish);            Monitor.Enter(WaitObject);            Monitor.Wait(WaitObject);            Monitor.Exit(WaitObject);        }        long t1 = Environment.TickCount;        Console.WriteLine("Total time processing images: {0}ms",            (t1 - t0));    }}

Page 16: F# for Architects Hitting the Sweet Spot

let ProcessImageAsync(i) = async { let inStream = File.OpenRead(sprintf "source%d.jpg" i) let! pixels = inStream.AsyncRead(numPixels) let pixels' = TransformImage(pixels,i) let outStream = File.OpenWrite(sprintf "result%d.jpg" i) do! outStream.AsyncWrite(pixels') do Console.WriteLine "done!" } let ProcessImagesAsync() = Async.Run (Async.Parallel [ for i in 1 .. numImages -> ProcessImageAsync(i) ]) 

F# Asynchronous WorkflowsRead from the

file,asynchronously

“!” = “asynchronous”

Write the result, asynchronously

This object coordinates

Equivalent F# code

(same perf)

Generate the tasks and queue them in

parallel

Open the file, synchronously

Page 17: F# for Architects Hitting the Sweet Spot

Let’s pour on some cold water

Page 18: F# for Architects Hitting the Sweet Spot

F#’s not-as-strong-but-they-are-still-strengths

• Presentation Layer

• Object-oriented Hierarchies

• ASP.NET*

Page 19: F# for Architects Hitting the Sweet Spot

Training Your Team• F#: Not for eggheads

• Pay attention to what you hear– “Oh, it is just like C#”– “It is too simplistic for real-world development”– “Functional programming hurts my brain”

Page 20: F# for Architects Hitting the Sweet Spot

Maintenance Costs• Code Maintenance– Terse syntax matters!– Idiomatic vs. non-idiomatic code

• Deploying F# Tools and Applications

Page 21: F# for Architects Hitting the Sweet Spot

Bottom Line

Page 22: F# for Architects Hitting the Sweet Spot

How to Get F#• Download the May, 2009 CTP for Visual Studio

2008 from http://fsharp.net

• Get Visual Studio 2010 Beta1 from http://msdn.com

• Run F# on Linux via Mono http://mono-project.com

Page 23: F# for Architects Hitting the Sweet Spot

Resources• Books– Programming F#, O’Reilly

(November, 2009)– Expert F#, Apress 2007

• Blogs– F# Team blogs– http://fsharp.net

• Bugging other people– http://hubfs.net – http://stackoverflow.com

Page 24: F# for Architects Hitting the Sweet Spot

Questions?Thanks for your time!