2024年10月19日

C3言語を触ってみた時のメモ (1) 2024/10

C3言語を触ってみた時のメモ (1) 2024/10

C3言語を触ってみた時のメモ (1) 2024/10

(注)このページは調べながら書いているのでどんどん追加修正されていきます

C3言語とは


ぶっちゃけな言い方をすると

C言語があまりにもアレなので (-:
言語仕様を現代的に進化させました

という言語
C2言語[1]からインスパイアされたらしい

C3言語ホーム: https://c3-lang.org/
Github ページ: https://github.com/c3lang/c3c
Discord グループ C3

C3言語の概要


  1. ネイティブコードコンパイラで高速実行、バックエンドはLLVM
  2. 静的型付き言語
  3. C言語好きな人に一定の支持が得られることが期待できる
  4. C言語の雰囲気を残した近縁種な感じ??
  5. C言語コードを外部関数・ライブラリとして使う(使われる)のは簡単にできる(ABIが同じ)

特徴の一部(全部は無理)


[2]

  1. 言語の名前はC3

  2. コンパイラの実行名はc3c

  3. ソースコードの拡張子は*.c3

  4. ファイルを一つコンパイルするだけなら

    c3c compile ./hello.c3
    
  5. コンパイラにビルドツールが統合されている
    ./project.jsonファイルにビルドオプションを書く

  6. C言語を起点として進化した別言語
    部分的に見るとC言語と100%互換があるコードが*.c3cソース内に存在可能 (後述)

  7. 型について

    1. C言語のtypedefdefに置き換わった
    2. すべてのユーザー定義型の1文字目は大文字で始める
  8. 演算子の優先順位の一部はC言語と非互換

  9. foreach文で配列に対してイテレータ(インデックス可)が使える

  10. 独自文法のマクロ構文を導入 (#if #ifdef #define ... マクロは廃止)

  11. Moduleベースのネームスペースを導入(#include は廃止)

  12. defer: 遅延実行ディレクティブあり

  13. エラー処理は例外処理ではなくOptionalを使ってハンドリングする
    unrwap 付き if文, orelse, catch 等が使える

  14. SIMDを使った高速実行を意図したVector型

  15. C++言語のVector型(std::vector)と類似の物は標準ライブラリのList型

  16. 関数の前方参照宣言は不要
    関数の本体を書く前にその関数を呼び出せる

  17. ジェネリクスあり

  18. RAIIはない

  19. 契約プログラミングの導入

  20. 配列に対するスライス(Slice)型の導入

  21. 文字列型は3種類

    1. String型: (== char[])[3] 一般的なロカール/グローバル領域に確保される文字列はこれ
    2. DString型: ヒープ領域に確保される文字列
    3. ZString型: (== char*)[3:1] C言語インターフェースで使う型
  22. 関数にデフォルト引数が使える \(^o^)/

  23. 関数のオーバロードはない

  24. 極一部で演算子のオーバロードが使える

  25. インターフェース型が使える

  26. リフレクションあり(コンパイル時と実行時)

  27. 構造体にメソッドがバインドできる

  28. ◎ 標準ライブラリを使う時にメモリアロケータを明示使用する必要はない(明示しても良い)

  29. elif, elsif に相当する予約語がない様だ

  30. ローカル変数はデフォルト値0で初期化済[4]

    1. 明示的な初期化が無くても警告やエラーは出ない
    2. int y @noinit; の様に0初期化動作を避けることも可能
  31. 構造体のポインタを使ってフィールド参照する時の
    ->.に置き換えられた

  32. バックエンドがLLVMなのでLLVMが対応できるCPUアーキテクチャには対応可能(c3c v1.0目標)

C3言語の状況: 開発ロードマップ


開発ロードマップ

  • 現在のバージョンはv0.6.3でv1.0.0に向けて開発中
    ライブラリは未成熟だけどコンパイラは現状の版でもプロダクションに使えるという記述がある
    v1.0リリースは 2028/04 (今は2024/10)

TODOリスト

  • v1.0に向けて足りないものとして
    1. C言語からC3言語へのコンバーターアプリ
    2. Regex(正規表現)ライブラリなど

気づいた点


  1. ドキュメントがわかりにくい気がする
    項目数は妥当だけど内容の詳細度が足りなくて理解できない部分が多い感じ
  2. 競合?する言語は多分Zig言語
  3. 標準ライブラリでアロケータを明示しなくて良いのでZig言語よりもスッキリ書ける
  4. 型推論について
    ChatGPTやCoPilotに聞いてみるとC3言語には型推論機能があると出るんだけど
    公式文書では探せなかった
    DiscordのC3言語グループ内を検索すると
    型推論の乱用を避けるためマクロ内限定でvar = ..としてだけ使えるみたいだった

C3言語コンパイラのインストール


Download Windows ZIPファイル
インストール方法 Windows

  1. 上記zipファイルを漢字やスペースを含まないフォルダに解凍するのが無難
    例えば c:\User\username\c3 に解凍したとする

    c3
    │  c3c.exe
    │  msvc_build_libraries.py
    │  
    ├─c3c_rt/
    │      
    └─lib/
    
  2. Visual Studio 2022 をインストールしていない人はランタイムライブラリが必要なので
    上記c3フォルダ内のmsvc_build_libraries.pyをコマンドラインで実行する
    Pythonは導入済みとするとコマンドラインで

    cd c:\User\username\c3
    python msvc_build_libraries.py
    

    とする

  3. Windowsの環境変数PATHc:\User\username\c3を追加

C3言語 テストプロジェクトを作る


コマンドラインで

c3c init myapp

myappフォルダにプロジェクトファイル群が生成される

tree myapp
.
|-- build          # ビルド後に生成された内容
|   |-- myapp.exe
|   |-- myapp.lib
|   |-- myapp.pdb
|   `-- tmp
|-- docs
|-- lib
|-- LICENSE
|-- Makefile
|-- project.json
|-- README.md
|-- resources
|-- scripts
|-- src
|   `-- main.c3  # myappのソースコード
`-- test

Hello worldプログラムが src/main.c3に生成される

cd myapp
cat src/main.c3

src/main.c3の中身

module myapp;
import std::io;

fn int main(String[] args)
{
  io::printn("Hello, World!");
  return 0;
}
pwd 
myapp
c3c run

で実行できる

c3c build で ビルドのみ

コマンドラインオプションは
c3c -O2 -g0 run
c3c -Os -g0 build

-g0 はデバッグ情報なし、デバッグランタイムなしの指定(リリース用ランタイムを使う)

コンパイル時最適化オプション


これは多分Clang/LLVM と同じはず(未調査)

ベンチマークを取るときは少なくとも -g0 を付けないとオプションによっては
デバッグ用のランタイム(恐らく低速)が使われる可能性がある

実際にビルドした実行ファイルを調べたところ

 -g0
 -O0 -O1 -O2 -O3
  [ VCRUNTIME140.dll ]
   [ dbghelp.dll ]

  -O4 -O5 -Os -Oz
  [ VCRUNTIME140.dll ]
  1. -O0 -O1 -O2 -O3 については -g0 指定がないと低速のデバッグランタイムが使われる
  2. -O4 -O5 -Os -Oz については -g0 なしでもリリース用のランタイムが使われる

C言語の様に書けるが...


  1. このコードはC3言語用のソースードだけど
  2. 先頭のfn をカットすればC言語でもコンパイル可能で
  3. forループの書式はC99に準拠
  4. 下記のwhileループはC言語と同じ
fn int total(int a){
    int sum = 0;
    int k = a << 2;
    for(int i = 0, int n = k; i < a; i+=2){
        sum += i + n;
        n++;
    }
    while(a-- > 0){
     sum += a;
    }
    return sum;
}

c3cコマンドライン・オプション


$ c3c

Usage: c3c [<options>] <command> [<args>]

Commands:

  compile <file1> [<file2> ...]                       Compile files without a project into an executable.
  init <project name>                                 Initialize a new project structure.
  init-lib <library name>                             Initialize a new library structure.
  build [<target>]                                    Build the target in the current project.
  benchmark                                           Run the benchmarks in the current project.
  test                                                Run the unit tests in the current project.
  clean                                               Clean all build files.
  run [<target>] [-- [<arg1> ...]]                    Run (and build if needed) the target in the current project.
  dist [<target>]                                     Clean and build a target for distribution.
  directives [<target>]                               Generate documentation for the target.
  bench [<target>]                                    Benchmark a target.
  clean-run [<target>] [-- [<arg1> ...]]              Clean, then run the target.
  compile-run <file1> [<file2> ...] [-- [<arg1> ...]] Compile files then immediately run the result.
  compile-only <file1> [<file2> ...]                  Compile files but do not perform linking.
  compile-benchmark <file1> [<file2> ...]             Compile files into an executable and run benchmarks.
  compile-test <file1> [<file2> ...]                  Compile files into an executable and run unit tests.
  static-lib <file1> [<file2> ...]                    Compile files without a project into a static library.
  dynamic-lib <file1> [<file2> ...]                   Compile files without a project into a dynamic library.
  headers <file1> [<file2> ...]                       Analyse files and generate C headers for public methods.
  vendor-fetch <library> ...                          Fetches one or more libraries from the vendor collection.
  project <subcommand> ...                            Manipulate or view project files.

Options:
  --stdlib <dir>             - Use this directory as the C3 standard library path.
  --no-entry                 - Do not generate (or require) a main function.
  --libdir <dir>             - Add this directory to the C3 library search paths.
  --lib <name>               - Add this library to the compilation.
  --path <dir>               - Use this as the base directory for the current command.
  --template <template>      - Select template for 'init': "exe", "static-lib", "dynamic-lib" or a path.
  --about                    - Prints a short description of C3.
  --symtab <value>           - Sets the preferred symtab size.
  --max-mem <value>          - Sets the preferred max memory size.
  --run-once                 - After running the output file, delete it immediately.
  -V --version               - Print version information.
  -E                         - Lex only.
  -P                         - Only parse and output the AST as JSON.
  -C                         - Only lex, parse and check.
  -                          - Read code from standard in.
  -o <file>                  - Write output to <file>.
  -O0                        - Safe, no optimizations, emit debug info.
  -O1                        - Safe, high optimization, emit debug info.
  -O2                        - Unsafe, high optimization, emit debug info.
  -O3                        - Unsafe, high optimization, single module, emit debug info.
  -O4                        - Unsafe, highest optimization, relaxed maths, single module, emit debug info, no panic messages.
  -O5                        - Unsafe, highest optimization, fast maths, single module, emit debug info, no panic messages, no backtrace.
  -Os                        - Unsafe, high optimization, small code, single module, no debug info, no panic messages.
  -Oz                        - Unsafe, high optimization, tiny code, single module, no debug info, no panic messages, no backtrace.
  -D <name>                  - Add feature flag <name>.
  -U <name>                  - Remove feature flag <name>.
  --trust=<option>           - Trust level: none (default), include ($include allowed), full ($exec / exec allowed).
  --output-dir <dir>         - Override general output directory.
  --build-dir <dir>          - Override build output directory.
  --obj-out <dir>            - Override object file output directory.
  --script-dir <dir>         - Override the base directory for $exec.
  --llvm-out <dir>           - Override llvm output directory for '--emit-llvm'.
  --emit-llvm                - Emit LLVM IR as a .ll file per module.
  --asm-out <dir>            - Override asm output directory for '--emit-asm'.
  --emit-asm                 - Emit asm as a .s file per module.
  --obj                      - Emit object files. (Enabled by default)
  --no-obj                   - Do not output object files, this is only valid for `compile-only`.
  --no-headers               - Do not generate C headers when building a library.
  --target <target>          - Compile for a particular architecture + OS target.
  --threads <number>         - Set the number of threads to use for compilation.
  --safe=<yes|no>            - Turn safety (contracts, runtime bounds checking, null pointer checks etc) on or off.
  --panic-msg=<yes|no>       - Turn panic message output on or off.
  --optlevel=<option>        - Code optimization level: none, less, more, max.
  --optsize=<option>         - Code size optimization: none, small, tiny.
  --single-module=<yes|no>   - Compile all modules together, enables more inlining.
  --show-backtrace=<yes|no>  - Show detailed backtrace on segfaults.

  -g                         - Emit debug info.
  -g0                        - Emit no debug info.

  -l <library>               - Link with the library provided.
  -L <library dir>           - Append the directory to the linker search paths.
  -z <argument>              - Send the <argument> as a parameter to the linker.
  --cc <path>                - Set C compiler (for C files in projects and use as system linker).
  --linker=<option> [<path>] - Linker: builtin, cc, custom (default is 'cc'), 'custom' requires a path.

  --use-stdlib=<yes|no>      - Include the standard library (default: yes).
  --link-libc=<yes|no>       - Link libc other default libraries (default: yes).
  --emit-stdlib=<yes|no>     - Output files for the standard library. (default: yes)
  --panicfn <name>           - Override the panic function name.
  --testfn <name>            - Override the test runner function name.
  --benchfn <name>           - Override the benchmark runner function name.

  --reloc=<option>           - Relocation model: none, pic, PIC, pie, PIE.
  --x86cpu=<option>          - Set general level of x64 cpu: baseline, ssse3, sse4, avx1, avx2-v1, avx2-v2 (Skylake/Zen1+), avx512 (Icelake/Zen4+), native.
  --x86vec=<option>          - Set max type of vector use: none, mmx, sse, avx, avx512, default.
  --riscvfloat=<option>      - Set type of RISC-V float support: none, float, double
  --memory-env=<option>      - Set the memory environment: normal, small, tiny, none.
  --strip-unused=<yes|no>    - Strip unused code and globals from the output. (default: yes)
  --fp-math=<option>         - FP math behaviour: strict, relaxed, fast.
  --win64-simd=<option>      - Win64 SIMD ABI: array, full.

  --debug-stats              - Print debug statistics.
  --print-linking            - Print linker arguments.

  --benchmarking             - Run built-in benchmarks.
  --testing                  - Run built-in tests.

  --list-attributes          - List all attributes.
  --list-builtins            - List all builtins.
  --list-keywords            - List all keywords.
  --list-operators           - List all operators.
  --list-precedence          - List operator precedence order.
  --list-project-properties  - List all available keys used in project.json files.
  --list-manifest-properties - List all available keys used in manifest.json files.
  --list-targets             - List all architectures the compiler supports.
  --list-type-properties     - List all type properties.

  --print-output             - Print the object files created to stdout.
  --print-input              - Print inputted C3 files to stdout.

  --winsdk <dir>             - Set the directory for Windows system library files for cross compilation.
  --wincrt=<option>          - Windows CRT linking: none, static-debug, static, dynamic-debug (default if debug info enabled), dynamic (default).
  --windef <file>            - Use Windows 'def' file for function exports instead of 'dllexport'.

  --macossdk <dir>           - Set the directory for the MacOS SDK for cross compilation.
  --macos-min-version <ver>  - Set the minimum MacOS version to compile for.
  --macos-sdk-version <ver>  - Set the MacOS SDK compiled for.

  --linux-crt <dir>          - Set the directory to use for finding crt1.o and related files.
  --linux-crtbegin <dir>     - Set the directory to use for finding crtbegin.o and related files.

  --vector-conv=<option>     - Set vector conversion behaviour: default, old.
  --sanitize=<option>        - Enable sanitizer: address, memory, thread.

ChatGPT に聞いてみた


GPT-4o モデル: スクリプト: C3言語のC言語との違いについて超絶詳しく教えて

出力は省略 😃


  1. 詳細は省略 http://c2lang.org/ ,https://github.com/c2lang/c2compiler ↩︎

  2. 内容について間違いや勘違いがあれば後日修正します ↩︎

  3. distinctされている ↩︎ ↩︎

  4. 恐らくグローバル変数も(C言語流れなので) ↩︎

posted by Copyright (C) audin All Rights Reserved. at 18:39| Comment(0) | C3言語 | このブログの読者になる | 更新情報をチェックする

2024年09月08日

Intel Core i 13世代 14世代 CPU バグの行方 メモ 2024/09

Intel Core i 13世代 14世代 CPU バグの行方 メモ 2024/09

Intel Core i 13世代 14世代 CPU バグの行方 メモ 2024/09


2024/09 - 2

なんか大変なことになってる

2024/09 - 1

これはOK、これはNGって覚えられないので
今PCを購入するなら
Core i 12xxx 系の12世代か
Core i 15xxx 系の15世代(未発売) (-:

Core i5-12400が安くて良いかも

13世代14世代を買うならBIOSパッチ適用済を購入前に確認
購入後にBIOSのバージョンを再度確認 (-:

っていうかAMDのRyzenにすれば無問題 😃

posted by Copyright (C) audin All Rights Reserved. at 17:37| Comment(2) | PC関連 | このブログの読者になる | 更新情報をチェックする

2024年08月24日

Lua言語:GUI: LuaJITでDear ImGuiを動かした時のメモ 2024/08

Lua言語:GUI: LuaJITでDear ImGuiを動かした時のメモ 2024/08

Lua言語:GUI: LuaJITでDear ImGuiを動かした時のメモ 2024/08

はじまり


Dear ImGui [1] の各種言語バインディング用C言語インターフェースCImGuiの作者である
Victor Bombi氏のリポジトリでanimaプロジェクトというのを発見した

animaとは魂、生命、精神という意味だけど、それらをイメージした音と映像を使ったart系の作品を作るためのライブラリ群のことと思われる

このanimaリポジトリには以下のライブラリ(*.dll, *.lua)と実行ファイル(LuaJIT.exe)が含まれている

  1. LuaJIT インタプリター (Lua言語を超高速JITコンパイル実行)
    Lua(+FFI)言語を使ってGUI(Dear ImGui)プログラムを作成後、実行するためのexeファイル
  2. オーディオ再生系ライブラリ
  3. 画像処理系ライブラリ (動画系もある?)
  4. 非同期処理系ライブラリ
  5. SDL2/SDL3[2], GLFW, GL ライブラリ
  6. ImGuiとアドオンライブラリ
    ImPlot, ImPlot3D ImNodes, ImGuizmo, その他多数
    LuaJITで使う時は CImGui, CImPlot, CImNodes, CImGuizmoを経由する
  7. 上記ライブラリを使うためのLuaで書かれた簡単なサンプルコード群

ポイント


  1. ユーザー側のLua GUI ソースコードはLuaJITインタプリタで実行されるので
    Luaソースコードのコンパイルが不要でお手軽に即GUIアプリが実行できる

  2. 外部依存ライブラリなし
    LuaJITを含め必要な多数のライブラリが含まれている

  3. WindowsOS, Linux用プロジェクト可能
    このブログではWindowsOS用にコンパイルした物を使います

  4. オリジナル(animaプロジェクト)のコンパイル済みのバイナリ配布は2021/04が最後(今は2024/08)
    https://github.com/sonoro1234/anima/releases (ImGui部分は v1.82)

  5. なので自分でコンパイルしてみた
    今ここ

  6. オリジナルとの違い

    • コンパイルオプションに以下を加えています

      1. 日本語入力IMEの入力候補位置正常化対応 [3]
        "-DIMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS"
      2. ImPlot
        "-DImDrawIdx=unsigned int"
    • animaプロジェクト付属のexampleプログラムが簡単に実行できるように*.batファイル群を追加

    • Dear ImGui / CImGuiのサンプルをベースに各種exampleプログラムを追加
      (ImGuinImGuinZプロジェクトと同じ)

    • GUIの背景に表示されるコンソール画面を消すことも可能(後述)

Dear ImGuiのバージョン


GUIプログラムの概略


ここと同じなので省略
Zig言語:GUI: Zig言語でDear ImGui/ImPlotを使ってみたメモ 2024/07

Examples


implot3d_sample.lua

ImPlot3Dのデモ
This sample is attached by anima project. You can execute this sample using
implot3d_sample.bat
in bin/examples/LuaJIT-ImGui/examples folder.

alt

glfw_opengl3_simple

glfw_opengl3_simple.lua
アイコンフォントをふんだんに使ってみただけ (-:
glfw_opengl3_simple

IconFontViewer

アイコンフォントビューアを書いてみた
iconFontViewer.lua

alt

glfw_opengl3

glfw_opengl3.lua
画像の表示とWindow内の任意領域をキャプチャした画像を保存できるようにした
画像の部分拡大機能を追加 (2025/01)

glfw_opengl3

glfw_opengl3_implot / implot3D

glfw_opengl3_implot.lua
ImPlot / ImPlot3D 使用デモ
LuaJIT言語でデモを書き直してみた implotWindow.lua

glfw_opengl3_implot

animaプロジェクト付属の example: implot_sample.lua
alt

glfw_opengl3_jp

glfw_opengl3_jp.lua
日本語表示と日本語入力のデモ
画像の部分拡大機能を追加 (2025/01)

glfw_opengl3_jp

sdl2_opengl3

sdl2_opengl3.lua

SDL2のデモ
画像の部分拡大機能を追加 (2025/01)

sdl2_opengl3

ImGuizmo_sample.lua

ImGuizmo_sample.lua

ImGuizmoのデモ
左上の小さい物体をマウスでグリグリすると
右下の大きい物体も同期してグリグリされたりする
変形や回転移動もできたりする

ImGuizmo_sample

imnodes_graph_sample.lua

This sample is attached by anima project. You can execute this sample using
imnodes_graph_sample.bat
in bin/examples/LuaJIT-ImGui/examples folder.

imnodes_graph_sample

その他のexample


bin/examples内には他にもサンプルコードがあるけど全部は載せられないので一部を以下に載せます

julia.lua
luajitImGui-1.91.8.3/bin/examples/juliaSet/julia.bat

を実行するとLua + GLSLで書かれている3Dグリグリ系のデモが起動します

julia

delaunay_particles.lua

alt

bacteria.lua

alt

house.lua

alt

corazon.lua

alt

CTE_windows.lua

シンタックスハイライト付きのエディタプラグイン

alt

compute_shader.lua

alt

ダウンロードと実行 download


最新[4]Github リポジトリはここ luajitImGui

zipファイルを適当なフォルダに解凍します [5]

  • examplesを実行
    例えば Windowsのファイルエクスプローラで

    luajitImGui-1.91.8.3/examples/glfw_opengl3/glfw_opengl3.exe
    

    をダブルクリックで実行すればGUIが起動します
    (バージョン番号の部分はダウンロードしたファイル名に依存)
    又は

    # デバッグ用のコンソール画面が裏に表示されます
    luajitImGui-1.91.8.3/examples/glfw_opengl3/r.bat  
    

    一旦GUIを終了し、
    同じフォル内のglfw_opengl3.lua内の例えばigText()等の文字列等をテキトーに修正した後
    r.bat(又は*.exe)を実行すれば修正が反映したGUIが起動します (コンパイルの必要なし)

    以下のフォルダ内も同様に実行可能

    ...
    .../example/glfw_opengl3_implot
    .../example/glfw_opengl3_jp
    .../example/glfw_opengl3_simple
    .../example/sdl2_opengl3
    etc.
    
  • animaプロジェクトに付属のexampleプログラムを実行
    以下のフォルダ内に*.batファイルがあるのでそれぞれを
    Windowsのファイルエクスプローラでダブルクリック実行すればGUIが起動します

    luajitImGui-1.91.8.3/bin/examples/LuaJIT-ImGui/examples/
    

    bin/examples/LuaJIT-ImGui/examples

自前でビルドするメモ


以下は自分でバイナリファイル群(bin/ 以下の*.exe, *.dll)をビルドする時のメモ
上記zipファイルを使うだけなら不要な作業

  • 以下のツールズ(*.exeファイル)へ実行パスが設定されているとする

  • 必要なツール類: MSys2/MinGW ツールズとClangコンパイラ

  • CMake, make.exeも必要

    pacman -S mingw-w64-ucrt-x86_64-{cmake,gcc,clang,llvm-openmp} patch make
    
  • MSysコンソール上でトップフォルダのMakefileを実行

  • 現在はMinGW版のClangでコンパイルしている (GCCはバイナリが大きくなりすぎなので)

  • Makefile内の TC = clang
    TC = gcc で MinGW版GCC
    TC = msvc で Microsoft Visual Studio 2019 C/C++でコンパイル可能[6]

    • msvcでコンパイルする時は./buildフォルダ内に*.slnができるので
      Microsoft Visual Studio IDEでオープンして
      構成のところで自動インストールにチェックを入れた後ビルドする(これ重要)
  • OpenMPライブラリが必要だった記憶がある。MinGWで

    libopenmpt  
    libopenmpt-modplug  
    

    の二つがインストールされていた(プレフィックスは省略)
    本当に必要かどうかは未確認 (-: Clangの場合は必要

他にもMinGWで必要なライブラがあるかもですがCMakeのエラーを見ながら
テキトーに追加して下さい (-:

以下はClangでビルドする場合

git clone --recurse-submodules https://github.com/dinau/luajitImGui
cd luajitImGui
make clean
make

CMakeでコンパイルがはじまり正常終了すればOK
../binの中にバイナリとライブラリ(*.lua)がインストールされています

GUI背景のコンソール画面を消す


デフォルトのbin/luajit.exeバイナリでは必ずGUI背景のコンソール画面が表示されます
これを消すための方法はいくつかあるみたいで

  1. 例えば起動用のr.batファイルのショートカットを作ってそのプロバティ:実行時の大きさ(R)
    起動時に最小化させる方法: 【Windows11】バッチファイル実行時に黒い画面を出さない方法
    ショートカットは任意の名前に変更できる
    ショートカットのアイコン変更も可能
    ただしタスクバーに最小化されたコンソール画面が残っている

  2. luajit.exeをコンパイルする時に-mwindowsを付けてコンパイルする
    ここを参照してやってみました
    How to build windowless LuaJIT for Windows

    新規で任意のフォルダを作ってその中で

    git clone --recurse-submodules https://github.com/dinau/luajitImGui
    cd luajitImGui/anima/LuaJIT/LuaJIT
    

    ファイル src/luajit.c の最後の行に以下を追加して保存します[7]

    int __stdcall WinMain(void* hInstance, void* hPrevInstance, char* pCmdLine, int nShowCmd)
    { return main(__argc, __argv); }
    

コンパイルはMSysのコンソール画面内で行います(これ重要でした)

pwd 
LuaJIT
make TARGET_LDFLAGS="-mwindows" TARGET_CFLAGS="-O2 -DLUAJIT_ENABLE_LUA52COMPAT"

コンパイル後の

src/luajit.exe
src/lua51.dll

luajit.exeluajitw.exeにリネームしてlua51.dllとペアで使います

しかし 出来上がったluajitw.exeを使ってコンソール画面を消す方法がよく分からないので (オイ
ランチャーとなるEXEファイルを作って、それ経由でGUIアプリを起動させています
例えばそれぞれのフォルダ内の*.exeファイル

luajitImGui-1.91.8.3/examples/glfw_opengl3/glfw_opengl3.exe

がランチャーファイルになります
この場合glfw_opengl3.exeは自分と同じフォルダにある
glfw_opengl3.lua../../bin/luajitw.exe の引数にして実行します
例えば、
"glfw_opengl3.exemain.exeにリネームした場合、同じフォルダ内のmain.luaを実行します"
という動作をするランチャー です
ソースコードはこれ execLuaSource.c
ランチャーはEXEファイルなのでwindres.exeで任意のアイコンをくっつけることができます

未使用ファイルを削ってプロジェクトサイズを小さくする


./binフォルダ以下はzip解凍した状態で約30MB
アプリを作るときに未使用な*.dll, *.luaは削除可能
例えば
SDL2とaudio関連を未使用なら恐らくざっくり

 3.7M  cimgui_sdl.dll
 1.6M  SDL2.dll
 1.5M  libsamplerate-0.dll
 1.5M  samplerate.dll
 573K  sndfile.dll

合計 約9MB 減らせるのと関連する*.luaファイルも削除できる

その他の方法として

  1. コンパイラをmsvcにするともう少し小さくなるかも
  2. コンパイルオプションは-O2だけど-Osで良いなら劇的に減るかも

LuaJITのLuaモジュール・デフォルト検索フォルダ


LuaJITソースファイルLuaJIT/src/luaconf.hの上の方に以下の記述で
デフォルトの検索フォルダが決定されている
今回(普通は?)は以下の設定のままbin/luajit.exe,bin/luajitw.exeがビルドされている

...snip...
#if defined(_WIN32)
/*
** In Windows, any exclamation mark ('!') in the path is replaced by the
** path of the directory of the executable file of the current process.
*/
#define LUA_LDIR	"!\\lua\\"
#define LUA_CDIR	"!\\"
#define LUA_PATH_DEFAULT \
  ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;"
#define LUA_CPATH_DEFAULT \
  ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"
#else
...snip...
  • Luaモジュールとは*.luaファイルのこと

  • Cモジュールとは*.dllファイルのこと

  • !記号はluajit.exeがあるフォルダ名に置換される

  • #define LUA_LDIR "!\lua\"
    luajit.exeがあるフォルダ内のluaフォルダを表す

  • #define LUA_CDIR "!\"
    luajit.exeがあるフォルダを表す

  • #define LUA_PATH_DEFAULT
    LUA_PATHのデフォルト値を設定する
    「WinodwsOSの環境変数LUA_PATH」が未定義なら
    ここで設定された値がデフォルトのLuaモジュールパスとなる
    以下の3つが設定されている

    1. ユーザープログラムがあるフォルダ
    2. luajit.exeがあるフォルダ/lua
    3. luajit.exeがあるフォルダ/lua/init.lua

    上記i.と ii.に置かれた*.luaファイルはファイル名だけでrequireできる
    例えば luajit.exeがあるフォルダ/lua/mycode.luaというモジュールは
    ユーザーコード内で

    local mylib = require"mycode"
    

    という形で呼び出せる

    また luajit.exeがあるフォルダ/lua/pico/driver.lua という階層のモジュールは
    ユーザーコード内で

    local mypico = require"pico.driver"
    

    という形で呼び出せる
    iii.については
    もしその場所にinit.luaが存在すれば起動時にユーザープログラムの前に
    自動実行されるluaファイルとなる

  • #define LUA_CPATH_DEFAULT
    *.dllモジュール検索についての設定で

    1. ユーザープログラムがあるフォルダ
    2. luajit.exeがあるフォルダ
    3. luajit.exeがあるフォルダ/loadall.dll
      これは、もしその場所にlaodall.dllがあれば自動で読み込まれる
  • WindowsOS環境変数のLUA_PATH, LUA_CPATHを設定する場合
    上述の LUA_PATH_DEFAULT, LUA_CPATH_DEFAULTの設定は
    ;;という形で表される

    set LUA_PATH=";;..\mylib_dir;..\..\driver"
    set LUA_CPATH=";;..\bin;..\..\dlls"
    

    恐らく;;の記述位置を変えれば優先順位も変わる

  • 設定順序
    package.pathに上記の値が設定される順は

    1. 最初にLUA_PATH_DEFAULTの値が設定される
    2. WindowsOS環境変数LUA_PATHがあればその値で上書きされる
    3. ユーザープログラムで値を設定できる

ツール類のバージョン


  • Clang 20.1.0 (Current compiler)
    • Libraries: OpenMP
  • Gcc.exe (Rev1, Built by MSYS2 project) 14.2.0)
  • (Microsoft Visual Studio 2022 C/C++)
  • CMake version 3.31.6
  • Git version 2.46.0.windows.1
  • Make: GNU Make 4.4.1

メモ


最初の版は(2024/02)頃に"完"したけどブログ記載は半年後(2024/08)となった

旧版


WindowsOS 64bit 版

WindowsOS 32bit/64bit 共通版

  • LuaJITImGui: 1.91.0.2.zip (20MBくらい) (2024/10)

    • 変更点: 日本語表示ができないのを修正
  • LuaJITImGui: 1.91.0.1.zip (20MBくらい) (2024/08)

    • 変更点
      • glfw_opengl3.luaでSave window imageボタン押すと落ちるのを修正
      • LuaJITコンパイル時に-DLUAJIT_ENABLE_LUA52COMPATオプション追加
  • LuaJITImGui: 1.91.0.0.zip (20MBくらい) (2024/08)
    最初の版

類似 project


Language Project
Nim Compiler ImGuin, Nimgl_test, Nim_implot
Lua Script LuaJITImGui
Zig, C lang. Compiler Dear_Bindings_Build
Zig Compiler ImGuinZ
NeLua Compiler NeLuaImGui
Python Script DearPyGui for 32bit WindowsOS Binary

SDL Game tutorial Platfromer


ald

Language Project
Nim Compiler Nim-Platformer/ sdl3_nim
LuaJIT Script LuaJIT-Platformer
Nelua Compiler NeLua-Platformer
Zig Compiler Zig-Platformer

PythonでImGuiを使いたいときは
https://github.com/pthom/imgui_bundle
https://github.com/hoffstadt/DearPyGui かも

C++
https://github.com/pthom/hello_imgui

3D game engine with lua scripting
https://github.com/adriengivry/Overload


  1. 以下ImGuiと記すかも ↩︎

  2. SDL3は次のリリースで追加されるかも ↩︎

  3. SDL2は日本語入力に難ありです。日本語表示はok ↩︎

  4. Githubページのほうが最新版になってる可能性が高い。このページはあまり更新しない可能性あり ↩︎

  5. 日本語もスペースも含まないフォルダが良い ↩︎

  6. Microsoft Visual Studio 2022 C/C++はコンパイルできない orz ↩︎

  7. トップフォルダのMakefileに組み込んだので現在は自動適用される。(Patchコマンドが必要) ↩︎

posted by Copyright (C) audin All Rights Reserved. at 15:52| Comment(0) | Lua言語 | このブログの読者になる | 更新情報をチェックする

2024年08月07日

WebXrayのメモ 2024/08

クッキーでどう追跡されているかを表示するアプリらしい
そのうち試すためにリンクだけを残す

WebXray
https://www.gizmodo.jp/2024/08/search-engine-webxray.html
posted by Copyright (C) audin All Rights Reserved. at 21:03| Comment(0) | その他 | このブログの読者になる | 更新情報をチェックする

2024年07月30日

Zig言語:GUI: Zig言語でDear ImGui/ImPlotを使ってみたメモ 2024/07

Zig言語:GUI: Zig言語でDear ImGui/ImPlotを使ってみたメモ 2024/07

Zig言語:GUI: Zig言語でDear ImGui/ImPlotを使ってみたメモ 2024/07

alt alt
alt

はじまり


Zig-0.12.0が自分の環境で珍しくまともに動いたのを機にGUIアプリが作れる
軽量 Dear ImGuiライブリ(以下ImGuiと記す)をZig言語から呼び出して使ってみました
ついでにグラフ表示ライブラリのImPlotも使ってみたメモ

ちなみにZig言語は発見して以来2.5年ぶりに触ってみることになりました 😃

動作環境・必要条件


  • WindowsOS (Window10以降)
  • Linuxに対応しました (2024.10) Ubuntu/Debianファミリなら多分OK [1]
  • MSys2/MinGW の基本コマンド (make, rm, cp, strip ...)を使っています [2]
  • Gitコマンド

Zig言語の注意点 現時点(2024/08 - 2025/04)


Zig言語は現在も[3] 😃 開発中につき言語仕様がリリース毎に変更されて(数ヶ月から半年周期くらいか)
ユーザー側のソースコードとの互換がなくなります
従ってこのページの内容を試す場合、Zig言語のバージョンは以下を使うことを強く推奨します
具体的にはこれ

[x] zig-0.14.0 Windows OS
[x] zig-0.14.0 Linux OS

Dear ImGuiライブラリの使用


C++言語で書かれたDear ImGuiライブラリをZig言語から直接呼ぶことはできないので
C言語のヘッダファイルを持つCImGui(/CImPlot)ライブラリを経由して
Zig言語から呼び出して使います

%%{init: {'theme':'forest'}}%% flowchart LR; A("Dear ImGuiライブラリ<br/>C++言語") B("CImGuiライブラリ<br/>C言語"); C("ImPlotライブラリ<br/>C++言語"); D("CImPlotライブラリ<br/>C言語"); A --> B; A -- アドオンライブラリ --> C; C --> D; B -- C言語Header: @cImport() --> M; D -- C言語Header: @cImport() --> M; B -- Header --> D; M("ユーザーGUIプログラム<br/>Zig言語") style A color:black, fill:yellow, stroke:black style C color:black, fill:yellow, stroke:black style M color:white, fill:darkblue, stroke:white
  • Dear ImGui
    C++言語で書かれたイミディエートモード [4]で動作する軽量GUIライブラリ

    • CImGui: Dear ImGuiを各種言語から使える様にするC言語ライブラリ
  • ImPlot
    C++言語で書かれたDear ImGuiのアドオン・グラフ描画ライブラリ

    • CImPlot: ImPlotを各種言語から使える様にするC言語ライブラリ
  • ImNodes/CImNodes, ImGuizmo/CImGuizmo, etc
    今回未使用の他のアドオンライブラリ

  • 本当はラッパーライブラリが...
    例えばCImGuiライブラリユーザーGUIプログラムの間に
    *.jsonファイルからZig言語で書かれた関数変換ッパーライブラリ(後述)を生成し
    ユーザー側はそのライブラリ関数経由でを使うのが将来の姿
    今回はCImPlot用の関数変換ラッパーライブラリ(後述)のみを作りました

Zig言語のメリットの一つにC言語ライブラリを直接呼べるというのがあって
今回はそれを使ってみました[5]

Dear ImGuiのバージョン


ImGui/CimGui version 1.91.8dock (2025/08) (最新バージョンはここ)

GUIライブラリ使用時のポイント


基本的にリポジトリの中に必要なライブラリを全て持つことにします(外部依存なし(Linuxは除く))

  • 生成されるEXEファイルはスタティックリンクとし単一ファイル(dll依存なし)で実行可能とする
  • GUI描画のバックエンドはOpenGL3とし GLFW-OpenGL3, SDL2-OpenGL3, SDL3-OpenGL3の組み合わせで使います
  • アイコンフォント Font Awesomeを使います。添付
    alt
  • GLFW 3.4.0 スタティックライブラリを添付
  • SDL2/SDL3 スタティックライブラリを添付
  • 各種画像(JPEG,PNG..etc)表示、保存用にSTB (stb_imageだけ)ライブラリを添付
  • ImPlotでImDrawIdx="unsigned int"を有効にする
  • ImGuiで日本語入力候補位置を正常化するように Input method (IME)定義
    IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONSを有効にする[6]

ビルドと実行


  1. Windowsのコマンドライン上でプロジェクトをダウンロードします

    git clone --recurse-submodules https://github.com/dinau/imguinz
    

    (Githubリポジトリはここ ImGuinZ) [7]

  1. 例えばexamplesの一つに移動します

    cd imguinz/examples/glfw_opengl3_jp
    
  2. ビルドと実行

    make run       #  又は  zig build --release=fast run
    

ImGui: GUIプログラムの概略


%%{init: {'theme':'forest'}}%% flowchart LR; A("プログラム開始<br/>main()") --> B(":: 初期化処理 ::"<br/> GLFW, OpenGL3<br/> Dear ImGui<br/> フォント<br/> 変数その他); B -->C{"while<br/> メインループ"}; C -- 終了 --> G(:: 終了処理 ::) -->I(プログラム終了) C -- 継続 -->D(:: 処理 ::<br/>描画系1); D -->E[":: GUI メイン ::<br/> Dear ImGui"]; E -->F(:: 処理 ::<br/>描画系2); F -->C; style E color:black, fill:orange, stroke:black
  • 上のフローチャートでグリーンの部分は定型処理なので新規プログラムにコピペで使用可能部分
    これらの詳細は簡単なGUIならひとまず理解する必要のない部分
  • GUIの具体的なプログラムはオレンジ色の 「:: GUIメイン :: Dear ImGui」の部分に書いていく
    各種イベント処理もこの中で行う
GUIのメイン処理 Dear ImGui

flowchart TB; E[":: GUI メイン ::<br/> Dear ImGui"]; style E color:black, fill:orange, stroke:black

メイン処理の中でWindowを一つ作ってGUI部品(ウィジェット)を並べていきます
レイアウターはなく、部品を縦横に配置していくだけなので簡単です[8]

GUI部品を縦(タテ/垂直)に並べる

alt

上図のレイアウトを分かり易く引数を省略して書くと以下の様な仮想コードになります

// Show window
{ // defer文を使う時、このブロック分離は必須
  _ = ig.igBegin();   // Windowを一つ作って開始
  defer ig.igEnd ();  // defer文によるWindow終了処理
  // 
  ig.igText();        // テキストウィジェットを配置
  if (ig.igButton()){ // ボタンウィジェットを配置、ボタン押下イベントもここで取る
    MySaveFunction(); // 押下イベント処理を実行
  }
  ig.igInputText();  // テキスト入力ウィジェットを配置
  ig.igSliderFloat(); // スライダーウィジェットを配置 
  // Window処理終了
} // ブロック分離終了

GUI部品関数を上から下に書くと、その順に画面に表示されていきます
実際のコードは関数引数を以下の様に指定します

// Show window
{
  _ = ig.igBegin ("Dear ImGui", null, 0);
  defer ig.igEnd ();
  // 
  ig.igText("Hello, world %d", 123); // テキストウィジェットを配置
  if (ig.igButton("Save", btnSize)){ // ボタンウィジェットを配置、ボタン押下イベントもここで取る
    MySaveFunction();                // 押下イベント処理を実行
  }
  ig.igInputText("string", &buf, buf.len, 0, null, null);  // テキスト入力ウィジェットを配置
  ig.igSliderFloat("float", &fval, 0.0f, 1.0f, "%.3f", 0); // スライダーウィジェットを配置 
}
GUI部品を横(ヨコ/水平)に並べる

GUI部品のデフォルト配置が縦なのでヨコに並べる時は、GUI部品の後に水平に並べる関数 igSameLine() を呼び出します

flowchart LR; A["Button1"]-->B["Button2"]-->C["Button3"]; style A color:white, fill:navy, stroke:black style B color:white, fill:navy, stroke:black style C color:white, fill:navy, stroke:black

上の様にボタンを3つ横に並べたいときは以下の順に関数を呼び出します

flowchart LR; A["igButton()"]-- igSameLine()-->B["igButton()"]--igSameLine()-->C["igButton()"]; style A color:white, fill:navy, stroke:black style B color:white, fill:navy, stroke:black style C color:white, fill:navy, stroke:black

実際のコード

// Show window
{
 _ = ig.igBegin ("Dear ImGui", null, 0);
 defer ig.igEnd ();
 // 
 if (ig.igButton("Button1", btnSize)){ // ボタン1 ウィジェットを配置
   Button1Func();                      
 }
 ig.igSameLine (0, -1.0)               // 次の部品を横に並べる関数
 if (ig.igButton("Button2", btnSize)){ // ボタン2 ウィジェットを配置
   Button2Func();                      
 }
 ig.igSameLine (0, -1.0)               // 次の部品を横に並べる関数
 if (ig.igButton("Button3", btnSize)){ // ボタン3 ウィジェットを配置
   Button3Func();                      
 }
}

igSameLine()の引数(0, -1.0)はデフォルト値でこれを指定しておくと適度に配置してくれます 😃

特定の値にしたい時は最初の引数が開始位置で、次がスペース量です。

GUI部品のタテ間隔を空ける

flowchart LR; A["Button1"] B["Button2"] style A color:white, fill:navy, stroke:black style B color:white, fill:navy, stroke:black

上の場合はigNewLine()関数を挿入します

flowchart LR; A["igButton()"]-- igNewLine()-->B["igButton()"] style A color:white, fill:navy, stroke:black style B color:white, fill:navy, stroke:black
部品間隔に関する関数群

ひとまず以下のような読めばだいたい想像がつく関数が用意されていますが
詳細は省略します

igSeparator(void);
igSameLine(float offset_from_start_x,float spacing);
igNewLine(void);
igSpacing(void);
igDummy(const ImVec2 size);
igIndent(float indent_w);
igUnindent(float indent_w);
BeginGroup();                   
EndGroup();                     
AlignTextToFramePadding();      
GetTextLineHeight();            
GetTextLineHeightWithSpacing(); 
GetFrameHeight();               
GetFrameHeightWithSpacing();    

説明はソースコードに書かれていて
使い方はデモコードで知ることになります

最も重要な: GUIのラベルは識別子

  1. GUI部品ラベルとはGUI部品関数の最初の引数ラベルのこと
    ig.igButton("Save", btnSize)の場合は「"Save"」ラベルが識別子となる

  2. その型は文字列

  3. このラベルがその部品の識別子となるので同一スコープ内での重複は許されない
    重複した場合はプログラムの動作が不規則に挙動不審であやしい動きをする (-:
    最近のバージョンでは識別子が重複していると動作時に以下の様にGUI上でメッセージが表示される様になった

  4. WindowもGUI部品
    Windowラベルも固有の識別子が必須

    ig.igBegin("win1")  // 一つ目のWindow 
    ...
    ig.igEnd()
    
    ig.igBegin("win2")  // 二つ目のWindow
    ...
    ig.igEnd()
    
  5. Windowが分かれていれば重複名OK
    "Button1"ラベルは重複使用だがOK

    ig.igBegin("win1")  // 一つ目のWindow 
      if ig.igButton("Button1",...){
      }
    ...
    ig.igEnd()
    
    ig.igBegin("win2")  // 二つ目のWindow
      if ig.igButton("Button1",...){
      }
    ...
    ig.igEnd()
    
  6. 識別子の可否
    GUI部品のラベル部分だけを抜き出すと
    以下はアプリ内で別Windowにボタンが所属しているので"Button1"ラベルの使用はOK

    OK: "win1" - "Button1"
    OK: "win2" - "Button1"
    

    同一Window内でもTabウィジェット内に所属するなら、そこで識別子分離(別スコープ)が起こるので重複ラベルOK

    OK: "win1" - "Button1" 
               - "tab1" - "Button1"   // Tabウィジェットで分離されたので"Button1"重複はOK
    OK: "win2" - "Button1" 
               - "tab1" - "Button1"
               - "tab2" - "Button1"   // Tabウィジェットで分離されたので"Button1"重複はOK
    NG:                 - "Button1"   // 同一Tab内で"Button1"重複はNG
    
  7. 同一スコープ内で同じ表示ラベルを使いたい場合
    ## + 任意の文字列 で識別子を作る

    ig.igButton("Button1##bb1",..)
    ig.igButton("Button1##bb2",..)
    

    ##bb1, ##bb2の部分は表示されず識別要素として使われる

  8. まとめ
    最初のWindowラベルからたどって最後の当該GUI部品のラベルを全部並べて
    Hash値を取り、それがアプリ内で重複しなければOK

    部品を大量にプログラムで並べたいときは
    ig.igPushID(..)
    ig.igPopID()
    を使って意図的に識別子分離することも可能な様だ

  9. 参考: このあたり
    https://github.com/ocornut/imgui/blob/master/docs/FAQ.md#q-about-the-id-stack-system

  10. 識別子が不要なGUI部品
    マウスでクリックできないGUI部品は識別子カウントされない
    例えば igText()やセパレータ等々

次に重要な: GUI部品のラベルを隠す

部品を並べていくと勝手に表示される部品ラベルを非表示にしたい場合がある
ラベルを隠すには

ig.igSliderFloat("",...)
ig.igSliderFloat("##",...)

の様にラベル部分を""(空文字)や##にすれば良いが
これだと識別子重複違反になるので普通は##slider1の様に
##の後に任意で非重複な識別子を追加する

ig.igSliderFloat("##slider1",...)

Examplesプログラムを実行した時のスクリーンショット


ImGui-Toggle / CImGui-Toggle


トグルスイッチ・ウィジェット・ライブラリを使ってみた (2025/02)

glfw_opengl3_imgui_toggle.zig

alt

ImGui-Knobs / cimgui-knobs

アナログ的なツマミ調整ウィジェット
ミキサー類に使える

glfw_opengl3_imknobs.zig

alt

ImSpinner / CImSpinner

スピナーウィジェット
回転系のスゴめなアイテム群

glfw_opengl3_imspinner.zig

alt
alt

glfw_opengl3, sdl2_opengl3, sdl3_opengl3

glfw_opengl3 , sdl2_opengl3 , sdl3_opengl3

アイコンフォントを表示

alt

glfw_opengl3_jp

glfw_opengl3_jp
日本語の表示と入力

alt

IconFontViewer

iconFontViewer
Iconフォントビューア、部分ズーム

alt

glfw_opengl3_image_load

glfw_opengl3_image_load
画像の表示と保存、部分ズーム

alt

黄色の「Save Image」ボタンでキャプチャした画像は./zig-out/binフォルダに保存されます
保存形式はJPEG / PNG / BMP / TGA が選択可能

glfw_opengl3_implot

glfw_opengl3_implot
ImPlotライブラリ使用デモ

alt

ImPlot デモを「 Zig言語」で書いてみた


現状、全てではないです(残りはおいおい)
C++言語で書かれたデモを手動 (^^; でZig言語に変換しています
ChatGPTにお願いしたけど無料版なので無理でした
orz
orz

ビルドと実行
pwd
examples/imPlotDemo
make run   # or zig build --release=fast run

Zig言語で書いたImPlot デモソース demoAll.zig
ImPlot使用時のImVec4周りが多重定義でコンパイルできない(理由は不明)ので
やっつけ(TODO)な感じになっています
orz

以下はC++だったコードをZig言語で書き直したデモを実行した時の表示画像です
(C++コードと全く同じ画面なわけですが... 😃

Plots Tab

LinePlots (アニメーション)

alt

BarGroups

alt

BarStacks

alt

PieCharts

alt

Heatmaps

alt

Histogram2D

alt

Images

alt

Axes Tab

LogScale

alt

Subplots Tab

Tables (アニメーション)

alt

Tools Tab

DragRects

alt

コンソールウインドウを表示・非表示にする


各exampleフォルダの中の build.zig を開いて以下の行で表示/非表示にします
デフォルト: 非表示
以下をコメントアウト: 表示

... snip ...
exe.subsystem = .Windows;  // Hide console window
... snip ...

その後 make run を実行します

ImPlotラッパー関数について


上で書いた関数変換ラッパーライブラリです
ImPlotの場合このライブラリを作らないと結構大変なことになるので
仕方なく(オイ) 作りました
ImPlot関数の呼び出しが簡単になるようにラッパー関数を半自動生成しています
本来は上で書いたJsonデータを使って自動生成プログラムを書くのが正攻法ですが
とりあえずJsonファイルを使わず半手動プログラムから生成しています 😃

以下は生成された関数変換ラッパーライブラリ
examples/imPlotDemo/src/zimplot.zig

Zig言語用Dear ImGuiラッパーライブラリ


ちゃんとラッパーライブラリを作ったプロジェクトがあるので
そのうちというかZig言語の正式リリース以降にさらに活発にメンテナンスされるかも

https://github.com/pdoane/zig-imgui/blob/main/src/imgui.zig
https://github.com/SpexGuy/Zig-ImGui/blob/master/zig-imgui/imgui.zig

SDL libraries


https://github.com/libsdl-org/SDL/releases

My tools version


  • Git version 2.46.0.windows.1
  • Make: GNU Make 4.4.1
  • Zig: 0.14.0
  • SDL2 2.32.0
  • SDL3 3.2.6

類似プロジェクト


Language [9] Project
Lua Script LuaJITImGui
NeLua Compiler NeLuaImGui
Nim Compiler ImGuin, Nimgl_test, Nim_implot
Python Script DearPyGui for 32bit WindowsOS Binary
Ruby Script igRuby_Examples
Zig, C lang. Compiler Dear_Bindings_Build
Zig Compiler ImGuinZ

SDL game tutorial Platfromer


ald

Language [9:1] SDL Project
LuaJIT Script SDL2 LuaJIT-Platformer
Nelua Compiler SDL2 NeLua-Platformer
Nim Compiler SDL3 / SDL2 Nim-Platformer-sdl2/ Nim-Platformer-sdl3
Ruby Script SDL3 Ruby-Platformer
Zig Compiler SDL2 Zig-Platformer

  1. Linux上ではSDL3未対応 ↩︎

  2. MSys2/MinGW系コマンドなくても多分OK(未確認) ↩︎

  3. 順調にいっても2025年末が最速と予測、普通にいけばもっと先かも 😃 ↩︎

  4. メイン処理がスーパーループになっていてGUIの描画とイベント処理を
    スーパーループのなかで実行する。 保持モードとイミディエイト モード ↩︎

  5. build.zigにいろいろ登録する必要がある ↩︎

  6. C++コンパイラがMSVC以外の場合このオプションが必要 ↩︎

  7. Githubページのほうが最新版かも ↩︎

  8. スプリッターはある ↩︎

  9. Alphabectial order ↩︎ ↩︎

posted by Copyright (C) audin All Rights Reserved. at 23:05| Comment(0) | Zig言語 | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。