AFAIK、ScalaおよびClojureはJavaおよびJavaはCで実装されています。多くのまたはほとんどの言語がCで実装されていると思いますたとえば、Perl、Python、SQLなどのCで実装されています。言語の実装についてはよくわかりませんが、1つの実装言語を優先する理由を教えてくださいJava別のCよりも?
ある言語が別の言語を実装することについての理論はありますか、それとも言語がチューリングマシンであると見なされるチューリングマシン理論に頼っていますか?
言語は何にも実装されていません。言語は、数学的な規則と制限のセットです。これは指定であり、通常は英語のセミフォーマルサブセットであり、特殊な仕様言語である場合もあります。
コンパイラと解釈は実装されており、必要な概念を表現するのに十分強力な言語であれば、anythingで実装できます。言語がチューリング完全であれば、問題はありません。ただし、チューリング完全ではない言語でチューリング完全言語のインタプリタを作成しようとしている場合は、創造性を発揮する必要があります。しかし、それでも可能かもしれません。トータル関数型言語を使用している場合は、インタープリターを共同データの共再帰としてモデル化できる可能性があります。
AFAIK、Scala、ClojureはJavaで実装されています
私が言ったように:ScalaとClojureは言語であり、何にも実装されていません。
ただし、どちらの言語にも実装は1つしかありません(とにかく、AFAIK)。 Scalaコンパイラとライブラリは完全にScalaで記述され、Clojureコンパイラは完全にClojureで記述され、Clojureライブラリはほぼ完全にClojureで記述され、コアデータ構造の一部はホストプラットフォームのネイティブシステムで記述されます。プログラミング言語(Javaポートの場合はJava、CLIポートの場合はC#、ClojureScriptの場合はECMAScript)。
JavaはCで実装されています。
繰り返しますが、Javaは言語です。仕様があり、何も実装されていません。
Javaには多くの実装があります。それらのほとんどすべてがJavaで書かれています。たとえば、OracleJDKに付属するJavaのjavac
実装はJavaで記述されています(興味深いことに、Scalaの設計者であるMartin Oderskyによって記述されています)。
ええと、実際には、全体「Javaプラットフォーム」を取ると、「Java」は実際には3つのものになります。
Javaプラットフォームのほとんどすべての実装では、Java言語とJREの両方がJavaで実装されています。 JVMの実装言語はプラットフォームごとに異なります。OracleJDKに同梱されているHotSpotJVMはC++で実装されていますが、Maxine JVM(これもOracleによる)はJavaで実装されています。 ECMAScriptに実装された実験的なJVMがあり、Rubyの第1版JVMのサブセットの一種の「おもちゃ」実装があると思います。
また、Javaのすべての実装がJVMLバイトコードのコンパイラとして実装されているわけではありません。たとえば、JavaをAMD64マシンコード、ECMAScript、LISP、または…にコンパイルするコンパイラがあります。
Perl、Python、SQLなど、多くまたはほとんどの言語がCで実装されていると思います。
私はPerlにあまり詳しくありませんが、Perlのすべての実装がCで書かれているわけではないと確信しています。たとえば、PonieはPASMとNQPで書かれており、PGEを使用しています。どこにもCはありません。 Perl6の実装はいたるところにあります:PugsはHaskellで書かれ、RakudoはPerl6、NQP、PASMで書かれ、CommonLispで書かれた実装があり、1つはSchemeで、おそらく他にもたくさんあります。
Pythonの場合、現在4つの主要な本番環境対応の実装があります。 CPythonはCで記述され、IronPythonはC#で記述され、JythonはJavaで記述され、PyPyはRPythonで記述されます。これは、静的に型指定された言語であり、Javaに多少似ていますが、適切な構文です。 Pythonのセマンティックサブセット。
PyPyの新しいJITコンパイラーの最初のプロトタイプはPrologで書かれました。
SQLには、Cで記述されていない多くの実装もあります。たとえば、Apache Derbyデータベース、HSQLDおよびH2はJavaで記述されているため、SQLコンパイラ/インタプリタもJavaで記述されています。 SharpHSQLとVistaDBは、C#で記述されたSQLデータベースの例です。
言語の実装についてはよくわかりませんが、ある実装言語Javaを別のCよりも優先する理由を教えてください。
インタプリタまたはコンパイラを実装するために言語を選択する理由は、実際には他のアプリケーションの場合と同じです。親しみやすさ。好奇心。誇大広告。迷信。技術的優位性。管理圧力。仲間からの圧力。あなたはそれに名前を付けます。
ただし、コンパイラまたはインタプリタを実装するのに他の言語よりも理にかなっている言語には、次の3つのクラスがあります。
#1が良いアイデアである理由は、プロジェクトへの支援を求める参入障壁を減らすためです。 PythonインタープリターをPythonで作成する場合は、すべてのPythonプログラマーが作成を支援できます。インタプリタを書くためには、あなたは必要解釈される言語を知る必要があります。別の言語で書く場合は、two言語を知っている必要があります。欠点は、言語が実際にはインタープリターやコンパイラーの作成に適していない可能性があることです。たとえば、SQLでSQLインタープリターを作成することを想像してください(またはさらに極端な場合:CSSでCSSエンジンを作成することもできません。 )。
#2が良い考えである理由は明らかだと思います:言語がインタプリタまたはコンパイラを書くために設計されている場合、インタプリタまたはコンパイラを書くことは言語よりもはるかに簡単ですnot書くために設計されています通訳者またはコンパイラー。欠点は、共同編集者が2つの言語を学ぶ必要があることです。言語実装を作成するために設計された言語の例は、MLとOMetaです。HaskellとScalaも優れていますが、それらは特に設計されていませんが、MLと多くの特徴を共有しています。
選択肢3を使用すると、ターゲットプラットフォームとの緊密な統合を実現できます。たとえば、Unixプラットフォームと緊密に統合する必要があるRuby実装を作成する場合、少なくともC、C++、Dまたは同様の言語で低水準言語ランタイムを作成することは理にかなっています。ここでの欠点は、2つの言語を知る必要があることと、その言語が言語実装の記述に特に優れていない可能性があることです。
ただし、スイートスポットに到達することもあります。たとえば、F#はCLIプラットフォーム用のネイティブシステムプログラミング言語として設計されており、MLを多用しているため、コンパイラの作成に非常に優れています。したがって、F#でF#コンパイラを作成する場合、#1、#2、および#3のすべての利点があり、欠点はありません。
#2をはるかに極端なレベルにすることができることに注意してください。コンパイラを書くのが得意な言語を1つだけ使用するのはなぜですか?コンパイラのさまざまな部分を書くのが得意なさまざまな言語を使用してみませんか?レクサーにはLex、パーサーにはyacc、タイプチェッカーにはProlog、セマンティックアナライザーにはHaskellを使用します。
たとえば、GHC HaskellコンパイラとライブラリはHaskellで記述されていますが、ランタイムシステムはCで記述されています。実際には、コンパイラの一部はPerlで記述されています。 GCCバックエンドはHaskellからCソースコードを生成します。次に、このCコードはGCCに渡され、アセンブリコードにコンパイルされます。アセンブリコードは、生成されたコードがHaskellの呼び出し規約に準拠するように調整を行うPerlスクリプトによって処理されます(これはCで表現できないため、生成されたCソースに含めることはできません)。最後に、アセンブリはGNUアセンブラに渡されます。
JavaまたはPythonエンジンが実装されているかどうかは、実際には問題ではありません。これらのエンジンがこれらの言語の仕様と互換性がある限り、いくつかあります。 Java CPUハードウェア上でネイティブに実行される仮想マシン。したがって、常にCで実装されているとは限りません。
C/C++コンパイラを使用してそれ自体を再コンパイルする場合が1つあります。
たとえば、C++コンパイラの開発者がバージョン5で作業しているとします。この新しいバージョンはバグを修正し、パフォーマンスを向上させます。彼らはバージョン4を使用してこの新しいバージョン5をコンパイルし、次にそのビルドを使用して同じコンパイラを再構築します。これにより、バグ修正とパフォーマンスの改善を備えた新しいコンパイラが作成されます。
Javaのような高級言語を使用して別の言語を作成する場合。これは実際にはより高度な有用性のケースにすぎません。ClojureはJava in使いやすさ。C++から同じレベルの使用法を達成するための努力の量は、プロジェクトが依存するすべての基礎となるJava機能を再実装する必要があるため、プロジェクトを非効率的にします。