Perché non usi C per le tue app web?


101

Questa mattina stavo dando un'occhiata ad alcuni server web diversi quando mi sono imbattuto in G-WAN . Da quanto ho capito, è un server web scritto in C e devi usarlo scrivendo i tuoi siti web / webapp in C. Un chiaro vantaggio è la velocità come suggerisce il sito G-WAN.

Tuttavia, sui forum, il creatore di G-WAN ha chiesto perché non utilizzare C per le app basate sul Web e non riesco a pensare a un solo motivo a parte il fatto che è difficile (per me comunque, sono un principiante quando si tratta di C). Devono esserci più ragioni per cui tutti usiamo PHP, Python, Ruby ecc. Oltre al fatto che è facile da sviluppare in questi linguaggi. Non lo vedo come una buona ragione.

Quindi ti ho detto: perché non usi C per le tue app web?


34
Perché usiamo stufe e non cuciniamo i nostri pasti direttamente con il fuoco? Perché usiamo le auto anche se camminare o usare la bicicletta è molto più salutare? Perché ... potrei andare avanti ...
Felix Kling,

16
@Felix - come ho detto, nomina altri motivi oltre al fatto che è difficile. Il che implica che sono consapevole che esistono altre lingue per astrarre difficoltà.
Abs

15
Non ho mai considerato il C difficile.
Salva il

10
@David Lively Se non sei riuscito a mettere apposta la "c" in difficile, è davvero abbastanza divertente. Ben fatto :)
punkrockbuddyholly

11
@MrMisterMan ha impiegato solo quattro mesi per individuarlo. =)
Salva il

Risposte:


79

Ci vuole molta cura per ottenere un programma C corretto e sicuro. Quella cura significa che devi avere persone davvero brave che scrivono i tuoi programmi. Ciò significa che paghi di più.

Inoltre, C non ha il vantaggio di attingere da un'enorme libreria standard di funzionalità come .NET (e le altre principali piattaforme web-centric). Quindi potrebbe essere necessario acquistare componenti o eseguire l'interoperabilità o eseguire il rollio della propria funzionalità che viene fornita "gratuitamente" con un linguaggio più, per così dire "web-centrico" come PHP o C # o Ruby o altro. Ciò significa che paghi di più.

Aggiungi tutto questo al fatto che la velocità di calcolo a thread singolo non è così importante sul web. Se hai bisogno di una maggiore scalabilità, la maggior parte delle organizzazioni può semplicemente utilizzare più core per risolvere il problema e stare bene. Questo non è vero per tutti, ovviamente. Immagino che il nucleo del motore di Google sia scritto in C o in un linguaggio simile non solo per la velocità, ma per risparmiare denaro reale sui costi energetici.


48
Wow, un argomento per .NET contro C a causa delle librerie ? Certo, lo stdlib è più piccolo, ma abbiamo decenni di librerie (molte open source) in C. Ho problemi a pensare a qualcosa in .NET stdlib per cui non esiste una libreria C matura e libera.
Ken il

3
Non penso che stesse discutendo per .NET in modo specifico, penso che volesse dire solo che ci sono linguaggi là fuori che hanno molte librerie coese. Sono sicuro che C ne abbia molti, ma ad essere sincero non ho trovato alcun tipo di repo che li raccolga tutti in un unico posto o li impacchi.
Abs

16
La manipolazione di @Ken String è un'attività molto comune nelle app web. Le librerie C esistono per questo, ma non sono così numerose o utilizzabili come le librerie in [scegli un linguaggio di alto livello].
Andres Jaan Tack

23
@Ken: C'è un universo di differenza quando si dispone di un unico set di funzionalità ben supportato rispetto a una pletora di piccole librerie che differiscono ampiamente per set di funzionalità, licenza e supporto.
Dave Markle,

49

Ronzio...

Sembra che io sia un po 'in ritardo in questa discussione, ma l'ho scoperto solo ora. E sono grato a tutti voi per così tanto input.

Sono l'autore di G-WAN, il che rende chiaro che ho lavorato seriamente sulla questione: G-WAN è sia più veloce di tutti gli altri Web Server (nessuna elaborazione) che di tutti gli altri Web Application Server (qualsiasi elaborazione tu possa immaginare).

Sì, ANSI C ha anche reso possibile elaborare più contenuto statico - con CPU meno potenti (ANSI C non riguarda solo il far volare i contenuti dinamici).

A proposito, G-WAN utilizza script C (non sono necessari compilatori e linker C) quindi il ciclo / ritardo di compilazione / collegamento non esiste.

Nel processo di confronto tra G-WAN e .NET Java e PHP, ho scritto applicazioni simili in tutte e 4 le lingue: http://gwan.ch/source/

E, con mio sgomento, i moderni linguaggi di scripting non erano più facili da usare.

Una parte del lavoro che è particolarmente frustrante è ricerca disperata la chiamata API "magica" che farà quello che vuoi fare.

Pensa a come fare "belle migliaia" in:

C #

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

Giava

new DecimalFormat("0.00"); ...

PHP

number_format($amount, 2); ...

ANSI C

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

Il "..." significa che è necessaria una pre-configurazione o post-elaborazione. ANSI C è chiaramente più facile da usare e da ricordare.

Quando PHP ha più di 5900 chiamate API (C # e Java non lontano), trovare la giusta chiamata API è di per sé una sfida. Il tempo sprecato per trovare questo (e poi per scoprire quanto male il nativo è implementata la chiamata API ), il tempo per imparare da hart per la prossima volta che ne avrai bisogno, tutto questo tempo ti sta privando del tempo necessario per risolvere la tua applicazione i problemi.

Ho letto (sopra) che PHP è più conciso di ANSI C? Perché allora usare "//:: this is a comment ::"invece di"// this is a comment" ? Perché avere una sintassi così stupidamente complessa "belle migliaia"?

L'altro argomento usuale è che Java e simili forniscono chiamate dedicate per applicazioni Web.

Non sono riuscito a trovare nulla per sfuggire all'HTML in Java, quindi ne ho scritto la mia versione:

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

Credi davvero che lo stesso codice in ANSI C sarebbe più complesso? No, sarebbe immensamente più semplice e veloce.

Java (derivato da C) richiede ai programmatori di collegare stringhe multilinea con un '+'
C # (derivato da C) richiede ai programmatori di collegare stringhe multilinea con un '+'
PHP (derivato da C) richiede ai programmatori di collega stringhe multilinea con un '.'

ANSI C non ha questo requisito ora completamente stupido (obsoleto).

Allora, il progresso così evidente rivendicato dalle lingue moderne? Lo sto ancora cercando.

Cordiali saluti,

Pierre.


10
Non capisco bene il tuo commento sull'elaborazione extra di migliaia di copie; per C # lasciato fuori , amount), PHP va bene così com'è, e il tuo esempio ANSI C necessita di altri due argomenti (buffer e lunghezza del buffer). Con la notevole eccezione di Java, il tuo esempio sembra dimostrare il punto opposto. Inoltre, non ho mai visto //:: comment ::prima quella sintassi; PHP certamente non lo richiede.
icktoofay

1
Ad essere onesti con te, tutte le altre opzioni sembrano molto più belle di ANSI C, che "è chiaramente più facile da usare e da ricordare" [sic].
Jarrod Mosen

Come si confronta G-WAN con NGINX se entrambi sono stati scritti in C?
m4l490n

47

Lo stesso motivo per cui non usiamo C per la maggior parte della programmazione. I vantaggi (che sono principalmente le prestazioni) non superano i costi (tempo di sviluppo, mancanza di gestione automatica della memoria, mancanza di protezione automatica dai buffer overflow, avere una fase di compilazione tra la fase di modifica e quella di test, ecc.).


10
Stavo scrivendo la stessa cosa e tu mi hai battuto. Voglio solo aggiungere che proteggere i siti Web da comportamenti dannosi è una sfida sufficiente così com'è, non è necessario aggiungere potenziali vettori di attacco da un uso improprio della gestione della memoria, puntatori, ecc.
Rob Allen,

@Jordan: Ho la sensazione che tu non abbia fatto alcuna programmazione web in C. Quello che stai dicendo non si adatta al modello di come viene fatta la programmazione web.

2
Certo che lo fa, supponendo che il tuo sito web abbia un posto per l'interazione dell'utente, sia tramite URL che input del modulo. Una volta che i dati vengono consegnati al server, spetta al programmatore assicurarsi di allocare correttamente la memoria. G-WAN ha alcune astrazioni sui parametri di query, ma questo non ti salverà completamente. Non sto dicendo che eseguita correttamente, la programmazione web C non può essere sicura e veloce, ma è più suscettibile a errori più gravi.
Jordan

3
sigh @Kinopiko: Se non sai cos'è un buffer overflow, non dovresti scrivere in C. 'nuff ha detto. Per maggiori informazioni: securecoding.cert.org/confluence/display/seccode/…
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

29

La maggior parte delle applicazioni di rete, in particolare i server web, sono molto più "vincolate all'I / O", ovvero sono in grado di pompare dati molto più velocemente di quanto la rete possa accettarli. Quindi qualcosa che è altamente efficiente per la CPU non è una grande vittoria, mentre qualcosa che è scalabile e gestibile lo è. Quindi non c'è motivo di accettare gli svantaggi di C e perdere i vantaggi di un ambiente gestito come Java, .NET, Python, Perl o altri linguaggi.


1
C è comunque molto più veloce.

14
Se riesco a riempire il tubo di rete con Java o Perl (e posso), il fatto che C sia più veloce è irrilevante.
Paul Tomblin,

1
@Kinopiko, stai dicendo che hai un pipe più grande, più visite di pagina e più dati da spedire rispetto a eBay (Java), Stack Overflow (C # /. NET), Google o uno qualsiasi dei milioni di siti web altamente utilizzati scritti in linguaggi di livello superiore ?
Paul Tomblin,

1
@Paul Tomblin: Lo scopo di un'applicazione web non è riempire il tubo di rete ma eseguire alcune elaborazioni. Se hai solo bisogno di fornire testo e immagini, dovresti usare pagine html statiche, che offrono prestazioni superiori. Nella maggior parte dei casi, le pagine statiche vengono servite dalla cache, quindi il tuo server non deve fare nulla. OTOH, quando è necessaria l'elaborazione, potrebbe essere il collo di bottiglia (sebbene più comunemente il disco sia il collo di bottiglia).
PauliL

4
È necessario ricordare che le applicazioni Web sono solo una frazione di uno "stack di server" che gestisce le richieste degli utenti e non è una parte critica per le prestazioni. Ci sono altre parti: kernel del sistema operativo (solitamente scritto in C), filesystem (C), server web (solitamente C), interprete del linguaggio (C), database (solitamente C o C ++). L'applicazione Web di solito passa solo i dati da una parte all'altra, applicandovi alcune operazioni di base e le sue prestazioni non sono affatto cruciali.
el.pescado

15

Il C non è un linguaggio conveniente per manipolare le stringhe.

Confronta C #:

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

C corrispondente:

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
PHP non gestisce correttamente Unicode, ma è un linguaggio orientato al Web molto popolare.
el.pescado

12
Quindi dovremmo usare C ++, poiché ha circa le stesse prestazioni di C, ma compila il tuo esempio C # come un fascino?
tstenner

2
Per quanto riguarda la manipolazione delle stringhe, l'applicazione web di solito genera solo stringhe, quindi i C printfdovrebbero fare il lavoro.
el.pescado

5
C gestisce multibyte e unicode perfettamente tramite le funzioni di libreria di runtime. L'uso delle funzioni di sicurezza come strncpy e così via lo rende anche abbastanza sicuro.
justinhj

2
Oppure potresti usare asprintf (& foobar, "% s% s", foo, bar);
Patrick Lorio

11

Se difficoltà e complessità non fossero affatto un problema (ah!), Allora non mi fermerei a C. Scriverei l'assembly x86. Sono passati anni dall'ultima volta che ho utilizzato un server web che non fosse x86 e sembra sempre meno probabile ogni giorno.

Usare C (invece di assembly, o qualcosa di di livello superiore) significa suggerire che C è il punto debole dell'efficienza del programmatore e dell'efficienza del computer.

Per i programmi che scrivo, questo non è il caso: C è una cattiva corrispondenza con i tipi di programmi che voglio scrivere, ei vantaggi di esso rispetto a un assemblatore di macro decente non sono così significativi. Il programma che sto scrivendo in questo momento non è difficile nel mio HLL preferito, ma la sua complessità in assembly o in C sarebbe così alta che non sarebbe mai finito. Riconosco che un programmatore sufficientemente intelligente con abbastanza tempo potrebbe farlo funzionare più velocemente in assembly o C, ma non sono quel programmatore.


7
  • suo insicuro
  • suo difficile da leggere
  • è difficile da mantenere, il tempo di sviluppo è più lento dell'ordine di grandezza
  • la maggior parte delle tue cose web è probabilmente legata a I / O, quindi l'aumento della velocità non ha nemmeno importanza, specialmente quando usi un linguaggio veloce come Java o C #

2
cosa significa "linguaggio veloce come Java o C #"?
RobS

3
@Kinopiko: quali punti deboli hanno i linguaggi dinamici? Quando un programmatore noob dice esplicitamente di voler eseguire codice arbitrario tramite evale php include? Per favore, in C / C ++ non dichiari di voler eseguire codice arbitrario, lo fa e basta. evalnon è un bug, è l'intento del programmatore. In C / C ++, qualsiasi bug può portare all'esecuzione di codice remoto, nei linguaggi dinamici, questo non è il caso a meno che qualche sciocco non stia scherzando eval.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

1
"e veloce o più veloce di C / C ++ a seconda di cosa stai facendo" forse, ma hai ancora a che fare con un ambiente di memoria gestito con Java e C # che può diventare un vero svantaggio in scenari di traffico elevato.
RobS

5
"e il C certamente non ha tanti punti deboli di sicurezza come qualsiasi linguaggio dinamico" Questo , amico mio, è una totale assurdità. Perché quel commento ha 3 voti positivi?
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

2
@Kinopiko: Beh, in realtà, non puoi spiegarlo da nessuna parte. Non c'è spiegazione per questo. Il C ha un problema molto più grande di qualsiasi linguaggio dinamico. La cosa peggiore che può accadere in un linguaggio dinamico è "attributo non trovato, whoop dee doo".
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7

So che questa domanda è già stata risolta a morte, ma ci sono 2 cose non menzionate finora che sono straordinariamente importanti per il successo in qualsiasi paradigma di programmazione, e specialmente nello sviluppo web in cui si ottengono molte persone che non sono necessariamente programmatori, lavorare con il codice.

  1. Comunità coinvolta e utile, alias Persone che hanno già risolto il mio problema. È abbastanza facile anche per i noob più noob su Google perché stanno ricevendo errori "intestazioni già inviate" in PHP, mentre tali informazioni potrebbero non essere disponibili per un framework o linguaggio che è nuovo sulla scena, o che altrimenti non ha massa critica.
  2. Framework, in modo che la maggior parte dei programmatori possa risolvere i problemi aziendali e non hackerare il codice insieme.

Se avessi un'app critica che richiede prestazioni estreme, userei C, ma ci vorrebbe molto più tempo per scrivere, che non sarei mai arrivato sul mercato. Finché non c'è il n. 1 o il n. 2 non è fattibile per me utilizzarlo.


6

Il C è un linguaggio di livello piuttosto basso per molti scopi: no-OOP, molta gestione manuale delle risorse.

C'è un uso limitato di C per il web, ad esempio Klone . Viene utilizzato principalmente per casi di applicazioni incorporate con poche risorse.

Tuttavia, esistono framework Web C ++ come CppCMS che vengono utilizzati per lo sviluppo di applicazioni Web ad alte prestazioni.

Il C ++ ti consente di godere di un'astrazione elevata e di un accesso granulare a ciò che stai facendo esattamente, offrendo un'opzione molto migliore per la distribuzione e lo sviluppo di applicazioni di grandi dimensioni.

Ma li usi nel caso in cui le prestazioni e l'utilizzo delle risorse siano molto più critici del time-to-market e dei costi di sviluppo poiché in genere lo sviluppo web è più veloce utilizzando buoni framework web per linguaggi come Java, Python o PHP. Inoltre generalmente ci sono programmatori meno competenti per i linguaggi C ++ quindi Java / P * per lo stesso stipendio.

Quindi è una questione di priorità, inoltre ci sono meno strumenti per lo sviluppo Web C ++ rispetto a PHP / Python / Perl o Java.


2
Interessante, non sapevo di CppCMS un framework web di basso livello scritto in C ++. Potrebbe essere il meglio di entrambi i mondi, seduto tra C e Web Languages.
Abs

Ora è un framework di basso livello, è il framework web MVC che è molto VELOCE.
Artyom

Mi spiace, mi riferisco a tutto ciò che non è un linguaggio web come di basso livello. Capisco anche se è un framework web MVC.
Abs

Non esiste una cosa come "Web Language", probabilmente solo PHP può essere chiamato web one. Tutti gli altri linguaggi inclusi Java, Python, Perl, Ruby e C # sono linguaggi generici utilizzati per il Web.
Artyom

1
Ebbene, se vogliamo essere specifici in questo modo, non esistono linguaggi di programmazione generici. Ci sono solo procedurali, strutturati, orientati agli oggetti, funzionali ... ecc ...
Abs

5

@Joeri Sebrechts

FUD in azione:

PHP, Python e così via sono facili da scalare lanciando l'hardware al problema.

Beh, in realtà no. Non si scalano affatto verticalmente e si adattano molto male in orizzontale. Vedi: http://gwan.ch/en_scalability.html dove viene spiegato quanti guai ci sono davanti ai cattivi risultati.

Supponiamo che costi a 1 persona 1 anno di impegno per sviluppare un'app in PHP e che costa loro 3 anni per farlo in C (poiché C richiede più impegno per fare la stessa cosa).

Sbagliato di nuovo. Se le librerie PHP sono state scritte in C, sono direttamente utilizzabili da C, fornendo istantaneamente la "produttività unica" che si sostiene abbia PHP.

Ciò significa che la ridotta necessità di hardware del codice C deve rappresentare 2 anni di stipendio affinché C diventi attraente. In pratica questo (quasi) non accade.

Pure FUD (vedi la risposta sopra).

La scala di Facebook è così grande che l'hardware è un costo abbastanza grande da preoccuparsi. Ecco perché hanno sviluppato HipHop, che esegue la cross-compilazione di PHP in C ++. Offre il meglio di entrambi i mondi: la semplicità della programmazione in PHP e le prestazioni grezze del C ++. Facebook è ancora sviluppato in PHP, ma quando lo usi, è tutto codice nativo.

HipHop è molto più veloce di PHP, su questo non ci sono dubbi. Ma se confronti HipHop con un'implementazione in C normale, hai due livelli di overhead:

  • le interfacce da PHP a C ++ (che utilizzano le librerie C ++ gonfie);
  • il C ++ si gonfia (il che rende C ++ 2-10 volte più lento del semplice C).

Inoltre, HipHop è stato scritto nella modalità accademica inefficace e senza tracce (staccata da qualsiasi realtà del mondo reale). certo, può impressionare i programmatori PHP ma mostra questo codice a un programmatore incorporato e si sentirà dispiaciuto per Facebook.

"Una lingua che non ha tutto è in realtà più facile da programmare rispetto ad altre che ce l'hanno" - Dennis M. Ritchie

A differenza di (la maggior parte del) linguaggio di programmazione END-USERS, Dennis sapeva un paio di cose sull'argomento, a quanto pare.


3
(1) Non prendere le cose così sul personale, non volevo dissare il tuo prodotto perché non conoscevo nemmeno il tuo prodotto. (2) Fai un'interessante dimostrazione del concetto con G-wan, ma spero che mi scuserai se attendo e vedrò l'approccio fino a quando non vedrò che le app web del mondo reale lo utilizzano, e non solo alcuni benchmark sintetici. (3) Hai interpretato male il reclamo di Facebook sul ridimensionamento orizzontale, perché il loro problema è con memcache e prestazioni multi-core del database, il collo di bottiglia delle app web del mondo reale, che è qualcosa che G-wan non aiuta a risolvere. (4) HipHop accoglie con favore i tuoi contributi al codice, ne sono sicuro.
Joeri Sebrechts

1
Parlando del problema della produttività. Ho già scritto applicazioni web in C, molte lune fa, e all'epoca richiedevano molte più righe per fare la stessa cosa rispetto a PHP, pur avendo un rischio molto maggiore di crash / leak di tipo di bug. (Sono solo "nella media" con questi tipi di bug, vale a dire che li scrivo di tanto in tanto.) Baso il mio giudizio su quell'esperienza finché non vedo app reali che dimostrano il contrario (ad esempio un port di wordpress in C che non richiede molte più righe di codice).
Joeri Sebrechts

Come fa qualcosa a "non ridimensionarsi verticalmente"? Vuoi dire che non beneficia di prestazioni single core più veloci e prestazioni di memoria più veloci?
rakslice

5

Devono esserci più ragioni per cui tutti usiamo PHP, Python, Ruby ecc. Oltre al fatto che è facile da sviluppare in questi linguaggi

Questa è l'intera ragione e l'unica necessaria. Ha molti vantaggi, il principale dei quali è il time to market. Se riesci a mettere online la tua app Web in un mese utilizzando PHP invece di due mesi utilizzando C, potresti semplicemente vincere. Se puoi aggiungere una nuova funzionalità in una settimana usando Ruby on Rails invece di due settimane usando C, di nuovo vinci. Se riesci a correggere un bug in un giorno usando Python invece di due giorni usando C, vinci ancora una volta. Se puoi aggiungere una funzionalità perché stai usando la lingua X che i tuoi concorrenti non possono aggiungere affatto perché stanno usando la lingua Y ed è troppo difficile in quella lingua dati i loro limiti di risorse, allora vinci sicuramente.

E con "vincere" intendo davvero che non perdi. I tuoi concorrenti utilizzano linguaggi e framework di livello superiore per sviluppare i loro siti, quindi se usi C, non sei in competizione con altre persone che usano C, stai perdendo contro altre persone che non usano C. Solo per competere, hai utilizzare strumenti con livelli di astrazione simili.

Se le prestazioni diventano un problema, puoi riscrivere le parti lente del tuo sito in lingue con prestazioni migliori. Oppure puoi semplicemente aggiungere più hardware. In realtà, un problema di prestazioni è ciò che chiamiamo un "bel problema da avere" - significa che hai già avuto successo. Ma dedicare più tempo allo sviluppo delle funzionalità di base del tuo sito è raramente un'opzione. Scriverlo in C solo per farlo funzionare più velocemente è un'ottimizzazione prematura, che, come ci dice Knuth, è la radice di tutti i mali.

Tutto ciò implica che se puoi usare un linguaggio con un livello di astrazione più alto di Python o Ruby, potresti vincere contro le persone che usano Python o Ruby. La storia di Paul Graham di come lui e il suo team abbiano utilizzato LISP come "arma segreta" nello sviluppo di siti Web può essere istruttiva. http://www.paulgraham.com/avg.html

Ovviamente, se stai sviluppando un sito per il tuo divertimento, fallo nella lingua che desideri. E se il tuo sito è vincolato alla CPU (quasi nessuno lo è; di solito sono legati all'I / O), usa il linguaggio più veloce possibile. Se stai cercando di innovare, però, usa un linguaggio di alto livello con le migliori astrazioni che puoi trovare.


Dimentichi che il bit di elaborazione degli ordini ad alto volume via web è stato scritto in C. Vedi le note in fondo a paulgraham.com/avg.html .
Giles Roberts,

4

Pensi che essere facile non sia una buona ragione. Penso che sia una buona ragione. Se hai bisogno di prestazioni ottimali, allora C va bene, ma altri linguaggi astraggono le cose difficili per migliorare la produttività, la manutenibilità e ridurre i difetti.


6
Per ottenere le massime prestazioni è necessario non solo C, ma anche il programmatore C definitivo. E quei ragazzi in genere vogliono molti più soldi dei programmatori Java / P *.
el.pescado

4

Considera che non sono uno sviluppatore web, ma porrò comunque queste domande e offrirò un punto o due.

Quale sito web è scritto in una sola lingua? Seriamente questo thread sembra presumere che un martello si adatti a tutti i chiodi.

Quando è stata l'ultima volta che qualcuno ha affermato seriamente che C era complesso? Voglio dire, davvero ragazzi, non potete ottenere un livello molto più basso. Non sto parlando di C ++ qui poiché i due sono spesso indicati collettivamente.

C ha problemi di sicurezza, che non possono essere negati, ma sono inferiori a ciò che si vede nei kludges chiamati PHP e Perl? In entrambi i casi, un sito web sicuro è una funzione della disciplina del programmatore.

In ogni caso via ai commenti. La difficoltà di usare un dato linguaggio dipende molto dal problema in questione C e soprattutto C ++ possono portare a soluzioni rapide a un problema in mani esperte.

Gli usi industriali per i server web, cioè i server / siti incorporati semplicemente non hanno le scelte linguistiche che un normale server web potrebbe avere. Quindi finisci per usare una variante di C o forse qualcosa come BASIC. Il tuo obiettivo è offrire le funzionalità richieste dal dispositivo e non preoccuparti delle lingue. Su un server web tradizionale, il modo per farlo è con linguaggi di alto livello la maggior parte del tempo. Allontanati dal ferro grande e la tua libertà di programmazione va fuori dalla porta.

Senza le giuste biblioteche sarebbe sciocco nella maggior parte dei casi fare un progetto web in C. La mancanza di buone biblioteche standardizzate è un grande aspetto negativo qui.


3

Ecco dell'altro codice relativo al Web scritto in C che vale la pena dare un'occhiata quando si crea la propria libreria C per il Web:

  • cgic: una libreria ANSI C per la programmazione CGI
  • cgit: un frontend web per i repository git
  • wbox: strumento di test HTTP
  • wget html-parse.c
  • cookie curl. c
  • Sconto, implementazione C di David Parsons del testo Markdown di John Gruber in linguaggio html
  • Protothreads (specialmente per i sistemi embedded), http://www.sics.se/~adam/software.html
  • protothread, progetto in codice Google di LarryRuane
  • progetto uriparser sourceforge
  • http-parser, parser http di richiesta / risposta per c di Ryan Dahl su github
  • nginx
  • ...

2

Ebbene, dato che lo sviluppo Web è questione di avere librerie utili (del tipo usato da PHP) allora non vedo come C non sarebbe utile.

Dopo tutto, la logica procedurale è la stessa: do while, for, if then else, ecc. Se si tratta di C, PHP, .Net o Perl.

E un ciclo o un test in C non è più difficile da scrivere perché è scritto in C.

La maggior parte delle librerie PHP sono realizzate in C, quindi l'argomento mancante delle librerie C per il Web non sembra molto convincente.

La mia ipotesi è che C non sia stato pubblicizzato come linguaggio di programmazione Web dai promotori di Java (SUN) e .Net (MICROSOFT) perché avevano il proprio proprietario risorsa intellettuale (fortemente brevettata) da spingere per l'adozione.

Come standard gratuito (non brevettato), C non offre alcuna presa di blocco sugli sviluppatori ... quindi, forse la mano pesante di fare pressioni nelle scuole e nelle università per assicurarsi che il denaro dei contribuenti finanzi l'adozione di un tecnologia inferiore sostenuta da interessi privati.

Se C è abbastanza buono per IBM e MICROSOFT (non sviluppano i loro prodotti in PHP o .Net) ma non abbastanza buono per gli utenti finali, gli utenti finali potrebbero chiedersi perché sono invitati a subire questo doppio standard.


1
Uhhhh Microsoft.com e sharepoint sono entrambi in ASP.NET. Gran parte di Visual Studio 2010 è in .NET (WPF). Questa affermazione è palesemente falsa. Utilizza il linguaggio di livello più elevato che soddisfi i tuoi requisiti di progettazione. Per il web, ciò significa C # / Python / etc e componenti in C / C ++ / etc dove le prestazioni diventano un problema, anche se ciò non accade quasi mai.
Salva il

2

Userei C per un'app Web se:

  1. Ho un piccolo budget per il server di hosting (piccolo VPS) e il mio tempo non è costoso.
  2. Sto lavorando per Facebook, Twitter o qualcuno che ha bisogno di ridurre la quantità di server utilizzati (da migliaia a milioni di utenti).
  3. Voglio imparare C e ho bisogno di trovare un'app del mondo reale in cui posso usarla.
  4. Conosco C molto meglio di altri linguaggi di scripting.
  5. Sono un ragazzo ecologico e voglio ridurre l'impronta di carbonio della mia app.

G-WAN esegue il codice come script, sì, script C come Play! Framework fa per Java. G-WAN è molto veloce e ha una semplice API. G-WAN rende possibile utilizzare C / C ++ per le app Web quando altri server non sono riusciti a farlo.

Una cosa è chiara: hai bisogno di un buon programmatore per scrivere un sito web in C, qualsiasi sviluppatore di merda può creare un sito con PHP spaghetti :-) Ci sono rilevatori di perdite e persino garbage collector per C.


2

Tutti i linguaggi che hai menzionato sono scritti in C / ++. L'unica differenza sono le classi e le librerie avanzate che sono state create da C che compongono quelli che ora sono questi altri linguaggi per interpreti. Questo è anche il motivo per cui vengono definiti linguaggi di scripting.

Pensala come cuocere una torta (PHP / JS):

  • 2 uova, 1 tazza di latte, 2 bastoncini di burro, 4 tazze di farina, 1 tazza di zucchero, bicarbonato di sodio

Ma immagina di dover creare tutto l'elemento di cui sono composte quelle cose. (C / ++)

  • 17 mg di bicarbonato di sodio, 15 cucchiai di proteine, 12 cucchiai di membrana vitaminica, amminoacidi, zolfo, ... Particelle di neutroni

Il C è il fondamento di molte lingue moderne. È fantastico e quasi i linguaggi più potenti in fase di assemblaggio. Puoi farlo, devi solo investire nella costruzione di tutto il codice che questi altri linguaggi hanno già fatto. Come costruire una torta dalla tavola periodica.

Imparalo che puoi letteralmente fargli fare qualsiasi cosa!


1

La gestione delle stringhe in C può essere semplificata utilizzando:

Tipi di dati (parte di libslack)

Libslack fornisce un tipo di dati array di puntatori espandibili generico chiamato List, un tipo di dati tabella hash generica chiamato Map e un tipo di dati String decente che viene fornito con un mucchio di funzioni (molte derivate da Perl). Esistono anche tipi di dati di elenchi concatenati singolarmente e doppiamente con freelist opzionali "espandibili".

o:

Libreria di stringhe gestita (per C)

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


1

"domachine" ha scritto:

dipendenza dalla piattaforma: C deve essere compilato in codice nativo. Questo codice non funziona su tutte le piattaforme. I linguaggi interpretati (come PHP) funzionano ovunque esista un interprete. Ovviamente questo problema potrebbe essere risolto, ma in questo caso particolare si vede il vantaggio di sviluppare in PHP.

Ti sei mai chiesto in quale lingua è scritto l'interprete PHP portatile ?

In ANSI C.

Quindi, prima di ignorare di nuovo la portabilità di ANSI C, chiediti in quale lingua è stato scritto il tuo linguaggio di programmazione preferito ... (suggerimento: quasi tutti sono stati scritti in C / C ++).

I compilatori ANSI C sono disponibili su tutte le piattaforme su cui ho dovuto lavorare e lo stesso non vale per PHP e il suo gigantesco runtime.

Questo per quanto riguarda l' argomento della portabilità .


2
Ebbene, PHP NON è la mia lingua preferita. Non ho ancora codificato nulla in PHP. Sono un programmatore C e C ++. Non ho mai rinunciato alla portabilità di C! L'unica cosa che ho menzionato è stata la facilità di applicare script PHP a uno spazio web esistente. Mostrami il caso in cui puoi ottenere uno spazio Web a basso budget in cui hai un compilatore. Forse mi sbaglio ma penso che tu sia uno di questi programmatori fanatici che adorano una lingua ma non vedono i vantaggi di altre lingue, forse più appropriate. Amo C e C ++ ma sono in grado di pensare fuori dagli schemi.
domachine

0

Simile a G-WAN, ma per Cocoa / Objective-C è Bombax, un framework per applicazioni web.

http://www.bombaxtic.com

Parlando di Objective-C non posso resistere a sottolineare MacRuby, che ha il potenziale per rivoluzionare il modo in cui un giorno faremo app web.


Bene, MacRuby è morto ora.
Banjocat

0

Un altro punto potrebbe essere la dipendenza dalla piattaforma. C deve essere compilato in codice nativo. Questo codice non funziona su tutte le piattaforme.

Le lingue interpretate funzionano ovunque esista un interprete. Molti provider, ad esempio, forniscono interpreti PHP installati sui loro server ma con un sistema operativo Windows. Se ora stai sviluppando su una macchina Linux. Hai un problema.

Ovviamente questo problema potrebbe essere risolto, ma in questo caso particolare vedi il vantaggio di sviluppare in PHP.

Spero che questo aiuti, per quanto riguarda Domachine


0

PHP, Python e così via sono facili da scalare lanciando l'hardware al problema.

Supponiamo che costi a 1 persona 1 anno di impegno per sviluppare un'app in PHP e che costa loro 3 anni per farlo in C (poiché C richiede più impegno per fare la stessa cosa). Ciò significa che la ridotta necessità di hardware del codice C deve rappresentare 2 anni di stipendio affinché C diventi attraente. In pratica questo (quasi) non accade.

Come con ogni regola, c'è un'eccezione. La scala di Facebook è così grande che l'hardware è un costo abbastanza grande da preoccuparsi. Ecco perché hanno sviluppato HipHop , che esegue la cross-compilazione di PHP in C ++. Offre il meglio di entrambi i mondi: la semplicità della programmazione in PHP e le prestazioni grezze del C ++. Facebook è ancora sviluppato in PHP, ma quando lo usi, è tutto codice nativo.


0

Alla fine puoi usare assolutamente qualsiasi linguaggio per sviluppare siti, incluso l'assembler (tramite CGI ecc.). Se intendevi perché non usiamo un linguaggio compilato, beh, abbiamo già .NET, Java e altri.


0

Devi amare quello che stai facendo per ottenere risultati. Linguaggi come java e php sono stati creati con molto impegno per rendere più facile la vita delle persone. Php in particolare ha beneficiato oggi molti programmatori web autodidatti. Puoi vedere il tipo di supporto che ha nel mondo dello sviluppo web.

Java iam è stato sicuramente scritto per darti aiuto in tutto ciò che può essere possibile nel mondo di oggi. L'enorme libro è una chiara indicazione, ed è una bestia se anche tu stai incombendo per lo sviluppo web. Lo stesso vale per Python. Questi sono davvero fantastici linguaggi e piattaforme. Non c'è da stupirsi che siano estremamente popolari.

Sono un devoto del C e in parte è dovuto a certe limitazioni che mi hanno impedito di dare un'occhiata ad altri linguaggi come php. Scrivo in C ogni giorno e ogni giorno sono orgoglioso di imparare anche cose nuove. Questo mi fa sentire molto bene e ho anche iniziato a imparare come C fosse la scelta predefinita quando scrivevo applicazioni per siti Web tramite Cgi. Questo è astratto in altre piattaforme e quando si sviluppano siti Web che hanno a che fare con database e servizi Web, è necessario sapere cosa succede dietro le quinte.

Tuttavia, se sai tutto questo e desideri comunque utilizzare un linguaggio di scripting, deve esserci un motivo valido e non abbiamo bisogno che nessuno lo sconsigli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.