NAKAMURA Minoru の日記 (2016年12月)

先月の日記(2016年11月) 今月の日記(2016年12月)
2002 | 10 | 11 | 12
2003 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2004 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2005 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2006 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2007 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2008 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2009 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2011 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2012 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2013 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2014 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2015 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2016 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2017 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
ホームページ | 最新のコメント50
インデックス: 食べ歩き | Java | プログラム | UNIX | 画像
最新の日記へのリンク | この日記ページをはてなアンテナに追加 この日記ページをはてなブックマークに追加
はてな ダイアリー アンテナ ブックマーク ブログ
Twitter | mixi | Facebook | Google+
slideshare | github | Qiita



12/30 (金)

[Movie] バイオハザード:ザ・ファイナル

チネチッタの無料鑑賞券で『バイオハザード:ザ・ファイナル』(原題: Resident Evil: The Final Chapter)を観る。

これが 7 作目だが、前に観たのは2012年9月15日の 5 作目らしい。 1 作飛ばしたことになる。 どうりで前作の最後のシーンと繋がらなかったのか。


12/21 (水)

[Prog] C コンパイラに変な処理系定義のあるプラットフォーム

Twitter で以下のようなツイートを見た。

C コンパイラは高級アセンブラとして利用されて来たためか、プラットフォーム固有の性質・機能を隠さずに直接的に見せてきた。 そのため他のプログラム言語では当然のように決まっていることが、言語仕様では決められず処理系定義として残っている。

オブジェクトポインタと関数ポインタの大きさが異なる処理系の例

現在のプラットフォームの多くが命令とデータを同一の空間に配置しているため、変数(オブジェクト)を指すポインタと関数を指すポインタは同じサイズになっている。

  • 8086
    • 16 ビットの 8086 プラットフォームはレジスタサイズが 16 ビットだったが、セグメントレジスタ(16 ビット)とオフセットレジスタ(16 ビット)の 2 つでアドレスを指すことにより (セグメント << 4 + オフセットで) 20 ビットのアドレス空間を指すことができた。
    • セグメント(64KB)を越えたアクセスを行う場合、セグメントレジスタを変更してからオフセットを指定することになっていた。 このためポインタは 16×2 で 32 ビット(4バイト)必要であり、これを far ポインタと呼んでいた。
    • 一方、データがセグメントに収まるのであればプログラム中はセグメントを変更しないというメモリモデルもあり、この場合ポインタは 16 ビット(2バイト)だけあればよく、これを near ポインタと呼んでいた。
    • 8086 のセグメントレジスタは複数あり、命令は CS セグメントレジスタで、データは主に DS セグメントレジスタで指定する。 そのため命令とデータのそれぞれ別に単一セグメントのみを使うか複数セグメントを使うかというメモリモデルを選択できる。 そのため MS-DOS 上の C コンパイラは、オブジェクトポインタは far ポインタで関数ポインタは near ポインタとなるモデル、あるいはその逆のモデルを使うことができる、2 種類のポインタのサイズが異なることになる。

C 言語ではないが、C++ 言語のメンバ関数ポインタは一般にオブジェクトポインタの 2 倍である。

関数ポインタが関数の先頭命令のアドレス以外を指している例

一般的なプラットフォームでは、関数ポインタは関数の先頭の命令のアドレスを保持している。 だがそれ以外の情報を指すプラットフォームもある。

  • IA-64
    • IA-64 は関数ポインタが関数ディスクリプタ(function descriptor)という 8+8 バイトのデータ構造へのポインタになっている。 この関数ディスクリプタの前半 8 バイトは、一般のプラットフォーム同様の関数の先頭命令アドレスが入っているが、後半 8 バイトはグローバルポインタに代入する情報を持っている。
    • グローバルポインタは共有ライブラリ毎の位置独立情報の指定に使われる。 例えば foo.so の中に foo() という関数があり、bar.so の中に bar() という関数があるとする。 foo() の中では foo.so ローカルなデータにアクセスし、bar() を呼び出した場合には bar.so にローカルなデータにアクセスしたい場合、グローバルポインタがそれぞれの位置独立情報へのポインタとなってくれる。
  • AIX
    • IA-64 同様に関数ポインタも関数ディスクリプタを指している(2010年4月14日)。

NULL ポインタのビット表現が 0 でない例

C FAQ の5.17 節に複数の例が載っている。 この中で NULL ポインタのビット表現が明らかにゼロでない例としては以下の 2 つがある。

  • Honeywell-Bull のメインフレームの中には、ビットパターン 06000 を(内部の)ヌルポインターとして使っているものもある。
  • CDC 社の Cyber 180 シリーズはリング・セグメント・オフセットからなる 48 ビットのポインターを持っていた。 多くのユーザー(リング11で走る)はヌルポインターとして 0xB00000000000 を使う。 古い CDC の 1 の補数表現のマシンでは全ビット1のワードは、ありとあらゆる種類のデータの特別なフラグとして使われた。 その中には違法アクセスも含む。

2 の補数以外を採用している例

C99 の仕様上、符号付き整数型は以下の表の 3 種類のいずれかになる(ただし詰め物ビットを認めている)。 2 の補数表現を採用したプラットフォームが一般的だが、Wikipedia の Signed number representations にはそれ以外の表現のプラットフォームが紹介されている。

形式採用したプラットフォーム
符号と絶対値(sign and magnitude)IBM 7090
2の補数(two's complemnt)一般的なプラットフォーム全て
1の補数(one's complemnt)PDP-1、CDC 160 シリーズ、CDC 3000 シリーズ、CDC 6000 シリーズ、UNIVAC 1100 シリーズ、LINC

確認はしていないが、2の補数表現以外を採用したプラットフォーム上に C コンパイラがあれば該当する。

CHAR_BIT が 8 より大きい例

一般的なプラットフォームでは 1 バイトが 8 ビットであり、CHAR_BIT は 8 に定義されている。 しかし歴史的な経緯から 1 バイトが 8 ビットでない計算機がある。

  • NEC のメインフレーム ACOS-6 が 1 バイト = 9 ビットになっている。
  • DSP(Digital Signal Processor) はメモリアクセス単位が 16/24/32/48 ビットだが、そのような DSP 向け C コンパイラは CHAR_BITS が 8 以外になっているものがある。一例を挙げると TEXAS INSTRUMENT 製 TMS320C54 は CHAR_BIT == 16 だった。
  • PDP-10 は複雑な事情があり CHAR_BIT がうまく定義できない(C++ FAQ)

なお C99 は CHAR_BITS を 8 以上と定めたので、7 以下になることはない。

2 のべき乗サイズの基本整数型が欠けている例

C99 は整数型について以下のような規約を決めている。

  • char 型は 8 ビット以上
  • int 型は 16 ビット以上
  • long int 型は 32 ビット以上
  • long long int 型は 64 ビット以上
  • sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int) <= sizeof(long long int)

一方、32 ビットプラットフォームの C コンパイラなら 1/2/4 バイトの整数型が、64 ビットプラットフォームの C コンパイラなら 1/2/4/8 バイトの整数型をサポートするのが自然である。 そのため 64 ビットなら 1 バイトは char 型、2 バイトは short int 型、4 バイトは int 型、8 バイトは long int 型または long long int 型と割り当てるのが多い。

しかし 64 ビット CPU 黎明期の C コンパイラの中に int 型を 64 ビット(8 バイト)にした ILP64 や SILP64 を導入したものがあった。 ILP64 や SILP64 では 32 ビット(4バイト)となる基本整数型が欠けることになる。 SILP64 では short 型も 64 ビット(8 バイト)なので 16 ビット(2バイト)の基本整数型まで欠ける。


12/19 (月)

[MyWeb][PostgreSQL] PostgreSQL Advent Calendar 2016 に書いたよ

PostgreSQL Advent Calendar 2016 の 19 日目の記事として、「PostgreSQL で独自インデックスを作成する」を書いた、と言いたいが書きかけ。 随時更新してゆこう。


12/17 (土)

[Movie] ローグ・ワン

チネチッタで『ローグ・ワン』(原題: Rouge One)を観たが正直前半は辛い。 睡魔に襲われてしまった。


12/11 (日)

[時事] インスタンブールのサッカースタジアムで連続爆発

トルコ・インスタンスブールのサッカースタジアムで 2 件の爆弾攻撃があり、38 人が死亡し、166 人が負傷。


12/8 (木)

[Android] AQUOS PHONE ZETA SH-01F

3年以上前に購入した AQUOS PHONE ZETA SH-01F だがバッテリーが消耗したのか持ちが非常に悪くなった。 100% の充電状態から 4〜5 時間で 50% まで低下するが、50% からは 0% までは 1 時間かからない。 SH-01F はバッテリーが内蔵で取り外せないタイプなので、バッテリーの交換をすると 7,700 円とられる。

そこでもともと USB コネクタがガタガタしていたこともあり、ケータイ補償サービスを使い新品に交換してもらう。 新品交換料金はバッテリー交換よりも安い 5,400円。 ドコモポイントや d ポイントがあったので、実質的な支払額は 1,000 円ぐらい。 もっともケータイ補償は月額 380 円づつ 3 年かけてきたので 13,680 円とられていたが。

ネットで申し込むと交換機を宅配される。

追記:12/10

交換機が来た。

ゴッホとゴーギャン@東京都美術館

東京都美術館で「ゴッホとゴーギャン展」(公式)を観る。

フィンセント・ファン・ゴッホとポール・ゴーギャンは 1888 年の南仏で 2ヶ月間の共同生活を送ったという。 それに関連したゴッホとゴーギャンの作品展なのだが、期間が短く共同生活中の作品は少なくて、共同生活前と共同生活後の作品がほとんどだ。

壁面には共同生活に向けたあるいは共同生活中のゴッホとゴーギャンが他の人に宛てた手紙の引用が書かれているのだが、ゴッホとゴーギャンの温度差が見られて悲しい。 元々、ゴッホが計画して熱心にゴーギャンを招待したようだが、ゴーギャンは請われて来てものの早々に破綻して去っていたという感じだ。 共同生活後の後、しばらくしてゴッホは自殺してしまうけど、それに対するゴーギャンの反応は淡白だ。 晩年にゴーギャンが異国の地から向日葵の種を取り寄せてそれを育てて向日葵の絵を描いたのは、ゴッホを回想して無理に関連付けているけど、描かれた絵からそういう印象を受けない。

キーボードをもう一枚購入

11月5日に富士通コンポーネント製のテンキーレスキーボードを購入したが、秋葉原まで出てきので同じソフマップでもう1枚購入した。 会社用のキーボードにする。


12/6 (火)

[Android] Xperia Z3 Tablet Compact のファームウェアアップデートをしたけど

Xperia Z3 Tablet Compact のファームウェアをアップデートしたが、外付け SDXC カードのマウントパスがまた変わった。 バージョンアップデートの度にマウントパスが変わっているような気がするよ。

Kinoppy が SDX カードのマウントパスの変更に追従できず、データを再ダウンロードし直すはめに陥る。 他の電子書籍アプリは自動・手動でマウントパスの変更ができた。


12/4 (日)

[MyWeb][PostgreSQL] PostgreSQL Advent Calendar 2016 に書いたよ

PostgreSQL Advent Calendar 2016 の 4 日目の記事として、「PostgreSQL で集合を返すユーザー定義関数の書き方」を書いたよ。

時間ができたら3月9日の日記に書いた、出力レコード不定の集合を返すユーザー定義関数の書き方の情報とかも追加してゆくよ。


先月の日記(2016年11月) 今月の日記(2016年12月)
2002 | 10 | 11 | 12
2003 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2004 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2005 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2006 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2007 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2008 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2009 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2011 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2012 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2013 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2014 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2015 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2016 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2017 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
ホームページ | 最新のコメント50
インデックス: 食べ歩き | Java | プログラム | UNIX | 画像
最新の日記へのリンク | この日記ページをはてなアンテナに追加 この日記ページをはてなブックマークに追加
はてな ダイアリー アンテナ ブックマーク ブログ
Twitter | mixi | Facebook | Google+
slideshare | github | Qiita


Written by NAKAMURA Minoru, Email: nminoru atmark nminoru dot jp, Twitter:@nminoru_jp