パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

コンピューターサイエンスのカリキュラムに不足しているものは?」記事へのコメント

  • 計算機がどのように動いているのか、データと命令とか、値としての 20h と スペース文字の区別がつかないとか、そういう事をまずは一旦理解してから高級言語へと移行するべきだと思うんだ。別に長大なプログラムをアセンブラで組めるようになれ、という意味じゃなく。

    最初から高級言語だと、その高級言語が何に依存しているのか判らないんで、「床を踏み抜く」的な間違いをしでかしてしまう。

    --
    fjの教祖様
    • by plauda (46850) on 2014年08月10日 22時17分 (#2654456)

      どんな未来に最適化するかで、機械語の教育の必要性は変わっていきそうですね。
      直接使用する業種があれば言うに及ばずですが、ほとんどの場合は「必要ない」のが現状。

      機械語は、必要な人はハード制御、コンパイラ、仮想化分野、ハイパフォーマンス分野あたりで、
      それ以外は、一部のコーダーがデバッグの為に知っておいたほうが良い程度。
      つまり、大量雇用される末端のコーダーには不要で、そのためにわざわざ時間を割くのか……という話で、
      コンパイラだけ見ても、Microsoft、Intelなどほぼ米国に主要な技術が集中している以上は、
      日本は作る側というより、それに乗っかる側というのがトレンドなのも、必要性を感じさせない一因でしょう。

      個人的には、歴史では「137億年の物語」みたいのが流行っていますが、
      チューリングマシンから機械語へのつながり、TRONプロジェクトや、
      CPU周りの黒歴史、OSSがビジネスに取り入れられた経緯とか、
      まとめて講義できないものかなと。

      歴史とか、なぜそれ(例えば機械語)が必要になったのか?
      といった理念が大事に思い始めているのは年寄りになった証拠なのだろうか。

      親コメント
      • by Anonymous Coward

        作業員になりたいのなら、機械語なんてもちろんいらない。
        でも、学位を取りたいのなら、機械語(を学ぶことで、機械がなぜこのように設計されているのかを理解すること)くらい必要でしょう。

        ストーリーの文によると、いま話題になっているのはコンピュータサイエンスの学位だそうですので。

        > 歴史とか、なぜそれ(例えば機械語)が必要になったのか?

        なぜそれが必要になったのかを理解できれば、その必要性の程度も理解できますから、
        他の必要性と衝突し、どちらかを選ばないといけない場面で、どちらのほうがより必要性が高いかを自分で判断できますね。

    • 頭が悪かったので、コンピュータ業界をあきらめた爺の寝言です。

      8086が世に出たころ、医学生だった爺はバイトでPC作ってました。当時は

      1. 基板をおこして、プロセッサ、メモリ、周辺の石を乗せる
      2. ハンドラを書いて、ROMに焼く(アセンブラないしはCでコーディング)
      3. 画面に文字が出るまで四苦八苦(文字化けしていても何か表示されたら後は何とかなる)

      当時の私は、「出来そこないのハードウェアを蘇らせるのがプログラマの仕事」と信じていました。

      しかし、386が普及してから、ハードウェアを扱うことはほとんどなくなりました。 (システムプログラマは別として)アプリケーションプログラマはハードウェアの呪縛から解放された訳です。 しかし、今でもコンピュータはハードウェア基盤の上に成り立っているんですよね。

      本題に戻ります。私 javaは大嫌いです(と言いつつ、使ってますが・・・)。

      • 下層(ネイティブIOインタフェースあるいはBIOS呼び出し)で何が起こっているのかわからない
      • ハードウェアにアクセスする場合、ライブラリを信じるしかない(抜け道がない)
      • クラスファインダの癖で、ときどきドツボにはまる(eclipse使わないのがいけない?)
      • プログラマは肉体労働者、java VMが神って関係が気にいらない(おいら vi以外信じない)

      javaが目指したもの(ハードウェア非依存)は間違っていないけど、その対価は小さくない。

      頭の固い爺は「PCは道具」だと信じて疑いません。 時間がたつと画面が変わるUIは、とても不愉快(UXなんて糞くらえ。余計なことするな)。 今どきのプログラマは労力をつぎこむ先が間違っているようにも感じています。

      386以降(ARM含む)のプログラミングは、「ハードエウェアは壁(OS)の向こう」です。 問題はC信仰か java信仰かじゃなく、ハードウェア依存か処理系依存か?じゃないですか?。 ハードウェア依存の時代は、泥くさかったけど、今より夢があった。

      以上、爺のたわごと。時計の針は元に戻せない。今でもOSハック(sys call改造)すれば穴開けれるけど・・・。

      親コメント
    • >最初から高級言語だと、その高級言語が何に依存しているのか判らないんで、「床を踏み抜く」的な間違いをしでかしてしまう。

      JAVAというかオブジェクト指向言語自体、リソースが十分にあるという前提のもとの、(広義の)富豪プログラミングの一種なのですが、
      タレコミのようにJAVAしかやってないと、そういう感覚が持てないんでしょうね。

      親コメント
    • by Anonymous Coward

      Cで書いててポインタがわからないと言っている人は、その基礎をやってないからだと思う。

    • by Anonymous Coward

      ほぼ同意だが、順番はどうなんだろう?高級言語やってからハードに降りていくのは無理なのだろうか

      •  1回で覚えるようなものではないので、繰り替えして欲しいと思います。
        最初に、1つの講義でハード・機械語から高級言語まで実習を交えて教えて、
        そのあとでパラレルで良いのでそれぞれを実習を交えて教えて行って欲しいと思います。

        親コメント
      • 自分が問題だと思っている点としては、
        C以外になかなか素直にハードまで降りていける高級言語が無いところです。

        まず、インタプリタ言語は総てNG。
        なぜなら、できたプログラムをCPUが実際にどう実行するか、つまり
        CPUに投げられる命令列を見ることができないから。
        次に、コンパイルされる言語でも、Javaなどバイトコードベースのものは同様の理由でNG.
        第三に、haskellなどネイディブコードコンパイラ付き言語でも、出来上がったコードが読みにくければNG.
        これに関しては自信がありませんが、遅延評価のためのコードや型判定ロジックなど(コンパイル時に消える)によって
        Cやアセンブリコードの背景とは相容れない意味不明な命令列が出来上がると予想しています。
        噂では、コンパイラの時点でフォンノイマン型とはべつの計算機モデルを使っているとか?聞きました。

        よってCommon Lisp を推します。


        CL-USER> (defun factorial (n) (if (zerop n) 1 (* n (factorial (1- n)))))
        FACTORIAL
        CL-USER> (disassemble #'factorial)
        ; disassembly for FACTORIAL
        ; Size: 101 bytes. Origin: #x1007E081D9
        ; 1D9: 488B55F8 MOV RDX, [RBP-8] ; no-arg-parsing entry point
        ; 1DD: 31FF XOR EDI, EDI
        ; 1DF: B929040020 MOV ECX, 536871977 ; GENERIC-=
        ; 1E4: FFD1 CALL RCX
        ; 1E6: 744A JEQ L1
        ; 1E8: 488B55F8 MOV RDX, [RBP-8]
        ; 1EC: BF02000000 MOV EDI, 2
        ; 1F1: 41BB05020020 MOV R11D, 536871429 ; GENERIC--
        ; 1F7: 41FFD3 CALL R11
        ; 1FA: 488D5C24F0 LEA RBX, [RSP-16]
        ; 1FF: 4883EC18 SUB RSP, 24
        ; 203: 488B0576FFFFFF MOV RAX, [RIP-138] ; #
        ; 20A: B902000000 MOV ECX, 2
        ; 20F: 48892B MOV [RBX], RBP
        ; 212: 488BEB MOV RBP, RBX
        ; 215: FF5009 CALL QWORD PTR [RAX+9]
        ; 218: 480F42E3 CMOVB RSP, RBX
        ; 21C: 488BFA MOV RDI, RDX
        ; 21F: 488B55F8 MOV RDX, [RBP-8]
        ; 223: 41BB6B020020 MOV R11D, 536871531 ; GENERIC-*
        ; 229: 41FFD3 CALL R11
        ; 22C: L0: 488BE5 MOV RSP, RBP
        ; 22F: F8 CLC
        ; 230: 5D POP RBP
        ; 231: C3 RET
        ; 232: L1: BA02000000 MOV EDX, 2
        ; 237: EBF3 JMP L0
        ; 239: CC0A BREAK 10 ; error trap
        ; 23B: 02 BYTE #X02
        ; 23C: 19 BYTE #X19 ; INVALID-ARG-COUNT-ERROR
        ; 23D: 9A BYTE #X9A ; RCX
        NIL

        --
        新人。プログラマレベルをポケモンで言うと、コラッタぐらい
        親コメント
      • 順番は大事でしょうね。プログラミングにかぎらず、本人の中で確定してしまったものを変えるのって難しいですし(これは啓発的な出会いがあるわけでもない)。
        親コメント
      • by Anonymous Coward

        昔はやりたいことやるためにハードに降りて行ったけど、今はそうしなくても何とかなっちゃうからな。

      • by Anonymous Coward

        でも数回あったスラドでまず学習すべき言語は?
        の問いではたいてい高級言語だったりしたんだよな

    • by Anonymous Coward

      i386 だとアドレッシングモードとか煩雑なので Z80 エミュレータと zasm を使用して演習しています。メモリに番地があって 0 番地から順番に実行される。命令もデータもメモリに置かれるなんてことを学生に理解してもらうのに苦労しています。それでもやらないよりはましだと信じている。

      • by Anonymous Coward

        そんな単純なことを学生が理解できないなんて理解できない。
        どういう思考してるんだ?
        もしかして、かけ算のやり方から教えているような大学か?

        • by Anonymous Coward on 2014年08月10日 20時57分 (#2654407)

          現代のPC環境は、OSも開発環境も徹底的にそういったローレベルの情報を隠蔽してるので、
          理屈として暗記することは出来ても、実感がわかないんじゃないでしょうか。

          国立非帝大の割と上位の大学出身ですが、元ACのような説明をしてくれる授業がありました。
          が、同級生には怪訝な顔をしてるのが多かったですね。

          親コメント
        • by Anonymous Coward on 2014年08月10日 23時54分 (#2654489)

          > かけ算のやり方から教えているような大学か?

          せっかく、Z80なんだから、かけ算のやり方を教えなくてどうする!
          インストラクションが少ないのは良いことだ。

          親コメント
          • by Anonymous Coward

            ; 9 * 9

            LD A,9
            LD B,9

            LOOP:
            ADD A,A
            DJNZ LOOP

            • by Anonymous Coward

              ネタなのかマジなのかわからない...。

              • by Anonymous Coward

                別ACだが、9*(2^9)になっとる?

              • by Anonymous Coward

                そんな感じの計算ですね。
                もっとも8ビットなので桁あふれして結果は0になっていますが...。

        • by Anonymous Coward

          そんな単純なことを大人が理解できないなんて理解できない
          どういう思考してるんだ?
          もしかして、現状の教育現場なんて一切見た事なくて、大昔を美化した理想で語ってるのか?

          • by Anonymous Coward

            そりゃ、/.Jに参加する人の大部分は教育関係者以外でしょうから、教育現場なんて見たことないと思いますよ。

            理想と現実はどう違うのか、教育関係者が語ってもらわないことには、分かりません。

        • by Anonymous Coward

          いや足し算さえ出来れば計算機の仕事はできる。
          小学生でも頑張ればきっとできる!

      • by Anonymous Coward

        いっそワンボードマイコン使って演習してはどうでしょうか。実物が目の前にあると理解が早そうな気がします。

        • by Anonymous Coward
          リレー式計算機なら実際にCPUの歓声が聞こえて実感が湧くと思う。
        • by Anonymous Coward

          マイコンだと、一部ではプログラムメモリがフラッシュメモリ=固定で、
          揮発性の汎用レジスタと分かれていたりするのでちょっと危険

    • by Anonymous Coward

      そもそも計算機がどう動いているかというと、マイクロコード、ハーバード・アーキテクチャ、バスアービトレーション、
      フリップフロップ、クロック、AND/OR/NOTゲート、トランジスタ、半導体、電圧・電流・電荷、電子、・・・

      とりあえず、クオークとレプトンとは?辺りから学習すればいいのですか?

      • クォークとか、そういう極端な話をし始めるのはよくないね。

        本来は、就職のための勉強なら専門学校でやればいいはずだが
        良くも悪くも4大進学を望む人が多すぎて、就職予備校化してしまっているのが問題の一端ですね。

        もう、専門学校にも4年制を設けて、準大卒扱いにして、流行りの言語の指導だけ、
        処理系の使い方だけが知りたいひとはそっちに行くようにしたほうがいいんじゃないかな。

        個人的には、
        コンピュータサイエンスなら、語句解析や意味解析などを自作して言語を作るような講義や
        論理ゲートやHDLを使って簡易CPUを作るとかの内容がメインであるべきではと思うね。
        そっから先の半導体の実装とかの話は電子工学とか物理化学とかだから、
        概論で触るだけで、それ以上は"学部"でやるような内容では無いかと。

        --
        [Q][W][E][R][T][Y]
        親コメント
        • by Anonymous Coward

          あらかじめ仕様が与えられた言語のコンパイラを作ったり、HDLでプロセッサを作成する実験は情報系の学科ならどこでもやることではないんでしょうか……?

        • by Anonymous Coward

          本家の記事なので専門学校は全然関係ないのでは。

        • by Anonymous Coward

          もともとの話が。

          Java勉強してきた人を、
          メモリ管理もわからない素人って批判するのも、
          極端な話だということですよね?

      • by Anonymous Coward

        自然界がそうなっている、というのと、人間が設計して作った、というのは区別したほうがよいのでは。

        また、人間が設計して作ったものの中でも、コンピュータを実現するための多数ある実装方法のひとつなのか、
        (すくなくとも現行方式の)コンピュータの本質そのものなのか、も区別したほうがよいのでは。

    • by Anonymous Coward

      単に自分が理解できる一番低レベルなところを基礎としているだけ。

      C言語は知っているけれどアセンブリ言語はやったことのないうちの上司は、
      アセンブリ言語までは必要ないけれどCは基礎だから、と言っていますし。

      アセンブリ言語が普通に使われていたころは、
      ワイヤードロジックも理解せずにプログラムができるか、
      とか年寄りが言っていたはず。

      単に古来からある「最近の若い者は」現象にすぎませんね。

    • by Anonymous Coward

      それで出来上がるのが教祖様なら、やめておいた方がいいと思うがね

    • by Anonymous Coward

      基礎ってチューリングマシンとかの数学じゃないの?

    • by Anonymous Coward

      基礎ってチューリングマシンとかの数学理論じゃないの?

    • by Anonymous Coward

      最初に覚えた言語の影響を受けすぎの人が結構いる。
      その次に覚えようとするときに、すでに知っている言語で強引に置き換えようとする
      ○○言語でいえば、こういうことだよねって置き換えることができないとき、分からないっていってしまう。
      最初に覚えたときは、なにも知らないのでおきかえれなかったはず、同じように理解すればいいのに

    • by Anonymous Coward

      それは基礎ではなくて初歩

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

処理中...