11 pair: 言語設計; Ring を選ぶ理由は?
16 プログラミング言語 Ring には簡明、違和感の排除、組織化の奨励、
18 簡潔なシンタックス、そして自然なインタフェースの作成を可能にする機能群、
19 短時間で作成・構築できる宣言型ドメイン特化言語機能を標準装備しています。
20 非常に小規模、高速なスマートガベージコレクターにより、
21 プログラマはメモリを制御下に置くことができます。
22 また、多種多様なプログラミングパラダイムに対応しており、便利で実用的なライブラリが付属しています。
23 Ring は生産性と拡張性に優れた高品質な解決方法の開発のために設計しました。
31 * アプリケーション開発用のプログラミング言語です。
32 * ドメイン特化ライブラリ、フレームワーク、およびツールを作成できる汎用プログラミング言語です。
33 * ビジュアル・プログラミング言語 Programming Without Coding Technology (PWCT) ソフトウェアの次世代版の開発用に設計した実用プログラミング言語です。
34 * 小規模・高速な言語で C/C++ プロジェクトへ組み込めます。
35 * 学習と入門 (文教用途、およびコンパイラ・仮想計算機の概念) に使用できる単純明快な言語です。
36 * 生産性と拡張性に優れた高品質な解決方法の開発。
44 Ring は非常に簡明な言語であり、非常に単純明快なシンタックスで構成しています。プログラマには、ボイラープレートコードのないプログラムの記述を奨励しています。
46 'See' 命令はメッセージを標準出力へ表示します。
52 Main 関数はオプション扱いであり、ステートメントの後に実行するため、ローカルスコープで便利です。
59 動的型付け、およびレキシカルスコープを使用しています。変数名の先頭に $ は不要です!
61 文字列の連結は‘+’演算子です。弱い型付け言語であり、文字列はコンテキストに基づいて数値と文字列との間で自動的に変換します。
68 See "Count = " + nCount + nl + " ID = " + nID
81 See "Enter your name ? "
83 See "Hello " + Name # Name は name と同じです。
85 リストのインデックス (添字番号) は 1 から開始します。
89 aList = ["one","two","three"]
90 See aList[1] # one を表示
107 代入演算子は深いコピーを使用します (この操作は参照ではありません)。
111 aList = ["one","two","three"]
115 see aList2[1] # one を表示
117 数値と文字列は値渡しですが、リストとオブジェクトは参照渡しです。
118 For in ループ でリストの項目 (アイテム、要素とも言います) を更新できます。
125 see aList # one two three を表示
140 aList = [ [1,2,3,4,5] , aList[1] , aList[1] ]
141 see aList # 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 を表示
149 see "x=" + x + " y=" + y + nl
162 Ring ではプログラムの組織化を奨励しています。まずは関数、次にクラス、
163 そして、関数とヘンテコなモノと組み合わせるプログラミング言語を使用していた悪夢の日々を忘却の彼方へ追いやります!
172 これにより、構成要素で end キーワードを記述しなくてもパッケージ、
175 一行コメント、または複数行コメントを使えます。
176 一行コメントは # あるいは // で始まります。
177 複数行コメントは /* ~ \*/ の間に記述します。
182 プログラムの名前 : はじめての Ring プログラム
186 See "What is your name? " # 画面へメッセージを表示
187 give cName # ユーザからの標準入力を取得
188 see "Hello " + cName # こんにちわ!
194 pair: 言語設計; 簡潔なシンタックス
199 行の区別はしませんので、ステートメントの後に ; は不要です。または ENTER や TAB の打鍵は不要ですので、このようなコードを記述可能です。
204 See "The First Message" See " Another message in the same line! " + nl
205 See "Enter your name?" Give Name See "Hello " + Name
207 このコードは三種類の属性 X, Y および Z を有する Point クラスを作成します。クラス、パッケージ、関数の定義を終了するために end キーワードは使用していません。また、クラス名の直下に属性名を書くことができます。
214 この用例では、オブジェクトの新規作成と属性の設定、および値を表示します。
218 o1 = New point o1.x=10 o1.y=20 o1.z=30 See O1 Class Point X Y Z
220 ドット演算子‘.’でオブジェクトの属性とメソッドへアクセスするのではなく、括弧 { } でオブジェクトへアクセスできます。その後にオブジェクトの属性とメソッドを使えます。
224 o1 = New point { x=10 y=20 z=30 } See O1 Class Point X Y Z
226 メソッドの呼出し後に { } でオブジェクトへアクセスします。
234 Address = "Somewhere"
236 Print() # ここでは Print() メソッドを呼び出します。
238 Class Person Name Address Phone
240 See "Name :" + name + nl +
241 "Address :" + Address + nl +
242 "Phone : " + phone + nl
244 { } で、オブジェクトへアクセスしてからオブジェクト名を記述するとき、自動的に呼び出される全ての setter/getter メソッドに対してクラスを検査します。
250 See one # GetOne() の実行
251 See two # GetTwo() の実行
252 See three # GetThree() の実行
254 Class Number one two three
256 See "Number : One" + nl
259 See "Number : Two" + nl
262 See "Number : Three" + nl
266 pair: 言語設計; 自然言語ステートメントの定義
269 ============================
271 { } でオブジェクトへアクセス後に、クラスに BraceEnd() メソッドがあれば BraceEnd() メソッドを実行します!
276 TimeForFun = new journey
279 Hello it is me # なんと美しいプログラミングの世界でしょう!
283 hello=0 it=0 is=0 me=0
289 Eval() 関数は、文字列に記述されたコードを実行します。
294 cCode = "See 'Code that will be executed later!' "
295 Eval(cCode) # コードを実行してメッセージを表示します。
297 リストの作成後に、実行用のコードをリストから生成できます。
301 aWords = ["hello","it","is","me"]
302 for word in aWords cCode=word+"=0" eval(cCode) next
304 Read(cFileName) 関数は、テキストファイルを読み取ります。また Write(cFileName,cString) 関数はファイルへ書き込みます。
308 See "Enter File Name:" Give cFileName See Read(cFileName) # ファイルの内容を表示
310 この用例は、二つの命令を定義するクラスの作成方法です。
312 * 最初の命令は : I want window
314 * 次の命令は : Window title = <式>
316 * ‘the’キーワードなどは無視されます。
324 The window title = "hello world"
329 # I want window 命令の属性
333 # ここでは window 属性を再定義しません。
336 # 値を与えると、キーワードを無視します。
352 see "Instruction : I want window" + nl
361 see "Instruction : Window Title = " + cValue + nl
365 前述の用例を完了するには read() でファイルの内容を取得します。
370 The window title = "hello world"
372 そして eval() でファイルの内容を実行します!
374 また、 GUI ライブラリでウィンドウを作成するには GetWindow() と SetTitle() メソッドを更新します。
384 自然言語ステートメントによるコードの実行、および入れ子構造によるコードの実行方法について既に学んでいます。
386 この用例は Web ライブラリからの引用です。 Bootstrap ライブラリで HTML ドキュメントを生成します。
387 この用例では、 HTML コードを直接記述せずに、類似言語を作成しています (ただの用例です)。その後、宣言型言語を使用するために入れ子構造で HTML ドキュメントを生成しています。この用例での考えかたとして GetDiv() および GetH1() メソッドは { } でアクセスできるオブジェクトを返します。各オブジェクトへのアクセス後に BraceEnd() メソッドが実行されると、生成された HTML を BraceEnd() の出力表示がルートに到達するまで親オブジェクトへ送信します。
400 classname = :container
403 classname = :jumbotron
404 H1 { text("Bootstrap Page") }
412 classname = "col-sm-4"
413 H3 { html("Welcome to the Ring programming language") }
414 P { html("Using a scripting language is very fun!") }
421 このようなクラスで宣言型インタフェースを強化します。
425 Class Link from ObjsBase
428 cOutput = nl+GetTabs() + "<a href='" +
429 Link + "'> "+ Title + " </a> " + nl
431 Class Div from ObjsBase
437 cOutput += nl+"</div>" + nl
438 cOutput = TabMLString(cOutput)
441 pair: 言語設計; 柔軟性のあるシンタックス
444 ========================
448 また、言語のキーワードと演算子を変更することで、お好みの記法を作成できます!
457 Ring は透過型実装です。 コンパイラの処理段階、および仮想計算機による実行中の処理内容を把握できます。
459 例えば : ring helloworld.ring -tokens -rules -ic
470 ==================================================================
471 Tokens - Generated by the Scanner
472 ==================================================================
475 Literal : Hello, World!
478 ==================================================================
480 ==================================================================
481 Grammar Rules Used by The Parser
482 ==================================================================
484 Rule : Program --> {Statement}
487 Rule : Factor --> Literal
488 Rule : Range --> Factor
489 Rule : Term --> Range
490 Rule : Arithmetic --> Term
491 Rule : BitShift --> Arithmetic
492 Rule : BitAnd --> BitShift
493 Rule : BitOrXOR --> BitAnd
494 Rule : Compare --> BitOrXOR
495 Rule : EqualOrNot --> Compare
496 Rule : LogicNot -> EqualOrNot
497 Rule : Expr --> LogicNot
498 Rule : Statement --> 'See' Expr
500 ==================================================================
504 ==================================================================
505 Byte Code - Before Execution by the VM
506 ==================================================================
511 2 PushC Hello, World!
515 ==================================================================
525 Ring は、ビジュアル・プログラミングツール Programming Without Coding Technology (PWCT) で設計しました。
526 Ring のビジュアルソースは、 “visualsrc” フォルダの \*.ssf ファイルにあります。
527 生成された C 言語ソースコードは src フォルダ、
528 および include フォルダにあります。
530 このスクリーンショットは、 ring_vm.ssf ファイルからの引用です (ring_vm.c および ring_vm.h が生成されます)。
532 .. image:: visualsrc1.jpg
534 このスクリーンショットは、 ring_list.ssf ファイルからの引用です (ring_list.c および ring_list.h が生成されます)。
536 .. image:: visualsrc2.jpg
539 pair: 言語設計; スマートガベージコレクター
542 ==========================
544 わずらわしいメモリ操作関連の問題から解放します。
553 * グローバル変数は、代入ステートメントで削除するまでメモリに存在し続けます。
554 * 関数の処理終了後に、ローカル変数を削除します。
555 * プログラマは、代入ステートメントでメモリから変数を削除する時期を完全に制御できます。
565 二行目の直後、リスト [1,2,3,4,5] はメモリから削除され、文字列 “nice” が残ります。
567 * プログラマは callgc() 関数を呼び出すことで、ガベージコレクターを強制実行できます。
568 * 変数参照時 (関数へオブジェクト、およびリストを渡すとき)、参照カウントに基づいて変数を削除します。未参照では全て削除されますが、参照しているときはデータはメモリに残ります。
572 pair: 言語設計; インタプリタ (VM) 全体の停止なし (GIL なし)
574 インタプリタ (VM) 全体の停止なし (GIL なし)
575 ===========================================
577 アプリケーションでスレッドを使うとき、インタプリタ (VM) 全体の停止 (global interpreter (VM) lock) は起こりません (GIL なし)。
579 よって、スレッドは並列動作可能であり、Ring 命令は同時実行されます。
581 これは、スレッドと平行性において最良のものです (さらなる高速化が実現できます!)
585 pair: 言語設計; ほとんどのアプリケーションで十分に高速動作します
587 ほとんどのアプリケーションで十分に高速動作します
588 ================================================
590 プログラミング言語 Ring は単純明快、小規模、柔軟性のある最先端の設計です。また、ほとんどのアプリケーションで十分に高速動作します。
592 これまで、市販の電子計算機で Ring を使用してきました。下記の処理は約1秒で完了します。
594 (1) 100,000 行コードのコンパイル
595 (2) 1 ~ 10,000,000 まで数え上げる空ループの実行
596 (3) 100,000 項目から成るリストで最後の項目を見つけようとして、線形検索で 1000 回の検索処理を実行 (最悪値)
597 (4) 1,000,000 項目から成るリストを作成後にリスト全項目の合計を計算
598 (5) GUI アプリケーションで ListWidget へ 20,000 アイテムを追加
599 (6) GUI アプリケーションで TreeWidget へ 5,000 ノードを追加
600 (7) ターミナルのコンソールアプリケーションで 10,000 メッセージを表示
602 さらなる高速化を求めるならば C/C++ 拡張機能を使えます!
608 ? "Create list contains 100,000 items"
611 ? "Do 1000 search operation - Find the last item (Worst Case!)"
618 ? "Time: " + ( clock() - c ) / clockspersecond() + " seconds"
624 Create list contains 100,000 items
625 Do 1000 search operation - Find the last item (Worst Case!)
637 win = new qWidget() {
638 move(100,100) resize(500,500)
639 setWindowTitle("Many Tree Items - Testing Performance")
640 tree = new qTreeWidget(win) {
641 blocksignals(True) setUpdatesEnabled(False)
642 root = new qTreeWidgetItem()
643 root.setText(0,"The Root Node")
646 oItem = new qTreeWidgetItem()
647 oItem.settext(0,"Item " + t)
650 cTime = (clock()-t1)/clockspersecond()
651 setHeaderLabel("Creating 5000 nodes in " + cTime + " seconds.")
652 addTopLevelItem(root)
654 blocksignals(False) setUpdatesEnabled(True)
656 oLayout = new qVBoxLayout() {
668 .. image:: manytreeitems.png