web-dev-qa-db-ja.com

WebアプリにCを使用しないのはなぜですか?

今朝出会ったとき、私はいくつかの異なるWebサーバーを見ていました G-WAN 。私が理解しているように、それはCで書かれたWebサーバーであり、CでWebサイト/ Webアプリを書くことでそれを利用する必要があります。1つの明らかな利点はG-WANサイトが示唆する速度です。

しかし、フォーラムで、G-WANの作成者は、WebベースのアプリにCを使用しない理由を尋ねました。それが難しいこと以外に、単一の理由を考えることはできません(とにかく、私はCに関しては初心者です)。これらの言語で開発するのが簡単であることを除けば、PHP、Python、Rubyなど)を使用する理由はほかにもあるはずです。それは正当な理由とは思いません。

だから私はあなたにそれを置きます:あなたはなぜあなたのウェブアプリにCを使用しないのですか?

96
Abs

Cプログラムを正しく安全に取得するには、多大な注意が必要です。その注意は、あなたのプログラムを書く本当に良い人が必要であることを意味します。それはあなたがもっと払うことを意味します。

また、Cには、.NET(およびその他の主要なWeb中心のプラットフォーム)が持つような機能の巨大な単一の標準ライブラリから描画する利点がありません。したがって、コンポーネントを購入するか、相互運用を実行するか、または「無料」で提供される独自の機能を追加する必要があります。PHPまたはC#またはRubyまたは何でも。それはあなたがもっと支払うことを意味します。

シングルスレッドの計算速度はウェブ上ではそれほど重要ではないという事実に、これらすべてを追加してください。より多くのスケーラビリティが必要な場合、ほとんどの組織は経済的に問題にコアを追加するだけで問題ありません。もちろん、これはすべての人に当てはまるわけではありません。 Googleのエンジンの中核は、速度のためだけでなく、電力コストを節約するために、Cまたは同様の言語で書かれていると思います。

76
Dave Markle

ハム...

私はこの議論に少し遅れているように見えます-しかし、私は今それを発見しました。そして、たくさんのご意見をありがとうございました。

私はG-WANの著者であり、この問題に真剣に取り組んできたことを明確にしています:G-WANは他のすべてのWebサーバーよりも高速(処理なし)および他のすべてのWebアプリケーションサーバー(想像できる任意の処理)。

はい、ANSI Cは、より強力なCPUでより静的なコンテンツを処理することも可能にしました(ANSI Cは、動的なコンテンツを飛行させるだけではありません)。

ちなみに、G-WANはCスクリプトを使用するため(Cコンパイラとリンカは不要)、コンパイル/リンクサイクル/遅延は存在しません。

G-WANと.NET JavaおよびPHP)を比較する過程で、4つの言語すべてでsimilarアプリケーションを作成しました: http://gwan.ch/source/

そして、残念なことに、最新のスクリプト言語はnotより使いやすいものでした。

特にイライラする仕事の一部は、あなたがやりたいことをする「魔法の」APIコールを必死に検索することです

以下で「かなりの数千」を行う方法を考えてください。

C#

String.Format("{0:n}"...

Java

new DecimalFormat("0.00"); ...

PHP

number_format($amount, 2); ...

ANSI C

sprintf("%'.2f", amount);

「...」は、事前設定または後処理が必要であることを意味します。 ANSI Cは明らかに使いやすく、覚えやすいです。

PHPに5900を超えるAPI呼び出しがある場合(C#およびJavaそれほど遠くない))、rightAPI呼び出しはそれ自体が課題です。これを見つける(そしてnativeAPI呼び出しのひどさを見つけるのに時間を浪費します実装されます)、次に必要なときにハートで学習する時間です。この時間はすべて、アプリケーションの問題を解決するのに必要な時間を奪います。

(上記)PHPはANSI Cよりも簡潔ですか?なぜ"//:: this is a comment ::" のではなく "// this is a comment"?なぜそんなに愚かな複雑な「かなり数千」の構文があるのですか?

他の通常の引数は、JavaなどがWebアプリケーションの専用呼び出しを提供するということです。

JavaでHTMLをエスケープするものを見つけることができなかったので、私のバージョンを書きました:

  // all litteral strings provided by a client must be escaped this way
  // if you inject them into an HTML page
  public static String escape_html(String Name) {
      int len = Name.length();
      StringBuffer sb = new StringBuffer(len);
      boolean lastWasBlankChar = false;
      int c;

      for(int i=0; i<len; i++) {
          c = Name.charAt(i);
          if(c == ' ')  sb.append("&#32;");  else
          if(c == '"')  sb.append("&quot;"); else
          if(c == '&')  sb.append("&amp;");  else
          if(c == '<')  sb.append("&lt;");   else
          if(c == '>')  sb.append("&gt;");   else
          if(c == '\n') sb.append("&lt;br/&gt;"); else {
             c = c&0xffff; // unicode
             if(c < 32 || c > 127) {
                sb.append("&#");
                sb.append(new Integer(c).toString());
                sb.append(';');
             } else
                sb.append(c);
          }
      }
      return sb.toString();
      //szName = sb.toString();
  }

ANSI Cの同じコードがもっと複​​雑になると本当に信じていますか?いいえ、非常にシンプルより高速です。

Java(Cから派生)はrequireingプログラマが複数行の文字列を「+」でリンクすることを要求する
C#(Cから派生)は、プログラマーが複数行の文字列を「+」でリンクすることを要求する
PHP(Cから派生)は、プログラマーが複数行の文字列を「。」にリンクすることを要求する

ANSI Cには、今では完全に愚かな(廃止された)要件はありません。

それでは、現代の言語が主張するsoobviousの進歩はそうでしたか?まだ探しています。

心から

ピエール。

46
Pierre

ほとんどのプログラミングでCを使用しないのと同じ理由です。利点(主にパフォーマンス)は、コスト(開発時間、自動メモリ管理の欠如、バッファーオーバーフローからの自動保護の欠如、編集段階とテスト段階の間にコンパイル段階があるなど)を上回りません。

45
Quentin

ほとんどのネットワークアプリケーション、特にWebサーバーは、はるかに「I/Oバウンド」です。つまり、ネットワークが受け入れることができるよりもはるかに高速にデータを送り出すことができます。したがって、CPU効率の高いものは大きな勝利ではありませんが、スケーラブルで保守可能なものは大きな勝利です。したがって、Cの欠点を受け入れ、Java、.NET、Python、Perlまたは他の言語のような管理された環境の利点を失う理由はありません。

27
Paul Tomblin

Cは、文字列を操作するための便利な言語ではありません。

C#の比較:

string foo = "foo";
string bar = "bar";
string foobar = foo + bar;

対応するC:

const char* foo = "foo";
const char* bar = "bar";
char* foobar = (char*)malloc(strlen(foo)+strlen(bar)+1);
strcpy(foobar, foo);
strcat(foobar, foo);
//todo: worry about when/where the foobar memory
//which was allocated by malloc will be freed
15
ChrisW

難易度と複雑さがまったく問題にならなければ(ha!)、Cに留まることはありません。x86アセンブリを作成します。 x86以外のWebサーバーを使用してから何年も経ちますが、毎日見かけはますます少なくなっています。

Cを(アセンブリ、またはより高いレベルの代わりに)使用することは、Cがプログラマーの効率とコンピューターの効率のスイートスポットであることを示唆することです。

私が書いたプログラムの場合、これは当てはまりません。Cは私が書きたいプログラムの種類にあまりマッチせず、まともなマクロアセンブラに対する利点はそれほど重要ではありません。私が今書いているプログラムは、私が選んだHLLでは難しいことではありませんが、アセンブリーまたはCでの複雑さは非常に高く、決して終わらないでしょう。私は、十分な時間のある十分に賢いプログラマーがAssemblyまたはCでより速く実行できることを認めますが、私はそのプログラマーではありません。

10
Ken
  • 安全でない
  • 読みにくい
  • 維持するのが難しい、開発時間は桁違いに遅い
  • webの大部分はおそらくI/Oにバインドされているため、特にJavaまたはC#

私はこの質問がすでに死に答えていることを知っていますが、これまで言及されていない2つのことがありますコードでの作業。

  1. 関与し、有用なコミュニティ、別名私の問題をすでに解決した人々。 PHPで「ヘッダーは既に送信されています」というエラーが発生する理由は、Googleに最も慣れている人でもかなり簡単です。臨界質量。
  2. ほとんどのプログラマーがコードを一緒にハッキングせずにビジネス上の問題を解決できるようにするフレームワーク。

極端なパフォーマンスを必要とする重要なアプリがある場合、Cを使用しますが、書くのに非常に時間がかかり、市場に出ることはありません。 #1または#2のいずれかになるまで、使用することはできません。

6
Jordan

Cは、多くの目的(no-OOP、大量の手動リソース管理)のための非常に低レベルの言語です。

Klone など、WebでのCの使用は限られています。これは主に、リソースの少ない組み込みアプリケーションの場合に使用されます。

ただし、高性能Webアプリケーション開発に使用される CppCMS などのC++Webフレームワークがあります。

C++を使用すると、大規模なアプリケーションを展開および開発するためのはるかに優れたオプションを提供しているため、高度に抽象化され、きめ細かくアクセスできます。

ただし、Javaのような言語用の優れたWebフレームワークを使用すると一般的にWeb開発が速くなるため、パフォーマンスとリソースの使用が市場投入までの時間と開発コストよりもはるかに重要な場合に使用します。PythonまたはPHP。また、一般的に、同じ給与のJava/P *言語よりもC++の方が能力の低いプログラマーがいます。

したがって、優先順位の問題であり、PHP/Python/PerlまたはJavaの場合よりもC++ Web開発用のツールのほうが少なくなります。

6
Artyom

これらの言語での開発が容易であることは別として、PHP、Python、Rubyなど)をすべて使用する理由は他にもあるはずです。

これが全体の理由であり、唯一必要なものです。多くの利点がありますが、その主なものは市場投入までの時間ですPHP Cを使用すると、1週間のうちにRuby on Rails Cを使用して2週間ではなく、新しい機能を追加できます。 Cを使用して2日間ではなくPythonを使用して1日でバグを修正できる場合、もう一度勝ちます。競合他社の言語Xを使用しているため機能を追加できる場合言語Yを使用しており、リソースの制約を考えるとその言語では難しすぎるため、まったく追加できません

そして、「勝つ」とは、本当にあなたが負けないことを意味します。あなたの競争相手は、サイトを開発するために高レベルの言語とフレームワークを使用しています。 Cを使用する他の人は、Cを使用しない他の人に対して負けています。競争するためには、同様の抽象化レベルのツールを使用する必要があります。

パフォーマンスが問題になる場合は、サイトの遅い部分をパフォーマンスの高い言語に書き換えることができます。または、さらに多くのハードウェアを投げることができます。実際、パフォーマンスの問題とは、「ナイスな問題」と呼ばれるものです。つまり、すでに成功しているということです。しかし、サイトの基本的な機能の開発により多くの時間を費やすことはめったにありません。それをより速く実行するようにCで書くことは時期尚早な最適化であり、Knuthが言うように、これはすべての悪の根源です。

これは、PythonまたはRubyよりも高い抽象化レベルの言語を使用できる場合、PythonまたはRuby。Paul。彼と彼のチームがどのようにWebサイトの開発で「秘密兵器」としてLISPを使用したかについてのGrahamの話は有益かもしれません http://www.paulgraham.com/avg.html

もちろん、あなたがあなた自身の娯楽のためのサイトを開発しているなら、あなたが望むどんな言語でもそれをしてください。また、サイトがCPUバウンドである場合(ほとんどありません。通常はI/Oバウンドです)、可能な限り高速な言語を使用してください。ただし、革新しようとしている場合は、最高の抽象化を備えた高水準言語を使用してください。

5
kindall

@Joeri Sebrechts

F.U.D.動作中:

PHP、Pythonなどは、問題にハードウェアを投げることで簡単にスケールアップできます。

まあ、実際にはありません。垂直方向のスケーリングはまったく行われず、水平方向のスケーリングは非常に不十分です。 http://gwan.ch/en_scalability.html を参照してください。ここでは、パフォーマンスが悪い人の前にどれだけのトラブルがあるかが説明されています。

PHPでアプリを開発するには1人で1年、Cで開発するには3年かかると仮定します(Cは同じことをするのにより多くの努力を要するため)。

また違う。 PHPライブラリがCで作成されている場合、Cから直接使用できます-PHP.

つまり、Cコードのハードウェアの必要性の削減は、Cが魅力的になるために2年分の賃金を表さなければならないことを意味します。実際には(ほとんど)決して起こりません。

ピュアF.U.D. (上記の回答を参照)。

Facebookの規模は非常に大きいため、ハードウェアは気にするのに十分なコストです。 PHP= C++にクロスコンパイルするHipHopを開発したのはこのためです。PHPのプログラミングのシンプルさとC++の生のパフォーマンスの両方の長所をもたらします。 PHP。ただし、使用する場合はすべてネイティブコードです。

HipHopはPHPよりもはるかに高速です。しかし、HipHopとプレーンCの実装を比較すると、2つのオーバーヘッド層があります。

  • PHP C++インターフェイス(肥大化したC++ライブラリを使用)へ);
  • c ++の膨張(C++をプレーンなCの2〜10倍遅くする)。

さらに、HipHopは、非現実的な非効率的なアカデミックモードで記述されています(現実世界の現実から切り離されています)。確かに、それはPHPコーダーを印象づけることができますが、このコードを組み込みプログラマーに見せると、彼はFacebookを気の毒に思うでしょう。

「すべてを備えていない言語は、実際にプログラミングを行う言語よりも簡単です」--Dennis M. Ritchie

(ほとんどの)プログラミング言語のエンドユーザーとは異なり、デニスはこの問題についていくつかのことを知っていたようです。

5
Pierre

簡単であることは正当な理由ではないと思います。それには十分な理由があると思います。究極のパフォーマンスが必要な場合はCでも構いませんが、他の言語は難しいものを取り除き、生産性、保守性を改善し、欠陥を減らします。

4
Craig

私はWeb開発者ではありませんが、とにかくこれらの質問をして、ポイントを1つまたは2つ提供します。

どのWebサイトが1つの言語のみで書かれていますか?真剣に、このスレッドは1本のハンマーがすべての釘に適合すると想定しているようです。

Cが複雑であると誰かが真剣に述べたのはいつですか?本当に低レベルを得ることができない人を意味します。この2つはしばしばまとめて参照されるため、ここではC++については説明しません。

Cにはセキュリティ上の懸念がありますが、否定することはできませんが、それらはPHP&Perl? 。

いずれにせよコメントへ。特定の言語を使用することの難しさは、手元の問題Cに非常に依存しています。特にC++は、経験豊富な手で問題を迅速に解決できる場合があります。

Webサーバーの産業用途、つまり組み込みサーバー/サイトには、通常のWebサーバーが持つ可能性のある言語の選択肢がありません。そのため、CのバリアントまたはBASICのようなものを使用することになります。あなたの目標は、デバイスに必要な機能を提供することであり、言語について心配することではありません。主流のWebサーバーでは、ほとんどの場合、これを行う方法は高水準言語を使用します。大きな鉄から離れて、あなたのプログラミングの自由はドアから出ます。

適切なライブラリがなければ、ほとんどの場合、CでWebプロジェクトをゼロから始めるのは愚かなことです。標準化された適切なライブラリの欠如は、ここで大きなマイナスになります。

4
David Frantz

以下は、C用に書かれたWeb関連のコードで、Web用の独自のCライブラリを作成するときに見る価値のあるものです。

  • cgic:CGIプログラミング用のANSI Cライブラリ
  • cgit:gitリポジトリ用のWebフロントエンド
  • wbox:HTTPテストツール
  • wget html-parse.c
  • curl cookie.c
  • 割引、David ParsonsによるJohn GruberのMarkdownテキストのHTML言語へのC実装
  • プロトスレッド(特に組み込みシステム用)、 http://www.sics.se/~adam/software.html
  • protothread、LarryRuaneによるGoogleコードプロジェクト
  • uriparser sourceforgeプロジェクト
  • http-parser、githubのRyan Dahlによるcのhttp要求/応答パーサー
  • nginx
  • ...
3
ceeit

あなたが言及したすべての言語は、実際にはC/++で書かれています。唯一の違いは、Cから作成された高度なクラスとライブラリであり、現在これらの他のインタープリター言語を構成しています。また、スクリプト言語と呼ばれる理由でもあります。

ケーキを焼くようなものだと考えてください(PHP/JS):

  • 卵2個、牛乳1カップ、バター2本、小麦粉4カップ、砂糖1カップ、重曹

しかし、それらのものを構成するすべての要素を作成しなければならないことを想像してください。 (C/++)

  • 重炭酸ナトリウム17 mg、タンパク質15 tbs、Vitelline膜12 tbs、アミノ酸、硫黄、...中性子粒子

Cは多くの現代言語の基盤です。それは素晴らしいですし、アセンブリの下でほとんど最も強力な言語です。これらの他の言語がすでに行っていたすべてのコードの構築に投資するだけで、それを行うことができます。周期表からケーキを作るようなものです。

文字通り何でもできるようにすることができます!

2
GetBackerZ

次の場合、WebアプリにCを使用します。

  1. ホスティングサーバー(小さなVPS)に少し予算があり、私の時間は高くありません。
  2. 私は、Facebook、Twitter、または使用するサーバーの数を減らす必要がある人(数千から数百万のユーザー)のために働いています。
  3. Cを学びたいのですが、実際に使用できるアプリを見つける必要があります。
  4. 私はCを他のスクリプト言語よりもはるかによく知っています。
  5. 私はエコマンであり、アプリの二酸化炭素排出量を削減したいと考えています。

G-WANはコードをスクリプトとして実行します。はい、Play!のようなCスクリプトです。フレームワークはJava用です。 G-WANは非常に高速で、簡単なAPIを備えています。 G-WANを使用すると、他のサーバーが失敗した場合にWebアプリにC/C++を使用できます。

1つのことは明らかです。CでWebサイトを作成するには優秀なプログラマーが必要です。すべてのくだらない開発者はスパゲッティでサイトを作成できますPHP :-) 。

2
rtacconi

さて、Web開発は有用なライブラリ(PHPで使用される種類)の問題であるという事実を考えると、Cが有用でないことはわかりません。

結局のところ、手続きロジックは同じです。C、PHP、.Net、Perlのいずれであるかにかかわらず、while、for、if then elseなどを実行します。

また、Cのループまたはテストは、Cで記述されているため、記述するのが難しくありません。

ほとんどのPHPライブラリはCで作成されているため、missing-C-libraries-for-the-Web引数はそれほど説得力がないように見えます。

私の推測では、CはJava(Sun)および.Net(Microsoft)のプロモーターによってWebプログラミング言語として宣伝されていなかったのは、独自の独自の(採用のためにプッシュする知的財産)。

Cは無料の(非特許)標準として、開発者に「ロックイン」グリップを提供しません...したがって、多分、納税者の​​お金が私的利益に裏打ちされた劣った技術。

CがIBMとMicrosoft(PHPまたは.Net)で製品を開発しない)には十分であるが、エンドユーザーには十分でない場合、エンドユーザーはなぜそうなのか疑問に思うかもしれませんこの二重標準に苦しむように招待されました。

2
Vince

Cでの文字列処理は、次を使用して簡単に行うことができます。

データ型(libslackの一部)

Libslackは、Listと呼ばれる汎用の拡張可能なポインター配列データ型、Mapと呼ばれる汎用の拡張可能なハッシュテーブルデータ型、および関数のヒープに付属する適切なStringデータ型(多くはPerlから解除されています)を提供します。また、オプションの「成長可能な」フリーリストを備えた、一重および二重にリンクされた抽象リストデータ型もあります。

または:

マネージストリングライブラリ(C用)

http://www.cert.org/secure-coding/managedstring.html

1
ceeit

「domachine」の書き込み:

プラットフォーム依存性:Cはネイティブコードにコンパイルする必要があります。このコードはすべてのプラットフォームで実行されるわけではありません。インタープリターが存在する場所であれば、解釈された言語(PHPなど)が実行されます。もちろん、この問題は解決できますが、この特定のケースではPHPで開発することの利点がわかります。

portable PHPインタープリターはどの言語で書かれていますか?

ANSI Cで.

そのため、ANSI Cの移植性を再度無視する前に、お気に入りのプログラミング言語が記述されている言語を自問してください(ヒント:ほとんどすべてがC/C++で記述されています)。

ANSI Cコンパイラは、私が作業しなければならなかったすべてのプラットフォームで利用可能です-PHPとその巨大なランタイムについては同じではありません。

移植性引数についてはこれだけです。

1
CClue

最終的に、アセンブラー(CGIなどを含む)を含め、絶対に任意の言語を使用してサイトを開発できます。コンパイル済みの言語を使用しない理由をお考えの場合は、既に.NET、Javaなど)があります。

0
Andrei Rînea

あなたは結果を達成するためにあなたがしていることを愛さなければなりません。 Javaやphpは人々の生活を楽にするために多大な努力を払って作成されました。今日のPhpは多くの自習したWebプログラマーに恩恵をもたらしています。ウェブ開発。

Java iamは、今日の世界で可能なあらゆることを支援するために書かれたはずです。巨大な本は明確な兆候であり、Web開発にも目を向けているのなら、それは獣です。 Pythonについても同じことが言えます。これらはとても素晴らしい言語とプラットフォームです。彼らが非常に人気があるのも不思議ではありません。

私はCの信奉者であり、一部には、PHPのような他の言語を見ることができない特定の制限が原因です。私は毎日Cで書いており、毎日新しいことを学び、学ぶことを誇りに思っています。これにより私は非常に気分が良くなり、Cgiを介してWebサイトのアプリケーションを作成するときにCがデフォルトの選択である方法についても学び始めました。これは他のプラットフォームで抽象化されており、データベースとWebサービスに関係するWebサイトを開発するとき、舞台裏で何が起こっているのかを知る必要があります。

ただし、そのすべてを知っていて、スクリプト言語を使用したい場合は、正当な理由が必要であり、それについて助言する必要はありません。

0

もう1つのポイントは、プラットフォームの依存関係です。 Cはネイティブコードにコンパイルする必要があります。このコードはすべてのプラットフォームで実行されるわけではありません。

通訳言語は、インタープリターが存在するすべての場所で実行されます。たとえば、多くのプロバイダーは、サーバーにインストールされているがWindows OSを備えたPHPインタープリターを提供しています。 Linuxマシンで開発している場合。問題があります。

もちろん、この問題は解決できますが、この特定のケースではPHPで開発することの利点がわかります。

Domachineについて、これがお役に立てば幸いです

0
domachine

G-WANに似ていますが、Cocoa/Objective-CにはWebアプリケーションフレームワークであるBombaxがあります。

http://www.bombaxtic.com

Objective-Cといえば、MacRubyを指摘することは避けられません。MacRubyは、いつかWebアプリを作成する方法に革命を起こす可能性があります。

0
gregg

PHP、Pythonなどは、問題にハードウェアを投げることで簡単にスケールアップできます。

PHPでアプリを開発するには1人で1年、Cで開発するには3年かかると仮定します(Cは同じことをするのにより多くの努力を要するため)。つまり、Cコードのハードウェアの必要性の削減は、Cが魅力的になるために2年分の賃金を表さなければならないことを意味します。実際には(ほとんど)決して起こりません。

すべてのルールと同様に、例外があります。 Facebookの規模は非常に大きいため、ハードウェアは気にするのに十分なコストです。そのため、彼らは HipHop を開発しました。これは、C++にPHPをクロスコンパイルします。PHPのプログラミングのシンプルさと、 C++。FacebookはまだPHPで開発されていますが、使用する場合はすべてネイティブコードです。

0
Joeri Sebrechts