Web uygulamalarınız için neden C kullanmıyorsunuz?


101

Bu sabah G-WAN ile karşılaştığımda birkaç farklı web sunucusuna göz atıyordum . Anladığım kadarıyla, C ile yazılmış bir web sunucusu ve web sitelerinizi / web uygulamalarınızı C ile yazarak onu kullanmanız gerekiyor. Açık bir fayda, G-WAN sitesinin önerdiği gibi hızdır.

Ancak forumlarda G-WAN'ın yaratıcısı neden C'yi web tabanlı uygulamalar için kullanmadığımı sordu ve bunun zor olmasının dışında tek bir neden düşünemiyorum (zaten benim için C'ye gelince acemiyim). Hepimizin PHP, Python, Ruby vb. Kullanmamızın, bu dillerde geliştirilmesinin kolay olması dışında daha fazla nedeni olmalı. Bunu iyi bir neden olarak görmüyorum.

Bu yüzden size söylüyorum: Web uygulamalarınız için neden C kullanmıyorsunuz?


34
Neden soba kullanıyoruz ve yemeklerimizi doğrudan ateşte pişirmiyoruz? Yürümek veya bisiklet kullanmak çok daha sağlıklı olmasına rağmen neden araba kullanıyoruz? Neden ... devam edebilirim ...
Felix Kling

16
@Felix - dediğim gibi, zor olmasının dışında başka nedenleri sayın. Bu da demek oluyor ki, diğer dillerin soyut zorluklar için var olduğunun farkındayım.
Abs

15
Asla C zorluğunu düşünmedim.
3

10
@David Lively Eğer 'c' harfini kasıtlı olarak zorlaştırmayı başaramadıysanız, bu gerçekten çok komik. Aferin :)
punkrockbuddyholly

11
@MrMisterMan birinin bunu fark etmesi sadece dört ay sürdü. =)
3

Yanıtlar:


79

Bir C programını doğru ve güvenli hale getirmek büyük özen gerektirir. Bu bakım, programlarınızı gerçekten iyi insanların yazması gerektiği anlamına gelir. Bu, daha fazla ödeyeceğiniz anlamına gelir.

Ayrıca C, .NET'in (ve diğer büyük web merkezli platformların) sahip olduğu gibi muazzam tek bir standart işlevsellik kitaplığından çizim yapma avantajına sahip değildir. Dolayısıyla, bileşenleri satın almanız veya birlikte çalışmanız gerekebilir veya daha fazlasıyla "ücretsiz" gelen kendi işlevselliğinizi, PHP veya C # veya Ruby gibi "web merkezli" bir dil mi diyelim. Bu, daha fazla ödeyeceğiniz anlamına gelir.

Tüm bunları, tek iş parçacıklı hesaplama hızının web'de çok da önemli olmadığı gerçeğine ekleyin. Daha fazla ölçeklenebilirliğe ihtiyacınız varsa, çoğu kuruluş ekonomik olarak soruna daha fazla çekirdek atabilir ve sorun yaşamayabilir. Elbette bu herkes için geçerli değil. Google'ın motorunun çekirdeğinin yalnızca hız için değil, aynı zamanda güç maliyetlerinde gerçek paradan tasarruf etmek için C veya benzer bir dilde yazıldığını hayal ediyorum.


48
Vay canına, kütüphaneler yüzünden .NET için C'ye karşı bir argüman mı? Elbette, stdlib daha küçük, ancak C'de onlarca yıllık kitaplıklarımız (çoğu açık kaynak) var. .NET stdlib'de olgun ve özgür bir C kitaplığı olmayan herhangi bir şey düşünmekte güçlük çekiyorum.
Ken

3
Özellikle .NET'i tartıştığını sanmıyorum, sanırım sadece bir sürü birleşik kitaplıkları olan diller olduğunu kastetti. Eminim C'nin yükleri var ama dürüst olmak gerekirse hepsini tek bir yerde toplayan veya paketleyen herhangi bir repoya rastlamadım.
Abs

16
@Ken String manipülasyonu gerçekten yaygın bir web uygulaması görevidir. Bunun için C kitaplıkları vardır, ancak [yüksek düzeyli bir dil seçin] 'deki kitaplıklar kadar çok sayıda veya kullanılabilir değillerdir.
Andres Jaan Tack

23
@Ken: Tek, iyi desteklenen bir işlevsellik kümesine karşı özellik kümesi, lisanslama ve destek açısından büyük farklılıklar gösteren çok sayıda küçük kitaplığa sahip olduğunuzda bir fark evreniniz vardır.
Dave Markle

49

Hum ...

Görünüşe göre bu tartışmaya biraz geç kaldım - ama şimdi keşfettim. Ve bu kadar çok katkı için hepinize minnettarım.

Ben G-WAN'ın yazarıyım, bu konu üzerinde ciddi bir şekilde çalıştığımı açıkça ortaya koyuyor: G-WAN hem diğer tüm Web Sunucularından (işleme yok) hem de diğer tüm Web Uygulama Sunucularından (hayal edebileceğiniz herhangi bir işlem ) daha hızlıdır .

Evet, ANSI C, daha az güçlü CPU'larla daha statik içeriği işlemeyi de mümkün kıldı (ANSI C yalnızca dinamik içeriği uçurmakla ilgili değildir).

Bu arada, G-WAN C betikleri kullanır (C derleyicisi ve bağlayıcı gerekmez) bu nedenle derleme / bağlama döngüsü / gecikmesi mevcut değildir.

G-WAN'ı .NET Java ve PHP ile karşılaştırma sürecinde 4 dilde de benzer uygulamalar yazdım : http://gwan.ch/source/

Ve benim dehşet içinde, modern betik dillerinin kullanımı kolay değildi .

İşin özellikle sinir bozucu olan bir kısmı, umutsuzca yapmak istediğiniz şeyi yapacak 'sihirli' API çağrısını aramaktır.

İçinde 'oldukça binlerce' nasıl yapılacağını düşünün:

C #

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

Java

new DecimalFormat("0.00"); ...

PHP

number_format($amount, 2); ...

ANSI C

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

"...", bazı ön konfigürasyonların veya sonradan işlemenin gerekli olduğu anlamına gelir. ANSI C'nin kullanımı ve hatırlanması açıkça daha kolaydır.

PHP'nin 5900'den fazla API çağrısı (C # ve Java çok uzakta değil) olduğu durumlarda, doğru API çağrısını bulmak başlı başına bir zorluktur. Bunu bulmak için harcanan zaman (ve daha sonra yerel API çağrısının ne kadar kötü uygulandığını bulmak için), bir dahaki sefere ihtiyacınız olduğunda onu öğrenmenin zamanı, tüm bu zamanlar sizi başvurunuzu çözmek için gereken zamandan mahrum ediyor sorunlar.

PHP'nin ANSI C'den daha kısa olduğunu okudum (yukarıda)? O zaman neden "//:: this is a comment ::"yerine kullanın "// this is a comment"? Neden bu kadar aptalca karmaşık 'güzel binler' sözdizimi var?

Diğer olağan argüman, Java ve benzerinin Web uygulamaları için adanmış çağrılar sağlamasıdır.

Java'da HTML'den kaçacak hiçbir şey bulamadığım için kendi sürümümü yazdım:

  // 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'de aynı kodun daha karmaşık olacağına gerçekten inanıyor musunuz? Hayır, ikisi de gayet kolay olurdu ve daha hızlı.

(C türetilmiştir) Java edilir gerektiren bir '+' ile bağlantı çok hatlı dizeleri için programcılar
edilir (C türetilmiş) C # gerektiren bir '+' ile bağlantı çok hatlı dizeleri için programcılar
(C türetilmiş) PHP edilir gerektiren programcıları çok satırlı dizeleri bir '.' ile bağlayın

ANSI C artık bu tamamen aptalca (eski) gereksinime sahip değil.

Öyleyse, modern dillerin iddia ettiği bu kadar açık ilerleme miydi? Hâlâ arıyorum.

İçtenlikle,

Pierre.


10
Binlerce kişinin fazladan işlenmesi hakkındaki yorumunuzu tam olarak anlamıyorum; C # için bıraktınız , amount), PHP olduğu gibi tamamdır ve ANSI C örneğiniz iki argümana daha ihtiyaç duyar (arabellek ve arabellek uzunluğu). Önemli Java istisnası dışında, örneğiniz tam tersini kanıtlıyor gibi görünüyor. Ek olarak, bu //:: comment ::sözdizimini daha önce hiç görmemiştim ; PHP kesinlikle buna ihtiyaç duymaz.
icktoofay

1
Size karşı dürüst olmak gerekirse, diğer tüm seçenekler ANSI C'den çok daha güzel görünüyor, "kullanımı ve hatırlaması açıkça daha kolay" [sic].
Jarrod Mosen

Her ikisi de C'de yazılmışsa G-WAN, NGINX ile nasıl karşılaştırılır?
m4l490n

47

Çoğu programlama için C'yi kullanmamamızla aynı sebep. Yararları (çoğunlukla performans) maliyetleri (geliştirme süresi, otomatik bellek yönetiminin olmaması, arabellek taşmalarına karşı otomatik koruma eksikliği, düzenleme ve test aşamaları arasında bir derleme aşamasına sahip olma, vb.) Ağır basmaz.


10
Aynı şeyi yazıyordun ve beni yendin. Sadece eklemek istiyorum ki, web sitelerini kötü niyetli davranışlardan korumanın yeterince zor olduğunu, bellek yönetiminin, işaretçilerin vb. Kötüye kullanımından kaynaklanan potansiyel saldırı vektörlerini eklememize gerek yok
Rob Allen

@Jordan: C'de herhangi bir web programlama yapmadığınız hissine kapılıyorum. Söyledikleriniz web programlamanın yapıldığı modele uymuyor.

2
Web sitenizin URL veya form girişi yoluyla kullanıcı etkileşimi için herhangi bir yeri olduğunu varsayarak elbette var. Bu veriler sunucuya teslim edildikten sonra, belleğin doğru şekilde tahsis edildiğinden emin olmak programcıya kalmıştır. G-WAN, sorgu parametreleri hakkında bazı soyutlamalara sahiptir, ancak bu sizi tamamen kurtarmayacaktır. Doğru yapıldığını söylemiyorum, C web programlaması güvenli ve hızlı olamaz, ancak daha sert hatalara karşı daha hassastır.
Ürdün

3
sigh @Kinopiko: Eğer bir arabellek taşmasının ne olduğunu bilmiyorsanız, C ile kodlamamalısınız 'dedi. Daha fazla bilgi için: securecoding.cert.org/confluence/display/seccode/...
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳

29

Çoğu ağ uygulaması, özellikle web sunucuları, çok daha fazla "G / Ç bağlı" dır - yani, ağın kabul edebileceğinden çok daha hızlı veri pompalama yeteneğine sahiptirler. Bu nedenle, CPU açısından oldukça verimli olan bir şey çok büyük bir kazanç değildir, oysa ölçeklenebilir ve bakımı yapılabilir bir şeydir. Dolayısıyla, C'nin dezavantajlarını kabul etmek ve Java, .NET, Python, Perl veya diğer diller gibi yönetilen bir ortamın avantajlarını kaybetmek için hiçbir neden yoktur.


1
C çok daha hızlı.

14
Ağ borusunu Java veya Perl ile doldurabilirsem (ve yapabilirsem), C'nin daha hızlı olduğu gerçeği önemsizdir.
Paul Tomblin

1
@Kinopiko, eBay (Java), Stack Overflow (C # /. NET), Google veya daha yüksek seviyeli dillerde yazılmış milyonlarca çok kullanılan web sitesinden daha büyük bir kanalınız, daha fazla sayfa ziyaretiniz ve gönderilecek daha fazla veriniz olduğunu mu söylüyorsunuz? ?
Paul Tomblin

1
@Paul Tomblin: Bir web uygulamasının amacı ağ borusunu doldurmak değil, bazı işlemler yapmaktır. Yalnızca bazı metin ve görüntüleri sunmanız gerekiyorsa, üstün performans sağlayan statik html sayfaları kullanmalısınız. Çoğu durumda, statik sayfalar önbellekten sunulur, bu nedenle sunucunuzun ihtiyacı olan hiçbir şey yoktur. OTOH, işleme gerektiğinde, darboğaz olabilir (daha yaygın olarak disk darboğaz olmasına rağmen).
PauliL

4
Web uygulamalarının, kullanıcı isteklerini karşılayan bir "sunucu yığınının" yalnızca bir kısmı olduğunu ve performans açısından kritik bir parça olmadığını hatırlamanız gerekir. Başka bölümler de var - işletim sistemi çekirdeği (genellikle C ile yazılır), dosya sistemi (C), web sunucusu (genellikle C), dil yorumlayıcı (C), veritabanı (genellikle C veya C ++). Web uygulaması genellikle verileri yalnızca bir bölümden diğerine aktarır, üzerinde bazı temel işlemler uygular ve performansı hiç de önemli değildir.
el.pescado

15

C, dizeleri değiştirmek için uygun bir dil değildir.

C # ile karşılaştırın:

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

Karşılık gelen 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
PHP de Unicode'u düzgün bir şekilde işlemez, ancak çok popüler bir Web tabanlı dildir.
el.pescado

12
Öyleyse C ++ 'ı kullanmalıyız, çünkü C ile aynı performansı alıyor, ancak C # örneğinizi bir cazibe gibi derliyor?
tstenner

2
Dize manipülasyonu itibarıyla - web uygulaması genellikle yalnızca çıktı dizgeleri, bu nedenle C'ler printfişi yapmalıdır.
el.pescado

5
C, çok baytlı ve unicode'u çalışma zamanı kitaplığı işlevleri aracılığıyla gayet iyi işler. Strncpy ve benzeri güvenli işlevleri kullanmak, onu oldukça güvenli kılar.
justinhj

2
Veya asprintf (& foobar, "% s% s", foo, bar);
Patrick Lorio

11

Zorluk ve karmaşıklık hiç sorun olmasaydı (ha!), O zaman C'de durmazdım. X86 derlemesi yazardım. X86 olmayan herhangi bir web sunucusunu kullanmayalı yıllar oldu ve her geçen gün daha az olası görünüyor.

C'yi kullanmak (derleme veya daha üst düzey bir şey yerine), C'nin programcı verimliliğinin ve bilgisayar verimliliğinin tatlı noktası olduğunu önermektir.

Yazdığım programlar için durum böyle değil: C, yazmak istediğim program türleriyle zayıf bir eşleşme ve iyi bir makro birleştiriciye göre avantajları o kadar da önemli değil. Şu anda yazdığım program, tercih ettiğim HLL'de zor değil, ancak montaj veya C'deki karmaşıklığı o kadar yüksek olacak ki asla bitmeyecek. Yeterince zamana sahip yeterince akıllı bir programcının montaj veya C'de daha hızlı çalışmasını sağlayabileceğini kabul ediyorum, ancak ben o programcı değilim.


7
  • 's güvensiz
  • öyle okumak zor
  • sürdürmek zor, geliştirme süresi belli bir büyüklük sırasına göre daha yavaş
  • web içeriğinizin çoğu muhtemelen I / O bağlıdır, bu nedenle hızlanmanın önemi bile yoktur, özellikle Java veya C # gibi hızlı bir dil kullandığınızda

2
"Java veya C # gibi hızlı dil" ne anlama geliyor?
RobS

3
@Kinopiko: Dinamik dillerin zayıf yönleri nelerdir? Bir noob programcısı açıkça keyfi kod evalve php'ler aracılığıyla çalıştırmak istediğini söylediğinde include? Lütfen, C / C ++ 'da rasgele kod çalıştırmak istediğinizi belirtmiyorsunuz, sadece yapıyor. evalhata değil, programcının niyeti bu. C / C ++ 'da, herhangi bir hata uzaktan kod yürütülmesine yol açabilir, dinamik dillerde, bazı aptallar uğraşmadıkça durum böyle değildir eval.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

1
"ve ne yaptığınıza bağlı olarak C / C ++ kadar hızlı veya daha hızlı" olabilir, ancak yine de hem Java hem de C # ile yönetilen bir bellek ortamıyla uğraşıyorsunuz ve bu, yüksek trafik senaryolarında büyük bir dezavantaj haline gelebilir.
RobS

5
"ve C kesinlikle herhangi bir dinamik dilin sahip olduğu kadar çok güvenlik zaafına sahip değildir" Bu , dostum, tamamen saçma. Bu yorumun neden 3 olumlu oyu var?
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

2
@Kinopiko: Aslında bunu hiçbir yerde açıklayamazsınız. Bunun bir açıklaması yok. C'nin herhangi bir dinamik dilden çok daha büyük bir sorunu var. Dinamik bir dilde olabilecek en kötü şey "öznitelik bulunamadı, whoop dee doo" dur.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7

Bu sorunun zaten ölümüne cevaplandığını biliyorum, ancak şimdiye kadar bahsedilmeyen 2 şey var, herhangi bir programlama paradigmasında başarı için olağanüstü derecede önemli ve özellikle programcı olmayan birçok insanı aldığınız web geliştirmede. kodla çalışmak.

  1. İlgili, yararlı topluluk, diğer adıyla Sorunumu Çoktan Çözmüş Kişiler. Google'a en acemi olanlar için bile neden PHP'de "başlıklar zaten gönderilmiş" hataları aldıkları oldukça kolaydır, oysa bu bilgi sahnede yeni olan veya başka türlü olmayan bir çerçeve veya dil için mevcut olmayabilir. Kritik kitle.
  2. Çerçeveler, böylece çoğu programcı işle ilgili sorunları çözebilir ve birlikte kodu hacklemeyebilir.

Ekstrem performans gerektiren kritik bir uygulamam olsaydı, C kullanırdım, ancak yazmak o kadar uzun sürerdi ki asla piyasaya süremezdim. # 1 veya # 2 olana kadar onu kullanmak benim için uygun değil.


6

C, birçok amaç için oldukça düşük seviyeli dillerdir: OOP'suz, çok sayıda manuel kaynak yönetimi.

Web için sınırlı C kullanımı vardır, örneğin Klone . Çoğunlukla düşük kaynaklı gömülü uygulama durumları için kullanılır.

Bununla birlikte , yüksek performanslı web uygulamaları geliştirmeleri için kullanılan CppCMS gibi C ++ web çerçeveleri vardır.

C ++, büyük uygulamaları dağıtmak ve geliştirmek için tam olarak çok daha iyi bir seçenek sunarak, yaptığınız şeye yüksek soyutlamanın ve ince taneli erişimin keyfini çıkarmanızı sağlar.

Ancak, performans ve kaynak kullanımının pazara sunma süresinden ve geliştirme maliyetlerinden çok daha kritik olduğu durumlarda kullanırsınız, çünkü genellikle web geliştirme Java, Python veya PHP gibi diller için iyi web çerçeveleri kullanarak daha hızlıdır. Ayrıca genellikle C ++ için daha az yetkin programcılar, daha sonra aynı maaş için Java / P * dilleri vardır.

Yani öncelikler meselesi, ayrıca C ++ Web geliştirme için PHP / Python / Perl veya Java için olduğundan daha az araç var.


2
İlginç, CppCMS hakkında C ++ ile yazılmış düşük seviyeli bir web çerçevesi bilmiyordum. C ve Web Dilleri arasında oturmak, her iki dünyanın da en iyisi olabilir.
Abs

Artık düşük seviyeli çerçeve, çok HIZLI olan MVC web çerçevesidir.
Artyom

Üzgünüm, web dili olmayan herhangi bir şeyi düşük seviye olarak adlandırıyorum. Bir MVC web çerçevesi olsa da anlıyorum.
Abs

"Web Dili" diye bir şey yoktur, muhtemelen sadece PHP web olarak adlandırılabilir. Java, Python, Perl, Ruby ve C # dahil diğer tüm diller Web için kullanılan genel amaçlı dillerdir.
Artyom

1
Öyle spesifik olmak istiyorsak, genel amaçlı programlama dilleri diye bir şey yoktur. Yalnızca Prosedürel, Yapılandırılmış, Nesne Tabanlı, İşlevsel ... vb ... vardır ...
Abs

5

@ErkekTerimleri

FUD çalışırken:

PHP, Python vb., Soruna donanım atarak ölçeklendirmek kolaydır.

Aslında hayır. Dikey olarak hiç ölçeklenmezler ve yatay olarak çok zayıf ölçeklenirler. Bakınız: http://gwan.ch/en_scalability.html burada, kötü performans gösterenlerin önünde ne kadar sorun olduğu açıklanmaktadır.

PHP'de bir uygulama geliştirmenin 1 kişinin 1 yıllık çabasına mal olduğunu ve bunu C'de yapmanın 3 yıla mal olduğunu varsayalım (C aynı şeyi yapmak için daha fazla çaba gerektirdiğinden).

Yine yanlış. PHP kitaplıkları C ile yazılmışsa, doğrudan C'den kullanılabilirler - aynı zamanda PHP'nin sahip olduğunu iddia ettiğiniz 'benzersiz üretkenliği' sağlarlar.

Bu, C kodunun azaltılmış donanım ihtiyacının, C'nin cazip hale gelmesi için 2 yıllık ücreti temsil etmesi gerektiği anlamına gelir. Pratikte bu (neredeyse) asla olmaz.

Saf FUD (yukarıdaki cevaba bakın).

Facebook'un ölçeği o kadar büyük ki, donanım bakım için yeterince büyük bir maliyet. Bu yüzden PHP'yi C ++ 'ya çapraz derleyen HipHop'u geliştirdiler. Her iki dünyanın da en iyisini sunar: PHP'de programlamanın basitliği ve C ++ 'ın ham performansı. Facebook hala PHP'de geliştirilmektedir, ancak onu kullandığınızda tamamen yerel koddur.

HipHop, PHP'den çok daha hızlıdır, buna şüphe yok. Ancak HipHop'u düz-C uygulamasıyla karşılaştırırsanız, iki katman ek yükünüz olur:

  • PHP - C ++ arayüzleri (şişirilmiş C ++ kitaplıklarını kullanan);
  • C ++ şişkinliğinin kendisi (C ++ 'yı düz C'den 2-10 kat daha yavaş yapar).

Ayrıca HipHop, bilgisiz, verimsiz Akademik modda yazılmıştır (herhangi bir gerçek dünya gerçekliğinden ayrı). Elbette, PHP kodlayıcılarını etkileyebilir, ancak bu kodu yerleşik bir programcıya gösterir ve Facebook için üzülür.

"Her şeye sahip olmayan bir dili programlamak bazılarına göre daha kolaydır" --Dennis M. Ritchie

SON KULLANICILAR'ın (çoğu) programlama dilinin aksine, Dennis bu konu hakkında birkaç şey biliyormuş gibi görünüyor.


3
(1) Bu kadar kişisel almayın, ürününüzü beğenmedim çünkü ürününüzü bile bilmiyordum. (2) G-wan ile ilginç bir konsept kanıtı oluşturuyorsunuz, ancak birkaç sentetik kıyaslama değil, gerçek dünya web uygulamalarının kullanıldığını görene kadar bekleyip yaklaşımı görürsem beni affedeceğinizi umuyorum. (3) Facebook'un yatay ölçekleme konusundaki şikayetini yanlış tanımladınız, çünkü sorunları memcache ve veritabanı çok çekirdekli performansıyla ilgili, gerçek dünya web uygulamalarının darboğazı, ki bu G-wan'ın çözmeye yardımcı olmadığı bir şey. (4) HipHop eminim kod katkılarınızı memnuniyetle karşılar.
Joeri Sebrechts

1
Verimlilik konusuna değiniyorum. Web uygulamalarını daha önce, aylar önce yazmıştım ve o sırada PHP'nin yaptığından çok daha fazla satıra ihtiyaç duyulurken çökme / sızma riski çok daha fazlaydı. (Bu tür hatalar konusunda sadece "ortalamayım", yani onları ara sıra yazıyorum demektir.) Kararımı, aksini gösteren gerçek uygulamaları görene kadar bu deneyime dayandırıyorum (örneğin, C'ye bir wordpress portu çok daha fazla kod satırı gerektirmez).
Joeri Sebrechts

"Dikey olarak ölçeklenmeyen" bir şey nasıl olur? Daha hızlı tek çekirdek performansından ve daha hızlı bellek performansından yararlanmayacağını mı söylüyorsunuz?
rakslice

5

Hepimizin PHP, Python, Ruby vb. Kullanmamızın, bu dillerde geliştirilmesinin kolay olması dışında daha fazla nedeni olmalı.

Tüm neden budur ve tek ihtiyaç duyulan şeydir. Başlıca pazarlama zamanı olan birçok faydası vardır . Web uygulamanızı C kullanarak iki ay yerine PHP kullanarak bir ay içinde çevrimiçi hale getirebilirseniz, kazanabilirsiniz. Ruby on Rails'i kullanarak C'yi iki hafta kullanmak yerine bir hafta içinde yeni bir özellik ekleyebilirseniz, yine kazanırsınız. C ile iki gün yerine Python kullanarak bir günde bir hatayı düzeltebilirseniz, bir kez daha kazanırsınız. Rakiplerinizin Y dilini kullandıkları için ekleyemediği X dilini kullandığınız için bir özellik ekleyebilirseniz ve kaynak kısıtlamaları nedeniyle bu dilde çok zor olursanız, o zaman kesinlikle kazanırsınız.

Ve "kazan" derken, gerçekten kaybetmeyeceğinizi söylüyorum.Rakipleriniz sitelerini geliştirmek için daha yüksek seviyeli diller ve çerçeveler kullanıyor, bu nedenle C kullanıyorsanız, C kullanan diğer insanlarla rekabet etmiyorsunuz, C kullanmayan diğer insanlara karşı kaybediyorsunuz. Sadece rekabet etmek için, benzer soyutlama düzeylerine sahip araçları kullanmak.

Performans bir sorun haline gelirse, sitenizin yavaş olan kısımlarını daha iyi performans gösteren dillerde yeniden yazabilirsiniz. Ya da ona daha fazla donanım fırlatabilirsiniz. Gerçekten, performans problemi bizim "güzel problem" dediğimiz şeydir - bu zaten başardığınız anlamına gelir. Ancak sitenizin temel işlevlerini geliştirmek için daha fazla zaman harcamak nadiren bir seçenektir. Bunu daha hızlı çalışması için C ile yazmak, erken optimizasyondur, ki bu, Knuth'un bize söylediği gibi, tüm kötülüklerin köküdür.

Bütün bunlar, Python veya Ruby'den daha yüksek düzeyde soyutlamaya sahip bir dil kullanırsanız, Python veya Ruby kullanan insanlara karşı kazanabileceğiniz anlamına gelir. Paul Graham'ın, kendisinin ve ekibinin LISP'i Web siteleri geliştirirken "gizli bir silah" olarak nasıl kullandığına dair hikayesi öğretici olabilir. http://www.paulgraham.com/avg.html

Elbette, kendi eğlenceniz için bir site geliştiriyorsanız, bunu istediğiniz dilde yapın. Siteniz CPU'ya bağlıysa (neredeyse hiç yoktur; bunlar genellikle G / Ç'ye bağlıdır), o zaman yapabileceğiniz en hızlı performans gösteren dili kullanın. Yine de yenilik yapmaya çalışıyorsanız, bulabileceğiniz en iyi soyutlamalara sahip yüksek seviyeli bir dil kullanın.


Web yoluyla yüksek hacimli sipariş işleme bitinin C'de yazıldığını unutuyorsunuz . Paulgraham.com/avg.html'nin altındaki notlara bakın .
Giles Roberts

4

Kolay olmanın iyi bir sebep olmadığını düşünüyorsun. Bunun iyi bir sebep olduğunu düşünüyorum. Nihai performansa ihtiyacınız varsa C tamamdır, ancak diğer diller üretkenliği, sürdürülebilirliği artırmak ve kusurları azaltmak için zor şeyleri soyutlar.


6
Üstün performans elde etmek için sadece C'ye değil, aynı zamanda mükemmel C programcısına da ihtiyacınız var. Ve bu adamlar genellikle Java / P * programcılarından daha fazla para isterler.
el.pescado

4

Bir web geliştiricisi olmadığımı düşünün, ancak yine de bu soruları soracak ve bir iki nokta önereceğim.

Hangi web sitesi yalnızca tek bir dilde yazılır? Cidden bu iplik, tek bir çekicin tüm çivilere uyduğunu varsayıyor.

En son ne zaman birisi C'nin karmaşık olduğunu ciddi bir şekilde ifade etti? Demek istediğim, gerçekten çok daha düşük seviyeye ulaşamazsınız. İkisine genellikle toplu olarak atıfta bulunulduğu için burada C ++ 'dan bahsetmiyorum.

C'nin inkar edilemeyen güvenlik endişeleri var ama bunlar PHP ve Perl adı verilen kludge'larda görülenden daha mı az? Her iki durumda da güvenli bir web sitesi, programcı disiplininin bir işlevidir.

Her halükarda yorumlara kapalı. Herhangi bir dili kullanmanın zorluğu eldeki soruna çok bağlıdır. C ve özellikle C ++, deneyimli ellerde bir soruna hızlı çözümler getirebilir.

Web sunucuları için endüstriyel kullanımlar, yani gömülü sunucular / siteler, normal bir web sunucusunun sahip olabileceği dil seçeneklerine sahip değildir. Böylece C'nin bir varyantını veya muhtemelen BASIC gibi bir şeyi kullanırsınız. Amacınız, cihazın gerektirdiği işlevselliği sunmak ve diller konusunda endişelenmemek. Ana akım bir web sunucusunda bunu yapmanın yolu çoğu zaman yüksek seviyeli diller kullanmaktır. Büyük demirden uzaklaşın ve programlama özgürlüğünüz kapıdan çıkıyor.

Doğru Kütüphaneler olmadan, C'de temelden bir web projesi yapmak çoğu durumda aptalca olurdu. İyi standartlaştırılmış kütüphanelerin eksikliği burada büyük bir olumsuzluktur.


3

Web için kendi C kitaplığınızı oluştururken bakmaya değer, C ile yazılmış web ile ilgili daha fazla kod:

  • cgic: CGI Programlama için ANSI C kütüphanesi
  • cgit: git depoları için bir web ön ucu
  • wbox: HTTP test aracı
  • wget html-parse.c
  • curl çerez.c
  • İndirim, David Parsons'ın John Gruber'in Markdown metninin html diline C uygulaması
  • Protothreads (özellikle gömülü sistemler için), http://www.sics.se/~adam/software.html
  • protothread, Google kod projesi, LarryRuane
  • uriparser sourceforge projesi
  • http-ayrıştırıcı, http isteği / yanıt ayrıştırıcısı c için Ryan Dahl tarafından github'da
  • nginx
  • ...

2

Web geliştirmenin yararlı kitaplıklara (PHP tarafından kullanılan türden) sahip olma meselesi olduğu gerçeği göz önüne alındığında, C'nin ne kadar yararlı olmayacağını anlamıyorum.

Sonuçta, prosedür mantığı aynıdır: C, PHP, .Net veya Perl olsun, while, for, if then if then, vb.

Ve bir C döngüsü veya testi C dilinde yazıldığı için yazmak daha zor değildir.

PHP kitaplıklarının çoğu C'de yapılır, bu nedenle eksik Web için C kitaplıkları argümanı o kadar da ikna edici görünmüyor.

Benim tahminime göre C, Java (SUN) ve .Net (MICROSOFT) destekleyicileri tarafından bir Web programlama dili olarak tanıtılmadı çünkü benimsemek için kendi tescilli (ağır patentli) entelektüel varlıkları vardı.

Ücretsiz (patentsiz) bir standart olarak, C geliştiriciler üzerinde herhangi bir 'kilitlenme' sağlamaz ... bu nedenle, okullarda ve üniversitelerde vergi mükellefinin bir uygulamanın benimsenmesini finanse etmesini sağlamak için lobi faaliyetinin ağır eli olabilir. özel çıkarlarla desteklenen düşük teknoloji.

C, IBM ve MICROSOFT için yeterince iyiyse (ürünlerini PHP veya .Net'te geliştirmiyorlarsa), ancak son kullanıcılar için yeterince iyi değilse, son kullanıcılar neden bu çifte standarttan muzdarip olduklarını merak edebilirler.


1
Uhhhh Microsoft.com ve sharepoint'in ikisi de ASP.NET'dedir. Visual Studio 2010'un çoğu .NET (WPF) içindedir. Bu ifade açıkça yanlıştır. Tasarım gereksinimlerinizi karşılayan en yüksek seviyeli dili kullanın. Web için bu, C # / Python / etc ve performansın bir sorun haline geldiği C / C ++ / etc içindeki bileşenler anlamına gelir - neredeyse hiç olmamasına rağmen.
3

2

Aşağıdaki durumlarda bir web uygulaması için C kullanırdım:

  1. Barındırma sunucusu (küçük VPS) için küçük bir bütçem var ve zamanım pahalı değil.
  2. Facebook, Twitter veya kullanılan sunucuların miktarını azaltması gereken biri (binlerce ila milyonlarca kullanıcıyla) için çalışıyorum.
  3. C öğrenmek istiyorum ve onu kullanabileceğim gerçek bir dünya uygulaması bulmam gerekiyor.
  4. C'yi diğer betik dillerinden çok daha iyi biliyorum.
  5. Ben bir çevreciyim ve uygulamamın karbon ayak izini azaltmak istiyorum.

G-WAN, kodu komut dosyaları olarak çalıştırır, evet Play! Java için çerçeve yapar. G-WAN çok hızlıdır ve kolay bir API'ye sahiptir. G-WAN, diğer sunucular bunu yapamadığında web uygulamaları için C / C ++ kullanmayı mümkün kılar.

Açık olan bir şey var: C dilinde bir web sitesi yazmak için iyi bir programcıya ihtiyacınız var, her berbat geliştirici spagetti ile bir site oluşturabilir PHP :-) C için sızıntı detektörleri ve hatta çöp toplayıcıları var.


2

Bahsettiğiniz tüm diller aslında C / ++ ile yazılmıştır. Tek fark, şu anda diğer tercüman dillerini oluşturan C'den oluşturulan gelişmiş sınıflar ve kitaplıklardır. Komut dosyası dilleri olarak anılmalarının nedeni de budur.

Bunu bir pasta pişirmek gibi düşünün (PHP / JS):

  • 2 Yumurta, 1 su bardağı Süt, 2 çubuk Tereyağı, 4 su bardağı un, 1 su bardağı Şeker, Kabartma tozu

Ancak bu şeylerin oluşturduğu tüm unsurları yapmak zorunda olduğunuzu hayal edin. (C / ++)

  • 17 mg sodyum bikarbonat, 15 tbs protein, 12 tbs Vitelline Membran, Amino Asit, Sülfür, ... Nötron Partikülleri

C, birçok modern dilin temelidir. Harika ve derleme altındaki neredeyse en güçlü diller. Bunu yapabilirsiniz, sadece bu diğer dillerin zaten yaptığı tüm kodları oluşturmaya yatırım yapmanız gerekir. Periyodik tablodan bir pasta yapmak gibi.

Kelimenin tam anlamıyla her şeyi yapmasını sağlayabileceğinizi öğrenin!


1

C'deki dize kullanımı aşağıdakiler kullanılarak daha kolay hale getirilebilir:

Veri Türleri (libslack'in bir parçası)

Libslack, List adı verilen genel bir büyütülebilir işaretçi dizisi veri türü, Harita adı verilen genel bir büyütülebilir karma tablo veri türü ve işlev yığınlarıyla birlikte gelen (çoğu Perl'den kaldırılmış) iyi bir String veri türü sağlar. Ayrıca isteğe bağlı, "büyütülebilir" serbest listelerle soyut tek ve çift bağlantılı liste veri türleri de vardır.

veya:

Yönetilen Dize Kitaplığı (C için)

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


1

"makine" şunu yazdı:

platform bağımlılığı: C'nin yerel koda derlenmesi gerekir. Bu kod tüm platformlarda çalışmaz. Yorumlanan diller (PHP gibi), bir yorumlayıcının bulunduğu her yerde çalışır. Elbette bu problem çözülebilir ancak bu durumda PHP'de geliştirmenin avantajını görüyorsunuz.

Taşınabilir PHP yorumlayıcısının hangi dilde yazıldığını hiç merak ettiniz mi?

ANSI C.

Öyleyse, ANSI C'nin taşınabilirliğini tekrar reddetmeden önce, kendinize en sevdiğiniz programlama dilinin hangi dilde yazıldığını sorun ... (ipucu: neredeyse tamamı C / C ++ ile yazılmıştır).

ANSI C derleyicileri, üzerinde çalışmam gereken tüm platformlarda mevcut ve aynı şey PHP ve devasa çalışma zamanı için geçerli değil.

Taşınabilirlik argümanı için çok fazla .


2
PHP benim favori dilim DEĞİLDİR. Henüz PHP'de hiçbir şey kodlamadım. Ben bir C ve C ++ programcısıyım. C'nin taşınabilirliğini asla göz ardı etmedim! Bahsettiğim tek şey, PHP-Scripts'i mevcut bir WebSpace'e uygulamanın kolaylığıydı. Derleyicinizin olduğu düşük bütçeli bir Web Alanı alabileceğiniz durumu gösterin. Belki yanılıyorum ama sanırım bir dile tapan ama diğerinin avantajlarını, belki daha uygun dilleri görmeyen bu fanatik Programcılardan birisiniz. C ve C ++ 'yı seviyorum ama kalıpların dışında düşünebiliyorum.
domachine

0

G-WAN'a benzer, ancak Cocoa / Objective-C için bir web uygulamaları çerçevesi olan Bombax'tır.

http://www.bombaxtic.com

Objective-C'den bahsetmişken, bir gün web uygulamaları yapma şeklimizde devrim yaratma potansiyeline sahip olan MacRuby'ye işaret etmekten kendimi alamıyorum.


MacRuby artık öldü.
Banjocat

0

Başka bir nokta da platform bağımlılığı olabilir. C'nin yerel koda derlenmesi gerekir. Bu kod tüm platformlarda çalışmaz.

Yorumlanan diller, bir tercümanın bulunduğu her yerde çalışır. Örneğin birçok sağlayıcı, sunucularında Windows işletim sistemi yüklü PHP-Yorumlayıcılar sağlar. Şimdi bir Linux makinesinde geliştiriyorsanız. Senin bir problemin var.

Elbette bu problem çözülebilir ancak bu durumda PHP'de geliştirmenin avantajını görüyorsunuz.

Umarım bu yardımcı olur, domachine saygılar.


0

PHP, Python vb., Soruna donanım atarak ölçeklendirmek kolaydır.

PHP'de bir uygulama geliştirmenin 1 kişinin 1 yıllık çabasına mal olduğunu ve bunu C'de yapmanın 3 yıla mal olduğunu varsayalım (C aynı şeyi yapmak için daha fazla çaba gerektirdiğinden). Bu, C kodunun azaltılmış donanım ihtiyacının, C'nin cazip hale gelmesi için 2 yıllık ücreti temsil etmesi gerektiği anlamına gelir. Pratikte bu (neredeyse) asla olmaz.

Her kuralda olduğu gibi, bir istisna vardır. Facebook'un ölçeği o kadar büyük ki, donanım bakım için yeterince büyük bir maliyet. Bu yüzden PHP'yi C ++ 'ya çapraz derleyen HipHop'u geliştirdiler . Her iki dünyanın da en iyisini sunar: PHP'de programlamanın basitliği ve C ++ 'nın ham performansı. Facebook hala PHP'de geliştirilmektedir, ancak onu kullandığınızda tamamen yerel koddur.


0

Sonunda, assembler dahil (CGI vb. Aracılığıyla) siteleri geliştirmek için kesinlikle herhangi bir dili kullanabilirsiniz. Neden derlenmiş bir dil kullanmadığımızı kastettiyseniz, zaten .NET, Java ve diğerleri var.


0

Sonuçlara ulaşmak için yaptığınız şeyi sevmelisiniz. Java ve php gibi diller, insanların hayatlarını kolaylaştırmak için çok çaba sarf edilerek yaratıldı. Php özellikle bugün kendi kendine öğrenen birçok web programcısına fayda sağlamıştır. Web geliştirme dünyasında ne tür bir desteğe sahip olduğunu görebilirsiniz.

Java kesinlikle bugünün dünyasında mümkün olabilecek her konuda size yardım etmek için yazılmıştır. Muazzam kitap açık bir gösterge ve eğer web geliştirmeye meraklıysanız bir canavar. Aynı şey Python için de geçerli. Bunlar harika diller ve platformlar. Oldukça popüler olmalarına şaşmamalı.

Ben bir C adanmışıyım ve kısmen php gibi diğer dillere bakmamı engelleyen bazı sınırlamalar nedeniyle. Her gün C yazıyorum ve her gün e ve yeni bir şey öğrenmekten gurur duyuyorum. Bu kendimi çok iyi hissettiriyor ve ayrıca Cgi aracılığıyla web siteleri için uygulamalar yazarken C'nin varsayılan seçim olduğunu öğrenmeye başladım. Bu, diğer platformlarda soyutlanmıştır ve veritabanları ve web hizmetleriyle ilgili web siteleri geliştirdiğinizde, perde arkasında neler olduğunu bilmeniz gerekir.

Bununla birlikte, tüm bunları biliyorsanız ve yine de bir betik dili kullanmak istiyorsanız, geçerli bir neden olmalıdır ve buna karşı tavsiye verecek kimseye ihtiyacımız yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.