人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

基本的なことにて、失礼します。
エディターや表計算など、いろいろな既存のアプリがあります。
なにげに、文字や計算結果等が出力されますが、アプリをダウンロードするとき、コンパイラーも一緒にダウンロードされているのものなのでしょうか。
よろしく、お願いいたします。

●質問者: torimaki
●カテゴリ:コンピュータ 政治・社会
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● みやど

コンパイルした結果がダウンロードされれば、コンパイラーはユーザーには必要ありません。


torimakiさんのコメント
ご回答、ありがとうございます。 たとえば、WordやExcelなど、コンパイラーは意識することもなく、裏方として働いていてくれる...という感じでしょうか。

みやどさんのコメント
あなたがばらばらの状態の家具を買ってあなたが組み立てて使う場合は、専用の工具が入っていることはあります。 しかし、組み立てられた状態の家具を買う場合は、工具が入っている必要はありません。コンパイラーというのはこの工具のようなものです。

torimakiさんのコメント
コメント、ありがとうございます。 「専用の工具」=コンパイラーのファイルの存在が確認できると、実感がわきます。 なんでも結構です。もしMacをお使いのようでしたら、コンパイラーのファイルまでのパスを例示していただけると助かります。

みやどさんのコメント
Macユーザーですが、バージョンによってもプログラム言語によっても違いますし、最近はプロが(あるいは素人が勉強のために)無料ダウンロードして使うものはあらかじめ入れておく必要はないというつもりかと思います。 「mac(バージョン名)(プログラム言語名)」で検索してみましょう。

torimakiさんのコメント
ありがとうございます。 たとえばMacに入っている「メモ」や「テキストエディット」のコンパイラーは、どこにあるのでしょう。 ご存知なら、ぜひ。

みやどさんのコメント
そういう開発者向けツールはこういったところから手に入るはずです。 あるいは企業秘密ツールもあるのかもしれませんが、もちろんそういうのは手に入りません。 https://developer.apple.com/jp/

torimakiさんのコメント
Macに最初から入っているアプリとして、たとえば「メモ」や「テキストエディット」があります。 文字を打ちます。これはパソコン自身は読むことができません。読めるようにマシーン語に変換される必要がありそうです。で、「翻訳」するアプリケーションとして、コンパイラーが人知れず動作している気がするんです...

みやどさんのコメント
「メモ」を作るためのプログラミング言語を機械語に翻訳するのにコンパイラーが必要です。 ユーザーが「メモ」に文字を入力したものはコンピューターの内部には機械語(0と1だけの羅列)として保存されていますが、それはコンパイラーでなく「メモ」というソフトウェアの機能で行われています。そして「メモ」を開くと普通の文字で表示されるのも逆をやっているわけですが、それも「メモ」というソフトウェアの機能で行われています。

torimakiさんのコメント
「メモ」について。 コンピュータ内部に保存される、その機械語は、コンパイラーにより変換されたのでしょうか。

みやどさんのコメント
ユーザーが入力したのは違います。

2 ● ぽけっとしすてむ
ベストアンサー

場合によりますが、一般的には「ライブラリ」と呼ばれる部品となったものを纏めてダウンロードしています。

例えば、現在見ているこのページを表示するブラウザの場合、データを送受信する部品、ページを表示させるために使う部品、JavaScriptを実行する部品などを組み合わせて表示させています。

アプリの中に埋め込んだり、他のアプリでも使いまわす事ができるように分離してあったりと、様々です。

ライブラリの中には、機能によって呼ばれ方が変わるものもあります。

データを小さく効率よく取り扱うために変換(エンコード)したファイルを元に戻して動画や音声に変えるデコーダーなどがあります。

OSにあらかじめ含まれている部品(ライブラリ)のみで動作するアプリの場合は、アプリ本体をダウンロードするだけで済みます。

しかし、OSに元々準備されているライブラリよりも新しい開発環境に対応したアプリが動作できるように「Visual C++ 再頒布可能パッケージ」といったライブラリをダウンロード・インストールする場合もあります。次世代となるバージョンのOSには基本的に含まれるため、利用者によっては不要に見えることもあります。

最後に、Linuxなどで時折行われるパターンとなりますが、アプリのソースコードをダウンロードして、利用したい環境に合わせてコンパイル・実行するために、コンパイラのダウンロードが必要となることがあります。


torimakiさんのコメント
ご回答、ありがとうございます。 毎日、お世話になっているブラウザーもコンパイラーが介在しているのですね。 OSに組み込まれているもの、必要に応じてダウンロードするもの、それに既存のものと依存し合ったりして...コンパイラーといっても、いろいろなパターンがあるという...そういうふうに解釈してみました。

ぽけっとしすてむさんのコメント
コメントの訂正となりますが、ライブラリはコンパイラではありません。

torimakiさんのコメント
承知しました。ありがとうございます。

3 ● 椶櫚

プログラミング言語を機械語に置き換える作業の事をコンパイル、それを実行するプログラムの事をコンパイラと呼びます。プログラミング言語は人間が理解できる形なんですがCPUにとってはちんぷんかんぷんなので、これをそのままCPUに渡しても実行する事ができません。そこでコンパイルという、プログラミング言語から機械語へと翻訳する作業が必要となるわけです。


例えば多くのプログラミング言語では四則演算が当たり前のように使えますが、CPUには加算減算の命令セットはあるものの、乗算除算の命令セットがありませんので、後者についてはコンパイルする過程で乗算除算を「再現できるように」やや長文の機械語が配列されます。


つまり、コンパイラ(翻訳者)を必要とするのはプログラミング言語の段階ですので、機械語に置き換わった後にはコンパイラ(翻訳者)を必要としません。アプリと呼ばれるのは基本的にコンパイル後(翻訳後)の機械語の塊なので、コンパイラを必要とせずそのまま実行できます。


torimakiさんのコメント
ご回答、ありがとうございます。分かりやすい解説、ありがとうございます。 2つ質問させてください。とても基本的なこととなります。恐縮です。 1) 最後の一文「アプリと呼ばれるのは基本的にコンパイル後(翻訳後)の機械語の塊なので、コンパイラを必要とせずそのまま実行できます」について。 たとえばExcelのセルに、1,2,3,4と入力します。 その上で、記述したすべてのセルを選択し、「Σ合計」を 実行すると、10と出ます。 この過程では、裏方として、コンパイラーは動作しているのでしょうか、していないのでしょうか。 2) (人にわかる)プログラミング言語 →コンパイル→(コンピュータに分かるように)機械語 となりますが、 今度は、逆方向に、 機械語→(人に分かるように)表示される際にも、 コンパイラーが、その役割を担っているのでしょうか。あるいは違うソフトウェアが担っているのでしょうか。 よろしくお願いいたします。

椶櫚さんのコメント
1) 動作していません。それは例えるならば、 テレビの映像を映すためには制作に携わった工場の作業員が必要でしょうか? というような質問です。 映像を映すために必要なのは、放送電波であるとかDVDであるとかの、 元々テレビ本体には備わっていない外部の情報ですよね?。 テレビはそうした外部からの信号を、 「規則どおり」変換して映し出しているに過ぎません。 セルの入力情報も外部からの情報です。 元々アプリ本体に備わっているわけではありません。 アプリはそうした外部からの入力情報を元に、 「規則どおり」に実行したものが出力結果というわけ。 さらに言えば、その「規則」を規定するのがプログラムというわけです。 プログラムは設計図、コンパイルは工場での組立、アプリは完成品、みたいな? 2) > 機械語→(人に分かるように)表示される際にも、 これがまず不可能です。コンパイルは不可逆だと思ってください。 コンパイルの際に機械語の最適化(無駄な処理を効率的にするための置き換え) がなされるのですでに原型を留めていないからです。 可能なのはせいぜい逆アセンブル、 つまり機械語をニーモニックに置き換える程度のところまでです。 (ニーモニックとは要するにアセンブラの事なので一般人には敷居が高いです)

torimakiさんのコメント
1)について、 セルに打ち込んだ1,2,3,4、および「合計」は、パソコンには理解できず、コンパイラーにより、パソコンが理解できるマシーン語に、一度、変換される必要があると思うんです。パソコン自身は、マシーン語に変換されていないと、「規則」も分からないと思ったりしますが.. 2)について 説明の仕方が悪かったようです。恐縮です。 コンパイルされたデータの結果は、今度は、人に分かるように返ってきます。 本コメントのExcelの例で言えば、10が返ってきます。 コンパイラーというのは、マシーン語に変換するだけでなく、その後の、人に分かる結果(この場合は10です)まで行うアプリケーションなのでしょうか、それとも、後者は、コンパイラーとは、また違うアプリケーションが働いているのでしょうか。

椶櫚さんのコメント
> セルに打ち込んだ1,2,3,4、および「合計」は、パソコンには理解できず パソコンはデータの意味を理解する必要がありません。 入力されたデータを指定された通りに加工し、出力すればいいのです。 もう一度言います、データの意味を理解しなくてもいいのです。 極端な話、人工知能(AI)だってプログラマの指示した通りに動いているに過ぎず、 意思を持って人間と会話したり思考したりしているわけではありません。 # もちろん知性なんてかけらもありません # 知性「もどき」をシミュレートするプログラムは存在しますが # 喜怒哀楽の感情も無ければ好き嫌いや愛憎の感情もありません > コンパイラーというのは、マシーン語に変換するだけでなく、その後の、人に分かる結果(この場合は10です)まで行うアプリケーションなのでしょうか 違います。人間のプログラマが、これこれこういう動作をしなさいよ、 と命令(プログラム)した通りに動いているに過ぎないのです。 コンパイラはあくまでプログラムを機械語に翻訳するだけ。 なぜか、人間の書いたプログラムは、 そのままではコンピュータが実行できないからです。 アプリは機械語ですのでコンピュータが実行できます。 でもアプリが外部から受け取るデータ、その内容を理解する必要はありません。 たぶんここの表現が悪いです > パソコンが理解できるマシーン語 「パソコンが実行できるマシン語」、が正解。 では実行できないマシン語を実行するとどうなるのか? アプリが暴走します(コントロールが帰ってきません)。

椶櫚さんのコメント
例えば、人工衛星打ち上げの際の軌道計算は、 とてもコンピュータなしではできない、と昔から言われています。 ではその軌道計算をするアプリ(アプリケーションプログラムの略)は その計算が人工衛星の打ち上げ軌道を求めるためのものだと 理解しているのでしょうか? 「理解しているに違いない、そうじゃなきゃ計算なんてできないもの」 というのが上記のtorimakiさんの主張になります。 実際には公式とデータさえ与えれば計算できます。 しかも、人間には計算ミスが大いに起こりえますが、 コンピューターはコンピュート(計算)が得意中の得意ですので、 計算間違いがまず起こりえません。 間違いがあるとすれば、人間が入力するデータをミスした結果として 間違った解を返す場合くらいです。

torimakiさんのコメント
文脈から言えば、「理解」という言葉は、暗喩として読んで頂いた方が良いですかね。 2)については、 コード→(コンパイル)→マシーン語 パソコンに表示される結果(例示の場合10)← ? ←マシーン語 上記の?もコンパイラがやっているのか、それとも違うプログラムによるのか、という質問です。

椶櫚さんのコメント
アプリは単体で動きます。 コンパイラはプログラム言語を機械語に翻訳するアプリです。 # 要するに、コンパイルという作業を人間の手で行ってもいいんですが # 人力では効率が悪いしちょくちょく間違いも起こるので普通はしません パソコンの画面に表示するのはグラフィックを担当するLSIです。 (CPUはただの計算機なので、グラフィック作画なんて高度な芸当はできません) パソコン内部では、LSIに対してこれこれこういう挙動をしてくださいね という信号を送る指令をCPUが発しますが、 そのCPUの挙動はプログラマが設計段階で指定してるわけです。 より正確には、プログラマはCPUやLSIの存在なんて意識していません。 画面作画を実行するプログラム言語の文法通りに記述しているに過ぎないんです。 プログラミング言語という外部情報を元に、 その文法通りの挙動をするよう機械語に翻訳させるプログラムがコンパイラで、 そのコンパイラを作った(プログラミング言語を創始した) 先人がいるというだけの話になります。 なお、コンパイル形式とは別の、インタプリタ形式というのも存在します。 https://blog.codecamp.jp/compiler-interpreter-commentary

椶櫚さんのコメント
語弊があるのでいくつか訂正 > アプリは単体で動きます。 ぽけっとしすてむさんの書いておられるように、 別途、dllファイルなどが必要になる場合もあります。 が、その多くは最初からOSに組み込まれているものだったり、 他のアプリをインストールした際にすでにダウンロード済みの事が多いはず。 特定のdllファイルを別途用意しないと動かないようなアプリについては、 「これらのファイルをどこどこからダウンロードして下さい」のように Readmeに記述があるはずです。 > パソコン内部では、LSIに対してこれこれこういう挙動をしてくださいね > という信号を送る指令をCPUが発しますが、 Windowsが登場する前の規格が乱立してた頃なら グラフィックの橋渡し部分については それぞれのPCメーカーが作ってたはずなんですが、 (当時はOSではなくDOS、ファイル操作に特化したOSだったので) 今時のPCではグラフィックはOSの管轄のような気がします。 まぁ、内部でやってる事に大した違いは無いはずなんですが…

torimakiさんのコメント
コメント、ありがとうございます。 ライブラリについて、図書館をイメージしてみました。 なにか知りたいことがあったら、図書館に行って、あの本と、この本と、その本と...といった感じで選ぶ。 ライブラリの場合、ある目標に応じて、あのファイルと、このファイルと、そのフアイルと..といった感じで依存し会う。 コンパイラーは、その一種である、と、ちょっと違ったアプローチをしてみました。

椶櫚さんのコメント
こういうのは頭で考えるのではなく、まずはネットで調べた方がいいような… 基本的な定義 https://e-words.jp/w/DLL%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html さらに突っ込んだ内容 http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/01.html > コンパイラーは、その一種である つまりここが違うんです。 「自工場で製造から手がける部品」がプログラムだとすると、 ライブラリは「社外から納入された部品」であり、 コンパイラは部品を組み上げて製品を完成させる「作業員」となります。 作業員は製品の組立時こそ必要とされますが、 完成した製品はもう作業員を必要としないというわけ。

torimakiさんのコメント
コメント、ありがとうございます。 じっさいに試してみることが性に合っているので、以下のサイトを参考に実際に試してみました。 (サイトのコードに一部、抜けがありますが...) https://blog.katty.in/4346 おかげさまで、コンパイルの感じ、動的リンクライブラリ、それにAPIについて、理解が進んだように思えます。

椶櫚さんのコメント
上記の例えではコンパイラを「作業員」としましたが、 「ロボットアーム」に置き換えた方がいいかも。 作業員だと作っている物が何なのかを知っていてもおかしくありませんが、 ロボットアームは自分が何を作らされているのか全く知りません。 # コンマ何秒待機せよ # この三次元座標にこのくらいの速度で移動せよ # のような連続した命令が与えられ(プログラムされ)ていて # それをひたすら繰り返しているだけなんです # (プログラムの形態はNC旋盤なんかのそれに近い) # # コンパイラも同じで # このようなソースが登場した場合には、これこれこのように加工せよ # という命令が与えられ(プログラムされ)ていて # それをひたすら繰り返しているだけなんです なお、データはデータです。未加工のままでも使えます。 容量が膨大であればデータを圧縮する事もあるかもしれませんし、 他人に見られて困るものは暗号化したりするかもしれませんが、 わざわざ機械語に翻訳する意味も必要性もありません。 というか、仮に機械語に翻訳しようとしても、 文法規則を大きく逸脱したものでしょうから、 エラーを大量に吐き出して止まっておしまい、 コンパイルなんてできなかった、となるのが関の山かと思います。 データ未加工の例:wavファイル、bmpファイル 圧縮データの例:MP3ファイル、JPEGファイル アプリはデータがどのようなフォーマットで保存されているのか、 その型だけ把握できれば必要な作業には事足りますので、 あとはそのフォーマット通りにデータを扱えばいいだけとなります。 (だからデータの「意味」まで把握する必要がないわけ)

torimakiさんのコメント
ファイルAがコンパイルされると同時に、関連したファイルB(ライブラリ)にリンクされ、両者の関数が実行される。 次に、ファイルBの中の、例えば関数の値を変えた場合、結果を出すために、同様の処理が行われます。 ならば、(たまたまExcelを例に出していますが)先の例の場合、Excelにて、1,2,3,4合計Σにより10の結果が出る。 次に、6,7,8,9合計Σ30がアウトプットされる際には、同様の作業、コンパイルなり、インタープリタのような、その都度、マシーン語に変換されていないのでしょうか。

椶櫚さんのコメント
> ファイルAがコンパイルされると同時に、関連したファイルB(ライブラリ)にリンクされ、両者の関数が実行される。 1.コンパイルはコンパイルで完結します。 2.アプリはコンパイルを経て完成します。(コンパイルの出力結果がアプリ 3.関数は、アプリを起動した後に実行されます。 コンパイルはあくまでプログラム言語→機械語へのコンバートのみで、 一切実行はしないんです。また、3から分かる通り、 コンパイルをしない事には関数を呼び出しようがありません。 テレビを映すのには電源を入れて電気を流す必要があるのと同じで、 関数を実行するにはアプリを起動してプログラムを流さないといけないのです。 なお、インタプリタ言語ではこの1,2の過程が省略され、 アプリも作成されず、関数を直接実行するという荒業を行います。 > 次に、ファイルBの中の、例えば関数の値を変えた場合、結果を出すために、同様の処理が行われます。 値を変える事ができるのは変数(データの入れ物)ですね、 関数(プログラム)ではありません。 変数は関数内部で宣言されます。 (ただし、グローバル変数という例外はあります) セルの入力情報は変数のデータとして扱われます。 それらデータの加工規則を記したものが関数(プログラム)です。 変化するのはデータのみ、プログラムは変化しませんから 再度のコンパイルは不要ですよね?。 コンパイルによって機械語に置き換わった関数という加工規則に基づいて データが変化するに過ぎません。

torimakiさんのコメント
以下、イメージとして、とらえてください (C言語は不安内なので、pythonとしています。実際はコンパイルできません) ファイルA(ライブラリー) def add(a,b,c,d): return a+b+c+d ファイルB add(1,2,3,4) 両者をコンパイルし、結果は10となります。 次にファイルCを add(5,6,7,8) とし、同様の作業を行います。 結果は26となります。 いずれも、値を含んだまま(1,2,3,4あるいは5,6,7,8)コンパイルされ、結果が出ています..よね?

椶櫚さんのコメント
> 両者をコンパイルし、結果は10となります。 > いずれも、値を含んだまま(1,2,3,4あるいは5,6,7,8)コンパイルされ 違います。関数(機械語)を実行したのです。 コンパイルしたのではありません。 コンパイラはプログラミング言語を機械語へとメディアコンバートする ただそれだけの機能しか持たない「ツール」に過ぎません。 よって、アプリの実行時にはすでに用済みのお払い箱なのです。 つまりこういう事、 関数(プログラミング言語) → コンパイル → 関数(機械語) そのままでは実行できない関数(プログラミング言語)を 関数(機械語)へとせっせと変換するのがコンパイラなのです。 アプリの実行時にはコンパイラは呼び出されません。 アプリが起動されると関数(機械語)が メモリ上の「プログラム領域」に読み込まれます。 CPUは「プログラム領域」の関数(機械語)を上から順に実行していくのです。 https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/prog1/08-02.html

椶櫚さんのコメント
もしかすると「関数」の意味もまだ曖昧なのかもしれませんので、 上記の「プログラム」バージョンも書いておきます(関数≒プログラム)。 > 両者をコンパイルし、結果は10となります。 > いずれも、値を含んだまま(1,2,3,4あるいは5,6,7,8)コンパイルされ 違います。プログラム(機械語)を実行したのです。 コンパイルしたのではありません。 コンパイラはプログラミング言語を機械語へとメディアコンバートする ただそれだけの機能しか持たない「ツール」に過ぎません。 よって、アプリの実行時にはすでに用済みのお払い箱なのです。 つまりこういう事、 プログラム(プログラミング言語) → コンパイル → プログラム(機械語) そのままでは実行できないプログラム(プログラミング言語)を プログラム(機械語)へとせっせと変換するのがコンパイラなのです。 アプリの実行時にはコンパイラは呼び出されません。 アプリが起動されるとプログラム(機械語)が メモリ上の「プログラム領域」に読み込まれます。 CPUは「プログラム領域」のプログラム(機械語)を上から順に実行していくのです。 https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/prog1/08-02.html

torimakiさんのコメント
コンパイルされたファイルB、ファイルCは違うバイナリー..ですよね?

椶櫚さんのコメント
> コンパイルされたファイルB、ファイルCは違うバイナリー..ですよね? ファイルB、ファイルCが何なのか分かりませんが、 同じプログラム(テキストファイル)を同じコンパイラで、 同じ最適化深度でコンパイルすれば、 何度やっても全く同一のバイナリが作成されます。 元となるテキストファイルが異なれば、異なるバイナリとなります。 もちろん実行結果も異なりますが。 最後に、これでもか?というくらいに詳細な説明を試みます。 ↓でも理解できなかったらもうお手上げです。 ◆プログラムの作成段階 ◇必要なファイル プログラム(テキストファイル@プログラム言語) エディタ(バイナリファイル@機械語) ◆コンパイル段階 ◇必要なファイル プログラム(テキストファイル@プログラム言語) ライブラリ(バイナリファイル@機械語)…プログラム言語に紐付け コンパイラ(バイナリファイル@機械語)…コンパイルするためのツール ◇生成物 アプリ(バイナリファイル@機械語)…コンパイルによってプログラム言語から生成 ◆実行段階 ◇必要なファイル アプリ(バイナリファイル@機械語)…プログラム実行の起点 ライブラリ(バイナリファイル@機械語)…アプリから呼び出し CPUは機械語しか解しません。 テキストファイルであるプログラム言語を そのままCPUに渡しても暴走しかしません。 (だからコンパイルという過程が必要となる) エディタ(アプリ)、コンパイラ(アプリ)、 (コンパイラによって新規作成された)アプリなどは 始点のある機械語です(exeファイル)。 ライブラリ(dllファイル)は始点のない機械語で、 他のアプリから呼び出されない限りは実行されません。 データに意味を持たせるのがプログラム(プログラム言語=アプリ)です。 データはテキスト・バイナリどちらの形態も取れますが、 バイナリだからといって機械語というわけではありません。 CPUに渡した時に、CPUが正常に動作するよう、 プログラムの流れをデザインされたバイナリデータ群が機械語なのです。 コンパイラはプログラム言語(CPUが実行できない文字列、論理的な存在)を、 アプリ(プログラムと論理的に同等な機械語)へと昇華させるようデザインされています。 コンパイラによって作成されたアプリはそれ単独で動きます。 アプリはコンパイラによって作られたんだから、 実行にはコンパイラが必要なのでは? (OS環境下のコンパイラ環境下でしか動かないのでは?) という考え方は、実はインタプリタの考え方になります。 インタプリタ言語は、インタプリタ言語を実行するための環境下 (OS環境下のインタプリタ環境下)でしか動きません。 コンパイラから独立してOS環境直下でも動くもの、それがアプリです。 また、データの加工はCPUが行います。 メモリに展開されたプログラム上で行われるのではありません。 より正確には、CPU内部のレジスタと呼ばれる部分で行われます。 レジスタに直接値をセットする場合(単なる値の代入)もあれば、 メモリ上の特定のアドレスからデータを読み込んで レジスタにセットする場合(プログラム言語の変数がこれにあたる)もあります。 加工されたデータをメモリに上書きすれば変数が変化するわけですね。 また、グラフィック用に割り当てられた特定のメモリ位置に値を書き込むと、 画面に変化が起こります(PCはそのように作られているから)。 それを行えるのはCPU(半導体/物理的な実存在)です。 CPU(物理的な存在/データの加工を司るPCの心臓部)が、 メモリ(物理的な存在/データを保存する)に干渉して ディスプレイ(物理的な存在/データを表現する機器)に変化が起こるというわけ。 ここにはコンパイラの出る幕なんてどこにもありません。

torimakiさんのコメント
ファイルB、ファイルCは、やりとりの遡上にあがっているものです。

椶櫚さんのコメント
なるほど、pythonですか(自分はそっちを知らない)。 でも、インタプリタ言語のようですので、バイナリではなく、 実行前はテキストのままです。 python実行環境という限られた環境下において、 プログラムの実行時に命令を逐次、1行1行構文解析していき、 その命令を再現するためのライブラリ(機械語)の呼び出しを(pythonが)行います。 つまり、実行するたびに、プログラム部分の解析が行われます。 10回実行すれば10回の解析が、 100回実行すれば100回の解析が、 1万回実行すれば1万回のテキスト解析が行われるわけ。 コンパイラはこの解析を1回しか行わず、 解析結果を機械語に落とし込んで、 アプリという形で保存するのです。 なお例外として、インタプリタ言語を無理やりコンパイル してしまうコンパイラというのも存在します。 その場合、コンパイラの実行結果として保存されるのは機械語ですから、 インタプリタ環境下から離れて実行することができます。

4 ● outofjis

質問者がコンパイラを何のために欲しているのかが、はたから見ていると疑問です。

まず、コンパイラは生産者がアプリなどの製品を作成するために必要なもので、

消費者が持っていても、基本的には何の役にも立ちません。


たとえば、アプリの作成を、一本の鉛筆を作成するのと置き換えて説明します。


「プログラム」は鉛筆の設計図、もしくは製造工程図に当たるものです。

どの材質を使って、どのくらいの長さ、太さで、材料ををどのように組み合わせて、、

という内容が事細かく書いてあるものです


「コンパイラ」は、鉛筆を作るための組立設備にあたるものです。

特注で作った、全自動の専用機械で作っているかもしれませんし、

汎用の木材工作機械をいくつか使用して作っているかもしれません。

手作業でカンナやノミを駆使してひとつひとつ丁寧に作っているかもしれません。


「アプリ(製品)」である、出来上がった鉛筆を、消費者が購入して使います。

もちろんこの製品には、設計図も工作機械も付いてきません。


コンパイラをくれ、というのは、

アプリの「工場」や「職人」をくれ、と言っているのに近しいので

元々提供するのはおかしな話ですし、

仮に、カンナやノミを売っている場所を教えたとしても、

何に使うか不明なうえに、役に立てるとも思えないのです。


torimakiさんのコメント
動機が分からない、ということが、質問の分かりにくさとなっているのですね。恐縮です。 本件は、一般的な、好奇心からの質問となります。 (たぶん)プログラマーの皆さまは、コードを書いて明示的にコンパイルしていると思うんです。 一方、僕の場合、一般的で、たとえばWordやExcelを使っていて「あれ? これ、どうなっているんだろ」といった感じです。 コメントの中でも、書きましたが、Excelで1,2,3,4、合計で10が返って来る。この裏側でも、コンパイラーが介在し(マシーン語を経て)答えが返ってくるのかしらん、とか。 コンパイラーとは、もしかしたら...プログラミングを目標通りに「編集」する、そのようなニュアンスでしょうか。 で、マシン語に変換することは、その「編集」の一部であるという感じ...

outofjisさんのコメント
コンパイラはしばしば「翻訳者」や「通訳」と表現されます。 プログラマーは、「通訳」がどういう風に自分の言葉を 機械に伝えているかはあまり意識しません。 得られた結果が正しいかどうかを見て判断するだけです。 「1,2,3,4を足して」というプログラムを書いて、 それを通訳が機械に何と伝えたかは意識せず、 答えが10と返ってきたら、ああ、ちゃんと伝わっているね、と思うだけです。 プログラマーは、通訳が翻訳しやすいだろうと予想される表現を 多少は心がけることはしますし、 場合によってはコンパイル環境を変えることもあるかもしれませんが ほとんどブラックボックスのようなものと考えていると思います。 ひと昔前は、集積回路(虫のように足がいっぱい付いた四角くて黒い部品)の、 どことどこの足(端子)に、どういう順番で信号を与えると、 どの足に計算結果が返ってくるから・・・、 というようなプログラムを組んでいた時代もありましたが、 今はそんなことを考えるプログラマはほぼいません。

torimakiさんのコメント
コンパイラは、アプリ制作の時に利用されるもので、たとえば、ユーザーがExcelを使う時、先の例の、1,2,3,4合計10の裏側にはコンパイラは介入していない、というふうに、とらえてみました。...としても、1,2,3,4は、パソコンには認識できず、いったんマシーン語に変換されているような気がしなくも、なかったりして...

outofjisさんのコメント
たとえば、英語で書かれた本を、「翻訳者」が 日本語に翻訳して出版したとします。 日本のユーザーは、日本語訳された方の本を読み、 原文の方に手を出すことは基本的にありません。 一方翻訳者は、一度翻訳して出版してしまえば仕事終了で、 ユーザーが本を読む際には、特に仕事はありません。 この「英語」をプログラム、「日本語」を機械語、 「翻訳者」をアセンブラ、「日本語訳された方の本」をアプリと 置き換えて考えれば、イメージしやすいでしょうか。 ここで、外国人と話すときに介在する「通訳」をイメージしてしまうと、 都度、通訳があれこれ働くような印象を持ってしまいますが、それは間違いです。 コンパイラは、一度翻訳してしまえば、あとは働かないのです。 蛇足までに、余計混乱させるかもしれないけど、 コンピュータには、通訳のように、都度翻訳する働きをするものもいます。 それは「インタプリタ」といって、一般的にはコンパイラとは別物として 扱われています。これはこれで別の話なのでここでは詳細は省きます。

torimakiさんのコメント
コメント、ありがとうございます。 初学ですがpythonを学習中ですので、インタープリタはイメージできたりします。 既存のアプリ、たとえば、いままで例を引いてきたExcelのように、1,2,3,4 合計Σで、結果10となり、 その後に、セルに3.4,5,6合計Σで、結果18となる。 この場合、それぞれ、コンパイラなり、インタープリタなりが働いているものでしょうか。

outofjisさんのコメント
働いていません。 どちらも、単なる通辞なので、 コンピュータに計算命令の内容を伝えることはしますが、 計算するのはコンピュータです。

torimakiさんのコメント
お手数をおかけしております。 Excelなど、既存のアプリの例が直感できない原因のように思えて来ました。 自分に引き寄せて、理解しようとするアプローチにて失礼します。 学習を兼ねて、Herokuに自作のアプリをデプロイしたことがあります。 メモ書きのアプリとなります。 この場合、アプリをデプロイする際に、Herokuのスタックで一度コンパイルされ、 その後のメモ書きの利用時には(逐一コンパイルされることなく)、autofijisさんの言葉をお借りすれば、通辞されている、という理解でよろしいでしょうか。

outofjisさんのコメント
Herokuがわからないので確実なことは言えませんが、 コンパイルは、アプリの実行時ではなく開発時に行うものなので 「逐一コンパイル」という状態は、コンパイラの性質上あり得ません。 デプロイ時にはすでにコンパイルは終了しているはずで、 以降、アプリの実行時には、コンパイラは一切かかわりません。 メモ書きの利用時には、コンピュータは、 コンパイラによって「ずっと以前に翻訳済み」の 機械語のプログラムを読んで実行するだけです。

torimakiさんのコメント
少し違う角度からお聞きします。失礼します。 Herokuにデプロイし、コンパイルされたアプリは、SQL(Herokuの場合はpostgreSQL)と連動しています。 データベースから入力したデータ(本アプリの場合、メモ書き)を、ローカルにダウンロードした(.dump)ファイルは、バイナリーとなっています。 ということはSQLについては、書き込んだデータは、コンパイル、あるいはインタープリター(のようなもの)により、マシーン語に変換されているのでしょうか。

outofjisさんのコメント
ここまでのやり取りをしていて、質問者が知りたいことを推測するに、 以下のようなことでしょうか? コンピュータは機械語や2進数しか理解できないのに、 ユーザーがアプリに入力した10進数の数字や、日本語の文章を どうやって処理しているかわからない。 だから、それを行っているコンパイラのようなものが存在するはず、 ということでしょうか。

torimakiさんのコメント
その通りです。ありがとうございます。

outofjisさんのコメント
結論から言うと、その段階で動作するコンパイラのようなものは存在しません。 あえて、質問者が想定する処理を行うものをあげるとすると、 それはOSだと思います。スマホで言うと、AndroidやiOSといったものです。 コンピュータは機械語や2進数しか理解しない、というのは ちょっとした誤解があって、実際に2進数(ONかOFFか)しか処理できないのは プロセッサとか、メモリとか、そういうハード的な部分であって、 その上層にある、BIOSとかカーネルとかOSの部分は、2進数じゃなくても処理可能です。 逐次解析処理しながら実行していくらからです。 実はこの解析も「プログラム」が行っています。 たとえば、任意の場所にあるメモリ上に4ビットの2進数「1010」があったとして、 それをユーザーに理解できるよう画面表示するときは、 まずは10進数に直して、1×2の3乗+0×2の2乗+1×2の1乗+0×2の0乗 → 10 とし 次に画面に「1」と「0」を表す文字を表示するために、 それぞれの桁に16進数0x30を足して、0x31番と、0x30番の文字グラフィックを表示します。 これで画面に「10」が表示されました。 実際には最低でもこれだけの処理(プログラム)が動作しています。 そんな処理を、いちいちプログラマが書かなくていいのは、 OSなどが用意した、基本的な動作をするプログラムがすでに用意されてい来るからです。 逆も然りで、ユーザーが入力した内容を、プロセッサにわかるように 解析するプログラムも、OSなどが用意してくれています。 つまりは、質問者が疑問に思っている処理を行っているのは つきつめていくとプログラムであり、 そのプログラムはOSの用意したものであるから、 処理を行っているのは、見た目上OSであると言ってよいと思います。

torimakiさんのコメント
分かりやすいご回答、ありがとうございます。勉強になります。

質問者から

皆様、つたない質問や、やり取りにお付き合い頂き、ありがとうございました。

やり取りしているうちに、当初の質問より、いつの間にか深耕していくことに。

それも、こちらの至らないことによります。

ベストアンサーについては、当初の質問の視点より選ばせて頂きました。

どうぞ、ご容赦くださいませ。



●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ