RSS

F# ile programlama – Microsoft Dil Teknolojilerinde Nereye Gidiyor?

18 Sep

F# ve DirectX 3D

Don Syme’in F# programlama ile ilgili tanıtım ve demo videolarını gördükten sonra Pazartesi mutlaka F# derleyicisini ve etkileşimli kabuğunu indirip denemem gerektiğini düşünmüştüm.

Emacs + SLIME + Common Lisp tarzında rahat bir etkileşim ve hızlı geliştirme, deneme, sonuçları anında görme imkanı sunan F# bir betik dilinin kıvraklığı ile fonksiyonel programlamadan ve ileri programlama tekniklerinden faydalanmayı sağlıyor. Derlenen programlar .NET IL (Intermediate Language) koduna derlendiği ve bunlar da JITlenerek (Just In Time compilation) çalıştırıldığı için performans gayet iyi görünüyor.

Tanıtım videosunda ekip başı Syme’ın belirttiği gibi kökleri ML, SML, OCAML gibi dillere dayanan F# temelde bir fonksiyonel programlama dili. Bununla birlikte OCAML geleneğine uygun şekilde fonksiyonel programlamanın yanısıra imperatif ve nesneye yönelik programlama paradigmalarını da doğal şekilde destekliyor. C# gibi bir dille kıyaslandığında çok daha az ve öz şekilde algoritmaları ifade edebilen F#, etkileşimli kabuğu sayesinde de dosyadaki kaynak kodun bir kısmını seçip ALT+ENTER gibi bir tuş kombinasyonu ile de sadece o kısmın çalışmasını ve sonuçların hemen görülmesini sağlıyor.

Demo videosundaki zamana bağlı olarak dalgalanan 3 boyutlu yüzeyde “multi-threaded” olarak gezinen birçok top (ve bunlara eşlik eden vektörler) değişik açılardan gerçek zamanlı olarak fare ile evrilip çevrilirken F# performansı hakkında ilk izlenimlerin epey olumlu olmasını sağlıyor. Bu etkiyi elde etmek için yazılan kaynak kodun sadeliği ve esnekliği fonksiyonel programlamaya alışık olanlar için şaşırtıcı değil belki ama C# ya da VB programcılarını (ve kimbilir belki de Java 😉 bir hayli etkileme potansiyeline sahip.

F# derleyicisi ve etkileşimli kabuğu Microsoft .NET ve GNU/Linux MONO ortamlarında çalışıyor. Tabii eğer MS ortamındaysanız ve Visual Studio.NET kullanıyorsanız (2003 ya da 2005) o zaman F# Add-In ile doğrudan VS.NET’in sözdizim renklendirme, yazarken XML yorumlarına dayanarak programcıya ipuçları verme, tür bilgisi gösterme, vb. avantajlarından da faydalanmak mümkün. Bunun dışında F# ile fonksiyonel programlama yaparken tüm .NET sınıf hiyerarşisi de elinizin altında.

Demo videosunun ilk bölümünde de gösterilen (ve kesinlikle 3 boyutlu yüzey animasyon örneği kadar eğlenceli olmayan ;-)) RSS işleme örneği F#’ın tıpkı güçlü bir betik dili gibi olarak da kullanılabileceğinin güzel bir örneği. Burada kısaca alıntılamak gerekirse, önce .NET sınıf hiyerarşisinden faydalanarak çok kolay bir şekilde bir HTTP veri çekme fonksiyonu yazıyoruz (#light direktifi sayesinde sözdizimini hafifleştirmek ve bazı OCAML tarzı anahtar sözcüklerden kurtulmak ve Python tarzı “girintileme ile kodu anlamlandır” kuralını dayatmak mümkün):


#light

open System.Net
open System
open System.IO
open Printf

/// Web sayfasinin icerigini cek
let http(url: string) =
  let req = System.Net.WebRequest.Create(url)
  let resp = req.GetResponse()
  let stream = resp.GetResponseStream()
  let reader = new IO.StreamReader(stream)
  let html = reader.ReadToEnd()
  resp.Close();
  html

Ardından yukarıda yazdığımız http fonksiyonunu kullanıp mesela bu blogun RSS verisini çekip bunu ileriseviyeRSS değişkenine yerleştiriyoruz:


let ileriseviyeRSS = http("http://ileriseviye.org/blog/?feed=rss2")

Şimdi XML verisini barındıran değişkeni elimize aldığımıza göre onun üzerinde işlem yapabiliriz. Fonksiyonel programlamaya yahut UNIX ve GNU/Linux’taki “pipe”, “piping” kavramlarına alışık olanlara |> operatörü yabancı gelmeyecektir. Temel amacı bir fonksiyonun çıktısını kolayca başka bir fonksiyona yollamak:


// ---------------------------------------
// RSS'teki haber basliklarini tarayalim
// ---------------------------------------
open System.Xml
open System.Collections
open System.Collections.Generic

let xdoc = new XmlDocument()
xdoc.LoadXml(ileriseviyeRSS)


/// XPathNodeList, System.IEnumerable'i destekledigine göre
/// önce "node"lardaki metni cekelim sonra da bunu bir listeye cevirelim

xdoc.SelectNodes("//title")
  |> IEnumerable.map_with_type (fun (i:XmlNode) -> i.InnerText)
  |> IEnumerable.to_list

F# etkileşimli kabukta yukarıdaki kodu çalıştırdığımızda ya da kaynak dosyaya kaydedip seçil ALT+ENTER bastığımızda (yahut fsc ile derleyip oluşan “binary” dosyayı komut satırından çalıştırdığımızda) aşağıdaki çıktıyı elde ediyoruz (ve de UTF-8 problemini güzelce görüyoruz ;-))


> > > val it : string list
       = ["FZ Blogs"; "Bir mimar bilgisayarclar ne kadar etkileyebilir?";
          "Uluslararas bir konferansn ardndan: IODL '06 (ya da tiyatro ve sinema arasndaki fark stne)";
          "Yeni bir ders:Mzik ve Linux";
          "Chomsky ve Trivers ile kirli sava?lar ve kendini aldatma stne";
          "Memleketimden insan manzaralar: Daire, elips ve kar?an kafalar";
          "Patterns of Software: Richard P. Gabriel'den sistem tasarm ve hayat zerine incelikli bir kitap";
          "20 yl ?ncesinden bir roman: Koku";
          "Muratpa?a Belediyesi ve Emre'nin Harikalar Kumpanyas (sorma neden ni?in)";
          "C# ve Reflection kullanarak bir dizindeki .NET .dll dosyalar i?inde tr arama";
          "B?cek Avcl§, lint ve bir C kodu";
          "Perl 6 Meta Object Protocol (Perl MOP)";
          "MathML, Debian ve Firefox";
          "Long Term Potentiation (LTP) ve ?§renme arasndaki ba§lantya dair ilk kantlar bulunmu?!";
          "1800'l yllarla dolu birka? gn: The Illusionist, Husserl, Wilde, Rodin";
          "G?kgrlts ve uzaktaki yldzlar";
          "hakia.com ya da bir Japon yz tanma ?irketi i?in ?al?mak ister misiniz?";
          "Beyin Bilgisayar Arayzleri ve Firefox ?stne";
          "Kendime notlar: daha ?ok blues, armonika ve ses teknolojisi ?al?";
          "Producing Open Source Software: Teknik, slup, kltr ve terbiye stne";
          "Collapse: Toplumlar Ba?ary ya da Ba?arszl§ Nasl Se?er"]

Tabii yukarıdaki örnek F#’ın ve genel olarak fonksiyonel programlamanın gücünün çok küçük bir kısmını, buzdağının suyun üstündeki ucunu gösteriyor. Söz gelimi örüntü eşleme (pattern matching) yahut fonksiyonların değişkenler gibi kolayca diğer fonksiyonlara geçirilmesi, fonksiyon döndürülmesi, çoklu dönüş değerleri gibi güçlü özellikler görünmüyor veya vurgulanmıyor.

F# geliştirme ekibinin başındaki Don Syme birkaç ayda bir yeni sürüm çıkardıklarını ve F# dilinin şimdiden Microsoft’un bazı programlama projelerinde kullanılmaya başlandığını belirtiyor (örn. statik kod analizi, sürücü kod analizi, derleyiciler, yorumlayıcılar, vs.). F# ile hızlı şekilde geliştirilebilecek projelere örnek olarak karmaşık bilimsel uygulamalar, simülasyonlar, büyük veri setleri üzerinden yapılan analizler veriliyor. pi-calculus derleyicisi gibi şeyler yapmak mümkün olduğu gibi, podcasting istemcisi gibi günlük uygulamaları da hızlıca yazmak da mümkün.

Gelecek sene APRESS‘ten çıkması planlanan Expert F# kitabının yazarı Don Syme, kitabın ikinci bölümünü kamuya açık olarak sunuyor: Draft Chapter 2 of “Expert F#”: Essential Language Features. OCAML diline benzerliğinden ötürü F# ile ilgili OCAML kaynaklarından da faydalanmak mümkün (ve belki de gerekli!)

Tam da bu aralar IronPython gibi .NET dilleri üzerine tartışmalar kızışmışken “scripting” tarzı çalışma ile OCAML ve Haskell gibi çok güçlü fonksiyonel dillerin özelliklerini bir araya getiren F# dili, Microsoft’un dil teknolojileri konusunda bugün ve gelecekte nasıl bir strateji izleyeceğine dair ipuçları veriyor.

Advertisements
 
Leave a comment

Posted by on September 18, 2006 in .NET, General, Programlama

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: