すべての動的機能を備えた Lisp は静的にコンパイルできるのに、なぜ Python は (すべての動的機能を失うことなく) コンパイルできないのですか?
4 に答える
Python の静的コンパイルを妨げるものは何もありません。Pythonはより可変なローカルスコープを明らかにするため、少し効率が悪くなります。また、コンパイルされたプログラムにコンパイラを含める必要があるいくつかの動的プロパティ(evalなど)を保持するためにも、それを妨げるものは何もありません。
とはいえ、調査によると、ほとんどの Python プログラムは、静的分析の下では動的ですが、実行時にはどちらかというと静的で単形的です。これは、ランタイム JIT コンパイル アプローチが Python プログラムではるかにうまく機能することを意味します。Python をマシン コードにコンパイルする方法については、unladen-swallow、PyPy、Psyco を参照してください。しかし、もともと静的言語用に意図された仮想マシンを使用して Python をマシンコードにコンパイルする IronPython と Jython も同様です。
Pythonは「コンパイル」できます。コンパイルは、あるチューリング完全言語(ソースコード)から別の言語(オブジェクトコード)への翻訳と見なされます。ただし、Lispでは、オブジェクトはアセンブリです。これは、Python(実証済み)では理論的には可能ですが、実現可能ではありません。
ただし、本当の理由は平坦化が少ないことです。Lispは多くの点で革新的な言語であり、その方言で私たちが今日慣れているプログラミング言語の多くの機能を開拓しました。ただし、Lispsでは、言語の基本から論理的に「従う」だけです。JavaScript、Ruby、Perl、PythonなどのLispの生の表現力に触発された言語は、「Algolのような構文」を持つ言語でこれらの機能を取得するのが難しいため、必然的に解釈されます。
Lispは「ホモアイコニック」であることからこれらの機能を獲得します。LispプログラムとLispデータ構造の間に本質的な違いはありません。Lispプログラムはデータ構造であり、必要に応じてそのようなS式のプログラムの構造記述であるため、コンパイルされたlispプログラムは、レクサーなどを必要とせずに効果的に「解釈」します。解析ツリーの手動入力と見なされます。これには、多くの人が直感に反する構文を使用する必要があるため、パラダイムの生の表現力をより読みやすい構文に変換する試みが多くありました。つまり、コンパイルすることは不可能ではありませんが、実行不可能ではありません。組み立てに向けて。
また、Pythonをアセンブリにコンパイルすると、仮想マシンでの「半分の解釈」よりも遅く、大きくなる可能性があります。Pythonの多くの機能は、構文解析に依存しています。
上記は、巨大なLispファンボーイによって書かれていますが、その関心の対立を念頭に置いてください。
実際、Python プログラムを静的にコンパイルすることを妨げるものは何もありません。それは、これまで誰もそのようなコンパイラを作成していないということだけです (個人的には、Python のランタイムは CL のランタイムに比べて非常に簡単だと思います)。
その違いは、「実際にコンパイラを書くのにどれだけの時間が費やされたか、言語にはどのように書くかという正式な仕様があるか」などの詳細にあると言えます。
それらの点に対処しましょう:
- Lisp コンパイラは 40 年以上にわたって進化してきました。作業は 70 年代にさかのぼります (私の日付はよくわかりません。Google の正確な日付は怠惰すぎます)。これにより、コンパイラの作成方法に関する大量の伝承が作成されます。OTOH、Pythonは名目上「教育言語」として設計されており、そのようなコンパイラはそれほど重要ではありませんでした。
- 仕様の欠如 - Python には、言語の正確なセマンティクスを指定する単一のソースがありません。確かに、PEPドキュメントを参照することはできますが、実際の仕様だけが主要な実装である CPythonのソースであるという事実は変わりません。これは、(バイトコードへの)一種の単純なコンパイラです。
それが可能かどうかについてですが、Python は非常に単純な構造を使用してシンボルなどを処理します。つまり、その辞書です。プログラムのシンボルテーブルとして扱うことができます。データ型にタグを付けてプリミティブ型を認識し、保存された名前と内部構造に基づいて残りを取得できます。言語の残りの部分も非常に単純です。欠けているのは、それを実装して正しく実行するための実際の作業だけです。
その価値については、Python スクリプトは実行時に .pyc ファイルにコンパイルされます。 「コンパイルされた」Python ファイルを参照してください。
py2exeなどのツールを使用して、Python プログラムを実行可能ファイルにコンパイルすることもできます。