22

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

4

9 に答える 9

8

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

言語のコンパイラまたはインタプリタがCで実装されることはそれほど多くないと思います。結局のところ、ホスト環境とはまったく異なるCを使用して仮想マシンを実装できます。つまり、C/ニア-から離れることができます。アセンブリ言語の考え方。

ただし、C言語自体が後の言語の設計に影響を与えなかったと主張するのはさらに困難です。たとえば、中括弧{ }を使用してステートメントをブロックにグループ化する場合、空白とインデントはほとんど重要ではないという概念、ネイティブ型の名前(intcharなど)やその他のキーワード、または変数の定義方法(つまり、最初の型宣言)を考えてみましょう。 、その後に変数の名前、オプションの初期化が続きます)。今日の人気があり普及している言語の多く(C ++、Java、C#、さらに多くの言語があると確信しています)は、これらの概念をCと共有しています(これらはおそらくCで完全に新しいものではありませんでしたが、AFAIKCはそれを思いつきました言語構文の特定の組み合わせ。)

于 2010-08-18T15:40:21.290 に答える
5

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

言語に重大な制限が含まれていない限り、新しい言語が実装言語の影響を受けることはまれです。私は間違いなくCに反対していますが、それは限定された言語ではなく、非常にエラーが発生しやすく、より現代的な言語と比較してプログラミングが遅いだけです。ああ、CRTを除いて。たとえば、LuaはCRTの一部ではないため、標準のCで移植可能に実装できないため、ディレクトリ機能は含まれていません。これは、Cが制限される1つの方法です。しかし、言語機能に関しては、それは制限されていません。

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

于 2010-08-18T15:36:31.213 に答える
5

Cを実装したとしても、実装に関しては驚くほど自由です。たとえば、チキンスキームはCを中間体として使用しますが、それでもスタックをガベージコレクターの保育園世代として使用することができます。

とはいえ、制約がある場合もあります。適切な例:GHC haskellコンパイラには、GCC出力のアセンブリコードを変更していくつかの重要な最適化を実装するためのEvilManglerと呼ばれるperlスクリプトがあります。そのため、内部で生成されたアセンブリとLLVMに部分的に移行しています。とは言うものの、これは言語設計を制約するものではなく、利用可能な最適化のコンパイラーの選択のみです。

于 2010-08-18T15:39:27.620 に答える
4

Cスタックは単なるシステムスタックであり、この概念はCよりもかなり前から存在しています。計算理論を研究すると、スタックの使用が非常に強力であることがわかります。

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

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

Cで言語を実装することがおそらく他の言語に影響を与えた場合、おそらく最も多くは文字列でのエスケープの実行方法のようなものですが、これはおそらくその制限ではありません。

于 2010-08-18T15:49:39.017 に答える
3

言語設計を制約しているのは、言語設計者の想像力と技術的スキルだけです。あなたが言ったように、Cは「ポータブルアセンブリ言語」と考えることができます。それが真実である場合、Cが設計を制約しているかどうかを尋ねるのは、アセンブリが言語設計を制約しているかどうかを尋ねるのと似ています。任意の言語で記述されたすべてのコードは最終的にアセンブリとして実行されるため、すべての言語に同じ制約が課せられます。したがって、C言語自体は、別の言語を使用することによって克服されるような制約を課しません。

そうは言っても、ある言語では別の言語よりも簡単にできることがいくつかあります。多くの言語設計者はこれを考慮に入れています。たとえば、言語が文字列処理で強力になるように設計されているが、パフォーマンスが問題にならない場合は、より優れた組み込みの文字列処理機能(C ++など)を備えた言語を使用する方が最適な場合があります。

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

于 2010-08-18T15:53:25.393 に答える
3

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

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

これは言うまでもなく言語を制限するものではありませんが、言語を取り巻く体験に間違いなく影響を及ぼします。

于 2010-08-18T17:09:09.713 に答える
2

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

于 2010-08-18T15:44:15.497 に答える
1

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

DSLをGroovy(/ schema / lisp / haskell / lua / javascript /など、私にはわからないもの)で作成する場合、関数はファーストクラスのメンバーになることができます。関数をファーストクラスのメンバーにし、無名関数を許可すると、簡潔で人間が読めるコードを記述できます(LINQで示されているように)。

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

于 2010-08-18T15:37:21.683 に答える
1

Cでコンパイラ/インタプリタを実装することには大きな制限はありません。一方、言語XtoCコンパイラを実装することはできます。たとえば、C--に関するウィキペディアの記事によると、高級言語をCにコンパイルする場合、正確なガベージコレクション、効率的な例外処理、または末尾再帰の最適化を行うことはできません。これは、C--が解決しようとしていた種類の問題です。

于 2010-08-18T16:20:49.237 に答える