2008年 4月 30日 水曜日 NetBeans 6.1 英語版リリース。日本語メーリングリストから報告されて修正されたバグなど
米国時間の 4/28 (月) に NetBeans 6.1 英語版がリリースされました。日本は運悪く 4/29 (火) の祝日にリリースされることになってしまいましたので、「気づいたらリリースされていた」となった方々がたくさんいるのではないかと思います。
リリース情報のページを訳しましたので、6.1 での新機能や改良された点などについては NetBeans IDE 6.1 リリース情報 を見てください。このページにおかしな点などありましたら、http://ja.netbeans.org/ の nbdiscuss_ja メーリングリスト宛に教えて頂けると嬉しいです。
6.0 移行修正されたバグを検索しようとしたら 4,000 件近くあり、長大なリストになってしまいました。旧来からのバグを直したものもあるでしょうし、6.1 の開発によって発生して修正されたものもあると思います。全体のリストを紹介することに意味はあまり無いような気がしますが、一応リンクを以下に記しておきます。表示にかなり時間がかかるとおもいますので注意してください:
日本語メーリングリストで報告された問題については 13 件が修正されています。動作上の質問やバグではないかと思われる点などありましたら、ぜひ 日本語サイトのメーリングリスト 宛にご連絡ください。
Posted by keiichio
( 4月 30日 2008年, 06:12:25 午後 JST )
Permalink
投稿されたコメント [0]
スレッドローカル記憶領域のアクセスモデルと -xthreadvar コンパイルオプション
前回紹介したスレッドローカル記憶領域 (TLS) について、引き続きそのアクセスモデルを見ていきたいと思います。詳細は Solaris 10 のマニュアル リンカーとライブラリ 第 8 章 スレッド固有領域 に書かれている通りなのですが、ここではその概要を紹介します。
前回の繰り返しになりますが、Linux 版の Sun Studio はスレッドローカル記憶領域の実装を GNU の仕様に基づいて行っています。それは Solaris の仕様とは若干異なります。このエントリでは Solaris 版の Sun Studio のみを想定して、Solaris のスレッドローカル記憶領域の仕様についてのみ説明します。
リンカーで説明されているモデル
Solaris のリンカーの説明では、以下の 4 つのモードが説明されています。使用に当たっての自由度は一番上の GD が最も高く、一番下の LE が最も低いです。最適化の程度 (アクセス速度) は、一番上の GD が最も低く、一番下の LE が最も高いです。
| 自由度 | 最適化 | 名称 | 概略 |
|---|---|---|---|
| 高 ↑ 低 |
低 ↓ 高 |
General Dynamic (GD) | 動的な TLS |
| Local Dynamic (LD) | 局所シンボルの動的な TLS | ||
| Initial Executable (IE) | オフセットが割り当てられた静的な TLS | ||
| Local Executable (LE) | 静的な TLS |
コンパイラで指定できるオプション
Solaris のリンカーでは上記の 4 つのモデルが説明されていますが、コンパイル時に指定できるのは「動的 (GD) を選択するか、静的 (IE) を選択するか」の 2 つのいずれかです。LD と LE はコンパイル時に指定するようにはなっていません。
-xthreadvar=dynamic |
動的 (GD) |
-xthreadvar=no%dynamic |
静的 (IE) |
x86 バックエンドチームの説明によると、LD および LE の選択はコンパイラおよびリンカーのいずれかが、定められた条件に従って行うとのことで、コンパイル時に指定するものではないようです。リンカーのマニュアルで説明されているように、TLS のアクセスモデルはリンカーによって変更される場合があります。GD から LE へ向かって、すなわち動的なものを静的なものへ、より高速なものへと変換します。静的なものを動的なものへ変換することはありません。共有ライブラリでスレッドローカル記憶領域を使う場合には動的にコンパイルしないと実行可能ファイルからアクセスすることはできませんので、そのような場合には動的な TLS モデルを使うようにコンパイルしておく必要があります。
__thread がプログラムコード内で使われているにもかかわらず -xthreadvar による指定がされていない場合には、以下のルールでコンパイラ自身がモデルを選択します:
-KPIC や -xcode=pic13 によって位置独立コードを使う場合というのは共有ライブラリを構築する場合が殆どではないかと思います。ちょっと乱暴な解釈かもしれないですが、スレッドローカル記憶領域のアクセスモデルは共有ライブラリとそれ以外で使い分ける。とも言えそうです。
いずれにせよ、 参考
__thread を使う場合には、__thread が指定された変数のアクセスモデルは 4 つ存在し、どのモデルが使われるのかは、コンパイラおよびリンカーによって決定される。ということになります。
Posted by keiichio
( 4月 23日 2008年, 11:35:57 午前 JST )
Permalink
投稿されたコメント [0]
Sun Studio 12, スレッドローカルな記憶領域を使う
通常マルチスレッドアプリケーションではすべてのスレッドは同じプロセスに属すため、グローバル変数や静的変数はどのスレッドからも同じ記憶領域が参照されることになり、結果として同じ値を使うことになります。スレッド間で同じ値であることが重要なのですが、場合によっては、スレッド毎に異なる値を持った静的変数があったら便利なことがあります。
これを実現するための一つの方法としてスレッドローカル記憶領域 (TLS , Thread Local Storage) とよばれるしくみが多くのコンパイラと実行環境で提供されています。Solaris および Sun Studio コンパイラの両方で、TLS そのものと、それを使うためのしくみが提供されてています。SPARC 版の Solaris 環境ではかなり前に導入済みでした。x86/x64 版 Solaris 環境では Sun Studio 10 (2005/1) から導入され、Linux 版 Sun Studio では Sun Studio 12 (2007/10) から導入されました。
__thread を変数の前につけて宣言することによって、その変数はスレッドローカルな記憶領域に配置され、スレッド固有の値を持たせることができるようになります。以下のソースで静的変数 key_tls 配列は、スレッドに固有の記憶領域に格納され、それぞれのスレッドで異なる値を持たせることができます。
#include <pthread.h>
#include <thread.h>
#include <pstdio.h>
#include <stdlib.h>
#define NUM_THREADS 5
#define NO_KEYS 8
/* この keys_tls はスレッドローカル記憶領域に保持されます */
__thread int keys_tls[NO_KEYS]
statuc void *thread_func(void *arg){
...
使用法は C/C++ のプログラミング時に __thread キーワードを追加するだけなのですが、内部的なアクセス方式はいくつかのタイプに区別されています。このアクセス方式はコンパイラ時に -xhtreadvar フラグで制御することができます。これについては次の機会にふれたいと思っています。
これと似たものに、スレッド固有データを扱うための POSIX スレッド API があります
pthread_setspecific() pthread_getspecific() pthread_key_create()
スレッドローカル記憶領域を使った場合とスレッド固有データを使った場合の単純な比較を試みる C のサンプルプログラムが Sun Studio に付属しています。このブログにもソースコードを添付しておきますので、興味のあるかたはコンパイルして実行してみてください。ソースファイル内に記されているとおり、-mt -xO3 を付けてコンパイルしてください。
$ cc -o tlsbench -mt -xO3 tlsbench.c $ ./tlsbench
このサンプルプログラムは、 SPARC 版の Sun Studio 12 を使っている場合には /opt/SUNWspro/examples/general/tls にインストールされていますが、x86 版、および Linux 版には付属していません。x86 版、Linux 版で試してみる場合には上のリンクからダウンロードして使ってください。
ちょっと話はそれてしまいますが、このプログラムを -fast オプションを付けてコンパイルをすると正しい比較になりません。-fast によって -xdepend が指定されたことと同じになり、-xdepend によるループ解析の結果、プログラムの 27 行目のループはデッドコードと判断され除去されます。、比較するそれぞれの処理のループ構成が異なることになってしまいます。コンパイラの最適化によってコードがどう組み替えられたのかは -g をつけてコンパイルしたオブジェクトファイルをer_src(1) コマンドによって開くことにより確認できます。
$ cc -o tlsbench -g -mt -xO3 -xdepend tlsbench.c $ er_src tlsbench | more
Solaris と GNU では、TLS の仕様が若干異なります。Sun Studio Linux 版の TLS の実装は GNU の仕様に準拠したものになっています。それぞれの詳細については参考ページをみてみてください。
参考
Posted by keiichio
( 4月 14日 2008年, 03:28:37 午後 JST )
Permalink
投稿されたコメント [0]
NetBeans 6.1 リリース候補ビルド (RC1) 英語版が公開されました
NetBeans 6.1 のリリース候補ビルド (RC1) 英語版が公開されました。以後、英語版は新たに発見された深刻な問題以外は修正しませんので、ユーザーの方々からの問題の報告が無ければ、このままリリースされます。通常は必ずいくつかの報告が寄せられるので、それらの修正をした上でリリースとなります。
日本語化 zip ファイルも同時に更新しましたので、RC1 と一緒に使ってください。以下のページから 6.1 RC1 のダウンロードと日本語化 zip のダウンロードができます。
http://ja.netbeans.org/downloads/61/index.html
今現在の日本語化 zip には 6.0.1 の時点の日本語訳しか含まれていませんので、6.1 の新機能などは英語で表示されます。今回のリリースでの比較的大きな新機能は JavaScript 編集支援機能と、PHP 開発環境の提供ですので、これら 2 つ以外の機能では、ほとんどのメッセージは日本語で表示されます。
日本語版の進捗については 片貝さんのブログ にあるとおり、これから翻訳を開始するところです。今のところ以下のスケジュールを予定しています。
RC1 についてのフィードバックや、あるいは現在の NetBeans の日本語化されたユーザーインターフェースで修正して欲しいと思うところなど、何かありましたらぜひ nbdiscuss_ja メーリングリスト宛にコメントをお願いします。メーリングリストの購読などは以下のページを見てみてください。
Posted by keiichio
( 4月 11日 2008年, 05:01:45 午後 JST )
Permalink
投稿されたコメント [0]
NetBeans のチュートリアルを OmegaT を使って日本語に翻訳する
NetBeans のチュートリアル翻訳プロジェクトに参加して、NetBeans プロファイルツールのチュートリアルを 2 つ翻訳してみることにしました。翻訳に当たってフリーの OmegaT という翻訳支援ツールを使うことにしました。この翻訳支援ツールは以下のことをしてくれます:
チュートリアル翻訳プロジェクトでは、OmegaT を使って翻訳するときのために「翻訳メモリ」と呼ばれるファイルも公開していますので、それをダウンロードして使います。「翻訳メモリ」とは翻訳文書が保存されているファイルで、新しいファイルを訳す際の類似の訳文は、この翻訳メモリから探されます。また場合によってまったく同じ英文がメモリ内に見つかることがあります。その時にはその英文に対する日本語訳をそのまま流用できます。
OmegaT のダウンロードとバグ修正
OmegaT のソースを変更してコンパイルしなくてはいけませんでした...
Solaris で使っているので、もしかしたら Windows や Linux では問題ないのかもしれないです。翻訳が終わったら OmegaT プロジェクトに報告しようと思っています。私と同じような修正を行う場合には、コンパイル済みバイナリのダウンロードは不要ですので、最新リリースの 1.7.3_1 のソースファイルのみをダウンロードします:
http://downloads.sourceforge.net/omegat/OmegaT_1.7.3_01_Source.zip
OmegaT の設定ファイルは $HOME/omegat.pref という名前で保存したいようなのですが、ファイルの区切り文字が挿入されていないので、/home/keiichio/omegat.pref としたいところが /home/keiichioomegat.pref となってしまっていて結局保存できません。ファイル名を組み立てるところに File.separator を挿入すれば良いだけの話ですので、修正はごく単純です。以下の 2 つのクラスを修正します:
もしかしたら必要な人がいるかもしれないので (いるのか?)、パッチファイルを添付しておきます。保存ファイル名を私の好みで .omegat で始まるように変更してありますので、そこら辺は適宜変更して使ってください:
修正したらソースファイルを展開したディレクトリで ant を実行すればビルドが完了します。私は手元にあった ant 1.7.0 でビルドしました。
$ ant
起動はビルドされた jar ファイルを java に渡すだけです。ビルドすると dist ディレクトリに起動用の bash スクリプト OmegaT も用意されますが、使い勝手が良くないと思いました。これも後で OmegaT プロジェクトに報告しようかと思っています。
$ java -jar dist/OmegaT.jar
私自身はフォントのアンチエイリアスの指定などがしたかったので、起動用のスクリプトを自分で作って使っています。参考までにスクリプトの内容を貼り付けておきます:
#!/bin/sh
myname=`basename $0`
a=`dirname $0`
bindir=`cd $a; pwd`
default_options="-client -Xss2m -Xms32m -Dawt.useSystemAAFontSettings=on"
java ${default_options} -jar $bindir/src/dist/OmegaT.jar $*
あとは OmegaT の以下のような画面で翻訳を進めていきます
Posted by keiichio
( 4月 02日 2008年, 12:34:22 午後 JST )
Permalink
投稿されたコメント [1]