Visual Basic 6.0の100％互換性 twinBASICの紹介

# はじめに
これは、[Visual Basic Advent Calendar 2021](https://qiita.com/advent-calendar/2021/vb)の23日目の記事となります。

以前にRAD Basicを紹介しましたが、twinBasicもVB6.0の互換性＋拡張を目指して開発中です。

https://qiita.com/yaju/items/092c9a145ba8261538c6


【2025/01/30更新】
twinBASICのロードマップです。暫定Ver 1.0 リリース：~~2024年12月31日~~2025年4月1日

https://github.com/WaynePhillipsEA/twinbasic/issues/335

2024/01/13に VBForums に twinBASIC 専用フォーラムが出来ました。

https://www.vbforums.com/forumdisplay.php?108-TwinBASIC

twinBASICで作成したアプリケーションです。 64bit Windows上で32bitのアプリケーションを使用した場合、ハードウェア セットアップ機能の大部分が WOW64 では禁止されているため [SetupDiCallClassInstaller](https://learn.microsoft.com/en-us/windows/win32/api/setupapi/nf-setupapi-setupdicallclassinstaller) API は失敗します。しかし、twinBASIC の [WinDevLib](https://github.com/fafalone/WinDevLib) では、それを回避することが出来る。

https://github.com/fafalone/DeviceExplorer

【2022/12/04追記】
twinBASICの応用としてVBScriptをデバッグする方法を見つけました。

https://qiita.com/yaju/items/85acc80dcc9a08b1bc0c

【2022/08/07追記】
2022/05/12に説明動画になります。IDEはtwinBasic専用のものが出来上がってます。WebView2を使用している。

https://youtu.be/y4DRAcdH9tg

【2021/12/25追記】
twinBASICが正式名称のため、TwinBASICからtwinBASICに記事を修正しました。
twinBASICのロードマップです。基本的なフォームGUIのリリース予定日：2022年1月10日

# twinBASICとは
https://www.twinbasic.com/

既存のすべてのVB6.0およびVBAコードと完全に互換性があることを目的とした最新のBASICコンパイラです。
VB6.0と違いインタプリタではありません。GUI画面については現在作成中となっています。
https://www.vbforums.com/showthread.php?890181-TwinBasic/page13

ビルドして出来たEXEファイルは、最適化されていないネイティブコードです。出力コードは最適化されていませんが、ネイティブマシンコードであるため、通常はVBA（またはVB6のpコードコンパイル）よりもはるかに高速です。
※ランタイムまたは再配布可能なコンポーネントを必要としません。

LLVMをtwinBASICに統合して、コード生成に提供される驚くべき利点のいくつかを取得できるようにするための作業がすでに進行中です。

## 名前の由来
Youtubeのコメントの日本語訳
>私たちはtwinBASICを、私たちのお気に入りの古典的なBASIC言語であるVB6の双子の兄弟と考えるのが好きです。もちろん一卵性双生児ではありません...しかし、おそらく数分（または数十年？）後に生まれ、兄弟の過ちから学んだ賢い双子です:)

## GUI画面
GUI画面については現在作成中となっています。
https://github.com/WaynePhillipsEA/twinbasic/discussions/451

<iframe width="560" height="315" src="https://www.youtube.com/embed/nC7r4JdwB_A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## YouTubeによる紹介動画
https://www.youtube.com/c/twinBASIC/videos

## 言語拡張機能
VB6.0だとこんなことも出来なかったんだと思う部分が改良されています。
New compiler features
https://twinbasic.com/preview.html

### インライン変数の初期化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/f188f9d3-e945-ac4a-46e3-87911750b5f2.png)

### 戻りステートメント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/4b941321-811a-07dc-7bd1-be0f2e893a2a.png)

### 複数行コメントのサポート
VB.NETにもなかった複数行コメントが、Cスタイルで可能になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/0dc4c99c-3446-ec23-ae11-0f329a573bbe.png)

### その他
DeclareWide構文、オーバーロード、パラメータ化されたコンストラクタ、ジェネリックなども追加されています。

## ライセンス
32ビットのプロジェクトは、無料で利用可能
64ビットのプロジェクトは、起動時に5秒間のtwinBASICのスプラッシュ画面の表示される、ライセンスを購入すればスプラッシュ画面は表示されなくなる。

# twinBASICによる開発
開発IDEとして、VSCodeを使用します。

インストールからビルドまでの動画があります。

https://www.youtube.com/watch?v=ZzpyZWiCnzo

下記は動画ではなく、Getting Started - Sample 1 - HelloWorld! の記事形式で書かれています。

https://twinbasic.com/preview.html

## インストール
ここからは動画を見ながら、自分なりに構築したのを書いてみました。

拡張機能で「twinBASIC」を検索してインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/df50575a-560c-a2ee-2c22-8585ffbe0bb3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/fcdeb28e-65e8-a780-258a-ba91dea9b00e.png)

## 新規プロジェクト
F1キーを押して、新規プロジェクトを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/691cddca-f02a-0e43-5442-440b6c114800.png)
今回はサンプルのHelloWorldを選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/7ed982a2-e0be-ee58-111a-cb1ad6d7baa3.png)
プロジェクトの保存先として「C:¥WorkSpace¥TwinBasic」を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/627ef4e2-47d6-84bf-77f7-f441d9efebe3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/81ecc3e4-6d88-1333-c7ae-d56f1ee20812.png)

## ワークスペースの信頼
https://forest.watch.impress.co.jp/docs/news/1330930.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/a73b2f44-ab15-feda-26cc-e7763f1290e3.png)
Trustボタンをクリックして信頼させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/8bab244c-89b7-0877-410a-42257b688f3c.png)

## HelloWorld
ソースコードが見れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/f1d710de-e889-5e08-fd8d-01edcee14c97.png)

## VSCodeの表示言語変更
VSCodeの表示言語が英語の状態になっていたので、「表示」 メニューの中の 「コマンドパレット」 メニューをクリックしてコマンドパレットを表示、コマンドパレットで display と入力して「表示言語を構成する(Configure Display Language)」と表示されるのでクリックします。 
表示言語の選択画面で`ja`をクリックします。

https://www.javadrive.jp/vscode/install/index4.html

## デバッグ
ブレークポイントを付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/a83c00a0-2fb9-3387-8150-ac0f0b79b45e.png)
Public Sub Mainの上にある「▶ run ModHelloWorld.Main」をクリックします。
デバッグ実行で止まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/7acb7464-fc22-f479-b936-3b2ae50dbcee.png)
ステップアウトすると、`Hello world!`のメッセージボックスが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/192659b3-c70d-145d-b3de-d4d81d9d18f5.png)

## ビルド
ビルドのアイコンをクリックすると、EXEファイルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/8d08f170-6221-d3fc-4e97-8a7f235dfdf5.png)
BuildフォルダにEXEファイルが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/71732442-eb49-5501-7285-9fc9730ac9ab.png)
EXEファイルをダブルクリックすると、`Hello world!`のメッセージボックスが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/1cdc6f32-385a-d1d2-2181-efb3f2ead413.png)

# ソースコードのインポートとエクスポート
【2023/06/20追記】
ソースコードが含まれているプロジェクトファイル('*.twinproj')はバイナリ形式になっているのですが、これをインポートとエクスポートできないかなと思って調べたら、公式にありました。

https://nolongerset.com/version-control-with-twinbasic/

# 最後に
これは期待できますね、GUI環境が完成したらVB6.0のプロジェクトの読み込みも出来るようにする予定とのこと。
同じVB6.0の互換アプリケーションを作成している、RAD Basicを開発している方と協力して欲しいな。

何かあれば、githubに参加することも出来ます。

https://github.com/WaynePhillipsEA/twinbasic