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, 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のサンプルをベースに各種expmpleプログラムを追加
      これらのImGuinImGuinZプロジェクトと同じ

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

Dear ImGuiのバージョン


GUIプログラムの概略


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

examples


glfw_opengl3_simple

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

glfw_opengl3

glfw_opengl3.lua
画像の表示とWindow内の任意領域をキャプチャした画像を保存できるようにした
glfw_opengl3

glfw_opengl3_implot

glfw_opengl3_implot.lua
ImPlot使用デモ
glfw_opengl3_implot
animaプロジェクト付属の example: implot_sample.lua
alt

glfw_opengl3_jp

glfw_opengl3_jp.lua
日本語表示と日本語入力のデモ

glfw_opengl3_jp

sdl2_opengl3

sdl2_opengl3.lua

SDL2のデモ
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

ダウンロードと実行 download


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

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

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

    luajitImGui-1.91.0.0/examples/glfw_opengl3/glfw_opengl3.exe
    

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

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

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

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

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

    luajitImGui-1.91.0.0/bin/examples/LuaJIT-ImGui/examples/
    

    bin/examples/LuaJIT-ImGui/examples

  • その他のexample

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

    • delaunay_particles.lua
      This sample is attached by anima project. You can execute this sample,

      pwd
      luajitImGui-1.91.0.0
      cd bin/examples
      ../luajit.exe delaunay_particles.lua
      

      delaunay_particles

    • Julia

      luajitImGui-1.91.0.0/bin/examples/juliaSet/julia.bat
      

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

      julia

自前でビルドするメモ


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

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

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

  • CMake, make.exeも必要

  • トップフォルダの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.0.0/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 18.1.8 (Current compiler)
  • (Gcc.exe (Rev2, Built by MSYS2 project) 14.2.0)
  • (Microsoft Visual Studio 2019 C/C++)
  • CMake version 3.30.0-rc3
  • Git version 2.45.2.windows.1
  • Make: GNU Make 4.4.1
  • MSys/MinGW tools
  • Libraries: openMP ? etc

類似 project


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

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

メモ


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

旧版


WindowsOS 64bit 共通版

WindowsOS 32bit/64bit 共通版

  • 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)
    最初の版


  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

はじまり


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

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

動作環境・必要条件


  • 今のところ WindowsOS専用です(Window10以降)

  • Linux Mint 22に対応しました (2024.10) [1]
    (恐らく同系統のUbuntu/DebianファミリもOK (未確認))

  • 現在(2024/10)はZig-0.14.0-dev-nnnn...(nは数値)を使って動作しています

  • MSys2/MinGW の基本コマンド (make, rm, cp, strip ...)を使っています [2]

  • Gitコマンド

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


Zig言語は現在開発中につき言語仕様がリリース毎に変更されて(数ヶ月から半年周期くらいか)
ユーザー側のソースコードとの互換がなくなります
従ってこのページの内容を試す場合、Zig言語のバージョンは これzig-0.14.0-dev-... を使うことを強く推奨します
Windows: zig-windows-x86_64-0.14.0-dev...
Linux: zig-linux-x86_64-0.14.0-dev...

0.14.0-dev... 系列ならどれでも今のところ大丈夫風
試したところzig-0.12.1, zig-0.13.0 もOKでした

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++言語で書かれたイミディエートモード [3]で動作する軽量GUIライブラリ

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

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

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

Dear ImGuiのバージョン


ImGui/CimGui version 1.91.4dock (2024/10)

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


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

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

ビルドと実行


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

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

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

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

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

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

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の具体的なプログラムはオレンジ色の 「:: メイン :: Dear ImGui」の部分に書いていく
    各種イベント処理もこの中で行う
GUIのメイン処理 Dear ImGui

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

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


glfw_opengl3, sdl2_opengl3, sdl3_opengl3

glfw_opengl3 , sdl2_opengl3 , sdl3_opengl3

アイコンフォントを表示

alt

glfw_opengl3_jp

glfw_opengl3_jp
日本語の表示と入力

alt

IconFontViewer

iconFontViewer
Iconフォントビューア、部分ズーム(v1.91.4.1 以降)

alt

glfw_opengl3_image_load

glfw_opengl3_image_load
画像の表示と保存、部分ズーム(v1.91.4.1 以降)

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


My tools version


  • Git version 2.46.0.windows.1
  • Make: GNU Make 4.4.1
  • Zig: 0.14.0-dev.1651+ffd071f55 (zig cc: clang version 19.1.0)
  • SDL2 ver.2.30.3
  • SDL3 2024-08-04

Similar project


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


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

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

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

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

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