Ring (プログラミング言語)

Ring（リング）は動的型付けに対応した中東出身の汎用プログラミング言語である。言語キーワードや演算子のユーザ再定義機能、自然言語プログラミング、 C/C++プロジェクトへの組み込み、 C/C++コードを用いた機能拡張や言語単体での使用も可能である。命令型、手続き型、オブジェクト指向、関数型、メタプログラミング、入れ子構造を用いた宣言型、および自然言語プログラミングのプログラミングパラダイムに対応している。この言語は可搬性（Windows、Linux、macOS、Androidなど） があり、コンソール、GUI、ゲームとモバイルアプリケーションの開発で使用できる。

**経歴**
 2011年11月未明 新しいプログラミング言語のアイデアを思い付く- 2013年 9月未明 設計と実装の開始- 2015年 4月未明 言語の名称決定- 2015年 5月未明 コンパイラの完成- 2015年 9月未明 ドキュメンテーションの完成- 2016年 1月25日 Ring 1.0 公開- 2016年10月 6日 Ring 1.1 公開- 2017年 1月25日 Ring 1.2 公開- 2017年 5月15日 Ring 1.3 公開- 2017年 6月29日 Ring 1.4 公開- 2017年 8月21日 Ring 1.5 公開- 2017年11月30日 Ring 1.6 公開- 2018年 1月25日 Ring 1.7 公開- 2018年 6月25日 Ring 1.8 公開

**目的**
 アプリケーション開発用プログラミング言語- 生産性と拡張性に優れた高品質な解決方法の開発- 小型かつ高速な言語であり C/C++プロジェクトに組み込み可能- 教育用途およびコンパイラ・仮想計算機の概念の入門に使用できるシンプルなプログラミング言語- ドメイン特化ライブラリ、フレームワークおよびツールの作成に使用できる汎用プログラミング言語- ビジュアルプログラミング言語である Programming Without Coding Technology (PWCT) ソフトウェアの次世代版を作成するために設計された実用言語

**Hello Worldプログラム**
Ringには同じプログラムを異なる記法で記述できる機能がある。この用例は標準的な "Hello, World!" プログラムを三種類の異なる記法で表したものである。
第一記法:
See "Hello, World!"
第二記法:
Put "Hello, World!"
第三記法:
Load "stdlib.ring"
Print("Hello, World!")
また、このような自然言語プログラミング風の記法も可能である（試すにはConEmuなどUTF-8環境が必要）:
ChangeRingKeyword  See 手紙を出す
ChangeRingOperator + そして
改行 = nl
します。 = :します。
手紙を出す "こんにちは、世界" そして 改行 します。
ChangeRingKeyword 手紙を出す See // キーワードの復旧
ChangeRingOperator そして     + // 演算子の復旧

**コメント**
下記はRingのコメント記法である。なお、コメントはキーワードや演算子ではないためChangeRingKeywordやChangeRingOperatorでの再定義や変更はできない（Ring 1.7で確認済み）。
一行コメント:
// これはコメントです。
# これもコメントです。
一行コメント（BASIC言語風のユーザー定義）:
rem = :rem // 文字列として展開されるが命令文の意味を持たないのでエラーにはならない。
// または def rem comment_strings {}
def main
rem "これはコメントです。"
see "これはコメントです。" + nl // nl の代わりに ¥n も使用可能。
複数行コメント:
/* これはコメントです。
複数行に渡って書くことができます。
*/

**ブロック**
Ring では C/C++ のカーリーブラケットブロック、 Python のインデントブロック (は見た目だけであり、Ring の仕様上、特に意味を持たない) を使用できる。
カーリーブラケットブロック (変更時は ChangeRingOperator を使用する)
def main
{
see "Hello, World!"
return 0
} // ; は不要
インデントブロック
def main
see "Hello, World!"
return 0
// end は不要
Pascal風のブロック
ChangeRingKeyword func function
ChangeRingKeyword def  procedure
begin = :begin
function main
begin
see "Hello, World!"
return 0
end
ChangeRingKeyword function func
ChangeRingKeyword procedure def
また、改行やセミコロンよる文の区切りは不要であるため、一行で書くこともできる。
この機能は通常の一行記述のほか、自然言語プログラミング、難解プログラミング、ボイスコーディングで使用できる (Ring ではソースコードを中間コードへコンパイルして実行するため、この機能を使用したソースコードの難読化はあまり意味がない)。
def dummy x, y, z def yummy (x, y, z) {} def main　see "Hello, World!" return 0 end

**標準で付属している拡張機能**
下記は、フルインストール版（ファイルサイズが約100MBのもの）の導入直後から利用できる拡張機能である。これらは Ring 側で公式提供・保守継続されているため、他の言語で問題となるようなライブラリの依存関係に悩まされることがなく、破壊的な言語仕様の変更であっても突然使えなくなる心配が少ない利点もある。- RingAllegro（Allegro ゲームライブラリ）- RingConsoleColor（Yusuke Suzuki氏によるコマンドプロンプト用テキスト色付けライブラリ）- RungCurl（CURLライブラリ）- RingFreeGLUT（FreeGLUT）- RingInternet（インターネット関連ライブラリ）- RungLibUV（LibUV - 非同期I/Oライブラリ）- RingMurMurHash（ハッシュ関数ライブラリ）- RingMySQL (MySQL)- RingODBC (ODBC)- RingOpenGL (OpenGL 1.1 - 4.6)- RingOpenSSL (OpenSSL)- RingQt（Qtフレームワーク）- RingSDL（SDL - Simple DirectMedia Layer ライブラリ）- RingSQLite (SQLite)- RingZIP（zipファイル処理ライブラリ）
など。

**日本語への対応**
 Ringは8ビットクリーン設計でありエスケープ文字（¥n、¥tなど）を言語仕様として扱わない。 このため ShiftJIS/EUC-JP/UTF-8などの処理や判定はコンパイラ、インタプリタの大改修を行わずにライブラリを製作するだけで扱うことが可能である。 UTF-8についてはRingAllegro、RingQtで提供されている関数を使用する、または動作速度の面からCによる拡張機能を製作することが望ましい（例えばTcl/Tkのライブラリ関数、ICUなど）。- 日本語による変数や関数名の使用、自然言語ライブラリ、ChangeRingKeyword、ChangeRingOperator 命令による日本語キーワードへの変更の際にはUTF-8の使用が前提となる。
Shift JISでは Ring で予約されている演算子や括弧などASCII文字と ShiftJIS文字の2バイト目が重なってしまう領域があるため、「伝、義、真、実」などの漢字をキーワードや変数名に使うと誤認識でエラーとなる制限がある。ただし、誤認識されてしまう文字を使わずに類語などで置き換えることで実用は可能である。対策としては ソースコードは UTF-8 で保存。文字列や内部処理は ShiftJIS で行うことである。- 標準提供されている開発環境「Ring Notepad」と「Form Designer」のローカライズ版はテスト版が公開されている- Ring 1.8 から有志により非公式に日本語版取り扱い説明書のダウンロード版 (HTML, EPUB, CHM 形式) が提供されている(以前はオンライン版のみ)。CHM 形式のヘルプファイル (ring.chm) は日本語版と差し替えるだけでローカイズが可能となった。さらに EPUB 形式の提供により、書き込みやマーカー機能が利用できるようになった (対応しているリーダーソフトまたはハードが必要)。

**出典**

**外部リンク**
  Ring 公式ホームページ（リダイレクトの不具合で接続できない場合は  sourceforge側 へ）-  プログラミング言語Ring（非公式日本語版サイト） Ring 1.10 の紹介と邦訳資料の提供（Ring のライセンス適用）-  Ring 1.10 邦訳版取扱説明書のダウンロード提供 (CHM, ePUB, HTML, Sphinx 型式)