プログラミング言語 Ring (非公式日本語版サイト)

ダウンロード
取扱説明書
リソース
グループ
Star Fork

### アプリケーション開発指向のシンプルで柔軟なプログラミング言語

#### はじめに

Ring は実用性のある汎用マルチパラダイム言語です。 命令型、手続き型、オブジェクト指向、関数型、メタプログラミング、多重構造による宣言型プログラミング、および自然言語プログラミングのパラダイムに対応しています。 移植性があり (Windows, Linux, macOS, Android, WebAssembly など)、コンソール, GUI, ウェブ, ゲーム, モバイルアプリケーションなどの開発ができます。 そしてシンプル、小粒で柔軟な設計です。

オンラインで体験 (Playground を開く)

#### 新着情報

2021年 4月17日 | Ring 1.14 日本語版取扱説明書
2021年 3月17日 | RosettaCode 掲載のサンプルソースが 700 本を超えました
2021年 3月15日 | Chess Endgame アプリケーション

過去の新着情報
ムチュウニなろう！

#### いますぐわかる Ring のご紹介

Ring の宣言型と自然言語プログラミング機能は優れています。オブジェクト指向と関数型プログラミングの実用的な新技法でパラダイムに対応しています。コンパイラや構文解析などの事前知識は不要です。さらに、短時間でドメイン特化言語を作成、構築できる言語構成要素を標準装備しています。

Ring の記事 シンタックスの柔軟性 宣言型手法 自然言語プログラミング 自然言語プログラミングライブラリ
実用性

#### ライブラリとツール

Ring ライブラリ (StdLib, WebLib, 自然言語ライブラリ、ゲームエンジンなど)、 および Ring 統合開発環境 (Ring ノートパッド、フォームデザイナーなど) は Ring で記述されています。 Ring は今すぐ製品開発ができる即戦力であり、開発者の生産性を改善します。

#### カスタムスタイルとモダンプログラミングによるパラダイム

Ring はまるで母国語のように思えるでしょう！　多彩かつモダンなプログラミングパラダイムは 即戦力であり自然言語プログラミングにより手早く 自然言語のインタフェースをプログラムに統合できます。また、自然言語による説明を記述後にソフトウェアの開発を行い、 その後に実装を追加することも可能です。

###

###

前へ 次へ

#### GUI アプリケーション開発と RAD ツール

Ring により、短時間で様々な GUI アプリケーションを開発できると多くの開発者が述べています。Ring にはアプリケーション高速開発支援ツール (Rapid Application Development - RAD) が搭載されており、 MVC デザインパターンにより GUI アプリケーションを迅速に開発できます。 さらに、デスクトップ、ウェブ、およびモバイル機器用のアプリケーションを同じソースコードを用いて配布することも可能です。

###

###

前へ 次へ

#### 最高級のゲーム開発機能

世間の皆様にプログラミング学習の普及促進をするにはゲーム開発が優れた方法であると思います。 Ring には標準ライブラリとしてゲーム開発用ライブラリを搭載しています。 Ring は Allegro, LibSDL, RayLib, Tilengine, OpenGL および Qt3D ライブラリに標準対応しています。 また、 Ring には宣言型プログラミングにより 2D ゲームを開発できるシンプルなゲームエンジンも搭載しています。

###

###

###

###

###

前へ 次へ

#### WebAssembly (フロントエンド型のウェブ開発)

Ring で WebAssembly 形式のアプリケーションを手軽に開発できます (ウェブページのサンドボックス環境で実行できるコードのバイナリ形式です。 この実行可能ファイル形式の動作速度はネイティブマシンのコードとほぼ同じです。 なお、現在主流となっているウェブ・ブラウザで使用可能です)。

###

###

###

###

###

前へ 次へ

#### バックエンド型のウェブ開発

Ring を使うと MVC デザインパターンで GUI アプリケーションを迅速に開発できます。 Ring コードは HTML テンプレートへ簡単に埋め込むことができます。 また、宣言型プログラミングにより Ring プログラムから HTML コードを生成可能です。

###

###

###

前へ 次へ

#### モバイル開発

Ring でモバイル機器用のアプリケーションを配布できます (Android, iOS, など)

###

###

前へ 次へ

#### ビルドツール (コマンドライン)

Ring でコマンドラインツール (CLI) を迅速に開発して手軽に配布できます。 Ring パッケージマネージャー (RingPM) は短時間で開発した実用ツールの好例です。 なお、開発時間を記録しています (２１時間の開発期間後にステップごとの内容を解説してあります)。

###

###

前へ 次へ
Ring をオススメする理由

#### Ring をオススメする理由

Ring は簡明、違和感の排除、組織化の奨励、および透過性とビジュアル実装からなるプログラミング言語です。 簡潔なシンタックス、そして自然なインタフェースの作成を可能にする機能群、 さらに少しの時間で構築できる宣言型問題解決特化言語があります。非常に小規模、高速なスマートガベージコレクターがあり、 メモリをプログラマの制御下に置くことができます。また、多種多様なプログラミングパラダイムに対応しており、インストール後すぐに使える業界標準の実用ライブラリが付属しています。 この言語は生産性と拡張性に優れた高品質な解決方法の開発のために設計しました。

#### 明確な設計目標

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

#### シンプル

Ring は非常にシンプルなプログラミング言語であり、非常にわかりやすくすっきりしたシンタックスから構成されています。ボイラープレートコードのないプログラムの記述をプログラマに奨励しています。
メッセージを標準出力へ表示するには 'See' 命令を使います。

    see "Hello, World!"

メイン関数はオプション扱いであり、ステートメントの後に実行されるため、ローカルスコープで有用です。

    func main
    	see "Hello, World!"

動的型付け、およびレキシカルスコープを使用しています。
文字列の連結で ‘+’ 演算子を使用できます。

    nCount = 10	# グローバル変数
    func main
    	nID = 1	# ローカル変数
    	see "Count = " + nCount + nl + " ID = " + nID

#### 違和感の排除

Ring は大小英数文字を区別しません。

    see "Enter your name ?"
    give name
    see "Hello " + Name	# Name は name と同じです。

リストのインデックス (添字番号) は 1 から開始します (Ring 1.11 以降は ZeroLib ライブラリにより 0 から始めることもできます)。

    aList = ["one","two","three"]
    see aList[1]	# one を表示

定義前に関数を呼び出すには

    one()
    two()
    three()
    func one
    	see "One"
    func two
    	see "two"
    func three
    	see "three"

代入演算子は深いコピーを使用します (この操作は参照ではありません)。

    aList = ["one","two","three"]
    aList2 = aList
    aList[1] = 1
    see alist[1]	#  1 を表示
    see aList2[1]	# one を表示

数値と文字列は値渡しですが、リストとオブジェクトは参照渡しです。
For in ループ でリストの項目 (アイテム、要素とも呼ばれています) を更新できます。

    func main
    	aList = [1,2,3]
    	update(aList)
    	see aList	# one two three を表示

    func update aList
    	for x in aList
    		switch x
    		on 1 x = "one"
    		on 2 x = "two"
    		on 3 x = "three"
    		off
    	next

リストと値の一括定義

    aList = [ [1,2,3,4,5] , aList[1] , aList[1] ]
    see aList       # 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 を表示

一階層以上のループから脱出

    for x = 1 to 10
            for y = 1 to 10
                    see "x=" + x + " y=" + y + nl
                    if x = 3 and y = 5
                            exit 2     # 二階層のループから脱出
                    ok
            next
    next

#### 組織化の奨励

Ring ではプログラムの組織化を奨励しています。まずは関数、次にクラス、 そして関数とヘンテコなモノと組み合わせるプログラミング言語を使用していた悪夢の日々を忘却の彼方へ追いやります！
ソースファイルの構造は

- ファイルの読み込み
- ステートメントとグローバル変数
- 関数
- パッケージとクラス

これにより構成要素で end キーワードを記述しなくてもパッケージ、 クラスと関数が使えます。
一行コメント、または複数行コメントを使えます。
一行コメントは # または // で始まります。
複数行コメントは /* ～ */ の間に記述します。

    /*
    	プログラム名	: Ring を使用したはじめてのプログラム
    	開発者       : Ring Team
    */

    see "What is your name?" 	# 画面上にメッセージを表示
    give cName 			# ユーザからの入力を取得
    see "Hello " + cName		# hello を表示！

    // See "End of Program!"

#### データの表現方法

Ring においてプログラムのデータ表現で使える型は四種類のみです。つまり、型として扱えるものは文字列、数値、リストとオブジェクトです。 その狙いは、様々な状況で使いやすい関数を書くことであり、 型別にユースケースを多数定義すると柔軟性と性能が高くなります。

文字列型は下記の表現で使います:

- 文字
- 複数文字による文字列
- 複数行による文字列
- バイナリデータ

    cStr1 = "a"			# 文字
    cStr2 = "Hello, World!" 	# 複数文字による文字列
    cStr3 = "Hello
    Welcome to the Ring language!
    "				# 複数行による文字列
    cStr4 = read(EXEFileName())	# 実行可能ファイルの読み取り (バイナリデータ)

数値型は下記の表現で使います:

- ブール値
- 符号あり・なし整数
- 浮動小数・倍精度小数

    nNum1 = True		# ブール値 (1)
    nNum2 = False		# ブール値 (0)
    nNum3 = 10		# 整数
    nNum4 = -10		# 符号あり整数
    nNum5 = 1250.11		# 浮動小数・倍精度小数

リスト型は下記の表現で使います:

- 一次元配列
- 多次元配列
- 複合型のリスト
- 多重リスト
- ハッシュテーブル (キーと値)
- ツリー
- C ポインタとのラッパー接続

    aList1 = ["one","two","three"]				# 文字列
    aList2 = [1,2,3,4,5,6,7,8,9,10]				# 数値
    aList3 = ["Ring",1234]					# 複合型
    aList4 = [["Fayed","Egypt"],["Mansour","Tunisia"]]  	# 多重リスト
    aList5 = [ :name = "Fayed", :country = "Egypt"]		# ハッシュテーブル

オブジェクト型はクラスから生成されたオブジェクトを表現するために用いられます。
また、クラスと演算子のオーバーロードを用いることで任意定義型を作れます。

#### 無駄のない小型で高性能なシンタックス

ステートメントの末尾に ; の記述や ENTER や TAB を押して行を区切る 必要はありません。

    see "The First Message"	see " Another message in the same line!" + nl
    see "Enter your name?" give Name see "Hello " + Name

このコードは三種類の属性 X, Y および Z がある Point クラスを作成します。 パッケージ・クラス・関数の定義を終了するために end キーワードは使いません。 また、クラスの名前の直下に属性の名前を書くことができます。

    class Point X Y Z

定義前にクラスと関数を使用できます。 この用例では、オブジェクトの新規作成と属性の設定、および値を表示します。

    o1 = new point	o1.x=10    o1.y=20   o1.z=30	see O1	class Point X Y Z

ドット演算子 ‘.’ でオブジェクトの属性とメソッドへアクセスするのではなく、 括弧 { } でオブジェクトへアクセスできます。その後にオブジェクトの属性とメソッドを使用できます。

    o1 = new point { x=10 y=20 z=30 } see O1  class Point X Y Z

メソッドの呼出し後に { } でオブジェクトへアクセスします。

    oPerson = new Person
    {
    	Name = "Somebody"
    	Address = "Somewhere"
    	Phone = "0000000"
    	Print()			# ここで Print() メソッドを呼び出します。
    }
    class Person Name Address Phone
    	func Print
    		see "Name :" + name + nl +
    		    "Address :" + Address + nl +
    		    "Phone : " + phone + nl

{ } でオブジェクトへアクセスしてから任意のオブジェクトの名前を記述するとき、 自動的に呼び出される全ての setter/getter メソッドに対してクラスを検査します。

    new Number {
    		see one		# GetOne() の実行
    		see two		# GetTwo() の実行
    		see three	# GetThree() の実行
    }
    class Number one two three
    	func GetOne
    		see "Number : One" + nl
    		return 1
    	func GetTwo
    		see "Number : Two" + nl
    		return 2
    	func GetThree
    		see "Number : Three" + nl
    		return 3

#### シンタックスの柔軟性

ソースコードの記述に関して様々な記法があります！
また、言語のキーワードと演算子を変更することで、お好みの記法を作成できます！

- 第一形式

    ?"Welcome to Ring!"
    new test { start() }

    class Test
    	x=10  y=20
    	func start
    		?"x+y=" + (x+y)
    		for t=1 to 10
    			?"t = " + t
    			if t=3
    				?"Three"
    			ok
    		next

- 第二形式

    def main
    	put "Welcome to Ring!" + nl
    	new test { start() }
    end

    class Test
    	x = 10
    	y = 20
    	def start
    		put "x+y=" + (x+y) + nl
    		for t=1 to 10
    			put "t = " + t + nl
    			if t=3
    				put "Three" + nl
    			end
    		end
    	end
    end

- 第三形式

    load "stdlib.ring"

    func main() {
    	print("Welcome to Ring!\n")
    	new test { start() }
    }

    class Test {
    	x = 10
    	y = 20
    	func start {
    		print("x+y=" + (x+y) + "\n")
    		for t=1 to 10 {
    			print("t = " + t + " \n")
    			if t=3 {
    				print("Three \n")
    			}
    		}
    	}
    }

- キーワードの変更

    ChangeRingKeyword See Print
    Print "Hello, World!"
    ChangeRingKeyword Print See
    See "Hello, World!"
    ChangeRingKeyword See Show
    Show "Hello, World!"

#### オブジェクト指向による自然言語ステートメントの定義

{ } でオブジェクトへアクセス後にクラスに BraceEnd() メソッドがあれは BraceEnd() メソッドを実行します！

    TimeForFun = new journey
    # あっと驚く！
    TimeForFun {
    	Hello it is me		# なんと美しいプログラミングの世界でしょう！
    }
    # クラス本体
    class journey
    	hello=0 it=0 is=0 me=0
    	func GetHello
    		See "Hello" + nl
    	func braceEnd
    		See "Goodbye!" + nl

Eval() 関数は文字列に記述されたコードを実行します。

    cCode = "See 'Code that will be executed later!' "
    Eval(cCode)	# コードを実行してメッセージを表示します

リストの作成後にリストから実行用のコードを生成します。

    aWords = ["hello","it","is","me"]
    for word in aWords cCode=word+"=0" eval(cCode) next

Read(cFileName) 関数はテキストファイルを読み取ります。 また、 Write(cFileName,cString) 関数はファイルへ書き込みます。

    see "Enter File Name:" give cFileName see read(cFileName) # ファイルの内容を表示

この用例は二つの命令を定義するクラスの作成方法です。
最初の命令は : I want window
次の命令は : Window title = <式>
‘the’ などのキーワードは無視されます。

    new App
    {
            I want window
            The window title = "hello world"
    }

    class App

    	# I want window 命令の属性
    			i want window
    			nIwantwindow = 0
    	# Window title 命令の属性
    	# ここでは window 属性を再定義しません
    			title
    			nWindowTitle = 0
    	# 値を与えると、キーワードは無視されます
    			the=0

            func geti
                    if nIwantwindow = 0
                            nIwantwindow++
                    ok

            func getwant
                    if nIwantwindow = 1
                            nIwantwindow++
                    ok

            func getwindow
                    if nIwantwindow = 2
                            nIwantwindow= 0
                            see "Instruction : I want window" + nl
                    ok
                    if nWindowTitle = 0
                            nWindowTitle++
                    ok

            func settitle cValue
                    if nWindowTitle = 1
                            nWindowTitle=0
                            see "Instruction : Window Title = " + cValue + nl
                    ok

前述の用例を完了するには read() でファイルの内容を取得します。

            I want window
            The window title = "hello world"

そして eval() でファイルの内容を実行します！
また、 GUI ライブラリでウィンドウを作成するために GetWindow() と SetTitle() メソッドを更新します。

#### オブジェクト指向による多重構造の宣言型言語の定義

自然言語ステートメント形式のコード実行、 および多重構造によるコードの実行方法は解説済みです。

この用例は Web ライブラリからの引用であり Bootstrap ライブラリで HTML ドキュメントを生成します。 この用例では HTML コードを直接記述せずに類似言語を作成しています (ただの用例です)。 その後、宣言型言語により多重構造で HTML ドキュメントを生成しています。
この用例での考え方として GetDiv() と GetH1() メソッドは { } でアクセスできるオブジェクトを返します。 各オブジェクトへのアクセス後に BraceEnd() メソッドが実行されると生成された HTML を BraceEnd() の出力表示がルートに到達するまで親オブジェクトへ送信します。

    load "weblib.ring"
    import System.Web

    func Main

      BootStrapWebPage()
      {
            div
            {
              classname = :container
              div
              {
                    classname = :jumbotron
                    H1 {   text("Bootstrap Page")   }
              }
              div
              {
                    classname = :row
                    for x = 1 to 3
                      div
                      {
                            classname = "col-sm-4"
                            H3 { html("Welcome to the Ring programming language") }
                            P  { html("Using a scripting language is very fun!") }
                      }
                    next
              }
            }
      }

宣言型インタフェースを強化するクラスは

    	class Link from ObjsBase
    		title  link
    		func braceend
    			cOutput = nl+GetTabs() + "<a href='" +
    				  Link + "'> "+ Title + " </a> " + nl

    	class Div from ObjsBase
    		func braceend
    			cOutput += nl+'<div'
    			addattributes()
    			AddStyle()
    			getobjsdata()
    			cOutput += nl+"</div>" + nl
    			cOutput = TabMLString(cOutput)

実装について

#### 実装技法

#### 透過型実装

Ring は透過型実装です。コンパイラの処理段階、および 仮想計算機による実行中の処理内容を把握できます。
用例 : ring helloworld.ring -tokens -rules -ic -norun

    see "Hello, World!"

実行結果

    ==================================================================
    Tokens - Generated by the Scanner
    ==================================================================

       Keyword : SEE
       Literal : Hello, World!
       EndLine

    ==================================================================

    ==================================================================
    Grammar Rules Used by The Parser
    ==================================================================

    Rule : Program --> {Statement}

    Line 1
    Rule : Factor --> Literal
    Rule : Range --> Factor
    Rule : Term --> Range
    Rule : Arithmetic --> Term
    Rule : BitShift --> Arithmetic
    Rule : BitAnd --> BitShift
    Rule : BitOrXOR -->  BitAnd
    Rule : Compare --> BitOrXOR
    Rule : EqualOrNot --> Compare
    Rule : LogicNot -> EqualOrNot
    Rule : Expr --> LogicNot
    Rule : Statement  --> 'See' Expr

    ==================================================================

    ==================================================================
    Byte Code - Before Execution by the VM
    ==================================================================

         PC      OPCode        Data
          1     FuncExE
          2       PushC   Hello, World!
          3       Print
          4  ReturnNull

    ==================================================================

#### ビジュアル実装

プログラミング言語 Ring はビジュアルプログラミングツール PWCT (外部サイト) で設計・開発しました。

###

###

前へ 次へ

#### スマートガベージコレクター

わずらわしいメモリ操作関連の問題から開放されます。

- メモリへの不正アクセス
- メモリリーク
- 未初期化メモリへのアクセス
- ダングリングポインタ

規則:

- グローバル変数は代入ステートメントで削除するまでメモリに存在し続けます。
- ローカル変数は関数の処理終了後に削除されます。
- プログラマは代入ステートメントでメモリから変数を削除する時期を完全に制御できます。
用例:

    aList = [1,2,3,4,5]
    aList = "nice"

二行目の直後、リスト [1,2,3,4,5] はメモリから削除され、文字列 “nice” が残ります。
- プログラマは callgc() 関数を呼び出すことで強制的に強制的にガベージコレクターを実行できます。
- 変数に参照があれば (オブジェクトおよびリストを関数へ渡すとき)、参照カウントに基づき変数を削除します。未参照ならば全て削除しますが、参照があればデータはメモリに残ります。

#### インタプリタ (VM) 全体の停止なし (GIL なし)

アプリケーションでスレッドを使用するとき、インタプリタ (VM) 全体の停止 (global interpreter (VM) lock - GIL) は起こりません。
よって、スレッドは並列動作可能であり、Ring 命令は同時実行されます。
これはスレッドと平行性において最良です (動作速度の向上が実現できます！)

#### 高速動作

Ring は単純明快、小規模、柔軟な言語の頂点として設計されています。また、ほとんどのアプリケーションで十分に高速動作します。

これまで５年以上にわたり、市販の電子計算機で Ring を使用してきました。下記の処理は約１秒で完了します。
(1) 100,000 行コードのコンパイル
(2) 1 ～ 10,000,000 まで数え上げる空ループの実行
(3) 100,000 項目から成るリストで最後の項目を見つけようとして、線形検索で1000 回の検索処理を実行 (最悪の場合)
(4) 1,000,000 項目から成るリストを作成後にリスト全項目の合計を計算
(5) GUI アプリケーションで ListWidget へ 20,000 アイテムを追加
(6) GUI アプリケーションで TreeWidget へ 5,000 ノードを追加
(7) ターミナルのコンソールアプリケーションで 10,000 メッセージを表示
さらなる高速化をお求めでしたら C/C++ 拡張機能を使えます！！

###

###

###

###

前へ 次へ
主な機能

#### 主な機能

文法

- 無駄のない小型で高性能なシンタックス
- 三種類のソースコード記法
- レガシーコードの変換と移植、カスタマイズに対応できるシンタックスの柔軟性
- 宣言型プログラミング
- 自然言語プログラミング
- 明瞭なプログラム構造 (ステートメントの後に関数、そしてパッケージとクラス)
- 括弧 { } によるオブジェクトへのアクセス、および属性・変数としてメソッド・関数を使用可能
- ステートメントの明示的な end は不要 (; または ENTER は不要)
- exit による一階層以上のループからの脱出
- 関数・クラス・パッケージには end キーワードは不要

信頼性の高い実装

- 自由なオープンソース (MIT ライセンス)
- ハイブリッド実装 (コンパイラと仮想計算機)
- コンパイラと仮想計算機は 20,000 行の C コード
- それ以外の 500,000 行のコードはライブラリ関連！
- 透過型実装によりオプションで実行中の処理内容 (トークン、グラマー、バイトコード) を出力可能
- ANSI C で記述 (コード生成による)
- ビジュアル言語 (PWCT) による開発
- ゲーム開発に適したスマートガベージコレクター (エスケープ分析と参照カウントによる自動メモリ管理)
- インタプリタ全体の停止なし (GIL なし)
- 移植性 (Windows, Linux, macOS, Android, WebAssembly など)

シンプル

- コメント (一行および複数行)
- 複数行リテラル
- 大小英数文字同一視
- リストのインデックスは 1 から開始
- 豪華な制御構造と演算子
- 範囲演算子。用例: 1:10 および “a”:”z”
- メイン関数 (オプション扱い)
- 定義前の関数呼び出し
- 再帰処理
- インデックスによる文字列内の文字へのアクセス (読み書き)
- 非値参照による For in ループでの項目取得
- 第一級変数、リスト、オブジェクトと関数
- 値による格納・リストのコピー・オブジェクト (深いコピー)
- 参照によるリスト・オブジェクト渡し
- 8-bit クリーン設計であるためバイナリデータの直接処理可能

動的言語

- 動的型付け
- レキシカルスコープ (グローバル、ローカルおよびオブジェクトのステート)
- 関数の内側の変数のデフォルトスコープ (ローカル)
- 関数の外側の変数のデフォルトスコープ (グローバル)
- 隔離グローバルスコープ空間へオプションモジュールを読み込み
- 例外処理
- アプリケーション実行中に Eval() でコードを実行

オブジェクト指向プログラミング (OOP)

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

標準ライブラリ

- 入出力命令
- 算術関数
- 文字列関数
- リスト関数
- ファイル処理関数
- システム関数
- データベースへの対応 (ODBC, PostgreSQL, SQLite および MySQL)
- セキュリティ関数 (OpenSSL)
- インターネット関数 (LibCurl)
- 強力な GUI フレームワーク (Qt)
- ウェブ開発ライブラリ
- 多機能ゲームプログラミングライブラリ

ウェブ開発

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

拡張機能

- C/C++ による拡張機能の使用 (シンプルなAPI)
- C/C++ プログラムへの組み込み
- C/C++ ライブラリの迅速な運用を実現するバインディング生成器
- ネットワークプログラミング (SDLNet, Libuv など)
- 2D ゲームの開発 (Allegro & LibSDL, Tilengine)
- 3D ゲームの開発 (OpenGL, FreeGLUT, RayLib, Qt3D など)
- デスクトップ、 WebAssembly およびモバイル機器用の GUI アプリケーションの開発 (Qt フレームワーク)

これ以外にも

- 非常に安定した動作
- 十分な処理能力
- 完成度の高い取扱説明書
- 豊富なライブラリを標準添付 (面倒な設定不要でインストール直後から使用可能)
- 豊富なサンプル集 (学習しやすい)
- 豊富なアプリケーション
- 数百本以上の実用的な YouTube 動画 (アラビア語)
- 頼りになる RAD ツール (コードエディタ、フォームデザイナー、REPL、デバッガ、Ring2EXE、パッケージマネージャーなど)

### Beginning(ビギニング) Ring(リング) Programming(プログラミング)

###

#### From(フロム) Novice(ノービス) to(トゥ) Professional(プロフェッショナル)

本書の狙いは実践的で豊富な用例により Ring プログラミングの世界を解りやすく丁寧に解説することです。

# Beginning(ビギニング) Ring(リング) Programming(プログラミング)

#

## From(フロム) Novice(ノービス) to(トゥ) Professional(プロフェッショナル)

本書の狙いは実践的で豊富な用例により Ring プログラミングの世界を解りやすく丁寧に解説することです。第一部では、言語と基本機能の基礎 (データ型、制御構造、関数、およびクラス) を示します。また、他に類を見ない方法で Ring プログラムの正確な構造を解説しています。

第二部では、 Ring の入出力、およびそのやりとりについて説明します。計算機ロジックの基本構造 (シーケンス、セレクション、およびイテレーション) により単純かつ複雑なロジックフローを構築します。例えば、コードの複雑性の原因となるよくある誤りの探求により、それら解決に導く戦略を説明します (リファクタリング、コードの整理、変数の適切な命名規約)。そして、ローカル、オブジェクト、およびグローバル領域における Ring のスコープの処理方法について図解で解説しています。

第三部では、 Ring プログラミングで必須の構成要素である関数とオブジェクトを扱います。問題解決の構成方法、および宣言型と自然言語など高度なプログラミングパラダイムにより綺麗に実装する方法について学びます。議論の一環として、ゲームプログラミングにも取り組みます。Ring のコードにおいて、ビジュアル開発環境での設計と同様に、ゲームを宣言的手法で設計する方法についても学びます。

最終章では、筆者によるゲームを用いたプログラミングの学習方法を説明しています。また、 Ring プログラミングを会得するためにゲームがメタファーとなる可能性について偽りがないことをお教えします。

本書の読者は綺麗で、表現力豊か、かつ学習しやすいコードを書きたい熱心な方です。つまり、初心者を対象とした Ring の関連知識を伝授するだけに限らず、実社会、顧客向けプログラミングのプロジェクトで使われる知識や経験が体得できる万能教材集でもあります。

初級

- 時速でデキるアプリケーション開発
- はじめに
- 言語設計
- ソースコードからのビルド方法
- 開発に貢献するには？
- Ring ノートパッドの用法
- 入門 - 第一形式
- 入門 - 第二形式
- 入門 - 第二形式
- 変数
- 演算子
- 制御構造 - 第一形式
- 制御構造 - 第二形式
- 制御構造 - 第二形式
- 標準入力の取得
- 関数 - 第一形式
- 関数 - 第二形式
- 関数 - 第二形式
- プログラムの構造
- リスト
- 文字列
- 日付と時刻
- データ型の検査と変換
- 算術関数
- ファイル
- システム関数
- Eval() とデバッグ
- デモプログラム

中級

- ODBC 関数
- MYSQL 関数
- SQLite 関数
- PostgreSQL 関数
- セキュリティとインターネット関数
- オブジェクト指向プログラミング (OOP)
- 関数型プログラミング (FP)
- リフレクションとメタプログラミング
- Stdlib 関数
- Stdlib クラス
- 多重構造の宣言型プログラミング
- 自然言語プログラミング
- 自然言語ライブラリの用法
- 変数と属性のスコープ規則
- 関数とメソッドのスコープ規則
- シンタックスの柔軟性
- Ring アプリケーションの配布方法
- Ring2EXE による Ring アプリケーションの配布方法
- Ring パッケージ管理プログラム (RingPM)
- 型ヒントライブラリについて
- ウェブ開発 (CGI ライブラリ)
- クラウド経由でのウェブアプリケーションの配布方法
- RingLibCurl の用法
- RingZip の用法
- グラフィックスと 2D ゲームプログラミング (RingAllegro)
- RingLibSDL の用法
- デモプロジェクト - 2D ゲームエンジン
- Android 用ゲームのビルド方法

上級

- RingOpenGL と RingFreeGLUT の用法 (3D グラフィックス)
- RingOpenGL と RingAllegro の用法 (3D グラフィックス)
- Gold Magic 800 ゲーム
- RingRayLib の用法
- デスクトップとモバイル開発 (RingQt)
- モバイル用 RingQt アプリケーションのビルド方法
- RingQt アプリケーション用のオブジェクトライブラリ
- フォームデザイナーの用法
- 多国語アプリケーション
- RingZip の用法
- 低水準関数
- トレースライブラリとインタラクティブデバッガ
- チュートリアル: C/C++ による拡張機能の開発方法
- C/C++ による拡張機能の開発方法
- C/C++ プログラムへ Ring を組み込むには
- C/C++ ライブラリ接続用コード生成器
- はじめての拡張機能開発 (コード生成器)

その他

- コマンドラインオプション
- 一般情報
- 言語リファレンス
- よくある質問と回答 (FAQ)

GitHub リソース チーム