# CoffeeScript

## 概要

CoffeeScriptは、JavaScriptにコンパイルされるプログラミング言語です。「Unfancy JavaScript」をコンセプトに、より簡潔で読みやすい構文でJavaScriptを記述できます。サーバーサイド（Node.js）とブラウザの両方で動作し、コマンドラインコンパイラまたはブラウザ内での直接実行が可能です。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| コンパイル | CoffeeScriptコードをJavaScriptにコンパイル |
| REPL | 対話型実行環境（Read-Eval-Print Loop）の提供 |
| ソースマップ | デバッグ用ソースマップの生成 |
| リテレートCoffeeScript | Markdown形式でのCoffeeScript記述サポート |
| JSXサポート | React JSX構文のサポート |
| ES6+互換 | クラス、ジェネレーター、async/await、import/exportのサポート |
| AST出力 | 抽象構文木（AST）のJSON出力 |
| Cake | CoffeeScript用ビルドツール（Make/Rakeライク） |

## 技術スタック

### コア

- 言語: CoffeeScript / JavaScript
- ランタイム: Node.js（v6以上）
- パーサー生成: Jison
- ライセンス: MIT

### 主要ライブラリ

- @babel/core / @babel/preset-env: ES6+トランスパイル
- babel-preset-minify: コード圧縮
- underscore: ユーティリティ関数
- jison: パーサー生成
- webpack: ブラウザ用バンドル
- puppeteer: テスト用ブラウザ自動化
- markdown-it: Markdownパース
- highlight.js: シンタックスハイライト
- codemirror: ドキュメントサイトのエディタ
- docco: ドキュメント生成

## ディレクトリ構成

```
coffeescript-main/
├── bin/                    # 実行可能ファイル
│   ├── coffee              # CoffeeScriptコンパイラ/実行CLI
│   └── cake                # Cakeビルドツール
├── src/                    # CoffeeScriptソースコード
│   ├── coffeescript.coffee # メインエントリ（コンパイルAPI）
│   ├── lexer.coffee        # 字句解析器
│   ├── parser.coffee       # 構文解析器（生成）
│   ├── grammar.coffee      # 文法定義
│   ├── nodes.coffee        # AST ノード定義
│   ├── rewriter.coffee     # トークン書き換え
│   ├── helpers.coffee      # ユーティリティ関数
│   ├── command.coffee      # CLIコマンド処理
│   ├── optparse.coffee     # オプションパーサー
│   ├── repl.coffee         # REPL実装
│   ├── register.coffee     # require拡張
│   ├── browser.coffee      # ブラウザ用ビルド
│   ├── cake.coffee         # Cakeビルドシステム
│   └── index.coffee        # モジュールエントリ
├── lib/                    # コンパイル済みJavaScript
│   ├── coffeescript/       # Node.js用ライブラリ
│   ├── coffeescript-browser-compiler-legacy/  # レガシーブラウザ用
│   └── coffeescript-browser-compiler-modern/  # モダンブラウザ用
├── test/                   # テストファイル
├── documentation/          # ドキュメントソース
├── docs/                   # 生成されたドキュメント
├── Cakefile                # ビルドタスク定義
├── package.json            # NPMパッケージ設定
└── README.md               # プロジェクトREADME
```

## セットアップ

### 必要条件

- Node.js v6以上

### インストール

```shell
# プロジェクトローカルにインストール
npm install --save-dev coffeescript

# グローバルにインストール（任意の場所で.coffeeファイルを実行可能に）
npm install --global coffeescript
```

## 開発

### ビルド

```shell
# パーサーとソースをビルド
node ./bin/cake build

# ソースのみビルド（パーサー生成をスキップ）
node ./bin/cake build:except-parser

# パーサーのみビルド
node ./bin/cake build:parser

# ブラウザ用ビルド
node ./bin/cake build:browser
```

### テスト

```shell
# テスト実行
npm test

# または
node ./bin/cake test

# Harmonyモードでテスト
npm run test-harmony
```

### 基本的な使用方法

```shell
# スクリプトを実行
coffee /path/to/script.coffee

# スクリプトをコンパイル
coffee -c /path/to/script.coffee

# コンパイル結果を標準出力に表示
coffee -p script.coffee

# REPLを起動
coffee
```

### コンパイルオプション

| オプション | 説明 |
| --- | --- |
| `-c, --compile` | JavaScriptにコンパイルして保存 |
| `-p, --print` | コンパイル結果を標準出力に表示 |
| `-o, --output [DIR]` | 出力ディレクトリを指定 |
| `-b, --bare` | トップレベル関数ラッパーなしでコンパイル |
| `-m, --map` | ソースマップを生成 |
| `-M, --inline-map` | インラインソースマップを生成 |
| `-w, --watch` | ファイル変更を監視して自動コンパイル |
| `--ast` | AST（抽象構文木）をJSON出力 |

### リソース

- ドキュメント: https://coffeescript.org/
- GitHub: https://github.com/jashkenas/coffeescript
- Issue報告: https://github.com/jashkenas/coffeescript/issues
- Changelog: https://coffeescript.org/#changelog
