# F# Compiler, Core Library, and Editor Tools

## 概要

本プロジェクトは、Microsoft .NET向けの関数型プログラミング言語F#のコンパイラ、コアライブラリ（FSharp.Core）、およびVisual Studioエディタツールの公式リポジトリです。F# Software Foundationと連携して開発が進められており、.NETをサポートする全てのOS（Windows、Linux、macOS）上で開発・ビルドが可能です。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| F# コンパイラ (fsc) | F#ソースコードを.NET ILにコンパイルする |
| F# Interactive (fsi) | 対話的なF#スクリプト実行環境を提供する |
| FSharp.Core | F#の基本型、コレクション、非同期処理等のコアライブラリ |
| FSharp.Compiler.Service | IDE・ツール向けにコンパイラ機能をAPIとして公開 |
| Visual Studio統合 | Visual Studio用のF#言語サービスおよびエディタ機能 |
| Language Server | LSPベースの言語サーバー機能 |
| NuGet依存関係マネージャ | スクリプトファイルでのNuGetパッケージ参照をサポート |

## 技術スタック

### コア

- フレームワーク: .NET 10.0 / .NET Standard 2.0 / 2.1
- 言語: F#
- ビルドシステム: MSBuild, .NET SDK
- レクサー/パーサー生成: FsLex, FsYacc
- CI/CD: Azure DevOps Pipelines

### 主要ライブラリ

- System.Collections.Immutable
- System.Reflection.Metadata
- System.Reflection.Emit
- System.Memory
- System.Buffers
- System.Diagnostics.DiagnosticSource
- Microsoft.Build.Framework
- Microsoft.Build.Tasks.Core
- Microsoft.Build.Utilities.Core

## ディレクトリ構成

```
fsharp-main/
├── src/                          # ソースコード
│   ├── Compiler/                 # F#コンパイラ本体 (FSharp.Compiler.Service)
│   │   ├── AbstractIL/           # ILの抽象表現
│   │   ├── Checking/             # 型チェック
│   │   ├── CodeGen/              # コード生成
│   │   ├── Driver/               # コンパイラドライバ
│   │   ├── Facilities/           # ユーティリティ機能
│   │   ├── Interactive/          # F# Interactive
│   │   ├── Optimize/             # 最適化
│   │   ├── Service/              # 言語サービスAPI
│   │   ├── Symbols/              # シンボルAPI
│   │   ├── SyntaxTree/           # 構文木
│   │   ├── TypedTree/            # 型付き構文木
│   │   └── Utilities/            # ユーティリティ
│   ├── FSharp.Core/              # F#コアライブラリ
│   ├── FSharp.Build/             # MSBuildタスク
│   ├── FSharp.Compiler.Interactive.Settings/
│   ├── FSharp.Compiler.LanguageServer/
│   ├── FSharp.DependencyManager.Nuget/
│   ├── fsc/                      # fscコンパイラ実行ファイル
│   └── fsi/                      # fsi実行ファイル
├── tests/                        # テストスイート
│   ├── FSharp.Compiler.ComponentTests/
│   ├── FSharp.Compiler.Service.Tests/
│   ├── FSharp.Core.UnitTests/
│   ├── FSharp.Build.UnitTests/
│   └── benchmarks/               # パフォーマンスベンチマーク
├── vsintegration/                # Visual Studio統合
│   ├── src/
│   │   ├── FSharp.Editor/        # VSエディタ拡張
│   │   ├── FSharp.LanguageService/
│   │   └── FSharp.VS.FSI/
│   └── tests/
├── buildtools/                   # ビルドツール (fslex, fsyacc等)
├── docs/                         # ドキュメント
├── eng/                          # エンジニアリング・ビルド設定
└── setup/                        # セットアップスクリプト
```

## セットアップ

### 必要条件

- .NET SDK 10.0.101（global.jsonで指定されたバージョン）
- Windows環境の場合：Visual Studio 2022 Preview（.NETデスクトップ開発、VS拡張開発ワークロード）
- Linux/macOS環境の場合：.NET SDKのみ

### インストール手順

1. リポジトリをクローン
   ```shell
   git clone https://github.com/dotnet/fsharp.git
   cd fsharp
   ```

2. ビルドを実行
   - Windows:
     ```shell
     build.cmd
     ```
   - Linux/macOS:
     ```shell
     ./build.sh
     ```

3. Visual Studioで開発する場合は、以下のソリューションを開く
   - `FSharp.sln` - コンパイラとコアライブラリ
   - `VisualFSharp.sln` - 上記 + Visual Studio統合ツール

### 非公開SDKの使用

リポジトリが非公開の.NET SDKバージョンを必要とする場合：
```shell
# Linux/macOS
./eng/common/dotnet.sh

# Windows
.\eng\common\dotnet.cmd
```

## 開発

### コーディング規約

- ファイルごとにコーディング規約は異なる
- [F# Style Guide](https://learn.microsoft.com/dotnet/fsharp/style-guide/)に従う
- Fantomasによる自動フォーマット（一部ファイルのみ）
  ```shell
  dotnet fantomas .         # フォーマット実行
  dotnet fantomas . --check # フォーマットチェック
  ```

### ビルドオプション

```shell
# Visual Studio依存なしでビルド (Windows)
build.cmd -noVisualStudio

# Releaseビルド
build.cmd -c Release

# 特定の設定でビルド
build.sh --configuration Release
```

### テストの実行

```shell
# 全テスト実行
build -testAll -c Release

# 特定のテストスイート
build -testCompiler -c Release          # コンパイラテスト
build -testCompilerService -c Release   # コンパイラサービステスト
build -testFSharpCore -c Release        # FSharp.Coreテスト
build -testVs -c Release                # Visual Studio統合テスト
build -testScripting -c Release         # スクリプティングテスト
build -testCoreClr -c Release           # .NET Core/Linux/Mac対応テスト
```

### ベースラインの更新

```shell
# 環境変数を設定
# Windows: $env:TEST_UPDATE_BSL=1
# Linux/macOS: export TEST_UPDATE_BSL=1

# テスト実行後にベースラインが更新される
```

### XLFローカライゼーションファイルの更新

```shell
dotnet build src/Compiler /t:UpdateXlf
```

### カスタムコンパイラの使用

ビルド後、`artifacts/bin`に出力されたコンパイラを使用する場合、プロジェクトファイルに以下を追加：
```xml
<PropertyGroup>
    <DotnetFscCompilerPath>path/to/fsc.dll</DotnetFscCompilerPath>
</PropertyGroup>
```
