他の言語を実装するためにCを使用すると、何らかの形で設計が制約されていますか?

StackOverflow https://stackoverflow.com/questions/3513780

質問

過去20年間に登場したほとんどの新しいプログラミング言語はCに書かれているようです。これは、Cは一種のポータブルアセンブリ言語と見なすことができるため、完全に理にかなっています。しかし、私が興味を持っているのは、これが言語の設計を何らかの形で制約しているかどうかです。私の質問が促されたのは、cスタックが呼び出し機能のためにPythonで直接使用される方法について考えていたことでした。明らかに、プログラミング言語デザイナーは、彼らが望むあらゆる言語で何でもできることを行うことができますが、あなたがあなたの新しい言語を書くことを選択した言語は、あなたを特定の考え方に置き、無視するのが難しい特定のショートカットを提供するように思えます。その言語で書かれていることから生じるこれらの言語の他の特徴はありますか?

役に立ちましたか?

解決

C実装があっても、実装の面で驚くほど自由です。例えば、 鶏のスキーム Cを中間体として使用しますが、まだガベージコレクターの保育園としてスタックを使用することができます。

とはいえ、制約がある場合があります。適切なケース:GHC Haskellコンパイラには、 邪悪なマングラー GCC出力アセンブリコードを変更して、いくつかの重要な最適化を実装します。彼らはそのために部分的に内部で生成されたアセンブリとLLVMに移動してきました。とはいえ、これは言語設計を制約していません - 利用可能な最適化のコンパイラの選択のみです。

他のヒント

私は反対する傾向があります。

言語のコンパイラまたはインタープリターがCで実装されるほどではないと思います。結局のところ、ホスト環境とはまったく異なるCを持つ仮想マシンを実装できます。つまり、あなたはあなたであることを意味します。 できる c / assembly言語の考え方から離れてください。

ただし、C言語を主張することはより困難です 自体 後の言語の設計に影響を与えませんでした。たとえば、巻き毛の装具の使用を考えてみましょう { } 声明をブロックにグループ化するために、白人とインデンテーションはほとんど重要ではないという概念(ネイティブタイプの名前)(int, char, 、など)およびその他のキーワード、または変数の定義方法(つまり、最初に宣言をタイプ、次に変数の名前、オプションの初期化が続きます)。今日の人気のある広範囲にわたる言語の多く(C ++、Java、C#、さらにはさらに多くのことがあると確信しています)はこれらの概念をCと共有しています(おそらくCでは完全に新しいものではありませんでしたが、Afaik Cはそれを思いつきました。言語構文の特定の組み合わせ。)

いいえ、要するに。現実には、C。luaに書かれている言語を見てみましょう。たとえば、Perlにならずに取得できるのと同じくらいCから遠く離れているということです。ファーストクラスの機能、完全に自動化されたメモリ管理などがあります。

言語に深刻な制限が含まれていない限り、新しい言語が実装言語の影響を受けることは珍しいことです。私は間違いなくCを不承認にしていますが、それは限られた言語ではなく、より近代的な言語と比較して非常にエラーが発生しやすく、プログラムが遅くなります。ああ、CRTを除いて。たとえば、LUAにはディレクトリ機能が含まれていません。これは、CRTの一部ではないため、Cが制限されている1つの方法である標準Cに携帯的に実装できないためです。しかし、言語の特徴の点では、それは限定されません。

Cで実装されている言語にはXYZの制限または特性があるという議論を構築したい場合、Cでは別の方法を行うことは不可能であることを示す必要があります。

Cスタックはシステムスタックのみであり、この概念はC以前のCをかなり先行しています。コンピューティングの理論を研究すると、スタックを使用することが非常に強力であることがわかります。

Cを使用するために言語を実装することは、おそらくこれらの言語にほとんど影響を与えませんでしたが、言語を設計および実装する人々のC(および他のCのような言語)に精通していることは、おそらくデザインに大きな影響を与えているでしょう。別の言語の最高の部分を積極的にコピーしていないときでさえ、以前に見たものに影響されないことは非常に困難です。

ただし、多くの言語では、Cをそれらと他のものの間の接着剤として使用しています。これの一部は、多くのOSがC APIを提供しているため、CAが簡単に使用できるようにアクセスすることです。さらに、Cは非常に一般的でシンプルであるため、他の多くの言語はそれとインターフェイスする方法があります。異なる言語で書かれた2つのモジュールを一緒に接着したい場合は、中間者としてCを使用することがおそらく最も簡単なソリューションです。

Cで言語を実装することがおそらく他の言語に最も影響を与えたのは、おそらく文字列で脱出がどのように行われるかのようなものであり、おそらくそれはそれほど制限ではないでしょう。

言語デザインを制約している唯一のことは、言語デザイナーの想像力と技術的スキルです。あなたが言ったように、Cは「ポータブルアセンブリ言語」と考えることができます。それが本当なら、Cが設計を制限しているかどうかを尋ねることは、アセンブリに言語設計を制限しているかどうかを尋ねることに似ています。任意の言語で書かれたすべてのコードは最終的にアセンブリとして実行されるため、すべての言語は同じ制約に苦しむでしょう。したがって、C言語自体は、異なる言語を使用することで克服される制約を課さない。

そうは言っても、いくつかのことがあります より簡単に ある言語と別の言語で行う。多くの言語デザイナーはこれを考慮に入れています。言語が文字列処理で強力になるように設計されているが、パフォーマンスは懸念事項ではない場合、より良い組み込みの文字列処理施設(C ++など)を使用する言語を使用することが最適かもしれません。

多くの開発者は、いくつかの理由でCを選択します。まず、Cは非常に一般的な言語です。特にオープンソースプロジェクトは、他のいくつかの言語で同等のスキルの開発者を見つけるよりも、経験豊富なCランゲージ開発者を見つけるのが比較的簡単に見つけることができるということです。第二に、Cは通常、微小最適化に役立ちます。スクリプト言語のパーサーを書くとき、パーサーの効率は、その言語で書かれたスクリプトの全体的なパフォーマンスに大きな影響を与えます。コンパイルされた言語の場合、より効率的なコンパイラはコンパイル時間を短縮できます。多くのCコンパイラは、非常に最適化されたコードを生成するのに非常に優れています(これは、多くの組み込みシステムがCでプログラムされている理由の一部でもあります)。また、Cは標準化されており、一般に静的ターゲットです。コードはANSI/C89標準に書き込むことができ、C99標準追加機能で行われた将来のバージョンが機能しますが、既存のコードを壊さないでください。最後に、Cは非常にポータブルです。特定のプラットフォームに少なくとも1つのコンパイラが存在する場合、それはおそらくCコンパイラです。 Cのような高度な言語を使用すると、新しい言語を使用できるプラットフォームの数を最大化しやすくなります。

頭に浮かぶ制限の1つは、拡張性とコンパイラホスティングです。 C#の場合を検討してください。コンパイラはC/C ++で記述されており、完全にネイティブコードです。これはそれを作ります 非常に C#アプリケーションでプロセスで使用するのは困難です。

これは、C#のツールチェーンに幅広い意味を持っています。実際のC#パーサーまたはバインディングエンジンを利用したいコードには、ネイティブコードで記述された少なくとも1つのコンポーネントが必要です。これにより、最終的には、C ++で記述されているC#言語のツールチェーンのほとんどが、言語で少し逆になります。

これは、SAYごとに言語を制限するものではありませんが、言語に関する経験に間違いなく影響を及ぼします。

ゴミコレクション。 Javaまたは.netの上にある言語実装は、VMのGCを使用します。 Cの上にあるものは、参照カウントを使用する傾向があります。

私が考えることができることの1つは、関数が必ずしも言語のファーストクラスのメンバーではないということであり、これはCだけでは非難されることはできません(私は関数ポインターを渡すことについて話しているわけではありませんが、Cはあなたに提供すると主張することができます。その機能で)。

Groovy(/Scheme/lisp/Haskell/Lua/JavaScript/などでDSLを書く場合、私が確信していないことがあります)、機能はファーストクラスのメンバーになることができます。ファーストクラスのメンバーを作成し、匿名関数を許可することで、簡潔で人間の読み取り可能なコード(LINQで実証されたような)を作成できます。

はい、最終的にこれらはすべてC(またはそのレベルに到達したい場合はアセンブリ)で実行されますが、言語のユーザーに自分自身をより良く表現する能力を提供するという点では、これらの抽象化は素晴らしい仕事をします。

Cにコンパイラ/インタープリターを実装するには、大きな制限はありません。一方、言語XからCコンパイラを実装します。たとえば、によると c-に関するウィキペディアの記事 より高いレベルの言語をCにコンパイルする場合、正確なごみ収集、効率的な例外処理、またはテール再帰の最適化を行うことはできません。これは、c-が解決することを意図した一種の問題です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top