hmV8 (秀丸マクロ用 .NET Framework ライブラリ via V8 ECMAScript 2021)

概要

秀丸マクロを、「ECMAScript2021 V8エンジン」で記述可能とするためのライブラリです。

  • ECMAScript6で秀丸マクロ

    V8 エンジンによるECMAScript6内で、秀丸マクロの実行が可能です。
    又、「V8」⇔「秀丸マクロの各種変数やシンボル」が非常に手軽に行えるようになっています。
    (※ 2022年現在、V8エンジンは、ECMAScript2021(ES12)を満たしています。)

  • .NET Framework

    .NET Frameworkのライブラリが利用可能であるとともに、独自にC#等で制作した.dllも読み込み&利用可能です。
    ECMAScript標準ライブラリについては、V8本体に搭載しているもののみ利用可能です。注意してください。
    (各ブラウザが独自に提供しているものが利用できるわけではないということです)

  • jsmode 互換関数搭載

    ごく一部の関数を除き、大部分のjsmodeの関数(hidemaruGlobalなどの関数)の記述をそのまま利用することが出来ます。

  • 基本的にはhmJSの上位互換

    秀丸用に独自に設定されている関数などは、全て「秀丸マクロ用 .NET & ActiveXObject ライブラリ via JavaScript」と同じとなるため、
    解説は割愛しています。

  • TypeScriptで記述し、トランスパイルしても良い

    受け皿となっているものが、「Google V8 ECMAScript2021以降」ですので、TypeScriptからのトランスパイルとの相性が高くなっています。
    TypeScriptはMicrosoft社が制作し(C#の作者と同じ人)、
    「Visual Studio、及び、Visual Studio Codeの標準サポート言語の1つ」であるとともに、
    「Googleの社内標準言語(C++、Java、JavaScript、Python、Go、TypeScript)の1つ」でもあります。

  • hmJSにあるActiveXObjectの特別な対応機能は無い

    ECMAScript6で記述していく、ということは、「古いJScriptではなく、新しいECMAScript6を優先した記述にしていこう」といったことですので、
    レガシー資産利用となるActiveXObjectの特別な対応はありません。
    しかしながら、ほぼ同様の機能として、host.newComObjが用意されています。
    var comobj = host.newComObj('Scripting.FileSystemObject'); などといった記述で利用できます。

ダウンロード

Windowsのbit数ではなく、秀丸のビット数 Windows OSが64bit版か32bit版かは関係ありません。秀丸エディタが32bit版か64bit版かでダウンロード対象を選択してください。
ダウンロードした後、zipを「ブロック解除(or 許可する)」必須

z当プログラムには「強い厳密な署名」が施してありますので、zipを解凍する際には、「ブロック解除(or 許可する)」してください。
もしくは、zipを解凍した後に、各々のdllに対して「ブロック解除(or 許可する)」してください。
ブロック解除(or 許可する)しないまま、当プログラムを利用することは出来ません。

PICTURE

動作環境

  • 秀丸

    秀丸エディタ ver8.73以上

  • Microsoft VC++ 再頒布可能パッケージ

    Visual Studio 2019 C++ ランタイム
    x86版をインストールしたことが無い方はインストールしてください。
    お手持ちのOSが64bitか32bitかには関わりなく、x86版のインストールが必要です。

  • Microsoft .NET

    .NET Framework 4.71以上。

  • 秀丸エディタ 64bit版について

    秀丸エディタ64bit版をご利用の方は、hmV8_x64.zipをダウンロードし、ファイルを差し替えてください。
    (又、この場合は、Microsoft VC++ 再頒布可能パッケージは、64bit版をインストールしてください。)

インストール

  • 「hmV8.dll、ClearScript***.dll」の計4つのファイルを秀丸エディタのディレクトリ内(hidemaru.exeと同じ場所)へと コピーする。

  • (原則的には、hidemaru.exeと同じ場所である必要があります。これは.NET FrameWorkのdllを動作させる仕組みに拠るためです。)

各種説明は、hmJSとの差分のみ

hmJSとhmV8は、ECMAScriptの「旧」と「新」という関係ですので、基本的にはhmV8はhmJSの上位の互換となります。
このため、このhmV8では、hmJSに対する差分のみの情報を掲載しています。
基本的な機能の説明等は、秀丸マクロ用 .NET & ActiveXObject ライブラリ via JavaScriptを参照してください。
(繰り返しとなりますが、hmV8ではhmJSには存在するActiveXObjectに対する特別な対応はありません。)

hmV8の意義

  • 新JavaScriptの基軸・ECMAScript6

    ECMAScript6によって、JavaScriptは、「古い設計思想の言語をむりくりこねくり回す」形から、
    「現代的な機能の多くを搭載した優れたプログラムが組みやすい言語」へと昇格し、
    オブジェクト指向、関数型、手続き型の、どれもを十分にサポートする言語へと成長しました。

    誰もが触れる機会が多くなっていくECMAScript6

    Web系のみならず、アプリやデスクトップ系にもECMAScriptはどんどん進出していっています。
    2020年ごろから各所で本格的に使われ初め、2024年頃には、「新規のJavaScriptはECMAScript6系で書くのが常識」といった流れになるのは間違いないところです。
    これまで以上に、ますます多くの人が「それほど深くは知らないが、ある程度なら書ける広く馴染みのある言語」としての地位を確立していくことでしょう。

    巨大なライブラリ

    ECMAScript6そのものは、ライブラリが極めて貧弱であるため、今やWindowsの共通ライブラリとも言える「.NET Framework」ライブラリを使用可能としました。
    このメリットはECMAScript6の唯一の大きな弱点を完全にカバーして余りあるため、とても大きいと言えるでしょう。

    秀丸独自の機能をECMAScript6の中で

    秀丸マクロの変数とECMAScript6の変数の値を自由にやりとり出来るとともに、ECMAScript6の中からも秀丸マクロを実行可能です。

秀丸マクロファイルや「.js」ファイルの文字コード

hmV8を利用する秀丸マクロファイルや、.jsファイルは、全て「utf8」の「BOM付き」を前提としています。
但し、他の文字コードでのファイルも扱うことが可能です。

詳細は、「hmJSの基礎中の基礎のAPI」の「SetCodePage」の項目を参照してください。

ソース例① (jsmode相当関数が大部分使える)

#JS = loaddll( hidemarudir + @"\hmV8.dll" );
 
#_ = dllfuncw( #JS, "DoString", R"JS(

message("OK");

moveto(3,4);

)JS"
);
 
freedll(#JS);

ソース例②

#JS = loaddll( hidemarudir + @"\hmV8.dll" );

#_ = dllfuncw( #JS, "DoString", R"(

// .NETアセンブリの読み込みが可能
// "System.Windows.Forms"だけでも問題はない。
lib = host.lib("System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

class MyForm {

    constructor(start) {
        this.count = 0;
    }

    SetForm() {
        this.Forms = lib.System.Windows.Forms;
        this.frm= new this.Forms.Form();
        this.frm.Text = "こんにちわ";
    }

    SetButton() {
        this.btn = new this.Forms.Button()
        this.btn.Text = "クリック";
        this.btn.Left = 16;
        this.btn.Top = 16;
        this.btn.Tag = 0;

        // イベントハンドラも作れる
        this.btn.Click.connect((sender, e) => this.btn_Click(sender, e));
        this.frm.Controls.Add(this.btn);
    }

    Show() {
        this.SetForm();
        this.SetButton();

        this.frm.ShowDialog();
    }

    btn_Click(sender, event) {
        this.count++;

        let count = this.count;
        // デバッグモニター用の関数
        hm.OutputPane.Output("ボタンが押されたよ!!" + "\r\n");
        hm.OutputPane.Output(count.toString() + "\r\n");

        // 秀丸マクロの「変数」とのやりとりも自由自在
        const filename2 = hm.Macro.Var('filename2'); // const filename2 = hm.Macro.Var['filename2']; と記述してもOK
        hm.OutputPane.Output(filename2);

        // 秀丸マクロの「変数」とのやりとりも自由自在
        hm.Macro.Var('$count', count.toString() ); // hm.Macro.Var['$count'] = count.toString(); と記述してもOK
        // V8の中から秀丸マクロを一連のコマンドとして実行することも出来る。
        // ECMAScript6なら「テンプレートストリングス」が使えるのでちょうどよい
        hm.Macro.Eval( `
            // アウトプット枠へ出力。秀丸マクロを直接使った原始的な方法
            #OP = loaddll("HmOutputPane.dll");
            #ret = dllfunc(#OP, "Output",hidemaruhandle(0), $count);
            freedll(#OP);
        ` );
    }
}


var f = new MyForm(0);
f.Show();

)"
);

// V8から秀丸マクロへと書き込まれた変数は、当然秀丸マクロからも見える。
message("ボタンは" + $count + "回クリックされました");

freedll(#JS);

Google Chromeに搭載されている V8 エンジンとのバージョン

ChromeのURLアドレスバーに「chrome://version」などと入力することにより、
V8 エンジンのバージョンを知ることが出来ます。
このバージョンと、更新情報のバージョンとを比較すれば、
どの程度バージョンが最新と近いか(使用できる文法が一致するか)、概ね想像が出来るかと思います。

V8のサイトを詳細に追えば、どのバージョンで何が実装されたのか追うことも不可能ではないですが、
V8のソースコードは、年中途絶えることなく、毎日Releaseバージョンが更新され続けていますので、
V8のマニアでもない限り、追っても追いつかないため、無駄だと思われます。

ライセンス

  • hmV8

    hmV8は、Apache License 2.0となります。

    ソースの場所

    Githubにソースがあります。

  • ClearScript

    hmV8はClearScriptが利用されています。
    ClearScriptはMITライセンスとなります。

    詳細は、https://github.com/Microsoft/ClearScriptを見てください。

  • V8

    V8は修正BSDライセンスとなります。また、V8自体も他のライセンス物を含んでいます。
    詳細はV8の公式 github等を参照してください。

    V8の公式Githubを見てください。