質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

Q&A

解決済

6回答

389閲覧

プログラミング言語 種類について

退会済みユーザー

退会済みユーザー

総合スコア0

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

0グッド

0クリップ

投稿2018/12/17 06:24

スクリプト言語とコンパイル言語の違いなのですが、
cを始めとするコンパイル言語はgccを始めとするコンパイラーで0or1のマシン語まで変換するので環境問わず実行できるし、命令をそのまま実行するだけなので早いが、
pythonに代表されるようなスクリプト言語は随時マシン語に変換する必要があるので、
命令を処理するにはその環境においてpythonのインストールが必要であるという認識はあっていますか?
またpython等のスクリプト言語を一気にコンパイルしてマシン語にすれば実質cと同じように使えることはできるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

cを始めとするコンパイル言語はgccを始めとするコンパイラーで0or1のマシン語まで変換するので環境問わず実行できるし、命令をそのまま実行するだけなので早いが、

「環境問わず」の意味が曖昧なので厳密に書きます。
例えば「x64 CPUのWindows OS」と言う環境では、環境問わず実行できます。
ただし、「SPARC CPUのSolaris OS」と言う環境では、Widnows用のバイナリはそのままでは実行できません。

pythonに代表されるようなスクリプト言語は随時マシン語に変換する必要があるので、

命令を処理するにはその環境においてpythonのインストールが必要であるという認識はあっていますか?

 この認識は概ね合っています。

またpython等のスクリプト言語を一気にコンパイルしてマシン語にすれば実質cと同じように使えることはできるのでしょうか?

 私は試したことがないのですが、PythonのスクリプトをWindowsのEXE化するツールは有るようです。

  http://hiroys.hatenablog.jp/entry/2017/10/25/015929

投稿2018/12/17 06:52

rtr1950x

総合スコア298

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コンパイラは厳密に言えば機械語に変換しているわけではありません。別の形式(一般的な C/C++ ではアセンブリ言語まで、C# や Java では仮想マシン用の中間言語まで)に変換していて、そこから機械語にはさらにワンステップ(アセンブリ言語の場合はアセンブラで、中間言語の場合は中間言語を処理する仮想マシンが実行)必要です。

※ものによっては高級言語から別の高級言語へ変換(translate)するような場合もあります

一方インタプリタ(スクリプト言語など)についても、内部エンジンが動作しているのであって機械語に変換しているわけではないともいえます。
※JavaScript や Ruby、PHP は内部エンジンでの処理で、機械語まで落とし込んでいるわけではありませんね

そうなると(特に中間言語へのコンパイルを行うようなものの場合)どこが違うのかという話になりますが、つまるところは「変換を一気に行ってから実行する(コンパイル)か、逐次行う(インタプリタ)」かの違いくらいしかありません。
※Ruby の Java実装である JRuby のように、インタプリタ・実行時(JIT)コンパイル・事前コンパイルの三種類の動作が可能なものすらあります。

投稿2018/12/17 07:08

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2018/12/17 11:56 編集

> 一般的な C/C++ ではアセンブリ言語まで 今時、アセンブリ言語に落としているコンパイラはあるのでしょうか? 大分前ですが、coff とか、ELF とかの形式で出力していました。その後、リンク。最新のは知りませんが、新しい形式になっただけと思っていますが。(アセンブラ出力はオプション) 最近(といってもしばらく前から)のVisual studioは、.NETが主で、MSIL出力、コンパイラと言っても中間言語出力。これはコンパイラなのか、、(C++/C#/... ) これをコンパイラとすると、Javaもコンパイラ。中間コードに変換しているものは全てコンパイラですね。
guest

0

単語の意味も含めて改めて理解しました
コンパイル・・コンパイラを使うこと
インタプレタ・・随時コードを解釈すること
スクリプト言語・・コンパイルを必要としない言語のこと

と環境構築についても結局使う言語を解釈するような設定は必要で、つまり差は最初にコンパイルするか、随時行うかしかないと理解しました。
ありがとうございました。

投稿2018/12/26 10:30

編集2018/12/26 11:20
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri

2018/12/26 11:12 編集

インタパイルではなくインタプリタでは?
LouiS0616

2018/12/26 10:41

compile, compiler interpret, interpreter
退会済みユーザー

退会済みユーザー

2018/12/26 11:26

ご指摘有難うございます・ 修正致しました。
guest

0

ベストアンサー

実行時の状態と「コンパイル」はあまり関係がありません。
Pythonで書いたコードを実行したければPythonランタイムが必要なのはまず正しいですが、C言語のコードをコンパイルした場合でもそのまま実行できるかというと、必ずしも正しくはありません。

「スクリプト言語」とは?がまず曖昧ですが、「事前にコンパイルしなくても実行出来る言語」とします。コンパイル言語、という用語は聞いたことがないので、「スクリプト言語」と「事前にコンパイルする言語」としておきます。

「事前にコンパイルする言語」は(当たり前ですが)事前にコンパイルが必要です。一般的にはコンパイルすると機械語になります。機械語になればすべてオッケーというわけではなく、OSやCPUなどの環境がコンパイル時の想定と合っていなければ実行できません。さらに、実行時にライブラリを取り込む場合は、対象ライブラリが別途インストールされていなければ実行時エラーになります。

「コンパイル」とは「言語を機械語に変換する」とは限りません。「言語Aを言語Bに変換」すればそれはコンパイルと言えます。たとえばC言語であっても、ClangなどのコンパイラであればLLVM IRと呼ぶ中間言語にコンパイル出来ます。LLVM IRをさらにJavaScriptなどにコンパイルしてしまうツールも存在します。別の言語、あるいは中間言語にコンパイルした場合は結局実行環境が別に必要です。他に中間言語にコンパイルする例としては、Javaは実行時にJVMが必要で、C#はCLIと呼ばれる環境が必要になります。

スクリプト言語の場合事前にコンパイルは必要としませんが、その代りに実行するためのインタプリタが必要です。インタプリタが内部でどう動いているかは千差万別です。インタプリタの概念上は「記述したソースコードを解析しながら実行する」だけであって、本当にそうしてしまうのか、あるいはあらかじめ内部で機械語にコンパイルしてしまってから実行するかは実装次第です。実行時に機械語にコンパイルする処理は「JITコンパイル」とも呼ばれ、PythonやRubyの処理系でもJITコンパイラを含むものがあります。Javaのように中間言語になったバイトコードを実行するランタイム(JVM)でも、その内部でJITコンパイルを行う場合さえあります。

このようにコンパイラと言っても、独立したコマンドだけでなく実行時のランタイム内部に隠れていたりします。そして「このプログラミング言語なら他に何もインストールしなくてよい」というのもほぼ成り立ちません。

「スクリプト言語かどうか」「事前コンパイルが必要かどうか」「実行時に別環境が必要かどうか」はすべて別に考えるのがスッキリすると思います。

投稿2018/12/18 06:29

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Wikipediaによると、スクリプト言語とは、

アプリケーションソフトウェアを作成するための簡易的なプログラミング言語の一種を指す。

との事です。コンパイル言語と対を成していません。
ちなみにコンパラ言語はと云うと、、、カテゴリが無いですね。あるのは、コンパイラ

プログラミング言語の処理系(言語処理系)の一種で、高水準言語によるソースコードから、機械語に(あるいは、元のプログラムよりも低い水準のコードに)変換するプログラム

との事です。
言われてみれば、確かにそうですね。C言語は一般にコンパイラ言語と言われますが、歴史を見れば、インタープリタで実行した時もありました。LISPなんて、インタープリタかと思えば、コンパイラもあるし、そもそも LISPマシンなんて、直接実行するハードウェアも(過去には)ありました。
既に指摘されているように、Pythonは、コンパラもあります。もしかしたら、直接、実行するマシンも現れるかも、、(可能性は低そうですが)

スクリプトとコンパイラは対比するするものでは無く、定義を確認すべきです。

既に指摘のあるように、一般的には、コンパイルされるものの方が速いのは事実ですが。(同じ環境ならば)

投稿2018/12/17 13:45

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

違います。
スクリプト言語もコンパイル言語も、環境のインストールが必要なものもほぼいらないのもあります。
スクリプト型言語(python等)は機械語には一気には変換できないものがほとんどだと思います。(例外あるかも)
ただ、コンパイル言語は機械語にしているので早い、というのはあっています。

Zuishinさんの意見を受け変更しました
現在は、コンパイル言語とインタプリタ言語では、あまり差はないようです。
また、UnityもJavaも、ソースを変えなければ動かない、ということです。
間違えた情報を出してしまい、申し訳ありません。

以下原文(打ち消してあります)
・スクリプト言語
そのときにコンパイルするので遅くなりやすい
エラーが起きた時どのタイミングかわかりやすい(処理を追いやすい)
python,javascriptなど

・コンパイル言語
先にコンパイルするので実行時は早くなりやすい(命令にもよる)
実行時エラーはソースを読まないとどうしてなるのかわかりにくい
c,c#,c++など

・例外
java
これはどのOSでも対応できるようバイトコード(javaで決めたルールに沿ったソース)
に変換して、実行時にOS対応の機械語に変換して実行します。(このためにjavaが遅いと言われているらしい)

どのosでも、環境構築は必要です。(javascript,htmlを除く)
どのOSでも実行できるのは、Unityやjavaが有名です。

投稿2018/12/17 06:42

編集2018/12/17 07:02
yukkuri

総合スコア624

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/12/17 06:50

質問からしてそうなのですが、コンパイラとインタプリタ、スクリプトという言葉が混ざっているようです。 Java は JIT コンパイラですが、インタプリタより速く実行できるようにという意図でそのシステムが使われているので、この文脈で「遅い」というのは誤解を招きます。 また C# はコンパイルが必要ですが Java と同じく JIT コンパイラが採用されています。 スクリプト言語が処理を追いやすいというのも疑問です。デバッガを使って逐次実行すればスクリプト言語に限らず処理は追いやすくなります。 Unity や Java がどの OS でも実行できるというのも疑問です。Android と iOS ではソースを変えなければ動きません。 実行時エラーはソースを読まないとどうしてなるのかわかりにくいというのは意味が分かりません。
Zuishin

2018/12/17 06:53

また昔のインタプリタはソースの同じ個所を何度も翻訳していたので特にループでコンパイラと顕著な差が出ました。しかしそれは情報が古いです。今のインタプリタは一度翻訳した箇所をキャッシュしていますから実用的な速度で動きます。コンパイラかインタプリタかということよりもアルゴリズムでの差が大きい方が珍しくありません。
yukkuri

2018/12/17 07:08

意見をもとに(というかほぼそのままですが)、修正しました。 > デバッガを使って逐次実行すればスクリプト言語に限らず処理は追いやすくなります。 たしかにそうかもしれません。私がデバッガを使わない、ということもあってこのような記述になりました。 > 実行時エラーはソースを読まないとどうしてなるのかわかりにくいというのは意味が分かりません。 これは、たしかにおかしかったです。 > Unity や Java がどの OS でも実行できるというのも疑問です。Android と iOS ではソースを変えなければ動きません。 Unityは試したことありませんが、rtr1950xさんみたいに、細かくOSを指定する等厳格にしたほうが良かったですね。
Zuishin

2018/12/17 07:19

各 OS で API や文化を持っているので、それに対応させる必要がありますね。Java は一度書けばどこでも動くを目指したようですがなかなか難しいようです。Android のプログラムは Java で書くのが基本(今は Kotlin や C# も多い)ですが、Intent という Android 独自の仕組みを使うので、それを他の OS に持って行っても動きません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問