Daha önceki blog yazımda sıraladığım konu başlıklarıyla F# (efşarp
diye okunuyor. )’ın gizemli ve bir o kadarda ilgi çekici yeteneklerine beraber
ışık tutuyor olacağız..Daha önce F# ile hiç çalışmamış ya da adını bir yerlerden
duymuş olmanıza rağmen hiç incelememiş olabilirsiniz..Fakat şu an bu satırları
okuyorsanız bir şekilde yazılımla alakanız ve belli bir bilgi birikiminiz
olduğu pek ala ortada.. J
Herşeyden önemlisi meraklı olduğunuz ki benim de tam olarak aradığım bu…
Bu arada konuyla ilgili sorularınız olursa ya da ilgili
yazılarda açık olmayan ya da anlayamadığınız bir şeyler olursa lütfen
yazın..Amacımız daha sonra bu yollardan geçecek olanlara “işe yarar” bilgiler
bırakmak..
1.
F# Nedir ?
Eğer benim gibi C veya türevi kökenli (ciddi bir object pascal takıntımda
olmuştur J)
bir yazılımcı iseniz ve az çok internette özellikle bilgi paylaşım
portallerinde bulunup bir şeyler karalayıp ya da okuyorsanız F# ismini
kesinlikle duymuş fakat bir türlü inceleme imkanınız olmamış olabilir.Bir Java
programcısı ya da Vb programcısı olmanızdan ziya de F# ı öğrenmek ve ilerlemek
için gereken asıl ihtiyaç meraklı olmak ve farklı düşünmeye açık olmak!
“Kemerlerini sıkı bağla DOROTI, az sonra Kansas
yerle bir olacak!”
Öncelikle F#’ı öğrenmek için C# bilmenize
kesinlikle gerek yok..!Şunu belirtmekte fayda var, F# diğer C,C++,Java,C# gibi
dillerle bir çok yönden alakası olmayan bir dil..Bunu ilerleyen yazılarda
örneklerle çok daha iyi anlayacaksınız..Bana göre F#, pragmatik düşüncenin
fonksiyonel alternatifi..
Internet’
de F#’la ilgili sıkça sorulan soruları gözden geçirip bir liste yaptım ve yine
bildiğim kadarıyla bunları teker teker cevaplamaya çalıştım. Lütfen merak
ettiğiniz bir soru varsa onu bana yazın cevabıyla birlikte bu yazımıza ekleyelim.
-
İsmine bakarak F# , C#’ın türevi dersek doğru
mudur?
-
F# dilinin F’i nereden geliyor ?
-
Fonksiyonel programlama ne demek ?
-
Imperative programlama ne demek ?
-
F# nesneye yönelik bir dil midir ?
-
F# Visual Studio üzerinden kullanılabiliyor mu? Herhangi bir entegrasyon söz konusu mudur ?
-
F# la komut satırı araçları üzerinden çalışmak
mümkün müdür ?
-
F# platformlar arası taşılanabilir bir dil midir
?
-
F# ilgili uygulama paketinin dağıtımı için
çalışma zamanı kendi özel kütüphanelerine ihtiyaç duyuyor mu ?.NET’in ilgili
makinede yüklü olması yeterli mi?
-
F# bir scripting dilimi yoksa derlenebilir bir
dil midir? (En önemli ve sık karşılaştığım sorulardan
biri )
-
F# ‘ın hızını diğer dillerle
karşılaştırdığımızda tablo nedir ?
-
F#’la ilgili resmi kaynaklar nerededir , nasıl
temin edebilirim ?
-
…
Liste uzayıp gidiyor..Hemen
cevaplara geçelim :
-
1 . İsmine
bakılırsa F# , C#’ın türevi dersek doğru mudur?
Kesinlikle alakası yok.!F# programlama
dilleri ailesinde köken olarak, ML ya da Meta Language olarak bilinen ve 1970’lere
dayanan bir eski bir programlama diline dayanıyor..ML özel tipte çıkarımlar
yapabilen bir algoritma üzerine yapılandırılmış dinamik bir yapı üzerinden
çalışabilme yeteneğine sahip bir dil.F#’ da bu özelliği aynen korumaktadır.Bu
demek değildir ki F#’da tip tanımları yok..Kesinlikle var ki bu o bu dilin %
100 pure olmasını engelleyen durumlardan biri..Zaten yazarken de çok ihtiyaç
duymayacaksınız..Ben bu tür işlemlerde hybrid çözümleri daha uygun
görüyorum..C#’ın nesneye yönelik programlama konusunda ki esnekliği daha
doğrusu esnek ama bir o kadar da sert belirlenmiş esnetilebilir çizgileri ile
library’lerimi yazıp F# içerisinde kullanmak daha az maliyetli geliyor..Biraz
daha haşır neşir olduğunuzda F#’la beni daha iyi anlayacaksınız..Konuyu fazla
dağıtmadan bu kavramlara ilerleyen yazılarda detaylıca yer vereceğimi bilmenizi
isterim.
F# , ObjectiveCaml
(or OCaml) olarak bilinen ki kendiside Caml ‘den (Categorical Abstract Machine Language) türemiş
ve aynı zamanda ML’in özelliklerini barındıran ve tüm bunlara bir de imperative
dillerin belirgin bir özelliği olan nesneye yönelik programlamayı yetenekleri
eklenerek ortaya çıkartılmış bir dil..(her şeyden önemlisi bu son özellik
olmasa belki üzerine düşmezdim..) Sonuç itibariyle, yüksek seviyeli ,Ocaml ile müthiş
derecede uyumlu (#light direktifinin işlerinden biri bu aslında! (pythonda olduğu gibi girintileme ile kodu anlamdır,söz dizilimini hafifleştirir (ocaml e ait reserved keyword'lerin error verdirmemesi,uyumdan kastımız bu ki iyi bir ocaml coder zorlanmadan F# da yazabilir ,ihtiyacı olan .NET FW'i tanımak ..)..)) ve istenildiğinde koskoca
.NET kütüphanesini rahatça kullanabilme yeteneği olan, dil söz dizimi açısından
Ocaml( ki normal) ve pascal’la benzerliği olan ,son aldığım bilgiye göre de
Visual Studio’nun bir sonraki versiyonunda resmi olarak C#,VB.NET den sonra
desteklenecek 3.dil olma özelliğini taşıyan, (şu anda net değil
ama sağlam bir kaynaktan aldığım bilgi..Bariz bir şekilde fonksiyonel
programlama aracı olmayışı Visual studio’da bu ihtimali arttırıyor.) Cambridge’de
Microsoft Research Center’da Don Syme (ekibi) tarafından geliştirilen
,geliştirilmeye devam edilen sevilesi bir dil.. J
F#
ayrıca, type inference (tür çıkarımı (dinamik)) , high-order functions (x
fonksiyonunun başka bir fonksiyon tarafından argüman olarak ele alınması ve
sonuç olarak bir fonksiyon döndürebilmesi..(örneğin türev alma)) ,pattern
matching,currying ( burada çok sevdiğim scripting dillerinden biri olan
javascript’de durumu izah edeyim
(

Yukarıda metodun içeriğinden de
anlaşılabileceği gibi basit bir işlem söz konusu..Fonksiyonu çağırma şeklimize
dikkat edin..

Özetle , çok parametreli
fonksiyonları tek parametreli hale getirme yani örneğimizde iki parametre alan
fonksiyon , tek parametreli bir fonksiyon döndüren tek parametreli bir
fonksiyona dönüştürülüyor..Humm JPeki
curry ismi nerden geliyor dersiniz (tabi ki Haskell Curry .. Haskell bilinen
%100 pure ve side effect barındırmayan tek dil..Mesela size imperative bir
dilde tüm sayıların küpünü kapsayan bir dizi oluşturun deseydim nasıl yapardınız
?Bir düşünün??Haskell cubes = [n*n *n |
n<-[0..]] diyerek bunu
belirtiyorsunuz..üstelik lazy evaulation ile take cubes 3000 diyerek ki (take,let hummm bunları biryerden
hatırlıyorsunuz neresi mi hemen söyleyeyim tabiî ki LINQ.. J bunun sebebi lambda
functions!Bu fonksiyonel programlama dillerinin özüdür dersek yanılmış
olmayız..! işte bu kelimeler aslında C# a Vb’ye
bu dillerden geçiyor..) sadece
ihtiyaç duyulan miktarı isteyebilirsiniz..Bu tek kelimeyle enfes!)
) ) gibi bir çok mükemmel
özelliği içerisinde barındırıyor. F# derlenenen bir dil olmasına rağmen fsx
dosyaları ile programcıya F# scripting deneyimide yaşatıyor.Bu noktada hybrid
bir yapıya sahip..Bu size neyi çağrıştırıyor tabiî ki , python shell ve Ruby’de
ki IRB’yi.Hatırlarsanız DLR altında inceleyebileceğiniz bu iki dil ve etkileşim
araçları ciddi bir programcı kitlesi tarafından kullanılıyor ve takip
ediliyor..script shell’in F# içerisinde yer alıyor olması gerçekten doyurucu..bir
editor olmadan kendi function’larınızı hızlıca yazip test edebilirsiniz..
Kaldığımız yerden devam edeceğiz…
not : paragraflar iç içe geçtiğinden dolayı özür diliyorum , bu konuda yeteneksizim :)
Eralp