Ring 1.14 の変更履歴

Ring 1.14 (2021年01月25日) の新機能と変更点です。

新機能と変更リスト

Ring 1.14 の新機能!

  • MyCoffee (ウェブアプリケーション)

  • ウェブ開発のサンプル

  • 新作サンプル集

  • アーランの B 公式

  • 顧客情報フォーム

  • RingTilengine 拡張機能

  • RingLibui 拡張機能

  • RingSockets 拡張機能

  • RingThreads 拡張機能

  • RingOpenSSL の改良

  • 関数の追加

  • 関数の改良

  • 文字列処理における実行性能の向上

  • 数値処理の改良

  • CLOC (Count Lines of Code) の追加

  • そのほかの改善

MyCoffee (ウェブアプリケーション)

WebLib ライブラリと PostgreSQL データベースを用いたウェブアプリケーションです。

スクリーンショット:

MyCoffee1 MyCoffee2 MyCoffee3

ウェブ開発のサンプル

Hassouna Course は、講義番号 301 よりウェブ開発を扱います。

今回の講義ではバックエンドのウェブ開発で WebLib を採用しています。

講義専用 YoutTube プレイリストは:

このフォルダにサンプル集を追加しました:

スクリーンショット:

  • Calculator のサンプル

ウェブ開発のサンプル 1

新作サンプル集

以下のサンプルを samples フォルダへ追加しました

  • ring/samples/UsingQML/sample12 フォルダ

  • ring/samples/General/TimeServer フォルダ

  • ring/samples/General/BinarokuGame フォルダ

  • ring/samples/Language/EnumGenerator フォルダ

  • ring/samples/Language/DynamicObject フォルダ

  • ring/samples/Drawing/MatrixMultiply3DRotationCube

スクリーンショット:

Matrix Multiplication Qt Quick 3D

アーランのB式

このアプリケーションはアーランのB式で使います (回路交換系)

erlangb

顧客情報フォーム

SQLite と TableWidget を用いたアプリケーションです。

アラビア語、英語とフランス語のユーザインタフェースが使えます。

customersapp

RingTilengine 拡張機能

この拡張機能では Tilengine の機能を全て使えます - Tilengine はラスターエフェクトが使える「セガ メガドライブ」や「任天堂 スーパーファミコン」風の 2D レトロゲーム制作に向いたゲーム、およびグラフィックスエンジンです。

用例:

load "tilengine.ring"

TLN_Init(400, 240, 1, 0, 0)
TLN_SetLoadPath("assets\sonic")
foreground = TLN_LoadTilemap ("Sonic_md_fg1.tmx", NULL)
TLN_SetLayerTilemap(0, foreground)

TLN_CreateWindow(NULL, 0)
while TLN_ProcessWindow()
        TLN_DrawFrame(0)
end

TLN_DeleteTilemap(foreground)
TLN_Deinit()

スクリーンショット:

tilengine tilengine tilengine tilengine

RingLibui 拡張機能

この拡張機能は Libui の全機能を扱えます。

この拡張機能は Ring による軽量 GUI アプリケーションの開発と配布で使えます (1 MB 以下)。

ランタイムファイルとファイルサイズ (Ring 1.14)

  • Ring.dll (448 KB)

  • Libui.dll (210 KB)

  • Ring_Libui.dll (633 KB)

  • 圧縮前のファイル - 合計 : 1,291 KB

  • 圧縮後のファイル (ZIP 形式) - 合計 : 504 KB

用例:

load "libui.ring"

oWindow = uiNewWindow( "Say Hello", 500, 80, True)
uiWindowOnClosing(oWindow,"closeApp()")

lbl1 = uiNewLabel("Name: ")
text1 = uiNewEntry()

btn1 = uiNewButton("SayHello")
uiButtonOnClicked(btn1,"sayHello()")

btn2 = uiNewButton("Close")
uiButtonOnClicked(btn2,"closeApp()")

lbl2 = uiNewLabel("")

g = uiNewGrid() uiGridSetPadded(g, 1) uiWindowSetChild(oWindow, g)
uiGridAppend(g, lbl1, 0, 0, 2, 1, 1, uiAlignCenter, 0, uiAlignCenter)
uiGridAppend(g, text1, 1, 0, 2, 1, 1, uiAlignFill, 0, uiAlignFill)
uiGridAppend(g, btn1, 0, 1, 1, 2, 1, uiAlignFill, 0, uiAlignFill)
uiGridAppend(g, btn2, 2, 1, 1, 1, 1, uiAlignFill, 0, uiAlignFill)
uiGridAppend(g, lbl2, 0, 3, 2, 1, 1, uiAlignCenter, 0, uiAlignCenter)

uiControlShow( oWindow )
uiMain()

func sayHello
        uiLabelSetText(lbl2,"Hello " + uiEntryText(text1))

func closeApp
        uiQuit()

スクリーンショット:

RingLibui スクリーンショット RingLibui スクリーンショット RingLibui スクリーンショット RingLibui スクリーンショット

RingSockets 拡張機能

Ring では、 RingQt, RingLibuv および RingLibSDL などのソケット拡張機能が使えます。

この公開版ではソケット用の特別な拡張機能があります。

これは前述のライブラリが使えないアプリケーションで有益です。

用例 (サーバのコード):

# TCP サーバ

load "sockets.ring"

sock = socket(AF_INET,SOCK_STREAM,0)
bind(sock,"127.0.0.1",5050)
listen(sock,5)
ns = accept(sock)
send(ns,"Hello Client")
msg = recv(ns,1024)
? "Client Say >> " + msg
close(sock)
? "ソケットの接続を終了しました"

用例 (クライアントのコード):

# TCP クライアント

load "sockets.ring"

sock = socket(AF_INET,SOCK_STREAM)
connect(sock,"127.0.0.1",5050)

send(sock,"Hello Server")
msg = recv(sock,1024)
? "Server Say >> " + msg

close(sock)
? "ソケットの接続を終了しました"

RingThreads 拡張機能

Ring では、 RingQt, RingLibuv および RingLibSDL などのスレッド拡張機能が使えます。

この公開版ではスレッド用の特別な拡張機能があります。

これは前述のライブラリが使えないアプリケーションで有益です。

用例:

load "threads.ring"

func main

        nThreads = 2
        aList = list(nThreads)

        for x=1 to nThreads
                aList[x] = new_thrd_t()
                thrd_create(aList[x],"Hello("+x+")")
        next

        for x=1 to nThreads
                res= 0
                thrd_join(aList[x],:res)
        next

        ? :Done
        shutdown()

func Hello x

        for r=1 to 100
                ? "("+r+") Hello("+x+") 関数からのメッセージ"
        next

RingOpenSSL の改良

RingOpenSSL 拡張機能へ関数を追加しました。

以下の関数は大規模ファイル、またはデータの全内容を単独文字列として読み込むことなくハッシュ値を計算します。

md5init() -> MD5_CTX
md5update (MD5_CTX, string) -> 1 ならば成功、 0 ならば失敗
md5final (MD5_CTX) -> 文字列

sha1init() -> SHA_CTX
sha1update (SHA_CTX, string) -> 1 ならば成功、 0 ならば失敗
sha1final (SHA_CTX) -> 文字列

sha224init() -> SHA224_CTX
sha224update (SHA224_CTX, string) -> 1 ならば成功、 0 ならば失敗
sha224final (SHA224_CTX) -> 文字列

sha256init() -> SHA256_CTX
sha256update (SHA256_CTX, string) -> 1 ならば成功、 0 ならば失敗
sha256final (SHA256_CTX) -> 文字列

sha384init() -> SHA384_CTX
sha384update (SHA384_CTX, string) -> 1 ならば成功、 0 ならば失敗
sha384final (SHA384_CTX) -> 文字列

sha512init() -> SHA512_CTX
sha512update (SHA512_CTX, string) -> 1 ならば成功、 0 ならば失敗
sha512final (SHA512_CTX) -> 文字列

関数の追加

  • DirExists() 関数

Direxists(cDirPath) ---> ディレクトリがあれば 1 を返します。
  • GetPathType() 関数

Getpathtype(cPath) ---> 0 ならばパスは存在しません。
                        1 ならば既存のファイルと一致しています。
                        2 ならば既存のディレクトリと一致しています。
                        -1 ならばパスは存在しますが
                           種類は不明です (例としてはパイプ)
  • SysSet() 関数

SysGet() 関数は環境変数を取得します。

SysSet(cVariable, cValue) ---> 1 ならば成功であり 0 ならば失敗です。
  • SysUnset() 関数

SysSet() 関数は指定された環境変数を定義します。

SysUnset(cVariable) ---> 1 ならば成功であり 0 ならば失敗です。
  • GetArch() 関数

GetArch() 関数は Ring 実行可能ファイルが動作しているアーキテクチャ名を検出します。

文法:

GetArch() ---> cString (Ring 実行可能ファイルが動作しているアーキテクチャ名)

用例:

switch getarch()
on "x86"
        ? "x86 32bit アーキテクチャ"
on "x64"
        ? "x64 64bit アーキテクチャ"
on "arm64"
        ? "ARM64 64bit アーキテクチャ"
on "arm"
        ? "ARM 32bit アーキテクチャ"
other
        ? "Unknown アーキテクチャ"
off
  • NofProcessors() 関数

NofProcessors() 関数はシステムに搭載されている CPU の論理プロセッサ数を検出します。

文法:

NofProcessors() ---> nProcessors

用例:

? NofProcessors()

関数の改良

  • Log() 関数

指定の底で対数計算をするために関数を更新

文法:

Log(nNumber)       --> nNumber の対数を返します (e を底とする)。
Log(nNumber,nBase) --> nBase を底とする nNumber の対数を返します

用例:

? log(10)       # 2.30
? log(2)        # 0.69
? log(10,10)    # 1
? log(2,2)      # 1
? log(100,10)   # 2

文字列処理における実行性能の向上

  • Ring 1.14 では可変長、および固定長の文字列を処理するプログラムが三倍高速になります。

用例:

load "openssllib.ring"
f = fopen(exefilename(),"rb")
h = SHA256Init()
while true
  s = fread(f, 4096)
  if isstring(s)
    SHA256Update(h, s)
  else
    exit
  ok
end
digest = SHA256Final(h)
fclose(f)
? digest

実行結果:

4e677154639dae3baa048ce5ae0b04b63bcd33316e2d2041297dcee85604d778
  • Ring 1.14 では文字列へ別の文字列を追加する処理は六十倍高速になります。

用例:

t1 = clock()
test = "My Ring"
for x = 1 to 20000
        test += x
next
? "Time : " + ((clock()-t1)/clockspersecond()) + " seconds"

実行結果:

Time : 0.01 seconds
  • 以上の改良により拡張機能用の Ring コード生成器の動作速度が向上しました (四倍の高速化)。

数値処理の改良

  1. 十六進数の用法

用例:

x = 0x10
? x             # 16
x = 0xff
? x             # 255
x = 0x0A
? x             # 10
? 0xFFFF        # 65535
? 0x0A + 1      # 10+1 = 11
  1. 大規模倍数値の表示

用例:

c = 999999999999999
for i = 1 to 13
        c *= 999999999999999
next
? "c = " + c

実行結果:

c = 9.999999999999862032924046117813879019544782068185773946275755888189234614925384380788550958e+209
  1. 大規模倍数値で String() と Number() を使う方法

用例:

c1 = 999999999999999
for i = 1 to 13
        c1 *= 999999999999999
next

s = string(c1)  ? "c1 = " + s
c2 = number(s)  ? "c2 = " + c2

? "c2 - c1 = " + (c2 - c1)

str1    = "-2222044646462"
c       = Number(str1)
str2    = String(c)

if str1 = str2
        ? "Strings Identical"
else
        ? "Strings Mismatch!"
ok

実行結果:

c1 = 9.999999999999862032924046117813879019544782068185773946275755888189234614925384380788550958e+209
c2 = 9.999999999999862032924046117813879019544782068185773946275755888189234614925384380788550958e+209
c2 - c1 = 0
Strings Identical

CLOC (Count Lines of Code) の追加

CLOC (コード行数集計器) は指定されたアプリケーションのフォルダパスからソースコードの検索を行い プログラミング言語ごとのファイル数、空行、コメント行数、コード行数の集計結果を表示します。

用法:

ringcloc <アプリケーションのフォルダパス>

用例 (1):

ringcloc c:\ring\tools\ringnotepad

実行結果:

      47 text files.
      47 unique files.
      11 files ignored.

github.com/AlDanial/cloc v 1.88  T=1.18 s (39.0 files/s, 3212.2 lines/s)
-----------------------------------------------------------------------------------
Language                         files          blank        comment           code
-----------------------------------------------------------------------------------
Ring                                33            273            139           3186
Bourne Shell                         4             22              9             88
DOS Batch                            4              3              7             20
INI                                  1              0              0             15
C                                    1              0              1             10
Markdown                             2              4              0              8
Windows Resource File                1              0              0              1
-----------------------------------------------------------------------------------
SUM:                                46            302            156           3328
-----------------------------------------------------------------------------------

用例 (2):

ringcloc c:\ring\tools\formdesigner

実行結果:

      54 text files.
      54 unique files.
      13 files ignored.

github.com/AlDanial/cloc v 1.88  T=1.54 s (34.5 files/s, 7122.4 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Ring                            52           1306            567           9071
Markdown                         1              5              0              7
-------------------------------------------------------------------------------
SUM:                            53           1311            567           9078
-------------------------------------------------------------------------------

そのほかの改善

  • Ring コンパイラ - 無名関数の FUNC キーワード文の後に現れた改行を読み飛ばし

  • Ring コンパイラ - 無名関数の関数パラメータ文の後に現れた改行を読み飛ばし

  • Ring コンパイラ - リスト項目のアクセス文の後に現れた改行を読み飛ばし

  • Ring コンパイラ - オブジェクトの属性文の後に現れた改行を読み飛ばし

  • Ring コンパイラ - 97 桁の数値に対応

  • Ring コンパイラ - ステートメント --> 式 --> '(' ')' へ対応

  • Ring コンパイラ - ステートメント --> 式 --> '(' 式 ')' '.' 属性|メソッド へ対応

  • Ring コンパイラ - リテラルが閉じられていないときのエラーメッセージを改善

  • Ring VM - Str2Hex() 関数 - 実行性能の向上

  • Ring VM - Hex2Str() 関数 - 実行性能の向上

  • Ring VM - SubStr() 関数 - コードを改善

  • Ring VM - Dec() 関数 - コードを改善

  • Ring VM - String() 関数 - コードを改善

  • Ring VM - Number() 関数 - コードを改善

  • Ring VM - Decimals() 関数 - 0 ~ 90 までの有効範囲に対応

  • Ring VM - バイナリ文字列同士の比較 - コードを改善

  • Ring VM - IsWindows64() 関数 - コードを改善

  • Ring VM - Unsigned() 関数 - コードを改善

  • Ring VM - 関数の呼び出し - リストと多重リストのステート管理を改善

  • Ring VM - AddAttribute() - 新規属性のデフォルト型は文字列になります

  • Ring VM - Dir() 関数 - コードを改善

  • Ring VM - Copy() 関数 - コードを改善 (負数の無視)

  • Ring VM - 一階層以上のループから抜けたときの step 値の復旧

  • Ring VM - After (For-In ループ) - 参照は削除しますが値のコピーは保持します

  • Ring VM - 複数スレッド動作時のコードを改善

  • Ring VM - Try/Catch/Done の後でステートを復旧するときのコードを改善

  • Ring VM - Try/Catch/Done の後で Raise() を多重呼び出ししたときのコードを改善

  • Ring VM - インストラクション実行時の結果表示を読みすやくしました

  • Ring VM - & 演算子を用いた文字列の文字参照を返せる機能に対応

  • Ring VM - Call コマンド - 関数名 - 英数大小文字同一視

  • Ring コンパイラ/VM ソースコード - 再整形による可読性の向上

  • Ring コンパイラ/VM ソースコード - コードのリファクタリング

  • Ring コンパイラ/VM - 新規インストラクション: ICO_FREETEMPLISTS

  • RingPM - 新規パッケージ: GUILib (GUILib クラスの分割パッケージ)

  • RingPM - 新規パッケージ: ObjectsLib (ObjectsLib クラスの分割パッケージ)

  • RingPM - 新規パッケージ: CLOC (Count Lines of Code)

  • RingQt - QWebEngineView クラス - 追加: Print(QPrinter,cEventCode) メソッド

  • RingQt - QCombobox クラス - 追加: setCurrentText() および addItems() メソッド

  • RingQt - 追加: QLocale クラス

  • RingQtRuntime パッケージ: GUILib および ObjectsLib パッケージを使用

  • GameEngine - グラフィックスライブラリへディレイ関数を追加: gl_delay() 関数

  • GameEngine - ウィンドウのアイコン読み込む時に Resources クラスを使用

  • RingAllegro - コードを改善

  • RingMurmurHash - コードを改善

  • RingOpenSSL - RandBytes() 関数 - コードを改善

  • RingZip - GetFileNameByIndex() 関数 - コードを改善

  • RingLibSDL - LibSDL version 2.0.14 でビルド