C--
パラダイム | 命令型プログラミング |
---|---|
登場時期 | |
開発者 | サイモン・ペイトン・ジョーンズ、Norman Ramsey |
最新リリース | 2.0 / 2005年2月23日[1] |
影響を受けた言語 | C言語 |
ウェブサイト | |
拡張子 | c-- |
C--(シーマイナスマイナス)は、人間ではなくコンパイラが生成することを想定したC言語風のプログラミング言語(中間言語)である。Haskell処理系のデファクトスタンダードであるGlasgow Haskell Compilerが、複数ある中間言語の一つとして採用している。
歴史
[編集]1990年代、マルチプラットフォームのプログラミング言語は、元言語ソースコードをC言語ソースコードへトランスパイルして、C言語ソースコードを対象プラットフォームマシンコードへコンパイルしていた[2]。C言語コンパイラは多様なプラットフォームのマシンコード出力をサポートしていたため、C言語を中間言語として採用することは現実的に利にかなった手法である。しかし、C言語は人間が読み書きするプログラミング言語として設計されているため、機械が処理してトランスパイルして生成する中間言語としては最適設計ではなかった。例えば、C言語ではガベージコレクションや例外処理は意図的に言語仕様に組み込んでおらず、それらの機能を利用したプログラミング言語からC言語へのトランスパイルは一部機能が利用不可となる制限がありえた。
1997年、それらの課題を解決するため、ノーマン・ラムゼーはC--をImplementing Functional LanguagesワークショップでC--: A Portable Assembly Languageのタイトルで、コンパイラが扱うC言語に代わる中間言語として発表した[3]。C--は人間が読み書きするプログラミング言語としての特性より機械が処理する中間言語としての特性を重視し、多種プログラミング言語をフロントエンドに置きうるバックエンド仕様、マルチプラットフォームのマシンコード値型、ガベージコレクション・例外処理などのランタイムインターフェースを提供した。
1999年5月23日、C--バージョン1の言語仕様リファレンスがリリースされた[4]。
2005年2月23日、C--バージョン2の言語仕様リファレンスがリリースされた[5]。
2003年10月6日から2006年10月31日までの間、C--およびQuick C--の開発はアメリカ国立科学財団の支援を受けていた[6]。
設計
[編集]C--は、人間が読み書きするためのプログラミング言語としてではなく、マシンが解釈するアセンブリ言語として設計されている。C--コードは極力プラットフォームアーキテクチャに依存せず、直交性・最小性より性能・利便性を重要視した言語仕様である。C--の文法は、C言語の言語仕様に似たプログラミング言語の特徴を持っている[7]。
- データ
- プリミティブ型・参照型で定義される。プリミティブ型には16bit正数値のint型、 8bit文字のchar型、真偽値のboolean型がある。参照型にはプリミティブ型配列の配列型、複数型から成る構造体型がある。文字列はchar配列で表される。
- 変数
- スタック型・ヒープ型で定義される。関数内のローカル変数はスタック変数、関数外のグローバル変数はヒープ変数として扱われる。
- 関数
- 関数名・返り値型・ブロック文で定義される。返り値は無を返す場合でも省略することは出来ず、キーワードvoidの返却を明記する。
- 演算子
- C言語演算子を踏襲した比較演算・四則演算・ビット演算などが定義される。
- 文
- 空文・式文・ブロック文・if文・while文・do-while文・for文・return文・break文・continue文で定義される。
処理系
[編集]C--コードをマシンコードにコンパイルする処理系は複数存在する[8]。2018年現在、大半の処理系がソースコードの公開を含めメンテナンスされていない。
- Quick C--
- Quick C--は、The Quick C-- Teamが開発するコンパイラである[9]。C--バージョン2のC--コードをIntel x86のLinuxマシンコードへコンパイルする。他プラットフォームのマシンコードへのコンパイルは試験版機能として実装されている。従来はC--言語仕様の開発と平行してQuick C--が開発されていたが、2018年現在はgithubにソースコードが保管されているのみで開発は継続していない[10]。
- 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--コンパイラである[11]。Quick C--の開発が始まってからはメンテナンスは継続していない。
類似言語
[編集]- Universal Computer Oriented Language
- Universal Computer Oriented Language(UNCOL)は、1958年にメルヴィン・コンウェイが提唱した中間言語である[12]。言語仕様として完全なものは存在しておらず、プログラミング言語とコンパイラの在り方に対する新しいコンセプトとして提案された。
- GNU Assembler
- GNU Assembler(GAS)は、1986年代に発表されたGCCのアセンブリ言語である[13]。GCCはC/C++ソースコードからGASソースコードへトランスパイルして、GASソースコードで処理最適化を実施してから、対象プラットフォームのマシンコードへコンパイルする。GCCはC/C++以外のプログラミング言語にも対応しており、他プログラミング言語のコンパイルでも同様の処理を経てマシンコードを出力する。
- LLVM Assembly
- LLVM Assembly(LLVM IR)は、2000年代以降に開発されているLLVMの中間言語である[14]。LLVMはコンパイルのバックエンド処理を主に担うコンパイラコンポーネントである。フロントエンド処理を担うのはclang・rustc・swiftcなどのプログラミング言語毎の異なるコンポーネントである。LLVMはLLVM IRソースコードで処理最適化を実施してから、対象プラットフォームのマシンコードへコンパイルする。
脚注
[編集]- ^ 出典URL: https://www.cs.tufts.edu/~nr/c--/extern/man2.pdf
- ^ Christopher Heng (30 August, 2017). “Free Modula-3 Compilers and Development Environment”. 2018年4月22日閲覧。 “It uses the GNU C Compiler as a backend to generate binaries.”
- ^ Norman Ramsey (2007年2月5日). “C--: A Portable Assembly Language”. 2018年4月22日閲覧。
- ^ Norman Ramsey (May 23, 1999). “The C-- Language Specification Version 2.0”. 2018年4月22日閲覧。
- ^ Norman Ramsey (2007年2月5日). “C-- Manual Version 1” (pdf). 2018年4月22日閲覧。
- ^ “NSF Award Search: Award#0325460 - ITR Collaborative Research: A Reusable, Extensible, Optimizing Back End”. National Science Foundation. 2018年4月22日閲覧。
- ^ 柳 洋輔 (2015年9月15日). “C--言語からC言語への変換系の実用化”. 2018年4月22日閲覧。
- ^ Norman Ramsey (2007年2月5日). “C-- Downloads - Other C-- compilers”. 2018年4月22日閲覧。
- ^ The Quick C-- Team (January 24, 2014). “Release notes for the Quick C-- compiler Release 20140124” (pdf). 2018年4月22日閲覧。
- ^ Norman Ramsey (Jan 25, 2014). “The Quick C-- Compiler”. 2018年4月22日閲覧。
- ^ “Pacsoft Research C-- Compiler”. Pacific Software Research Center. (Mar 4, 1998). 2007年8月16日時点のオリジナルよりアーカイブ。 Template:Cite webの呼び出しエラー:引数 accessdate は必須です。
- ^ Melvin E. Conway. “Proposal for an UNCOL”. Communications of the ACM. 2018年4月22日閲覧。
- ^ Dean Elsner. “Using as The gnu Assembler” (pdf). The Regents of the University of Michigan. 2018年4月22日閲覧。
- ^ “LLVM IR and Transform Pipeline” (pdf). 2018年4月22日閲覧。
外部リンク
[編集]- C-- Home - 公式ウェブサイトのミラーサイト(公式ウェブサイトは消滅)
- GitHub nrnrnr/qc-- - Quick C--コンパイラ(メンテナンス終了)