ページ内ジャンプ:

アレゲなニュースと雑談サイト

soaraによる 2009年05月04日 13時00分の掲載
縁側で茶飲み話部門より。

あるAnonymous Coward 曰く、

本家「Old-School Coding Techniques You May Not Miss」に、無くなって嬉しい昔のコーディングテクニックについてのストーリーが掲載されている。

ソフトウェア開発は複雑なものだが、年月とともにその開発プロセスは改善されてきたと言えるだろう。「熟練の」プログラマーであればマニュアルチューニングなどを行ったことも記憶に残っているだろう。しかし今日の開発ツールは、昔であれば手で書かなければならなかったような複雑な機能を自動的に行ってくれたりする。多くの開発者はこれを歓迎している。すでに若いナマイキな奴は、我々のような時代遅れの人間がこれらのことを手で行っていたと気付かないかもしれない。

Esther Schindler氏は古株プログラマーらに「頭痛の種だった昔のプログラミングテクニック」について尋ね、自身の経験も交えた記事をComputerWorldに掲載している。パンチカードとか、ハンガリアン記法とか、覚えているだろうか?

元記事に挙げられている「頭痛の種」には(バブルソートなどの)ソートアルゴリズム、リンクリストやハッシュテーブルの実装、GUIデザイン、「Go To」(そしてスパゲティコード)、マルチスレッドやマルチタスクのマニュアル実装、自己書き換えコード、ユリウス暦の変換等々が含まれている。

/.J諸兄方が昔を振り返ってみて「これは大変だった」と記憶に残っているものや、「今だったらもっと楽なのに」と思われるような懐かしい(?)思い出にはどんなものがあるだろうか? ちなみに本家では、ソートやサーチアルゴリズムなどの基本的な仕組みを理解していることがプログラマーとして重要かどうかといった話に発展してしまっているようだ。

表示オプション しきい値:
  • てっきり (スコア:5, おもしろおかしい)

    firewheel (31280) : 2009年05月04日 13時08分 (#1558966)

    「もうやらなくてもいい昔のコーディング規約」かと。

    • まずは詳細なフローチャートを作成し、上司のレビューをうけてからコーディングに入ること。
    • 変数の型が分かるように、変数名の先頭にはintならI、クラスならCのように決められた文字から始めること
    • 変更した部分はコメントアウトして残すこと。
    • メソッド名や変数名を変更する場合には変更許可申請書を提出し、上司の印鑑を貰うこと。

    ええ、もちろん大昔の話ですよ?

    • Re:てっきり (スコア:3, 興味深い)

      nmaeda (5111) : 2009年05月04日 15時48分 (#1559058)

      このお題を見て、てっきりFortranの桁揃えのことかと。メインフレームメーカーは7桁目に縦線の入ったコーディング用紙を供給していましたね。フローチャートのテンプレートも供給していた。当時は富士通を使っていたので、FACOMってロゴ入りだった。

      FACOMのFortranのテキストにFortranの歌も載っていたな。おおブレネリの替え歌。
      ヤーッフォーッフォートランランランてやつ。

      • Jubilee (20038) : 2009年05月06日 20時46分 (#1560092)

        Fortranの歌といえば、20年ほど前に口の悪い友人はコウガマンの替え歌を教えてくれました。
        「要らん使わん、フォートランー」てやつ。

        プログラミングをしない私にはなんのことか分かりませんでした。

        ていうか、たぶん今となってはコウガマン自体がセピア色の想い出。そもそもこのセピア色ってのが銀塩写真をある程度知らないと意味不明なんで、今時の若い者はきっと使わない言葉なんでしょう。

        • Jubilee (20038) : 2009年05月08日 0時52分 (#1560851)

          だからなぜセピア色なのか分かってんのか、ってこと。なぜその色なのか理解せず単に記号としてしか知らないからそういう発言が出るのではないかな?写真に写るときに「ピース」とか言ってVサインしたりするようなものだ。それに、銀塩写真に親しんでいた人が今時のデジタルカメラに疎いと決めつけるというのは愚かさを誇示することだよ。

          で、そうやって本来の意味が忘れられた手順が書き物にだけ残って、意味のない縛りになって現役世代を苦しめると。#1560126のACみたいなのが年を取ると意味を考えず「決まってるから」と変なルールを押しつけるんだろうな。

        • 2個のコメント が現在のしきい値以下です。
      • 2個のコメント が現在のしきい値以下です。
    • Re:てっきり (スコア:2, すばらしい洞察)

      Takahiro_Chou (21972) : 2009年05月04日 13時35分 (#1558985) ホームページ 日記

      「もうやらなくてもいい昔のコーディング規約」かと。

      でも、「コーディング規約⊂コーディングテクニック」の様な気もします。
      それなりの合理性が有るノウハウや、バグの作り込みの原因を分析結果を元に、決められたのが、コーディング規約な訳で……ま、「規約」なるモノの常として、大概の場合、決められた、その時から、形骸化が始まる訳ですが。

    • Arc Cosine (35004) : 2009年05月04日 23時46分 (#1559282)

      変更した部分はコメントアウトして残すこと。

      それと変更した日付と変更した人の名前を残すってのがありましたねー。
      2004年ごろの話ですけどね!
      #CVSやSubversionが今ほど普及していなかった頃の話
      #多分今も普及してないだろうけど、あの部署

      • >変更した日付と変更した人の名前を残す

        これは今でもあっちこっちで見受けますよねー。

        で、変更した人に詳細を聞きに行こうとしたら8割の確率で

        「あ。その人とっくに辞めてますよ」 orz

        だから、あんまり役に立たないんだよねー。

        # ちなみに私も今は「とっくに辞めてますよ」の側だから、これ以上、つっこまない(笑)
        --
        clausemitz - Twitter始めたお(^ω^)→ http://twitter.com/clausemitz
      • Driver (32138) : 2009年05月05日 12時32分 (#1559451) 日記

        そんなソースに出会ったことはありますが・・・
        そもそも、作り自体が悪いのもあって一から作り直しました。
        コメント?
        バグつぶしのコメントをとっておいてもしょうがないでしょう。
        仕様のコメントなら大歓迎ですが。

      • 2個のコメント が現在のしきい値以下です。
    • Re:てっきり (スコア:2, すばらしい洞察)

      Anonymous Coward : 2009年05月05日 2時04分 (#1559328)

      >直接教育担当ではないので、口出ししないように言われている

      その身分制度(の過剰さ)も、かなりおおきな害悪なので、どうにかする努力をしたほうがいいです。

      問題指摘なんてのは「社内で一番最初に気づいた奴が言う(という権利が有る)」ことにするのが一番です。
      それを採用するかどうかはまた別としても、まず言う権利くらい全員に与えないと、なにしに「会社」に大勢が雁首揃えてるのか判りません。

      >フローチャート

      無数にある実装(/設計)上必要なもののうちのごくごく一部でしかないですね。
      たまたま一本の長い流れが発生したときにそれを記述しやすいというだけなので、フローチャート自体がデザパタとかと同様に「特定の状況では有効、別の状況では逆効果」というものでしかないです。
      そういう状況になったときには「そういやフローチャートなんてものもあったな」と押入れから引っ張り出せばいいものであって、常に机に置いておくほどのもんじゃないです。

      そして、他の人がいってるように並列処理も書けないし、OOPを引き合いに出すまでもなく状態変化やマルチ状態も書けない。つまり「コンテキスト」を記述する能力が無いんですよねフローチャートには。バグは処理そのものよりも処理と絡むコンテキスト(の誤用)に宿ることが多いので、それが見えにくいフローチャートはあんまり役立たないことが多いなあ。つまり本当に数少ない特定の場面でしか有効ではなく、大抵は邪魔。

      フローなんぞより、データ構造のほうが余程大事ですし、データ構造を基準に見れば全体が判る「ように設計」すればますますバグりにくくなります。自社を倒産させたくないならば狙うべきはそっちですね。

    • 2個のコメント が現在のしきい値以下です。
  • 昔のコンパイラには識別子の長さについて制限のやたらきついものがあったので、無理やり短縮した名前にせざるを得なくなって自分でも何が何やらわけのわからない名前になってしまうことがありました。まぁアセンブラのニーモニックだってそのアーキテクチャに精通してない人にはたとえ規則性があったとしてもなんじゃこりゃ~なわけで、まぁあんな感じです。MASMだって識別子は確か31文字くらいに制限されていた時代があったはず。もっと古いアセンブラのラベルなんて8文字に制限されているものもあったり。

    というわけで、「無理やり短縮した識別子」は「もうやらなくていい昔のコーディングテクニック」です。

    --
    ペーストビン [windy.cx]
  • gonta (11642) : 2009年05月04日 13時29分 (#1558982) 日記

    malloc/freeの処理コストってどれくらいかかるんだろう。メモリがバカ高かった時代はmalloc/freeで使用量を厳密に、というのはわかるんだが、ンGB当たり前の昨今、malloc/freeの処理コストの方が高くなったりしないのかな?と。「だいたい、こんくらいとっといてぇー」というようなプログラミングスタイルは無いのだろうか、と思う。

    ・・・malloc/free叩いとらんな、最近。

    --
    -- gonta --
    "May Macintosh be with you"
    • firewheel (31280) : 2009年05月04日 14時28分 (#1559019)

      >malloc/freeの処理コストの方が高くなったりしないのかな?
      >と。「だいたい、こんくらいとっといてぇー」というようなプログラミングスタイルは無いのだろうか、と思う。

      チマチマ何回かに分けて取るより一回にまとめて取った方が相対的に安くなる
      ので、「だいたい、このくらい」でまとめて取ってから、それをアプリ内部で
      チマチマ切り刻んで使うというテクニックは昔からあったと思います。

      そしてJVMなんかだと、それを自動でやってくれるので、Javaな人にとっては
      これも「もうやらなくていい昔のコーディングテクニック」の一つですね。

      それから、OSが仮想記憶をサポートして以降は、mallocは実メモリを確保する
      わけではなくOSの管理テーブルに予約するだけなので、ちょっとくらい大きい
      領域を予約しても影響はすごく小さくなってるはずです。

      • 1個のコメント が現在のしきい値以下です。
    • malloc/freeはシステムコールなので呼ぶとコンテキストスイッチが発生します。
      特にCPUのクロック数よりもL2キャッシュのヒット率とかのほうが性能的影響が
      大きいようなメモリレイテンシにシビアなシステム、例えば、
      マルチスレッドでサイズの大きいヒープを頻繁に生成/開放しながら
      沢山のアクセスを受け付けるサーバーアプリみたいな処理系では、
      コンテキストスイッチのオーバヘッドが馬鹿にならないので、
      JVMや.Netのようにヒープの大枠確保しておいて、プロセス内部で
      cpu user timeでやりくりするメモリ管理があったほうが性能的には有利。
      というもんだと理解しとります

      • > malloc/freeはシステムコールなので呼ぶとコンテキストスイッチが発生します。

        malloc/free はシステムコールではありません。必要であれば mmap や brk などで
        ヒープの大枠を確保し、確保したヒープを切り分けること自体はユーザモードで
        行います。

        というわけで、

        > JVMや.Netのようにヒープの大枠確保しておいて、プロセス内部で
        > cpu user timeでやりくりするメモリ管理があったほうが性能的には有利。
        > というもんだと理解しとります

        JVMや.Net のメモリ管理方式には C に対してあなたが述べたような性能的な
        アドバンテージはありません。
        • 失礼。

          ページフォルトの影響を書き忘れてました。

          そうだな。。。

          ページフォルトが後からじんわり効いてくるのがいやな場合には
          プログラムの初期化部分で大きめに malloc して memset してから
          free しとく必要がありますね。

          でも JVM でもこれを避けようとしたら JVM 自体の初期化処理で
          同じことをやる必要があるはず。ですんでこれは性能的な
          アドバンテージというよりは、プログラムを数~十数ステップ程度、
          短くできるかどうかという問題ですね。

          この意味でのアドバンテージなら確かにありますね。
        • 1個のコメント が現在のしきい値以下です。
    • 5個のコメント が現在のしきい値以下です。
  • yellow tadpole (7084) : 2009年05月04日 14時26分 (#1559015) 日記

    紙メディアにカッターナイフで穴をあけたり、ハサミとセロファンテープで切り貼りしたりなど、
    物理的なテクニックは駆使してましたよ。さん孔機の順番待ちをするより早いですから。

    あとはパンチャーのおばさんにお菓子を持って行くのも、ひとつのテクニックです。

    --
    〜◍
    • nmaeda (5111) : 2009年05月04日 15時33分 (#1559042)

      紙テープを繋ぐツールが色々とありましたね。でも、こんどは高速のテープリーダにかけると、繋いだところでテープがひっかかってちぎれたりするんですよ。

      さん孔タイプライタで打ち込みに集中していたら、テープが引っかかって、横一列に穴が空いていただけっていうトラブルも見かけました。集中していても、たまには脇見をしましょう。

      あと、忘れてならないテクニックが、メインフレームのラインプリンタは筐体が大きくて余裕があるので、ものを隠すには最適ってことです。オヤツとか隠しやすい ^-^)

      • >あと、忘れてならないテクニックが、メインフレームのラインプリンタは筐体が大きくて余裕があるので、
        >ものを隠すには最適ってことです。オヤツとか隠しやすい ^-^)

        あの頃のプリンタは五月蝿かったので防音ケースに入れるか隔離されてましたね。
        #ぎりぎり紙テープを見たことのある世代

      • 2個のコメント が現在のしきい値以下です。
    • Re:昔のテクニック (スコア:2, おもしろおかしい)

      nq (16642) : 2009年05月04日 15時32分 (#1559040) 日記

      パンチカードの束をうっかり落としてバラバラになっても、すぐ順番に並べられるように、束の側面に斜めの線をマジックで引いておく。

  • シフト演算 (スコア:3, 興味深い)

    fcp (32783) : 2009年05月04日 23時20分 (#1559271) ホームページ 日記

    以前はコンパイラーが賢くなかったし乗算が遅かったので、 C 言語の入門書には「y = x * 8; でなく y = x << 3; を使いましょう」などと書かれていたものです。 z = x * 8 + 1; と等価のつもりで z = x << 3 + 1; と書いてバグったのも良い思い出です。

    • Re:シフト演算 (スコア:4, 参考になる)

      hetareDAIO (17407) : 2009年05月05日 14時13分 (#1559502) 日記

      除算も同じシフト演算で置き換えしてましたですよね。ただ、組み込み系のような、いつまで経っても進歩しないアホなコンパイラを使わざるを得ないケースとかですと、未だ現役の知識なのですw

      それはさておき、

      z = x * 8 + 1; と等価のつもりで z = x << 3 + 1; と書いてバグった

      私の場合は、演算子の優先順位というのを頭に入れるのが面倒でしたので、四則演算の組み合わせでも括弧をつける癖をつけてました。10年前はアホだの無駄だのひどい扱いを受けていましたが、今は「コーディングの鏡」扱いされるのって、複雑な気分です。

      余談ですが、CPUの命令によっては高級言語を意識した命令があって、例に挙げられたような n * { 2,4,8 } + { 0-7 } のような演算を1命令でこなせるモノもあり、コンパイラによってはちゃんと置き換えしてくれるものもありますね。昔はインラインアセンブラ使って人力コンパイルしたりしてました。

      --
      カジノを作るくらいなら、パチンコ・パチスロ税を導入しよう!
      • 除算も同じシフト演算で置き換えしてましたですよね。

        はい、除算もですね。負の数が出てくると除算と右シフトでは挙動が違ってまた悩んだりしました。

        除算も同じシフト演算で置き換えしてましたですよね。ただ、組み込み系のような、いつまで経っても進歩しないアホなコンパイラを使わざるを得ないケースとかですと、未だ現役の知識なのですw

        大変そうです……。

    • 1個のコメント が現在のしきい値以下です。
  • NOBAX (21937) : 2009年05月04日 13時10分 (#1558968)
    レジスタが少なかったので、スタックに放り込んでおいて、飛び先でPOPして使う。
    80系は裏レジを使いこなす。
    のがコツなんて古すぎて、誰もわからないか。
  • 無敵のコーディング規約でバグの無いソフトウェアを最初から納品してくださいよぉぉぉぉぉぉ!!!

    いや、まあ、昔に比べたらバグの原因が特定しやすくなってるみたいでありますが
    これがコーディング規約の力なのか?

  • 私の場合 (スコア:2, 興味深い)

    L.Entis (21733) : 2009年05月04日 14時23分 (#1559013) ホームページ 日記
    自己書き換えコードかな…

    586以降では命令キャッシュを破壊したりと不利益のほうが大きいので使う事はなくなりましたね、さすがに。
    --
    Leshade Entis
  • chess (7856) : 2009年05月04日 15時39分 (#1559047)

    for文の初期化項での変数スコープがfor文外でも有効だった件。

    可搬性のために
    #define for if(0); else for
    とかやってたよね。

  • unicodeに開発環境やコンパイラが対応するのが当たり前になるまで
    いちいち妥当な英語(難しいならローマ字)で名前付けしなくてはならないことがつらかった
    まあ変数は記述が楽なので今でも英数字使うほうが遥かに多いですけど

    私の環境ではソース見る人全員日本人なので、色々な意味で物凄く無駄な作業でした
    unicode万歳

    #今では問題ない場合メソッド名とかは処理の内容で記述してます
    #Method_出力実行_伝票() とか
  • C 言語でマクロを使って #define SQR(x) ((x) * (x)) のように関数っぽいものを定義して、「これはマクロだから副作用のある式を渡しては駄目」と意識しながら使っていたのも、過去の話です。最近僕は C 言語を使わないし、 C++ (や C99) ならインライン関数があるし。

  • とりあえず (スコア:1, 興味深い)

    Anonymous Coward : 2009年05月04日 13時12分 (#1558971)
    レガシーな環境でも動くポータブルなプログラムを書くときにはいろいろ注意を払わなければなりません。とはいえ、CだったらもうK&Rしか通らないコンパイラのことは考えなくてもいいのかな?GNU automakeに含まれているansi2knrを使う手もありますが。C++だとMozilla.orgの有名なC++ Portability Guide [mozilla.org]ってのがあって、名前空間使うなSTL使うなとか今時のC++使いが欲求不満になりそうな要件がてんこもり状態。
    • Re:とりあえず (スコア:2, 参考になる)

      Anonymous Coward : 2009年05月04日 18時09分 (#1559129)

      そのへんの制限はGecko 2で一気に取っ払われる予定で、たとえば今nsresultを使っていちいち戻り値を判定しているものはC++例外処理に置き換えられたりするようです。
      昔はキャスト演算子すら満足にそろっていないコンパイラが多くてマクロで代用していましたが(NS_REINTERPRET_CASTとか)、これはだいぶ前に解禁されてマクロは廃止されました。64ビット整数も同様の理由でサポートしていない環境では構造体にtypedefされる特別な型を使ったりしていたのですが、現在は解禁されています。

  • Anonymous Coward : 2009年05月04日 13時14分 (#1558973)
    横一列の最大スプライト数がどうこうとか、皆が最速のラインやポリゴン描画ルーチンを競って書いていた頃を知っている身としては、プログラマブルシェーダーごときで「次世代機は開発が難しくて云々~」言ってるのを見ると「何言ってんだこいつら」って感じです。
    • Anonymous Coward : 2009年05月04日 13時29分 (#1558983)

      その頃とは難しさの「質」が違いますよ。
      今のシェーダプログラミングの「難しい」は、ライティングなどのモデルにおける数学や物理の難しさで、
      昔のポリゴン描画の「難しい」は、キャッシュフェッチなどのスループット向上の難しさです。

      昔のポリゴン描画は数学ではせいぜい外積までしか使わなかったため、そういう意味では敷居が低かったと思います。

    • あなた現役のゲームプログラマですか?
      シェーダープログラミングが難しいのではなくて、シェーダーを利用する為の周辺環境を整えるのが大変なんですよ。
      DCCツール上でなるべく実機での表示に近い状態でプレビューしたり、ゲーム中でどのシェーダーを使うか管理したりと、アーティスト密に連携を取る必要がある分、最速のソフトウェアレンダラーを追求するみたいなプログラマー内で完結する仕事の方がお気楽ですよ。
  • kicchy (4711) : 2009年05月04日 13時18分 (#1558978)

    RENUM
    あとは、行番号にルーチンの固まり毎で帯域を作ったりとか
    FORループのNEXTは、変数を書かない方が速いとか。

    # って、BASIC毎にちょっとずつ違うのかな?

  • って書くとマイナスモデなんだろうなあ。

    あんなもんをあえて我慢して使わなきゃならない局面は随分減ってると思うんですけど。

    --
    署名スパムがウザい?アカウント作って非表示に設定すればスッキリさ。
    • C/C++はナイフとロープ (スコア:2, すばらしい洞察)

      Livingdead (18685) : 2009年05月04日 13時55分 (#1558993) ホームページ 日記

      普段使いはPythonとJavaとC#ですが、やはりいざって時にC/C++は頼りになる。
      なんというか、まぁナイフとロープみたいなもんじゃないでしょうか。
      日常生活ではもっと各種用途に便利な機能を備えた道具がたくさんあるけど、
      極限の状態でこの道具があったから生き残れた、みたいな。

      まぁ懐中電灯ですら金属製だと武器とみなされて軽犯罪法違反で
      警察官にしょっ引かれるらしいので、ナイフなんて所持してたら
      警察官に何されるかわかったもんじゃないですが。

      --
      ペーストビン [windy.cx]
    • Re:C/C++そのもの (スコア:2, 参考になる)

      nagika (30998) : 2009年05月04日 22時31分 (#1559250)

      高木先生の到着が遅れているようですので張ってみます。

      > > 悪しき習慣です。CやC++がプログラミングに携わる人のすべての必携の言語
      > > として蔓延りかけてしまったことは、世界の情報産業の生産性をいったいど
      > > れだけ損失させたか計り知れません。
      >
      > すべての必携の言語にCがなり得たのは、それだけ優れた言語だったからでしょう。

      いいえ。一部の人が使うのには優れていますが万人が使うべきものではあり
      ません。C以外が普及しなかったのは、様々な背景があるのであって、Cが優
      れていたからではありません。
      [JavaHouse-Brewers:28599] [java-house.jp]

      元ストーリーに沿った話だとこんな所が。

      > 知りませんでした、それではC言語においても、わざわざポインタを駆使した
      > プログラムを書く必要はないということですね。

      そのとおりです。C言語で
              for (i = 0; i < n; i++) {
                      array[i] = ...
              }
      というコードを、いまだに、わざわざ
              for (p = &array[0]; p < &array[n]; p++) {
                      *p = ...
              }
      と書いている人がいるんでしょうかね。だとしたら…誰の責任なんだろう。
      [JavaHouse-Brewers:28504 [java-house.jp]

      # しかし、もう10年前の話になるのか。。

    • 6個のコメント が現在のしきい値以下です。
  • Anonymous Coward : 2009年05月04日 14時08分 (#1559001)
    グラフィックメモリが二面分あってですねー、これを切り替えてダブルバッファリングとかしてた訳です。今となってはなつかしー。それに、二面分のすぐ上(メモリアドレス的に小さい方)に数十バイト程余分が領域もあって、ここに諸処の管理情報を入れておくと、グローバル変数的に使えて便利なのですー。最早トリビアにもなりませんねー。
  • Javaの場合 (スコア:1, 参考になる)

    Anonymous Coward : 2009年05月04日 14時09分 (#1559003)

    比較的若い言語であるJavaでも、コンパイラやVMの進化によって、今では役に立たなくなった、
    場合によっては有害になったテクニックはそれなりにあります。
    1.2ぐらいの知識のままJavaに触れている人は、少なくとも以下の記事を読んで欲しいです。

    パフォーマンスの都市伝説 [ibm.com]

  • /bin/shがbash(あるいはksh)相当になり、本当のBourne Shellがashとかbshと呼ばれるように
    なってきているので、もしかしたらexprが不要になる日も近いかもしれません。
  • Anonymous Coward : 2009年05月04日 19時21分 (#1559160)
    メモリモデルがsmallになるように、サイズ調整しまくりました。
    LSI-C 試食版にはお世話になりました。
    80286-12では辛かったけど、今試したら速いんだろうなぁ。

    Borland C++ 4.02で想定外の挙動をする場合があったので、アセンブラのソースを吐き出させて、そこだけアセンブラでコーディングし直してました。

    初期はFD運用だったので、拡張メモリでディスクキャッシュやRAM Driveを使ったりしてました。
    RC.SYSにもお世話になりました。

    DOSの時代の方が苦労したけど、楽しかった気がするなぁ。
  • yyyyyyyy (37036) : 2009年05月04日 20時46分 (#1559203)
    番兵使ってる人いる?
    俺はまだたまに使う。
  • tmki (18271) : 2009年05月05日 2時55分 (#1559347) ホームページ 日記
    昔、古いエンジニアに聞いたところによると、パンチカードでプログラムを打ち終わった後は、カードをそろえて、上面に鉛筆でウネウネと波状に線を引いたらしい。

    運搬中に転んでぶちまけても、線のカタチにカードを揃えられるから。っていうのが理由らしい。
    --
    事態は際限なく悪化する。
  • いろいろ (スコア:1, 参考になる)

    Anonymous Coward : 2009年05月05日 11時26分 (#1559430)
    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, おもしろおかしい)

    Anonymous Coward : 2009年05月04日 15時15分 (#1559033)
    どうにかなりませんか?
    毎回コメントが下品で見るに堪えません。
  • A7M (259) : 2009年05月04日 15時42分 (#1559051) ホームページ 日記
    アプリケーションハンガリアン [joelonsoftware.com]は結構有効な気はします。
    char szHogeHoge[64]のようなシステムハンガリアンを使うことについては、僕も大嫌いですが。
  • コーディング規約がいい加減な所に助っ人に行った時は、ハンガリアン記法で書いてます。
    「MFCのソースの書き方に準じております」と言えば、文句を言われる事は少ないので。
    --
    notice : I ignore an anonymous contribution.
  • Re:変数名 (スコア:1, おもしろおかしい)

    Anonymous Coward : 2009年05月04日 18時28分 (#1559139)
    コボラーを呼び出すなんてずるいぞ
  • chigira (37573) : 2009年05月04日 18時45分 (#1559149) 日記
    「//」コメントのことでしたら、コーディング規約で禁止されています。
    #使用言語はC言語です。
    #「もうやらなくていい」というより「使ってもよさそうなのに禁止」されています。

    禁止になった理由は、コメントの最後に「\」となるマルチバイト文字をつかってしまい
    (本当はコメントにしたくなかった)次の行までコメントとなってしまったからです。

    #こういうのを「馬鹿基準」と言ってる人もいますね。
    #低レベルな人に合わせて無駄な禁止事項が増えていくという。

    無駄なコーディング規約より「DRY原則遵守」で。
  • Re:ループにif文 (スコア:3, すばらしい洞察)

    fcp (32783) : 2009年05月04日 20時07分 (#1559177) ホームページ 日記

    たとえば

    if(a == b) c += a; else c += b;

    程度のコードは

    そのコードなら ADD c, c, b だけで……いえ、何でもありません。

  • Re:クロック数を数えた (スコア:3, すばらしい洞察)

    urdcat (35773) : 2009年05月04日 20時49分 (#1559205) ホームページ 日記

    最適化が必要でないところでは、徹底的にサボりますが…。

    今でもアセンブラで最適化する際は、普通にクロック数を数えますし、
    投機的実行や予測分岐、アウトオブオーダー実行を行うCPUの場合は、
    それぞれの実行状態を予測して至近値を求めたりします。
    後、昔はやらなくて良かったメモリレイテンシによる遅延なんかも、
    細かく算出して最適な挙動を考えなきゃいけません。
    レジスタページングを考慮した組み方によって、数クロックを稼ぐなんて
    当たり前ですから。

    最適化をやろうとしたら、昔よりはるかに面倒くさいです(^^;

  • backyarD (36899) : 2009年05月04日 20時55分 (#1559209) 日記

    んでもって数年後には「変数名の誤変換はいい加減にしてほしい」って話題でもりあがるのですね。

    「Dim 返り値 As Boolean」というコードを巡って..

    ・「普通は戻り値だろう?」
    ・「返り値でも日本語としては間違えてはいない(根拠を示しながら)」
    ・「いや、どうでもいいから返り血だけはやめてほしい」

    とか

  • >最悪ケースでの処理クロック数を数えたことがあります

    え?
    クロック数って数えるもんじゃなかったの? orz

    仕事じゃすっかりAsm使わなくなりましたけど(制御をCPU直でやる案件がすっかり無くなってしまって)、趣味では今でもたまに数えてます。
    リソースに恵まれていないハードでは、ソフトウェアタイマーは未だに健在。

  • 今時の制御向けCPUだと、ファンアウトが1を超えるどころか、直接LEDをドライブしてもおつりがくるくらい流せるものがあるので、バッファーかますこと自体が昔のテクニックになりつつありますねえ。

    小規模ものですと、CPUの足をI/Oにアサインすればいろんなことが直接できちゃうんで、アドレスデコードって何? ってのが今時の人なのかもしれません。

  • TTLゲート何個ドライブできるか。と言う出力端子あたりの出力電流制限値ですが?
    今時はハイインピーダンス入力でローインピーダンス出力なのが当たり前になってるのでマイコンなり標準ロジックICなりの論理出力結果をそのまんま他のICの論理入力に直結してもそうは問題が出なくなりましたが(周波数がかなり高い場合は別)、
    昔は入力のインピーダンスもそんなに高くなかったし出力インピーダンスも低くなかったので下手に直結してしまうと出力が飽和して正しい値を出力しないお(と言うか1と0の間をバタついたり、最悪の場合はICが発熱してふっとんでた)のが普通にあったのですが。

    40系統や74HC系統の標準CMOS ICが出たあたりから出力回路も改善されてきましたけど…

    # しかし、今でもワンチップマイコンにLEDとか直結するのは抵抗ありますねー

    --
    --暮らしの中に修行あり。
    blogはじめました。 [hatena.ne.jp]
  • unrollingのこと?

     Pen4 + Intel C++コンパイラですら、オプションで unrollingを指定しても、
    手で展開したほうが速かったです。
  • Pen4 + Intelコンパイラで、byteにパックされた nibbleのデータをbyteに戻すとき

    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とかだとどうなんでしょう?
  • APIによって、正常時にゼロを返す関数と、正常時にtrueを返す関数がありますね。

    前者の場合 if (hoge() == 0) {} と書きます。後者の場合 if (fuga()) {} と書きます。
    もしくは、 if (hoge() != 0) { return; } とか、 if (!fuga()) { return; } とかやって、
    異常系の場合に即座に抜けるようにしたり。苦肉の策を講じます。

    そして、しぶといバグを追いかけて1時間くらい悩んだ末、strcmp()の戻り値の分岐が間違っていただけだったりすると、激しく凹みます。

    --
    あなたの予想に反して、このページが見えているでしょうか?
  • あなた自身が変わってしまわれたのですね。

    --
    1を聞いて0を知れ!
  • >NECのミニコンで使えるCが出たのだけれど、ファイルシステムが不自由だったので、・・・
    へ~。その昔のMS(マイクロソフトじゃないですよ~)のCコンパイラ、小文字すら使えなかったので、すごく気持ちの悪いソースになりましたよ。なので、変数名には、気を使ったコーディングが、必要でした。

    実話ですが、IDで

  • kawa-t (37052) : 2009年05月06日 2時12分 (#1559857) 日記
    (define それぞれで for-each)
    (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だと最後にエラーが出ますが。何でだろう。
  • 学校の実習でZ80のアセンブラを作っていたときは、
    命令の実行ステート数とクロック周波数から動作時間を計算していました。

    自由課題の時に音階と周波数を計算してオルゴールを作ったもんだ・・・。

  • 18個のコメント が現在のしきい値以下です。