💡

RustのようなC言語、comelang2のセルフホストのメモリリークが0となりました。

2024/02/07に公開

宣伝してもいいんですかね。comelang2はautomatically-free-systemを持ち、comelang2はcomelang2でセルフホストしています。そのメモリリークが完全に0となりました。
またメモリリークの検出機能も持っています。
普通にコンパイルするとメモリリークがあれば結果を実行時に出力します。
オプションの-cgをつけるとメモリリークがあった場所のスタックトレースも表示します。

ここから、ちょっと技術的な投稿ですが、実は不正なメモリアクセスを検出するvalgrindにはメモリリークの検出を行う機能にバグがあります。valgrindのメモリリーク検出機能は当てになりません。
version 10.0.0でvalgrindでメモリリークが0となって、もう完成したと思ってましたが
独自のメモリリーク検出システムを作って、それでリークをしていて、まず自分のシステムの不具合を疑いました。
しかし、どうも自分のアルゴリズムに不具合があると思えず、徹底的に調査したところvalgrind
のメモリリーク検出機能にはバグがあることに確信を持ちました。
ちょっと僕には複雑すぎて理由は分かりませんが、calloc,mallocでallocしたメモリがfree
されて再び同じアドレスをcalloc, mallocが返した場合に不具合がある様子です。
comelang2のautomatically-free-systemには同様に同じアドレスがallocされた場合
メモリリークを起こしていたことはわかっていますが、このバグをvalgrindは検出できませんでした。
comelang2 version 11.0.0はfreeされたアドレスが再びallocされた場合の対応を行い
めでたく完全にメモリリーク0とすることができるautomatically-free-systemとなりました。

comelang2はC言語でもあります。いくつかの機能を使えばメモリセーフな言語と言ってもいいと思います。
またunsafeなコードは単なるCコードであり、Cコンパイラとして機能します。
持っている機能はRubyのようなメソッドブロック、generics, inline function, smart pointer
collection, Rubyのような文字列処理ライブラリ,メモリのチェック機能があるpointer dereffrence, nullチェック機能、デフォルト引数、ラベル引数などです。
Rustより強力とは思いませんが、それなり便利だと思います。
パッケージマネージャーは作ってはいますが、まだ自分では使ったことがないので、バグがあるかもしれません。
パッケージマネージャーでは自動的にヘッダーを作る機能も入れてます。
自分でもviクローン、小さなシェルをcomelang2で作って、それを使ってプログラム書いてます。
あとはテキスト処理のインタプリタ、コンソールファイラなども実装してます。
もう完全にautomatically free systemが完成したと思うので良かったら試してみてください。
メモリーリークがある場合、ちゃんと検出する機能も入れています。

https://github.com/ab25cq/comelang2

Discussion