101 votes

Pourquoi n'utilisez-vous pas le C pour vos applications web ?

Je jetais un coup d'oeil à différents serveurs web ce matin quand je suis tombé sur G-WAN . D'après ce que j'ai compris, il s'agit d'un serveur web écrit en C et vous devez l'utiliser en écrivant vos sites web/webapps en C. Un avantage évident est la vitesse, comme le suggère le site G-WAN.

Cependant, sur les forums, le créateur de G-WAN a demandé pourquoi ne pas utiliser le C pour les applications web et je ne peux pas penser à une seule raison en dehors de sa difficulté (pour moi en tout cas, je suis un novice en matière de C). Il doit y avoir d'autres raisons pour lesquelles nous utilisons tous PHP, Python, Ruby, etc. en dehors du fait qu'il est facile de développer dans ces langages. Je ne vois pas cela comme une bonne raison.

Alors je vous pose la question : Pourquoi n'utilisez-vous pas le C pour vos applications web ?

3 votes

Mais C es utilisé pour la création de CGI scripts. Une seule application web peut contenir des composants écrits dans de nombreux langages différents.

34 votes

Pourquoi utilisons-nous des poêles et ne cuisinons-nous pas nos repas directement avec le feu ? Pourquoi utilisons-nous des voitures alors que marcher ou utiliser le vélo est bien plus sain ? Pourquoi... Je pourrais continuer...

16 votes

@Felix - comme je l'ai dit, citez d'autres raisons que la difficulté. Ce qui implique que je suis conscient que d'autres langages existent pour abstraire la difficulté.

79voto

Dave Markle Points 44637

Il faut beaucoup de soin pour obtenir un programme C correct et sécurisé. Ce soin signifie que vous devez faire appel à des personnes très compétentes pour écrire vos programmes. Cela signifie que vous payez plus cher.

De plus, le C n'a pas l'avantage de pouvoir puiser dans une énorme bibliothèque standard de fonctionnalités, comme c'est le cas pour .NET (et les autres grandes plates-formes centrées sur le Web). Vous pouvez donc être amené à acheter des composants, à effectuer des opérations d'interopérabilité ou à développer votre propre fonctionnalité qui est fournie "gratuitement" avec un langage plus, disons, "centré sur le Web" comme PHP, C#, Ruby ou autre. Cela signifie que vous payez plus.

Ajoutez à cela le fait que la vitesse de calcul en mode single-thread n'est pas si importante sur le web. Si vous avez besoin d'une plus grande évolutivité, la plupart des organisations peuvent, d'un point de vue économique, se contenter d'ajouter des cœurs au problème et s'en sortir. Ce n'est pas vrai pour tout le monde, bien sûr. J'imagine que le cœur du moteur de Google est écrit en C ou dans un langage similaire, non seulement pour la vitesse, mais aussi pour économiser de l'argent sur les coûts d'énergie.

48 votes

Wow, un argument pour .NET contre C à cause de bibliothèques ? Bien sûr, la stdlib est plus petite, mais nous avons des décennies de bibliothèques (dont beaucoup sont open-source) en C. J'ai du mal à penser à quoi que ce soit dans la stdlib de .NET pour lequel il n'existe pas de bibliothèque C mature et gratuite.

3 votes

Je ne pense pas qu'il défendait spécifiquement .NET, je pense qu'il voulait simplement dire qu'il existe des langages qui ont beaucoup de bibliothèques cohésives. Je suis sûr que le C en a beaucoup, mais pour être honnête, je ne suis pas tombé sur une sorte de repo qui les rassemble toutes en un seul endroit ou qui les package.

16 votes

@Ken La manipulation des chaînes est une tâche très courante dans les applications web. Des bibliothèques C existent pour cela, mais elles sont loin d'être aussi nombreuses ou utilisables que les bibliothèques en [choisissez un langage de haut niveau].

49voto

Pierre Points 1

Hum...

Il semble que je sois un peu en retard dans cette discussion - mais je viens juste de la découvrir. Et je vous suis reconnaissant à tous pour vos nombreuses contributions.

Je suis l'auteur du G-WAN, ce qui indique clairement que j'ai sérieusement travaillé sur le sujet : G-WAN est à la fois plus rapide que tous les autres serveurs Web (sans traitement). et tous les autres serveurs d'applications Web (tout traitement que vous pouvez imaginer).

Oui, l'ANSI C a également permis de traiter davantage de contenu statique - avec des processeurs moins puissants (l'ANSI C ne sert pas uniquement à faire voler les contenus dynamiques).

D'ailleurs, G-WAN utilise des scripts en C (pas besoin de compilateur et de linker en C) donc le cycle/retard de compilation/liaison n'existe pas.

En comparant le G-WAN à .NET Java et PHP, j'ai écrit similaire dans les 4 langues : http://gwan.ch/source/

Et, à mon grand désarroi, les langages de script modernes étaient pas plus facile à utiliser.

Une partie du travail qui est particulièrement frustrante est de chercher désespérément pour trouver l'appel API "magique" qui fera ce que vous voulez faire.

Réfléchissez à la manière de faire des "milliers de jolis" :

C#

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

Java

new DecimalFormat("0.00"); ...

PHP

number_format($amount, 2); ...

ANSI C

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

Les "..." signifient qu'une certaine pré-configuration, ou post-traitement, est nécessaire. Le C ANSI est clairement plus facile à utiliser et à mémoriser.

Lorsque PHP compte plus de 5900 appels d'API (C# et Java ne sont pas loin), trouver l'API la plus appropriée est une tâche difficile. droite L'appel API est un défi en soi. Le temps perdu pour trouver cela (et ensuite pour trouver à quel point l'appel de l indigène L'appel API est implémenté), le temps d'apprendre à cœur ouvert pour la prochaine fois que vous en aurez besoin, tout ce temps vous prive du temps nécessaire pour résoudre vos problèmes d'application.

J'ai lu (ci-dessus) que le PHP est plus concis que le C ANSI ? Pourquoi alors utiliser "//:: this is a comment ::" plutôt que "// this is a comment" ? Pourquoi avoir une syntaxe "pretty thousands" aussi stupidement complexe ?

L'autre argument habituel est que Java et ses semblables fournissent des appels dédiés aux applications Web.

Je n'ai pas réussi à trouver quelque chose pour échapper au HTML en Java, alors j'ai écrit ma propre version :

  // 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();
  }

Pensez-vous vraiment que le même code en ANSI C serait plus complexe ? Non, il serait à la fois immensément plus simple et plus rapide.

Java (dérivé du C) est nécessitant les programmeurs peuvent relier des chaînes de caractères de plusieurs lignes avec un '+'.
C# (dérivé de C) est nécessitant les programmeurs peuvent relier des chaînes de caractères de plusieurs lignes avec un '+'.
PHP (dérivé de C) est nécessitant les programmeurs peuvent relier des chaînes de caractères de plusieurs lignes par un ".".

L'ANSI C n'a pas cette exigence désormais complètement stupide (obsolète).

Alors, où est le so évident les progrès revendiqués par les langues vivantes ? Je suis toujours à la recherche de ces progrès.

Sincèrement,

Pierre.

10 votes

Je ne comprends pas bien votre commentaire sur le traitement supplémentaire des jolis milliers ; pour le C#, vous avez laissé de côté , amount) PHP est correct en l'état, et votre exemple en ANSI C nécessite deux arguments supplémentaires (buffer et buffer length). À l'exception notable de Java, votre exemple semble prouver le contraire. De plus, je n'ai jamais vu que //:: comment :: auparavant ; PHP ne l'exige certainement pas.

1 votes

Pour être honnête avec vous, toutes les autre sont beaucoup plus belles que celles de l'ANSI C, qui "est clairement plus facile à utiliser et à retenir" [sic].

0 votes

Comment G-WAN se compare-t-il à NGINX si les deux ont été écrits en C ?

47voto

Quentin Points 325526

La même raison pour laquelle nous n'utilisons pas le C pour la plupart des programmes. Les avantages (qui sont surtout des performances) ne compensent pas les coûts (temps de développement, absence de gestion automatique de la mémoire, absence de protection automatique contre les débordements de tampon, nécessité d'une étape de compilation entre les étapes d'édition et de test, etc.)

10 votes

J'étais en train de taper la même chose et tu m'as devancé. Je veux juste ajouter que la protection des sites web contre les comportements malveillants est déjà un défi suffisant, nous n'avons pas besoin d'ajouter des vecteurs d'attaque potentiels provenant d'une mauvaise utilisation de la gestion de la mémoire, des pointeurs, etc.

0 votes

@Jordan : J'ai l'impression que vous n'avez pas fait de programmation web en C. Ce que vous dites ne correspond pas au modèle de programmation web.

2 votes

Bien sûr, à condition que votre site Web permette à l'utilisateur d'interagir, que ce soit par le biais d'une URL ou d'un formulaire. Une fois que ces données sont transmises au serveur, c'est au programmeur de veiller à allouer correctement la mémoire. Le G-WAN offre une certaine abstraction autour des paramètres de requête, mais cela ne va pas vous sauver complètement. Je ne dis pas que la programmation web en C, correctement réalisée, ne peut pas être sûre et rapide, mais elle est plus sensible aux erreurs les plus graves.

29voto

Paul Tomblin Points 83687

La plupart des applications réseau, notamment les serveurs Web, sont beaucoup plus "liées aux entrées/sorties", c'est-à-dire qu'elles sont capables d'envoyer des données beaucoup plus rapidement que le réseau ne peut les accepter. Par conséquent, une solution hautement efficace en termes de CPU n'est pas une grande victoire, alors qu'une solution évolutive et maintenable l'est. Il n'y a donc aucune raison d'accepter les inconvénients du C et de perdre les avantages d'un environnement géré comme Java, .NET, Python, Perl ou d'autres langages.

14 votes

Si je peux remplir le tuyau du réseau avec Java ou Perl (et je le peux), le fait que le C soit plus rapide n'est pas pertinent.

1 votes

@Kinopiko, êtes-vous en train de dire que vous avez un plus gros tuyau, plus de visites de pages et plus de données à expédier qu'eBay (Java), Stack Overflow (C#/.NET), Google ou n'importe lequel des millions de sites web très utilisés écrits dans des langages de niveau supérieur ?

1 votes

@Paul Tomblin : Le but d'une application web n'est pas de remplir le tuyau du réseau mais d'effectuer un traitement. Si vous avez seulement besoin de servir du texte et des images, vous devriez utiliser des pages html statiques, qui donnent des performances supérieures. Dans la plupart des cas, les pages statiques sont servies à partir du cache, de sorte que votre serveur n'a rien à faire. En revanche, lorsque le traitement est nécessaire, il peut très bien être le goulot d'étranglement (bien que le disque soit le plus souvent le goulot d'étranglement).

15voto

ChrisW Points 37322

Le C n'est pas un langage pratique pour manipuler les chaînes de caractères.

Comparez C# :

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

Correspondant 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

4 votes

PHP ne gère pas non plus correctement l'Unicode, mais c'est un langage orienté Web très populaire.

12 votes

Nous devrions donc utiliser le C++, car il obtient à peu près les mêmes performances que le C, mais compile votre exemple C# comme un charme ?

2 votes

Pour ce qui est de la manipulation des chaînes de caractères, les applications web ne produisent généralement que des chaînes de caractères, de sorte que la fonction C printf devrait faire l'affaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X