コンテンツにスキップ

宿題:C言語1#

C言語#宿題1

Homework 約30分 答え

次のSC言語プログラムをSCコード列に変換(コンパイル)せよ.

int g;
void main() {
    int i;
    g = 10;
    i = 2 + (4 * g);
}

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

IBS 1
???

回答フォーム

Answer

IBS 1
ENT 3
LDC 10
STG 1
LDC 2   // 2
LDC 4   // 4
LDG 1   // g (10)
BOP *   // *
BOP +   // +
STL 3
HLT

逆ポーランド記法通りに命令を並べれば良い.

2 + (4 * g)  // 中間記法

2 4 g * +    // LDC2, LDC4, LDG 1, BOP *, BOP +

Q&A#

:口頭での解説はスキップ

誤字#

  • 「しゃに構える」
  • call user procdure
  • 命令そのものであり
  • スタックの図 LDG 12
  • 定数変数40をロード

PPT/PDFよりWebの方がよい#

ok thx.コピペや検索できるのが良いですね.

PDFで1枚1枚区切られているのが好きではない

わかる.なおPDFが必要な人はブラウザのPDFプリンタ使って下さい.

理解度は平均4/5くらい#

ok

スタックや逆ポーランド記法,BNFなど今まで学んできた内容が噛み合わさって面白く感じた#

Great.

学んだ内容が繋がり出す瞬間はとてもおもしろいと思います.情報科学ではよくあります.最初は苦しくても,どこかで知識の繋がりが生まれて劇的に理解が進む瞬間がある.

高級言語がない時代にコンパイラはどう作られたのか?#

まず機械語やアセンブラでで非常に小さなコンパイラ(と高級言語)が作られます.そこから,そのコンパイラを使ってより大きなコンパイラ(と高級言語)を作っていきます.

このあたりは言語処理工学でやるかも.

スタックマシンの図の最下部メモリが1から始まっていることが意外だった#

C言語は0から始まるのではないのか?

これはとんでもない誤解をしている.

上記の図はC言語プログラム実行時の「実行スタック」であり,C言語プログラム内で扱う「配列」ではありません.

図中の灰色のアドレス値はメモリの物理アドレスを意味しています.メモリは直列データ構造であり,1つ1つのセルに物理アドレスが付与されています(000000~FFFFFF等).図中では起点を1としていますが,この値はOSからこのプログラムに与えられたメモリ空間の最初のアドレス値です.たまたまOSから「お前はアドレス値1から使って良いよ」と指示されたような状況です.もちろんこの値は実行の度に変動します.この1という値は,C言語ソースコード内で記述する配列アクセスa[0]0とは全く無関係です.

別の言い方をすれば,図の灰色のアドレス値を下からFF6601 FF6602 FF6603…と読み替えても構いません.実際にプログラム実行した際には,このような(OSから与えられた)のアドレス値からスタックが始まります.

大域変数を複数宣言した場合はどうなるのか?#

スタック最下部に複数の大域用セルが積み上がります.

C言語で関数の返り値の型を書かなくても実行はできた#

警告が出るだけで実行はできた

Great.おそらく古い記法なんだと思う.全く本質ではないので来年は消します.