C言語でのコンパイラの作成方法
C言語でのコンパイラの作成方法
C言語初心者のため、稚拙な文章になる可能性があることを最初にお詫びします。
現在Microsoft社のMicrosoft Visual C++ 6.0を用いてCドライブのルートにある「temp.c」というソースファイルをコンパイルするアプリケーションを作ろうと思っているのですが、ネット上で「C言語 コンパイラ 作成」等と検索しても、既にコンパイラがあることを前提としたホームページしか見つけることができず、肝心のコンパイラをどのように作ったらよいのかということが載ったホームページが見つかりません。
というわけで、今回はコンパイラをどのように作ったらよいのかというヒントだけでもいいので教えて頂けないかと思い投稿させて頂きました。
ちなみに「temp.c」はそこまで複雑なソースではなく、DOS上のアプリで、リソースやアイコンなどは用いないものです。
そもそも「コンパイラを作る」ということ自体が愚かな行為なのかと思ったりもします。
私が所持しているBcpadやMicrosoft Visual C++ 6.0に付属している既存のコンパイラを利用するということも考えたのですが、BcpadやMicrosoft Visual C++ 6.0の本体以外からコンパイラをどのように利用していいのかもわかりません。
どうぞ忌憚の無い意見をよろしくお願いします。
ちなみにOSはXPのSP3です。
投稿日時 - 2009-01-08 16:46:39
あの・・・水を差すようで恐縮しますが
それって「コンパイラを作る」ではなくて
「コンパイラを呼び出す」だけでは?
ボタンを押したら
外部プログラムとして cc コマンドを実行するだけ…。
最近 C++ やってないんで忘れましたが WinExecとか CreateProcess とか使って…。もちろん環境変数や実行パラメータはきちんとセットした上でですけど…。Microsoft Visual C++ 6.0でもコマンドプロンプトだけでコンパイルできますから。
投稿日時 - 2009-01-09 00:59:22
お礼
恥ずかしい話ですが、正にその通りでした。
コマンドプロンプトでコンパイラを呼び出すという初歩的な方法を忘れていました。
コマンドを打ち込んでコンパイルするということをしばらくの間やっていなかったせいですっぽりとその考えがぬけていました。
おかげさまで、Microsoft Visual C++ 6.0のバッチファイルを呼び出して、コマンドプロンプト上で「cl C:\temp.c」を実行するプログラムを組むことにより疑問は完全に解決致しました。
本当にありがとうございました。
投稿日時 - 2009-01-09 14:10:07
0人が「このQ&Aが役に立った」と投票しています
回答(8)
いきなり C言語のフルセットを作ろうとは考えない事。
第一歩は超サブセット。
main(){} のみ。
使える関数はputs()のみ。
変数は無し。
なんか簡単そうでしょう。
それが出来たら(きっとできます)
次は関数の追加、 戻り値を判定して呼び出す関数を変える機能。
まだ変数は無し。
非常に単純処理系から思わぬ大きな収穫を得る事でしょう。
投稿日時 - 2009-01-08 21:41:54
なるほど、いきなりソースファイルならばなんでもコンパイルできるものを考えるのではなく、いたって単純なソースからコンパイルする方法を考えるということですね。
コンパイラを1から作るということになったら参考にさせて頂きたいと思います。
アドバイスありがとうございました。
投稿日時 - 2009-01-08 23:22:13
アマゾンで「コンパイラ」で検索すればコンパイラの作り方を解説した書籍が各種見つかります。
実行効率を考えずANSIに準拠しようとか思わなければ作る事自体はそれほど「無謀」では無いと思います。
分かりやすかったのは
http://www.amazon.co.jp/dp/4839919232
Javaで書いてるのでC言語しか読めないとつらいかも。
ネイティブでなくても良ければ
http://www.amazon.co.jp/dp/4839919232
とかは良いかもしれません。
投稿日時 - 2009-01-08 21:04:23
アドバイスありがとうございます。
とりあえず他の方のアドバイス等も参考にさせて頂いて、1からコンパイラを作るというのはやめようと思います。
いつか必要な時からきたら参照させていただきたいと思います。
投稿日時 - 2009-01-08 23:20:35
もちろん、最初の物を除く多くのC言語コンパイラは、
それ以前に存在したC言語コンパイラとリンカによって
作成されました。
しかも、我々よりC言語と機械語に精通し、我慢強く、
極めて優秀な多くのプロたちが、何年もかけて作成したものです。
「初心者」はおろか、超つきのプロフェショナルでも、
コンパイラの作成にはしりごみします。
ただし十分な経験をつめば*.objを出力できるコンパイラコードを
書けるようになるかもしれません。
まず、もっと簡単なものから挑戦しましょう。
投稿日時 - 2009-01-08 19:06:43
返信ありがとうございます。
他の方のアドバイス等も考慮し、コンパイラを1から作るというのは今の私では不可能であるということがわかりました。
それでは、もう既に存在しているコンパイラを利用したアプリケーションを作ることは可能なのでしょうか。
ちょっと説明がうまく行くかどうかわからないのですが、たとえば私が作ったアプリケーションを起動すると、アプリケーションのウィンドウに「コンパイル」と書かれたボタンがあり、そのボタンを押すとCドライブのルートにあるソースファイルがコンパイルされるようなアプリケーションです。
投稿日時 - 2009-01-08 23:17:20
すみません, 何を意図しているのかが今一つ見えないので確認させてください. あなたがやりたいのは
・既にあるコンパイラを使ってソースファイルをコンパイルするアプリケーションを作る
・コンパイラがあることは知っているけどそれとは別に新しくコンパイラを作る
のどちらなんでしょうか?
あなたの文章の前半は後者を意図しているように読めるのですが, 「そもそも」以降は前者を意図しているようにも読めます.
投稿日時 - 2009-01-08 17:00:17
すいません、ちょっと説明が足りなかったです。
Cドライブのルートにあるソースファイルをコンパイルしたいだけならば、Microsoft Visual C++ 6.0からソースファイルを開いてコンパイルすればいいだけの話ですね。
そういうことではなく、あくまで別のアプリケーションを作って、そのアプリケーションを起動すると「コンパイル」というボタンがあって、そのボタンを押すとCドライブのルートにあるソースファイルをコンパイルしてくれるようなアプリケーションを作りたいのです。
今のところ、既にあるコンパイラをどうにか利用して作ろうかと思っています。
投稿日時 - 2009-01-08 23:22:56
返信ありがとうございます。
結果から言ってしまえば、私はその二つの選択肢のどちらでもいいので、Cドライブのルートにあるソースファイルをコンパイルしたいだけなのです。
ただ、他の方のアドバイスから考えると、後者は難しいのかもしれないですね。
投稿日時 - 2009-01-08 23:13:42
スポンサーサイト検索
新着
注目ピックアップ
おすすめリンク