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

はじめに

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


ムチュウニなろう!

いますぐわかる 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) は短時間で開発した実用ツールの好例です。 なお、開発時間を記録しています (21時間の開発期間後にステップごとの内容を解説してあります)。


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

これまで5年以上にわたり、市販の電子計算機で Ring を使用してきました。下記の処理は約1秒で完了します

(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 プログラミングの世界を解りやすく丁寧に解説することです。






GitHub リソース チーム