スクリプト言語で、機械語を出力することはできないのでしょうか?
スクリプト言語は使いやすいです。例えばCに比べて、
・文字列型が存在する
・メモリ確保・開放を考えなくてもよい
等、作りたい処理に直接的に関係しない処理の作成に手間をかけずに
済むからです。
各スクリプト言語には、それぞれ各言語の仕様が存在していると思います。
それらの仕様に従って機械語を出力することができれば、簡単な構文で
余計なところに頭を使わずにプログラミングできると思います。
実装の難易度もHaskell等の関数型言語を使うと、ルールを羅列するような
プログラムは書きやすいと聞いたことがあるので、それほど難なく実装可能かと
推測します。(自分にはそんなものを作れる能力ありませんが...)
何か、スクリプト言語はインタプリタ実行しなくてはならない理由があるのでしょうか?
例えば、型は実行時に動的に決まるから、コンパイル時に確定できないのだとか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/02 02:15
回答4件
0
まず、前提条件をおうかがいします
- どんなプログラムを高速化したいのか
- どれだけ高速化したいのか
- 高速化することにどれだけの価値があるのか(≒高速化のためにどれだけの工数を割けるのか)
趣味や競技などで、「特定の演算を、1マイクロ秒でも速くしないといけない」という場面であれば、最初からC/C++で書く、というのがいちばん妥当な選択肢となります(これらは見えないオーバーヘッドのたぐいがほとんど発生しない言語です)。
一方で、Webアプリの場合、どうせ通信時間やDBへのアクセス時間はミリ秒単位で発生してしまうので、プログラム自体を速くすることでの利点というのも、一定限度を超えればあまりユーザー側での価値がなくなってしまいます(少し前にそういう質問がありました)。
あと、機械学習系のライブラリなども、速度を要求されるコア部分は機械語で進むようになっていて、データの入出力はスクリプト言語で便利にできる、というような構造になっていることもあり、こういう場合も入出力部分を改善したところでほとんど高速化しない割に、データのハンドリングがめんどくさくなります。
facebook社での実例
facebookはPHPでシステムを組んでいたのですが、PHPの遅さがネックになってきたので、「HipHop for PHP」として、PHPをC++に変換してコンパイルできるような仕組みを作りました。ところが、
- コンパイルに時間がかかることので本番反映のコストになる
- 開発時にコンパイルを待てないので、同じ動作をするインタプリタが別途で必要になって二重投資になる
- ある程度のところで性能が頭打ちになった
というような事情があったところで、JIT型のHHVMを作って改良していくとそちらのほうが高性能となったこともあって、コンパイル型の開発は打ち切られています。
投稿2016/10/03 22:46
総合スコア145121
0
ベストアンサー
・文字列型が存在する
・メモリ確保・開放を考えなくてもよい
これなら、コンパイル言語であるgolang(go言語)でもできます。
性能
- 実行速度
cとあまり変わらない速度
cの有名なint型ヒープソート→20万件 22ms
golangの自作int型クイックソート→20万件 25ms
- メモリ
ヒープ領域を自動で確保、解放してくれる
c→30万件でスタックオーバーフロー
golang→1億件で正常に動作
言語としての特徴
- 文字列型
string, []byte, []runeの三つが主体です。
byteはバイト単位で分割したもの(マルチバイト文字はばらける)
runeは文字単位で分割したもの
- 強み
並列処理、ネットワーク通信、学習コストの低さ
- クロスコンパイル
windowsのexeファイルからLinuxの実行ファイルはもちろん、名前の知らないようなOSやその32/64bitまで対応しています。
対応OSやCPUアーキテクチャ詳細
https://golang.org/doc/install/source#environment
- 他言語との連携
cgoという仕組みでC言語の関数を呼び出したり、モバイルアプリ開発ではgomobileのbindという仕組みでJavaやObjective-Cから呼び出されるライブラリを生成することができます。
dllという形式のライブラリファイルの関数を簡単に呼び出すことができます。
おすすめ参考サイト
- 英語
ダウンロード https://golang.org/dl/
ドキュメント https://godoc.org/
ドキュメント他 https://golang.org/doc/
- 日本語
学習サイト https://go-tour-jp.appspot.com/
逆引き http://ashitani.jp/golangtips/
何か、スクリプト言語はインタプリタ実行しなくてはならない理由があるのでしょうか?
インタプリタの方が実装が簡単です。なので比較的コストを掛けずに作るならインタプリタがいいんでしょう。
golangはスクリプト(動的型付けもする)言語ながらコンパイルが主体なので、インタプリタ実行しなくてはならないというわけではないです。
機械語を出力したい目的は実行速度が速いことです
それほど実行速度を求められるプログラムを作ろうとしてるのですか?
差し支えなければ教えていただきたいです。
投稿2016/10/02 05:11
総合スコア868
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/02 09:37
2016/10/06 07:59
0
制限付き、または、一部仕様が異なる、という点がありますが、スクリプト言語を、そのまま、または、一部変更することで、コンパイルして機械語(ネイティブ)できる言語があります。
- RPython
Pythonにいくつかの制約を加えてコンパイル出来るようにした言語。PyPyをコンパイルするのにも使われ、PyPyのソースに含まれるらしい。
※ PyPyはJITコンパイラを使用して高速化したPythonの実装。
Rubyを静的型(型推論あり)にし、コンパイル出来るようにした言語(ただし、Rubyのいくつかの機能は実装されていない)。型推論がうまく働けば、Rubyのスクリプトがそのまま通る場合も多い。
また、逆の発想で、HaskellやScala等の一部の言語ではインタプリタも一緒に用意されて、スクリプト言語のように扱えるようになっている場合もあります。
制限や一部の変更が無い、スクリプト言語そのもののコンパイラが作れないのかというと、かなり難しいらしいです。Rubyについてですが、Rubyだとあまりに動的で柔軟な言語仕様のせいで、Cのようなコンパイラを作りたくても作れないととある記事に書いてありました。Crystalのように静的型の導入し、一部機能を削らないと無理なのではないかと思います。
【補足】
事前に機械語までコンパイルしているAOTコンパイラはありますが、言語処理系が完全に省けるわけではありません。また、研究段階のようであり、実用的な物はまだないようです。生成したバイナリの移植性の問題もあるため、目に見える速度向上が無ければ、JITコンパイラや中間コード生成がしばらくは主流になると思われます。
投稿2016/10/02 00:51
総合スコア21733
0
###スクリプト言語は遅くない!
JIT(Just In Time)コンパイラという言葉をご存知でしょうか。 実行時に機械語にコンパイルする方式で、Javaなど多くの言語処理系で実装されており、単なる繰り返し処理などにおいては、実行速度においてネイティブのコンパイラとほぼ遜色ないと言われています。スクリプト言語の例でいいますと、Javascript の言語処理系である node.js はJITを実装しています。
また、機械語を出力するかどうかで性能が決まると考えておられるようですが、同じ機械語でも、コンパイラの得意、不得意やキャッシュ管理との相性ですぐに性能が2,3倍の性能差がでたりして、スクリプト言語より遅かったりします。
性能問題については、実際にその問題がでてから対応策を検討すべきです。長いことこの仕事をしており、何度も性能問題に対応したことがありますが、言語処理系の選択が間違っていたという結論になったことは一度もありません。
一歩譲って、機械語のほうが早いとしてもせいぜい差がついて2倍程度です。これに対して、知識のないプログラマがコーディングするとあっという間に10倍、100倍の差がつきます。
20世紀は言語を選ぶ際にその性能が注目されましたが、3年経てばCPUの性能が倍以上あがる21世紀においては、言語処理系の性能で何かを議論するのはナンセンスです。
投稿2016/10/02 12:51
総合スコア3401
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/02 21:57
2016/10/03 00:39
2016/10/03 01:54
2016/10/03 22:12
2016/10/04 03:03
2016/10/05 22:03
2016/10/06 08:14
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。