1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5 <html xmlns="http://www.w3.org/1999/xhtml">
7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9 <title>言語設計 — プログラミング言語 Ring 1.12 取扱説明書</title>
11 <link rel="stylesheet" href="_static/bootstrap-astropy.css" type="text/css" />
12 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
14 <script type="text/javascript">
15 var DOCUMENTATION_OPTIONS = {
18 COLLAPSE_INDEX: false,
23 <script type="text/javascript" src="_static/jquery.js"></script>
24 <script type="text/javascript" src="_static/underscore.js"></script>
25 <script type="text/javascript" src="_static/doctools.js"></script>
26 <script type="text/javascript" src="_static/translations.js"></script>
27 <link rel="top" title="プログラミング言語 Ring 1.12 取扱説明書" href="index.html" />
28 <link rel="next" title="Ring 1.12 の変更履歴" href="whatisnew12.html" />
29 <link rel="prev" title="はじめに" href="introduction.html" />
30 <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
33 <body role="document">
35 <a class="brand" title="Documentation Home" href="index.html"><span id="logotext1">🍩Ring</span><span id="logotext2"> 1.12</span><span id="logotext3">:docs</span></a>
38 <li><a href="http://ring-lang.sourceforge.net/news.html">News</a></li>
39 <li><a href="http://ring-lang.sourceforge.net/download.html">Download</a></li>
40 <li><a href="https://groups.google.com/forum/#!forum/ring-lang">Get Help</a></li>
41 <li><a href="https://github.com/ring-lang/ring">Contribute</a></li>
42 <li><a href="http://ring-lang.sourceforge.net/resources.html">Resources</a></li>
43 <li><a href="http://ring-lang.sourceforge.net/team.html">Team</a></li>
45 <li><a title="Ring Homepage" href="http://ring-lang.net/">Website</a></li>
46 <li><a title="総合索引" href="genindex.html">Index</a></li>
50 <form action="search.html" method="get">
51 <input type="text" name="q" placeholder="Search" />
52 <input type="hidden" name="check_keywords" value="yes" />
53 <input type="hidden" name="area" value="default" />
64 <a href="whatisnew12.html" title="Ring 1.12 の変更履歴">
69 <a href="introduction.html" title="はじめに">
75 <a href="index.html">プログラミング言語 Ring 1.12 取扱説明書</a>
84 <div class="document">
85 <div class="documentwrapper">
86 <div class="bodywrapper">
87 <div class="body" role="main">
89 <div class="section" id="index-0">
90 <span id="id1"></span><h1>言語設計<a class="headerlink" href="#index-0" title="このヘッドラインへのパーマリンク">¶</a></h1>
91 <p>言語設計の背景にある基本概念を学びます。</p>
92 <div class="section" id="ring">
93 <span id="index-1"></span><h2>Ring を選ぶ理由は?<a class="headerlink" href="#ring" title="このヘッドラインへのパーマリンク">¶</a></h2>
94 <p>プログラミング言語 Ring には簡明、違和感の排除、組織化の奨励、
96 簡潔なシンタックス、そして自然なインタフェースの作成を可能にする機能群、
97 短時間で作成・構築できる宣言型ドメイン特化言語機能を標準装備しています。
98 非常に小規模、高速なスマートガベージコレクターにより、
99 プログラマはメモリを制御下に置くことができます。
100 また、多種多様なプログラミングパラダイムに対応しており、便利で実用的なライブラリが付属しています。
101 Ring は生産性と拡張性に優れた高品質な解決方法の開発のために設計しました。</p>
103 <div class="section" id="index-2">
104 <span id="id2"></span><h2>明確な設計目標<a class="headerlink" href="#index-2" title="このヘッドラインへのパーマリンク">¶</a></h2>
106 <li>アプリケーション開発用のプログラミング言語です。</li>
107 <li>ドメイン特化ライブラリ、フレームワーク、およびツールを作成できる汎用プログラミング言語です。</li>
108 <li>ビジュアル・プログラミング言語 Programming Without Coding Technology (PWCT) ソフトウェアの次世代版の開発用に設計した実用プログラミング言語です。</li>
109 <li>小規模・高速な言語で C/C++ プロジェクトへ組み込めます。</li>
110 <li>学習と入門 (文教用途、およびコンパイラ・仮想計算機の概念) に使用できる単純明快な言語です。</li>
111 <li>生産性と拡張性に優れた高品質な解決方法の開発。</li>
114 <div class="section" id="index-3">
115 <span id="id3"></span><h2>簡明<a class="headerlink" href="#index-3" title="このヘッドラインへのパーマリンク">¶</a></h2>
116 <p>Ring は非常に簡明な言語であり、非常に単純明快なシンタックスで構成しています。プログラマには、ボイラープレートコードのないプログラムの記述を奨励しています。</p>
117 <p>‘See’ 命令はメッセージを標準出力へ表示します。</p>
118 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">"Hello, World!"</span>
121 <p>Main 関数はオプション扱いであり、ステートメントの後に実行するため、ローカルスコープで便利です。</p>
122 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Func</span> <span class="n">Main</span>
123 <span class="k">See</span> <span class="s">"Hello, World!"</span>
126 <p>動的型付け、およびレキシカルスコープを使用しています。変数名の先頭に $ は不要です!</p>
127 <p>文字列の連結は‘+’演算子です。弱い型付け言語であり、文字列はコンテキストに基づいて数値と文字列との間で自動的に変換します。</p>
128 <div class="highlight-ring"><div class="highlight"><pre><span class="n">nCount</span> <span class="o">=</span> <span class="mi">10</span> <span class="c"># グローバル変数</span>
129 <span class="k">Func</span> <span class="n">Main</span>
130 <span class="n">nID</span> <span class="o">=</span> <span class="mi">1</span> <span class="c"># ローカル変数</span>
131 <span class="k">See</span> <span class="s">"Count = "</span> <span class="o">+</span> <span class="n">nCount</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="s">" ID = "</span> <span class="o">+</span> <span class="n">nID</span>
135 <div class="section" id="index-4">
136 <span id="id4"></span><h2>違和感の排除<a class="headerlink" href="#index-4" title="このヘッドラインへのパーマリンク">¶</a></h2>
137 <p>Ring は英数大小文字を区別しません。</p>
138 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">"Enter your name ? "</span>
139 <span class="k">Give</span> <span class="n">name</span>
140 <span class="k">See</span> <span class="s">"Hello "</span> <span class="o">+</span> <span class="n">Name</span> <span class="c"># Name は name と同じです。</span>
143 <p>リストのインデックス (添字番号) は 1 から開始します。</p>
144 <div class="highlight-ring"><div class="highlight"><pre><span class="n">aList</span> <span class="o">=</span> <span class="o">[</span><span class="s">"one"</span><span class="p">,</span><span class="s">"two"</span><span class="p">,</span><span class="s">"three"</span><span class="o">]</span>
145 <span class="k">See</span> <span class="n">aList</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="c"># one を表示</span>
149 <div class="highlight-ring"><div class="highlight"><pre><span class="n">one</span><span class="p">()</span>
150 <span class="n">two</span><span class="p">()</span>
151 <span class="n">three</span><span class="p">()</span>
152 <span class="k">Func</span> <span class="n">one</span>
153 <span class="k">See</span> <span class="s">"One"</span> <span class="o">+</span> <span class="n">nl</span>
154 <span class="k">Func</span> <span class="n">two</span>
155 <span class="k">See</span> <span class="s">"two"</span> <span class="o">+</span> <span class="n">nl</span>
156 <span class="k">Func</span> <span class="n">three</span>
157 <span class="k">See</span> <span class="s">"three"</span> <span class="o">+</span> <span class="n">nl</span>
160 <p>代入演算子は深いコピーを使用します (この操作は参照ではありません)。</p>
161 <div class="highlight-ring"><div class="highlight"><pre><span class="n">aList</span> <span class="o">=</span> <span class="o">[</span><span class="s">"one"</span><span class="p">,</span><span class="s">"two"</span><span class="p">,</span><span class="s">"three"</span><span class="o">]</span>
162 <span class="n">aList2</span> <span class="o">=</span> <span class="n">aList</span>
163 <span class="n">aList</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="mi">1</span>
164 <span class="k">see</span> <span class="n">alist</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="c"># 1 を表示</span>
165 <span class="k">see</span> <span class="n">aList2</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="c"># one を表示</span>
168 <p>数値と文字列は値渡しですが、リストとオブジェクトは参照渡しです。
169 For in ループ でリストの項目 (アイテム、要素とも言います) を更新できます。</p>
170 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Func</span> <span class="n">Main</span>
171 <span class="n">aList</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="o">]</span>
172 <span class="n">update</span><span class="p">(</span><span class="n">aList</span><span class="p">)</span>
173 <span class="k">see</span> <span class="n">aList</span> <span class="c"># one two three を表示</span>
175 <span class="k">Func</span> <span class="n">update</span> <span class="n">aList</span>
176 <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="n">aList</span>
177 <span class="k">switch</span> <span class="n">x</span>
178 <span class="k">on</span> <span class="mi">1</span> <span class="n">x</span> <span class="o">=</span> <span class="s">"one"</span>
179 <span class="k">on</span> <span class="mi">2</span> <span class="n">x</span> <span class="o">=</span> <span class="s">"two"</span>
180 <span class="k">on</span> <span class="mi">3</span> <span class="n">x</span> <span class="o">=</span> <span class="s">"three"</span>
181 <span class="k">off</span>
182 <span class="k">next</span>
186 <div class="highlight-ring"><div class="highlight"><pre><span class="n">aList</span> <span class="o">=</span> <span class="o">[</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="o">]</span> <span class="p">,</span> <span class="n">aList</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="p">,</span> <span class="n">aList</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">]</span>
187 <span class="k">see</span> <span class="n">aList</span> <span class="c"># 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 を表示</span>
191 <div class="highlight-ring"><div class="highlight"><pre><span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">10</span>
192 <span class="k">for</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">10</span>
193 <span class="k">see</span> <span class="s">"x="</span> <span class="o">+</span> <span class="n">x</span> <span class="o">+</span> <span class="s">" y="</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span>
194 <span class="k">if</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">3</span> <span class="ow">and</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">5</span>
195 <span class="k">exit</span> <span class="mi">2</span> <span class="c"># 二階層のループから脱出</span>
196 <span class="k">ok</span>
197 <span class="k">next</span>
198 <span class="k">next</span>
202 <div class="section" id="index-5">
203 <span id="id5"></span><h2>組織化の奨励<a class="headerlink" href="#index-5" title="このヘッドラインへのパーマリンク">¶</a></h2>
204 <p>Ring ではプログラムの組織化を奨励しています。まずは関数、次にクラス、
205 そして、関数とヘンテコなモノと組み合わせるプログラミング言語を使用していた悪夢の日々を忘却の彼方へ追いやります!</p>
209 <li>ステートメントとグローバル変数</li>
213 <p>これにより、構成要素で end キーワードを記述しなくてもパッケージ、
215 <p>一行コメント、または複数行コメントを使えます。
216 一行コメントは # あるいは // で始まります。
217 複数行コメントは /* ~ */ の間に記述します。</p>
218 <div class="highlight-ring"><div class="highlight"><pre><span class="o">/*</span>
219 <span class="n">プログラムの名前</span> <span class="p">:</span> <span class="n">はじめての</span> <span class="n">Ring</span> <span class="n">プログラム</span>
220 <span class="n">日付</span> <span class="p">:</span> <span class="mf">2015.05.08</span>
221 <span class="o">*/</span>
223 <span class="k">See</span> <span class="s">"What is your name? "</span> <span class="c"># 画面へメッセージを表示</span>
224 <span class="k">give</span> <span class="n">cName</span> <span class="c"># ユーザからの標準入力を取得</span>
225 <span class="k">see</span> <span class="s">"Hello "</span> <span class="o">+</span> <span class="n">cName</span> <span class="c"># こんにちわ!</span>
227 <span class="o">//</span> <span class="k">See</span> <span class="s">"Bye!"</span>
231 <div class="section" id="index-6">
232 <span id="id6"></span><h2>簡潔なシンタックス<a class="headerlink" href="#index-6" title="このヘッドラインへのパーマリンク">¶</a></h2>
233 <p>行の区別はしませんので、ステートメントの後に ; は不要です。または ENTER や TAB の打鍵は不要ですので、このようなコードを記述可能です。</p>
234 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">"The First Message"</span> <span class="k">See</span> <span class="s">" Another message in the same line! "</span> <span class="o">+</span> <span class="n">nl</span>
235 <span class="k">See</span> <span class="s">"Enter your name?"</span> <span class="k">Give</span> <span class="n">Name</span> <span class="k">See</span> <span class="s">"Hello "</span> <span class="o">+</span> <span class="n">Name</span>
238 <p>このコードは三種類の属性 X, Y および Z を有する Point クラスを作成します。クラス、パッケージ、関数の定義を終了するために end キーワードは使用していません。また、クラス名の直下に属性名を書くことができます。</p>
239 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Class</span> <span class="n">Point</span> <span class="n">X</span> <span class="n">Y</span> <span class="n">Z</span>
243 この用例では、オブジェクトの新規作成と属性の設定、および値を表示します。</p>
244 <div class="highlight-ring"><div class="highlight"><pre><span class="n">o1</span> <span class="o">=</span> <span class="k">New</span> <span class="n">point</span> <span class="n">o1</span><span class="p">.</span><span class="n">x</span><span class="o">=</span><span class="mi">10</span> <span class="n">o1</span><span class="p">.</span><span class="n">y</span><span class="o">=</span><span class="mi">20</span> <span class="n">o1</span><span class="p">.</span><span class="n">z</span><span class="o">=</span><span class="mi">30</span> <span class="k">See</span> <span class="n">O1</span> <span class="k">Class</span> <span class="n">Point</span> <span class="n">X</span> <span class="n">Y</span> <span class="n">Z</span>
247 <p>ドット演算子‘.’でオブジェクトの属性とメソッドへアクセスするのではなく、括弧 { } でオブジェクトへアクセスできます。その後にオブジェクトの属性とメソッドを使えます。</p>
248 <div class="highlight-ring"><div class="highlight"><pre><span class="n">o1</span> <span class="o">=</span> <span class="k">New</span> <span class="n">point</span> <span class="p">{</span> <span class="n">x</span><span class="o">=</span><span class="mi">10</span> <span class="n">y</span><span class="o">=</span><span class="mi">20</span> <span class="n">z</span><span class="o">=</span><span class="mi">30</span> <span class="p">}</span> <span class="k">See</span> <span class="n">O1</span> <span class="k">Class</span> <span class="n">Point</span> <span class="n">X</span> <span class="n">Y</span> <span class="n">Z</span>
251 <p>メソッドの呼び出し後に { } でオブジェクトへアクセスします。</p>
252 <div class="highlight-ring"><div class="highlight"><pre><span class="n">oPerson</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span>
253 <span class="p">{</span>
254 <span class="n">Name</span> <span class="o">=</span> <span class="s">"Somebody"</span>
255 <span class="n">Address</span> <span class="o">=</span> <span class="s">"Somewhere"</span>
256 <span class="n">Phone</span> <span class="o">=</span> <span class="s">"0000000"</span>
257 <span class="n">Print</span><span class="p">()</span> <span class="c"># ここでは Print() メソッドを呼び出します。</span>
258 <span class="p">}</span>
259 <span class="k">Class</span> <span class="n">Person</span> <span class="n">Name</span> <span class="n">Address</span> <span class="n">Phone</span>
260 <span class="k">Func</span> <span class="n">Print</span>
261 <span class="k">See</span> <span class="s">"Name :"</span> <span class="o">+</span> <span class="n">name</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span>
262 <span class="s">"Address :"</span> <span class="o">+</span> <span class="n">Address</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span>
263 <span class="s">"Phone : "</span> <span class="o">+</span> <span class="n">phone</span> <span class="o">+</span> <span class="n">nl</span>
266 <p>{ } で、オブジェクトへアクセスしてからオブジェクト名を記述するとき、自動的に呼び出される全ての setter/getter メソッドに対してクラスを検査します。</p>
267 <div class="highlight-ring"><div class="highlight"><pre><span class="k">New</span> <span class="n">Number</span> <span class="p">{</span>
268 <span class="k">See</span> <span class="n">one</span> <span class="c"># GetOne() の実行</span>
269 <span class="k">See</span> <span class="n">two</span> <span class="c"># GetTwo() の実行</span>
270 <span class="k">See</span> <span class="n">three</span> <span class="c"># GetThree() の実行</span>
271 <span class="p">}</span>
272 <span class="k">Class</span> <span class="n">Number</span> <span class="n">one</span> <span class="n">two</span> <span class="n">three</span>
273 <span class="k">Func</span> <span class="n">GetOne</span>
274 <span class="k">See</span> <span class="s">"Number : One"</span> <span class="o">+</span> <span class="n">nl</span>
275 <span class="k">return</span> <span class="mi">1</span>
276 <span class="k">Func</span> <span class="n">GetTwo</span>
277 <span class="k">See</span> <span class="s">"Number : Two"</span> <span class="o">+</span> <span class="n">nl</span>
278 <span class="k">return</span> <span class="mi">2</span>
279 <span class="k">Func</span> <span class="n">GetThree</span>
280 <span class="k">See</span> <span class="s">"Number : Three"</span> <span class="o">+</span> <span class="n">nl</span>
281 <span class="k">return</span> <span class="mi">3</span>
285 <div class="section" id="index-7">
286 <span id="id7"></span><h2>自然言語ステートメントの定義<a class="headerlink" href="#index-7" title="このヘッドラインへのパーマリンク">¶</a></h2>
287 <p>{ } でオブジェクトへアクセス後に、クラスに BraceEnd() メソッドがあれば BraceEnd() メソッドを実行します!</p>
288 <div class="highlight-ring"><div class="highlight"><pre><span class="n">TimeForFun</span> <span class="o">=</span> <span class="k">new</span> <span class="n">journey</span>
289 <span class="c"># あっと驚く!</span>
290 <span class="n">TimeForFun</span> <span class="p">{</span>
291 <span class="n">Hello</span> <span class="n">it</span> <span class="n">is</span> <span class="n">me</span> <span class="c"># なんと美しいプログラミングの世界でしょう!</span>
292 <span class="p">}</span>
293 <span class="c"># クラス本体</span>
294 <span class="k">Class</span> <span class="n">journey</span>
295 <span class="n">hello</span><span class="o">=</span><span class="mi">0</span> <span class="n">it</span><span class="o">=</span><span class="mi">0</span> <span class="n">is</span><span class="o">=</span><span class="mi">0</span> <span class="n">me</span><span class="o">=</span><span class="mi">0</span>
296 <span class="k">func</span> <span class="n">GetHello</span>
297 <span class="k">See</span> <span class="s">"Hello"</span> <span class="o">+</span> <span class="n">nl</span>
298 <span class="k">func</span> <span class="n">braceEnd</span>
299 <span class="k">See</span> <span class="s">"Goodbye!"</span> <span class="o">+</span> <span class="n">nl</span>
302 <p>Eval() 関数は、文字列に記述されたコードを実行します。</p>
303 <div class="highlight-ring"><div class="highlight"><pre><span class="n">cCode</span> <span class="o">=</span> <span class="s">"See 'Code that will be executed later!' "</span>
304 <span class="n">Eval</span><span class="p">(</span><span class="n">cCode</span><span class="p">)</span> <span class="c"># コードを実行してメッセージを表示します。</span>
307 <p>リストの作成後に、実行用のコードをリストから生成できます。</p>
308 <div class="highlight-ring"><div class="highlight"><pre><span class="n">aWords</span> <span class="o">=</span> <span class="o">[</span><span class="s">"hello"</span><span class="p">,</span><span class="s">"it"</span><span class="p">,</span><span class="s">"is"</span><span class="p">,</span><span class="s">"me"</span><span class="o">]</span>
309 <span class="k">for</span> <span class="n">word</span> <span class="k">in</span> <span class="n">aWords</span> <span class="n">cCode</span><span class="o">=</span><span class="n">word</span><span class="o">+</span><span class="s">"=0"</span> <span class="n">eval</span><span class="p">(</span><span class="n">cCode</span><span class="p">)</span> <span class="k">next</span>
312 <p>Read(cFileName) 関数は、テキストファイルを読み取ります。また Write(cFileName,cString) 関数はファイルへ書き込みます。</p>
313 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">"Enter File Name:"</span> <span class="k">Give</span> <span class="n">cFileName</span> <span class="k">See</span> <span class="n">Read</span><span class="p">(</span><span class="n">cFileName</span><span class="p">)</span> <span class="c"># ファイルの内容を表示</span>
316 <p>この用例は、二つの命令を定義するクラスの作成方法です。</p>
318 <li>最初の命令は : I want window</li>
319 <li>次の命令は : Window title = <式></li>
320 <li>‘the’キーワードなどは無視されます。</li>
322 <div class="highlight-ring"><div class="highlight"><pre><span class="k">New</span> <span class="n">App</span>
323 <span class="p">{</span>
324 <span class="n">I</span> <span class="n">want</span> <span class="n">window</span>
325 <span class="n">The</span> <span class="n">window</span> <span class="n">title</span> <span class="o">=</span> <span class="s">"hello world"</span>
326 <span class="p">}</span>
328 <span class="k">Class</span> <span class="n">App</span>
330 <span class="c"># I want window 命令の属性</span>
331 <span class="n">i</span> <span class="n">want</span> <span class="n">window</span>
332 <span class="n">nIwantwindow</span> <span class="o">=</span> <span class="mi">0</span>
333 <span class="c"># Window title 命令の属性</span>
334 <span class="c"># ここでは window 属性を再定義しません。</span>
335 <span class="n">title</span>
336 <span class="n">nWindowTitle</span> <span class="o">=</span> <span class="mi">0</span>
337 <span class="c"># 値を与えると、キーワードを無視します。</span>
338 <span class="n">the</span><span class="o">=</span><span class="mi">0</span>
340 <span class="k">func</span> <span class="n">geti</span>
341 <span class="k">if</span> <span class="n">nIwantwindow</span> <span class="o">=</span> <span class="mi">0</span>
342 <span class="n">nIwantwindow</span><span class="o">++</span>
343 <span class="k">ok</span>
345 <span class="k">func</span> <span class="n">getwant</span>
346 <span class="k">if</span> <span class="n">nIwantwindow</span> <span class="o">=</span> <span class="mi">1</span>
347 <span class="n">nIwantwindow</span><span class="o">++</span>
348 <span class="k">ok</span>
350 <span class="k">func</span> <span class="n">getwindow</span>
351 <span class="k">if</span> <span class="n">nIwantwindow</span> <span class="o">=</span> <span class="mi">2</span>
352 <span class="n">nIwantwindow</span><span class="o">=</span> <span class="mi">0</span>
353 <span class="k">see</span> <span class="s">"Instruction : I want window"</span> <span class="o">+</span> <span class="n">nl</span>
354 <span class="k">ok</span>
355 <span class="k">if</span> <span class="n">nWindowTitle</span> <span class="o">=</span> <span class="mi">0</span>
356 <span class="n">nWindowTitle</span><span class="o">++</span>
357 <span class="k">ok</span>
359 <span class="k">func</span> <span class="n">settitle</span> <span class="n">cValue</span>
360 <span class="k">if</span> <span class="n">nWindowTitle</span> <span class="o">=</span> <span class="mi">1</span>
361 <span class="n">nWindowTitle</span><span class="o">=</span><span class="mi">0</span>
362 <span class="k">see</span> <span class="s">"Instruction : Window Title = "</span> <span class="o">+</span> <span class="n">cValue</span> <span class="o">+</span> <span class="n">nl</span>
363 <span class="k">ok</span>
366 <p>前述の用例を完了するには read() でファイルの内容を取得します。</p>
367 <div class="highlight-ring"><div class="highlight"><pre><span class="n">I</span> <span class="n">want</span> <span class="n">window</span>
368 <span class="n">The</span> <span class="n">window</span> <span class="n">title</span> <span class="o">=</span> <span class="s">"hello world"</span>
371 <p>そして eval() でファイルの内容を実行します!</p>
372 <p>また、 GUI ライブラリでウィンドウを作成するには GetWindow() と SetTitle() メソッドを更新します。</p>
374 <div class="section" id="index-8">
375 <span id="id8"></span><h2>宣言型言語の定義<a class="headerlink" href="#index-8" title="このヘッドラインへのパーマリンク">¶</a></h2>
376 <p>自然言語ステートメントによるコードの実行、および入れ子構造によるコードの実行方法について既に学んでいます。</p>
377 <p>この用例は Web ライブラリからの引用です。 Bootstrap ライブラリで HTML ドキュメントを生成します。
378 この用例では、 HTML コードを直接記述せずに、類似言語を作成しています (ただの用例です)。その後、宣言型言語を使用するために入れ子構造で HTML ドキュメントを生成しています。この用例での考えかたとして GetDiv() および GetH1() メソッドは { } でアクセスできるオブジェクトを返します。各オブジェクトへのアクセス後に BraceEnd() メソッドが実行されると、生成された HTML を BraceEnd() の出力表示がルートに到達するまで親オブジェクトへ送信します。</p>
379 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Load</span> <span class="s">"weblib.ring"</span>
380 <span class="k">Import</span> <span class="n">System</span><span class="p">.</span><span class="n">Web</span>
382 <span class="k">Func</span> <span class="n">Main</span>
384 <span class="n">BootStrapWebPage</span><span class="p">()</span>
385 <span class="p">{</span>
386 <span class="n">div</span>
387 <span class="p">{</span>
388 <span class="n">classname</span> <span class="o">=</span> <span class="p">:</span><span class="n">container</span>
389 <span class="n">div</span>
390 <span class="p">{</span>
391 <span class="n">classname</span> <span class="o">=</span> <span class="p">:</span><span class="n">jumbotron</span>
392 <span class="n">H1</span> <span class="p">{</span> <span class="n">text</span><span class="p">(</span><span class="s">"Bootstrap Page"</span><span class="p">)</span> <span class="p">}</span>
393 <span class="p">}</span>
394 <span class="n">div</span>
395 <span class="p">{</span>
396 <span class="n">classname</span> <span class="o">=</span> <span class="p">:</span><span class="n">row</span>
397 <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">3</span>
398 <span class="n">div</span>
399 <span class="p">{</span>
400 <span class="n">classname</span> <span class="o">=</span> <span class="s">"col-sm-4"</span>
401 <span class="n">H3</span> <span class="p">{</span> <span class="n">html</span><span class="p">(</span><span class="s">"Welcome to the Ring programming language"</span><span class="p">)</span> <span class="p">}</span>
402 <span class="n">P</span> <span class="p">{</span> <span class="n">html</span><span class="p">(</span><span class="s">"Using a scripting language is very fun!"</span><span class="p">)</span> <span class="p">}</span>
403 <span class="p">}</span>
404 <span class="k">next</span>
405 <span class="p">}</span>
406 <span class="p">}</span>
407 <span class="p">}</span>
410 <p>このようなクラスで宣言型インタフェースを強化します。</p>
411 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Class</span> <span class="n">Link</span> <span class="k">from</span> <span class="n">ObjsBase</span>
412 <span class="n">title</span> <span class="n">link</span>
413 <span class="k">Func</span> <span class="n">braceend</span>
414 <span class="n">cOutput</span> <span class="o">=</span> <span class="n">nl</span><span class="o">+</span><span class="n">GetTabs</span><span class="p">()</span> <span class="o">+</span> <span class="s">"<a href='"</span> <span class="o">+</span>
415 <span class="n">Link</span> <span class="o">+</span> <span class="s">"'> "</span><span class="o">+</span> <span class="n">Title</span> <span class="o">+</span> <span class="s">" </a> "</span> <span class="o">+</span> <span class="n">nl</span>
417 <span class="k">Class</span> <span class="n">Div</span> <span class="k">from</span> <span class="n">ObjsBase</span>
418 <span class="k">Func</span> <span class="n">braceend</span>
419 <span class="n">cOutput</span> <span class="o">+=</span> <span class="n">nl</span><span class="o">+</span><span class="sc">'<div'</span>
420 <span class="n">addattributes</span><span class="p">()</span>
421 <span class="n">AddStyle</span><span class="p">()</span>
422 <span class="n">getobjsdata</span><span class="p">()</span>
423 <span class="n">cOutput</span> <span class="o">+=</span> <span class="n">nl</span><span class="o">+</span><span class="s">"</div>"</span> <span class="o">+</span> <span class="n">nl</span>
424 <span class="n">cOutput</span> <span class="o">=</span> <span class="n">TabMLString</span><span class="p">(</span><span class="n">cOutput</span><span class="p">)</span>
428 <div class="section" id="index-9">
429 <span id="id9"></span><h2>柔軟性のあるシンタックス<a class="headerlink" href="#index-9" title="このヘッドラインへのパーマリンク">¶</a></h2>
430 <p>様々なソースコードの記法があります!</p>
431 <p>また、言語のキーワードと演算子を変更することで、お好みの記法を作成できます!</p>
433 <div class="section" id="index-10">
434 <span id="id10"></span><h2>透過型実装<a class="headerlink" href="#index-10" title="このヘッドラインへのパーマリンク">¶</a></h2>
435 <p>Ring は透過型実装です。 コンパイラの処理段階、および仮想計算機による実行中の処理内容を把握できます。</p>
436 <p>例えば : ring helloworld.ring -tokens -rules -ic</p>
437 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">"Hello, World!"</span>
441 <div class="highlight-ring"><div class="highlight"><pre><span class="o">==================================================================</span>
442 <span class="n">Tokens</span> <span class="o">-</span> <span class="n">Generated</span> <span class="n">by</span> <span class="n">the</span> <span class="n">Scanner</span>
443 <span class="o">==================================================================</span>
445 <span class="n">Keyword</span> <span class="p">:</span> <span class="k">SEE</span>
446 <span class="n">Literal</span> <span class="p">:</span> <span class="n">Hello</span><span class="p">,</span> <span class="n">World</span><span class="o">!</span>
447 <span class="n">EndLine</span>
449 <span class="o">==================================================================</span>
451 <span class="o">==================================================================</span>
452 <span class="n">Grammar</span> <span class="n">Rules</span> <span class="n">Used</span> <span class="n">by</span> <span class="n">The</span> <span class="n">Parser</span>
453 <span class="o">==================================================================</span>
455 <span class="n">Rule</span> <span class="p">:</span> <span class="n">Program</span> <span class="o">--></span> <span class="p">{</span><span class="n">Statement</span><span class="p">}</span>
457 <span class="n">Line</span> <span class="mi">1</span>
458 <span class="n">Rule</span> <span class="p">:</span> <span class="n">Factor</span> <span class="o">--></span> <span class="n">Literal</span>
459 <span class="n">Rule</span> <span class="p">:</span> <span class="n">Range</span> <span class="o">--></span> <span class="n">Factor</span>
460 <span class="n">Rule</span> <span class="p">:</span> <span class="n">Term</span> <span class="o">--></span> <span class="n">Range</span>
461 <span class="n">Rule</span> <span class="p">:</span> <span class="n">Arithmetic</span> <span class="o">--></span> <span class="n">Term</span>
462 <span class="n">Rule</span> <span class="p">:</span> <span class="n">BitShift</span> <span class="o">--></span> <span class="n">Arithmetic</span>
463 <span class="n">Rule</span> <span class="p">:</span> <span class="n">BitAnd</span> <span class="o">--></span> <span class="n">BitShift</span>
464 <span class="n">Rule</span> <span class="p">:</span> <span class="n">BitOrXOR</span> <span class="o">--></span> <span class="n">BitAnd</span>
465 <span class="n">Rule</span> <span class="p">:</span> <span class="n">Compare</span> <span class="o">--></span> <span class="n">BitOrXOR</span>
466 <span class="n">Rule</span> <span class="p">:</span> <span class="n">EqualOrNot</span> <span class="o">--></span> <span class="n">Compare</span>
467 <span class="n">Rule</span> <span class="p">:</span> <span class="n">LogicNot</span> <span class="o">-></span> <span class="n">EqualOrNot</span>
468 <span class="n">Rule</span> <span class="p">:</span> <span class="n">Expr</span> <span class="o">--></span> <span class="n">LogicNot</span>
469 <span class="n">Rule</span> <span class="p">:</span> <span class="n">Statement</span> <span class="o">--></span> <span class="sc">'See'</span> <span class="n">Expr</span>
471 <span class="o">==================================================================</span>
475 <span class="o">==================================================================</span>
476 <span class="n">Byte</span> <span class="n">Code</span> <span class="o">-</span> <span class="n">Before</span> <span class="n">Execution</span> <span class="n">by</span> <span class="n">the</span> <span class="n">VM</span>
477 <span class="o">==================================================================</span>
479 <span class="n">PC</span> <span class="n">OPCode</span> <span class="n">Data</span>
481 <span class="mi">1</span> <span class="n">FuncExE</span>
482 <span class="mi">2</span> <span class="n">PushC</span> <span class="n">Hello</span><span class="p">,</span> <span class="n">World</span><span class="o">!</span>
483 <span class="mi">3</span> <span class="n">Print</span>
484 <span class="mi">4</span> <span class="n">ReturnNull</span>
486 <span class="o">==================================================================</span>
488 <span class="n">Hello</span><span class="p">,</span> <span class="n">World</span><span class="o">!</span>
492 <div class="section" id="index-11">
493 <span id="id11"></span><h2>ビジュアル実装<a class="headerlink" href="#index-11" title="このヘッドラインへのパーマリンク">¶</a></h2>
494 <p>Ring は、ビジュアル・プログラミングツール Programming Without Coding Technology (PWCT) で設計しました。
495 Ring のビジュアルソースは、 “visualsrc” フォルダの *.ssf ファイルにあります。
496 生成された C 言語ソースコードは src フォルダ、
497 および include フォルダにあります。</p>
498 <p>このスクリーンショットは、 ring_vm.ssf ファイルからの引用です (ring_vm.c および ring_vm.h が生成されます)。</p>
499 <img alt="_images/visualsrc1.jpg" src="_images/visualsrc1.jpg" />
500 <p>このスクリーンショットは、 ring_list.ssf ファイルからの引用です (ring_list.c および ring_list.h が生成されます)。</p>
501 <img alt="_images/visualsrc2.jpg" src="_images/visualsrc2.jpg" />
503 <div class="section" id="index-12">
504 <span id="id12"></span><h2>スマートガベージコレクター<a class="headerlink" href="#index-12" title="このヘッドラインへのパーマリンク">¶</a></h2>
505 <p>わずらわしいメモリ操作関連の問題から解放します。</p>
509 <li>未初期化メモリへのアクセス</li>
514 <li>グローバル変数は、代入ステートメントで削除するまでメモリに存在し続けます。</li>
515 <li>関数の処理終了後に、ローカル変数を削除します。</li>
516 <li>プログラマは、代入ステートメントでメモリから変数を削除する時期を完全に制御できます。</li>
519 <div class="highlight-ring"><div class="highlight"><pre><span class="n">aList</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="o">]</span>
520 <span class="n">aList</span> <span class="o">=</span> <span class="s">"nice"</span>
523 <p>二行目の直後、リスト [1,2,3,4,5] はメモリから削除され、文字列 “nice” が残ります。</p>
525 <li>プログラマは callgc() 関数を呼び出すことで、ガベージコレクターを強制実行できます。</li>
526 <li>変数参照時 (関数へオブジェクト、およびリストを渡すとき)、参照カウントに基づいて変数を削除します。未参照では全て削除されますが、参照しているときはデータはメモリに残ります。</li>
529 <div class="section" id="vm-gil">
530 <span id="index-13"></span><h2>インタプリタ (VM) 全体の停止なし (GIL なし)<a class="headerlink" href="#vm-gil" title="このヘッドラインへのパーマリンク">¶</a></h2>
531 <p>アプリケーションでスレッドを使うとき、インタプリタ (VM) 全体の停止 (global interpreter (VM) lock) は起こりません (GIL なし)。</p>
532 <p>よって、スレッドは並列動作可能であり、Ring 命令は同時実行されます。</p>
533 <p>これは、スレッドと平行性において最良のものです (さらなる高速化が実現できます!)</p>
535 <div class="section" id="index-14">
536 <span id="id13"></span><h2>ほとんどのアプリケーションで十分に高速動作します<a class="headerlink" href="#index-14" title="このヘッドラインへのパーマリンク">¶</a></h2>
537 <p>プログラミング言語 Ring は単純明快、小規模、柔軟性のある最先端の設計です。また、ほとんどのアプリケーションで十分に高速動作します。</p>
538 <p>これまで、市販の電子計算機で Ring を使用してきました。下記の処理は約1秒で完了します。</p>
539 <ol class="arabic simple">
540 <li>100,000 行コードのコンパイル</li>
541 <li>1 ~ 10,000,000 まで数え上げる空ループの実行</li>
542 <li>100,000 項目から成るリストで最後の項目を見つけようとして、線形検索で 1000 回の検索処理を実行 (最悪値)</li>
543 <li>1,000,000 項目から成るリストを作成後にリスト全項目の合計を計算</li>
544 <li>GUI アプリケーションで ListWidget へ 20,000 アイテムを追加</li>
545 <li>GUI アプリケーションで TreeWidget へ 5,000 ノードを追加</li>
546 <li>ターミナルのコンソールアプリケーションで 10,000 メッセージを表示</li>
548 <p>さらなる高速化を求めるならば C/C++ 拡張機能を使えます!</p>
550 <div class="highlight-ring"><div class="highlight"><pre><span class="o">?</span> <span class="s">"Create list contains 100,000 items"</span>
551 <span class="n">aList</span> <span class="o">=</span> <span class="mi">1</span><span class="p">:</span><span class="mi">100000</span>
553 <span class="o">?</span> <span class="s">"Do 1000 search operation - Find the last item (Worst Case!)"</span>
554 <span class="n">c</span> <span class="o">=</span> <span class="n">clock</span><span class="p">()</span>
556 <span class="k">for</span> <span class="n">t</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">1000</span>
557 <span class="n">find</span><span class="p">(</span><span class="n">alist</span><span class="p">,</span><span class="mi">100000</span><span class="p">)</span>
558 <span class="k">next</span>
560 <span class="o">?</span> <span class="s">"Time: "</span> <span class="o">+</span> <span class="p">(</span> <span class="n">clock</span><span class="p">()</span> <span class="o">-</span> <span class="n">c</span> <span class="p">)</span> <span class="o">/</span> <span class="n">clockspersecond</span><span class="p">()</span> <span class="o">+</span> <span class="s">" seconds"</span>
564 <div class="highlight-none"><div class="highlight"><pre>Create list contains 100,000 items
565 Do 1000 search operation - Find the last item (Worst Case!)
570 <div class="highlight-ring"><div class="highlight"><pre><span class="k">load</span> <span class="s">"guilib.ring"</span>
572 <span class="k">func</span> <span class="n">main</span>
574 <span class="k">new</span> <span class="n">qApp</span> <span class="p">{</span>
575 <span class="n">win</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qWidget</span><span class="p">()</span> <span class="p">{</span>
576 <span class="n">move</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span> <span class="n">resize</span><span class="p">(</span><span class="mi">500</span><span class="p">,</span><span class="mi">500</span><span class="p">)</span>
577 <span class="n">setWindowTitle</span><span class="p">(</span><span class="s">"Many Tree Items - Testing Performance"</span><span class="p">)</span>
578 <span class="kt">tree</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qTreeWidget</span><span class="p">(</span><span class="n">win</span><span class="p">)</span> <span class="p">{</span>
579 <span class="n">blocksignals</span><span class="p">(</span><span class="kp">True</span><span class="p">)</span> <span class="n">setUpdatesEnabled</span><span class="p">(</span><span class="kp">False</span><span class="p">)</span>
580 <span class="n">root</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qTreeWidgetItem</span><span class="p">()</span>
581 <span class="n">root</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="s">"The Root Node"</span><span class="p">)</span>
582 <span class="n">t1</span> <span class="o">=</span> <span class="n">clock</span><span class="p">()</span>
583 <span class="k">for</span> <span class="n">t</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">5000</span>
584 <span class="n">oItem</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qTreeWidgetItem</span><span class="p">()</span>
585 <span class="n">oItem</span><span class="p">.</span><span class="n">settext</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="s">"Item "</span> <span class="o">+</span> <span class="n">t</span><span class="p">)</span>
586 <span class="n">root</span><span class="p">.</span><span class="n">addchild</span><span class="p">(</span><span class="n">oItem</span><span class="p">)</span>
587 <span class="k">next</span>
588 <span class="n">cTime</span> <span class="o">=</span> <span class="p">(</span><span class="n">clock</span><span class="p">()</span><span class="o">-</span><span class="n">t1</span><span class="p">)</span><span class="o">/</span><span class="n">clockspersecond</span><span class="p">()</span>
589 <span class="n">setHeaderLabel</span><span class="p">(</span><span class="s">"Creating 5000 nodes in "</span> <span class="o">+</span> <span class="n">cTime</span> <span class="o">+</span> <span class="s">" seconds."</span><span class="p">)</span>
590 <span class="n">addTopLevelItem</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
591 <span class="n">expanditem</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
592 <span class="n">blocksignals</span><span class="p">(</span><span class="kp">False</span><span class="p">)</span> <span class="n">setUpdatesEnabled</span><span class="p">(</span><span class="kp">True</span><span class="p">)</span>
593 <span class="p">}</span>
594 <span class="n">oLayout</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qVBoxLayout</span><span class="p">()</span> <span class="p">{</span>
595 <span class="n">addWidget</span><span class="p">(</span><span class="kt">tree</span><span class="p">)</span>
596 <span class="p">}</span>
597 <span class="n">setLayout</span><span class="p">(</span><span class="n">oLayout</span><span class="p">)</span>
598 <span class="n">show</span><span class="p">()</span>
599 <span class="p">}</span>
600 <span class="n">exec</span><span class="p">()</span>
601 <span class="p">}</span>
605 <img alt="大量のツリー項目" src="_images/manytreeitems.png" />
613 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
614 <div class="sphinxsidebarwrapper"><h3>ページの内容</h3>
616 <li><a class="reference internal" href="#">言語設計</a><ul>
617 <li><a class="reference internal" href="#ring">Ring を選ぶ理由は?</a></li>
618 <li><a class="reference internal" href="#index-2">明確な設計目標</a></li>
619 <li><a class="reference internal" href="#index-3">簡明</a></li>
620 <li><a class="reference internal" href="#index-4">違和感の排除</a></li>
621 <li><a class="reference internal" href="#index-5">組織化の奨励</a></li>
622 <li><a class="reference internal" href="#index-6">簡潔なシンタックス</a></li>
623 <li><a class="reference internal" href="#index-7">自然言語ステートメントの定義</a></li>
624 <li><a class="reference internal" href="#index-8">宣言型言語の定義</a></li>
625 <li><a class="reference internal" href="#index-9">柔軟性のあるシンタックス</a></li>
626 <li><a class="reference internal" href="#index-10">透過型実装</a></li>
627 <li><a class="reference internal" href="#index-11">ビジュアル実装</a></li>
628 <li><a class="reference internal" href="#index-12">スマートガベージコレクター</a></li>
629 <li><a class="reference internal" href="#vm-gil">インタプリタ (VM) 全体の停止なし (GIL なし)</a></li>
630 <li><a class="reference internal" href="#index-14">ほとんどのアプリケーションで十分に高速動作します</a></li>
637 <p class="topless"><a href="introduction.html"
638 title="前の章へ">はじめに</a></p>
640 <p class="topless"><a href="whatisnew12.html"
641 title="次の章へ">Ring 1.12 の変更履歴</a></p>
642 <div role="note" aria-label="source link">
644 <ul class="this-page-menu">
645 <li><a href="_sources/languagedesign.txt"
646 rel="nofollow">ソースコードを表示</a></li>
650 <form action="search.html" method="get">
651 <input type="text" name="q" placeholder="Search" />
652 <input type="hidden" name="check_keywords" value="yes" />
653 <input type="hidden" name="area" value="default" />
658 <div class="clearer"></div>
660 <footer class="footer">
661 <p class="pull-right">
662 <a href="_sources/languagedesign.txt"
663 rel="nofollow">ソースコードを表示</a>
664 <a href="#">冒頭へ戻る</a></p>
666 © Copyright 2016-2020, Ring Team.<br/>
667 Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 1.3.6 / astropy-sphinx-theme 1.1 (isVowel)