Lua、NekoVM、Potionなどのそれほど古くないVM言語がCで書かれていることに気づきました。
彼らは多くのC++機能を再実装しているように見えました。
それらをC++ではなくCで書くことには利点がありますか?
Lua、NekoVM、Potionなどのそれほど古くないVM言語がCで書かれていることに気づきました。
彼らは多くのC++機能を再実装しているように見えました。
それらをC++ではなくCで書くことには利点がありますか?
私はルアについて何か知っています。
Luaは純粋なANSI標準Cで記述されており、エラーや警告なしで任意のANSIプラットフォームでコンパイルされます。したがって、 Luaは、 Canon PowerShotカメラなど、世界中のほぼすべてのプラットフォームで動作します。奇妙な小さな組み込みプラットフォームでC++を実行するのは非常に困難です。
Luaは高性能VMであり、Cはメソッド呼び出し(仮想またはそうでない場合があります)と演算子のオーバーロードを表現できないため、コードを見るだけでCコードのパフォーマンスを予測する方がはるかに簡単です。C ++は、特にテンプレートライブラリを使用すると、気付かないうちにリソースを書き込むのが少し簡単になります。(VMだけでなくライブラリを含むLuaの完全な実装は、145Kのx86オブジェクトコードに適合します。Inteli7のL2および古いチップのL1にある小さな256Kキャッシュにも、言語全体が適合します。あなたがしているのは、これほど小さなものにコンパイルされるC ++を書くのははるかに難しいことです。)
これらは、CでVMを作成する2つの理由です。
彼らは多くのC++機能を再実装しているように見えました。
CよりもC++でポリモーフィズムを実装する方が簡単だと提案していますか?あなたは大いに間違っていると思います。
C ++でVMを作成する場合、C++のポリモーフィズムの観点からポリモーフィズムを実装することはありません。関数名をポインターなどにマップする独自の仮想テーブルを作成します。
明白な答えの1つは、相互運用性です。言語Xが言語Yで定義された関数を呼び出さなければならないときはいつでも、通常、XまたはYのいずれかがC(つまり言語C)であることを確認します。
C ++はABIを定義しないため、別の言語からC ++コードを呼び出すことは、移植可能にするのが少し難しいです。しかし、Cコードの呼び出しはほとんど簡単です。つまり、VMの少なくとも一部はおそらくCで記述しなければならないでしょう。それなら、一貫性を保ち、全体をCで記述してみませんか?
Cのもう1つの利点は、シンプルなことです。誰もがそれを読むことができ、あなたがそれを書くのを手伝うプログラマーがたくさんいます。C ++は、良い面も悪い面も、はるかに専門的な言語です。C ++で多くの印象的なことを行うことができ、多くの作業を節約できますが、それが本当に得意なプログラマーも少なくなります。
人々はCに慣れています。私はcfront1.0からC++を書いていますが、自分のプロジェクトのためにCを書く可能性が高いことを認めなければなりません。
物事を完全に制御したい場合は、Cの方が少し簡単です。
Lua には、Lisp で実装するのが非常に簡単な多くの機能もあります。要点は、C は抽象化の薄い層だけを備えた美化されたアセンブラー コードに過ぎないということです。これは、高度な抽象化を構築できる、やや洗練された白紙の状態のようなものです。C++ はそのような建物です。Lua は別の建物であり、C++ の抽象化を使用する必要がある場合は、既存の C++ 構造を中心に意図を曲げる必要があります。代わりに、白紙の状態から開始することで、自由に構築することができます。
C++ を「得意」にすることははるかに難しく、得意になるまでは多くのバグや問題が発生します。現在、特に大規模なプロジェクトに多くの人が参加している場合、そのうちの 1 人が十分に機能しない可能性がはるかに高くなるため、C でプロジェクトをコーディングする方がリスクが少ないことがよくあります。移植性の問題もあります。C コードは、C++ よりもコンパイラ間での移植がはるかに簡単です。
多くの場合、CのコードはC++よりもはるかに高速である可能性があります。たとえば、stdio.cライブラリのほとんどの関数はiostreamよりも高速です。scanfはcinよりも高速で、printfはcoutよりも高速です。
また、VMは高性能を要求するため、Cコードは完全に理にかなっていますが、プログラムの開発にはおそらく時間がかかります。
C++はCで実装されています。誰もがC++のアプローチに従っているのではないかと思います。
最新のC++コンパイラは、明示的なC ++からCへの変換を個別のステップとしてスキップ(または隠蔽)しますが、C ++言語には、基盤となるC実装に由来する特性があります。
2つの例。
参照に加えてポインタは完全にCのおかげです。参照で十分であり、それがJava、Python、Rubyのすべての動作方法です。
クラスは、基になるCコードで属性とメソッド関数を定義する方法にすぎないため、実行時に存在するファーストクラスのオブジェクトではありません。クラスオブジェクトは実行時にJava、Python、Rubyに存在し、操作できます。