コンテンツにスキップ

宿題:特徴と分類#

特徴と分類#宿題

Homework 約30分 答え

次のC言語プログラムを等価なRAマシンプログラムにコンパイルせよ.各変数(ansやx等)とRAマシン上のメモリセル番号(1や2等)の対応は自由に決めて良い.

void main() {
    int ans = 0;
    int x = 7;
    if (x > 5)
        ans = 10;
    else
        ans = 20;
    printf("%d", ans);
}

以下の書式をコピーして回答せよ.

  load   #0
  store  2
  ???
labelx:
  load   ???
  ???

回答フォーム

Answer

// c(1): x
// c(2): ans

  load   #0      // int ans = 0;
  store  2
  load   #7      // int x = 7;
  store  1
  load   1       // if (x > 5)    if (x - 5 > 0)
  sub    #5
  jgtz   iftrue
  jump   iffalse
iftrue:
  load   #10     // ans = 10
  store  2
  jump   ifend
iffalse:
  load   #20     // ans = 20
  store  2
  jump   ifend
ifend:
  write  2       // printf("%d", ans);
  halt

Q&A#

わかりやすかった・面白かった#

ありがとう.頑張ります.

非常に面白かったので、元気なスタイルを貫いてください。

ありがとう.

僕筋トレが好きなので、この講義が筋トレと同じだと聞いてやる気が湧きました。

筋トレ頑張って下さい.

プログラミングはどれくらい好きか?#

平均7くらい.思ったほど低くない.案外CASL IIが面白かったという人もちらほら.

RAマシンはなぜレジスタが1個だけなのか?#

話を簡単にするためです.まつ本の手が2個しかないためです.

ちなみにほ実際のCPUでもレジスタは数個です.みなさんのPCやスマホでも16個しかありません.レジスタを増やすと遅くなるし,互換性を損ないます.この記事が面白いかも.なぜCPUメーカはレジスタの数を増やさず、最先端の64ビットCPUでも16個しかないのですか?

量子コンピュータは阪大にもあります#

そうでした.失念していました.豊中キャンパスのQIQBという建物に入っています.コンビニの横です.

プログラミング言語は統一されるだろうか?#

今後、技術やAI、コンパイラなどが発展していくことで、複数の言語を使い分ける必要がなくなり、様々な用途に対応できる一つのプログラミング言語に集約されていく可能性はあるのでしょうか。

面白い.

ただ可能性は低いと思う.まずマイナー言語は駆逐されそう.「学習データが少ない→AIが苦手になる→使われない」の悪循環が起きるため.Python/JS/Javaは逆に好循環が生まれる.ただし,どこまでいっても言語ごとの得意分野があって両立は難しいです.トレードオフになりがちです.また後方互換もやっかいな問題です.最強のプログラミング言語を作ったとして,既存システムを全て捨てるわけにはいかない (技術的慣性とも呼びます).

量子コンピュータは何がすごい?#

ノイマン型コンピュータのボトルネックを解決するのは、量子コンピュータという認識であっていますか?

違います.

量子コンピュータは古典コンピュータ(現在のコンピュータのこと)とは全く違う原理で動いています.よって,古典では効率的な解法(アルゴリズム)がなかった問題に対して,効率的な解法がある場合があります.素因数分解が有名です.量子コンピュータは素因数分解を解く効率的なアルゴリズムが発見されています.量子コンピュータはすごく高速というわけではなく,特定の問題に対して新しい解き方ができる仕組みだと考えるとよいです.

ノイマンボトルネックの対策の典型はL1キャッシュ等であり,みなさんのPCにも入っています.

次に何言語を学べばよいだろう#

今後JavaScriptなどのWebサイト系を除く言語の内,エンジニアとして主要または必須となってくるものは何だと思われますか.次の言語としてC++を勉強していこうと考えているので参考にしたいです.

良い質問.

まず,Cのような抽象度が低い(剥き出しの)言語はお勧めです.利便性は低く初学者は大変ですが,抽象度が低い分自分で制御しないといけない部分が多く,コンピュータの仕組みをより深く理解できます.また逆にRustもお勧めです.C系とは全く違う優れたアイデアをたくさん採用しており,C系で得た「当たり前」が破壊されるのが面白いです.

加えてプログラミング言語そのものではなく,プログラミング言語を学ぶ過程で得られる何かも重要です.たとえばデバッグ能力や問題特定能力です.また道筋を立てて作業を洗い出し,優先順位をつける能力も必須です.仕事全般の「うまさ」ですね.

技術の観点では,プログラミング周辺の開発ツールやプラクティスも重要です.シェル・Git・CI・ビルドツール等は生成系AIの利用を前提にした開発でも必須技術です.

講義資料で何か参考にしているサイトはありますか#

参考Webサイトは特にはないです.学生の意見を参考にしています.

OSSコミットもしようと勉強しています#

頑張って下さい.すごく前向きな取り組みだと思います.

今でもFortranを使う理由はあるか?#

新しく誕生したプログラミング言語がある中で元祖のFortranを使用するメリットは何でしょうか?

スパコンや科学計算に使われています.コンパイラの最適化が効きやすい・並列化しやすい・数学由来のプログラミング言語であり書きやすい,等が理由です.

デザインパターンを学ぶ良い書籍は?#

デザインパターンについても書籍を購入して勉強しているのですが,いまいち使いどころがつかめていない気がします.おすすめの勉強法や書籍があれば教えていただきたいです.

わかる.ふわっとしてて飲み込みにくいのはよくわかります.『Java言語で学ぶデザインパターン入門』が良いと思います.

学ぶ際はどう解決するか(how)よりも,何を解決したいのか(why)を重点的に理解すると良いです.もちろんhow自体も技術的に面白いのですが,何か問題に直面した際に「あのパターンが使えそう」と想起できることが重要です.頭の中の使える工具を増やす,と考えてください.想起さえできればhowはまた検索すれば良い.

宿題のなりすまし対策をした方が良いかも#

学籍番号と名前だけだとなりすましができるかもしれないので、大学のメールアドレスなども入力事項に追加したほうがいいかもしれません

わかる.ただ入力を少なくしたい気持ちもある.

機械語のタイポ#

プログラミング言語の機械語の例についてです。

0000 0000 0001   // load  B  
0001 0000 0010   // add   C  
0010 0000 0011   // store A  
とありますが、下の図にある番地と記号番地の対応(A: 1, B: 2, C: 3)を考えると
0000 0000 0010   // load  B  
0001 0000 0011   // add   C  
0010 0000 0001   // store A  
の方が正しいのではと考えます。

thx 直しておきます.適当に書いてました.