1. ホーム
  2. java

[解決済み] Google App EngineでのJavaとPythonの選択

2022-04-25 05:15:02

質問

現在、Google App EngineはPython & Javaの両方をサポートしています。Java のサポートはあまり成熟していません。しかし、Javaの方がライブラリのリストが長く、特にJavaバイトコードのサポートは、そのコードを書くために使用される言語に関係なく、あるようです。どちらの言語がより良いパフォーマンスとパワーを与えてくれるのでしょうか?アドバイスをお願いします。ありがとうございました。

編集する http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine?pli=1

編集する パワーというのは、拡張性の高さや、フレームワークの外にあるライブラリーを取り込むことができるという意味です。Pythonでは純粋なPythonのライブラリしか使えませんが。

どのように解決するのか?

私は偏見を持っていますが(Pythonの専門家ですが、Javaはかなり錆びつきました)、GAE のPythonランタイムは現在Javaランタイムより高度でよく開発されていると思います--結局、前者は開発と成熟に1年余分にかかりましたからね。

特にJavaだけでなく、他の言語もJVMの上に乗っているので、例えばPHPやRubyのコードをApp Engine上で実行するための方法なのです。

柔軟性という点では、すでに述べたように、Javaエンジンは、Javaだけでなく、異なる言語で作られたJVMバイトコードを実行する可能性を提供します。逆もまた然りで、もしあなたがJavascriptを嫌っているが、ユーザーのブラウザで何らかのコードを実行しなければならない場合、JavaのGWT(あなたのJavaレベルのコーディングからあなたのためにJavascriptを生成)はPython側の代替よりもはるかに豊富で高度です(実際には、Pythonを選ぶと、この目的のために自分でいくつかのJSを書いてしまうでしょうし、Java GWTはあなたがJSを書くことを嫌っているのなら使える代替となるのですがね)。

JVMは、既存のJavaライブラリの単純な再利用を妨げるほど制限されており(スレッド、カスタムクラスローダ、JNI、リレーショナルDBなし)、既存のPythonライブラリがPythonランタイムの同様の制限によって妨げられるのと同じかそれ以上に妨げられるのです。

アプリエンジンの環境は非常に異なるので、高度に最適化されたJITベースのJVM実装のパフォーマンスを、その大きな起動時間とメモリフットプリントを割り引いて当てにしないでください(起動コストは、アプリのインスタンスが起動、停止、別のホストに移動するなど、すべて自分とは無関係に頻繁に発生します--そうしたイベントは通常、JVMの場合よりもPythonランタイム環境の方がはるかに安くなります)。

XPath/XSLTの状況(婉曲的に言うと...)は、どちらの側でも必ずしも完璧ではありませんが、私はJVMでは少し悪いかもしれないと思います(明らかに、Saxonのかなりのサブセットは、いくつかの注意を払って実行させることができます)。の問題を開く価値があると思います。 Appengineの課題 のページで、タイトルに XPath と XSLT が含まれている場合、今は特定のライブラリを求める問題しかなく、それは近視眼的なものです。私は、良い XPath/XSLT がどのように実装され、Python 用、あるいは Java 用であっても、それを使うことができるのであれば、気にすることはありません。(特定のライブラリは既存のコードの移行を容易にするかもしれませんが、それは "rapidly apply XSLT transformation" のようなタスクを何らかの方法で実行できることよりも重要ではありません!-). 特に言語に依存しない方法で)うまく表現できれば、そのような問題に星をつけることは分かっています。

最後になりますが、(同じデータストアを使用する)アプリの異なるバージョンを持つことができ、一部はPythonランタイムで、一部はJavaランタイムで実装され、quot; default/active" と異なるバージョンには明示的なURLでアクセスできることを忘れないでください。つまり、Python そして Javaコードは(アプリの異なるバージョンで)同じデータストアを使用および変更するため、さらに柔軟性が高まります(ただし、foobar.appspot.comのようなquot;nice" URLを持つのは一方のみで、おそらくブラウザ上の対話型ユーザーによるアクセスにのみ重要です、私はそう想像します;)。