プログラミング

Denoでcommitizen的なツールを作った

Denoでcommitizen互換のツールを作りました。 github.com commitizenはGitのコミットメッセージをいい感じにするためのツールです。 commitizenのようなツールには公式である commitizen/cz-cli の他に、streamich/git-cz や Go製の lintingzhen/commitizen-…

テンプレートから新規ファイルを作成するCLIツール zouch を作った

例えば新しいプロジェクトを作成するとき、何かと新しいファイルを作成する必要があります。 README.md, LICENSE, .editorconfig, あるいはC/C++ならCMakeLists.txtやmain.cppなどをプロジェクトに含める必要があるでしょうが、 そのうちいくつかは毎度似た…

x64セルフホスティングCコンパイラを書いた

前回: ryooooooga.hateblo.jp はじめに セルフホスト(自分自身をビルド)できるCコンパイラmoccを書きました。 github.com 前回はバックエンドをLLVMに頼っていたため、今回はx86_64向けのアセンブリを吐くようにしました。 基本的な設計はほぼ前回と同じです…

セルフホスティングCコンパイラを書いた

セルフホスト(自分自身をビルド)できるCコンパイラnoccを書きました。 github.com はじめに 去年の夏あたりからCコンパイラを書くのが流行っていたのでやってみました。 例によって@rui314さんの8cc、9ccと低レイヤを知りたい人のためのCコンパイラ作成入門…

JITコンパイル時の関数呼び出しの扱い方

x86_64での関数呼び出し x86_64(以下x64)ではcall命令の呼び出し関数の指定を相対アドレスで行うため、JITコンパイルをする際はそのアドレスの取り扱いに苦労します。 #include <stdio.h> #include <string.h> #include <sys/mman.h> int main(void) { const char code[] = { /* * int f(voi</sys/mman.h></string.h></stdio.h>…

structured bindings(構造化束縛)を自作クラスで行えるようにする

はじめに structured bindings (構造化束縛) をstd::pair<>やstd::tuple<>以外の自作のクラスに対して適用するための方法をコード例込みで解説している日本語の記事が見つからなかったのでメモを兼ねて残しておきます。 結論 std::tuple_size<T>を特殊化する st</t>…

MSVCでempty base optimizationの効かないパターンと対策

問題 2つ以上の空クラスを継承するようなクラスについて、MSVCで empty base optimization (EBO) が期待した通りに働かず、余分な領域が消費される。 struct Empty1 {}; struct Empty2 {}; // 1つの空クラスを基底に持つ struct Derived1 : Empty1 { int i; …

最近プリプロセス時処理が楽しい

はじめに Boost.Preprocessorの実装を調べているうちに色々出来ることが分かって楽しくなってきた。基本的なことから曲芸的なことまで適当にパターンをメモっておきます。 シンボルの結合 #define PP_CAT(a, b) PP_CAT_I(a, b) #define PP_CAT_I(a, b) a ## …

数式微分器の作成 (2) 式木の最適化

前回の記事の続きです。 数式微分器の作成 と D言語での木走査 - 茅の下 前回の内容 前回の記事で数式微分器を作成したが、出力が繁雑になった。 結論 今回はそれを解消するために式木に対してより強力な最適化を掛けるようにした結果、出力がこましになった…

数式微分器の作成 と D言語での木走査

モチベーション 無性に微分がしたくなった。 結論 出力が頭悪い。 D言語と振り分け式の外部訪問器は相性がいい。 特に数学的におもしろい話はありません。 はじめに 偏導関数値を求める方法には、数値微分 や (トップダウン/ボトムアップ)型自動微分などがあ…

C++17 optionalの実装について

C++17で、optionalが標準ライブラリに入ることが決定した。そして、C++17 optionalはconstexprに対応している。以前からその実装について気になっていたので調べたついでに少しまとめる。 optionalとは 無効値を取ることのできる型である。C++17 optionalはB…