プログラミング」カテゴリーアーカイブ

Intel SDMの誤植を直してもらった

Intelはコンピューターの頭脳、CPUを作っている会社です。CPUで動作するプログラムを書くためには、プログラムを低レベルな命令の列に変換し、その命令の列を特定の規則に従って変換したバイナリー(機械語)を用意しなければなりません。IntelのCPUが提供する命令や機械語について、Intelが用意しているマニュアルがIntel 64 and IA-32 Architectures Software Developer’s Manual、略してIntel SDMです。

Intel SDMの最新版は「Intel® 64 and IA-32 Architectures Software Developer Manuals」から入手できます。全部合わせて5000ページ以上あります。

Intel SDMも人間が書いているマニュアルなので、時々誤植等があります。容易にそれとわかる誤植なら可愛いものですが、時にはわかりにくいものもあります。

December 2024の版における、CVTSS2SI命令の説明を見てみましょう。これは単精度浮動小数点数(Scalar Single-precision)を符号付き整数(Signed Integer)に変換する命令です。

続きを読む

GHCのSIMDサポートの進捗:整数ベクトルの演算

ブログ等にちょいちょい書いていますが、私はこの数ヶ月ほどGHCのSIMDサポートの改善を進めています。

この3ヶ月間はx86 NCGで整数のSIMD演算を使えるようにするパッチを書いており、数日前にマージされました。一つのマイルストーンだと思うので記事にしておきます。

続きを読む

数学とプログラムはどちらが易しいか/数学とプログラムの違い

最近、某所で「数学とプログラムはどちらが易しいか」という話題が出ました。その場ではあまり上手い返しができなかったので、ブログ記事の題材にして供養します。

もちろん、この質問の答えは人によって違うでしょうし、人によって違うからこそ質問として意味があると言えるでしょう。この記事に書くのは私の見方、私の意見です。

短い答えが欲しい人向けに2択で答えておくと「私にとってはプログラムの方が易しい」となりますが、以下に長い答えを書きます。

続きを読む

TypeScript使いの憂鬱:never型はプロパティを持つか

never型とプロパティアクセス

TypeScriptにはneverという型があります。先日も記事にしましたが、簡単に言うとこれは「値を持たない型」です。

never型は、あらゆる型に対してその部分型として振る舞います。例えば、nevernumber の部分型であることは次のコードでわかります:

続きを読む

never型があると便利か(言語処理系実装者の観点から)

TypeScriptをはじめとするいくつかのプログラミング言語には、never型という型がある。この型は典型的には「制御を返さない関数」の返り値として使われる:

function f(x: string): never {
    console.error(x);
    throw new Error();
}

never型は型システム的には「値を持たない型」「任意の型の部分型」として特徴づけられる。

他のプログラミング言語、例えば私が作っているLunarMLにもnever型があると便利だろうか?

続きを読む

「インタプリタは機械語に翻訳する」という誤解

プログラミング言語のインタプリタの説明で「逐次機械語に翻訳する」という説明を見かけることがある。ググればそういう説明がたくさん出てくるので具体例は割愛する。

しかし、「機械語に翻訳する」という説明は好意的に言えば「誤解を招く言い方」で、率直に言うと「デタラメ」である。

そういう説明を書く人は、自分でインタプリタを書いたことがあるのだろうか?誰かが書いた間違った説明文をそのまま引き写しているのだろうか?

もちろん、世の中にはJITコンパイルする言語処理系もあるが、それはインタプリタのように使えたとしても「コンパイラ」なのではないか。

続きを読む

WSL2へVS CodeからSSH接続する/VS Codeを使いこなしたい

最近はメインのテキストエディターとしてVisual Studio Codeを使っています。しかし、いまいち使いこなせている気がしません。

作業内容としては、最近はGHCのSIMDプリミティブの実装をやっていて、x86-64 WindowsマシンのWSL2で作業することが多いです。しかし、私のメインマシンはMacで、MacでFirefoxを開きつつ、リモートデスクトップでWindowsにつなぎ、その上でターミナルとVS Codeを立ち上げて作業していました。「直接Windowsで作業しろよ」とか言われそうですね。

このやり方では困ったことがあって、Mac miniのネットワークの問題なのか、時々リモートデスクトップが固まります。固まっている間はエディターへの入力もできなくなります。

リモートデスクトップ越しではなく、手元のVS Codeを使えばこの問題を回避できそうです。ネットワーク接続はファイルを開くタイミングと保存するタイミングで繋がっていればいいわけですからね。つまり、MacのVS CodeからWindows機のWSL2へSSH接続するのです。

(昔使っていたEmacsにもSSH越しに作業するモードがありました。)

というわけで、重い腰を上げてVS CodeでSSH越しに作業する方法を調べました。

続きを読む

言語処理系がLLVMに依存することの良し悪し

最近のプログラミング言語処理系を見ていると、バックエンドをLLVMに任せているものがちょいちょいあります。Rust, Swift, Juliaなどは一例に過ぎません。

私もプログラミング言語処理系の開発者として、LLVMを使うコンパイラーを触ったりしています。GHCのLLVMバックエンドを触ったりSML#をAArch64に対応させたりHaskellからLLVMを呼び出してJITコンパイルしたり、です。

LLVMは強力で便利なのですが、依存することのデメリットも感じるようになってきました。

続きを読む

GHCへの私の貢献2024

この記事はHaskell Advent Calendar 2024の24日目の記事です。


私はここ数年、Haskellの主要な処理系であるGHCに趣味で貢献しています。この記事では、今年(2024年)行なった貢献を紹介します。バグ報告のみ(修正は他の人)のものも含みますが、その場合はその旨を書いています。

同様の記事を去年(2023年)も書きました:GHCへの私の貢献2023

GHC 9.12に入ったものは「GHC 9.12の新機能」でも触れています。

こういう記事を書く目的は、一つにはOSSへの貢献の対価として名誉が欲しいというものがあります。そのほかに、自分用の備忘録という目的もあります(あのバグはどのバージョンで修正されたんだっけ、ということがたまにあります)。あとは、単純にGHCの開発状況やホットな話題を皆さんに知って欲しいというのもあります(私の趣味全開なので、非常に偏った視点ではありますが)。

GHCへの貢献方法は去年の記事を読んでください。

続きを読む

コンパイル時定数しか受け付けない引数

普通のプログラミング言語の普通の関数は、実行時に決まる値を受け取ることができます。

# 疑似コード
def foo(x: int, y: int) = print(x + y)

x = parseInt(readLine())
# x の値は実行時に決まる
foo(x + 4, 2 * x) # x + 4 や 2 * x の値も実行時に決まる

これに対して、「コンパイル時に決まる値しか受け付けない引数」を表現できると便利な場面があるのではないかと思うことが最近ありました。

続きを読む