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

C++ から OpenCL を使う(その0):準備

21世紀を生きる者として、並列コンピューティング技術の一つや二つは扱えなければならない。

この間書いた Haskell で並列評価する記事は CPU のマルチコアを活用するものだったが、今度は CPU 以外のデバイス(GPU を念頭に置く)を活用できる技術を使いたい。いわゆる GPGPU をやりたい。(技術に入門するのが目的であって、計算能力を活かして特にこれがしたいという訳ではない。そもそも筆者の手持ちの GPU の計算能力などたかが知れているが……)

N 社の GPU を前提にするなら CUDA という選択肢もあるだろうが、ここでは移植性を重視して OpenCL を試すことにする。(というか、 Mac ユーザー的には CUDA という選択肢は存在しないも同然)

続きを読む

雰囲気で並列プログラミングをやってみる

Haskell での並列プログラミングをマスターしたい、とは言わないが、「全然わからない、俺たちは雰囲気で並列プログラミングをやっている」程度のことは言えるようになりたい。

今回は「データ構造の各要素を並列で評価する」ことを目指す。以下の内容は筆者がいい加減な知識で書いているので、そういうつもりでテキトーに読んでほしい。 続きを読む

C言語のワイド文字入出力

C言語にはワイド文字で入出力を行う関数が用意されている。

※ワイド文字:C言語のワイド文字 (wchar_t) とは、不憫な子である。Windows だと Unicode のコードポイント1個すら表せない16ビットだったり、Unix だとそもそも使われている気配があまりなかったり(もっぱら UTF-8 か UTF-16 が使われている印象がある)する。2010年代の後半にもなってワイド文字なんぞを真面目に扱うブログというのは時代錯誤も甚だしい。

ワイド文字で入出力と言っても、対象がファイルの場合は最終的にはバイト列を読み書きしているわけで、どこかの段階でバイト列とワイド文字列との変換が行われているはずである。この変換方法はどうやって決まっているのか。あるいは、ワイド文字の入出力関数とバイト列 (char) の入出力関数を混在させるとどうなるのか。

また、Visual C++ や glibc の場合は fopen の第2引数に ,ccs=UTF-8 みたいな文字列を設定できるという謎の仕様がある。これを指定した場合は何が UTF-8 になるのか。

こういった細かい仕様は、ワイド文字自体がオワコンなこともあり、あまり知られていないように思う。少なくとも筆者は知らなかった。というわけで、

  • ワイド文字による入出力について、C言語の規格ではどう定められているか
  • Visual C++ のランタイムライブラリ (MSVCRT) ではどう実装されているか
  • Linux 等で使われている glibc ではどう実装されているか
  • macOS 等で使われている BSD libc ではどう実装されているか

の4点について調べた。(ただし、 MSVCRT については別の記事に分割する) 続きを読む

Lua スクリプトと Windows のバッチファイルを同じファイルに同居させる

スクリプト言語で書いたプログラムをシェルコマンドとして実行したい時、 Unix の場合は shebang と呼ばれる行を書けば良い。

しかし、 Windows のコマンドインタープリター (cmd.exe) の場合はそういう風にはいかない。代わりに、バッチファイル (.bat) なり、バイナリの実行ファイル (.exe) を用意して、その中でスクリプト言語のインタープリターを呼び出す、という手法を使うことになる。

この場合、配布するファイルがバッチファイルと実行したいスクリプトファイルの2つになり、単独の実行ファイルを配布する場合に比べて2倍面倒である。1つのファイルを、バッチファイルとしてもスクリプトファイルとしても実行できれば良いのではないか。(このような、複数のプログラミング言語で解釈できるプログラムを polyglot と呼ぶことがあるようだ)

今回、対象とするスクリプト言語は Lua である。Lua スクリプトとバッチファイルの双方として実行可能なファイルを作りたい。 続きを読む

Xcode/Cocoaで始めるモダンOpenGL

モダンなOpenGLを勉強したいと思い立ったので、「OpenGL 4.0 シェーディング言語 実例で覚えるGLSLプログラミング」(原著は OpenGL 4 Shading Language Cookbook)という本で少しずつ勉強している。

OpenGL自体はグラフィックスに関するAPIなので、アプリケーションやウインドウの初期化、画像の読み込み等は各プラットフォームで使えるGUIツールキットの力を借りることになる。この本のサンプルコードではQt(キュート)を使っているが、GitHubにあるサンプルコードではGLFWを使っている。

筆者としては、Cocoaで書いているMac向けのアプリケーションでOpenGLを使いたいという目標があるため、サンプルコードもCocoaアプリケーションに組み込む形で試すことにした。 続きを読む

TypeScript における let/const と control flow based type analysis

前にこのブログの記事に書いたように、TypeScript 1.4以降(ターゲットがES5の場合は1.5以降)では let/const による変数宣言ができるようになった。let は書き換え可能な変数で、const は書き換え不可能な変数だ。let 宣言と const 宣言の登場によって、var 宣言は用済みになったと言っていいだろう。

let も const もスコープに関する規則は同じなので、書き換えない変数に対して let と const のどちらを使っても違いはないはず。そう思って、個人的に書いているコードでは文字数を重視して常に let の方を使っていた。

しかし、 TypeScript 2.0 で導入された control flow based type analysis により、「書き換えない変数に対して let と const のどちらを使っても違いはない」とは言ってられなくなった。 続きを読む

Haskell (GHC) の型レベル自然数とリフレクションを試してみる

【2020年4月20日追記】GHCの型レベル自然数については、より網羅的な記事を書いた。型レベル自然数についてより詳しく知りたい方は、こちらの記事も参照いただきたい:GHCの型レベル自然数を理解する【追記終わり】

最近のGHCでは、自然数をパラメーターとするデータ型を定義できる。固定長リストの長さを型に持たせるとか、行列の大きさを型に持たせるとか、そういうことができる。あるいは、自然数 m に対して Z/mZ を表す型を作ることもできる。m を素数とすればこれは有限体となる。

実際に、型レベル自然数を使って Z/mZ に相当する型を作ってみよう。(名前は FiniteField とした) 続きを読む