C--

C--（シーマイナスマイナス）は、人間ではなくコンパイラが生成することを想定したC言語風のプログラミング言語（中間言語）である。Glasgow Haskell Compilerが、複数ある中間言語の一つとして採用している。（なお「C++の反対」として誰でも思いつく名前なので、この記事で述べるもの以外にも同名のものは多数あると思われる例えば、コンパイラの教育のためのプログラミング言語C--とその教材）

 歴史 
1990年代、マルチプラットフォームのプログラミング言語は、元言語ソースコードをC言語ソースコードへコンパイルして、それをCコンパイラで対象プラットフォームの機械語へコンパイルしていた。C言語コンパイラは多様なプラットフォームをサポートしていたため、C言語を中間言語として採用することは現実的に利にかなった手法である。しかし、C言語は人間が読み書きするプログラミング言語として設計されているため、Haskellコンパイラなどの中間言語としては最適設計ではなかった。例えば、C言語ではガベージコレクションや例外処理は意図的に言語仕様に組み込んでおらず、それらの機能を利用したプログラミング言語でC言語を中間言語とすると、効率良い実現が難しかったりした。

1997年、それらの課題を解決するため、ノーマン・ラムゼーはC--をImplementing Functional LanguagesワークショップでC--: A Portable Assembly Languageのタイトルで、コンパイラが扱うC言語に代わる中間言語として発表した。C--は人間が読み書きするプログラミング言語としての特性より機械が処理する中間言語としての特性を重視し、多種プログラミング言語をフロントエンドに置きうるバックエンド仕様、マルチプラットフォームのマシンコード値型、ガベージコレクション・例外処理などのランタイムインターフェースを提供した。

1999年5月23日、C--バージョン1の言語仕様リファレンスがリリースされた。

2005年2月23日、C--バージョン2の言語仕様リファレンスがリリースされた。

2003年10月6日から2006年10月31日までの間、C--およびQuick C--の開発はアメリカ国立科学財団の支援を受けていた。

 設計 
C--は、人間が読み書きするためのプログラミング言語としてではなく、マシンが解釈するアセンブリ言語として設計されている。C--コードは極力プラットフォームアーキテクチャに依存せず、直交性・最小性より性能・利便性を重要視した言語仕様である。C--の文法は、C言語の言語仕様に似たプログラミング言語の特徴を持っている。

 データ
 プリミティブ型・参照型で定義される。プリミティブ型には16bit正数値のint型、 8bit文字のchar型、真偽値のboolean型がある。参照型にはプリミティブ型配列の配列型、複数型から成る構造体型がある。文字列はchar配列で表される。
 変数
 スタック型・ヒープ型で定義される。関数内のローカル変数はスタック変数、関数外のグローバル変数はヒープ変数として扱われる。
 関数
 関数名・返り値型・ブロック文で定義される。返り値は無を返す場合でも省略することは出来ず、キーワードvoidの返却を明記する。
 演算子
 C言語演算子を踏襲した比較演算・四則演算・ビット演算などが定義される。
 文
 空文・式文・ブロック文・if文・while文・do-while文・for文・return文・break文・continue文で定義される。

 処理系 
C--コードをマシンコードにコンパイルする処理系は複数存在する。2018年現在、大半の処理系がソースコードの公開を含めメンテナンスされていない。

 Quick C--
 Quick C--は、The Quick C-- Teamが開発するコンパイラである。C--バージョン2のC--コードをIntel x86のLinuxマシンコードへコンパイルする。他プラットフォームのマシンコードへのコンパイルは試験版機能として実装されている。従来はC--言語仕様の開発と平行してQuick C--が開発されていたが、2018年現在はgithubにソースコードが保管されているのみで開発は継続していない。
 cmmc
 cmmcは、Fermin ReigがML言語で実装したC--コンパイラである。Alpha・Sparc・X86のマシンコードを出力する。
 Trampoline C-- Compiler
 Trampoline C-- Compilerは、1999年5月にSergei Egorovが開発したC--からC言語へのトランスパイラである。
 Oregons Graduate Institutes C-- compiler
 Oregons Graduate Institutes C-- compiler（OGI C-- Compiler）は、1997年にML言語で実装された最初期のプロトタイプのC--コンパイラである。Quick C--の開発が始まってからはメンテナンスは継続していない。

 類似言語 

 Universal Computer Oriented Language（UNCOL）は、1958年にメルヴィン・コンウェイが提唱した中間言語である。言語仕様として完全なものは存在しておらず、プログラミング言語とコンパイラの在り方に対する新しいコンセプトとして提案された。
 GNU Assembler
 GNU Assembler（GAS）は、1986年代に発表されたGCCのアセンブリ言語である。GCCはC/C++ソースコードからGASソースコードへトランスパイルして、GASソースコードで処理最適化を実施してから、対象プラットフォームのマシンコードへコンパイルする。GCCはC/C++以外のプログラミング言語にも対応しており、他プログラミング言語のコンパイルでも同様の処理を経てマシンコードを出力する。
 LLVM Assembly
 LLVM Assembly（LLVM IR）は、2000年代以降に開発されているLLVMの中間言語である。LLVMはコンパイルのバックエンド処理を主に担うコンパイラコンポーネントである。フロントエンド処理を担うのはclang・rustc・swiftcなどのプログラミング言語毎の異なるコンポーネントである。LLVMはLLVM IRソースコードで処理最適化を実施してから、対象プラットフォームのマシンコードへコンパイルする。

 脚注 

  外部リンク 
 C-- Home - 公式ウェブサイトのミラーサイト（は消滅）
 GitHub nrnrnr/qc-- - Quick C--コンパイラ（メンテナンス終了）

Category:プログラミング言語