デバッガの開発、再スタート

abdev 5 Comments »

最近、言語ロジックばかりに作業リソースを費やしすぎていたので、ここらで気分を変えて、中途半端になっていたデバッガの作りこみを再スタートさせようと思います。

まず、AB5に搭載されるプロセスデバッガ、下記のような要素をカバーできるように改良を行います。

  • プロセスへのアタッチ機能
  • ABで開発されたEXE/DLLが複数にわたってプロセスにマッピングされたとき、相互のソースコードを同時に参照しながらステップ実行が行えるようにする

あと、デバッガのGUIがあまり宜しくない(使い勝手が悪い)ので、各種機能のデザインをやり直すことと、タブ機能などを活用して様々なデバッグ要素ウィンドウを閲覧可能にしていきたいと思います。

さてさて、昨日も花火を見てしまって、夏を満喫しております。でもスイッチを切り替えて、ここらで気を引き締めていきまっせ〜!

日本平花火大会

abdev 19 Comments »

いや〜、行ってしまいましたよ〜。地元の花火大会。今年初めての花火は、静岡の日本平でした!

日本ホテルのひろ〜い庭園で打ち上げが行われるのですが、私らはラッキーなことに最前列集団に混ざってゴザスペースを確保することができました。打ち上げ場所がすぐそこだったので、寝転がって見上げる感じで、、、

来年は、家族動員で、Lサイズのゴザを二枚くらいしいて、挑みたいところです。場所取りならおいらに任せろよ〜!!!

今年はあと何個のお祭りにいけるかな〜、キモだめしとかも行きたいし、バーベキューもあるし〜、、、これじゃぁ、学生の時とかわらんですな

CStringクラス

abdev 3 Comments »

オペレータのオーバーロードがほとんど出来上がったので、試しにCStringのデモコードを書いてみました。

Class CString
Public
    m_lpszBuffer As LPSTR
    m_length As Long

    Sub CString()
        m_lpszBuffer=calloc(1)
        m_length=0
    End Sub
    Sub ~CString()
        free(m_lpszBuffer)
        m_lpszBuffer=0
    End Sub

    Function Operator() As LPSTR
        Return m_lpszBuffer
    End Function

    Sub Operator= (ByRef objString As CString)
        m_length=objString.m_length

        m_lpszBuffer=realloc(m_lpszBuffer,m_length+1)
        memcpy(m_lpszBuffer,objString.m_lpszBuffer,m_length)
        m_lpszBuffer[m_length]=0
    End Sub

    Sub Operator= (lpszText As LPSTR)
        m_lpszBuffer=realloc(m_lpszBuffer,lstrlen(lpszText)+1)
        lstrcpy(m_lpszBuffer,lpszText)
        m_length=lstrlen(lpszText)
    End Sub

    Function Operator+ (lpszText As LPSTR) As CString
        Dim tempString As CString
        tempString=This

        tempString.m_lpszBuffer=realloc(
            tempString.m_lpszBuffer,
            tempString.m_length+lstrlen(lpszText)+1)
        lstrcpy(
            tempString.m_lpszBuffer+tempString.m_length,
            lpszText)
        tempString.m_length+=lstrlen(lpszText)

        Return tempString
    End Function

    Function Operator+ (ByRef objString As CString) As CString
        Dim tempString As CString
        tempString=This

        tempString.m_lpszBuffer=realloc(
            tempString.m_lpszBuffer,
            tempString.m_length+objString.m_length+1)
        memcpy(
            tempString.m_lpszBuffer+tempString.m_length,
            objString.m_lpszBuffer,objString.m_length)
        tempString.m_length+=objString.m_length

        tempString.m_lpszBuffer[tempString.m_length]=0

        Return tempString
    End Function
End Class

パラメータの型を識別しながらオーバーロードしていくのは良いのですが、キャストされることを見越して、戻り値でオーバーロードの解決を行うためには、コンパイラのほうをもう一捻りしなくてはなりません。

CStringは仮の名前なので、クラスが完成したらString型へ変更しようと思います。で、コンパイラにこびりついている従来のString型をすべて解除する方向で行きたいと思います。スマートに行ってくれることを祈ります・・・・・

オペレータのオーバーロードは予定通り

abdev オペレータのオーバーロードは予定通り はコメントを受け付けていません。

オペレータオーバーロード、ロジックはそのままで、64コンパイラへの対応を行いました。ロジックがそのままなら、コードをポンづけで対応したいところなのですが、演算過程のレジスタ割付とかが違っているので、ちょっと手直しをしなければなりません。量はそれほどでもないのですが、いかんせんデバッグに時間がかかる・・・(そろそろデバッグの新手法でも編み出さないとヤバめになってきました)。

さて、ここらが一段落したところで、一般公開向けのAB5βを考えて参りたいと思います。

やはり、AB5が重要視したいところは、提示されたライブラリと言語仕様を活用して、いかにスピーディーに安全なコーディングを行えるかといったところです。今回ばかりは、ただ単にAPIセットをザザァ〜っと提示するだけではなく、実用的な使えるライブラリを提供したいきたいところ。で、業務面でも生かしつつ、実績が上を挙げられれば文句はありません。

しかし、まだまだその先があります。ここからは非現実的なものを含む、夢物語を…

  • 意味解析&コード生成ロジックはそのままに、C/C++の構文規約に近づけたバージョンの開発
  • テンプレートを導入したジェネリックプログラミングのサポート
  • IDEのプラグイン機能の導入(特に、コントロール類を外部から簡単に追加したい!)

三番目の案件なんかは、できればAB5でも導入していきたいくらいの勢いです。IDEすべてをというわけにはいきませんが、AB5程度の言語セットであれば、IDE用プラグインをCOMコンポーネントで実装させることができそうです。

さてさて、明日は地元の花火大会(今年初!)。なんとか、雨は大丈夫なよう。降るなよ〜(><)

欲張ってます

abdev 1 Comment »

AB5のリリース時期を大幅に遅らせているワケですが、なかなか見切りがつきません。

AB5として、実装させたい機能が次から次へと出てきていて、混乱ぎみなのです。まぁ、これはこれで深刻には捉えていませんが、整理する必要があります。

公式情報とはいきませんが、現時点の開発状況を考慮すると、下記のような機能を実装する予定です(テスト済みの機能もいくつかあります)。

  • オペレータのオーバーロードに対応
  • cdecl規約の関数定義及び呼び出しに対応
  • インターフェイスの定義に対応
  • 仮想関数、純仮想関数および抽象クラスの定義に対応
  • String型をクラスモジュールで提供
  • Variant型の搭載
  • dynamic_castに対応
  • COMコンポーネントの生成に対応
  • COM DLLのimportに対応(タイプライブラリをもとにしたインターフェイス定義の自動生成)
  • CObject(正統派オブジェクトの基底クラス)の提供
  • ODBCをラッピングしたDB操作用クラスモジュール(できれば、ADOの仕様を勉強したい…)

標準ライブラリ内ではAPIの公開のみではなく、何かと便利なクラスモジュールを提供していきたいところです。とにかく、開発者ユーザーの皆さんと討論を行いながらライブラリの仕様を取り決めていかねばなりません。もうすぐ、β3出せそうなんで、少々お待ちくださいm(__)m>開発者グループの皆様

そんなこんなで、今夜は32コンパイラでオペレータのオーバーロードをテストしているところです(しっかし、終わりそうにないな〜)。64コンパイラへの実装、明日できるかな…

ひょんなところからGoogle

abdev ひょんなところからGoogle はコメントを受け付けていません。

散らかっていた部屋を整理していたら、前に都内のイベントで貰ったGoogleストラップが出てきました。

なんか、形もいいし、気に入ったのでストラップにチャレンジしようと思います(続いたためしが無い…)。

うーん、整理整頓を進めれば進めるほど、忘れていたものが出てきそうだ…。ヤフオク展示会でも開くかf(^^;;;

Internet Explorer 7 Beta3

abdev 33 Comments »

ネタ的にかなり遅めですが、IE7のBeta3、入れてみました。なんでこんなに試すのが遅くなったかというと、、、

x64だからですorz

まぁまぁ、x64を悪くいっちゃぁいかんです。これまで、試行錯誤を繰り返しながらムリヤリ色々なソフトを対応させてきたのですから。それでもx64未対応と言われればそれまで(Beta2までは未対応だったんです)。だったら、WOW64上で動く32ビット版を入れれば・・・←OSに溶け込んでくるIEはそのようなフットワークは無いようです。ということでBeta2までは全くインストールできなかったんです。

そんなわけで、x64対応のBeta3からやっとIE7を試せたワケなのですが、

グラフィカルな感じになったのは良いのですが、使い物になってません(Betaだからしょうがないといえばそれまでですけどね…人のこと言えないかも)。

_blankで別ウィンドウが立ち上がった瞬間にほぼ100%の確立で強制終了。Googleで検索するたびに、IMEがおかしなことになります。

このブログをアップするのがIE7 Beta3の最後の仕事。今からアンインストールしてきます(~~

C→ABへの変数宣言文の置換

abdev C→ABへの変数宣言文の置換 はコメントを受け付けていません。

C/C++で書かれたAPIをABに移植する際、エディタについている置換機能の中で、正規表現による置換を使うと非常に効率よく作業が進みます。

例えば、下記のような置換を行うと、大文字の型名の変数宣言文がAB向けに書き直されます。

検索する文字列: ([A-Z]+) (\**)([a-zA-Z0-9_]+)

置換後の文字列: $3 As $2$1

しかし、複数の変数を一つの型で定義するときなどには対応しきれないので、「次を置換」ボタンを押しながら、慎重に置換していきましょう(と、自分に言い聞かせる…)。

間違っても、「すべて置換」でスル〜してはいけません(焦

クラス管理用クラス

abdev 23 Comments »

オブジェクト指向対応型のプログラミング言語を実装する上で、クラスの管理は欠かせないものになります。というか、それが全てだといっても過言はありません。少なからず、コンパイラの内部でクラスに関するすべてのデータを持ち合わせ、照合を行いながらコード生成に挑んでいく必要があるのです。

では、データとして持たなければならない「クラスに関する情報」というのは、具体的にはどのようなものがあるのでしょう?これは一般論ではなく、ABを実装する上での事象ですので、その点をご了承の上・・・

  • クラス名(これが無いとお話になりませんf(^^;;;)
  • スーパークラスへの指標
  • メンバに関する情報(複数)
    • メンバ名
    • (必要であれば)配列要素
    • アクセシビリティ
  • メソッドに関する情報(複数)
    • メソッド名
    • 仮想関数かどうか
    • パラメータに関する情報(複数)
      • パラメータ名
      • 参照型かどうか(ByRef/ByVal)
      • (必要であれば)配列要素
    • 戻り値の型
    • アクセシビリティ
  • アライメント値

このような情報を一つのクラスとしてまとめ、更にプロジェクト内に存在するすべてのクラスを統括して管理するためのクラスデータベースクラスを用意してしまえば、クラスの管理を効率的に行えるようになります。

このように、オブジェクト指向をクラスという側面から見た場合、そのクラス構造そのものも、クラスとして捉えるという、またワケのわからないことを書いてしまいました。

仮想関数周りの処理

abdev 2 Comments »

JavaやC++、C#などでは当たり前のように使ってしまう仮想関数。同じ名前のメソッドでも、そのクラスの階層、はたまた時系列によってその内容は変わっていくという不思議な存在であります。また、モジュール設計を重視する上では非常に便利で有効な手段です。

しかし、これらを言語レベルで提供していくには、結構面倒な壁にぶち当たるときがあります。仮想関数ポインタを配列で提供するvtblなど、普段は意識することがありませんが、実は裏方で地味な作業をしているのです。

コンストラクタを順次に呼び出していく仮定で、vtblの内容の決定タイミングは非常に重要になってきます。例えば、クラスA、クラスBがあったとします(クラスAはクラスBのスーパークラス、因みに仮想関数を持ちます)。

  1. クラスBがNewされる
  2. vtblをcallocし、クラスAで実装可能な関数ポインタをセット
  3. クラスAのコンストラクタを実行
  4. vtblをreallocし、クラスBで実装可能な関数ポインタをセット
  5. クラスBのコンストラクタを実行

これでやっとクラスBの機能を使えるようになります。まぁ、これらの処理はプログラマは概念的に知っておくだけで全く問題ありません。言語処理系が面倒を見る部分ですから・・・

しかし、その言語処理系を抱える私は、これらの手順が少しでも違っただけで、アクセス違反の大きなタネを作っていることになります。複雑で長いコードではありますが、慎重に扱っていきたいものです。

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