CとC ++の間に言語はありますか?


18

私はCのシンプルで透明な性質が本当に好きです。Cコードを書くとき、「漏れやすい抽象化」に邪魔されずに、ほとんど常に、作成しているアセンブリに関して巧妙な推測をすることができます。また、Cのシンプルで使い慣れた構文も気に入っています。

ただし、Cにはクラス、簡素化された非cstring処理などのようなC ++が提供するこれらの単純で有用なdoodadがありません。ジャンプテーブルなどを使用してCで実装することはすべて可能ですが、さまざまな理由でタイプセーフではありません。

しかし、私はC ++のオブジェクトを過度に強調することを好むわけではありません。また、「新しい」演算子などに照れ気味です。C ++には、たとえば、システムプログラミング言語として使用するには、ちょっとした問題がいくつかあるようです。

ウィジェットとdoodadsの規模でCとC ++の間に位置する言語はありますか?

免責事項:これは純粋に事実に基づく質問です。C {、++}は私が計画していることを何でもするのに十分であるというあなたの見解を共有しないので、私はあなたを怒らせるつもりはありません。


10
あなたはあなたの質問は「純粋に事実」であると言いますが、しゃっくりが多すぎると「思われる」ので、c ++を割り引いています。これらのしゃっくりとは何ですか?また、c ++を割り引く正当な理由はありますか?
-whatsisname

2
「ウィジェットとドゥーダッドの規模」とは何ですか?「純粋に事実に基づいた」質問に対する真の答えが必要な場合は、意味のないメトリックを避けてください。
カレブ

2
そして、C ++について述べているいくつかのことは、誤った情報を裏切っています。newほとんどが強化されmallocており、メモリを初期化することできます。「placement new」およびを使用してoperator new、メモリを割り当てる方法と場所を決定できます。また、オブジェクトの強調に関しては、上記の数行では、クラスを「シンプルで役立つ道徳」と見なしていると述べています。決めましょう!

25
C+ 免責事項のt resist. It
knut

2
これは、連続体仮説のようにひどく聞こえますが、おそらく同じ答えがあります。(en.wikipedia.org/wiki/Continuum_hypothesis
ジョン・スミス

回答:


29

これらはあなたが探しているドロイドかもしれません...

Go- http://golang.org/

D- http://dlang.org/

Rust- http://rust-lang.org/


5
@dtech:Dには無意味なGC /「オブジェクトから継承するすべてのもの」/値はひどいものでなければなりません。私はすでにそのためのC#を持っていますが、実際には適切なツールがあります。行って、廃棄した理由の記憶がややかすんでいることを認めますが、覚えているように、それはいくつかの非常に有用な機能を削減しました。
-DeadMG

4
「C ++の本来の姿」を表す-1。C ++がそれであり、それを処理できない場合、それは主にあなたの問題です。自分に合った言語を使用することで対処できますが、それはC ++ その言語のようになっているべきだということではありません。
back2dos

7
@DeadMG Dで、2つの意味のあるステートメントを作成しました。GCは必須であり、すべてがオブジェクトでなければなりません。両方とも間違っています。あなたの結論は、実際の知識よりも無知に基づいていると思います。CodexArcanumに同意する必要があります。
-deadalnix

5
@deadalnix:技術的には、GCを使用しないことを選択できます。ただし、GCを使用するライブラリ関数または言語機能を知ることも制御することもできないため、実際にはGCを使用しないプログラムを作成する方法はありません。また、Objectを継承しないクラスを作成することはできません。そして、そのstructsはC ++の値と比較して真剣に垣間見られます-例えば、継承も右辺値参照もないので、Dの値文字列クラスのような単純なものを、C ++の同等物と同じくらい効率的に生成することは不可能です。これらはD言語に関する事実です。
DeadMG

5
@DeadMG:継承なしで構造体を作成することは機能であり、「見かけ」ではありません。それは彼らが正しくしたことであり、「C ++」という名前のないほとんどすべてのオブジェクト指向言語(元のオブジェクト指向言語であるSimulaを含む)が正しくなり、C ++が信じられないほど間違っていました。 継承タイプと値タイプは混在しません。 オブジェクトのアイデンティティを破り、リスコフの代替を破り、オブジェクト指向のパラダイム全体を破ります。
メイソンウィーラー

19

C ++にほぼ対応するか、著者がC ++で見た問題を修正しようとする、かなりの言語(Java、Go、D、Objective-Cなど)があります。

しかし、少なくともIMOは、それらのすべてが最も実用的な目的でC ++よりもかなり劣っています。

残念ながら、どのアセンブリコードが生成されるかを知っているというあなたの見た目の好みに基づいて、Objective CとJavaをすぐに除外することができます。

理論的には、Goはこれらの中で最も興味深いと考えています。Goには、真に独創的なアイデアと、ある種のコードをより簡単にする問題を解決する興味深いアプローチがあります。残念ながら、現在のコンパイラーは非常に優れたコードを生成せず、過去数年間にわたってその点に関して多くの改善はありません。

これは、Dがチャンスをもたらす唯一のものであることに変わりはありません。これはおそらくC ++(これらのうち)に最もよく似ていますが、問題と思われるものを修正する可能性が最も低い(IMO)です。

1つの明らかなアプローチが残ります。C++を使用しますが、必要な部分のみを使用し、気に入らない部分は避けます。


13
「C ++を使用し、好ましくない部分を避ける」ために+1。そして、OPにC ++の詳細を学ぶように提案します。人々は、それらを十分に知らないという理由だけで物事をしばしば拒否します。
Doc Brown

1
@DocBrownおそらく、C ++を十分に理解するのはそれほど簡単ではないからでしょう。
マルコム

3
@Malcolm:現代のC ++を深く学ぶことはもちろん難しい。しかし、一方で、「新しいオペレーターに恥ずかしがり屋」である理由は全くありません。
Doc Brown

3
@Malcolm:おそらくコンセプトが非常にシンプルだからです。UTF-32文字列リテラル、またはUTF-16文字列リテラルが必要ですか?さて、wtf文字列エンコーディングの基本を知っていると仮定すると、それは答えが非常に簡単な質問です。そして、それらの多くのハード機能は?それらには理由があります。たとえば、Javaのジェネリック。彼らは哀れなテンプレートに比べて。確かに、学ぶべきことは少ないですが、それは単にそれらがあまり有用ではないからです。それは難しいBrainfuckより複雑なものを呼ぶようなものです。
-DeadMG

3
@Malcolm:それはまったく真実ではありません。人気は、言語が良い/有用であるかどうかとは別に、99999のものに影響されます。
-DeadMG

16

ただし、Cにはクラス、簡素化された非cstring処理などのようなC ++が提供するこれらの単純で有用なdoodadがありません。ジャンプテーブルなどを使用してCで実装することはすべて可能ですが、さまざまな理由でタイプセーフではありません。

しかし、私はC ++のオブジェクトを過度に強調することを好むわけではありません。また、「新しい」演算子などに照れ気味です。

すみません、相棒、矛盾アラーム。非cstring処理にはが必要 newです。それは基本的な必要性です。std::stringなくしてはいけませんnew。さらに、new/ deleteとまったく同じですmalloc/ freeしかし、より安全な、それは正しい構築と破棄ヒープは、オブジェクトの(全く必要!)、代わりの取り扱い用途例外保証しているため、NULLリターンを、したがって、すべてのファッションの想像性に優れています。C ++ 11 newでは、完全な転送によりあらゆるタイプのコンストラクタを処理できるため、独自のスタイル関数を作成することは非常に可能です。あなたが銃を恥ずかしがり屋であるならnew、私はあなたが単にあなたが何を扱っているか本当に本当に知らないことを提案します。

ああ、そうです、そしてスマートポインターがそれを実現するので、あなたは実際にこれのいずれかを実際に処理する必要はありません。

さらに、C ++には過剰な強調はありません。不要なオブジェクトを使用する必要はありません。ラムダなどの機能を使用して、いつでも機能的にプログラミングできます。継承と仮想関数の使用を強制する人はいません。実際、多くの優れたC ++プログラムはほとんど継承を示しません。テンプレートは、より強力で便利な抽象化手法です。これはJavaではありません。


1
同意する。(おそらく劣る)代替手段を検索するよりも、希望する方法でC ++を使用することをお勧めします
-dtech

1
私はラムダが機能的にプログラムするのに十分だとは思わない。また、関数合成演算子、カリー化なども期待しています。stackoverflow.com/questions/1981400/functional-programming-in-cも参照してください。私にとっては、CでOOPをやるような気がします...-
ジョルジオ

@Giorgio:その質問の答えは、「難しい!」と言うだけです。彼らはそれが実際に難しいという証拠を示していません。関数の合成に別の演算子が必要なのはなぜですか?f(g(x))私にとってはうまくいくようです。また、カリー化は一般的にC ++ 11のライブラリとして実行できると考えています。
DeadMG

1
@DeadMG:関数合成演算子は、関数型プログラミングにおいて非常に確立された基本的な概念です。FPをサポートする言語で見つけると期待しています。変数を使用せずに、複雑な関数を他の関数(Unixでパイプを使用する場合など)の構成として定義することは非常に便利です(簡潔):k = h g。f
ジョルジオ

1
@Giorgio:std::bindそのようなことをサポートします。
DeadMG

4

CはほとんどC ++のサブセットなので、C ++の好きな部分だけを使用し、残りは無視できます。有効なC ++でもある有効なCを記述することも可能です。

慣用的なC ++を書くことはありませんが、それは得られるほど「中間」にあります。

または、Cをより強力なもの、特にDとObjective-Cに拡張しようとする他の言語をチェックアウトすることもできます。

そして最後に、プロジェクトの性質に応じて、プロジェクトをモジュールに分割し、各部分に最適な言語を選択するという多言語アプローチを採用できます。これの欠点は、言語を連携させる必要があることです。これは、労力を費やすには多すぎる作業になる可能性があります。


実際、コンソールゲーム開発など、「CとC ++の中間の言語」が本当に欲しかった業界で働くことは、まさにそれでした。C ++機能のサブセットを使用しましたが、パフォーマンスが重要なループ内では、特定のものが立ち入り禁止になっている可能性があります。
Carson63000

3

野生の、すぐに使える答えを提供するために:必要な言語が存在しない場合は、自分で作成してみませんか?(F)LexとYacc / Bisonの古いスタンバイのすぐ下に、さまざまな強力な言語開発ツールがあります。すでにCを知っているので、Cコードを出力するための「コンパイラ」が必要なだけで、既存のツールチェーンを使用します。

これは、あなたが思っているよりも簡単で強力です。Cのパーサー/レクサーから始めて、重要だと思われる追加機能を追加します。ジャンプテーブルが手作業で書くのが面倒な場合は、要約を表現するための構造を見つけ、インタープリタにそれらを書かせてください。基本的に、これは、メタプログラミングを行うために外部ツールを使用する、単なる高レベルのプリプロセッサメタプログラミングです。Cを知っているので、最終アセンブリがどのようなものになるかを常に正確に知ることができ、言語拡張がどのCに拡張されるかを知っています。

明らかに、多くの余分な作業をせずにこれがどれほど効果的であるかには、いくつかの制限があります。完全な静的型システムを追加することは、あなたが入ろうとするよりも少し複雑かもしれませんが、それが好きなら、それはあなたが探検できるオプションです。DSL拡張機能は、時間と労力をかけて作成するのと同じくらい強力で複雑です。おそらく、拡張言語はいつか「次のC ++」になるでしょう。


2

C ++の機能があなたにとって面倒なことを言ったことはありません。とにかくObjective-Cを試す​​ことができます。C ++の標準ライブラリではなく、オブジェクト指向に重点を置いています。


2
imho Objective-Cは、Cにクラスを導入しようとするわずかな試みであり、C ++よりも多くの点で劣っています。さらに、Mac OS X / iOS以外ではほとんど使用されません。
-dtech

1
@dtech:おもしろい、かつての同僚で、Macファン(Debian / Linuxの男ではない)でなく、Objective-CはC ++よりもCのOO拡張機能がずっときれいだと確信していました。私はObjective-Cを試したことがないので、これについて意見はありません。
ジョルジオ

1
@dtech:それから謙虚にあなたの意見を再考することをお勧めします;)Objective-Cはオブジェクト指向についてであり、メッセージパッシングを導入するため、C ++よりもはるかに良い仕事をします。この言語は多くの点でC ++より劣っていることに同意しますが、他の点でも同様に優れています。
back2dos

@Giorgio私はあなたの同僚に同意しますが、Obj-Cにもいくつかの制限があります(おそらくこれらのいくつかはObj-C 2.0でなくなっています)。 Cでla Fortranをオーバーロードする関数
-ShinTakezou

2

組み込みの世界では、Embedded C ++が指定されています。これは、あなたが探しているものかもしれません。多重継承などのようなものを削除しました。私が知っている限りでは、それはほとんど死んだ。


0

あなたはこの綿密見つけるかもしれないC ++、Objective-Cの、JavaとC#の横並びの比較に便利です。個人的には、C#はC ++よりもずっときれいに動作すると思います。構文と数値データ型が類似しているため、あまり多くの変更が必要になることなく、いくつかの(数値/計算)C関数をC#に移植しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.