.. index:: 
	single: はじめに; はじめに

========
はじめに
========

.. image:: thering.jpg
	:alt: プログラミング言語 Ring

プログラミング言語 Ring へようこそ！

Ring は画期的で実用性のある汎用マルチパラダイム言語です。 C/C++ プロジェクトへの組み込み、 
C/C++ コードにより拡張・単体プログラミング言語にもなります。
命令型、手続き型、オブジェクト指向、関数型、メタプログラミング、入れ子構造による宣言型、および自然言語のプログラミング・パラダイムに対応しています。
Ring は移植性 (Windows, Linux, macOS, Android など) があり、小規模、柔軟かつ高速な設計の動的プログラミング言語 (動的型付け、および弱い型付け) です。コンソール、GUI、ウェブ、ゲーム、およびモバイル・アプリケーションを作成できます。
ソースコードをバイトコードへコンパイル後に、
Ring コンパイラで単体プログラムとして統合を行い、 Ring 仮想計算機で実行します。

さて、 Ring 言語の設計と実装の背景における目標を議論しましょう。

.. index:: 
	pair: はじめに; 動機

動機
====

2011年11月に、新しいバージョンの `Programming Without Coding Technology (PWCT) <http://doublesvsoop.sf.net/>`_ ソフトウェアを白紙段階から開発することを検討し始めました。

ウェブとモバイル開発に対応したマルチプラットフォーム版 Programming Without Coding Technology (PWCT)  の作成に興味がありました。
Programming Without Coding Technology (PWCT) のソースコードの大部分は Microsoft Visual FoxPro (VFP) で記述しています。
ソフトウェアにはコンポーネント作成用スクリプト言語 RPWI が付属しており、
Harbour, C, Supernova および Python などのプログラミング言語のコード生成に対応しています。

求めているものは、新発想の異次元プログラミング言語です (画期的、即戦力、単純明快、柔軟。さらに知性的な実装)。
マルチプラットフォーム対応、より優れた実行性能、コンポーネントを記述できるスクリプト言語であり、
開発環境の構築にも耐え、多種多様なアプリケーションを開発できるものです。さらに、大規模アプリケーションの開発用に設計してあり、ガベージコレクター (GC) 制御の良くできている高速で生産性の高い小規模な動的プログラミング言語です。

そのため、複数のプログラミング言語を併用するのではなく、開発環境の作成、
コンポーネント用スクリプトの記述、およびアプリケーション作成用言語を一本に絞ることを決めました。

C, C++, Java, C#, Lua, PHP, Python と Ruby などのプログラミング言語を調査しました。

まず、 C, C++ は違います。初心者や専門家向けの使いやすいビジュアル・プログラミング環境、さらに上述の言語よりも高水準の生産性が欲しいのです。

Java と C# (Mono) は違います。静的型付け、マルチプラットフォームですが、膨大なクラスとオブジェクト指向を強要する冗長なプログラミング言語は不適切です。

Lua は小規模で高速ですが機能不足です。

PHP は違います。シンタックスは C と非常に似ていますが、複雑怪奇なウェブ開発用言語です。

Python と Ruby は惜しいのですが、規模、動作速度、生産性に不満があります。
また、英数大小文字を区別します。リストのインデックス計数は 0 から始まり、関数は呼び出し前に定義する必要があります。
Ruby はオブジェクト指向とメッセージパッシングを多用するため、必然的に実行性能は低下します。 Python のシンタックス (インデント、self の使用、pass & _) は目標としているものではありません。

とはいえ、前述のプログラミング言語は、全て成功を収めたものであり、対象となる問題解決領域では非常に優れたものです。


.. index:: 
	pair: はじめに; Ring 以外のプログラミング言語

Ring 以外のプログラミング言語
=============================

Ring は下記のプログラミング言語の影響を受けています。

* Lua
* Python
* Ruby
* C
* C#
* BASIC
* QML
* xBase
* Supernova

.. index:: 
	pair: はじめ; Matz への心よりの感謝

Matz への心よりの感謝
=====================

Matz (まつもとゆきひろ - プログラミング言語 Ruby の原作者) 様へ Ring について広めていただいたことを心より感謝します。

.. image:: matzring.png
	:alt: プログラミング言語 Ring に関するまつもとゆきひろ氏のツイート

.. index:: 
	pair: はじめに; 歴史

歴史
====

2013年09月より Ring の設計と実装を開始し、21ヶ月後の2015年05月頃に Ring コンパイラと仮想計算機は完成しました。

その後、再検証で三ヶ月間を費やしました。優れたテストを記述してから各種不具合の修正を続け、
2015年08月末までに不具合の修正を完了しました。
大量のテストを用意して自動化することは、製品の安定化で大いに役に立ちました。

2015年09月12日に取扱説明書の大部分を執筆しました。
Facebook ページへアラビア語の記事を投稿して、広報活動を開始しました (Ring の公開前に、手短な説明を読んでいただき、 Ring の考えに興味をもった貢献者を探すためです)。
同日、開発貢献に興味がある開発者、そして友人たちから多数の電子メールを受け取りました！

2016年01月25日に Ring 1.0 を公開しました。わずか数日で数千回のダウンロードを達成しました！　そして、世界中の開発者が学習と使用をはじめました。Ring の発展と成功は、皆様から寄せられた声のお蔭でございます。また、皆様から Ring を用いて短時間で作成した素晴らしい用例をいただきました。

2017年12月07日に Ring 1.6 取扱説明書の日本語訳作業が isVowel (旧名義: めぐみ発動機 / GreenWing) により開始されました。 Ring 1.0 の公開から約二年半後となる翌年の 2018年06月03日には、非公式ウェブサイト (Geocities Japan) と Ring 1.7 の日本語訳が公開されました。翌年の 2019年02月05日には OSDN への非公式ウェブサイト移転、同月10日には日本語キット化のテスト版が公開されました。そして、同月22日には、日本語サイトへのアクセス件数が 5,000件 を超えました。

2018年10月06日に公開の Ring 1.9 では Heroku に対応し、クラウド・アプリケーションも開発可能です。

2019年01月25日に公開の Ring 1.10 ではパッケージマネージャーが導入されました。

2019年09月15日に公開の Ring 1.11 では Allegro, SDL に加えて 2D/3D ゲームプログラミングライブラリである `RayLib <https://www.raylib.com/>`_ に対応しました。また、ZeroLibの導入により、リストと文字列で 0 ベースのインデックスを使用できるようになりました。

2020年01月25日に公開の Ring 1.12 では RayLib のサンプルソース集強化、 Load Again コマンドによるソースコードに記述された定数の動的再読み込みに対応しました。また、記念すべきことに Ring は初公開から今年で五周年となりました。今後ともご愛顧いただけますよう宜しくお願い致します。

Ring は、今後広く使われるプログラミング言語と大成すべく着実に成長を続けています。

公開履歴:

* Ring 1.0  (2016年01月25日)

* Ring 1.1  (2016年10月06日)

* Ring 1.2  (2017年01月25日)

* Ring 1.3  (2017年05月15日)

* Ring 1.4  (2017年06月29日)

* Ring 1.5  (2017年08月21日)

* Ring 1.6  (2017年11月30日)

* Ring 1.7  (2018年01月25日)

* Ring 1.8  (2018年06月25日)

* Ring 1.9  (2018年10月06日)

* Ring 1.10 (2019年01月25日)

* Ring 1.11 (2019年09月15日)

* Ring 1.12 (2020年01月25日)

.. index:: 
	pair: はじめに; 特徴

特徴
====

このような特徴が Ring にあります。

.. tip:: Ring は即戦力です。今すぐ製品開発を行うことができます！

* 自由なオープンソース (MIT ライセンス)
* ハイブリッド実装 (コンパイラ + 仮想計算機)
* オブジェクト指向プログラミングによる宣言型プログラミング
* オブジェクト指向プログラミングによる自然言語プログラミング
* 自然言語プログラミング・ライブラリ
* 三種類の異なる記法によるコード記述、および記法を自作可能
* 柔軟性のあるシンタックス (言語のキーワードと演算子は変更可能)
* 言語キーワードは英語から他の外国語 (アラビア語、フランス語、日本語など) へ翻訳可能
* ステートメントへの明示的な end が不要であるため、シンタックスは簡潔です (; や ENTER は不要)
* 括弧 { } でオブジェクトへのアクセス、および変数、属性としてメソッド、関数を使えます。
* 透過型実装 (プログラムごとに字句、構文、およびバイトコードを表示) 
* ビジュアル実装 - ビジュアル言語 Programming Without Coding Technology (PWCT) で実装
* ANSI C で記述  (コード生成 + 手書きのコードと同一記法)
* 小規模プログラミング言語
	* コンパイラ + 仮想計算機 (20,000 行の C コード)
	* そのほか 500,000 行のコードはライブラリ関連です！
* 移植性 (Windows, Linux および macOS, Android など)
* コメント (一行と複数行)
* 英数大小文字同一視
* 動的型付け
* 弱い型付け (数値と文字列間でのみ自動変換)
* レキシカルスコープ (グローバル、ローカル、およびオブジェクトのステート)
* 関数内変数のデフォルトスコープ (ローカル)
* 関数外変数のデフォルトスコープ (グローバル)
* ライブラリごと、またはサブプロジェクトで独立したグローバルスコープがあります。
* ガベージコレクター - メモリの自動管理 (エスケープ解析と参照カウント)
* ほとんどの場合 (90%)、エスケープ解析によりガベージコレクターの実行を不要にしています (高速です)。
* 構造化プログラミング
* 豪華な制御構造と演算子
* For in では値ではなく参照により項目を取得するため、項目を読み書きできます
* exit による一階層以上のループからの脱出 (小規模プログラミングに限り使用してください)
* 手続き、関数
* メイン関数 (オプション扱い - グローバルスコープの使用回避)
* 定義前の関数呼び出し (トップダウンプログラミング)
* 再帰処理
* 複数行リテラル
* インデックスによる文字列内の文字へのアクセス (読み書き)
* リストのインデックスは 1 から開始
* クラス、パッケージ、関数には end キーワードは不要
* 範囲演算子。用例: 1:10 および \"a\":\"z\"
* 第一級変数、リスト、オブジェクトと関数
* 値による格納、リストのコピー、オブジェクト (深いコピー)
* 参照によるリスト、オブジェクト渡し
* オブジェクト指向への標準対応

	* カプセル化
	* Setter/Getter (オプション扱い)
	* プライベートステート (オプション扱い)
	* インスタンス化
	* 多態性
	* コンポジション
	* 継承 (単一継承)
	* 演算子のオーバーロード
	* パッケージ

* リフレクションとメタプログラミング
* 明瞭なプログラム構造 (ステートメントの後に関数、そしてパッケージとクラス)
* 例外処理
* Eval() によるアプリケーション実行中のコード実行
* 8-bit クリーン設計であるためバイナリデータは直接処理します。
* I/O 命令
* 算術関数
* 文字列関数
* リスト関数
* ファイル処理関数
* データベースへの対応 (ODBC, SQLite, MySQL および PostgreSQL)
* セキュリティ関数 (OpenSSL)
* インターネット関数 (LibCurl)
* Zip ファイル処理関数
* CGI ライブラリ (Ring にて記述)

	* HTTP Get
	* HTTP Post
	* ファイルのアップロード
	* クッキー
	* URL エンコード
	* HTML テンプレート
	* HTML 特殊文字
	* 関数による HTML の生成
	* クラスによる HTML の生成
	* CRUD の用例 (MVC を使用)
	* ユーザーによる用例 (登録、ログインと確認)

* クラウド経由によるウェブアプリケーションの配布 (Heroku)
* C/C++ による拡張機能の使用 (単純明快なAPI)
* C/C++ プログラムへの組み込み
* Ring プログラムへの Ring 組み込み
* 手軽に C/C++ ライブラリと接続するためのコード生成器 (Ring にて記述) を標準装備。

	* Allegro に対応するために RingAllegro の作成で使用
	* LibSDL に対応するために RingLibSDL の作成で使用
	* Qt に対応するために RingQt の作成で使用

* デスクトップとモバイル用の 2D ゲーム作成 (Allegro ライブラリ)
* RingLibSDL 拡張機能
* シンプルな 2D ゲームエンジンを添付
* RingOpenGL 拡張機能
* RingFreeGLUT 拡張機能
* RingRayLib 拡張機能
* デスクトップとモバイル用の GUI アプリケーションの作成 (Qt フレームワーク)。
* コードエディタ (Ring Notepad) とフォームデザイナーを搭載した統合開発環境 (IDE)
* RingREPL (Read-Eval-Print-Loop)
* トレースとデバッグ
* 型ヒントライブラリ
* アプリケーションの配布用に Ring2EXE を添付
* RingLibuv 拡張機能
* インタプリタ (VM) 全体の停止 (global interpreter (VM) lock) は起こりません (GIL なし) - これはスレッドと平行性において優れています (高速化)
* RingPM (パッケージ管理プログラム)
* 豊富なサンプルソースとアプリケーション
* 完成度の高い取扱説明書

.. index:: 
	pair: はじめに; ライセンス

ライセンス
==========

プログラミング言語 Ring

http://ring-lang.net/

Version 1.12

MIT ライセンス (MIT)

Copyright (c) Mahmoud Fayed

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

