スクリプト言語とコンパイル言語の違いなのですが、
cを始めとするコンパイル言語はgccを始めとするコンパイラーで0or1のマシン語まで変換するので環境問わず実行できるし、命令をそのまま実行するだけなので早いが、
pythonに代表されるようなスクリプト言語は随時マシン語に変換する必要があるので、
命令を処理するにはその環境においてpythonのインストールが必要であるという認識はあっていますか?
またpython等のスクリプト言語を一気にコンパイルしてマシン語にすれば実質cと同じように使えることはできるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
cを始めとするコンパイル言語はgccを始めとするコンパイラーで0or1のマシン語まで変換するので環境問わず実行できるし、命令をそのまま実行するだけなので早いが、
「環境問わず」の意味が曖昧なので厳密に書きます。
例えば「x64 CPUのWindows OS」と言う環境では、環境問わず実行できます。
ただし、「SPARC CPUのSolaris OS」と言う環境では、Widnows用のバイナリはそのままでは実行できません。
pythonに代表されるようなスクリプト言語は随時マシン語に変換する必要があるので、
命令を処理するにはその環境においてpythonのインストールが必要であるという認識はあっていますか?
この認識は概ね合っています。
またpython等のスクリプト言語を一気にコンパイルしてマシン語にすれば実質cと同じように使えることはできるのでしょうか?
私は試したことがないのですが、PythonのスクリプトをWindowsのEXE化するツールは有るようです。
投稿2018/12/17 06:52
総合スコア298
0
コンパイラは厳密に言えば機械語に変換しているわけではありません。別の形式(一般的な C/C++ ではアセンブリ言語まで、C# や Java では仮想マシン用の中間言語まで)に変換していて、そこから機械語にはさらにワンステップ(アセンブリ言語の場合はアセンブラで、中間言語の場合は中間言語を処理する仮想マシンが実行)必要です。
※ものによっては高級言語から別の高級言語へ変換(translate)するような場合もあります
一方インタプリタ(スクリプト言語など)についても、内部エンジンが動作しているのであって機械語に変換しているわけではないともいえます。
※JavaScript や Ruby、PHP は内部エンジンでの処理で、機械語まで落とし込んでいるわけではありませんね
そうなると(特に中間言語へのコンパイルを行うようなものの場合)どこが違うのかという話になりますが、つまるところは「変換を一気に行ってから実行する(コンパイル)か、逐次行う(インタプリタ)」かの違いくらいしかありません。
※Ruby の Java実装である JRuby のように、インタプリタ・実行時(JIT)コンパイル・事前コンパイルの三種類の動作が可能なものすらあります。
投稿2018/12/17 07:08
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
単語の意味も含めて改めて理解しました
コンパイル・・コンパイラを使うこと
インタプレタ・・随時コードを解釈すること
スクリプト言語・・コンパイルを必要としない言語のこと
と環境構築についても結局使う言語を解釈するような設定は必要で、つまり差は最初にコンパイルするか、随時行うかしかないと理解しました。
ありがとうございました。
投稿2018/12/26 10:30
編集2018/12/26 11:20退会済みユーザー
総合スコア0
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
総合スコア1563
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Wikipediaによると、スクリプト言語とは、
アプリケーションソフトウェアを作成するための簡易的なプログラミング言語の一種を指す。
との事です。コンパイル言語と対を成していません。
ちなみにコンパラ言語はと云うと、、、カテゴリが無いですね。あるのは、コンパイラ。
プログラミング言語の処理系(言語処理系)の一種で、高水準言語によるソースコードから、機械語に(あるいは、元のプログラムよりも低い水準のコードに)変換するプログラム
との事です。
言われてみれば、確かにそうですね。C言語は一般にコンパイラ言語と言われますが、歴史を見れば、インタープリタで実行した時もありました。LISPなんて、インタープリタかと思えば、コンパイラもあるし、そもそも LISPマシンなんて、直接実行するハードウェアも(過去には)ありました。
既に指摘されているように、Pythonは、コンパラもあります。もしかしたら、直接、実行するマシンも現れるかも、、(可能性は低そうですが)
スクリプトとコンパイラは対比するするものでは無く、定義を確認すべきです。
既に指摘のあるように、一般的には、コンパイルされるものの方が速いのは事実ですが。(同じ環境ならば)
投稿2018/12/17 13:45
総合スコア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総合スコア624
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/17 06:50
2018/12/17 06:53
2018/12/17 07:08
2018/12/17 07:19
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。