画期的で実用性豊かなマルチパラダイム汎用プログラミング言語 - それが Ring です。




はじめに

Ring は画期的で実用性豊かなマルチパラダイム汎用プログラミング言語です。 命令型、手続き型、オブジェクト指向、入れ子構造による宣言型プログラミング、関数型、メタプログラミング、および自然言語プログラミングのプログラミング・パラダイムに対応しています。 移植性 (Windows, Linux, macOS, Android, など) があり、コンソール、GUI、ウェブ、ゲーム、およびモバイルアプリケーションを作成できます。 そして、小規模、柔軟かつ高速になるように設計されています。

新着情報

日付 概要
2019年 3月 1日 日本語版運営者告知: 青春18きっぷ期間中 (3月01日~4月10日迄の春期など) は一切の活動を休止させていただきます。再開は 4月中旬以降です。 また、改元後の長期連休期間についても休止を検討しています。
2019年 2月28日 日本国内: 日本語版サイトのアクセス件数が7000件を超えました。そして100件目の新着情報です。ありがとうございます。今後とも宜しくお願いします。
2019年 2月28日 日本国内: Ring 1.10 日本語版取扱説明書の最終改訂版 (matsumoto) を公開

画期的

画期的

Ring 言語には自然言語プログラミングおよび宣言型プログラミングに関する最良の支援機能があります。これらのパラダイムは最先端のオブジェクト指向プログラミングおよび関数型プログラミングの実用的な新技法を採用することにより対応しています。 事前知識は不要です (コンパイラと構文解析)。少しの時間で問題解決特化言語 (Domain-Specific Languages) を作成するための言語構成要素は標準で用意されています。

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

豊かな実用性

ほとんどの Ring ライブラリ (StdLib, WebLib, Natural Library, Games Engine など)、および Ring IDE (Ring Notepad, Form Designer など) は Ring 言語で記述されています。 Ring は製品開発における即戦力であり、開発者の生産性を改善します。


Ring を選ぶ理由は?

Ring を選ぶ理由は?

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



明確な目標のための設計

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

簡明

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

see "Hello, World!"
			

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

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 から開始します。 → 理由

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

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

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

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

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 を使用したはじめてのプログラム
	日付		: 2017
*/

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

// See "Bye!"
			

簡明なシンタックス

行の区別はしませんので、ステートメントの後に ; を記述する必要はありません。 また 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

オブジェクト指向に基づいた自然言語ステートメントの定義

{ } を使用してオブジェクトへアクセス後にクラスに 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() メソッドを更新します。

オブジェクト指向に基づいた入れ子構造による宣言型言語の定義

自然言語 (Natural) ステートメントを使用したコードの実行、 および入れ子構造を使用したコードの実行方法について既に学んでいます。

この用例は 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 は透過型実装です。 コンパイラの処理段階および仮想計算機による実行中の処理内容を把握できます。
例えば : ring helloworld.ring -tokens -rules -ic

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

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

Hello, World!
			

ビジュアル実装

プログラミング言語 Ring はビジュアルプログラミングツール PWCT (外部サイト) で設計されています。 Ring 言語のビジュアルソースは “visualsrc” フォルダの *.ssf ファイルにあります。 生成された C 言語ソースコードは src フォルダおよび include フォルダにあります。 GitHub (外部サイト) から fork する。



このスクリーンショットは ring_vm.ssf (ring_vm.c と ring_vm.h を生成) および ring_list.ssf (ring_list.c と ring_list.h を生成) ファイルからの引用です 。

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

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

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

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

  • 用例:
    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++ 拡張機能を使用します!


特徴

特徴

自由で画期的
  • 自由なオープンソース (MIT ライセンス)
  • オブジェクト指向プログラミングの頂点としての宣言型プログラミング
  • ステートメントへの明示的な end が不要であるため、シンタックスは簡潔です (; または ENTER は不要)
  • For in では値ではなく参照により項目を取得するため、項目を読み書きできます
  • exit の使用による一階層以上のループからの脱出
  • 関数・クラス・パッケージには end キーワードは不要
  • 括弧 { } を使用することでオブジェクトへのアクセス、および属性・変数としてのメソッド・関数を使用できます。
  • 明瞭なプログラム構造 (ステートメントの後に関数、そしてパッケージとクラス)
  • オプションで字句・構文・バイトコードを実行中に表示
強力な実装
  • ハイブリッド実装 (コンパイラ + 仮想計算機)
  • コンパイラ + 仮想計算機は 20,000 行の C コードです。
  • そのほか 500,000 行のコードはライブラリ関連です!
  • ANSI C で記述 (コード生成による)
  • ビジュアル言語 (PWCT) を使用して開発
  • 移植性 (Windows, Linux および macOS, Android, )
簡明
  • コメント (一行および複数行)
  • 大小英数文字同一視
  • 構造化プログラミング
  • 豪華な制御構造と演算子
  • 手続き・関数
  • メイン関数 (オプション扱い)
  • 定義前の関数呼び出し
  • 再帰処理
  • 複数行リテラル
  • インデックスによる文字列内の文字へのアクセス (読み書き)
  • リストのインデックスは 1 から開始
  • 範囲演算子。用例: 1:10 および “a”:”z”
  • 第一級変数、リスト、オブジェクトと関数
  • 値による格納・リストのコピー・オブジェクト (深いコピー)
  • 参照によるリスト・オブジェクト渡し
  • 8-bit クリーン設計であるためバイナリデータは直接動作します。


動的言語
  • 動的型付け
  • 弱い型付け
  • レキシカルスコープ (グローバル、ローカルおよびオブジェクトのステート)
  • 関数の内側の変数のデフォルトスコープ (ローカル)
  • 関数の外側の変数のデフォルトスコープ (グローバル)
  • ガベージコレクター - メモリの自動管理 (エスケープ解析と参照カウント)
  • 例外処理
  • アプリケーション実行中に Eval() でコードを実行
オブジェクト指向へのネイティブ対応
  • カプセル化
  • Setter/Getter (オプション扱い)
  • プライベートステート (オプション扱い)
  • インスタンス化
  • 多態性
  • コンポジション
  • 継承 (単一継承)
  • 演算子のオーバーロード
  • パッケージ
  • リフレクションとメタプログラミング
標準ライブラリ
  • I/O 命令
  • 算術関数
  • 文字列関数
  • リスト関数
  • ファイル処理関数
  • データベースへの対応 (ODBC, PostgreSQL, SQLite および MySQL)
  • セキュリティ関数 (OpenSSL)
  • インターネット関数 (LibCurl)


CGI ライブラリ (Ring にて記述)
  • CGI ライブラリ - HTTP Get
  • CGI ライブラリ - HTTP Post
  • CGI ライブラリ - ファイルのアップロード
  • CGI ライブラリ - クッキー
  • CGI ライブラリ - URL エンコード
  • CGI ライブラリ - テンプレート
  • CGI ライブラリ - HTML 特殊文字
  • CGI ライブラリ - 関数を使用した HTML の生成
  • CGI ライブラリ - クラスを使用した HTML の生成
  • CGI ライブラリ - CRUD の用例 (MVC を使用)
  • CGI ライブラリ - ユーザーによる用例 (登録、ログインと確認)
拡張機能
  • C/C++ による拡張機能の使用 (シンプルなAPI)
  • C/C++ プログラムへの組み込み
  • 手軽に C/C++ ライブラリと接続するためのコード生成器 (Ring にて記述) があります。
  • デスクトップとモバイル用の 2D ゲーム作成 (Allegro ライブラリ)
  • デスクトップおよびモバイル用の GUI アプリケーションの作成 (Qt フレームワーク)。
これ以外にも
  • 非常に安定した動作
  • 十分な処理能力
  • 完成度の高い取扱説明書
Wikibooks での Ring 紹介記事 (外部サイト) Ring のサンプルソ-ス (Rosetta Code) 





グループ リソース チーム