<% eval(read("news.data")) %>

はじめに

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

新着情報(しんちゃくじょうほう)

<% for x=1 to 3 %> <% next %>
日付(ひづけ) 概要(がいよう)
<%= aNews[x][1] %> <%= aNews[x][2] %>

画期的(かっきてき)

画期的(かっきてき)

Ring(リング) には自然言語(しぜんげんご)プログラミング、宣言型(せんげんがた)プログラミングに(かん)する最良(さいりょう)支援機能(しえんきのう)があります。パラダイムには最先端(さいせんたん)のオブジェクト指向(しこう)プログラミング、関数型(かんすうがた)プログラミングの実用的(じつようてき)新技法(しんぎほう)により対応(たいおう)しています。コンパイラや構文解析(こうぶんかいせき)などの事前知識(じぜんちしき)不要(ふよう)です。短時間(たんじかん)でドメイン特化言語(とっかげんご)作成(さくせい)構築(こうちく)できる言語構成要素(げんごこうせいようそ)標準装備(ひょうじゅんそうび)しています。

Ring(リング)記事(きじ) (CodeProject(コード・プロジェクト)) シンタックスの柔軟性(じゅうなんせい) (CodeProject(コード・プロジェクト)) 宣言型手法(せんげんがたしゅほう) (CodeProject(コード・プロジェクト)) 自然言語(しぜんげんご)プログラミング (CodeProject(コード・プロジェクト)) 自然言語(しぜんげんご)プログラミング・ライブラリ (CodeProject(コード・プロジェクト))
(ゆたか)かな実用性(じつようせい)

(ゆたか)かな実用性(じつようせい)

Ring(リング) ライブラリ (StdLib(スタド・ライブ), WebLib(ウェブ・ライブ), 自然言語(しぜんげんご)ライブラリ、ゲームエンジンなど)、および Ring(リング) 統合開発環境(とうごうかいはつかんきょう) (Ring(リング) ノートパッド、フォームデザイナーなど) は Ring(リング)記述(きじゅつ)しました。 Ring(リング)製品開発(せいひんかいはつ)即戦力(そくせんりょく)であり、開発者(かいはつしゃ)生産性(せいさんせい)改善(かいぜん)します。


Ring を選ぶ理由は?

Ring を選ぶ理由は?

Ring は簡明、違和感(いわかん)の排除、組織化の奨励、および透過性とビジュアル実装からなるプログラミング言語です。 簡潔なシンタックス、そして自然なインタフェースの作成を可能にする機能群、さらに少しの時間で構築できる宣言型問題解決特化言語があります。 非常に小規模、高速なスマートガベージコレクターがあり、メモリをプログラマの制御下に置くことができます。

また、多種多様なプログラミングパラダイムに対応しており、インストール直後からすぐ使える業界標準の実用的なライブラリが付属しています (Allegro, FreeGLUT, cURL, LibUV, MySQL, ODBC, OpenGL, OpenSSL, PostgreSQL, Qt, RayLib, SDL, SQLite などに対応)。

この言語は生産性と拡張性に優れた高品質な解決方法の開発のために設計されています。 → 理由



明確な設計目標

  • アプリケーション開発用のプログラミング言語です。 → 用例
  • ドメイン特化ライブラリ、フレームワークおよびツールの作成に使用できる汎用言語です。 → 方法
  • ビジュアルプログラミング言語である 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 から開始します (Ring 1.11 以降は ZeroLib を使用することで 0 から始めることもできます)。 → 理由

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 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)