ExecJSの歴史またはRubyでJavaScriptを実行する方法

レール上でクールなwebdvolnoyプロジェクトを書いているとしましょう。 強力なjavascriptプログラマーである友人Petyaがいます。 Petyaは多くのことを熱心に書いているので、彼は自分の人生を楽にすることを決心し、美しくシンプルな構文でjavascriptに翻訳される新しい言語を思いつきました。

また、Petyaは緑茶が大好きなので、新しい言語をGreenTeaScriptと名付けました。



Petyaに加えて、もう1人の友人、javascriptのプログラマであるVasyaがいます。 VasyaはかつてJSをASTに解析して最適化した後、それを組み立てて美しい構造化コードに戻すプログラムを作成し、Crawfordによる不要なフォーマットをカットすることを決定しました。 彼は彼の発案のBeautifyJSと呼びました。 ちなみに、BeautifyJSはASTを最小化された圧縮コードにアセンブルする方法をまだ知っていて、自然界に存在する他の代替手段よりも速くて優れていました。



PetyaとVasyaは、javascript以外のプログラミング方法を知らなかったため、製品を作成しました。



そして、ここでも、世界で最初に、これらの素晴らしいものをレール上のクールなウェブワゴンプロジェクトにねじ込むというアイデアを思いつきました。 あなたはGreenTeaScriptでフロントエンドを書くことが本当に好きでした。そしてBeautifyJSを使用してスクリプトを圧縮すると、おそらくサイトが大幅にスピードアップするでしょう。



今から楽しみが始まります。



Javascriptコア



両方のプログラムはjavascriptで記述されており、何らかの形でレールから実行する必要があります。 クイックグーグルでは、たとえば使用する/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc



は、コマンド/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc



を使用してコンソールから起動できる組み込みJavaScriptCoreシステムがあることが/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc



ます。 javascriptの一部を受け取り、これをフィードし、結果を解析して出来上がりのクラスをすばやく作成します。すべてが機能します。 ニシュチャク。



Jscript



あなたのラップトップから投資家にプロジェクトのプロトタイプを見せてください。投資家はそれを気に入っていますが、彼は一週間で始める必要があると言います。 くそー、1週間ですべての機能を追加する時間がないので、アシスタントプログラマーとしてDimaを雇うことにします。

プログラマーのDimaはWindowsオペレーティングシステムを使用しているため、彼のmakosevy JavaScriptCoreは機能しません。 Dimaはすぐにグーグルで解決策を見つけました-JScript 、その後Windowsで動作する2番目のクラスの隣に書き込みます。 そして再びnishtyakと動作します。 今回は、MacosおよびWindowsの下です。



NodeJS



一週間、あなたはどういうわけかあなたが必要とするすべてを完了することができ、投資家は非常に喜んで、開始するコマンドを与えます。 Linuxサーバーが喜んで購入され、展開が行われた後、すべてが故障します。 そうですね、あなたはLinuxでjavascriptを実行する機能を提供するのを忘れていました。

問題はありません。ソリューションはすぐに十分に提供されます。 サーバーにNodeJSを配置し、既存のクラスを追加してそれを操作するだけです。 すぐに言ってやった。 現在、このブートレガーはすべてLinuxでも機能します。



テルビレーサー



プロジェクトは急速に人気を集めており、投資家の列が急いであなたに大量のお金を捨てたいと望んでいるため、サーバーは対処しなくなります。 新しいサーバーのインストールと構成がタスクに含まれるシステム管理者を雇っています。 システム管理者は大胆に仕事に取りかかり、5台の新しいサーバーをロールし、それらに展開すると、すべてが再び故障します。 新しいサーバーでは、NodeJSのバージョンが最初のサーバーのバージョンとわずかに異なることがわかります。 また、 /bin/node



ではなく、 /usr/local/bin/node



。 そして一般に、管理者によると、外部依存関係はクールではなく、それらを取り除く必要があると彼らは言います。

教科書「3時間でゼロからC ++」を習得し、RubyからNodeJS V8エンジンを直接使用できる新しいgemを自由に作成できます。 その結果、 therubyracerを取得します 。 インストール時に、gemはサンドボックスに目的のバージョンの独自のV8を収集し、直接使用します。 レポタ!

これで、javascriptの実行を担当した松葉杖の山を一掃し、これをすべてtherubyracerを使用する美しいクラスに置き換えることができます。 Gemfile.lockのどこにでも1つのバージョンが登録されており、すべてがすべてのオペレーティングシステムで同じようにすばやく動作し、誰もが満足しています。



テルビリノ



ハブでJRubyについての記事を読んだら。 この記事は、とりわけ、JRubyは非常に高速で、一般にクールだと述べています。 実験として、JRubyでプロジェクトを起動し、ベンチマークを実行することにしました。 当然、すべてがtherubyracerで停止しますが、これはJRubyでは機能しません。

そのため、 基本的therubyracerと同じことを行いますが、Mozilla Javascriptエンジンを使用してJRubyで動作する新しい宝石therubyrhinoを収集します。 一般に、ベンチマークを実行し、落ち着きました。



すべて一緒に



プロジェクトは成長し、サーバーの数が増加し、週に5人の新しいプログラマーを雇用しています。 新しいプログラマーごとにコンピューターを購入してから、半日でコンパイラーをインストールする方法を教えてください。そうすればtherubyracerが一緒になります。 そして、約10分かかります。残念ながら、一度にすべてのコンパイラなしで組み込みのJavaScriptCoreですべてが機能した時代を思い出します。



なぜこんなに長い話なのか? また、新しいRails 3.1では、デフォルトでCoffeeScriptとUglifyJSのサポートが追加されています。 想像上のGreenTeaScriptやBeautifyJSとほとんど同じですが、非常に野心的なものです。 そして、Railsコアチームは、私たちと同じ問題に直面しました。



彼らはどのようにそれらを解決しましたか? 彼らはExecJSを作成しました。これは、あらゆる方法でrubyからjavascriptを実行できるようにする独創的なgemであり、同時に依存関係を追加しません。 彼は、各メソッドの可用性をチェックし、最適なものを使用することを提案します。

したがって、makoshi開発者のすべてはJavaScriptCoreを介して実行され、彼の隣人はJScriptを介してWindowsで実行され、LinuxではNodeJSに固執するか、therubyracerのインストールを丁寧に提供しようとします。



次のように機能します。

 require 'rubygems' #      1.8 require 'execjs' #      jsfunc = <<JS function square(n){ return n*n; } JS #   context = ExecJS.compile(jsfunc) #     context.call('square', 10) # => 100 #     ExecJS.eval 'Math.pow(10, 2)' # => 100
      
      







ご覧のとおり、すべてが非常に透明でシンプルです。 詳細を掘り下げる必要はなく、利用可能な最も最適な方法で機能するだけです。



したがって、Rubyでjavascriptを追跡することは、蒸したカブよりも簡単になったことがわかります。 私の意見では、これは非常にクールです!



All Articles