7 puan yazan GN⁺ 2025-04-03 | 1 yorum | WhatsApp'ta paylaş
  • F#, .NET’i hedefleyen ML ailesinden fonksiyonel bir dil ve Microsoft tarafından geliştirildi. Ağırlıklı olarak nesne yönelimli olan C# ile karşılaştırıldığında, F# fonksiyonel programlama paradigmasına odaklanır
  • Bu yazı F#’ın dil özelliklerini, ekosistemini, dokümantasyon durumunu, geliştirme araçlarını, kullanım örneklerini, topluluk durumunu ve F# vs. OCaml karşılaştırmasını derliyor

F# nedir?

  • F#, kısa, sağlam ve performanslı kod yazmak için tasarlanmış genel amaçlı bir programlama dilidir
  • Karmaşık sözdizimiyle uğraşmak yerine, doğrudan problem çözmeye odaklanabilmeniz için tasarlanmıştır
  • Açık kaynaklıdır, çapraz platformdur ve .NET ile yüksek uyumluluğa sahiptir
  • Özellikler

    • Hafif sözdizimi ve varsayılan değişmezlik
    • Tip çıkarımı ve genelleştirme
    • Birinci sınıf fonksiyonlar, güçlü veri tipleri, pattern matching
    • Eşzamansız programlama (Async) desteği
    • Ünlü pipeline operatörünün (|>) çıkış noktası olan dildir
  • Basit örnek kod

    open System  
    let names = [ "Peter"; "Julia"; "Xi" ]  
    let getGreeting name = $"Hello, {name}"  
    names |> List.map getGreeting |> List.iter (printfn "%s")  
    
  • F#, 2005’te Microsoft Research’te Don Syme tarafından geliştirilen bir dil olarak ortaya çıktı
    • OCaml’ı .NET platformuna taşıma araştırma projesi (Caml.NET) olarak başladı
    • Ardından 2010’dan itibaren resmi bir ürün haline geldi ve 2024’te F# 9.0 yayımlandı
    • 2025 itibarıyla 20. yılına ulaşmış olgun bir dil konumunda
  • F#’ı denemeye iten başlıca nedenler
    • .NET’in açık kaynak ve çapraz platform yönünde evrimini görmek
    • OCaml karşısındaki artılarını ve eksilerini kıyaslamak
    • Rider, Ionide gibi araçlar hakkındaki olumlu değerlendirmeler
    • Basitçe yeni bir dili keşfetme merakı

Bir dil olarak F#

  • F#, ML ailesinden fonksiyonel bir dildir ve OCaml kullanıcılarına tanıdık gelecek bir sözdizimine sahiptir
  • Haskell veya Lisp deneyimi olan geliştiriciler de kolayca uyum sağlayabilir
  • Boşluk tabanlı sözdizimi yapısı kullanır; Python’daki gibi girinti sözdizimsel olarak önemlidir
  • Yeni başlayanların da temel sözdizimini hızlıca öğrenebilmesi için tasarlanmıştır
  • Dil özelliklerinin özeti

    • Fonksiyon tanımı ve uygulaması kısa ve doğal biçimde ifade edilebilir
    • Koşullar, döngüler, tuple’lar, liste işlemleri fonksiyonel tarzda temiz bir şekilde kullanılabilir
    • Record’lar, ayrımlı birleşimler (Discriminated Union), pattern matching sayesinde karmaşık veri yapıları kısa biçimde ele alınabilir
    • Pipeline operatörü (|>) ile veri akışı, fonksiyonların birbirine bağlanması gibi görsel olarak net bir yapıda kurulabilir
    • F#, ad-hoc script yazımı için çok uygundur; .fsx dosyaları yazılıp dotnet fsi ile doğrudan çalıştırılabilir
    • REPL ortamı da sunar; bu da keşif odaklı programlama için avantaj sağlar
  • Kullanıcı dostu sözdizimi

    • Tek satır ve çok satırlı yorumlar, mutable değişkenler, liste slice’ları gibi pratik sözdizimsel özellikler içerir
    • C# ile yüksek uyumluluğu sayesinde .NET API’lerini kolayca kullanabilirsiniz
    • Farklı tipler için operator overloading de doğal biçimde desteklenir
    • printfn, farklı tipleri kolayca yazdırabildiği için debug ve logging açısından kullanışlıdır
  • Eşzamansız programlamanın öncülerinden biri

    • async/await kalıbının kökeni F# 2.0’a dayanır; sonrasında C#, JavaScript ve başka dillere etki etmiştir
    • F#, eşzamansız programlamayı callback kullanmadan da sezgisel biçimde kurabilen bir yapı sunar
    • Kod akışı senkronmuş gibi okunur, ama gerçekte asenkron çalışır
  • Microsoft’un yatırımı ve dilin gelişimi

    • Microsoft uzun süre F# için sınırlı insan kaynağı ayırmış olsa da, 2022’de Prag’da özel bir ekip kurarak ciddi yatırımı başlattı
    • F# 8.0 ve 9.0 sürümleriyle birlikte dil ve araçlar hızla iyileşiyor
    • Microsoft içinde ilginin artması, gelecekteki gelişim potansiyeli açısından da umut veriyor

F#, öğrenmesi kolay ama güçlü bir tip sistemi ve fonksiyonel programlama paradigması sunan pratik bir dildir; özellikle .NET tabanlı projelerde fonksiyonel yaklaşımı benimsemek isteyen geliştiriciler için çok cazip bir seçenektir

Ekosistem (Ecosystem)

  • F#’ı nispeten kısa süre kullanınca görülen şey, yalnızca F#’a özel saf kütüphane ve framework sayısının çok fazla olmadığı
  • Kullanıcıların çoğu, .NET’in temel API’lerine ve C# merkezli tasarlanmış üçüncü taraf kütüphanelere dayanıyor
  • Bu, Scala, Clojure, Groovy gibi hosted language’lerde sık görülen bir durum
  • Web geliştirme için başlıca kütüphaneler

    • Giraffe: ASP.NET Core tabanlı, fonksiyonel stili benimseyen hafif bir web framework’ü
    • Suave: Routing ve iş akışı bileşimi için combinator tarzı basit bir web sunucusu framework’ü
    • Saturn: Giraffe üzerine kurulu MVC tarzı bir framework; Ruby on Rails ve Phoenix’ten ilham alır
    • Bolero: WebAssembly ve Blazor tabanlı istemci uygulaması geliştirme framework’ü
    • Fable: F#’ı JavaScript’e transpile ederek React, Node.js ve diğer JS ekosistemleriyle birlikte çalışmasını sağlar
    • Elmish: Fable ile sık kullanılan, MVU(Model-View-Update) kalıbına dayalı bir UI framework’ü
    • SAFE Stack: Saturn, Fable, Elmish, Azure vb. bileşenleri birleştiren uçtan uca fonksiyonel web geliştirme yığını
  • Veri bilimi için başlıca kütüphaneler

    • Deedle: pandas tarzı veri analizi ve işleme kütüphanesi
    • DiffSharp: Makine öğrenmesi ve otomatik türev sağlayan matematik odaklı kütüphane
    • FsLab: Görselleştirme ve istatistiksel analiz araçları içeren bütünleşik veri bilimi araç takımı

Dokümantasyon durumu

Geliştirme araçları (Dev Tooling)

  • F# geliştirme araçları ekosistemi geçmişte yalnızca Visual Studio için optimize edilmişti ve diğer editörlerdeki destek zayıftı
  • Neyse ki son 10 yılda araç ortamı büyük ölçüde iyileşti
  • Teknik dönüm noktası: FSharp.Compiler.Service(FCS)

    • FCS, F# derleyicisini, editör destek özelliklerini ve scripting motorunu tek bir kütüphanede sunar; böylece F# farklı editör ve araç ortamlarında kullanılabilir hale gelir
    • Bu sayede VS Code, belge üreticileri ve alternatif backend’lerde F# desteği mümkün oldu ve ekosistemin genişlemesinin önü açıldı
    • Bunun en bilinen örneklerinden biri Ionide; VS Code’da zengin F# desteği sunuyor ve 1 milyondan fazla indirme sayısına ulaşmış durumda
  • Test edilen editörler

    • Emacs (fsharp-mode): temel özellikler sunuyor, TreeSitter desteği yok, geliştirme etkinliği düşük
    • Zed: F# desteği sınırlı
    • Helix: temel destek mevcut
    • VS Code (Ionide eklentisi): en olgun ortamlardan biri
    • JetBrains Rider: ticari bir IDE olsa da F# desteği çok güçlü

    Özelliklerin çoğu F# dil sunucusu olan fsautocomplete üzerine çalışıyor; LSP desteği iyi olan tüm editörler kullanılabilir

  • Eksik kalan yönler

    • fsharp-mode, eski bir kod tabanına dayanıyor ve yavaş gelişiyor
    • Zed’de özellikler yetersiz
    • VS Code’da bazı özellikler (ör. seçim alanını büyütme/küçültme) düzgün çalışmıyor
    • Tuş atamaları / modal model nedeniyle VS Code’u rahatsız edici bulan kullanıcılar da var
  • Kod biçimlendirici ve linter’lar

    • Fantomas: F#’ın resmi kod formatter’ı; kullanıcıların ve ekiplerin çoğu tarafından kullanılıyor
    • FSharpLint: bir dönem popülerdi, ancak bugün fiilen durma noktasında
    • Yine de güçlü derleyici sayesinde linter bağımlılığı daha düşük
  • Diğer araçlar

    • Paket: .NET için bağımlılık yöneticisi (npm, pip, bundler benzeri)
    • FAKE: build script’lerini F# ile yazmayı sağlayan bir DSL; Ruby’deki rake benzeri

Kullanım alanları (Use Cases)

  • .NET’in geniş ekosistemi sayesinde F# çeşitli alanlarda kullanılma potansiyeline sahip
  • Özellikle Type Providers özelliği sayesinde veri analizi ve veri işleme işleri için çok uygun
  • Backend servisler ve tam yığın uygulama geliştirme için de uygun; bazı araçlar frontend geliştirmeyi de mümkün kılıyor
  • Başlıca kullanım alanları

    • Veri analizi: F#’ın type provider’ları ile statik tip tabanlı veri işleme yapılabilir
    • Backend servisleri: .NET’in güçlü web framework’leri ile birlikte F# kullanılabilir
    • Frontend uygulamaları: Fable ve Elmish ile JS ekosistemiyle entegre UI geliştirme mümkündür
      • Fable 4 ile birlikte TypeScript, Rust, Python gibi farklı dillere de transpile edilebiliyor
  • Fable örnekleri (basit transpile komutları)

    • JavaScript:
      dotnet fable
    • TypeScript:
      dotnet fable --lang typescript
    • Python:
      dotnet fable --lang python

Topluluk durumu

  • Genel olarak topluluk büyük değil; hatta OCaml’dan da küçük olabilir
  • En aktif iletişim kanalları Reddit ve Discord
  • Slack topluluğu da var, ancak davet otomasyon sistemindeki sorunlar nedeniyle erişmek zor
  • Microsoft’un topluluk içindeki rolü net değil; topluluğun yönlendiriciliği daha baskın
  • Topluluk tarafından yürütülen başlıca kaynaklar

Popülerlik ve gerçekler (The Popularity Contest)

  • F#, çoğu popülerlik göstergesinde (TIOBE, StackOverflow, iş ilanları vb.) üst sıralarda yer almıyor
  • Ancak bu, büyük ölçüde çoğu fonksiyonel dilin karşı karşıya olduğu bir gerçeklik; yalnızca F#’a özgü değil
  • Hâlâ ana akım olmasa da, Clojure, OCaml, Emacs Lisp gibi diğer fonksiyonel dillerle benzer ölçekte bir kullanıcı kitlesine sahip
  • Neden F# kullanmalı?

    • Programlama dili seçmenin nedeni yalnızca iş bulma ihtimali değildir
      • Eğlence için (F#’daki F’nin “Fun” anlamına geldiği de söylenir)
      • Yeni paradigmaları ve fikirleri öğrenmek
      • Alışılmış düşünme biçiminden çıkıp başka türlü düşünmeyi öğrenmek
  • İlgili kaynaklar

F# ve OCaml karşılaştırması

F#’ın ilk amacı, OCaml’ın güçlü yanlarını .NET’e, .NET’in güçlü yanlarını da OCaml’a taşımaktı
– Don Syme, F#’ın yaratıcısı

  • F#, OCaml’dan ilham alınarak geliştirildi ve ilk dönemlerde .ml, .mli dosya uzantılarını bile destekleyecek kadar benzerdi
  • Zamanla daha bağımsız bir dil haline geldi ve bugün her ikisi de kendi yönünde gelişiyor
  • F#’ın avantajları

    • .NET platformu tabanlı olması
      • Çok büyük bir kütüphane havuzundan yararlanabilmesi
    • Microsoft desteği
    • Yeni başlayanlara daha dost olması
      • Nesne yönelimli diller (C# vb.) kullananlara tanıdık gelen sözdizimi
      • Derleyici hata mesajlarının görece daha açık olması
      • Debug deneyiminin daha sezgisel olması
    • Güçlü eşzamansız programlama desteği
    • OCaml’da olmayan özellikler sunması
      • Anonim record’lar
      • Active pattern’ler
      • Computation expression’lar
      • Sequence comprehension’lar
      • Type provider’lar
      • Units of measure
  • F#’ın dezavantajları

    • .NET platformu tabanlı olması
      • Dil tasarımında .NET ile birlikte çalışabilmek için çok sayıda ödün var (null kabulü gibi)
    • Microsoft’a ait olması
      • Microsoft’a yönelik tutumlara göre tercih farkı olabilir
      • F# için ayrılan kaynaklar nispeten sınırlı
      • Uzun vadede MS’in F#’ı ne kadar destekleyeceği belirsiz
    • İsimle ilgili sorunlar
      • PascalCase, camelCase adlandırma kurallarını sevmeyenler için rahatsız edici olabilir
      • F# adı arama ya da dosya adı bağlamında sorun çıkarabilir (bu yüzden sık sık FSharp da denir)
    • OCaml’daki bazı ileri özelliklerin eksikliği
      • Birinci sınıf modüller, functor’lar
      • Yetersiz GADT desteği
    • Maskotu yok, devesi de yok
  • Ortak yönler ve karşılaştırma

    • Her iki dil de JavaScript runtime’ını hedefleyebilir
      • F#: Fable
      • OCaml: js_of_ocaml, Melange
    • Şu anda Fable daha olgun hissettiriyor, ancak gerçek kullanım deneyimine daha çok ihtiyaç var
    • İkisi de güçlü ama niş diller ve kısa vadede geniş kitlelere ulaşmaları pek olası görünmüyor
    • F#, mevcut C# kod tabanlarına kademeli olarak sızabilecek pratikliğe sahip
    • Eksilerden biri, F# projelerinin hâlâ XML tabanlı proje dosyaları kullanması ve derleme sırasının elle belirtilmesini gerektirmesi
      • Bu durum, OCaml’ın Dune build sistemiyle kıyaslandığında daha zahmetli gelebilir
    • Eğitsel amaçlar veya dil yapısını öğrenmek için OCaml daha uygun olabilir
    • Pratik web servisleri ya da backend geliştirme söz konusuysa F# daha iyi bir tercih olabilir
    • Özellikle .NET ile iyi entegre olurken fonksiyonel stili koruyabilen bir dil olarak F#, çok güçlü bir araçtır

Kapanış notları

  • Yazara göre F#, beklediğinden çok daha eğlenceli ve pratik bir dil çıktı
    • Bunu, geçmişte Clojure ile ilk tanıştığındaki hisse benzetiyor
    • Özellikle Clojure’un Java ile mükemmel birlikte çalışabilirliği sayesinde en pratik Lisp oluşunu hatırlatıyor
  • Eğer .NET baştan beri açık kaynak ve taşınabilir olsaydı,
    • ClojureCLR bugün olduğundan daha popüler olabilirdi
    • F# topluluğu ve ekosistemi de daha fazla büyüyebilirdi
  • F#’ın 2010’a kadar açık kaynak olmaması da erken benimsenmesinin önünde engel olmuş

".NET ve F#’ın başta açık kaynak olmaması en büyük hataydı; bu yüzden pek çok fırsat kaçtı" – Don Syme

  • OCaml öğrenmesi zor bir dil değil, ama ML ailesinden bir dili ilk kez öğrenecekler için F# daha kolay olabilir
    • Üretime kadar giden yolun giriş eşiği de daha düşük
  • Özellikle .NET deneyimi olan geliştiriciler için F#’ı mutlaka denemeye değer olduğu vurgulanıyor
    • F#, tek başına da harika bir dil olmasının yanında, .NET’in güçlü ekosisteminden yararlanma fırsatı sunuyor
  • Fable gibi araçlarla F# kodu JavaScript, Dart, Rust, Python gibi dillere transpile edilebiliyor
  • F# topluluğunda “F#’daki F, Fun’dır” sözü var
    • Yazar da bizzat deneyince bunun doğru olduğunu, yalnızca eğlenceli değil aynı zamanda pratik de olduğunu söylüyor
  • Son olarak, “derleme başarılıysa çoğu şey düzgün çalışır” yaklaşımıyla F#’ın sunduğu kararlılık ve güvenilirlik de anılıyor

In sane type systems we trust!

1 yorum

 
GN⁺ 2025-04-03
Hacker News görüşleri
  • F#, bir Ruby on Rails uygulamasını yeniden yazarken en iyi fonksiyonel dildi

    • Haskell, Ocaml, Scala ve F# değerlendirildi
    • Microsoft teknolojilerine aşina olunmasa da ilk tercih F# oldu
    • Haskell, saflığı nedeniyle benimsenmesi zor bir seçenekti ve Ocaml ekosistemi yetersizdi
    • Scala karmaşık görünüyordu
    • F# ile başlamak kolaydı ve topluluk dost canlısı, akıllı ve yardım etmeye hazırdı
    • dotnet kütüphanelerine erişilebilen harika bir ekosistemi var
    • HTTP sunucularıyla kolay etkileşim kurulmasını sağlayan FsHttp gibi çok iyi kütüphane ve framework’ler var
    • WebSharper, tüm ekosistemler içindeki en iyi web framework’üydü
    • Araçlar en iyi durumda olmasa da dile yönelik büyük bir tutku var
  • F# denendi ama .NET ekosistemi yeniydi

    • hello world için çok sayıda proje dosyası ve boilerplate üretilmesine şaşırıldı
    • FP’yi, değişmezliği ve modern dilleri destekliyor ama iş sayısı az
    • Yapay zeka ile kolay kullanılabilen dillere yönelme eğilimi var
    • Hindistan’da durum daha kötüydü ama AB’de Java/TypeScript ile sürdürülebilir bir yaşam kurulabiliyor
    • Kotlin + TypeScript ile iyi maaşlı iş bulmak zor
  • Bizim şirketimiz 6 yıl önce C#’tan F#’a geçti

    • C tarzı dillerden geçiş zor ama buna değer
    • Derleme hızı yavaş ve hot reload desteklenmiyor
    • Profesyonel olarak kullanma fırsatı az
    • Geliştirici işe almak zor olabilir
  • F# benimsenmesinin duraklamasının nedeni kötü build sistemi

    • Rust harika bir dil ama birçok problem alanı için uygun değil
    • Rust’ı seçme nedeni build sistemi
    • Kâr amacı gütmeyen vakıfları olan ve birçok şirket tarafından desteklenen dillerin bile hâlâ kötü build sistemleri var
  • F# 2013’te öğrenildi ve çok eğlenceliydi

    • Kullanıcı deneyimi iyi değildi
    • İsimlendirme kuralları, fonksiyon çağırma stili, varsayılan sözdizimi, tip sistemi özellikleri ve IDE desteğiyle ilgili sorunlar vardı
    • Scala’ya geçildi ve F#’tan daha tutarlı hissettirdi
    • F# ilk fonksiyonel dildi ve programlamaya bakışı değiştirdi
  • F#, tüm kullanıcılarının çok memnun olduğu nadir örneklerden biri

    • .NET ekosistemine aşina olunduğu için öğrenmesi kolay gibi görünüyor
    • Hangi iş akışlarının en büyük faydayı sağlayabileceği merak ediliyor
  • C#, F#’ın birçok özelliğini kazandıkça F#’ın avantajı azalıyor

    • C# kodu çoğunlukla fonksiyonel tarzda yazılıyor ama kütüphaneleri doğal biçimlerinde kullanabilme avantajı var
  • Tamamen F# ile yazılmış kârlı bir SaaS var

    • 3dpack.ing
    • F# ile yazılmış bir Rust ray tracer, WebAssembly’ye derleniyor
    • fable-raytracer
  • F# harika bir dil

    • Tek satır bile yazılmasa da harika bir örnek dil
    • fsharpforfunandprofit.com sık sık referans alınıyor
  • F# güzel ama akıcı biçimde kullanmak zordu

    • C# hakkında çok az şey bilindiği için F#’ın nesne yönelimli yaklaşımını anlamak zordu
    • Aynı sorun Clojure ve Scala’da da yaşandı
    • Önce C# ya da Java öğrenmek istenmiyor