Dlaczego nie używasz języka C w swoich aplikacjach internetowych?

101

Kiedy rano natknąłem się na G-WAN, przyglądałem się kilku różnym serwerom internetowym . Jak rozumiem, jest to serwer WWW napisany w C i musisz go wykorzystać, pisząc swoje strony internetowe / aplikacje w C. Jedną z wyraźnych korzyści jest szybkość, jak sugeruje witryna G-WAN.

Jednak na forach twórca G-WAN zapytał, dlaczego nie używać C do aplikacji internetowych i nie mogę wymyślić żadnego powodu poza tym, że jest to trudne (dla mnie zresztą jestem nowicjuszem, jeśli chodzi o C). Musi być więcej powodów, dla których wszyscy używamy PHP, Python, Ruby itp., Poza tym, że programowanie w tych językach jest łatwe. Nie uważam tego za dobry powód.

Więc powiem ci: dlaczego nie używasz C do swoich aplikacji internetowych?

Abs
źródło
34
Dlaczego używamy kuchenek i nie gotujemy posiłków bezpośrednio przy ogniu? Dlaczego używamy samochodów, skoro chodzenie lub jazda na rowerze jest dużo zdrowsza? Dlaczego ... Mógłbym kontynuować ...
Felix Kling
16
@Felix - jak powiedziałem, wymień inne powody poza trudnością. Co oznacza, że ​​mam świadomość, że inne języki istnieją dla abstrakcyjnych trudności.
Abs
15
Nigdy tak naprawdę nie uważałem C za trudne.
Zapisz
10
@David Lively Jeśli celowo nie udało Ci się umieścić litery „c” jako trudnej, to naprawdę zabawne. Dobra robota :)
punkrockbuddyholly
11
@MrMisterMan zajęło komuś tylko cztery miesiące, aby to dostrzec. =)
Zapisz

Odpowiedzi:

79

Poprawność i bezpieczeństwo programu w języku C wymaga wiele uwagi. Ta troska oznacza, że ​​musisz mieć naprawdę dobrych ludzi piszących swoje programy. Oznacza to, że płacisz więcej.

Ponadto C nie ma korzyści z czerpania z ogromnej pojedynczej standardowej biblioteki funkcji, jaką ma .NET (i inne główne platformy internetowe). Być może będziesz musiał albo kupić komponenty, albo wykonać interop, albo rozwinąć własną funkcjonalność, która jest dostępna „za darmo” z innym, powiedzmy, językiem „webowym”, takim jak PHP, C #, Ruby lub cokolwiek innego. Oznacza to, że płacisz więcej.

Dodajmy to wszystko do faktu, że jednowątkowa prędkość obliczeniowa nie jest tak ważna w sieci. Jeśli potrzebujesz większej skalowalności, większość organizacji może po prostu rzucić więcej rdzeni na problem i wszystko będzie dobrze. Oczywiście nie dotyczy to wszystkich. Wyobrażam sobie, że rdzeń silnika Google jest napisany w C lub podobnym języku, nie tylko ze względu na szybkość, ale także w celu zaoszczędzenia realnych pieniędzy na kosztach energii.

Dave Markle
źródło
48
Wow, argument za .NET przeciwko C z powodu bibliotek ? Jasne, standardowe biblioteki są mniejsze, ale mamy dziesiątki lat bibliotek (wiele open-source) w C. Mam problem z wymyśleniem czegokolwiek w stdlib .NET, dla którego nie ma dojrzałej i bezpłatnej biblioteki C.
Ken
3
Nie sądzę, żeby spierał się konkretnie za .NET, myślę, że miał na myśli tylko języki, które mają wiele spójnych bibliotek. Jestem pewien, że C ma ładunki, ale szczerze mówiąc, nie natknąłem się na żadne repozytorium, które gromadziłoby je wszystkie w jednym miejscu lub pakowało.
Abs
16
Manipulacja ciągiem @Ken jest naprawdę powszechnym zadaniem aplikacji internetowej. Biblioteki C istnieją do tego celu, ale nie są tak liczne ani użyteczne jak biblioteki w [wybierz język wysokiego poziomu].
Andres Jaan Tack
23
@Ken: Istnieje ogromna różnica, gdy masz jeden, dobrze obsługiwany zestaw funkcji w porównaniu z wieloma małymi bibliotekami, które różnią się znacznie pod względem zestawu funkcji, licencji i wsparcia.
Dave Markle
49

Szum...

Wydaje się, że trochę się spóźniłem w tej dyskusji - ale właśnie to odkryłem. Jestem wam wszystkim wdzięczny za tak duży wkład.

Jestem autorem G-WAN, co daje jasno do zrozumienia, że ​​poważnie nad tym pracowałem: G-WAN jest zarówno szybszy niż wszystkie inne serwery internetowe (bez przetwarzania) i wszystkie inne serwery aplikacji internetowych (dowolne przetwarzanie, jakie możesz sobie wyobrazić).

Tak, ANSI C umożliwiło również przetwarzanie bardziej statycznej zawartości - z mniej wydajnymi procesorami (ANSI C to nie tylko sprawianie, że dynamiczne treści są w ruchu).

Nawiasem mówiąc, G-WAN używa skryptów C (nie jest potrzebny kompilator C ani linker), więc cykl kompilacji / łączenia / opóźnienia nie istnieje.

Porównując G-WAN z .NET Java i PHP, napisałem podobne aplikacje we wszystkich 4 językach: http://gwan.ch/source/

Ku mojemu przerażeniu współczesne języki skryptowe nie były łatwiejsze w użyciu.

Jedną z części pracy, która jest szczególnie frustrująca, jest desperackie poszukiwanie „magicznego” wywołania API, które zrobi to, co chcesz.

Pomyśl, jak zrobić „ładne tysiące” w:

DO#

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

Jawa

new DecimalFormat("0.00"); ...

PHP

number_format($amount, 2); ...

ANSI C

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

„...” oznacza, że ​​wymagana jest pewna konfiguracja wstępna lub przetwarzanie końcowe. ANSI C jest wyraźnie łatwiejszy w użyciu i do zapamiętania.

Kiedy PHP ma więcej niż 5900 wywołań API (C # i Java niedaleko), znalezienie odpowiedniego wywołania API jest wyzwaniem samym w sobie. Czas stracony, aby to znaleźć (a następnie przekonać się, jak źle zaimplementowano natywne wywołanie API), czas na naukę przez hart go następnym razem, gdy będziesz go potrzebować, cały ten czas pozbawia Cię czasu niezbędnego do rozwiązania Twojej aplikacji problemy.

Przeczytałem (powyżej), że PHP jest bardziej zwięzłe niż ANSI C? Dlaczego więc używać "//:: this is a comment ::"zamiast "// this is a comment"? Skąd taka głupio złożona składnia „ładnych tysięcy”?

Innym typowym argumentem jest to, że Java i tym podobne zapewniają dedykowane wywołania aplikacji internetowych.

Nie udało mi się znaleźć niczego, co pozwoliłoby uniknąć HTML w Javie, więc napisałem swoją wersję:

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

Czy naprawdę wierzysz, że ten sam kod w ANSI C byłby bardziej złożony? Nie, byłoby to znacznie prostsze i szybsze.

Java (wywodząca się z C) wymaga od programistów łączenia ciągów wieloliniowych za pomocą znaku „+”
C # (wywodzący się z C) wymaga od programistów łączenia ciągów wieloliniowych z
PHP „+” (pochodzącym z C) wymaga od programistów połączyć ciągi wieloliniowe znakiem „.”

ANSI C nie ma teraz tego całkowicie głupiego (przestarzałego) wymagania.

Czy zatem tak oczywisty postęp, jakiego domagają się języki nowożytne? Ciągle tego szukam.

Szczerze,

Pierre.

Pierre
źródło
10
Nie całkiem rozumiem twój komentarz dotyczący dodatkowego przetwarzania ładnych tysięcy; dla języka C #, który przerwałeś , amount), PHP działa tak, jak jest, a Twój przykład ANSI C wymaga dwóch dodatkowych argumentów (bufora i długości bufora). Z godnym uwagi wyjątkiem Javy, twój przykład wydaje się dowodzić czegoś przeciwnego. Ponadto nigdy wcześniej nie widziałem takiej //:: comment ::składni; PHP z pewnością tego nie wymaga.
icktoofay,
1
Szczerze mówiąc, wszystkie inne opcje wyglądają znacznie ładniej niż ANSI C, które „jest wyraźnie łatwiejsze w użyciu i zapamiętaniu” [sic].
Jarrod Mosen
Jak wypada G-WAN w porównaniu z NGINX, jeśli oba zostały napisane w C?
m4l490n
47

Z tego samego powodu nie używamy języka C w większości programów. Korzyści (które są głównie wydajnością) nie przewyższają kosztów (czas rozwoju, brak automatycznego zarządzania pamięcią, brak automatycznej ochrony przed przepełnieniem bufora, etap kompilacji między etapami edycji i testowania itp.).

Quentin
źródło
10
Pisałem to samo i pokonałeś mnie. Chcę tylko dodać, że ochrona stron internetowych przed złośliwym zachowaniem jest wystarczającym wyzwaniem, ponieważ nie musimy dodawać potencjalnych wektorów ataku z niewłaściwego zarządzania pamięcią, wskaźników itp.
Rob Allen,
@Jordan: Mam wrażenie, że nie zrobiłeś żadnego programowania internetowego w C. To, co mówisz, nie pasuje do modelu tego, jak się robi programowanie w sieci.
2
Oczywiście, zakładając, że Twoja witryna ma dowolne miejsce na interakcję użytkownika, czy to za pośrednictwem adresu URL, czy formularza. Po przekazaniu tych danych na serwer, programista musi upewnić się, że prawidłowo przydzielił pamięć. G-WAN ma pewną abstrakcję dotyczącą parametrów zapytań, ale to nie uratuje Cię całkowicie. Nie mówię, że poprawnie zrobione, programowanie w C nie może być bezpieczne i szybkie, ale jest bardziej podatne na poważniejsze błędy.
Jordan
3
westchnienie @Kinopiko: Jeśli nie wiesz, co to jest przepełnienie bufora, nie powinieneś kodować w C. 'nuff powiedział. Więcej informacji: securecoding.cert.org/confluence/display/seccode/…
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
29

Większość aplikacji sieciowych, zwłaszcza serwery WWW, jest znacznie bardziej „związana z I / O” - tj. Są one w stanie wypompowywać dane znacznie szybciej niż sieć jest w stanie je zaakceptować. Dlatego coś, co jest wysoce wydajne pod względem procesora, nie jest wielką wygraną, podczas gdy coś, co jest skalowalne i łatwe w utrzymaniu, jest. Nie ma więc powodu, aby akceptować wady C i tracić zalety środowiska zarządzanego, takiego jak Java, .NET, Python, Perl lub inne języki.

Paul Tomblin
źródło
1
C jest jednak szybsze.
14
Jeśli mogę wypełnić potok sieciowy Javą lub Perlem (i mogę), fakt, że C jest szybszy, nie ma znaczenia.
Paul Tomblin
1
@Kinopiko, czy mówisz, że masz większy potok, więcej odwiedzin stron i więcej danych do wysłania niż eBay (Java), Stack Overflow (C # / .NET), Google czy dowolna z miliona często używanych witryn internetowych napisanych w językach wyższego poziomu ?
Paul Tomblin
1
@Paul Tomblin: Celem aplikacji internetowej nie jest wypełnienie potoku sieciowego, ale wykonanie pewnego przetwarzania. Jeśli potrzebujesz tylko obsługiwać tekst i obrazy, powinieneś używać statycznych stron HTML, które zapewniają lepszą wydajność. W większości przypadków strony statyczne są obsługiwane z pamięci podręcznej, więc serwer nie musi nic robić. OTOH, gdy przetwarzanie jest potrzebne, może być wąskim gardłem (chociaż częściej dysk jest wąskim gardłem).
PauliL
4
Należy pamiętać, że aplikacje internetowe to tylko ułamek „stosu serwerów”, który obsługuje żądania użytkowników i nie jest częścią krytyczną dla wydajności. Istnieją inne części - jądro systemu operacyjnego (zwykle napisane w C), system plików (C), serwer WWW (zwykle C), interpreter języka (C), baza danych (zwykle C lub C ++). Aplikacja internetowa zwykle przekazuje dane tylko z jednej części do drugiej, wykonując na niej pewne podstawowe operacje, a jej wydajność wcale nie jest kluczowa.
el.pescado
15

C nie jest wygodnym językiem do manipulowania napisami.

Porównaj C #:

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

Odpowiadający 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
ChrisW
źródło
4
PHP nie obsługuje poprawnie Unicode, ale jest bardzo popularnym językiem zorientowanym na WWW.
el.pescado
12
Więc powinniśmy użyć C ++, ponieważ uzyskuje on taką samą wydajność jak C, ale kompiluje Twój przykład C # jak urok?
tstenner
2
Jeśli chodzi o manipulowanie napisami - aplikacje internetowe zwykle wyświetlają tylko ciągi znaków, więc C printfpowinny wykonać zadanie.
el.pescado
5
C dobrze radzi sobie z wielobajtowymi i unikodowymi funkcjami biblioteki. Używanie bezpiecznych funkcji, takich jak strncpy i tak dalej, sprawia, że ​​jest to całkiem bezpieczne.
justinhj
2
Lub możesz użyć asprintf (& foobar, "% s% s", foo, bar);
Patrick Lorio
11

Gdyby trudność i złożoność w ogóle nie były problemem (ha!), To nie poprzestałbym na C. napisałbym assemblację x86. Minęły lata, odkąd korzystałem z dowolnego serwera internetowego, który nie był x86 i każdego dnia wygląda to coraz rzadziej.

Używanie C (zamiast asemblacji lub czegoś wyższego poziomu) oznacza sugerowanie, że C jest najlepszym miejscem dla wydajności programisty i wydajności komputera.

W przypadku programów, które piszę, tak nie jest: C jest słabym dopasowaniem do rodzajów programów, które chcę pisać, a zalety tego w porównaniu z przyzwoitym asemblerem makr po prostu nie są tak znaczące. Program, który teraz piszę, nie jest trudny do wyboru w moim HLL, ale jego złożoność w asemblerze lub C byłaby tak duża, że ​​nigdy nie zostałaby ukończona. Przyznaję, że wystarczająco sprytny programista z wystarczającą ilością czasu mógłby sprawić, że działałby szybciej w assemblerze lub C, ale nie jestem takim programistą.

Rozpoznać
źródło
7
  • to niepewne
  • to jest trudne do odczytania
  • jest trudny do utrzymania, czas rozwoju jest wolniejszy o rząd wielkości
  • większość twoich stron internetowych jest prawdopodobnie związana z I / O, więc przyspieszenie nie ma nawet znaczenia, zwłaszcza gdy używasz szybkiego języka, takiego jak Java lub C #
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
źródło
2
co oznacza „szybki język, taki jak Java lub C #”?
RobS
3
@Kinopiko: jakie słabości mają języki dynamiczne? Kiedy programista noob wyraźnie mówi, że chce wykonać dowolny kod za pośrednictwem evali php include? Proszę, w C / C ++ nie mówisz, że chcesz wykonać dowolny kod, po prostu to robi. evalto nie jest błąd, to intencja programisty. W C / C ++ każdy błąd może prowadzić do zdalnego wykonania kodu, w językach dynamicznych tak nie jest, chyba że jakiś głupiec będzie się z tym bawić eval.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
1
„i tak samo szybko lub szybciej niż C / C ++ w zależności od tego, co robisz”, ale nadal masz do czynienia z zarządzanym środowiskiem pamięci z Javą i C #, co może stać się sporą wadą w scenariuszach dużego ruchu.
RobS
5
„a C z pewnością nie ma tylu słabych punktów bezpieczeństwa, co każdy język dynamiczny” To , mój przyjacielu, kompletna bzdura. Dlaczego ten komentarz ma 3 głosy za?
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
2
@Kinopiko: Cóż, właściwie nie możesz tego nigdzie wyjaśnić. Nie ma na to wytłumaczenia. C ma znacznie większy problem niż jakikolwiek język dynamiczny. Najgorszą rzeczą, która może się zdarzyć w dynamicznym języku, jest „nie znaleziono atrybutu, whoop dee doo”.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7

Wiem, że na to pytanie odpowiedziano już śmiertelnie, ale są dwie rzeczy, o których do tej pory nie wspomniano, a które są niezwykle ważne dla odniesienia sukcesu w każdym paradygmacie programowania, a zwłaszcza w tworzeniu stron internetowych, w których pojawia się wiele osób, które niekoniecznie są programistami, praca z kodem.

  1. Zaangażowana, użyteczna społeczność, czyli ludzie, którzy już rozwiązali mój problem. Nawet najmniejszy z noobów jest całkiem łatwy w Google, dlaczego dostają błędy „nagłówki już wysłane” w PHP, podczas gdy te informacje mogą nie być dostępne dla frameworka lub języka, który jest nowy na scenie lub w inny sposób nie ma masa Krytyczna.
  2. Frameworki, aby większość programistów mogła rozwiązać problemy biznesowe i nie hakować kodu razem.

Gdybym miał krytyczną aplikację, która wymagałaby ekstremalnej wydajności, użyłbym C, ale pisanie zajęłoby znacznie więcej czasu, że nigdy nie trafiłbym na rynek. Dopóki nie pojawi się numer 1 lub 2, nie mogę go używać.

Jordania
źródło
6

C to języki niskiego poziomu do wielu celów: brak OOP, dużo ręcznego zarządzania zasobami.

Istnieje ograniczone użycie języka C w sieci, na przykład Klone . Jest używany głównie w przypadku aplikacji osadzonych o niskich zasobach.

Istnieją jednak platformy internetowe C ++ , takie jak CppCMS, które są używane do tworzenia aplikacji internetowych o wysokiej wydajności.

C ++ pozwala cieszyć się wysoką abstrakcją i precyzyjnym dostępem do tego, co robisz, dając znacznie lepszą opcję wdrażania i tworzenia dużych aplikacji.

Ale używasz ich w przypadku, gdy wydajność i wykorzystanie zasobów jest znacznie bardziej krytyczne niż czas wprowadzenia na rynek i koszty rozwoju, ponieważ generalnie tworzenie stron internetowych jest szybsze przy użyciu dobrych struktur internetowych dla języków takich jak Java, Python lub PHP. Generalnie są też mniej kompetentni programiści dla języków C ++ niż Java / P * za to samo wynagrodzenie.

Jest to więc kwestia priorytetów, także mniej narzędzi do tworzenia stron internetowych C ++ niż PHP / Python / Perl lub Java.

Artem
źródło
2
Co ciekawe, nie wiedziałem o CppCMS, frameworku webowym niskiego poziomu napisanym w C ++. Może być najlepszym z obu światów, znajdującym się pomiędzy C a językami sieci Web.
Abs
Jest to teraz framework niskopoziomowy, jest to framework sieciowy MVC, który jest bardzo SZYBKI.
Artem
Przepraszam, odnoszę się do wszystkiego, co nie jest językiem internetowym, jako niskiego poziomu. Rozumiem, chociaż jest to framework sieciowy MVC.
Abs
Nie ma czegoś takiego jak „język sieciowy”, prawdopodobnie tylko PHP można nazwać językiem internetowym. Wszystkie inne języki, w tym Java, Python, Perl, Ruby i C #, są językami ogólnego przeznaczenia używanymi w sieci Web.
Artem
1
Cóż, jeśli chcemy być konkretni, nie ma czegoś takiego jak języki programowania ogólnego przeznaczenia. Są tylko proceduralne, strukturalne, zorientowane obiektowo, funkcjonalne ... itd.
Abs.
5

@Joeri Sebrechts

FUD w akcji:

PHP, Python i tak dalej można łatwo skalować, rzucając sprzęt w problem.

Właściwie nie. W ogóle nie skalują się w pionie i bardzo słabo skalują w poziomie. Zobacz: http://gwan.ch/en_scalability.html, gdzie jest wyjaśnione, jak wiele problemów wyprzedza osoby, które osiągają słabe wyniki.

Załóżmy, że stworzenie aplikacji w PHP kosztuje 1 osobę 1 rok, a zrobienie tego w języku C kosztuje 3 lata (ponieważ C wymaga więcej wysiłku, aby zrobić to samo).

Znowu źle. Jeśli biblioteki PHP zostały napisane w C, to można ich bezpośrednio używać z poziomu C - natychmiastowo zapewniając „wyjątkową produktywność”, którą, jak twierdzisz, posiada PHP.

Oznacza to, że zmniejszone zapotrzebowanie na sprzęt w kodzie C musi odpowiadać dwuletnim zarobkom, aby C stał się atrakcyjny. W praktyce to (prawie) nigdy się nie zdarza.

Czysty FUD (patrz odpowiedź powyżej).

Skala Facebooka jest tak duża, że ​​sprzęt kosztuje wystarczająco dużo. Dlatego opracowali HipHop, który kompiluje krzyżowo PHP do C ++. Łączy to, co najlepsze z obu światów: prostotę programowania w PHP i surową wydajność C ++. Facebook jest nadal rozwijany w PHP, ale kiedy go używasz, to cały kod natywny.

HipHop jest znacznie szybszy niż PHP, nie ma co do tego wątpliwości. Ale jeśli porównasz HipHop z implementacją w zwykłym C, masz dwie warstwy narzutu:

  • interfejsy PHP do C ++ (które używają rozdętych bibliotek C ++);
  • sam rozdęcie C ++ (co sprawia, że ​​C ++ jest 2-10 razy wolniejsze niż zwykłe C).

Ponadto HipHop został napisany w nieświadomym, nieefektywnym trybie akademickim (oderwanym od rzeczywistości). oczywiście, może zaimponować programistom PHP, ale pokaż ten kod wbudowanemu programistowi, a on będzie żałował Facebooka.

„Język, który nie ma wszystkiego, jest w rzeczywistości łatwiejszy do zaprogramowania niż niektóre, które mają” - Dennis M. Ritchie

Wygląda na to, że w przeciwieństwie do (większości) języków programowania UŻYTKOWNIKÓW KOŃCOWYCH, Dennis wiedział o tym kilka rzeczy.

Pierre
źródło
3
(1) Nie bierz rzeczy do siebie tak bardzo, nie chciałem odrzucać twojego produktu, ponieważ nawet nie znałem twojego produktu. (2) Robisz interesujący dowód słuszności koncepcji z G-wan, ale mam nadzieję, że wybaczę mi, jeśli poczekam i zobaczę podejście, aż zobaczę, jak używają go rzeczywiste aplikacje internetowe, a nie tylko kilka syntetycznych testów porównawczych. (3) Źle scharakteryzowałeś skargę Facebooka dotyczącą skalowania poziomego, ponieważ ich problem dotyczy pamięci podręcznej i wielordzeniowej wydajności bazy danych, wąskiego gardła rzeczywistych aplikacji internetowych, czego G-wan nie pomaga rozwiązać. (4) Jestem pewien, że HipHop z zadowoleniem przyjmuje Twój wkład w kod.
Joeri Sebrechts
1
Mówiąc o kwestii produktywności. Pisałem wcześniej aplikacje internetowe w C, wiele księżyców temu, i wtedy wymagało to o wiele więcej linii, aby zrobić to samo niż PHP, mając o wiele większe ryzyko awarii / wycieku błędów. (Jestem po prostu „przeciętny” w tego rodzaju błędach, co oznacza, że ​​piszę je od czasu do czasu). Opieram się na tym doświadczeniu, dopóki nie zobaczę prawdziwych aplikacji, które pokazują coś innego (np. Port wordpress do C, nie wymaga dużo więcej linii kodu).
Joeri Sebrechts
Jak coś „nie skaluje się w pionie”? Czy to znaczy, że nie korzysta z szybszej wydajności pojedynczego rdzenia i większej wydajności pamięci?
rakslice
5

Musi być więcej powodów, dla których wszyscy używamy PHP, Python, Ruby itp., Poza tym, że programowanie w tych językach jest łatwe

To jest cały powód i jedyny potrzebny. Ma wiele zalet, z których najważniejszą jest czas wprowadzenia na rynek. Jeśli możesz udostępnić swoją aplikację internetową online w ciągu miesiąca przy użyciu PHP zamiast dwóch miesięcy przy użyciu języka C, możesz po prostu wygrać. Jeśli możesz dodać nową funkcję w tydzień używając Ruby on Rails zamiast dwóch tygodni używając C, znowu wygrywasz. Jeśli możesz naprawić błąd w jeden dzień w Pythonie zamiast dwóch dni w C, wygrywasz jeszcze raz. Jeśli możesz dodać funkcję, ponieważ używasz języka X, którego Twoi konkurenci w ogóle nie mogą dodać, ponieważ używają języka Y i jest to zbyt trudne w tym języku, biorąc pod uwagę ograniczenia zasobów, to zdecydowanie wygrywasz.

Przez „wygraną” mam na myśli , że nie przegrywasz. Twoi konkurenci używają języków i frameworków wyższego poziomu do tworzenia swoich witryn, więc jeśli używasz C, nie konkurujesz z innymi ludźmi, którzy używają C, przegrywasz z innymi ludźmi, którzy nie używają C. używać narzędzi o podobnym poziomie abstrakcji.

Jeśli wydajność stanie się problemem, możesz przepisać powolne części witryny w bardziej wydajnych językach. Lub możesz po prostu rzucić na to więcej sprzętu. Naprawdę, problem z wydajnością to coś, co nazywamy „fajnym problemem” - oznacza to, że już Ci się udało. Jednak spędzanie więcej czasu na rozwijaniu podstawowych funkcji witryny rzadko jest opcją. Napisanie go w C tylko po to, by działał szybciej, to przedwczesna optymalizacja, która, jak mówi nam Knuth, jest źródłem wszelkiego zła.

Wszystko to oznacza, że ​​jeśli potrafisz używać języka o wyższym poziomie abstrakcji niż Python czy Ruby, możesz wygrać z ludźmi używającymi Pythona lub Rubiego. Pouczająca może być historia Paula Grahama o tym, jak on i jego zespół wykorzystali LISP jako „tajną broń” do tworzenia witryn internetowych. http://www.paulgraham.com/avg.html

Oczywiście, jeśli tworzysz witrynę dla własnej rozrywki, zrób to w dowolnym języku. A jeśli Twoja witryna jest związana z procesorem (prawie nie ma ich; zwykle są one związane z I / O), użyj najszybszego języka, jaki możesz. Jeśli jednak próbujesz wprowadzać innowacje, użyj języka wysokiego poziomu z najlepszymi abstrakcjami, jakie możesz znaleźć.

kindall
źródło
Zapominasz, że część przetwarzania dużych zamówień przez Internet została napisana w C. Zobacz uwagi na dole strony paulgraham.com/avg.html .
Giles Roberts
4

Myślisz, że bycie łatwym nie jest dobrym powodem. Myślę, że to dobry powód. Jeśli potrzebujesz najwyższej wydajności, C jest w porządku, ale inne języki odrywają trudne rzeczy, aby poprawić produktywność, łatwość konserwacji i zmniejszyć liczbę defektów.

Craig
źródło
6
Aby uzyskać najwyższą wydajność, potrzebujesz nie tylko C, ale także doskonałego programisty C. A ci faceci zazwyczaj chcą więcej pieniędzy niż programiści Java / P *.
el.pescado
4

Weź pod uwagę, że nie jestem programistą stron internetowych, ale i tak zadam te pytania i przedstawię kilka uwag.

Która witryna internetowa jest napisana tylko w jednym języku? Poważnie, ten wątek wydaje się zakładać, że jeden młotek pasuje do wszystkich gwoździ.

Kiedy ostatnio ktoś poważnie stwierdził, że C jest złożona? Mam na myśli naprawdę chłopaki, których nie można uzyskać dużo niższego poziomu. Nie mówię tutaj o C ++, ponieważ często odwołuje się do tych dwóch elementów.

C ma obawy związane z bezpieczeństwem, którym nie można zaprzeczyć, ale czy są one mniejsze niż to, co widać w kludges zwanych PHP i Perl? W każdym przypadku bezpieczna witryna internetowa jest funkcją dyscypliny programisty.

W każdym razie do komentarzy. Trudność korzystania z danego języka jest bardzo zależna od problemu. C, a zwłaszcza C ++, może prowadzić do szybkich rozwiązań problemu w doświadczonych rękach.

Przemysłowe zastosowania serwerów internetowych, czyli wbudowane serwery / witryny, po prostu nie mają takiego języka, jaki mógłby mieć normalny serwer sieciowy. W rezultacie używasz wariantu C lub prawdopodobnie czegoś takiego jak BASIC. Twoim celem jest zapewnienie funkcjonalności wymaganych przez urządzenie i nie martwienie się o języki. Na głównym serwerze internetowym można to zrobić przez większość czasu w językach wysokiego poziomu. Odejdź od wielkiego żelazka, a Twoja wolność programowania zniknie.

Bez odpowiednich bibliotek w większości przypadków głupotą byłoby wykonanie od podstaw projektu internetowego w języku C. Brak dobrych znormalizowanych bibliotek jest tutaj dużym minusem.

David Frantz
źródło
3

Oto trochę więcej kodu związanego z siecią napisanego w C, który warto przyjrzeć się podczas tworzenia własnej biblioteki C dla sieci:

  • cgic: biblioteka ANSI C do programowania CGI
  • cgit: nakładka internetowa dla repozytoriów git
  • wbox: narzędzie do testowania HTTP
  • wget html-parse.c
  • curl cookie. c
  • Rabat, implementacja w C Davida Parsonsa tekstu Markdown Johna Grubera do języka html
  • Protothreads (zwłaszcza dla systemów wbudowanych), http://www.sics.se/~adam/software.html
  • protothread, projekt kodu Google autorstwa LarryRuane
  • projekt uriparser sourceforge
  • parser http, parser żądania / odpowiedzi http dla c przez Ryana Dahla na github
  • nginx
  • ...
ceeit
źródło
2

Cóż, biorąc pod uwagę fakt, że tworzenie stron internetowych to kwestia posiadania przydatnych bibliotek (takich, jakich używa PHP), nie widzę, w jaki sposób C nie byłby przydatny.

W końcu logika proceduralna jest taka sama: zrób while, for, if then else, itd. Czy to jest C, PHP, .Net czy Perl.

A pętla C lub test nie jest trudniejszy do napisania, ponieważ jest napisany w C.

Większość bibliotek PHP jest tworzonych w języku C, więc argument brakujące-biblioteki-C-dla-sieci Web nie wygląda zbyt przekonująco.

Domyślam się, że C nie był reklamowany jako język programowania sieci Web przez promotorów Java (SUN) i .Net (MICROSOFT), ponieważ mieli oni własny zastrzeżony (mocno opatentowany) zasób intelektualny, który mógł naciskać na adopcję.

Jako darmowy (nieopatentowany) standard, C nie zapewnia programistom żadnej `` blokady '' ... stąd może ciężka ręka lobbowania w szkołach i na uniwersytetach, aby upewnić się, że pieniądze podatnika sfinansują przyjęcie gorsza technologia wspierana prywatnymi interesami.

Jeśli C jest wystarczająco dobre dla IBM i MICROSOFT (nie rozwijają swoich produktów w PHP lub .Net), ale nie jest wystarczająco dobre dla użytkowników końcowych, to użytkownicy końcowi mogą się zastanawiać, dlaczego są zachęcani do cierpienia na ten podwójny standard.

Vince
źródło
1
Uhhhh Microsoft.com i Sharepoint są w ASP.NET. Duża część programu Visual Studio 2010 jest oparta na platformie .NET (WPF). To stwierdzenie jest ewidentnie fałszywe. Użyj języka na najwyższym poziomie, który spełnia Twoje wymagania projektowe. W przypadku sieci WWW oznacza to C # / Python / etc oraz komponenty w C / C ++ / etc, gdzie wydajność staje się problemem - chociaż prawie nigdy się to nie zdarza.
Zapisz
2

Użyłbym języka C do aplikacji internetowej, jeśli:

  1. Mam niewielki budżet na serwer hostingowy (mały VPS), a mój czas nie jest drogi.
  2. Pracuję dla Facebooka, Twittera lub kogoś, kto potrzebuje zredukować ilość używanych serwerów (od tysięcy do milionów użytkowników).
  3. Chcę się uczyć C i muszę znaleźć prawdziwą aplikację, w której będę mógł z niej korzystać.
  4. Znam C znacznie lepiej niż inne języki skryptowe.
  5. Jestem eko ​​i chcę zmniejszyć ślad węglowy mojej aplikacji.

G-WAN uruchamia kod jako skrypty, tak skrypty C, takie jak Play! Framework działa dla Javy. G-WAN jest bardzo szybki i ma łatwy interfejs API. G-WAN umożliwia używanie C / C ++ do aplikacji internetowych, gdy inne serwery tego nie zrobiły.

Jedno jest jasne: do napisania strony internetowej w C potrzebny jest dobry programista, każdy kiepski programista może stworzyć witrynę ze spaghetti PHP :-) Są detektory wycieków, a nawet zbieracze śmieci dla C.

rtacconi
źródło
2

Wszystkie wspomniane języki są w rzeczywistości napisane w C / ++. Jedyną różnicą są zaawansowane klasy i biblioteki, które zostały utworzone z C, które tworzą obecnie te inne języki interpretera. Dlatego też nazywane są językami skryptowymi.

Pomyśl o tym jak o pieczeniu ciasta (PHP / JS):

  • 2 jajka, 1 szklanka mleka, 2 laski masła, 4 szklanki mąki, 1 szklanka cukru, soda oczyszczona

Ale wyobraź sobie, że musisz stworzyć wszystkie elementy, z których składają się te rzeczy. (C / ++)

  • 17 mg wodorowęglanu sodu, 15 łyżek białka, 12 łyżek błony witelinowej, aminokwasów, siarki, ... Cząsteczki neutronów

C jest podstawą wielu współczesnych języków. Jest to wspaniały i prawie najpotężniejszy język w montażu. Możesz to zrobić, wystarczy zainwestować w zbudowanie całego kodu, który już zrobiły te inne języki. Jak budowanie ciasta z układu okresowego pierwiastków.

Dowiedz się, że możesz dosłownie zrobić wszystko!

GetBackerZ
źródło
1

Obsługa strun w C może być łatwiejsza dzięki:

Typy danych (część libslack)

Libslack zapewnia ogólny typ danych tablicowych z możliwością powiększania o nazwie List, ogólny typ danych z tabelą skrótów z możliwością powiększania o nazwie Map oraz przyzwoity typ danych String, który zawiera mnóstwo funkcji (wiele z nich pochodzi z Perla). Istnieją również abstrakcyjne typy danych list pojedynczo i podwójnie z opcjonalnymi, „możliwymi do powiększenia” listami.

lub:

Zarządzana biblioteka ciągów (dla C)

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

ceeit
źródło
1

„domachine” napisał:

zależność od platformy: język C musi zostać skompilowany do kodu natywnego. Ten kod nie działa na wszystkich platformach. Języki interpretowane (takie jak PHP) działają wszędzie tam, gdzie istnieje interpreter. Oczywiście ten problem można rozwiązać, ale w tym konkretnym przypadku widzisz zalety programowania w PHP.

Czy kiedykolwiek zastanawiałeś się, w jakim języku jest przenośny jest napisany interpreter PHP?

W ANSI C.

Tak więc, zanim ponownie odrzucisz przenośność ANSI C, zadaj sobie pytanie, w jakim języku został napisany twój ulubiony język programowania ... (wskazówka: prawie wszystkie zostały napisane w C / C ++).

Kompilatory ANSI C są dostępne na wszystkich platformach, na których pracowałem - ale to samo nie dotyczy PHP i jego gigantycznego środowiska wykonawczego.

Tyle jeśli chodzi o argument przenośności .

CClue
źródło
2
Cóż, PHP NIE jest moim ulubionym językiem. Jeszcze nic nie kodowałem w PHP. Jestem programistą C i C ++. Nigdy nie odrzuciłem przenośności C! Jedyną rzeczą, o której wspomniałem, była łatwość zastosowania skryptów PHP do istniejącej przestrzeni WebSpace. Pokaż przypadek, w którym można uzyskać niskobudżetową przestrzeń WebSpace, w której znajduje się kompilator. Może się mylę, ale myślę, że jesteś jednym z tych fanatycznych programistów, którzy uwielbiają jeden język, ale nie widzą zalet innych, może bardziej odpowiednich języków. Uwielbiam C i C ++, ale potrafię myśleć nieszablonowo.
domachine
0

Podobny do G-WAN, ale dla Cocoa / Objective-C jest Bombax, framework aplikacji internetowych.

http://www.bombaxtic.com

Mówiąc o Objective-C, nie mogę się powstrzymać od wskazania MacRuby'ego, który może zrewolucjonizować sposób, w jaki pewnego dnia będziemy tworzyć aplikacje internetowe.

gregg
źródło
Cóż, MacRuby nie żyje.
Banjocat
0

Inną kwestią może być zależność platformy. C musi zostać wkompilowane w kod natywny. Ten kod nie działa na wszystkich platformach.

Języki interpretowane działają wszędzie tam, gdzie jest tłumacz. Na przykład wielu dostawców zapewnia PHP-Interpreters zainstalowane na ich serwerach, ale z systemem operacyjnym Windows. Jeśli teraz tworzysz na komputerze z systemem Linux. Masz problem.

Oczywiście ten problem można rozwiązać, ale w tym konkretnym przypadku widzisz zalety programowania w PHP.

Mam nadzieję, że to pomoże, dotyczy domachine

domachine
źródło
0

PHP, Python i tak dalej można łatwo skalować, rzucając sprzęt w problem.

Załóżmy, że stworzenie aplikacji w PHP kosztuje 1 osobę 1 rok, a zrobienie tego w języku C kosztuje 3 lata (ponieważ C wymaga więcej wysiłku, aby zrobić to samo). Oznacza to, że zmniejszone zapotrzebowanie na sprzęt w kodzie C musi odpowiadać dwuletnim zarobkom, aby C stał się atrakcyjny. W praktyce to (prawie) nigdy się nie zdarza.

Jak w przypadku każdej reguły, jest wyjątek. Skala Facebooka jest tak duża, że ​​sprzęt kosztuje wystarczająco dużo. Dlatego opracowali HipHop , który kompiluje krzyżowo PHP do C ++. Łączy to, co najlepsze z obu światów: prostotę programowania w PHP i surową wydajność C ++. Facebook jest nadal rozwijany w PHP, ale kiedy go używasz, to cały kod natywny.

Joeri Sebrechts
źródło
0

W końcu możesz używać absolutnie dowolnego języka do tworzenia witryn, w tym asemblera (przez CGI itp.). Jeśli chodziło Ci o to, dlaczego nie użyjemy języka kompilowanego, cóż, mamy już .NET, Javę i inne.

Andrei Rînea
źródło
0

Aby osiągnąć rezultaty, musisz kochać to, co robisz. Języki takie jak java i php zostały stworzone z dużym wysiłkiem, aby ułatwić ludziom życie. PHP szczególnie przyniosło dziś korzyści wielu samouczącym się programistom internetowym. Możesz zobaczyć, jakie wsparcie ma w świecie tworzenia stron internetowych.

Java iam z pewnością została napisana, aby pomóc Ci we wszystkim, co jest możliwe w dzisiejszym świecie. Ogromna książka jest wyraźną wskazówką i jest bestią, jeśli grasz również w tworzeniu stron internetowych. To samo dotyczy Pythona. Są to np. Fantastyczne języki i platformy. Nic dziwnego, że cieszą się ogromną popularnością.

Jestem wielbicielem języka C i częściowo wynika to z pewnych ograniczeń, które uniemożliwiły mi przyjrzenie się innym językom, takim jak php. Codziennie piszę w języku C i każdego dnia jestem dumny, że uczę się nowych rzeczy. To sprawia, że ​​czuję się bardzo dobrze i zacząłem także uczyć się, jak C był domyślnym wyborem podczas pisania aplikacji na strony internetowe za pośrednictwem Cgi. Jest to abstrakcyjne na innych platformach, a kiedy tworzysz strony internetowe, które mają związek z bazami danych i usługami sieciowymi, musisz wiedzieć, co dzieje się za kulisami.

Jeśli jednak wiesz to wszystko i nadal chcesz używać języka skryptowego, musi istnieć ważny powód i nie potrzebujemy nikogo, kto by tego odradzał.

Viz
źródło