5P by GN⁺ 1일전 | ★ favorite | 댓글 1개
  • F#은 .NET을 타깃으로 하는 ML 계열 함수형 언어이며, Microsoft에서 개발. 주로 객체지향인 C#에 비해 F#은 함수형 프로그래밍 패러다임에 집중함
  • 이 글은 F#의 언어 특징, 생태계, 문서화 상태, 개발 도구, 활용 사례, 커뮤니티 현황, F# vs. OCaml 등을 정리

F#이란?

  • F#은 간결하고 견고하며 성능 좋은 코드를 작성하기 위한 범용 프로그래밍 언어
  • 복잡한 문법에 신경 쓰지 않고, 문제 해결 자체에 집중할 수 있도록 설계됨
  • 오픈소스, 크로스 플랫폼, .NET과의 높은 호환성을 가짐
  • 특징

    • 가벼운 문법과 기본 불변성
    • 타입 추론 및 일반화
    • 일급 함수, 강력한 자료형, 패턴 매칭
    • 비동기 프로그래밍(Async) 지원
    • 유명한 **파이프라인 연산자 (|>)**의 원조 언어
  • 간단한 예제 코드

    open System  
    let names = [ "Peter"; "Julia"; "Xi" ]  
    let getGreeting name = $"Hello, {name}"  
    names |> List.map getGreeting |> List.iter (printfn "%s")  
    
  • F#은 2005년 Microsoft Research에서 Don Syme이 개발한 언어로 시작됨
    • **OCaml을 .NET 플랫폼에 이식하는 연구 프로젝트(Caml.NET)**에서 출발
    • 이후 2010년부터 정식 제품으로 편입되었고, 2024년에는 F# 9.0이 출시됨
    • 2025년 현재는 20주년을 맞이한 성숙한 언어로 자리매김
  • F#을 실험하게 된 주요 이유
    • .NET이 오픈소스 및 크로스 플랫폼으로 진화한 점 확인
    • OCaml 대비 장단점 비교
    • Rider, Ionide 등 툴링에 대한 긍정적 평가
    • 단순한 언어 탐험에 대한 흥미

언어로서의 F#

  • F#은 ML 계열 함수형 언어로, OCaml 사용자에게는 익숙한 문법을 가짐
  • Haskell이나 Lisp 사용 경험이 있는 개발자도 쉽게 적응 가능함
  • 공백 기반 문법 구조로, Python처럼 들여쓰기가 문법적으로 중요
  • 초보자도 빠르게 기본 문법을 익힐 수 있도록 설계됨
  • 언어 특징 요약

    • 함수 정의와 적용이 간결하며 자연스러운 방식으로 표현 가능함
    • 조건문, 반복문, 튜플, 리스트 처리 등이 함수형 스타일로 깔끔하게 사용 가능함
    • 레코드, 열거형(Discriminated Union), 패턴 매칭을 통해 복잡한 데이터 구조를 간결하게 다룸
    • 파이프라인 연산자(|>)를 통해 데이터 흐름을 함수 연결처럼 시각적으로 명확하게 구성할 수 있음
    • F#은 ad-hoc 스크립트 작성에 매우 적합하며, .fsx 파일로 작성 후 dotnet fsi로 바로 실행 가능함
    • REPL 환경도 제공되어 탐색적 프로그래밍에 유리함
  • 사용자 친화적인 문법

    • 한 줄 및 여러 줄 주석, mutable 변수, 리스트 슬라이스 등 실용적인 문법 기능 포함
    • C#과의 높은 호환성 덕분에 .NET API를 쉽게 사용할 수 있음
    • 다양한 타입에 대한 연산자 오버로드도 자연스럽게 지원함
    • printfn으로 다양한 타입을 손쉽게 출력할 수 있어 디버깅과 로깅에 유용함
  • 비동기 프로그래밍의 선구자

    • async/await 패턴의 원조는 F# 2.0으로, 이후 C#과 JavaScript 등 여러 언어에 영향을 줌
    • F#은 비동기 프로그래밍을 콜백 없이도 직관적으로 구현할 수 있는 구조를 제공함
    • 코드 흐름이 동기식처럼 읽히지만, 실제로는 비동기로 동작함
  • Microsoft의 투자와 언어 발전

    • Microsoft는 오랜 기간 F#에 제한적인 인력을 할당했으나, 2022년 프라하에 전담 팀을 구성하며 본격 투자 시작
    • F# 8.0, 9.0의 릴리스를 통해 언어 및 툴링이 빠르게 개선되고 있음
    • Microsoft의 내부 관심이 늘어나면서 미래 발전 가능성도 기대할 수 있음

F#은 배우기 쉬우면서도 강력한 타입 시스템과 함수형 프로그래밍 패러다임을 갖춘 실용적인 언어이며, 특히 .NET 기반 프로젝트에서 함수형 접근법을 도입하고 싶은 개발자에게 매우 매력적인 선택지

생태계(Ecosystem)

  • F#은 상대적으로 짧은 기간 동안 사용해 본 결과, 순수 F# 전용 라이브러리나 프레임워크는 많지 않음
  • 대부분의 사용자들은 .NET의 기본 API와 C# 위주로 설계된 서드파티 라이브러리에 의존하고 있음
  • 이는 Scala, Clojure, Groovy 같은 **호스트 언어(hosted language)**에서는 흔히 볼 수 있는 현상임
  • 웹 개발용 주요 라이브러리

    • Giraffe: ASP.NET Core 기반의 경량 웹 프레임워크로, 함수형 스타일을 지향함
    • Suave: 라우팅과 작업 구성을 위한 컴비네이터 스타일의 간단한 웹 서버 프레임워크
    • Saturn: Giraffe 위에 구축된 MVC 스타일 프레임워크, Ruby on Rails 및 Phoenix에서 영감받음
    • Bolero: WebAssembly와 Blazor 기반의 클라이언트 애플리케이션 개발 프레임워크
    • Fable: F#을 JavaScript로 트랜스파일하여 React, Node.js 등의 JS 생태계와 연동 가능하게 함
    • Elmish: Fable과 함께 자주 사용되는 MVU(Model-View-Update) 패턴 기반의 UI 프레임워크
    • SAFE Stack: Saturn, Fable, Elmish, Azure 등을 조합한 엔드투엔드 함수형 웹 개발 스택
  • 데이터 사이언스용 주요 라이브러리

    • Deedle: pandas 스타일의 데이터 분석 및 조작 라이브러리
    • DiffSharp: 머신러닝과 자동 미분 기능을 제공하는 수학 중심 라이브러리
    • FsLab: 시각화, 통계 분석 도구 등을 포함한 데이터 사이언스 통합 툴킷

문서화 상태

개발 도구(Dev Tooling)

  • F#의 개발 도구 생태계는 과거에는 Visual Studio에만 최적화되어 있었고, 그 외 에디터에 대한 지원은 부족했음
  • 다행히도 지난 10년간 도구 환경이 크게 개선되었음
  • 기술적 전환점: FSharp.Compiler.Service(FCS)

    • FCS는 F# 컴파일러, 편집기 지원 기능, 스크립팅 엔진을 포함한 단일 라이브러리로, 다양한 에디터 및 툴링 환경에서 F#을 사용할 수 있게 함
    • 이로 인해 VS Code, 문서 생성기, 대체 백엔드 등에 F# 지원이 가능해졌고, 생태계 확장을 이끔
    • 대표적인 예로 Ionide는 VS Code에서 풍부한 F# 지원을 제공하며, 100만 다운로드 이상 기록
  • 테스트한 에디터들

    • Emacs (fsharp-mode): 기본적인 기능 제공, TreeSitter 미지원, 개발 활동 적음
    • Zed: F# 지원은 제한적
    • Helix: 기본 지원 있음
    • VS Code (Ionide 플러그인): 가장 완성도 높은 환경 중 하나
    • JetBrains Rider: 상용 IDE지만 F# 지원이 매우 강력함

    대부분의 기능은 F# 언어 서버(fsautocomplete) 기반으로 작동하며, LSP 지원이 좋은 에디터는 모두 사용 가능

  • 아쉬운 점

    • fsharp-mode는 오래된 코드베이스 기반이며 발전이 느림
    • Zed는 기능이 부족
    • VS Code는 일부 기능(예: 선택 영역 확장/축소)이 제대로 동작하지 않음
    • 키바인딩/모달 모델 문제로 인해 VS Code를 불편하게 느끼는 사용자도 존재함
  • 코드 포매터 및 린터

    • Fantomas: F# 공식 코드 포매터로, 대부분의 사용자 및 팀이 사용 중
    • FSharpLint: 한때 인기 있었으나 현재는 사실상 중단됨
    • 그러나 강력한 컴파일러 덕분에 린터 의존도가 낮음
  • 기타 도구

    • Paket: .NET을 위한 의존성 관리자 (npm, pip, bundler와 유사)
    • FAKE: 빌드 스크립트를 F#으로 작성할 수 있는 DSL, Ruby의 rake와 유사

활용 사례(Use Cases)

  • .NET의 폭넓은 생태계 덕분에 F#은 다양한 분야에서 활용 가능성 존재
  • 특히 타입 프로바이더(Type Providers) 기능 덕분에 데이터 분석 및 조작 작업에 매우 적합함
  • 백엔드 서비스, 전체 스택 애플리케이션 개발에도 적절하며, 일부 도구들은 프론트엔드 개발까지 가능하게 해줌
  • 주요 활용 영역

    • 데이터 분석: F#의 타입 프로바이더를 활용해 정적 타입 기반의 데이터 조작 가능
    • 백엔드 서비스: .NET의 강력한 웹 프레임워크와 함께 F# 사용 가능
    • 프론트엔드 앱: Fable과 Elmish를 통해 JS 생태계와 통합된 UI 개발 가능
      • Fable 4부터는 TypeScript, Rust, Python 등 다양한 언어로도 트랜스파일 가능
  • Fable 예시 (간단한 트랜스파일 명령)

    • 자바스크립트:
      dotnet fable
    • 타입스크립트:
      dotnet fable --lang typescript
    • 파이썬:
      dotnet fable --lang python

커뮤니티 상황

  • 전체적으로 커뮤니티는 크지 않으며 OCaml보다도 작을 수 있음
  • RedditDiscord 채널이 가장 활발한 커뮤니케이션 공간
  • Slack 커뮤니티도 존재하지만 초대 자동화 시스템 문제로 접근이 어려움
  • Microsoft의 커뮤니티 내 역할은 불분명하며, 커뮤니티 주도성이 강한 편
  • 커뮤니티에서 운영 중인 주요 리소스

인기와 현실 (The Popularity Contest)

  • F#은 대부분의 인기 지표(TIOBE, StackOverflow, 구인 공고 등)에서 높은 순위에 있지는 않음
  • 하지만 이는 대부분의 함수형 언어들이 처한 현실이기도 하며, F#만의 문제는 아님
  • 여전히 주류는 아니지만, Clojure, OCaml, Emacs Lisp과 같은 다른 함수형 언어들과 비슷한 수준의 사용자층을 가짐
  • 왜 F#을 쓸까?

    • 취업 가능성 외에도 프로그래밍 언어를 선택하는 이유는 다양함
      • 재미를 위해 (F#의 F는 “Fun”을 의미한다는 말도 있음)
      • 새로운 패러다임과 아이디어 학습
      • 익숙한 사고방식에서 벗어나 다른 방식으로 사고하는 훈련
  • 관련 자료

F# vs OCaml 비교

F#의 초기 목적은 OCaml의 장점을 .NET으로, .NET의 장점을 OCaml로 가져오는 것이었음
– Don Syme, F#의 창시자

  • F#은 OCaml에서 영감을 받아 개발되었으며, 초반에는 .ml, .mli 파일 확장자도 지원했을 만큼 유사성이 높았음
  • 시간이 지나며 점점 독립된 언어로 진화했고, 이제는 각자의 방향으로 발전하고 있음
  • F#의 장점

    • .NET 플랫폼 기반
      • 방대한 수의 라이브러리 활용 가능
    • Microsoft의 지원
    • 초보자 친화적
      • 객체지향 언어(C# 등) 사용 경험자에게 익숙한 문법
      • 컴파일러의 오류 메시지가 비교적 명확함
      • 디버깅 경험이 더 직관적
    • 비동기 프로그래밍 지원이 강력함
    • OCaml에 없는 기능 제공
      • 익명 레코드
      • 액티브 패턴
      • 계산 표현식 (computational expressions)
      • 시퀀스 컴프리헨션
      • 타입 프로바이더 (type providers)
      • 단위 계산 (units of measure)
  • F#의 단점

    • .NET 플랫폼 기반
      • 언어 설계에서 .NET과의 상호 운용을 위한 타협이 많음 (null 허용 등)
    • Microsoft의 소유
      • 마이크로소프트에 대한 선호도 차이 존재
      • 비교적 적은 리소스가 F#에 배정됨
      • 장기적으로 MS가 F#을 얼마나 지원할지는 불확실함
    • 이름 관련 문제
      • PascalCase, camelCase 네이밍 컨벤션이 싫은 사람에게는 불편할 수 있음
      • F#이라는 이름은 검색이나 파일 이름에서 문제를 일으킬 수 있음 (그래서 FSharp으로도 자주 표기됨)
    • OCaml에 있는 고급 기능 부재
      • 일급 모듈, 펑터(functor)
      • GADT 지원 부족
    • 마스코트가 없고 낙타도 없음
  • 공통점 및 상호 비교

    • 두 언어 모두 JavaScript 런타임 타깃이 가능함
      • F#: Fable
      • OCaml: js_of_ocaml, Melange
    • 현재는 Fable이 더 성숙한 느낌이지만, 실사용 경험은 더 필요함
    • 둘 다 강력하지만 니치한 언어이며, 당분간 폭넓은 대중 언어가 될 가능성은 낮음
    • F#은 기존 C# 코드베이스에 조금씩 스며들 수 있는 실용성이 있음
    • 단점 하나는 F# 프로젝트는 아직도 XML 기반의 프로젝트 파일을 사용하고, 컴파일 순서를 수동으로 지정해야 함
      • 이는 OCaml의 빌드 시스템인 Dune과 비교할 때 번거롭게 느껴질 수 있음
    • 교육적 목적이나 언어 구조 학습에는 OCaml이 적합할 수 있음
    • 실용적인 웹 서비스나 백엔드 개발 목적이라면 F#이 더 나은 선택일 수 있음
    • 특히 .NET과 잘 통합되면서도 함수형 스타일을 유지할 수 있는 언어로서 F#은 매우 강력한 도구임

마무리 소감

  • 글쓴이는 F#을 생각보다 훨씬 더 재미있고 실용적인 언어로 느꼈음
    • 과거 Clojure를 처음 접했을 때와 비슷한 느낌을 받았다고 표현함
    • 특히 Clojure가 Java와의 뛰어난 상호운용성 덕분에 가장 실용적인 Lisp였던 점을 상기시킴
  • 만약 .NET이 처음부터 오픈소스이자 포터블했더라면,
    • ClojureCLR이 지금보다 더 인기를 끌었을 가능성
    • F#의 커뮤니티와 생태계도 더 성장했을 것이라는 아쉬움을 전함
  • F#이 2010년까지 오픈소스가 아니었다는 점도 초기 채택에 방해가 되었음

".NET과 F# 모두 초기에 오픈소스가 아니었던 것이 가장 큰 실수였으며, 이로 인해 많은 기회를 잃었음" – Don Syme

  • OCaml도 배우기 어렵지 않지만, ML 계열 언어를 처음 배우는 사람에게는 F#이 더 쉬울 수 있음
    • 프로덕션까지 가는 진입장벽도 더 낮음
  • 특히 .NET 경험이 있는 개발자라면 F#을 반드시 경험해볼 가치가 있다고 강조함
    • F#은 독립적인 언어로서 훌륭할 뿐만 아니라, .NET의 강력한 생태계를 활용할 수 있는 기회를 제공함
  • Fable 같은 툴을 통해 F# 코드를 JavaScript, Dart, Rust, Python 등으로 트랜스파일링 가능함
  • F# 커뮤니티에서는 "F#의 F는 Fun(재미)이다"라는 말이 있음
    • 글쓴이도 직접 써보며 이 말이 사실이라고 느꼈고, 재미있을 뿐 아니라 실용적이기까지 하다고 강조함
  • 마지막으로 "컴파일이 성공하면 대부분 잘 작동한다"는 F#의 안정성과 신뢰성도 언급함

In sane type systems we trust!

Hacker News 의견
  • F#는 Ruby on Rails 앱을 다시 작성할 때 가장 좋은 함수형 언어였음

    • Haskell, Ocaml, Scala, F#를 고려했음
    • Microsoft 기술에 익숙하지 않았지만 F#가 첫 선택이 되었음
    • Haskell은 순수성 때문에 채택하기 어려웠고, Ocaml의 생태계는 부족했음
    • Scala는 복잡해 보였음
    • F#는 시작하기 쉬웠고, 커뮤니티는 친절하고 똑똑하며 도움을 줄 준비가 되어 있었음
    • dotnet 라이브러리에 접근할 수 있는 훌륭한 생태계가 있음
    • http 서버와 쉽게 상호작용할 수 있는 FsHttp 같은 훌륭한 라이브러리와 프레임워크가 있음
    • WebSharper는 모든 생태계 중 최고의 웹 프레임워크였음
    • 도구가 최상의 상태는 아니지만 언어에 대한 열정이 큼
  • F#를 시도했지만 .NET 생태계에 새로웠음

    • "hello world"를 위해 많은 프로젝트 파일과 보일러플레이트가 생성되어 놀랐음
    • FP, 불변성, 현대 언어를 지지하지만, 일자리가 부족함
    • AI와 쉽게 사용할 수 있는 언어를 선호하는 경향이 있음
    • 인도에서는 상황이 더 나빴지만, EU에서는 Java/TypeScript로 지속 가능한 생활을 할 수 있음
    • Kotlin + TypeScript로 잘 지불하는 직업을 찾기 어려움
  • 우리 회사는 6년 전 C#에서 F#로 전환했음

    • C 스타일 언어에서 전환하기 어렵지만 가치가 있음
    • 컴파일 속도가 느리고 핫 리로드가 지원되지 않음
    • 전문적으로 사용할 기회가 적음
    • 개발자를 고용하는 것이 어려울 수 있음
  • F#의 채택이 정체된 이유는 나쁜 빌드 시스템 때문임

    • Rust는 훌륭한 언어지만 많은 문제 도메인에 적합하지 않음
    • Rust를 선택하는 이유는 빌드 시스템 때문임
    • 비영리 재단이 있고 여러 기업이 지원하는 언어들이 여전히 나쁜 빌드 시스템을 가지고 있음
  • 2013년에 F#를 배웠고 많은 재미를 느꼈음

    • 사용자 경험이 좋지 않았음
    • 명명 규칙과 함수 호출 스타일, 기본 구문, 타입 시스템 기능, IDE 지원에 문제가 있었음
    • Scala로 전환했으며, F#보다 더 일관된 느낌을 받았음
    • F#는 첫 함수형 언어였고 프로그래밍에 대한 시각을 바꾸었음
  • F#는 모든 사용자가 매우 만족하는 드문 경우임

    • .NET 생태계에 익숙하여 배우기 쉬울 것 같음
    • 어떤 워크플로우가 가장 큰 이점을 얻을 수 있을지 궁금함
  • C#가 F#의 많은 기능을 얻으면서 F#의 장점이 줄어들고 있음

    • C# 코드를 주로 함수형 스타일로 작성하지만, 라이브러리를 본래의 방식으로 사용할 수 있는 장점이 있음
  • F#로 완전히 작성된 수익성 있는 SaaS가 있음

    • 3dpack.ing
    • F#로 작성된 Rust 레이 트레이서가 웹 어셈블리로 컴파일됨
    • fable-raytracer
  • F#는 훌륭한 언어임

    • 한 줄도 작성하지 않더라도 훌륭한 예시 언어임
    • fsharpforfunandprofit.com을 자주 참조함
  • F#는 아름답지만 유창하게 사용하기 어려웠음

    • C#를 조금만 알고 있어서 F#의 객체 지향 방법을 이해하기 어려웠음
    • Clojure와 Scala에서도 같은 문제를 겪었음
    • C#나 Java를 먼저 배우고 싶지 않음