朝の儀式

abdev 朝の儀式 はコメントを受け付けていません

些細なことなのですが、ず~っと「やってみたいな~」と思っていたことが今朝、実現できました。

 

それは電車の中で特ダネを見ながら通勤すること。私は根っからの特ダネ党、小倉派です。←特に理由はないんですけど。

 

そんでもって、ワンダモーニングショットとか飲んじゃって、やる気を出している次第であります。

 

ワンセグケータイも、画面が見辛くてほとんど使わないかな~と思っていたのですが、行き返りの電車内、布団の中でコッソリなど、使用頻度はかなり高いです。ただ、その分だけ電池の減りが早いので、欲を言えばもう一つバッテリーが必要な感じです。

 

あと、欲しいと言えばセカンドディスプレイ。数年前に買った15inch液晶ですべてをこなしているので、いい加減画面の狭さが気になります。今週末、ABの開発チームミーティングをする予定になっているので、帰りがけにまたまた秋葉原にでも行ってしまおうかな(^m^。それこそ、パソコンやりながらテレビ見れるし。

拡張子を.abへ

abdev 拡張子を.abへ はコメントを受け付けていません

突然ですが、AB5では推奨する拡張子を “.ab” へ統一しようと考えています。

現在は

  • “.abp” … ソースコード
  • “.sbp” … ヘッダ

という具合に分かれていますが、ABはプロトタイプ宣言などを必要としないため、特別に “ヘッダ” という概念を設ける必要はありません。よって、ソースコードとヘッダを識別するために2つの拡張子を存在させるのはある意味ナンセンスなのかもしれないのです。

拡張子事典などを調べてみましたが、意外と “.ab” という拡張子は使われていない模様。AB5からは推奨拡張子として利用していきたいと思います。

従来の “.abp”、”.sbp” の拡張子が利用できなくなったりするわけではないので、ご心配なく(^^

ちなみに、(AB5CP3に含まれる)abdev.exeを起動してオプション設定から拡張子を追加することができます。気の早い方は、”.ab” を追加してみるのも良いかもしれません。

AB on Linux

abdev 21 Comments »

ちょっとしたテクニックでActiveBasicがLinux上で動作するようになります。しかもネイティブで。

本日はLinuxでサクサクと動いているABの様子をスクリーンショットでお届けします。

1. まずはGNOME入りのLinux(ここではFedora Core 5)を起動します。

screenshot.png

2. ABをダウンロード&展開(ここではVer4.25を利用しています)

screenshot-1.png

3. ProjectEditorを立ち上げて、簡単なサンプルコードを打ち込んだところです。画面では更にデバッグ実行まで行っています。

screenshot-3.png

4. RADツールでGUIを組むこともできます。フォントの間隔がちょっと怪しいですが、きちんと表示されいます。画面ではAB製のテキストエディタを動作させています。

screenshot-5.png

※これらの実行画面は合成ではありません。詳細方法は後日。ご期待を!

タイプセーフなEnumを提供するために

abdev タイプセーフなEnumを提供するために はコメントを受け付けていません

列挙子を的確に活用することでソースコードの解読性って向上しますよね!?

そこで、AB5ではより高機能な列挙型機能を提供していきたいと思います。まず、AB4に搭載されているEnumステートメントですが、C/C++同様の単なる整数の置き換えだけに過ぎません。当然、定数の右辺値として利用できたりと多様な参照方法があるので便利といえば便利ですが、例えば、Long型にもInteger型にも簡単に代入できてしまうのは欠点です。折角意味のある構造で列挙子を定義しているのですから、意図しない型への代入は避けるべきだと考えるのが筋です。

そこで、AB5では列挙型をEnumBaseから派生するクラスとして捉え、列挙子はそのクラスのインスタンスという扱いにしていこうと思います。

こうすることで、異なる列挙型間のキャストに規制がかかり、各列挙子の意味が明確になります。

また、定数としてしか評価できなかった従来法と異なり、プログラム内から列挙子の名前を取得できるようになるなどのメリットが生じます。例えば、Select文で数値を元に分岐を行い、それに対応する文字列を表示するなどの処理がEnumBaseを継承することで一行で済んだりします。

Enum Test
    a
    b
End Enum

Dim e As Test
e=Test.a

Select Case e
    Case a
        Print "a"
    Case b
        Print "b"
End Select

このようなソースコードは下記のように書き直すことができるようになるというワケです。スッキリ!

Enum Test
    a
    b
End Enum

Dim e As Test
e=Test.a

Print e.ToString()

コンパイラが管理すべき静的変数の初期化タイミング

abdev コンパイラが管理すべき静的変数の初期化タイミング はコメントを受け付けていません

C/C++、C#、VBなどでStatic宣言による静的変数、適材適所で利用できれば大変便利な機能ですよね。普段は何気なく使っている静的変数ですが、コンパイラを製作する上で、静的変数を取り込もうとすると、なにかと問題が生じるものなんです。一筋縄ではいきません。

静的変数はローカル領域内で参照可能でありながら、一つのアプリケーションでは唯一の存在になる変数です。ようは、任意のローカル領域内からのみ参照できるグローバル変数ってヤツです。

これをバカ正直にグローバル変数として定義していると変数名の衝突が起こりかねませんね。コンパイラは静的変数の名前管理は一ひねりする必要がありそうです。実体はグローバル領域にあるので、対象となるローカル領域がいつ呼び出されようと、アプリケーション内に存在するすべての静的変数はプロセス開始時に初期化され、終了時に破棄しなければなりません(破棄の場合は必要に応じてデストラクタを呼び出してやる必要があります)。

ユーザーの皆さんは直接的に関係ありませんが、ABの静的変数の内部表現は下記のようになっています。

Sub test()
 Static a As Long
End Sub

このような定義があったとすると、この静的変数aはグローバル領域に下記のような名前で管理されます。

Static.[class].test.[id].a

※クラスメソッドの場合はclassにクラス名が入ります。
※idにはすべての関数を識別可能な排他値が入ります。

本来であればクラス名と関数名と変数名ですべての静的変数を表現できるのですが、ABには関数のオーバーロード機能が付いているんですよね。なので、idという排他的付加データが必要になるというワケです。

これで静的変数の表現は可能になりました。あとは、変数名の前についている名前空間データを識別してアクセス規制をかけるだけです。こうすることで、グローバル領域に確保された変数データを任意の関数内から参照可能になります。

さて、もしこの変数aが何らかの実体オブジェクトだった場合、コンストラクタを呼び出すのはいつになるのでしょうか?正解は関数呼び出しではなく、アプリケーション初期化時です。ABはプロセス開始直後に_System_StartupProgram関数がコールバックされる仕組みになっているので、このタイミングで静的変数の初期化をしてしまおうと考えています。

こんな感じで、静的メンバに引き続き、静的ローカル変数の対応もほぼ確実にものになってきました。残るは静的メソッド。今夜じゅうはムリかな~

Staticステートメントを実装中

abdev Staticステートメントを実装中 はコメントを受け付けていません

静的ローカル変数、静的メンバ、静的メソッドを利用するためのStaticステートメント(または修飾子)の実装を行っています。

なんとか夕方の時間で静的メンバは利用できるようになりましたんで、あとは今夜にかけて静的ローカル変数、静的メソッドを実装し、デバッガ整備とエディタのコード補間を有効にすれば完了です。

些細な機能ではありますが、なかなか根気がいる作業でごわす(汗x2

多機能な列挙型

abdev 多機能な列挙型 はコメントを受け付けていません

Enumステートメントにて列挙型が定義できるようになっていますが、現状の仕様ではただ単に定数を羅列するだけの機能にとどまっています。AB5ではこの軟弱な列挙型機能を、タイプセーフであり、数値・文字列への相互変換が容易な機能へ拡張したいと思います。

まず、Enumステートメントどうのこうのという前に、すべての列挙型が継承する基底クラスを設計したいと思います。

Class EnumBase
    m_Value As Long
    m_Name As String
Public
    Sub EnumBase(value As Long, name As String)
        m_Value=value
        m_Name=name
    End Sub

    Function ToString() As String
        Return m_Name
    End Function

    Function Operator() As Long
        Return m_Value
    End Function
End Class

このEnumBaseはすべての列挙型が継承するクラスであり、数値と名前をプライベートメンバとして保有しています。ToStringメソッドで列挙子の名前を取得できるようになっています。

で、肝心のEnumステートメントですが、例えば、下記のようなコードがあったときにEnumBaseを継承し、列挙型クラスを自動生成するような機構をコンパイラに持たせます。

Enum test
    a
    b
End Enum

上記のようなソースコードは下記のクラスと等価の意味を持つことになります。

Class test
    Inherits EnumBase
Public
    Sub test()
        EnumBase(1,"a")
    End Sub
    Sub test(value As Long, name As String)
        EnumBase(value,name)
    End Sub

    Static a As test(1,"a")
    Static b As test(2,"b")

    Sub Operator= (value As Long)
        Select Case value
            Case 1
                This=a
            Case 2
                This=b
            Case Else
                'error
        End Select
    End Sub

    Sub Operator= (value As String)
        Select Case value
            Case "a"
                This=a
            Case "b"
                This=b
            Case Else
                'error
        End Select
    End Sub
End Class

※静的メンバ・メソッドを定義するStatic修飾子は未実装ですのであしからず。

このような実装を行うと、列挙子は単なる整数の定数値ではなく、列記として一つのオブジェクトという扱いになります。列挙型オブジェクトをファイルから読み込んだり書き込んだりする場合は、演算子オーバーロード・ToStringメソッドにより、簡単に整数値やString型に変換できるようになります。

例えば、上記のtest列挙型オブジェクトには下記のような代入方法・参照方法があります。

Dim e As test
e=test.a
e="a"
e=1

Dim i As Long
i=e

Dim s As String
s=e.ToString()

ちなみに、Const定義の右辺値に列挙子を指定したいこともあるかと思うので、この機能は別途、コンパイラが提供することになります。

さて、この案、うまく行くのでしょうか・・・。

1. Static修飾子を有効にして静的メソッド・メンバを追加できるようにする
2. Enumステートメントをクラス定義に変換するモジュールを作成する
3. 定数として扱う列挙子データをコンパイラで管理する

これらの問題をクリアできれば、高機能な列挙型の未来は明るいかも☆あと、静的メンバオブジェクトはグローバル変数同様、利用の有無に関わらず、実行ファイルに含まれてしまうので、基本ライブラリに含まれる列挙型の関係で実行ファイルの最小サイズが肥大化する可能性があります。この問題は別途検討する必要がありそうです。

スレッドクラス

abdev スレッドクラス はコメントを受け付けていません

Windowsのマルチスレッドと言えば、CreateThread、_beginthreadなどのAPIを思い浮かべる方が多いかと思います。

AB5でのクラスライブラリでは勿論ながらスレッド関連のクラスも提供する予定ですが、これはただ単にスレッド関連のAPIをラップするだけの働きではなく、スレッド間のメモリ管理も請け負う高機能なクラスにまとめあげていきます。

AB5でGCを扱う場合、更には対象アプリがマルチスレッドを利用する場合はこの新しいスレッドクラスは必需な存在になります。

ということで、スレッドクラスの必要性をおさえた上で、具体的な実装方法を検討していきたいと思います。

私の中で選択肢として出ているのは下記の2通りの方法。

  • Threadクラスをインスタンス化する方法(C#、VB.NETなどはコレ)
  • Threadクラスの派生をインスタンス化する方法(Javaなどはコレ)

D言語などはどちらの特性も持ち合わせるハイブリット構造になっているようです。

双方がどのように違うかと言うと、新しいスレッドを生成するときに、メソッドそのものを指定するのか、またはクラスを指定してオーバーロードされたRunメソッドを実行するのかの違いくらいですかね。前者の方法は、デリゲート機能が付いている言語で効力が発揮できそうです。

資料をあさっていたら、MFCのCWinThreadなどというちょっと懐かしいものを見つけてしまいました。こちらは完全なるAPIのラップクラスですね。

プロパティの実装

abdev 35 Comments »

今夜はライブラリ開発者の皆様に待っていただいている機能の一つ、プロパティの実装を行っています。

 VB.NETを見習って、Propertyステートメントを・・・となりそうですが、プロパティに関してはD言語の仕様を見習う形での実装を行いたいと考えています。

ABでプロパティを記述したときのソースコードのサンプルイメージを下記に示します。

'-------------------------------------------------------
' D言語の構文を参考にしたプロパティ構文の実装
' Note:  呼び出し解釈に柔軟性を持たせる
'-------------------------------------------------------

Class CTest
    m_label_str As String
    m_label_i As Long

    m_table[100] As Long
Public

    Function label() As String    'label.Getアクセサ
        Return m_label_str
    End Function
    Sub label(Value As String)    'label.Setアクセサ
        m_label_str=Value
    End Sub

    Function label() As Long    'label.Getアクセサ
        Return m_label_i
    End Function
    Sub label(Value As Long)    'label.Setアクセサ
        m_label_i=Value
    End Sub

    '配列要素を持たせたプロパティ
    Function table(e As Long) As Long    'label.Getアクセサ
        Return m_table[e]
    End Function
    Sub table(e As Long, Value As Long)    'label.Setアクセサ
        m_table[e]=Value
    End Sub
End Class

 ん!?これじゃ、普通のメソッドじゃん。プロパティじゃないじゃん。

 そう思われる方もいらっしゃるかと思いますが、実はABが実装しようとしているプロパティというのは、呼び出し側(代入・参照側)の解釈を一ひねりし、宣言側は従来のメソッド定義で事足りるようになっているのです。

具体的には代入先、参照先に期待するメンバが存在しなかったときに、コンパイラが下記のような解釈をするようにします。

Getアクセサ:
“a=obj.label” → “a=obj.label()”

Setアクセサ:
“obj.label=b” → “obj.label(b)”

さてさて、週末には実装が完了しますので、早速β版のパッケージングに入っていこうと思います。

Ajaxで動的トップページを

abdev 21 Comments »

ブログ引越ししたので、ab.comのトップページのRSS配信モジュールを書き換えなければなりません。現状では、ただ単にJavaScriptのdocument.write文を発行するCGIを呼んでいるだけですので、AjaxでサクッとRSSを呼んでくるようにサイトモジュールの改良を行おうと考えています。

どっかにコピペするだけでRSSが読めてしまうようなAjaxコードが落ちていないかな~と思ったのですが、なかなかそのような有難いコードにはたどり着けませんでした。暇な時間を見つけながらコツコツ書いてみますか・・・

それにしても、CGIベタバリの場合はRSS配信サイトからのレスポンスが遅いとサイト全体に響きます。このような不具合に近い部分も改良すべきですね。

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン