縁側で茶飲み話部門より。
あるAnonymous Coward 曰く、
本家「Old-School Coding Techniques You May Not Miss」に、無くなって嬉しい昔のコーディングテクニックについてのストーリーが掲載されている。
ソフトウェア開発は複雑なものだが、年月とともにその開発プロセスは改善されてきたと言えるだろう。「熟練の」プログラマーであればマニュアルチューニングなどを行ったことも記憶に残っているだろう。しかし今日の開発ツールは、昔であれば手で書かなければならなかったような複雑な機能を自動的に行ってくれたりする。多くの開発者はこれを歓迎している。すでに若いナマイキな奴は、我々のような時代遅れの人間がこれらのことを手で行っていたと気付かないかもしれない。
Esther Schindler氏は古株プログラマーらに「頭痛の種だった昔のプログラミングテクニック」について尋ね、自身の経験も交えた記事をComputerWorldに掲載している。パンチカードとか、ハンガリアン記法とか、覚えているだろうか?
元記事に挙げられている「頭痛の種」には(バブルソートなどの)ソートアルゴリズム、リンクリストやハッシュテーブルの実装、GUIデザイン、「Go To」(そしてスパゲティコード)、マルチスレッドやマルチタスクのマニュアル実装、自己書き換えコード、ユリウス暦の変換等々が含まれている。
/.J諸兄方が昔を振り返ってみて「これは大変だった」と記憶に残っているものや、「今だったらもっと楽なのに」と思われるような懐かしい(?)思い出にはどんなものがあるだろうか? ちなみに本家では、ソートやサーチアルゴリズムなどの基本的な仕組みを理解していることがプログラマーとして重要かどうかといった話に発展してしまっているようだ。
てっきり (スコア:5, おもしろおかしい)
「もうやらなくてもいい昔のコーディング規約」かと。
ええ、もちろん大昔の話ですよ?
コメントを書く
Re:てっきり (スコア:3, 興味深い)
このお題を見て、てっきりFortranの桁揃えのことかと。メインフレームメーカーは7桁目に縦線の入ったコーディング用紙を供給していましたね。フローチャートのテンプレートも供給していた。当時は富士通を使っていたので、FACOMってロゴ入りだった。
FACOMのFortranのテキストにFortranの歌も載っていたな。おおブレネリの替え歌。
ヤーッフォーッフォートランランランてやつ。
コメントを書く
親コメント
Re:てっきり (スコア:2)
Fortranの歌といえば、20年ほど前に口の悪い友人はコウガマンの替え歌を教えてくれました。
「要らん使わん、フォートランー」てやつ。
プログラミングをしない私にはなんのことか分かりませんでした。
ていうか、たぶん今となってはコウガマン自体がセピア色の想い出。そもそもこのセピア色ってのが銀塩写真をある程度知らないと意味不明なんで、今時の若い者はきっと使わない言葉なんでしょう。
コメントを書く
親コメント
Re:てっきり (スコア:2)
だからなぜセピア色なのか分かってんのか、ってこと。なぜその色なのか理解せず単に記号としてしか知らないからそういう発言が出るのではないかな?写真に写るときに「ピース」とか言ってVサインしたりするようなものだ。それに、銀塩写真に親しんでいた人が今時のデジタルカメラに疎いと決めつけるというのは愚かさを誇示することだよ。
で、そうやって本来の意味が忘れられた手順が書き物にだけ残って、意味のない縛りになって現役世代を苦しめると。#1560126のACみたいなのが年を取ると意味を考えず「決まってるから」と変なルールを押しつけるんだろうな。
コメントを書く
親コメント
Re:てっきり (スコア:2, すばらしい洞察)
でも、「コーディング規約⊂コーディングテクニック」の様な気もします。
それなりの合理性が有るノウハウや、バグの作り込みの原因を分析結果を元に、決められたのが、コーディング規約な訳で……ま、「規約」なるモノの常として、大概の場合、決められた、その時から、形骸化が始まる訳ですが。
コメントを書く
親コメント
Re:てっきり (スコア:2)
変更した部分はコメントアウトして残すこと。
それと変更した日付と変更した人の名前を残すってのがありましたねー。
2004年ごろの話ですけどね!
#CVSやSubversionが今ほど普及していなかった頃の話
#多分今も普及してないだろうけど、あの部署
コメントを書く
親コメント
Re:てっきり (スコア:3, 興味深い)
これは今でもあっちこっちで見受けますよねー。
で、変更した人に詳細を聞きに行こうとしたら8割の確率で
「あ。その人とっくに辞めてますよ」 orz
だから、あんまり役に立たないんだよねー。
# ちなみに私も今は「とっくに辞めてますよ」の側だから、これ以上、つっこまない(笑)
clausemitz - Twitter始めたお(^ω^)→ http://twitter.com/clausemitz
コメントを書く
親コメント
Re:てっきり (スコア:2)
「うちでは変更をCSVで管理しているんだ。」
(ああ、CVSか… subversionにすれば良いのに。)
っhistory.csv
HIRATA Yasuyuki
コメントを書く
親コメント
Re:てっきり (スコア:2)
そんなソースに出会ったことはありますが・・・
そもそも、作り自体が悪いのもあって一から作り直しました。
コメント?
バグつぶしのコメントをとっておいてもしょうがないでしょう。
仕様のコメントなら大歓迎ですが。
コメントを書く
親コメント
Re:てっきり (スコア:2)
> 同様に可読性を損なうコーディング規約に「タブではなくスペース4文字でインデント」がありますね。
おや?
スペースインデントって結構使ってるんですけど、NGだったんですか・・・ (+_+)
個人的には可読性を高めるためにスペースを結構多用してます。
スペースならどのエディタで開いてもインデントの深さが一緒になるので、
違うエディタで開いたり、他の人の画面でコーディングをチェックしてあげる時
タブだと設定によって崩れて見えて読みにくいんですもん
# タブでもスペースでも、2~4文字がちょうどいい人です
# ネストの深さや種類によって、2文字だったり4文字だったり
# はたまたタブだったりで、結構いい加減ですが (^-^;
コメントを書く
親コメント
Re:てっきり (スコア:2)
僕はたいていの言語で「スペース 4 文字でインデント」派です。
インデントをタブにするかスペースにするかとか、何桁にするかとかって、まさに「『好みのエディタ』のような宗教論争と同列」だと思っているのですが、何が違うのでしょうか。どちらも、選択肢がいろいろあり、どれも一長一短で完璧な解はなく、結局好みの問題だという点でよく似ていると思います。
コメントを書く
親コメント
異教徒どもめ (スコア:3, 興味深い)
リーナスおじさんの「タブ幅は8桁で決まり!」主張 [linux.or.jp]を誰かフォローしとくべきでは?
#この話題はおじさんホイホイなんだし
コメントを書く
親コメント
Re:異教徒どもめ (スコア:2)
> リーナスおじさんの「タブ幅は8桁で決まり!」主張を誰かフォローしとくべきでは?
深いネストはロクなもんじゃない、同感ですね。3段階とまでは言わないですが、5段以上になるケースは僕の場合は希です。
# 確かに論理構造の劣悪さに着目しないで、単なるプログラミングスタイルの問題と
# 捉えている人は多いですね。
コメントを書く
親コメント
Re:てっきり (スコア:2)
> プログラムを書くために必要な論理思考を伴わない人(学生)というのが結構いるのですよ。
御意。居りますなあ。一年位でアプリからカーネルまで出来る様になって欲しいのですが、前途遼遠・・・
> でも、フローチャート以外の代替案(現場でも使いそうなもの)ってどういうのがいいのだろうか…
NSチャート、PAD位しかチャートを知らないのですが、どれも一長一短がありますね。しかし本来はコードを書く前にチャート等で論理構造を検討する必要がある人達も時代の流れでチャート等を書かなくなり、その帰結として「なんじゃ?こりゃ?」なコードの大量生産、これが近年の傾向では無いでしょうか。もっとも、チャート等で論理構造の検討を行うとか、エレガントなコードが書ける人も求めると言うのが(特にお金の面で)難しくなっている事も理由だとは思いますが。プロジェクト管理で品質について考える場合でも、通常は表層的なバグ数のカウントに終始している訳で、コードの安定性の様なものはバグの原因にさえならなければ無視、無視出来ない場合は大炎上ですね(少なくとも僕が絡んでいる所ででは、ですが)。
ルータ構成ツールにステートチャート(UMLのではなくて、ステートマシンの記述の方)の作成がプログラミングになるものがあります。エレガントなコードを志向するのが死に筋なら、その様なアプローチもありなのかな、と思っています。
コメントを書く
親コメント
Re:てっきり (スコア:2, すばらしい洞察)
>直接教育担当ではないので、口出ししないように言われている
その身分制度(の過剰さ)も、かなりおおきな害悪なので、どうにかする努力をしたほうがいいです。
問題指摘なんてのは「社内で一番最初に気づいた奴が言う(という権利が有る)」ことにするのが一番です。
それを採用するかどうかはまた別としても、まず言う権利くらい全員に与えないと、なにしに「会社」に大勢が雁首揃えてるのか判りません。
>フローチャート
無数にある実装(/設計)上必要なもののうちのごくごく一部でしかないですね。
たまたま一本の長い流れが発生したときにそれを記述しやすいというだけなので、フローチャート自体がデザパタとかと同様に「特定の状況では有効、別の状況では逆効果」というものでしかないです。
そういう状況になったときには「そういやフローチャートなんてものもあったな」と押入れから引っ張り出せばいいものであって、常に机に置いておくほどのもんじゃないです。
そして、他の人がいってるように並列処理も書けないし、OOPを引き合いに出すまでもなく状態変化やマルチ状態も書けない。つまり「コンテキスト」を記述する能力が無いんですよねフローチャートには。バグは処理そのものよりも処理と絡むコンテキスト(の誤用)に宿ることが多いので、それが見えにくいフローチャートはあんまり役立たないことが多いなあ。つまり本当に数少ない特定の場面でしか有効ではなく、大抵は邪魔。
フローなんぞより、データ構造のほうが余程大事ですし、データ構造を基準に見れば全体が判る「ように設計」すればますますバグりにくくなります。自社を倒産させたくないならば狙うべきはそっちですね。
コメントを書く
親コメント
わかりやすい(無理やり短縮されていない)識別子 (スコア:3, 参考になる)
昔のコンパイラには識別子の長さについて制限のやたらきついものがあったので、無理やり短縮した名前にせざるを得なくなって自分でも何が何やらわけのわからない名前になってしまうことがありました。まぁアセンブラのニーモニックだってそのアーキテクチャに精通してない人にはたとえ規則性があったとしてもなんじゃこりゃ~なわけで、まぁあんな感じです。MASMだって識別子は確か31文字くらいに制限されていた時代があったはず。もっと古いアセンブラのラベルなんて8文字に制限されているものもあったり。
というわけで、「無理やり短縮した識別子」は「もうやらなくていい昔のコーディングテクニック」です。
ペーストビン [windy.cx]
コメントを書く
Re:わかりやすい(無理やり短縮されていない)識別子 (スコア:2, 興味深い)
AppleSoft BASICは識別子の最初の二文字までしか有効でなかったので、気づかずに変数を書き換えてデバッグに苦労した思い出が蘇りました。
アセンブラが買えなかった子供の頃にはPeek/Pokeでハンドアセンブルとかやったなー(遠い目)
署名スパムがウザい?アカウント作って非表示に設定すればスッキリさ。
コメントを書く
親コメント
Re:わかりやすい(無理やり短縮されていない)識別子 (スコア:2, 参考になる)
FORTH [rubyist.net]というのも.
コメントを書く
親コメント
冗長でいいのでは?と言うか冗長でないと後工程が困る(Re:わかりやすい (スコア:3, すばらしい洞察)
関数の中身を書く場合には短い関数名でもいいのでしょうが、実際にその関数を使ってロジックを組む場合は冗長な位の関数名の方が組みやすいしメンテやバグ潰しもしやすい。
一つのロジックを見直すときに呼び出す関数自体のソースコードやコメント・ドキュメントを毎度毎度見ないといけないのは、煩雑な分見落としミスの温床になりやすい。
どっちかというと関数同士の引数の順序や法則性での統一性の維持に労力を割いた方が余程メンテを考えることになる。
関数内部のドキュメントの充実以前の問題です。ロジックの記述ミスや手順ミスを見つけるデバッグ側の立場からすると短い関数名でアレコレやっちゃう人は逆に困るんですが。
# つまりはメンテやる側がソースコードにアクセスする時の工数増やさないで欲しい。って事。
# 呼び出し先の関数については一回コメント読んだら後は関数内部のロジックの妥当性を見る必要が出るまで
# 一切見ないで済む位を目標にすべき。
# 余計な工数自体がメンテやバグ潰しの時のチョンボを誘発する大要因になる。
関数の命名規則として変な略語や日本語記述とか頭に機能種別をつけたり。というのは一人二人でやって作りきりで後にコード引き継がせる必要がないときにはいいのでしょうが引き継ぎとか考えるとParanoidなハンガリアン規則などでロジック自体の可読性を高める程度がちょうどいい場合も少なくないですよ。
# しかし、そういうプロジェクトに限って関数名16文字以内とか頭にアレコレつけろだつけないだと
# と言う所ばかりに拘ったコーディングを要求してくる_| ̄|○汎用機とか十五年前のアセンブラかと_| ̄|○
## それよりも引数の統一性と中身の可読性の方が問題だろうと。
--暮らしの中に修行あり。
blogはじめました。 [hatena.ne.jp]
コメントを書く
親コメント
便乗質問(ループ変数) (スコア:2)
ログ解析の時に便利なんですけど。
コメントを書く
親コメント
Re:ループ変数 (スコア:2)
1. * または # で検索履歴に「\」を拾う。
2. / でキーワード検索に入り、Ctrl+P で「\」を呼び出す。
3. 後ろの「\>」を消して再検索する。
# ちょっと手順長いですかね?
# でも g* ではダメなんですよね?
名物に旨いものなし!
コメントを書く
親コメント
Re:ループ変数 (スコア:2)
おっと失敬、化かしてしまいました。
> 1. * または # で検索履歴に「\」を拾う。
> 2. / でキーワード検索に入り、Ctrl+P で「\」を呼び出す。
履歴に取り込んで再利用するのは「¥<aVar>¥」です。
名物に旨いものなし!
コメントを書く
親コメント
Re:ループ変数 (スコア:2)
自分は、スコープの長い変数には必ずdescriptiveな名前を与えるというルールで書いています。つまり、ループ変数でもループ自体が十分長ければ i ではなく意味のある名前を与えるということです。スコープが短く、一画面で見通せるくらいの長さならば i でもOKということにしてます。
コメントを書く
親コメント
Re:ループ変数 (スコア:2)
私かもしれません。すみません。
ちなみに、模範解答はどうなりますか?
コメントを書く
親コメント
Re:ループ変数 (スコア:2, 興味深い)
どうせ、iの代わりにindexとかを使うのだろうから、iで十分。
コメントを書く
親コメント
時々思うんだが (スコア:3, 興味深い)
malloc/freeの処理コストってどれくらいかかるんだろう。メモリがバカ高かった時代はmalloc/freeで使用量を厳密に、というのはわかるんだが、ンGB当たり前の昨今、malloc/freeの処理コストの方が高くなったりしないのかな?と。「だいたい、こんくらいとっといてぇー」というようなプログラミングスタイルは無いのだろうか、と思う。
・・・malloc/free叩いとらんな、最近。
-- gonta --
"May Macintosh be with you"
コメントを書く
Re:時々思うんだが (スコア:2, 興味深い)
>malloc/freeの処理コストの方が高くなったりしないのかな?
>と。「だいたい、こんくらいとっといてぇー」というようなプログラミングスタイルは無いのだろうか、と思う。
チマチマ何回かに分けて取るより一回にまとめて取った方が相対的に安くなる
ので、「だいたい、このくらい」でまとめて取ってから、それをアプリ内部で
チマチマ切り刻んで使うというテクニックは昔からあったと思います。
そしてJVMなんかだと、それを自動でやってくれるので、Javaな人にとっては
これも「もうやらなくていい昔のコーディングテクニック」の一つですね。
それから、OSが仮想記憶をサポートして以降は、mallocは実メモリを確保する
わけではなくOSの管理テーブルに予約するだけなので、ちょっとくらい大きい
領域を予約しても影響はすごく小さくなってるはずです。
コメントを書く
親コメント
Re:時々思うんだが (スコア:2, 参考になる)
>>そうか、Javaだと(よほど変なことをしない限り)メモリリーク心配しなくていいのか(本当?)
>いえいえ、お馬鹿なコードを書くとリークしていきますよ。
「メモリリーク」という単語を、
「ポインタ(或いは参照)を全て手放したにもかかわらず、領域の解放(free)を
忘れたために、メモリを少しずつ食い尽くしていく現象」
と定義するなら、Javaだと「メモリリーク」の心配はほぼありません。
#まさに「よほど変なことをしない限り」、且つ「VMやフレームワークにバグがない限り」。
#C言語で長期間動作するアプリを作るのが難しいのは、このような「狭義の
#メモリリーク」の検出とデバッグが難しいからで、Javaではそれが発生しない
#ことがサーバー向けアプリに適している理由でもあります。
少なくとも昔は「メモリリーク」というのはそういう意味で使われているものだと
思っていましたが、最近では参照を掴んだまま離さない
「到達可能なオブジェクト」=「(GC的に)生きているオブジェクト」
が生き残っているのも「メモリリーク」だと呼ぶ人はいます。
そういう「広義のメモリリーク」ならばJavaでも起こりえます。
#これはGCの基本的な特性なので、おそらく他のGCを持つ言語でも同じになる。
でもこれは言うまでもなくC言語でも他の言語でも起こることですね。そういう
コードしか書けない人は、いずれにせよC言語で長期間安定動作するようなコードは
書けないので、Javaにおける広義のメモリリークの心配をするには十年早いかと。
コメントを書く
親コメント
Re:時々思うんだが (スコア:3, 参考になる)
言葉の定義がどうであろうと起きている現象がなんであろうと
問題ですね。
このメモリリークの広義/狭義(あるいはメモリリーク/メモリリテンション)って
のは良く聞く話なのだけど運用者にとっては区別する意味が全くない。
この話を聞いて私が思い出す言葉は「五十歩百歩」です。
コメントを書く
親コメント
Re:時々思うんだが (スコア:3, 参考になる)
>昔ならいざ知らず、統合開発環境が主流な現在においてはどちらも容易。
>(ブレークポイント張りまくれるでしょ。スタックの中身ですら見えるでしょ。)
ブレークポイントはどこで何が発生するか分かってないと張っても無駄です。
(狭義の)メモリリークの難しい点は、それを発生させる条件を特定することや、
或いはそもそもメモリリークの有無を知ることそのものなんですよ。どういう
条件の時にメモリリークが発生するのかまで特定できていれば、その部分のバグに
ついては8割方片付いたも同じです。
ブレークポイントはその残りの2割のさらに一部を楽にできる程度の効果しかありません。
#そもそも統合開発環境がある前からデバッガなんてありましたよ。
#ブレークポイントをはったりもやってた。でも(狭義の)メモリリークは
#最も面倒なバグの一つとして有名だったのです。
>出来ない君集団にやらせるなら、何使わせても一緒じゃね!?
この部分についてだけは同意。
コメントを書く
親コメント
Re:時々思うんだが (スコア:2, 興味深い)
・言語としてのシェアがトップクラス
・Javaをクライアントサイドで使うことは少ない(携帯Javaはそこそこ多いけど)
ということを考えると、かなり多いのでは?
> 動的メモリを確保できる言語は、メモリリークの問題を常に持っている。
一見、動的メモリ確保をしていないように見えても、メモリリークすることがあります。
g++2.9.5(だったかな)で例外をcatchするとスタックが本来の位置より数bytesせり上がるというバグがあって、長期間動かすと徐々にプロセスのメモリ使用量が増えていくという現象に出くわしました。あれは怖かった。
コメントを書く
親コメント
メモリーリーク (スコア:2)
少なくとも Visual C++ では、メモリーを確保して解放しないことを「メモリーリーク [microsoft.com]」と呼んでいます。日本語版のドキュメントでは「メモリ リークとは、割り当て済みのメモリを正しく解放できない状態を指します」と、わかったようなわからないような説明になっているので、英語版 [microsoft.com]から引用します。
コメントを書く
親コメント
Re:メモリーリーク (スコア:2)
failure は「何かをしようとして失敗すること」とは限りません (例 [alc.co.jp])。とはいうものの、おっしゃる通り、「failure to deallocate」という英語の解釈としては「プログラマーはメモリーを解放しようとしているにもかかわらず (何らかの理由で) 解放に失敗すること」というのもありえますね。メモリーリークというのはそういう意味ではないと思っていますが、証拠を挙げるのは僕には難しいです。
コメントを書く
親コメント
Re:時々思うんだが (スコア:2)
malloc/freeはシステムコールなので呼ぶとコンテキストスイッチが発生します。
特にCPUのクロック数よりもL2キャッシュのヒット率とかのほうが性能的影響が
大きいようなメモリレイテンシにシビアなシステム、例えば、
マルチスレッドでサイズの大きいヒープを頻繁に生成/開放しながら
沢山のアクセスを受け付けるサーバーアプリみたいな処理系では、
コンテキストスイッチのオーバヘッドが馬鹿にならないので、
JVMや.Netのようにヒープの大枠確保しておいて、プロセス内部で
cpu user timeでやりくりするメモリ管理があったほうが性能的には有利。
というもんだと理解しとります
コメントを書く
親コメント
Re:時々思うんだが (スコア:2)
malloc/free はシステムコールではありません。必要であれば mmap や brk などで
ヒープの大枠を確保し、確保したヒープを切り分けること自体はユーザモードで
行います。
というわけで、
> JVMや.Netのようにヒープの大枠確保しておいて、プロセス内部で
> cpu user timeでやりくりするメモリ管理があったほうが性能的には有利。
> というもんだと理解しとります
JVMや.Net のメモリ管理方式には C に対してあなたが述べたような性能的な
アドバンテージはありません。
コメントを書く
親コメント
Re:時々思うんだが (スコア:2)
ページフォルトの影響を書き忘れてました。
そうだな。。。
ページフォルトが後からじんわり効いてくるのがいやな場合には
プログラムの初期化部分で大きめに malloc して memset してから
free しとく必要がありますね。
でも JVM でもこれを避けようとしたら JVM 自体の初期化処理で
同じことをやる必要があるはず。ですんでこれは性能的な
アドバンテージというよりは、プログラムを数~十数ステップ程度、
短くできるかどうかという問題ですね。
この意味でのアドバンテージなら確かにありますね。
コメントを書く
親コメント
32767文字? 32000文字? (スコア:2)
MSDN Library 英語版の CreateFile 関数の説明 [microsoft.com]には 32767 文字と書かれており、日本語版 [microsoft.com]でも「ほぼ 32,000 ワイド文字」となっているので、「32767 文字までではなく 32000 文字までだ」という主張は誤りだと思います。ただ、 File Names, Paths, and Namespaces [microsoft.com] には
と書かれており、 32767 文字ぎりぎりまで使えるとは限らないみたいなので、 32000 文字くらいまでに抑えておいた方が安全という事情はあるかもしれません。僕は \\?\ なんて使ったことがなく、よく知りません。
コメントを書く
親コメント
Re:32767文字? 32000文字? (スコア:2)
ということは、日本語版が「ほぼ 32,000 ワイド文字」という謎の書き方になっているのは、以前の英語版の影響なんですね。参考になります。
コメントを書く
親コメント
昔のテクニック (スコア:3, 興味深い)
紙メディアにカッターナイフで穴をあけたり、ハサミとセロファンテープで切り貼りしたりなど、
物理的なテクニックは駆使してましたよ。さん孔機の順番待ちをするより早いですから。
あとはパンチャーのおばさんにお菓子を持って行くのも、ひとつのテクニックです。
〜◍
コメントを書く
Re:昔のテクニック (スコア:3, 参考になる)
紙テープを繋ぐツールが色々とありましたね。でも、こんどは高速のテープリーダにかけると、繋いだところでテープがひっかかってちぎれたりするんですよ。
さん孔タイプライタで打ち込みに集中していたら、テープが引っかかって、横一列に穴が空いていただけっていうトラブルも見かけました。集中していても、たまには脇見をしましょう。
あと、忘れてならないテクニックが、メインフレームのラインプリンタは筐体が大きくて余裕があるので、ものを隠すには最適ってことです。オヤツとか隠しやすい ^-^)
コメントを書く
親コメント
Re:昔のテクニック (スコア:2)
>あと、忘れてならないテクニックが、メインフレームのラインプリンタは筐体が大きくて余裕があるので、
>ものを隠すには最適ってことです。オヤツとか隠しやすい ^-^)
あの頃のプリンタは五月蝿かったので防音ケースに入れるか隔離されてましたね。
#ぎりぎり紙テープを見たことのある世代
コメントを書く
親コメント
Re:昔のテクニック (スコア:2)
今でもそういう防音ケースはありますよ。経理、金融用途などで連続紙、特にカーボン紙を要求する伝票類とか、レーザーやインクジェットではダメなので。事務的な考え方次第で止められるので、減りましたが。
コメントを書く
親コメント
Re:昔のテクニック (スコア:2)
紙テープを(物理的に)編集することに慣れると自然に覚えるものです。はさみで切って、糊で繋げたりするんですから。壁に一覧表を貼ってあったし。
でも、光子力研究所のオペレータのように、高速で出力される紙テープから日本語を読むことはできません。あの速度が無理ということもありますし、Fortanのコードに日本語は不要だから。
ええ、もう、完全に忘れましたとも。
コメントを書く
親コメント
Re:昔のテクニック (スコア:2, おもしろおかしい)
パンチカードの束をうっかり落としてバラバラになっても、すぐ順番に並べられるように、束の側面に斜めの線をマジックで引いておく。
コメントを書く
親コメント
シフト演算 (スコア:3, 興味深い)
以前はコンパイラーが賢くなかったし乗算が遅かったので、 C 言語の入門書には「y = x * 8; でなく y = x << 3; を使いましょう」などと書かれていたものです。 z = x * 8 + 1; と等価のつもりで z = x << 3 + 1; と書いてバグったのも良い思い出です。
コメントを書く
Re:シフト演算 (スコア:4, 参考になる)
除算も同じシフト演算で置き換えしてましたですよね。ただ、組み込み系のような、いつまで経っても進歩しないアホなコンパイラを使わざるを得ないケースとかですと、未だ現役の知識なのですw
それはさておき、
私の場合は、演算子の優先順位というのを頭に入れるのが面倒でしたので、四則演算の組み合わせでも括弧をつける癖をつけてました。10年前はアホだの無駄だのひどい扱いを受けていましたが、今は「コーディングの鏡」扱いされるのって、複雑な気分です。
余談ですが、CPUの命令によっては高級言語を意識した命令があって、例に挙げられたような n * { 2,4,8 } + { 0-7 } のような演算を1命令でこなせるモノもあり、コンパイラによってはちゃんと置き換えしてくれるものもありますね。昔はインラインアセンブラ使って人力コンパイルしたりしてました。
カジノを作るくらいなら、パチンコ・パチスロ税を導入しよう!
コメントを書く
親コメント
Re:シフト演算 (スコア:2)
はい、除算もですね。負の数が出てくると除算と右シフトでは挙動が違ってまた悩んだりしました。
大変そうです……。
コメントを書く
親コメント
Re:シフト演算 (スコア:2)
はい、そういうことでした。どうしてシフト演算子の優先順位は * や / と同じでないんだ、と文句を言いたくなったものです。
コメントを書く
親コメント
Re:シフト演算 (スコア:2)
「foo = 四則演算1 << 4 | 四則演算2 ;」ですよね。たしかにビットフィールドのようなものをビット演算を使って自力で実現しようとすることが頻繁にあれば、現状の優先順位に多少は意味があるかもしれませんね。おっしゃる通り、今や普通の PC アプリケーション開発では使われない手法だと思いますが。
コメントを書く
親コメント
68系は (スコア:2)
80系は裏レジを使いこなす。
のがコツなんて古すぎて、誰もわからないか。
コメントを書く
Re:68系は (スコア:2, おもしろおかしい)
アマチュアは今でも癖のあるアーキテクチャのPICマイコン(8bit品)一辺倒で,姑息なコーディング・テクニックを競い合っている
コメントを書く
親コメント
Re:68系は (スコア:3, おもしろおかしい)
コメントを書く
親コメント
Re:68系は (スコア:2)
V25,V35はレジスタバンクが8つぐらいあったような
コメントを書く
親コメント
Re:68系は (スコア:2, 参考になる)
> これは「スタックを使うな」という設計者の意思表示だと思ってました。
ソース失念で非常に怪しいのですが(でも6502の設計者の発言だった)
リソースの制限上、16bit加算器を載せられなかったから
というのが理由だそうです。
おしなべて6502の設計は実装最優先ですね。
http://homepage.mac.com/jorgechamorro/a2things/6502.jpg [mac.com]
コメントを書く
親コメント
そんなごたくはいいから (スコア:2)
無敵のコーディング規約でバグの無いソフトウェアを最初から納品してくださいよぉぉぉぉぉぉ!!!
いや、まあ、昔に比べたらバグの原因が特定しやすくなってるみたいでありますが
これがコーディング規約の力なのか?
コメントを書く
Re:そんなごたくはいいから (スコア:2, すばらしい洞察)
>これがコーディング規約の力なのか?
違います。
コーディング規約こそ、なんの役にも立たない御託そのものだと思います。
コメントを書く
親コメント
私の場合 (スコア:2, 興味深い)
586以降では命令キャッシュを破壊したりと不利益のほうが大きいので使う事はなくなりましたね、さすがに。
Leshade Entis
コメントを書く
80x86 の命令の自己書き換え (スコア:2)
それが i486 のキャッシュ導入以降はかえってフレンドリーな動作になり、 Pentium に至ってはすでにパイプラインに入った命令が自己書き換えを受けた場合、 パイプラインを自動的に巻き戻してくれていました。
# P6 系から自己書き換えは再び面倒になったはず。
ところで x86 系 CPU で Self-Modifying Code や Cross-Modifying Code を行なう正しい作法は、 Intel64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide [intel.com] の 7.1.3 Handling Sef- and Cross-Modifying Code の章に記述されていますよ。
この作法を守って正しく動作しない場合は CPU のバグですな。
Flatearther だけが良い fundamentalist である
コメントを書く
親コメント
特殊なC++コンパイラでの話だけど (スコア:2, 興味深い)
for文の初期化項での変数スコープがfor文外でも有効だった件。
可搬性のために
#define for if(0); else for
とかやってたよね。
コメントを書く
Re:特殊なC++コンパイラでの話だけど (スコア:2)
VC2003時代にどっかで読んだ話じゃ、
「MFCがそれ(for文の外までスコープになる)前提で書かれており、
しかもそれがあちこちにあるから今のところデフォルトで規格に合わない動きにしている」
とかなんとか。
コメントを書く
親コメント
変数やメンバの名前に英数字を使わなければいけないこと (スコア:2)
いちいち妥当な英語(難しいならローマ字)で名前付けしなくてはならないことがつらかった
まあ変数は記述が楽なので今でも英数字使うほうが遥かに多いですけど
私の環境ではソース見る人全員日本人なので、色々な意味で物凄く無駄な作業でした
unicode万歳
#今では問題ない場合メソッド名とかは処理の内容で記述してます
#Method_出力実行_伝票() とか
コメントを書く
関数っぽいマクロ (スコア:2)
C 言語でマクロを使って #define SQR(x) ((x) * (x)) のように関数っぽいものを定義して、「これはマクロだから副作用のある式を渡しては駄目」と意識しながら使っていたのも、過去の話です。最近僕は C 言語を使わないし、 C++ (や C99) ならインライン関数があるし。
コメントを書く
とりあえず (スコア:1, 興味深い)
コメントを書く
Re:とりあえず (スコア:2, 参考になる)
そのへんの制限はGecko 2で一気に取っ払われる予定で、たとえば今nsresultを使っていちいち戻り値を判定しているものはC++例外処理に置き換えられたりするようです。
昔はキャスト演算子すら満足にそろっていないコンパイラが多くてマクロで代用していましたが(NS_REINTERPRET_CASTとか)、これはだいぶ前に解禁されてマクロは廃止されました。64ビット整数も同様の理由でサポートしていない環境では構造体にtypedefされる特別な型を使ったりしていたのですが、現在は解禁されています。
コメントを書く
親コメント
リアルタイムグラフィック関連はずいぶん変わりました (スコア:1, 興味深い)
コメントを書く
Re:リアルタイムグラフィック関連はずいぶん変わりました (スコア:4, すばらしい洞察)
その頃とは難しさの「質」が違いますよ。
今のシェーダプログラミングの「難しい」は、ライティングなどのモデルにおける数学や物理の難しさで、
昔のポリゴン描画の「難しい」は、キャッシュフェッチなどのスループット向上の難しさです。
昔のポリゴン描画は数学ではせいぜい外積までしか使わなかったため、そういう意味では敷居が低かったと思います。
コメントを書く
親コメント
Re:リアルタイムグラフィック関連はずいぶん変わりました (スコア:2, すばらしい洞察)
シェーダープログラミングが難しいのではなくて、シェーダーを利用する為の周辺環境を整えるのが大変なんですよ。
DCCツール上でなるべく実機での表示に近い状態でプレビューしたり、ゲーム中でどのシェーダーを使うか管理したりと、アーティスト密に連携を取る必要がある分、最速のソフトウェアレンダラーを追求するみたいなプログラマー内で完結する仕事の方がお気楽ですよ。
コメントを書く
親コメント
BASICあつまれー (スコア:1)
RENUM
あとは、行番号にルーチンの固まり毎で帯域を作ったりとか
FORループのNEXTは、変数を書かない方が速いとか。
# って、BASIC毎にちょっとずつ違うのかな?
コメントを書く
Re:BASICあつまれー (スコア:3, 参考になる)
昔のBASICの高速化のテクニック(?)として、
・プログラムの最初でDEFINT A-Z
・よく実行されるコードは最初の方においておく (行番号を先頭から線形探索しているから?)
・変数名は短くする
・複数行はマルチステートメント化する
・IF I=29 THEN X=X+1 ELSE IF I=30 THEN X=X-1の代わりにX=X+(I=30)-(I=29)とする。
とかいうのを思い出しました。
コメントを書く
親コメント
Re:BASICあつまれー (スコア:3, 興味深い)
MSX-BASICだと、かえって遅くなるんですよ、これ。
他のBASIC実装だと、速かったんでしょうか?
コメントを書く
親コメント
Re:BASICあつまれー (スコア:2, 興味深い)
NEC系は確か速くなったはず、と思ってN88-BASICで確かめてみると、IFを使う場合が10000回で29秒であったのに対して、論理式の方は10000回で33秒となりかえって遅くなってました。
これは高速化のための方法ではなく、N60のようなIF構文が弱い(ELSEが使えない)場合に書きやすいって話だったのかもしれません。
コメントを書く
親コメント
Re:BASICあつまれー (スコア:2, おもしろおかしい)
NS-HU BASIC で、メモリ節約するのにそれをやるというのがあったような。
(コントローラ入力あたりの処理で)
--
ええファミリーベーシックですよ
コメントを書く
親コメント
Re:BASICあつまれー (スコア:2, 興味深い)
条件によって処理速度がばらつかないようにという理由もあったように思います。
例のコードみたいなのって、入力に従ってキャラクタを上下左右に動かすとかだったりするんだけど、IFの羅列で書くと、上への移動と下への移動の速度が違うなんて現象が起こってしまうとか。
コメントを書く
親コメント
Re:BASICあつまれー (スコア:2)
それらは実装次第だから、処理系によるね。
例えば、For ~ Next ~は、Fortran時代からよく語られたテクニックだけど、ちゃんと最適化していたら違いはないはずだからね。
コメントを書く
親コメント
C/C++そのもの (スコア:1)
って書くとマイナスモデなんだろうなあ。
あんなもんをあえて我慢して使わなきゃならない局面は随分減ってると思うんですけど。
署名スパムがウザい?アカウント作って非表示に設定すればスッキリさ。
コメントを書く
C/C++はナイフとロープ (スコア:2, すばらしい洞察)
普段使いはPythonとJavaとC#ですが、やはりいざって時にC/C++は頼りになる。
なんというか、まぁナイフとロープみたいなもんじゃないでしょうか。
日常生活ではもっと各種用途に便利な機能を備えた道具がたくさんあるけど、
極限の状態でこの道具があったから生き残れた、みたいな。
まぁ懐中電灯ですら金属製だと武器とみなされて軽犯罪法違反で
警察官にしょっ引かれるらしいので、ナイフなんて所持してたら
警察官に何されるかわかったもんじゃないですが。
ペーストビン [windy.cx]
コメントを書く
親コメント
Re:C/C++はナイフとロープ (スコア:2, 参考になる)
なんというか、止め時ってのは大事だよね。
署名スパムがウザい?アカウント作って非表示に設定すればスッキリさ。
コメントを書く
親コメント
Re:C/C++そのもの (スコア:2, 参考になる)
高木先生の到着が遅れているようですので張ってみます。
元ストーリーに沿った話だとこんな所が。
# しかし、もう10年前の話になるのか。。
コメントを書く
親コメント
PC98でのグラフィック描画 (スコア:1, 参考になる)
コメントを書く
PC98でのグラフィックRAM (スコア:2)
オフトピなんですけど、あえてここに。
一応、8086のアクセス空間内にあるということで、コンカレントドライバーを入れた環境下で、裏側のRAMをメッセージ受け渡し領域として使いましたねぇ。
もち、数十バイト程余分が領域は、資源管理に使ったのは、言うまでもありません。
一般的には、グラフィックRAMは、RAMディスクに使われることの方が、多かったみたいですね。@目的外使用
コメントを書く
親コメント
Javaの場合 (スコア:1, 参考になる)
比較的若い言語であるJavaでも、コンパイラやVMの進化によって、今では役に立たなくなった、
場合によっては有害になったテクニックはそれなりにあります。
1.2ぐらいの知識のままJavaに触れている人は、少なくとも以下の記事を読んで欲しいです。
パフォーマンスの都市伝説 [ibm.com]
コメントを書く
シェルスクリプトでは (スコア:1)
なってきているので、もしかしたらexprが不要になる日も近いかもしれません。
コメントを書く
DOS上のCでの話 (スコア:1, 興味深い)
LSI-C 試食版にはお世話になりました。
80286-12では辛かったけど、今試したら速いんだろうなぁ。
Borland C++ 4.02で想定外の挙動をする場合があったので、アセンブラのソースを吐き出させて、そこだけアセンブラでコーディングし直してました。
初期はFD運用だったので、拡張メモリでディスクキャッシュやRAM Driveを使ったりしてました。
RC.SYSにもお世話になりました。
DOSの時代の方が苦労したけど、楽しかった気がするなぁ。
コメントを書く
Re:DOS上のCでの話 (スコア:2)
Hugeが使えるQuick Basicで書き直す羽目に。
コメントを書く
親コメント
ばばば (スコア:1)
俺はまだたまに使う。
コメントを書く
パンチカード (スコア:1, 既出)
運搬中に転んでぶちまけても、線のカタチにカードを揃えられるから。っていうのが理由らしい。
事態は際限なく悪化する。
コメントを書く
いろいろ (スコア:1, 参考になる)
2.レジスタの0クリアは、0代入ではなく、自分同士の引き算かXOR
(フラグレジスタには注意)
3.コ・プロが無いマシン用に、実数は使用せず、とにかく整数で計算
4.BIOSとDOSをメモリのバンク切り替えで、67kCP/M
5.パンチ穴をあけ直し、両面使用していたフロッピー用の、
メモリをフルにバッファに使用するようにPIPコマンド再作成(COPYの前身)
(通常のバッファサイズでは、面をまたがるコピーが遅い)
6.UV-ROMに書き間違えたとき、00h(NOP)でクリアし、
適当なアドレスへのJMPに書き換えられる所まで行ったら
JMPし、必要な処理後に戻ってくる
7.D-RAMのリフレッシュ回路を削減するため、2ms周期の割り込みで
128バイトアクセスする割り込みルーチン
こんなところかな...
コメントを書く
そろそろこの人 (スコア:1, おもしろおかしい)
毎回コメントが下品で見るに堪えません。
コメントを書く
親コメント
Re:ハンガリアン記法とか (スコア:3, 参考になる)
char szHogeHoge[64]のようなシステムハンガリアンを使うことについては、僕も大嫌いですが。
コメントを書く
親コメント
Re:ハンガリアン記法とか (スコア:2)
自分ではやりませんが、人がやっている分にはスルーする事にしています。
ただ、
Windows界隈ですが、変数名ではなく型名にハンガリアン記法(っぽい)定義がされているのが、よくあります。
符号無し32ビット整数である DWORD に対して、それのポインタである LPDWORD が定義されているわけです。
これだと頭が混乱するので、素直に DWORD * と書いて欲しいわけです。
ポインタ値を“ポインタ返し”関数があったとします。たとえば以下のようなものです。
void hoge (void **p);
これをマイクロソフト流に書くと、
void hoge (LPVOID *p);
となります。この辺で、かなりイラっときます。
文字列ポインタは、マルチバイト文字かワイド文字か、constの有り無しで、以下のように定義されています。
LPSTR
LPCSTR
LPWSTR
LPCWSTR
ときどき LPCWSTR * なんてのが出てきます。この辺で、殺意を覚えます。
素直に、
char *
const char *
wchar_t *
const wchar_t *
って書いてくれれば、混乱しなくて済むのに。
あなたの予想に反して、このページが見えているでしょうか?
コメントを書く
親コメント
Re:いや、存じてるでしょ (スコア:2, すばらしい洞察)
プログラミングの経験の少ない人は型でなんでも出来ると思いがちなんだけど、例えば
pxA + pxB という式は要注意だが、
(pxA + pxB) / 2 という式は平均を取っているのでたぶん問題なし、
ということを読み取りたいわけ。
ハンガリアンの目的はコードの可読性を高めることにあるので、型とは目的からして違うんだよ。
コメントを書く
親コメント
Re:いや、存じてるでしょ (スコア:2)
> おけば良い物に人間が煩わされるなんて馬鹿馬鹿しい。
コードレビューを行うときにレビュアーにとって便利なんです。
プログラムというのはあなたとコンパイラだけが読むものではありません。
コメントを書く
親コメント
Re:いや、存じてるでしょ (スコア:2)
おっしゃる通りで、どっちに寄りかかるにせよ、狂信的な原理主義者に現場が振り回されるのだけは勘弁して欲しいものです。
しかしこの辺の議論を読んでいて思ったのですが、最近のトレンドではハンガリアンという代名詞を持ち出すまでもなく、変数や関数に「意味のある名称」をつけること自体、もはや時代遅れとされつつあるのでしょうか? 元々ハンガリアン記法が忌み嫌われていた一番の理由は、処理系の都合に過ぎない (組み込みの) 型という概念の為だけに名前付けが冗長になってしまうことであり、それは名前に対するセマンティクスの重視と、読みやすくメンテナンスしやすいプログラムソースの追求という命題に対する裏返しなのだと思っていたのですが。
むらちより/あい/をこめて。
コメントを書く
親コメント
Re:ハンガリアン記法とか (スコア:1)
「MFCのソースの書き方に準じております」と言えば、文句を言われる事は少ないので。
notice : I ignore an anonymous contribution.
コメントを書く
親コメント
Re:変数名 (スコア:1, おもしろおかしい)
コメントを書く
親コメント
Re:最近はいない? (スコア:2, 興味深い)
#使用言語はC言語です。
#「もうやらなくていい」というより「使ってもよさそうなのに禁止」されています。
禁止になった理由は、コメントの最後に「\」となるマルチバイト文字をつかってしまい
(本当はコメントにしたくなかった)次の行までコメントとなってしまったからです。
#こういうのを「馬鹿基準」と言ってる人もいますね。
#低レベルな人に合わせて無駄な禁止事項が増えていくという。
無駄なコーディング規約より「DRY原則遵守」で。
コメントを書く
親コメント
Re:ループにif文 (スコア:3, すばらしい洞察)
そのコードなら ADD c, c, b だけで……いえ、何でもありません。
コメントを書く
親コメント
Re:ループにif文 (スコア:2)
コメントを書く
親コメント
逆光は・・・ (スコア:1)
T/O
コメントを書く
親コメント
Re:クロック数を数えた (スコア:3, すばらしい洞察)
最適化が必要でないところでは、徹底的にサボりますが…。
今でもアセンブラで最適化する際は、普通にクロック数を数えますし、
投機的実行や予測分岐、アウトオブオーダー実行を行うCPUの場合は、
それぞれの実行状態を予測して至近値を求めたりします。
後、昔はやらなくて良かったメモリレイテンシによる遅延なんかも、
細かく算出して最適な挙動を考えなきゃいけません。
レジスタページングを考慮した組み方によって、数クロックを稼ぐなんて
当たり前ですから。
最適化をやろうとしたら、昔よりはるかに面倒くさいです(^^;
コメントを書く
親コメント
Re:変数名 (スコア:1)
んでもって数年後には「変数名の誤変換はいい加減にしてほしい」って話題でもりあがるのですね。
「Dim 返り値 As Boolean」というコードを巡って..
・「普通は戻り値だろう?」
・「返り値でも日本語としては間違えてはいない(根拠を示しながら)」
・「いや、どうでもいいから返り血だけはやめてほしい」
とか
コメントを書く
親コメント
Re:クロック数を数えた (スコア:1)
>最悪ケースでの処理クロック数を数えたことがあります
え?
クロック数って数えるもんじゃなかったの? orz
仕事じゃすっかりAsm使わなくなりましたけど(制御をCPU直でやる案件がすっかり無くなってしまって)、趣味では今でもたまに数えてます。
リソースに恵まれていないハードでは、ソフトウェアタイマーは未だに健在。
コメントを書く
親コメント
Re:ハードウェア面でもいいですか? (スコア:2, 興味深い)
今時の制御向けCPUだと、ファンアウトが1を超えるどころか、直接LEDをドライブしてもおつりがくるくらい流せるものがあるので、バッファーかますこと自体が昔のテクニックになりつつありますねえ。
小規模ものですと、CPUの足をI/Oにアサインすればいろんなことが直接できちゃうんで、アドレスデコードって何? ってのが今時の人なのかもしれません。
コメントを書く
親コメント
ファンアウト(Re:ハードウェア面でもいいですか? (スコア:1)
TTLゲート何個ドライブできるか。と言う出力端子あたりの出力電流制限値ですが?
今時はハイインピーダンス入力でローインピーダンス出力なのが当たり前になってるのでマイコンなり標準ロジックICなりの論理出力結果をそのまんま他のICの論理入力に直結してもそうは問題が出なくなりましたが(周波数がかなり高い場合は別)、
昔は入力のインピーダンスもそんなに高くなかったし出力インピーダンスも低くなかったので下手に直結してしまうと出力が飽和して正しい値を出力しないお(と言うか1と0の間をバタついたり、最悪の場合はICが発熱してふっとんでた)のが普通にあったのですが。
40系統や74HC系統の標準CMOS ICが出たあたりから出力回路も改善されてきましたけど…
# しかし、今でもワンチップマイコンにLEDとか直結するのは抵抗ありますねー
--暮らしの中に修行あり。
blogはじめました。 [hatena.ne.jp]
コメントを書く
親コメント
Re:そういえば (スコア:1)
Pen4 + Intel C++コンパイラですら、オプションで unrollingを指定しても、
手で展開したほうが速かったです。
コメントを書く
親コメント
Re:ループにif文 (スコア:1)
for (int i=0; i< 4096; i++) {
if (i & 1) a = b[i/2] >> 4;
else a = b[i/2] & 0x0f;
:
:
}
を
a =( b[i/2] >> 4*(i&1)) & 0x0f;
と書き換えた方が速かったので、条件分岐はまだまだ重たいんだなと思いました。
分岐だけを処理するパイプラインのあるPowerとかだとどうなんでしょう?
コメントを書く
親コメント
Re:elseに正常系を書く (スコア:1)
APIによって、正常時にゼロを返す関数と、正常時にtrueを返す関数がありますね。
前者の場合 if (hoge() == 0) {} と書きます。後者の場合 if (fuga()) {} と書きます。
もしくは、 if (hoge() != 0) { return; } とか、 if (!fuga()) { return; } とかやって、
異常系の場合に即座に抜けるようにしたり。苦肉の策を講じます。
そして、しぶといバグを追いかけて1時間くらい悩んだ末、strcmp()の戻り値の分岐が間違っていただけだったりすると、激しく凹みます。
あなたの予想に反して、このページが見えているでしょうか?
コメントを書く
親コメント
Re:自己改変コード (スコア:1)
あなた自身が変わってしまわれたのですね。
1を聞いて0を知れ!
コメントを書く
親コメント
Re:固定幅、長さ宣言必須のファイルシステムを (スコア:1)
>NECのミニコンで使えるCが出たのだけれど、ファイルシステムが不自由だったので、・・・
へ~。その昔のMS(マイクロソフトじゃないですよ~)のCコンパイラ、小文字すら使えなかったので、すごく気持ちの悪いソースになりましたよ。なので、変数名には、気を使ったコーディングが、必要でした。
実話ですが、IDで
コメントを書く
親コメント
Re:変数名 (スコア:1)
(define-syntax 算法
(syntax-rules ()
((_ x ...) (lambda x ...))))
(define 表示する display)
(define-syntax 条件は
(syntax-rules (他)
((_ (他 x ...)) (begin x ...))
((_ (e1 e2 ...)) (when e1 e2 ...))
((_ (e1 e2 ...) e3 ...)
(if e1
(begin e2 ...)
(条件は e3 ...)))))
(define-syntax 論理和
(syntax-rules ()
((_ x ...) (and x ...))))
(define 零ですか zero?)
(define 余り modulo)
(define 改行 newline)
(define-syntax する
(syntax-rules ()
((_ x ...) (let x ...))))
(define-syntax これが
(syntax-rules ()
((_ x ...) (if x ...))))
(define 減 -)
(define 対 cons)
(それぞれで (算法 (い)
(表示する
(条件は ((論理和 (零ですか (余り い 3)) (零ですか (余り い 5))) "ひずばず")
((零ですか (余り い 3)) "ひず")
((零ですか (余り い 5)) "ばず")
(他 い)))
(改行))
(する 繰り返し
((元 100) (結果 '()))
(これが (零ですか 元)
結果
(繰り返し (減 元 1) (対 元 結果)))))
;; MzschemeとGaucheで動きます。Gaucheだと最後にエラーが出ますが。何でだろう。
コメントを書く
親コメント
Re:クロック数を数えた (スコア:1)
学校の実習でZ80のアセンブラを作っていたときは、
命令の実行ステート数とクロック周波数から動作時間を計算していました。
自由課題の時に音階と周波数を計算してオルゴールを作ったもんだ・・・。
コメントを書く
親コメント