« July 2007 | Main | September 2007 »

2007.08.31

今日のいまさら


・ZONEのMIYUが歌った栄冠は君にに感動する。そういやZONEのCDって全部買っていないんだな。多分、CCCDの登場でCD買わなくなったんだと思う。

・C++ iterator
for(char* p=&v[0];p<&v[256];p++){...}、for(node* p=first->next;p!=first;p=p->next){...}のような書き方に比べて、iteratorを使うとfor分の小難しい条件を、v.begin(),v.end()で統一できるのか!
http://www.jah.ne.jp/~naoyuki/Writings/STL.htmlから

・C++リンク集
http://d.hatena.ne.jp/oskimura/searchdiary?word=%2a%5bc%2b%2b%5d
CppUnitも勉強しようかな

・Stallman
http://www.rubyist.net/~matz/20070820.html 普通にかっこいいと思う。

・やりたいこと爆発中
SICP、ロジックプログラミング → FPGAネタへ続く
C++ eff stl
Perl → FPGAネタへ続く

頑張ろう

| | Comments (0) | TrackBack (0)

今日の日記

ときどきの雑記帖 リターンズさんから
mainの補足ありがとうざいます。implementationも定義あるのか。勉強になりました。

> 黎明日記 - 「格差を乗り越える」という発想自体がない
> それなりに使える言語処理系が書けて初めてCプログラマと自称してよいように思う。
この基準だと僕は瞬殺される。

・久しぶりに家のクオータスを立ち上げようとしたら、ライセンス切れている。AirHで申請するのつらいんだよな。
 
・ドッグイヤー
 別の業界の方のお話を聞ける機会があった。ある研究が商品化されるまでの時間は約10年。だから自分がしている事が、商品になるかどうかは10年後までわからない。寿退社などをのぞくと、離職率はほとんど0らしい。そういう世界もあるんだ。

・会社で基板と部品の整理。実装済み、生基板と振り分け。
 実、実、実、生、生、実、生、
 モバ校かよ!

| | Comments (0) | TrackBack (0)

2007.08.30

n bitカウンターのトグル率を求める

久しぶりに仕事ネタです。
FPGAのピンに、8bitのカウンターの出力を割り当てた場合のピンのトグル率が欲しくなった。せっかくだから8bitだけじゃなくて、16bitとか、32 bitとかも欲しい。

ルールを説明すると、1bitのカウンターだと、0→1→0→1に変化するからトグル率は100%。2bitのカウンターだと、最下位bitが常に変化するからトグル率が100%、2ビット目は、0→0→1→1→0の順に変化するからトグル率50%。全体として、(100 + 50) / 2で75%がトグル率。カウンターって再帰的に定義されていると思いながら、Schemeで書いてみた。

(define calc-toggle-rate-counter
  (lambda (bit_width)
    (/ (sum-of-toggle bit_width) bit_width)))


(define sum-of-toggle
  (lambda (bit_width)
    (let ((toggle_rate (/ 1 bit_width)))
      (if (= bit_width 1)
        toggle_rate
        (+ toggle_rate (sum-of-toggle (- bit_width 1)))))))

(calc-toggle-rate-counter 8)

gosh> 0.3397321428571428

なので、だいたい34%のトグル率。

嫌なところ:あるbitのトグル率は、常に下位bitの半分なのに、(/ 1 bit_width)と毎回計算しているのが頭悪い。(0.625 0.125 0.25 0.5 1)という各ピンのトグル率のlistを作って、平均取った方が一般的に使い回しができる。全ピントグルなら、(1.0 1.0 1.0 1.0 1.0 ・・・)みたいに表現できてうれしい。

良い所:gauche+Meadowで適当に書いてすぐ動く。頭の良いやり方を考える前に、適当に書いたら動くのはうれしい。Cで書くと、常に上を押さえないといけない気がするけど、shcemeだとむしろ下を押さえているような感じ。for(i=0;i

初めて書いたschemeの実用プログラムでした。小さな一歩。

| | Comments (0) | TrackBack (0)

SICP ambとロジックプログラミング

ambの方は、独習 Scheme 三週間を見て問題を解く。動く仕組みはよく分からない。ambと書くところを何回もambaと書いてしまった。

ロジックプログラミングは難しい。この辺りから日本語の情報ががくっと減っている。M.HiroiさんのCommon Lisp 入門でも結構ボリュームがある。Paul Grahamは、ANSI Common Lispでマクロ使って数ページで説明終えていた気がする。この章の何が嫌かっていうと、謎の俺様処理系で処理しないといけないところと、もうちょっと説明する→手を動かすのループを小さくして欲しい。なんとか、M.Hiroiさんのページで乗り切ろう。

| | Comments (0) | TrackBack (0)

2007.08.28

SICP 4章 関数の呼び出し

俺様処理系で、carとcdrは動くようになった。中身はgoshに、carしてね、cdrしてねって言っているだけ。
Lispの上で動くLisp処理系って、このレベルだとUNIXのシェルみたい。下の処理系に命令を渡して、その結果をあたかも自分が実行したかのように表示する。
ちょっとだけ自分で処理してみたり、パラメータを展開してみたり。最初はこんなものかも。

次は、(lambda (x) x)のように引数をそのまま返す関数を作ってみる。
make-procedureが、こんな感じ

(define (make-procedure parameters body env)
  (list 'procedure paramters body env))

手続きを定義したら、'procedureのtagをつけた後、定義した時のenvironmentをその手続きにくっつけている!実行時じゃなくて手続き生成時というのが驚き。Lispってこんな動きするのか。extend_environmentで、実引数を仮引数に束縛。こうすることで、手続き内部に仮引数と同じシンボルがあれば実引数に変換され、無ければ関数の外に値を探しにいくのか。むう。

次は、(define (echo x) (x)) のrambda シンタックスシュガーに挑戦。

(define (make-lambda parameters body)
(cons 'lambda (cons parameters body)))

いったんevalして、echo xを(lambda (x) x)にそのまま置き換えている。戻ってきたもの?を、再びeval。局所的に2パスなのね。しかし、僕は今何をしているんだろう。もっというと、make-lambdaって何を返しているんだ。文字列じゃないし、特別な型を返しているわけでもないし、Listとしか言えない物を返している気がする。正直、気持ち悪い。触手がうねうねするような、本能的な気持ち悪さ。Lispって泥んことかそんな無邪気な物じゃなくて、タコみたいに全体的にぐねぐねしていて、触手は触手で独自にうねうねしているような感じ。ふと下をみると、タコの下にはもっと巨大なタコが、そのしたにはもっともっと・・・・。ルルイエ!今、軽くSANチェック入った。

| | Comments (0) | TrackBack (0)

2007.08.27

今日の日記

Web2.0殺人事件 読みました。これはひどい。

ゼロの使い魔 7、8 読みました。 シエスタはもっとおしとやかになってほしい。8巻は回想と妄想シーンを抜くとあんまり内容がない。

驚き最大の法則はあろはさんが先に宣言している。バッドノウハウラブ。

仕事で久しぶりに電子工作。鰐口クリップを頑張って再利用する。早くお金持ちになって、こんな貧乏くさい作業から解放されたい。

前の上司は熱収縮チューブを「お湯かけると縮むから」って教えてくれた。給湯室で湯を沸かしていたら、何やってんの?ってさんざんバカにされた。騙された。熱収縮チューブと間違えて耐熱チューブを使うと、何をやっているのか分からなくなる。

陰気な男でいいですか? から
> 10数年ぶりに畠田理恵の PREMIER を聴く。懐かしい。しかし自分にとっての島田奈美の大きさを痛感するな。
島田奈美は良い。ゆうゆの次くらいには良いな。

オブジェクト指向、非常に参考になった。
http://kmaebashi.com/programmer/object/naze.html

貧乏ネタ:学生時代は部屋にクーラーが無かったので、古本屋で本を買った後、山手線にのって本を読んでいました。

| | Comments (0) | TrackBack (0)

main関数のプロトタイプ宣言

http://www.kt.rim.or.jp/~kbk/zakkicho/07/zakkicho0708c.html
http://d.hatena.ne.jp/RiSK/20070825

気になるので調べてみました。C99の規格書はここからダウンロード。
http://www.open-std.org/jtc1/sc22/wg14/www/standards

ISO/IEC 9899:TC2から
大前提の話。

5.1.2.1 Freestanding environment
In a freestanding environment (in which C program execution may take place without any
benefit of an operating system), the name and type of the function called at program
startup are implementation-defined. Any library facilities available to a freestanding
program, other than the minimal set required by clause 4, are implementation-defined.

A hosted environment need not be provided, but shall conform to the following
specifications if present.


freestanding environment(例えば組み込みの世界)なら、最初に呼ばれる関数は実装依存。この場合、main()は普通の関数だからプロトタイプ宣言してもOK。次に、ここから先は、hosted environmentについてルールですよと。freestanding environmentは、Googleによると自立環境って訳が付いていた。昔はスタンドアローン環境って呼んでいたような気もするが、僕の記憶違いかな。

そして、main関数の説明の箇所。

5.1.2.2.1 Program startup
The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:

実装環境(でいいのかな?)はmainのプロトタイプを宣言しませんとは書いてあるけど、明確に禁止はしていなそう。

ときどきの雑記帖 リターンズさんに教えていただいた、FAQでは、「 main は、 int 型の関数であり、プロトタイプ宣言しない約束になっています。」と書いてある。問題は宣言の主語だけど、上の規格書が根拠なら「The implementationはmainをプロトタイプ宣言しない」という意味かな。規格書見る限り、特に禁止はしていなそうなんだけど、複数の方から「mainはプロトタイプ宣言しちゃ駄目じゃないの?」って意見が出るって事は、実装上の問題 or 歴史的な何かがありそうな気がします。

ついでに、C++はルールが違うらしい。http://gusmachine.blog49.fc2.com/blog-entry-213.html


以下、僕的結論
・組み込み以外ではmain関数のプロトタイプ宣言は止めとこう

# C言語ならこうやって規格書見ようって気になるのに、Verilogは全然見ようともしないのはなんでだろう・・・

| | Comments (1) | TrackBack (0)

2007.08.26

SICP 4章から再開

(define the-global-environment (setup-environment))からリハビリをかねて追ってみる。

setup-environmentは、initial-envにextend-environmentの戻り値を設定した後、define-variable!でtrueとfalseを設定して、initial-envを返す。

extend-environmentを呼ぶ前に、primitive-procedure-names、primitive-procedure-objects、the-empty-emvironmentを評価する。

primitive-procedure-names が(car cdr cons null?)で、primitive-procedure-objectsは、こんな感じのテーブル。primitive-procedureを定義している所で、すでにgoshのcarとか、cdrを呼ぶように設定しているのか。the-empty-emvironmentはただの()。

exstend-envrinmentは、手続き名のリストと、手続きの対象のリストを受け取って、make-frameの戻り値を、base-env(最初はthe-empty-emvironment)とconsする。make-frameはただのconsだからtrueとfalseを設定する前のinitial-envはこんな感じ。

define-variable!は、予想以上に複雑。まずは、first-frameを取得して、frame-valuables(今はprimitive-procedure-names)と、frame-values(今はprimitive-procedure-objects)とを引数にscanをかける。scanの中で、変数の名前が一致したら、新しい変数で値を上書き。見つからなかったら、add-binding-to-frame!で、変数の束縛と。trueとfalseを定義した後は、the-global-environmentはこんな感じ

手加減してもらうと、Lispもだいぶ追えるようになっている。

| | Comments (0) | TrackBack (0)

2007.08.24

C言語のプロトタイプ宣言

shinhさんの所から思いだしたこと。

いろいろと関数があって、最後にmain()があるのが嫌じゃないですか?あと、ヘッダーを公開用とそれ以外で2種類用意するのが面倒な時は、普通に.cにプロトタイプ宣言します。


誰も同意してくれない僕の書き方

#include < stdio.h >

int main(void);

int main(void)
{
printf("Hello, world\n");
return 0;
}

main関数もプロトタイプ宣言してあげてください。

| | Comments (0) | TrackBack (0)

SICP 4章

というわけで再開。電車の中でまったりと読む。

ひげぽんさんの関数型言語を学ぼうはネタバレにならないように、自分の進捗に合わせて読んでいます。この本は手を動かして発見することが多い。

関数型言語の勉強にSICPを読もう - (53) 4章 - 超言語的抽象(216ページ) C++でSchemeインタプリタを作ろう1 ← いまここ

The little schemerThe Seasoned Schemerの時がそうでしたが、どっちの処理系が動いているのか分からない。例えば、eval、if、pair?、variable?とかが、goshに渡されているのか、今書いた俺様処理系で処理されているのか、昔書いたutil.scmとかで定義されているのか、なにがなんやらという感じ。The little schemerは、解説らしい解説がほとんど無いから余計に悩んだ。前回はもう一回SICPでやるのが分かっていたから、それっぽく動いた時点ですっとばしたけど今回はどうしよう。

・IF-Nyo, EVAL-Oreみたいに、俺言語用のキーワードや処理するところをわかりやすくする。
・ひげぽんさんみたいに別の言語で挑戦する。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
妄想タイム
・C++
・Perl
・Common Lisp

C++とPerlは30代前半でマスターしたかった言語。ハッカーと画家を読んでCommon Lispが増えた。SyetemCも仕事の関係上、勉強している。SystemCはC++で作ったDSLだから、C++の勉強に含めちゃおう。この3つが自由に使いわけられたら、バランスの良いプログラマーになれると思っているんだけど、そのレベルになるには40代になりそうだ。40代になる頃にはプログラミングは趣味になっているに違いない。

ハカーの香りがしつつ、実践的なそんな言語が好き。実は3つともよく分かってないけど。バッドノウハウラブなので、そういうのが多そうな言語が好き。なんでこれだけの記述でこんな事ができるんだ、とか、なんでここでこんな動きをするんだとか。そこにそれなりの理由があれば、理解したとき凄く楽しい。驚き最大の法則。

単に分厚い本が沢山読める言語が好きなだけな気もする。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C++とBoostで突撃するのも楽しそうだけど、これを機にPerlの勉強を開始するのも本末転倒で良いなぁ。いろんな物が全部グローバルならC++でもできそうな気がする。この辺りが、どの言語を使っても難しい気がする。でも、難しいところは他にあるかもしれない。

まったりいこう。

| | Comments (0) | TrackBack (0)

アマゾンのレシートから金額を取り除く方法

アマゾンで実家に本を送った時、嫁にレシートを見られて「なんちゅう高い本、買ってるの!」と怒られた人向けのwifehack。

アマゾンで何か買うときは、嫁か娘へのプレゼントも一緒に買って、ギフト包装をしろ!それだけで、金額を印刷しないオプションが使える。

注意点は、結局本の裏側の値段を見られたら同じなので、ギフトに夢中になっている間に本を隠す。本を隠すには本棚に。今買った本を本棚に適当に入れてしまえば、嫁にはどの本を買ったかもうわからない。たまに自分もわからなくなる。

ちなみに、我が家では、アマゾンから箱がくると、娘と一緒に「なにかなー、なにかなー」と開ける事にしている。ちょっとしたイベントにすることで、娘もアマゾンの箱を喜んでくれる。そして娘が大きくなったとき、「ねぇ、私はどうやって生まれたん?」て聞いたときに「Amazonから送られてきた。1-Clickやったで」と言うのがパパのささやかな夢。娘が悪いことをしたら「そんな言うこと聞かへん子は、Amazonに返品するで!」と言って怒ろう。

| | Comments (0) | TrackBack (0)

verilog_cv 0.3 できた

最新版はここ
リクエストがあったポートの入出力順でのソート追加。
投げやりなマニュアル追加。

この夏でやりたいことの結果報告

SICP 3章まで終了
GUIアプリ smoking_xst verilog_cv 2つできた。
ESL D&V 終了 ついでに、SystemCの本も更新
あとはVerilogネタで書きたい物が一つ。→ 駄目でした
並列化の本 Transputer occamによる並列プログラミング入門 並列論理型言語GHCとその応用読めた。

というわけで、C++の勉強に予想以上に手こずった(Eff C++とAcc C++を読み直した)事もあって、Verilogネタが作れなかったのが残念。この時点では、再帰の計算をするCソースから、スタックをそのままエミュレートするVerilogを書き、パラレルに最適化したかったんだけど、ちょっと時間が取れなかった。そうこうしているうちに、末尾再帰が盛り上がって、もう少し自分で整理してから書くことにした。CPSをハードウェアで実現とか。

家族でディズニーオンアイスも行ったし、娘とプールで遊んだし、バルサンもしたし、僕的には95点。

9月から忙しくなるから、仕事モードのスイッチを入れよう。

| | Comments (0) | TrackBack (0)

2007.08.22

今日の日記 ★★★

はてなの★がうらやましいので自分でつけた。

・どーでもよい発見
Lisp in Small Piecesが省略するとLISPになる!

・TVをオシロスコープに
日曜デジタルさんから
http://members.chello.nl/r.dekker49/uscope/uscope_e.html
すげー。

AO diaryさんから
http://www.opensparc.net/main-content/main/opensparc-t1-version-1.5-released.html
FPGAがサポートされるって凄い。EDK買うか。

OpenSparc T1って、XC4VFX60程度で入るんだったらV5だと結構普通に使えるかも。
Xilinx標準になるうれしさってのは、あれだ。Cコンパイラがwindows環境で動くこと。
single thread ってのがわからないけど、もともとマルチプロセッサだったのが、シングルプロセッサで実装したってこと?
Verilog 2.0的には、ここからUltra Sparcのエッセンスだけを抜き出した32bitのmini sparcとか欲しいな。
僕の妄想、どこまでも広がれ!

| | Comments (0) | TrackBack (0)

女の子で識別した

みんな仲良しのつもりさんが、ときどきFPGAネタがあってヲチしていたのですが、更新が止まって残念。とおもったら同じ女の子が!これで、全然別人って事はないよね。

合格おめでとうございます。

USB Snoopyってあるのか。!そろそろUSBでも始めようかなぁ。
院試面白そう。

| | Comments (4) | TrackBack (0)

2007.08.21

VHDLでShort Coding

なにげにhttp://golf.shinh.org/p.rb?hello+worldを見ていたらVHDLとかあるじゃん。
コンパイラが分からないので、適当に送ってみたら、
/usr/lib/ghdl/bin/ghdl: compilation error
との事。ghdlか。

とりあえず、適当に書いて通ったのが400バイトくらい。ランキングを見てびっくりする。
ちょww、shinhさん、VHDLもやるのか。しかも僕より短いし。なんとか削って5位になって一息。

とりあえず処理系をインストールしないと始まらないと思った。architectureって書いたら負けな気がする。

| | Comments (2) | TrackBack (0)

Tea Partyが閉鎖

Tea Party閉鎖か。
コンスタントに執筆はされているようで少し安心。

結局、マイコンの合格報告はできなかったなぁ。
資格のための勉強はしなくなったけど、日々勉強は続けています。
またネットに戻ってきて欲しいと思います。

| | Comments (0) | TrackBack (0)

C++ Vectorその後

電車の中で何気なく、Accelerated C++を眺めていたら、普通にvectorの実装が書いてあった。ようやくここが理解できるところまでレベルが上がったみたい。

普通にC++の枠組みで要素を移動(コピー&削除)すると、コピーコンストラクタが呼ばれてしまうので、そこでallocatorが出てくる。コンストラクタを呼ばずにデータをコピーする仕組みと、デストラクタを呼ばずに領域を開放する仕組みを提供している。なるほどねー。

STLPortsでは、allocatorの代わりに_STLP_alloc_proxyが、uninitialized_copy()の代わりに__copy_trivial()が使われている。

今から読むと、この本はアクセル踏みすぎだと思った。

| | Comments (0) | TrackBack (0)

2007.08.20

C++の例外ってすごい

今日気がついたけど、例外ってすごい。変数がスコープをはずれたらデストラクタを呼ぶのは分かる。スコープがはずれる所に、デストラクタを呼び出すコード入れればよいから。でも、例外だったらcatchされるまで、順に関数呼び出しを戻っていって、スコープのはずれたオブジェクトのデストラクタを順に呼ぶんだよ。どういう仕組みなんだ?お前実装しろよって言われたら困る。多分、泣く。各関数のお尻にに例外が通ったらこの関数呼んでね?って領域でもあるのだろうか。

a()→b()→c()の順に関数が呼ばれて、c()で例外が発生して、a()でcatchされたとき、b()のスタック上にあるオブジェクトのデストラクタの呼び方って、b()自体でないとわからないよね。各関数に、例外が通るパスa'(), b'(), c'()みたいなエントリーがあって、c()で例外が投げられると、c'()→b'()を通って、a()に制御が移るんだろうか?それだけじゃだめだ。b()のどの位置でc()が呼ばれたかによって、解放するオブジェクトが変わってくる。コンパイル時点では、c()が例外を出すかどうか分からないのが辛いと思う。

手持ちの本をパラパラめくったけど、この仕組みについては全然載ってないな。Inside the C++ Object Modelとか期待していたけど、むしろBinary Hacksの方が情報多そうだ。アセンブラで追うか。

| | Comments (5) | TrackBack (0)

std::vector見てみた

STLportsのvectorのソースを読んでみる。

とりあえず、簡単な所から確認して自信をつけたかったので、[]の実装から。
reference operator[](size_type __n) { return *(begin() + __n); }

referenceはこんな感じでtypedef。
typedef _Tp value_type;
typedef value_type& reference;

at()の実装はこう
reference at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }

_M_range_check()の中で範囲の確認をして、OKなら[]でアクセス、NGなら例外の送出。

void _M_range_check(size_type __n) const {
if (__n >= size_type(this->_M_finish - this->_M_start))
this->_M_throw_out_of_range();
}

納得。

続いてpush_back()。
ifdefは適当に読み飛ばすと、

void push_back(const _Tp& __x) {
if (this->_M_finish != this->_M_end_of_storage._M_data) {
_Copy_Construct(this->_M_finish, __x);
++this->_M_finish;
}
else
_M_insert_overflow(this->_M_finish, __x, _TrivialCopy(), 1UL, true);
}

範囲に入っていれば、_Copy_Construct()、そうでなければ、_M_insert_overflow()を呼ぶ。_Copy_Construct()は、ただのmemset。

_M_insert_overflowからちょっと手強い。

template
void vector<_Tp, _Alloc>::_M_insert_overflow(pointer __pos, const _Tp& __x, const __true_type& /*_TrivialCopy*/,
size_type __fill_len, bool __atend ) {

//ここで、引数の__fill_lenと、今のサイズ__old_sizeの大きい方を新しいサイズにしている。
//push_backの時は__fill_lenは1で呼ばれているから、サイズは倍になる。
//必要な領域だけ確保するんじゃなくて、倍々で確保していく。(STLPortsの実装)
const size_type __old_size = size();
size_type __len = __old_size + (max)(__old_size, __fill_len);

//ここから、
pointer __new_start = this->_M_end_of_storage.allocate(__len, __len);
pointer __new_finish = __STATIC_CAST(pointer, _STLP_PRIV __copy_trivial(this->_M_start, __pos, __new_start));
// handle insertion
__new_finish = _STLP_PRIV __fill_n(__new_finish, __fill_len, __x);
if (!__atend)
__new_finish = __STATIC_CAST(pointer, _STLP_PRIV __copy_trivial(__pos, this->_M_finish, __new_finish)); // copy remainder
_M_clear();

//ここまでがわからなくて、最後に新しい値を設定している。
_M_set(__new_start, __new_finish, __new_start + __len);
}

続きは明日。 _AllocProxy _M_end_of_storageの_M_end_of_storage.allocate()から。

| | Comments (0) | TrackBack (0)

今日の日記

・FPGA Hacks
ドライブ能力を変えると微妙な遅延を作れたり、とりあずfanoutの最大は10で良いとか、 最適化を切って高速化するとか、ISE環境でedifの作り方知ってる?みたいな。そんなネタを10個×10人で、バイナリハックくらいになるんだよね。FPGAエディタや、ModelSIM AE/XEを加えたら普通に100個集まりそうな気がする。

・メタプロ
verilogをはき出すプログラムを作っているけど、web関係の書籍(のさわり)って役に立ちそうな気がしてきた。
・verilog:module foo から始まり endmoduleで終わる。 途中にポート宣言とか、下位インスタンスの呼び出しが入る。
・html:<html>から始まり</html>で終わる。途中にいっぱいタグと本文が入る。
なんか、ライブラリとかフレームワークがどこまで提供するべきとか、その辺りが参考になりそう。っていうかwebプログラミングってメタプロ?

・優秀な人
が、GoogleやIBMに集まらない方が業界全体としては良いと思う。でも、優秀な人本人が損をしない仕組みが必要。一応国内の話。

・C++ Vectorの実装
とりあえずソース追うことにしてみた。
gccの方は、public:の中にtypedefがあったり、__gnu_cxx::__normal_iteratorとかあったりしたので、ちょっと敬遠。STLportsからソースゲット。

| | Comments (0) | TrackBack (0)

中を見たいという気持ち

2才の娘がチャイルドシートにほころびを見つけたようで、運転中に必死でほじくっていた。

僕「今まで気にもしていなかった物でも、ちょっと隙間が見えると中を知りたくなるよね」
嫁「絵本とかでも1ページでも破れると、他のページも破りたくなるから、破れた絵本は隠さないと駄目なの」
僕「僕はチャイルドシートの中の物を出すと怒られるって分かってるからやらないけど、子供だと好奇心が勝っちゃうよね」
嫁「怒られなかったら、あんたもやるのか!」

後片付けとか、お金の問題とか、そういうのが無かったら、チャイルドシートでもばらしてみたいと思う僕は二歳児なみの精神年齢。orz

| | Comments (0) | TrackBack (0)

がちでC++のプロジェクトを立ち上げることになったら・・

クラスの良い参考書
http://www.kt.rim.or.jp/~kbk/zakkicho/07/zakkicho0708b.html#D20070815-3
から

今、がちでC++のプロジェクトを立ち上げることになったら・・

・Eff C++をみんなで読む
・例外とか、スレッドとか落とし穴があるから使わない。特に例外が出されてから回復しようとしない、素直にエラーメッセージを出してexit()なりabort()する。
・constな参照で渡すは採用
・stringとvector以外は使わない。普通に配列使うとか全然OK。
・デフォルトのコピーコンストラクタで問題が発生する設計をしない。メンバー変数にポインターを持たない。オブジェクトをコピーしたら、それぞれ別の物になると理解する。嫌なら参照を使う。
・できる限り継承しない。というか、デストラクタが呼ばれる/呼ばれないで致命的な結果を招くような設計を避ける。
・演算子のオーバーロードは使わない
・コンストラクタにexplictキーワード必須

とりあえず、エンジニアとしての経験と照らし合わせて、やばそうな所は徹底的に避けると思う。ベターCと言ってしまえばそれまでだけど。2chに「この会社辞めようと思った・・・」にさらされることを覚悟しよう。もし2chにさらされたら、さらした奴を見つけて、そいつをリーダーに抜擢する。

そうか!正解は「やる気のある若い人に任せる」だ。

| | Comments (0) | TrackBack (0)

STLFilt

STLFilt使ったよ。
C++ Templateのエラーを見やすくするツールです。

比較用のoperatorを定義しないまま、vectorに乗せてstd::sort()してみる。
cygwinだとこんな感じ


d:\home\study\acc_verilog\acc_verilog\test\verilog_cv>g++ -c -I/usr/include/boost-1_33_1 verilog_cv_parse_tb.cpp
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h: In function `void std::partial_sort(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator > >]':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:2470: instantiated from `void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator > >, _Size = int]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:2553: instantiated from `void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator > >]'
verilog_cv_parse_tb.cpp:118: instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:2274: error: no match for 'operator<' in '(&__i)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = acc::port*, _Container = std::vector >]() < (&__first)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = acc::port*, _Container = std::vector >]()'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h: In function `const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) [with _Tp = acc::port]':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:2482: instantiated from `void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator > >, _Size = int]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:2553: instantiated from `void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator > >]'
verilog_cv_parse_tb.cpp:118: instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:90: error: no match for 'operator<' in '__a < __b'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:91: error: no match for 'operator<' in '__b < __c'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:93: error: no match for 'operator<' in '__a < __c'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:97: error: no match for 'operator<' in '__a < __c'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:99: error: no match for 'operator<' in '__b < __c'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h: In function `_RandomAccessIterator std::__unguarded_partition(_RandomAccessIterator, _RandomAccessIterator, _Tp) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator > >, _Tp = acc::port]':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:2482: instantiated from `void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator > >, _Size = int]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:2553: instantiated from `void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator > >]'
verilog_cv_parse_tb.cpp:118: instantiated from here

STLFiltを通すと、こんな感じ


d:\home\study\acc_verilog\acc_verilog\test\verilog_cv>g++ -c -I/usr/include/boost-1_33_1 verilog_cv_parse_tb.cpp
stl_algo.h:2274: error: no match for 'operator<' in '(&__i)->iter::operator *() < (&__first)->iter::operator *()'
stl_algo.h: In function `void partial_sort(iter, iter, iter)':
verilog_cv_parse_tb.cpp:118: instantiated from here
stl_algo.h:2470: instantiated from `void __introsort_loop(iter, iter, int)'
stl_algo.h:2553: instantiated from `void sort(iter, iter)'
verilog_cv_parse_tb.cpp:118: instantiated from here


stl_algo.h:90: error: no match for 'operator<' in '__a < __b'
stl_algo.h: In function
`const acc::port & __median(
const acc::port &, const acc::port &, const acc::port &
)':
verilog_cv_parse_tb.cpp:118: instantiated from here
stl_algo.h:2482: instantiated from `void __introsort_loop(iter, iter, int)'
stl_algo.h:2553: instantiated from `void sort(iter, iter)'
verilog_cv_parse_tb.cpp:118: instantiated from here

stl_algo.h:91: error: no match for 'operator<' in '__b < __c'
stl_algo.h:93: error: no match for 'operator<' in '__a < __c'
stl_algo.h:97: error: no match for 'operator<' in '__a < __c'
stl_algo.h:99: error: no match for 'operator<' in '__b < __c'

ちょっと見やすくなる。

| | Comments (0) | TrackBack (0)

2007.08.18

末尾最適化の本

多分、ひげぽんさんが必要としているのは、Essentials of Programming Languages。通称EoPL。

7章が継続渡し(Continuation-Passsing Interpreters)で60ページほど、それを引き継いで8章(Continuation-Passing Styele)で40ページほど末尾最適化について書かれてあると思う。「と思う」とあやふやなのは、8割近く意味がわからないから。ちょっと悔しい。継続がらみで100ページ使っている!

もうちょっと突っ込んで内容を書きます。
Section 8.1がTail Formというタイトルで、(define fact (lambda (n) (if (zero? n) 1 (* fact (- n 1))))))から始まります。それをiteratorと、accumlatorで書き直します(SICPレベル)。次にソースコードのBNFの説明が入り、ソースコードをhead positionとtail positionに分解。さらに、simple expressionをBNFで定義。いろんな式を、tail formか、simple expressinに分類。add1(x)はsimpleかつtail form、(f + (x, y))はtail formだけどsimpleじゃない、proc(x) add1 ((f x))は、simpleだけど、tail formじゃない。

いったんまとめが入ります。
Tail form implies iterative control behavior.

If an expression is in tail form, and any procedures accessible through vairable bindings are also in tail form, then expression will execute with iterative control behavor.

次に、tail formのBNF表記があって、上の末尾最適化されていない階乗を末尾最適化で書き直し。続いて練習問題、ここまでで8ページ。練習問題の一つはこんな感じ。

Exercise 8.10:write a Scheme procedure tail-form? that takes a program in the language of figure 8.1 and determines whether or not it is in tail form, by checking the abstract syntax tree of the program against the grammar of figure 8.3 .

figure 8.3がtail formのBNFなので、ひげぽんさんの求めている物に近いと思う。

Section 8.2からconverting to Continuation-Passing Styleとなって、疑似コードが続きます。続くのですが、ここから理解できない。再帰呼び出しを、継続渡しStyleの再帰呼び出しに変換している所までは分かる。これが、コード書く人間にこう書けと言っているのか、インタープリターレベルでこう変換できると言っているのかどっちなんだろう。どちらにしても、アセンブラのcall/jmpの枠組みではなく、継続の視点で再帰呼び出しを説明している所が興味深いです。


以下、蛇足。

Compilers: Principles, Techniques, and ToolsConcepts, Techniques, and Models of Computer ProgrammingHow to Design ProgramsA Retargetable C Compiler: Design and Implementationコンパイラ入門コンパイラ構成法と調べました。

末尾再帰について全く載っていないか、紹介程度で終わってます。意外に書籍化されていない情報なのかもしれません。

| | Comments (5) | TrackBack (1)

2007.08.17

C++のvector

空き時間を利用して、C++の勉強。ずばり言うとトイレの中でしかC++の勉強ができない。一日とは言わんが、今日は夕方から全部STLの勉強の時間、みたいな時間の使い方をしてみたい。

C++ 入門書の次に読む本を読んでいて驚く。

・push_back()した時点で、C言語のrealloc()相当が走る可能性があるので、ポインターやイテレータは無効になる。

なんじゃそりゃー。って、内部でやっていることを考えたら当たり前なんだけど、全然意識していなかった。

あとは、[]だと配列の範囲チェックをしないけど、at()ならチェックをする。オーバーヘッドが極小の[]と、安全なat()の両方を用意しておいて、デフォが危険な方(C言語と同じ方)に振ってあるのがいかにもC++っぽい。僕はat()を使うことにする。back_inserterは領域を確保してコピーするんじゃなくて、ケツに突っ込む。アッーーー。removeとか存在意義がわからん。sortアルゴリズムには、普通に(lambda (foo& l, foo& r) (return l->baa > r->baa))って渡したい。そういえば、vectorに俺様クラスを乗せる話って、Accelerated C++に手取足取り書いてあった気がする。もう一回読むか。あんまり、idiomばかり覚えようとせずに、STLとかTemplateそのものも勉強しないといけないな。vectorか、stringの実装も追った方がよさげ。

C++の勉強で何が萎えるかというと、勉強したことがC++以外で役に立つとは思えない事。

C++ Templatesの目次をぱらぱらとみていたら、「Part2: Templates in Depth」が、 Templates in Deathに見えた。

| | Comments (0) | TrackBack (0)

バルサンしたよ。

実家から帰ってきて、ご飯を炊こうとしたら米びつからゴキブリが!
嫁がバルサンするまで家に帰らないと、娘を連れ出したのでバルサン決定。つまり、休日の最後はバルサンでつぶれることが確定。むしろそっちが半泣き。

車の中で娘が、「なんでお母さん泣いてるの?」「ご飯の所に何がいたの?」「なんで、ゴキブリはご飯食べるの?」って何度も何度も聞くので、何度も何度も教えてあげた。そのたびに、嫁のテンションが下がっていく。わっはっは。しかし、ゴキブリが怖いのは同意するが、その怖いゴキブリを一網打尽にするバルサンを怖がらないのが不思議。

そのまま外食し、バルサンを購入。次の日の朝から物をベランダに出し、服はビニール袋に入れ、もう大変。なぜだか、僕の下着と靴下だけ、ビニール袋に入っていなかったので嫁にしてきしたら「それは、バルサンした方が良いと思ってそのまましておいた♪」ってなんか違う。1時間ほどドライブした後、僕だけ帰宅してゴキブリの処理を行う。なんとなく、ブレスオブファイヤを思い出した。そして、床やら壁やら拭いて、カーテンとか全部洗濯して、食器を洗って、2日がかりでなんとか生活できるレベルに。疲れた。

| | Comments (4) | TrackBack (0)

2007.08.14

なかのひと


なかのひと

つけてみた。

| | Comments (0) | TrackBack (0)

2007.08.12

今日の日記

verilog_cv 0.2へ。すぐに0.3になる予定。

お盆なので実家に帰っています。無事、帰宅したら本の発送を開始しようと思っています。
ちなみに洋書は全然人気ありません。
埋もれていた本の中から「A Retargetable C Compiler」を発掘。無事保護。
VHDLの本が山盛りでてきたけど、これはそのまま埋もれさせることに決定。

これから娘とお祭に。わしょーい

| | Comments (0) | TrackBack (0)

2007.08.11

Short Coding

Short Codingざっと読みました。読み物として面白かったけど、本当に面白いのは手を動かしてから。雰囲気的には、ハッカーのたのしみよりも、Binary Hacksよりも、エキスパートCプログラミングに近い。こう書いてもエラーじゃないんだよ。そして、何が起こると思う?みたいなのり。両方ともコンテストのルールをHackする例ものっているしね。

Short Codingって、省略したらintとか、グローバル変数は0で初期化されてるとか、for文にいろいろ詰め込むとか、せいぜい「配列の先にこのデータがあるはず、でスタックにアクセスする」くらいだと思っていたんだけど、それはウォーミングアップの範囲。関数の戻り値がレジスタに残っていることを期待とか、笑うしかないようなテクニックが満載だった。アセンブラの最適化に近い物がある。xor a,a でaを0にするとコード領域が小さくなるとか、フラグレジスタの値をどこまで引き回すかとか、関数コールではなく内部割り込みで飛ぶとフラグレジスタが自動的に復帰するとか、そういう楽しさがある。アスキーで入力されたデータをアスキーのまま演算して、'0'で引くとか良く使う手だ。gccっていうワンクッションがその楽しさを増やしているんだと思う。もうちょっとバイナリな技が無いかなといろいろ考えてしまった。PCI BIOSを使って特定の値(IntelのベンダーID 0x8086)を取り出すとかね。

違う違う、こんな事を書きたかったんじゃない。一番書きたかったことを忘れていた。僕的サブタイトルは「gets()とscanf()の技法」、これほどまでにこの2つの関数が愛された本はあるだろうか。for(;~scanf(...);)が、perlのwhile(<>)くらい基本テクニックとして使われている。おすすめは2-3 ライブラリ関数を使いこなせ。ここの解説は、電車の中で声を出して笑ってしまった。一例を挙げておくと、
int abs(int n):整数の絶対値を求める関数です。地味ですが関数名が短く、意外なところで活躍するかもしれません。
こんな感じで、今までに見たこともない視点からの標準関数の解説があります。

この本を読んでから身近な事が問題に見えてきて困る。時刻表見ていると、なんとなく、scanf()で読み込んだ戻り値-1がその時間の電車の本数だよね、とか。

正直、今からgolfに参入してなんかできるとは思わないんだけど、この本のコードは自分で動かしてみたい。

P294 細かい誤植 括弧閉じてないです。

| | Comments (0) | TrackBack (0)

本を引き取ってくれる人募集中

夏休みが取れたので、本の整理をしました。

掃除開始とともに、2才の娘がバケツの水を床にぶちまけてしまい、一番大きな作業領域が使えなくなってしまった。C言語で言うとHeap使っちゃ駄目みたいな。


捨てる本:100冊 次の廃品回収でさようなら
実家に持って帰る本:50冊 主にラノベ。妹とシェアすることが決定。

捨てるには忍びない本。
テキストに落とす気力が無かったので写真で。

http://homepage3.nifty.com/~Natsutan/img/books0.jpg
http://homepage3.nifty.com/~Natsutan/img/books1.jpg
http://homepage3.nifty.com/~Natsutan/img/books2.jpg


引き取ってくださる方はYRW03704@ニフティ.comへメールお願いします。ニフティはniftyに直してください。タイトルに[なつたん]を入れてもらえると助かります。お名前、送り先(送付用)、電話番号(送付用)年齢を書いてください。あと、学生 or 社会人 の情報もお願いします。8月中に送りきるのが目標です。一人何冊でもOKです。

各本の状態はぼちぼち書いていこうと思いますが、半分くらいが新品。残りはそれなりに読んでいます。数日前のエントリーも参考に。複数のリクエストが来た場合のアルゴリズムは非公開ですが、学生の方や社会人1~2年目の人を優先的に考えています。

整理された本棚を眺めていると、本棚というのは今までの勉強の成果であり、これからの目標なんだなぁとつくづく思う。最上段にずらりと並ぶLispとAIの本は、ものすごく威圧的だ。組み込みLinuxとか組み込みBSDとか、やってみたいなぁ。こうなりたいと思って買った本は視界から消したら終わりだ。毎日背表紙だけでも眺めて、目標にしようと思う。

| | Comments (1) | TrackBack (0)

2007.08.08

今日もダメでした

あろはさんの所にコメント書いた。末尾再帰ができる条件にstaticだとか副作用は本質的じゃないですよ、って言いたかった。関数の中でprintf()とか使っても関係ないですよって。shiroさんの何でも継続もわかりやすい。とか思っていたら、始業の時間がせまりあわててpostしたら副作用の副の字も無くて自分でもわけわかめ。あろはさんには全部分かっている話でコメントつけにくかっただろうと思う。あろはさん、わけわからないこと書いてごめんなさい。

それはそれで置いておいて、コメントにも書いてありますがインラインの話。
void d() { printf("d"); return ; }
void c() { printf("c"); d(); return ;}
void b() { printf("b"); return ;}
void a() { printf("a"); b(); c(); return ;}
int main(void)
{
a();
return 0;
}

コメント書く前にcygwinで普通に-O3でコンパイルしたら、全部インライン展開されてjmpどころかcallすらしやがらないの。もうねgccに対して「横着するな!ちゃんと関数へ飛べ」って思った。なんか、若い人に「もうちょっと考えて仕事しろよ」って言ったら、思ったのと全然違うやり方で処理されて、しかも想像以上のパフォーマンスが出てきて、理解できないから「そんなやり方では駄目だ!」って根性論でけちつけてるみたいな。ごめんねgcc。着々と進むダメな大人化。

| | Comments (4) | TrackBack (0)

今日の日記

verilog_cvが少しだけど反応があってうれしい。

ChipScopeってISEのプロジェクトから、右クリック→Newで追加できるんだ(Coregenと同じ操作)。
Verilogに書く方法と、Core Inserterで無理矢理突っ込むしか知らなかった。


C++Builder 2007
アカデミックなのか、プロフェッショナルなのかはっきりして欲しい。

youtubeでモモーイって人の後ろ指を見る。大事な何かをけがされた気分。

娘と買い物にいって、僕の丸顔ストライクゾーンの一角が分かった。
ここまでがストライクで、ここからボール。
もちろんど真ん中はゆうゆ。

| | Comments (0) | TrackBack (0)

本の整理

要らない本があるんだけどどうしよう
本を整理していると、明らかに必要のない本が出てきて、処分しようか誰かにあげようか考え中。

ざっくりジャンル分けすると。
(1)2冊以上持っている本
主に間違って買ってしまった物。
System Desigin with SystemC、C++ Templates、化物語(上下)、ハッカーの楽しみ、アクセラレーテッドC++とか。
どちらか一冊はほぼ新品なのでもったいない。デバッガの理論と実装も2冊あったはずなので、誰かにあげようかとも思ったがもう一冊がみつからない。本棚に、同じ本が露骨に並んでいると嫁におこられそうなので、隠したままどっかにいってしまったな。

(2)2度と読まなそうな本
ラノベとか、The Little Schemer、The Seasoned Schemer、Verilog、VHDL関係もそう。定本 ASICの論理回路設計なんか、2冊あるのにもう一回読むことはなさそう。こっちは物食べながら読んだり、書き込みとかあるから普通に捨てるか。

(3)新しい版がでて、そっちを買ったから旧版がいらないもの
Advanced Programming in the UNIX Environment 、Compilers: Principles, Techniques, and Toolsの2冊。これもほぼ新品だからもったいない。両方とも旧版でも十分勉強になると思う。

コードコンプリートとかもかなり微妙で、ここ5年は読んでないし、もう一回読むなら最新版買って読むから手元に置いておく必要なさそう。

悩ましいのが、翻訳で1回読んで原書の最新版を買った奴。パタヘネとMinix本。どちらかだけ手元に残すとなると、原書の方が場所取らないから良いんだけど、さっと調べるときには1回読んだ翻訳の方が見つけやすい。

| | Comments (0) | TrackBack (0)

まだSTLは早すぎ


今日知ったこと:STLのcopyは領域を確保したりしなかったりする。

思いっきり空のvectorにコピーしかけていた。配列のsizeとか気にしたくないからvector使ってるのに、そりゃ無いと思った。いやまて、back_inserter経由だとちゃんと領域確保するのか?insert()を使うかoperator=を使うかの違い?落ち着いたらSTLも勉強しないと。

やっぱり、新しい言語は遊びでさわっておかないと、仕事で使うのは危険だといまさらながら確認。

| | Comments (0) | TrackBack (0)

2007.08.07

verilog_cv ver0.1

とりあえず公開

もうちょっとマニュアル書いてから公開しようと思ったけど、すぐに0.2に上げるので先行公開。
注意点は、
・Borland C++ Builder用いるよ。 http://members.jcom.home.ne.jp/akatukisiden/から。
・ソースはBSDライセンスだけど、実行ファイルは商用利用駄目だよ(BCBバーソナルの制限)

使い方
①exeをダブルクリックして立ち上げる
②Verilogファイルをドラッグ&ドロップする
③好きなボタンを押す。
④エディタにペーストすると、Verilogのテンプレートがコピペされる。

いじょ

| | Comments (2) | TrackBack (0)

2007.08.06

Hardware2.0

AO Dairyさんを見て(続き)
Hardware2.0について思うこと。


ソフトウェアの場合、同じ物をみんなが作ろうとしていて、淘汰されていった歴史がある。FreeBSDのportsを眺めていると、ここでしかみたことないコンパイラとかいっぱいある。ハードウェアの場合はまだそこまで行っていない。量から質への変換がまだまだ起きそうにない。だから、まずは何でも良いから情報を出す事が大事。

次にプラットフォームの話

ソフトウェアの場合、共通のプラットフォームという物がある。昔ならC言語/UNIX、今ならPC/AT互換機、Windows、Linuxだ。とりあえずこのプラットフォームなら、自分以外のユーザーが何人もいるだろうってのがある。MACとかPC98とかにしても、FPGAのボード持っている人よりは、間違いなくユーザー数は多い。普通に考えてみんなで同じFPGAボード使えば良い、ってのがあるんだけどいくつか問題点がある。まだまだ個人でFPGAボード買う人ってのは少ないということ、それと「みんなで同じボード使っていたら、Hardware毎にHackする楽しみが無くなってしまう」ということ。みんなが、それぞれ俺様ハードウェアを持っていて、それをいろいろいじくるのが僕の思うHardware2.0の世界。

#ipaqとかLinux zaurusのHackは、ちょうど良い妥協点だと思う。

再び、ソフトウェアの世界に戻ると、ソフトウェアの世界だって最初は互換性無かったはずなんだ。プロセッサだって違うし、メモリの量だって全然違うプロセッサで、互換性を保っている。これって、ソフトウェアの人たちが努力してきた結果なんだ。C言語もそうだし、Posixの標準化もそう。プラットフォーム互換を優先するあまり、バッドノウハウを作り出す可能性あるけど、それでも「互換性」というのはソフトウェアの品質を語る上で一つの大きなファクターだった。だからHardwareの世界でも、これの枠組みで書いておけば、どんなFPGAでもどんなハードウェアでもそこそこ動きますよ、みたいなフレームワークが必要だと思う。(EDAベンダーの押しつけではない、Openさも必要)

正直opencores.orgを見ていても、すぐ使ってみたい!っていうコアがそれほど無かったりする。プロセッサか、通信物くらい。使って見たいと思わない理由の一つが、自分がやりたいプラットフォームに組み込むのが大変そうだから。なんでも良いんだけど、CPU+バス+ペリフェラルの構成を、標準として配布できたらそこの障壁が下がる。CPUは当然GCC以下toolchainが整備されていて、バスはAHB2.0くらいで良いと思う。このプラットフォームは、各ボード毎にカスタマイズされていて、簡単じゃないかもしれないけど、一から起こすよりは楽に立ち上がる。イメージ的にNetBSDをブートさせるくらいの難易度。その上で試したい or 開発したいIP coreがあればそのバスに繋げて評価する。そういう流れができたら、もうちょっといろんなノウハウがたまって行く気がする。
opencores.orgを見ていると、OpenRISCというのは間違いないくその選択肢の一つだ。


まとめ:
1.とりあえず情報は出してみる。
2.Hardware2.0的プラットフォームが必要

| | Comments (3) | TrackBack (0)

再帰判定

はじめてのにきで、素直に感動。

int is_tail_opt() {
return __builtin_return_address(1) != __builtin_return_address(2);
}

普通は呼び出された結果のスタックフレームが同じである事を調べるのに、1つ前の呼び出しが違うことを判断基準にしているのか。脱力っぷりがすごい。

そして、cygwinのgccでは、-O2でも末尾最適化されなかった。orz。

| | Comments (0) | TrackBack (0)

年を取るとC++が難しい

今日一つ成長した。
組み込みプログラマはmallocを使わない。というかmallocが存在しない環境でプログラミングをすることが多い。そうすると、自然にmallocを避けるようにプログラミングしてしまう。同じようにC++でも、newやらdeleteやら使わずに済むなら使いたくない。

と思っていたら間違いに気がついた。

あるインスタンスAの領域が既に確保されているとする。途中でAはもう必要なくて、同じクラス(構造体)の別インスタンスBが必要になったとする。無意識に「Aの領域がもう要らないんだから、Bで上書きして使い回せば良いよね」ってコーディングをしていた。上書きの時に気をつけないと行けないこと事がいくつかあるから、上書きの時にはその関数を必ず呼ぼう。その関数でAが無効になるときの処理を書いて、Bを確実に初期化しよう。バグは出るかもしれないが、少なくともここでメモリリークは起きない。ずっと決まったところを使い回しているんだから。

完全に組み込みプログラマの職業病だ。

この発想がC++のデストラクタ、コンストラクタを台無しにしていることにようやく気がついた。オブジェクト指向なら、Aが必要なくなって新たにBが必要になったら、Aのデストラクタを呼んで、Bのコンストラクタを呼ばないといけない。クラス≠構造体だ。今C++のプロジェクトに放り込まれたら、間違いなくThe 老害になる。

一気にいろいろやると収拾つかなくなりそうだから、変更すべき所はnew、deleteに変更して、ポインターをメンバーに持つクラスはコピー禁止にしよう。仕事ならともかく、趣味のプログラミングで面倒だぜって思ったら10分で修正終了。カプセル化と単体テスト万歳!!!

一応effective C++ 2回目読み切ったけど、もう一回読まないといけないな・・・。

| | Comments (0) | TrackBack (0)

2007.08.03

AO Diaryさんを見て

以前からAO Diaryさんは良くチェックしていたのですが、今日初めてtopというリンクを発見しました。面白いことがいっぱい書いてある。もっと早く気がつけば良かった。

OpenRISC on FPGAでかなり興奮。Abstractからはじまる美しい技術文章がすばらしすぎる。

あらためて、AO Diaryを読み直してみる。Hardware 2.0発見!。僕も仕事中は「うちはSystemVerilogやってますよ、SystemCも好きなエンジニアいますよ」ってVerification 3.0だけど、Blog書くときはVerilog 1.0なのだ。間とって、Hardware 2.0にしておこう。XilinxのWebセミナーとか、無駄に充実しているので状況は徐々に変わっていると思いますよ。


Designing a half adderについて。
組織としてではないですが、私個人としてはPCIデバイス設計入門を見ながら、PCIのターゲットを動かすのが一番近道かなと思います。この本の元になる連載が始まった2000年以前ならともかく、いまとなっては簡単な回路の部類にはいりますから、これくらいは書いてもらわないと困ります。VerilogにしろVHDLにしろ1ファイルで済みますし、普通に回路を作る文には内蔵メモリとか、PLL/DCMをさわらなくて良いので初心者には楽です。

実機で動かすときにも一通りの罠があって好きだったりします。
・パソコンを立ち上げてから、FPGAをコンフィグレーションするとPCIデバイスとして認識されない。
・サンハヤトの延長基板などで簡単に信号を見ることができます。setup/holdの概念を説明してもらい、FPGAのレポートファイルと
付き合わせて、アナログ的なタイミングの重要性が確認できる。
・未使用ピンがGNDの設定になっているとPCが起動しない。

最近の傾向としては、FDDドライブが無くなっているのでDOSで立ち上げるのが難しいとか、新しいデバイスはタイミングとか気にしないでも余裕で動く、とか若干問題はあります。それでも、自分で作った回路がBIOSで認識されてアクセスできるのは、良い刺激になっていると思います。自社のベンダーIDを入れるので、REDPCI等で会社名が出てくると本当に自分で作った感があって楽しいですよ。

ついでに、shinhさんのこれも発見。激しくワラタ。さて じゃねーよ!って画面に何回も突っ込んでしまった。


今はある会社の研究者ということですが、研究者ってどんな仕事なんだろう。結構謎の職業だったりする。
僕が持っている研究者のイメージ

・朝からがぶりつきで、技術書読んでも怒られない。
会社きてなんかみんな静かだと思ったらComputer Architectureの最新版を各自が一冊持っていて、それぞれ夢中で読んでいる。

・常に最先端のギミックがいっぱい
コーヒーメーカーとかハックされまくっていて、コーヒーが無くなれば勝手に水道から水を補給して、おいしくできたらメールで連絡。当然複数台常時稼働していて、いつでもおいしいコーヒーが飲める。中には当然コーラとか、紅茶がでてくるコーヒーメーカもある。それらのスケジューリングについて研究者同士で喧嘩が始まる。「それぞれ並列に同期を取るんじゃなくて、一台コーヒーサーバー用意してそいつに集中管理させろ!」

楽しそうだなぁ。

最後に一個だけ。SICP良いですよ。楽しいですよ。

| | Comments (0) | TrackBack (0)

Effective C++ 再読

6章くらいからまたわかりにくくなってきた。単に僕のOOのレベルが足りないんだけど。
コンストラクタに関数ポインタを渡して、インスタンス毎に呼ばれる関数を変えるのは面白い。1回目呼んだときも、ここでなるほど~と思ったものだ。自分で書くとしたら、enumかなんかでパラメータを持って、case文で呼び出す関数を変えるんだろうなぁと思うと手続き型からの脱却ができていない。

手続き型→C++のOO よりも、手続き型→関数型 or 手続き型→宣言型の方が勉強として楽な気がする。SICP読んでいて、新しい概念(遅延評価とか)が出てくると、おおって思うのはC言語で書くのが大変そうな所だ。C++の勉強をしていると、本のサンプル程度なら、C言語でもこう書けばできるよねって思うから学習効果が低いのだと思う。C++には、ベターCという補助輪が強力すぎてなかなかはずせないんだ。

| | Comments (0) | TrackBack (0)

2007.08.02

検証/FPGAネタ

すばらしいblog発見
コーヒーでも飲みながら検証の話でも 大手メーカーの現場の人っぽいけど、丁寧にいろいろと説明してあります。こういうblogが増えて欲しいな。
たーぼ のハードウェア設計記録 こちらはVHDL。爆発したコンデンサの写真があったり、自営の方っぽい。


Verification Engineerの戯言経由で、Verilog and SystemVerilog Gotchas: 101 Common Coding Errors and How to Avoid Them一部が見られる事を知る。
前から買おうと思っていたんだけど、ちょっと高くて勇気がでなかった。これはこれで面白そうだけど、SystemVerilogだと勉強してもここに書けない。良い本なら邦訳でるので我慢しよう。

State of the Analog Electronics [最先端計量電子工(作)学] から
あるベテラン技術者が、 FPGAをHDLとスケマ混合で設計するのはまあいいのですが、
74のマクロは良いけど、いまさらスケマは良くないな。解答はすばらしい。

小ロット生産者の喜劇もワラタ。
そういうのは代理店の担当者と仲良くなると、本当の情報を教えてくれます。
「え、XXXXですか、もう出荷してますよ。すぐ使えますよ。製造の立ち上がりが早いのが、(A or X)の良い所です。でも、御社に行くのは来年以降、今年は無理(笑顔)」
みたいな話も過去にあったり、無かったり。GXだってすぐに「御社には売らないよ(笑顔)」って教えてくれましたよ。

Zap
http://www.fpga-lab.org/diary/days0707.html#2007/07/29から
ドルアーガ?

| | Comments (0) | TrackBack (0)

今日の読書

R.O.D. 2巻、文学少女4巻 どちらも良かった。文学少女は、今までの中でこれが一番好き。

日の丸半導体は死なず―黄金の80年代の復活か?
関係ありそうな所だけ立ち読みですませた。いかにも日経らしい本だ。半導体業界はそんなにバラ色じゃないし、この本で絶賛されていた会社のエンジニアはもっと疲れている。全体的にうさんくさいと思った。

軌道離脱 なんか最後が良くないな。

| | Comments (2) | TrackBack (0)

Verilogのツール作成中

コマンドライン版はできた。あとはGUIのみ。できの悪いVerilog-modeのAUTOINSTのような感じ。
vector < string > を改行付きでファイルに書き出す方法がわからず1日無駄にする。しょせんvectorなんで、普通にintやiteratorで回せば良いんだけど、なんかfor_eachを使って一行で書く方法を昔に勉強した気がする。

C++ CookBook 7.11に乗っていた
copy(v.begin(), v.end(), ostream_iterator < string > (ofs, "\n");

for_eachじゃなくて、copyを使うのか。上手く動いているけど、動く仕組みが全く説明できない。日々勉強。

| | Comments (0) | TrackBack (0)

初心者がn番目にC++を学ぶ理由

Effective C++を最初から読み始める。同じ本を2回読むのってここ数年無かった気がする。
しかしC++はあれだ。C言語の落とし穴を避けるために作った機能が、結果的に地雷をばらまいただけな気がする。RAIIを実現するためにコントラクタやデストラクタを採用したはずなのに、そこがメモリリークの温床になっているのが悲しい。なんか言語の勉強以上に、注意しないといけないことが多すぎる。最初の言語としてC++ってのは、駄目な気がする。じゃあ何番目ならOKなんだろう。

それはさておき、templateですよ。クラスをtemplateで作って、コンテナに乗せて、アルゴリズムを使う。templateがtemplateを呼び、さらにtemplateで動く。これは幾重にも束ねられた呪いですよ。いったん呪われると、自力では呪いを解けない。ひたすら呪いのアイテムを探し続ける。自覚があろうが無かろうが、未来永劫呪われ続ける。template、template、template・・・・

その呪われた総本山がboostだ!
Template Metaprogrammingなんか、最初から最後まで呪われている。血をすすりながらきらめく妖刀村正みたいだ。彼らがやろうとしていることの意味を少し考えただけで、SANチェックだ。サンプルコードの行間から、テケリ・リ、テケリ・リって聞こえてくるよ。

| | Comments (2) | TrackBack (0)

« July 2007 | Main | September 2007 »