Tại sao bạn không sử dụng C cho các ứng dụng web của mình?


101

Tôi đã xem xét một số máy chủ web khác nhau vào sáng nay khi tôi bắt gặp G-WAN . Theo tôi hiểu, nó là một máy chủ web được viết bằng C và bạn phải sử dụng nó bằng cách viết các trang web / ứng dụng web của mình bằng C. Một lợi ích rõ ràng là tốc độ như trang G-WAN gợi ý.

Tuy nhiên, trên các diễn đàn, người tạo ra G-WAN đã hỏi tại sao không sử dụng C cho các ứng dụng dựa trên web và tôi không thể nghĩ ra một lý do nào ngoài việc nó khó khăn (đối với tôi, tôi là người mới khi nói đến C). Phải có thêm lý do tại sao tất cả chúng ta đều sử dụng PHP, Python, Ruby, v.v. ngoài việc nó dễ phát triển bằng các ngôn ngữ này. Tôi không thấy đó là một lý do chính đáng.

Vì vậy, tôi đặt nó cho bạn: Tại sao bạn không sử dụng C cho các ứng dụng web của mình?


34
Tại sao chúng ta sử dụng bếp mà không nấu bữa ăn trực tiếp bằng lửa? Tại sao chúng ta sử dụng ô tô mặc dù đi bộ hoặc sử dụng xe đạp lại tốt cho sức khỏe hơn nhiều? Tại sao ... tôi có thể đi về ...
Felix Kling

16
@Felix - như tôi đã nói, nêu tên các lý do khác ngoài việc nó khó. Điều đó ngụ ý rằng tôi biết rằng các ngôn ngữ khác tồn tại với độ khó trừu tượng.
Abs

15
Không bao giờ thực sự được coi là C diffiult.
3Dave

10
@David Lively Nếu bạn không cố ý đặt chữ 'c' vào khó, điều đó thực sự khá buồn cười. Tốt lắm :)
punkrockbuddyholly

11
@MrMisterMan ai đó chỉ mất bốn tháng để phát hiện ra cái đó. =)
3Dave

Câu trả lời:


79

Cần hết sức cẩn thận để có được một chương trình C chính xác và an toàn. Sự quan tâm đó có nghĩa là bạn cần phải có những người thực sự giỏi viết chương trình của bạn. Điều đó có nghĩa là bạn phải trả nhiều hơn.

Ngoài ra, C không có lợi ích của việc vẽ từ một thư viện chức năng tiêu chuẩn khổng lồ như .NET (và các nền tảng tập trung vào web chính khác) có. Vì vậy, bạn có thể phải mua các thành phần hoặc thực hiện tương tác, hoặc cuộn chức năng của riêng bạn đi kèm "miễn phí" với nhiều hơn nữa, chúng tôi sẽ nói ngôn ngữ "trung tâm web" như PHP hoặc C # hoặc Ruby hoặc bất cứ điều gì. Điều đó có nghĩa là bạn phải trả nhiều hơn.

Thêm tất cả những điều đó vào thực tế là tốc độ tính toán đơn luồng không quá quan trọng trên web. Nếu bạn cần nhiều khả năng mở rộng hơn, hầu hết các tổ chức có thể kinh tế chỉ cần ném thêm lõi vào vấn đề và ổn. Tất nhiên, điều này không đúng với tất cả mọi người. Tôi tưởng tượng rằng cốt lõi của công cụ của Google được viết bằng C hoặc một ngôn ngữ tương tự không chỉ cho tốc độ mà còn để tiết kiệm chi phí điện năng thực sự.


48
Chà, một lập luận cho .NET chống lại C vì thư viện ? Chắc chắn, stdlib nhỏ hơn, nhưng chúng ta có hàng thập kỷ thư viện (nhiều mã nguồn mở) ở C. Tôi đang gặp khó khăn khi nghĩ về bất kỳ thứ gì trong .NET stdlib mà không có thư viện C dành cho người lớn và miễn phí.
Ken

3
Tôi không nghĩ rằng anh ấy đang tranh cãi cụ thể cho .NET, tôi nghĩ anh ấy chỉ muốn nói rằng có những ngôn ngữ ngoài kia có rất nhiều thư viện gắn kết. Tôi chắc chắn C có tải nhưng thành thật mà nói, tôi chưa gặp bất kỳ loại repo nào tập hợp tất cả chúng vào một nơi duy nhất hoặc đóng gói chúng.
Abs

16
Thao tác chuỗi @Ken là một tác vụ ứng dụng web thực sự phổ biến. Thư viện C tồn tại cho điều đó, nhưng chúng gần như không nhiều hoặc không thể sử dụng được như các thư viện trong [chọn một ngôn ngữ cấp cao].
Andres Jaan Tack

23
@Ken: Có một sự khác biệt lớn khi bạn có một bộ chức năng duy nhất, được hỗ trợ tốt so với rất nhiều thư viện nhỏ khác nhau nhiều về bộ tính năng, cấp phép và hỗ trợ.
Dave Markle

49

Hừ ...

Có vẻ như tôi hơi muộn trong cuộc thảo luận này - nhưng tôi mới phát hiện ra nó bây giờ. Và tôi biết ơn tất cả các bạn vì rất nhiều ý kiến ​​đóng góp.

Tôi là tác giả của G-WAN, điều này nói rõ rằng tôi đã làm việc nghiêm túc về vấn đề này: G-WAN vừa nhanh hơn tất cả các Máy chủ Web khác (không xử lý) tất cả các Máy chủ Ứng dụng Web khác (bất kỳ quá trình xử lý nào bạn có thể tưởng tượng).

Có, ANSI C cũng giúp xử lý nhiều nội dung tĩnh hơn - với các CPU ít mạnh hơn (ANSI C không chỉ giúp nội dung động bay).

Nhân tiện, G-WAN sử dụng tập lệnh C (không cần trình biên dịch C và trình liên kết) nên chu trình / độ trễ biên dịch / liên kết không tồn tại.

Trong quá trình so sánh G-WAN với .NET Java và PHP, tôi đã viết các ứng dụng tương tự bằng cả 4 ngôn ngữ: http://gwan.ch/source/

Và, tôi thất vọng, các ngôn ngữ viết kịch bản hiện đại không dễ sử dụng hơn.

Một phần của công việc đặc biệt khó chịu là tìm kiếm một cách tuyệt vọng lệnh gọi API 'ma thuật' sẽ thực hiện những gì bạn muốn.

Hãy suy nghĩ về cách thực hiện 'hàng nghìn' trong:

C #

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

Java

new DecimalFormat("0.00"); ...

PHP

number_format($amount, 2); ...

ANSI C

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

"..." có nghĩa là một số cấu hình trước hoặc xử lý sau là cần thiết. ANSI C rõ ràng là dễ sử dụng và dễ nhớ hơn.

Khi PHP có hơn 5900 lệnh gọi API (cách đó không xa là C # và Java), việc tìm kiếm lệnh gọi API phù hợp là một thách thức. Thời gian lãng phí để tìm cái này (và sau đó để tìm bản địa tệ hại như thế nào lệnh gọi API được triển khai đến mức nào), thời gian để tìm hiểu bằng cách sử dụng nó cho lần tiếp theo bạn cần, tất cả thời gian này đang tước đi của bạn thời gian cần thiết để giải quyết ứng dụng của mình các vấn đề.

Tôi đã đọc (ở trên) rằng PHP ngắn gọn hơn ANSI C? Tại sao lại sử dụng "//:: this is a comment ::"thay vì"// this is a comment" ? Tại sao lại có một cú pháp 'khá nhiều nghìn' phức tạp đến vậy?

Lập luận thông thường khác là Java và những thứ tương tự cung cấp các lệnh gọi dành riêng cho các ứng dụng Web.

Tôi không thể tìm thấy bất kỳ thứ gì để thoát HTML trong Java nên tôi đã viết phiên bản của mình về nó:

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

Bạn có thực sự tin rằng cùng một đoạn mã trong ANSI C sẽ phức tạp hơn không? Không, nó sẽ đơn giản hơn nhanh hơn.

Java (có nguồn gốc từ C) đang yêu cầu các lập trình viên liên kết các chuỗi nhiều dòng với một '+'
C # (bắt nguồn từ C) đang yêu cầu các lập trình viên liên kết các chuỗi nhiều dòng với một '+'
PHP (bắt nguồn từ C) đang yêu cầu các lập trình viên phải liên kết các chuỗi nhiều dòng bằng dấu '.'

ANSI C không có yêu cầu hoàn toàn ngu ngốc (lỗi thời) này.

Vì vậy, có phải là sự tiến bộ rõ ràng mà các ngôn ngữ hiện đại tuyên bố không? Tôi vẫn đang tìm kiếm nó.

Trân trọng,

Pierre.


10
Tôi không hiểu lắm nhận xét của bạn về việc xử lý thêm hàng nghìn; đối với C # bạn đã bỏ qua , amount), PHP vẫn ổn như hiện tại và ví dụ ANSI C của bạn cần thêm hai đối số (bộ đệm và độ dài bộ đệm). Với ngoại lệ đáng chú ý của Java, ví dụ của bạn dường như chứng minh điểm ngược lại. Ngoài ra, tôi chưa bao giờ thấy //:: comment ::cú pháp đó trước đây; PHP chắc chắn không yêu cầu nó.
icktoofay

1
Thành thật mà nói với bạn, tất cả các tùy chọn khác trông đẹp hơn nhiều so với ANSI C, "rõ ràng là dễ sử dụng và dễ nhớ hơn" [sic].
Jarrod Mosen

Làm thế nào để G-WAN so sánh với NGINX nếu cả hai đều được viết bằng C?
m4l490n

47

Lý do tương tự mà chúng tôi không sử dụng C cho hầu hết các lập trình. Những lợi ích (chủ yếu là hiệu suất) không lớn hơn chi phí (thời gian phát triển, thiếu quản lý bộ nhớ tự động, thiếu bảo vệ tự động khỏi lỗi tràn bộ đệm, có giai đoạn biên dịch giữa giai đoạn chỉnh sửa và kiểm tra, v.v.).


10
Đang gõ cùng một thứ và bạn đã đánh bại tôi. Tôi chỉ muốn nói thêm rằng việc bảo vệ các trang web từ hành vi nguy hiểm là đủ của một thách thức, nhưng chúng ta không cần phải thêm vectơ tấn công tiềm năng từ một lạm dụng quản lý bộ nhớ, con trỏ vv
Rob Allen

@Jordan: Tôi có cảm giác rằng bạn chưa thực hiện bất kỳ lập trình web nào ở C. Những gì bạn đang nói không phù hợp với mô hình về cách lập trình web được thực hiện.

2
Chắc chắn là có, giả sử rằng trang web của bạn có bất kỳ vị trí nào để người dùng tương tác, cho dù bằng URL hay nhập biểu mẫu. Sau khi dữ liệu đó được chuyển đến máy chủ, lập trình viên phải đảm bảo cấp phát bộ nhớ chính xác. G-WAN có một số trừu tượng xung quanh các tham số truy vấn nhưng điều đó sẽ không giúp bạn tiết kiệm hoàn toàn. Tôi không nói điều đó được thực hiện một cách chính xác, lập trình web C không thể an toàn và nhanh chóng, nhưng nó dễ bị các lỗi nghiêm trọng hơn.
Jordan

3
@Kinopiko thở dài : Nếu bạn không biết tràn bộ đệm là gì, bạn không nên viết mã bằng C. 'nuff nói. Để biết thêm thông tin: securecoding.cert.org/confluence/display/seccode/…
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

29

Hầu hết các ứng dụng mạng, đặc biệt là các máy chủ web, có nhiều "I / O ràng buộc" hơn - tức là chúng có khả năng bơm ra dữ liệu nhanh hơn nhiều so với mức mà mạng có thể chấp nhận. Do đó, thứ gì có hiệu suất CPU cao không phải là một chiến thắng lớn, trong khi thứ gì đó có thể mở rộng và bảo trì được. Vì vậy không có lý do gì để chấp nhận những mặt hạn chế của C và làm mất đi những ưu điểm của môi trường được quản lý như Java, .NET, Python, Perl hay các ngôn ngữ khác.


1
C nhanh hơn hàng tấn.

14
Nếu tôi có thể lấp đầy đường ống mạng bằng Java hoặc Perl (và tôi có thể), thực tế là C nhanh hơn là không liên quan.
Paul Tomblin

1
@Kinopiko, có phải bạn đang nói rằng bạn có một đường dẫn lớn hơn, nhiều lượt truy cập trang hơn và nhiều dữ liệu cần gửi hơn eBay (Java), Stack Overflow (C # /. NET), Google hoặc bất kỳ trang web nào trong số một triệu trang web được sử dụng nhiều được viết bằng các ngôn ngữ cấp cao hơn ?
Paul Tomblin

1
@Paul Tomblin: Mục đích của ứng dụng web không phải để lấp đầy đường ống mạng mà để thực hiện một số xử lý. Nếu bạn chỉ cần phục vụ một số văn bản và hình ảnh, bạn nên sử dụng các trang html tĩnh, sẽ cho hiệu quả cao hơn. Trong hầu hết các trường hợp, các trang tĩnh được phục vụ từ bộ nhớ cache, vì vậy máy chủ của bạn không cần phải làm gì. OTOH, khi cần xử lý, nó cũng có thể là nút cổ chai (mặc dù đĩa phổ biến hơn là nút cổ chai).
PauliL

4
Bạn cần nhớ rằng các ứng dụng web chỉ là một phần nhỏ của "ngăn xếp máy chủ" xử lý các yêu cầu của người dùng và không phải là một phần quan trọng về hiệu suất. Có những phần khác - nhân hệ điều hành (thường được viết bằng C), hệ thống tập tin (C), máy chủ web (thường là C), trình thông dịch ngôn ngữ (C), cơ sở dữ liệu (thường là C hoặc C ++). Ứng dụng web thường chỉ truyền dữ liệu từ phần này sang phần khác, áp dụng một số thao tác cơ bản trên đó và hiệu suất của nó hoàn toàn không quan trọng.
el.pescado

15

C không phải là một ngôn ngữ thuận tiện để thao tác các chuỗi.

So sánh C #:

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

C tương ứng:

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 cũng không xử lý đúng Unicode, nhưng là ngôn ngữ hướng Web rất phổ biến.
el.pescado

12
Vì vậy, chúng ta nên sử dụng C ++, vì nó có hiệu suất tương tự như C, nhưng biên dịch ví dụ C # của bạn giống như một sự quyến rũ?
tstenner

2
Đối với thao tác chuỗi - web applkication thường chỉ xuất chuỗi, vì vậy C printfnên thực hiện công việc.
el.pescado

5
C xử lý multibyte và unicode tốt thông qua các chức năng thư viện thời gian chạy. Sử dụng các hàm an toàn như strncpy, v.v. cũng làm cho nó khá an toàn.
justinhj

2
Hoặc bạn có thể sử dụng asprintf (& foobar, "% s% s", foo, bar);
Patrick Lorio

11

Nếu khó khăn và phức tạp không phải là một vấn đề gì cả (ha!), Thì tôi sẽ không dừng lại ở C. Tôi sẽ viết assembly x86. Đã nhiều năm kể từ khi tôi sử dụng bất kỳ máy chủ web nào không phải là x86 và nó ngày càng ít xuất hiện hơn.

Sử dụng C (thay vì assembly, hoặc một cái gì đó cấp cao hơn) có nghĩa là C là điểm tốt của hiệu suất lập trình viên và hiệu suất máy tính.

Đối với các chương trình tôi viết, đây không phải là trường hợp: C không phù hợp với các loại chương trình tôi muốn viết và những lợi thế của nó so với một trình hợp dịch macro tốt chỉ không đáng kể. Chương trình tôi đang viết bây giờ không khó trong HLL mà tôi lựa chọn, nhưng độ phức tạp của nó trong assembly hoặc C sẽ cao đến mức nó sẽ không bao giờ hoàn thành. Tôi thừa nhận rằng một lập trình viên đủ thông minh với đủ thời gian có thể làm cho nó chạy nhanh hơn trong assembly hoặc C, nhưng tôi không phải là lập trình viên đó.


7
  • không an toàn
  • thật khó đọc
  • rất khó để duy trì, thời gian phát triển chậm hơn theo cấp độ
  • hầu hết nội dung web của bạn có thể bị ràng buộc I / O, vì vậy tốc độ tăng tốc thậm chí không thành vấn đề, đặc biệt là khi bạn sử dụng một ngôn ngữ nhanh như Java hoặc C #

2
"Ngôn ngữ nhanh như Java hoặc C #" nghĩa là gì?
RobS

3
@Kinopiko: ngôn ngữ động có những điểm yếu nào? Khi một lập trình viên noob nói rõ ràng rằng anh ta muốn thực thi mã tùy ý thông qua evalvà php include? Xin vui lòng, trong C / C ++, bạn không nói rằng bạn muốn thực thi mã tùy ý, nó chỉ thực hiện. evalkhông phải là một lỗi, đó là mục đích của lập trình viên. Trong C / C ++, bất kỳ lỗi nào cũng có thể dẫn đến việc thực thi mã từ xa, trong các ngôn ngữ động, đây không phải là trường hợp trừ khi kẻ lừa đảo nào đó đang gây rối eval.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

1
Có thể "nhanh hơn hoặc nhanh hơn C / C ++ tùy thuộc vào công việc bạn đang làm", nhưng bạn vẫn đang xử lý môi trường bộ nhớ được quản lý với cả Java và C #, điều này có thể trở thành một nhược điểm trong các tình huống lưu lượng truy cập cao.
RobS

5
"và C chắc chắn không có nhiều điểm yếu về bảo mật như bất kỳ ngôn ngữ động nào" Điều đó , bạn của tôi, hoàn toàn vô nghĩa. Tại sao nhận xét đó có 3 phiếu tán thành?
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

2
@Kinopiko: Thực ra thì, bạn không thể giải thích nó ở đâu cả. Không có lời giải thích cho nó. C có một vấn đề lớn hơn nhiều so với bất kỳ ngôn ngữ động nào. Điều tồi tệ hơn có thể xảy ra trong một ngôn ngữ động là "thuộc tính không tìm thấy, rất tiếc".
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7

Tôi biết câu hỏi này đã được trả lời cho đến nay, nhưng có 2 điều chưa được đề cập cho đến nay cực kỳ quan trọng đối với sự thành công trong bất kỳ mô hình lập trình nào và đặc biệt là trong phát triển web, nơi bạn có rất nhiều người không nhất thiết là lập trình viên, làm việc với mã.

  1. Cộng đồng hữu ích, có sự tham gia, hay còn gọi là Những người đã giải quyết vấn đề của tôi. Khá dễ dàng đối với ngay cả những người quen thuộc nhất với Google tại sao họ nhận được lỗi "tiêu đề đã được gửi" trong PHP, trong khi thông tin đó có thể không có sẵn cho một khuôn khổ hoặc ngôn ngữ mới, hoặc không có khối lượng tới hạn.
  2. Khung, để hầu hết các lập trình viên có thể giải quyết các vấn đề kinh doanh và không hack mã cùng nhau.

Nếu tôi có một ứng dụng quan trọng đòi hỏi hiệu suất cực cao, tôi sẽ sử dụng C, nhưng sẽ mất nhiều thời gian hơn để viết, tôi sẽ không bao giờ có mặt trên thị trường. Cho đến khi có số 1 hoặc số 2, tôi không thể sử dụng nó.


6

C là ngôn ngữ cấp thấp cho nhiều mục đích: no-OOP, quản lý nhiều tài nguyên thủ công.

Việc sử dụng C cho web bị hạn chế, ví dụ như Klone . Nó chủ yếu được sử dụng cho các trường hợp ứng dụng nhúng tài nguyên thấp.

Tuy nhiên, có những khuôn khổ web C ++ như CppCMS được sử dụng để phát triển các ứng dụng web hiệu suất cao.

C ++ cho phép bạn tận hưởng tính trừu tượng cao và khả năng truy cập chi tiết vào những gì bạn đang làm chính xác, mang lại lựa chọn tốt hơn nhiều cho việc triển khai và phát triển các ứng dụng lớn.

Nhưng bạn sử dụng chúng trong trường hợp hiệu suất và việc sử dụng tài nguyên quan trọng hơn nhiều thì thời gian tiếp thị và chi phí phát triển vì nói chung phát triển web nhanh hơn bằng cách sử dụng các khuôn khổ web tốt cho các ngôn ngữ như Java, Python hoặc PHP. Cũng thường có những lập trình viên kém năng lực hơn đối với ngôn ngữ C ++ rồi đến Java / P * với mức lương tương đương.

Vì vậy, vấn đề là vấn đề ưu tiên, cũng có ít công cụ hơn để phát triển Web C ++ sau đó cho PHP / Python / Perl hoặc Java.


2
Thật thú vị, tôi không biết về CppCMS, một khung công tác web cấp thấp được viết bằng C ++. Có thể là tốt nhất của cả hai thế giới, nằm giữa C và Ngôn ngữ web.
Abs

Bây giờ nó là khung cấp thấp, đó là khung công tác web MVC rất NHANH CHÓNG.
Artyom

Xin lỗi, tôi chỉ đề cập đến bất kỳ thứ gì không phải là ngôn ngữ web ở mức độ thấp. Tôi hiểu nó là một khuôn khổ web MVC.
Abs

Không có cái gọi là "Ngôn ngữ web", có lẽ chỉ có PHP mới có thể được gọi là web một. Tất cả các ngôn ngữ khác bao gồm Java, Python, Perl, Ruby và C # là các ngôn ngữ dành cho mục đích chung được sử dụng cho Web.
Artyom

1
Nếu chúng ta muốn cụ thể như vậy thì không có thứ gọi là ngôn ngữ lập trình mục đích chung. Chỉ có Thủ tục, Có cấu trúc, Hướng đối tượng, Chức năng ... vv ...
Abs

5

@Joeri Sebrechts

FUD đang hoạt động:

PHP, Python, v.v. dễ dàng mở rộng quy mô bằng cách ném phần cứng vào vấn đề.

Thực ra là không. Chúng không mở rộng quy mô theo chiều dọc và chia tỷ lệ rất kém theo chiều ngang. Hãy xem: http://gwan.ch/en_scalability.html , nơi nó được giải thích về bao nhiêu rắc rối trước những người hoạt động kém.

Giả sử 1 người tốn 1 năm nỗ lực để phát triển một ứng dụng bằng PHP và họ tốn 3 năm để làm điều đó trong C (vì C đòi hỏi nhiều nỗ lực hơn để làm điều tương tự).

Sai một lần nữa. Nếu các thư viện PHP được viết bằng C thì chúng có thể sử dụng trực tiếp từ C - ngay lập tức cung cấp 'năng suất độc nhất' mà bạn đang khẳng định PHP có.

Điều đó có nghĩa là nhu cầu phần cứng giảm của mã C phải tương ứng với 2 năm tiền lương để C trở nên hấp dẫn. Trong thực tế, điều đó (hầu như) không bao giờ xảy ra.

FUD tinh khiết (xem câu trả lời ở trên).

Quy mô của Facebook quá lớn nên phần cứng là một chi phí đủ lớn để quan tâm. Đó là lý do tại sao họ phát triển HipHop, tính năng này có thể biên dịch chéo từ PHP sang C ++. Nó mang lại những gì tốt nhất của cả hai thế giới: sự đơn giản của lập trình trong PHP và hiệu suất thô của C ++. Facebook vẫn được phát triển bằng PHP, nhưng khi bạn sử dụng nó, tất cả đều là mã gốc.

HipHop nhanh hơn nhiều so với PHP, không nghi ngờ gì về điều đó. Nhưng nếu bạn so sánh HipHop với việc triển khai đơn giản-C, bạn có hai lớp chi phí:

  • giao diện PHP đến C ++ (sử dụng các thư viện C ++ đã cồng kềnh);
  • C ++ tự phình ra (làm cho C ++ chậm hơn C ++ từ 2-10 lần).

Thêm vào đó, HipHop đã được viết ở chế độ Học thuật không hiệu quả không rõ ràng (tách rời khỏi mọi thực tế trong thế giới thực). chắc chắn, nó có thể gây ấn tượng với các lập trình viên PHP nhưng hãy hiển thị đoạn mã này cho một lập trình viên nhúng và anh ta sẽ cảm thấy tiếc cho Facebook.

"Một ngôn ngữ không có mọi thứ thực sự dễ dàng lập trình hơn một số ngôn ngữ khác" --Dennis M. Ritchie

Không giống như (hầu hết) ngôn ngữ lập trình END-USERS, có vẻ như Dennis biết một vài điều về vấn đề này.


3
(1) Đừng coi mọi thứ quá cá nhân, tôi không ra ngoài để phân tích sản phẩm của bạn vì tôi thậm chí còn không biết sản phẩm của bạn. (2) Bạn đưa ra một bằng chứng thú vị về khái niệm với G-wan, nhưng tôi hy vọng bạn sẽ thứ lỗi cho tôi nếu tôi chờ xem cách tiếp cận cho đến khi tôi thấy các ứng dụng web trong thế giới thực sử dụng nó, chứ không chỉ là một vài điểm chuẩn tổng hợp. (3) Bạn đã hiểu sai về khiếu nại của facebook về tỷ lệ mở rộng theo chiều ngang, bởi vì vấn đề của họ là với hiệu suất đa lõi của bộ nhớ cache và cơ sở dữ liệu, điểm nghẽn của các ứng dụng web trong thế giới thực, điều mà G-wan không giúp giải quyết. (4) HipHop hoan nghênh đóng góp mã của bạn, tôi chắc chắn.
Joeri Sebrechts

1
Nói đến vấn đề năng suất. Tôi đã viết các ứng dụng web bằng C trước đây, nhiều tháng trước, và vào thời điểm đó, nó đòi hỏi nhiều dòng hơn để thực hiện điều tương tự như PHP đã làm, trong khi có nhiều nguy cơ bị lỗi / rò rỉ các loại lỗi hơn. (Tôi chỉ ở mức "trung bình" với những loại lỗi đó, có nghĩa là tôi viết chúng ngay bây giờ và sau đó.) Tôi dựa trên đánh giá của mình về trải nghiệm đó cho đến khi tôi thấy các ứng dụng thực sự chứng minh điều khác (ví dụ: một cổng wordpress sang C đó không yêu cầu nhiều dòng mã hơn).
Joeri Sebrechts

Làm thế nào để một cái gì đó "không mở rộng theo chiều dọc"? Bạn có nghĩa là nó không được hưởng lợi từ hiệu suất lõi đơn nhanh hơn và hiệu suất bộ nhớ nhanh hơn?
rakslice 07/07

5

Phải có thêm lý do tại sao tất cả chúng ta đều sử dụng PHP, Python, Ruby, v.v. ngoài việc nó dễ phát triển bằng các ngôn ngữ này

Đây là toàn bộ lý do và là lý do duy nhất cần thiết. Nó có nhiều lợi ích, chủ yếu là thời gian để tiếp thị. Nếu bạn có thể đưa ứng dụng Web của mình lên mạng trong một tháng bằng PHP thay vì hai tháng bằng C, bạn có thể thắng. Nếu bạn có thể thêm một tính năng mới trong một tuần bằng Ruby on Rails thay vì hai tuần bằng C, thì một lần nữa bạn sẽ thắng. Nếu bạn có thể sửa lỗi trong một ngày bằng Python thay vì hai ngày bằng C, bạn sẽ thắng một lần nữa. Nếu bạn có thể thêm một tính năng vì bạn đang sử dụng ngôn ngữ X mà đối thủ của bạn không thể thêm vào vì họ đang sử dụng ngôn ngữ Y và ngôn ngữ đó quá khó với những hạn chế về nguồn lực của họ, thì bạn chắc chắn giành chiến thắng.

Và bằng cách "thắng", tôi thực sự có nghĩa là bạn không thua. Đối thủ cạnh tranh của bạn đang sử dụng các ngôn ngữ và khuôn khổ cấp cao hơn để phát triển trang web của họ, vì vậy nếu bạn sử dụng C, bạn sẽ không cạnh tranh với những người khác sử dụng C, bạn đang thua những người khác không sử dụng C. Chỉ để cạnh tranh, bạn có để sử dụng các công cụ có mức độ trừu tượng tương tự.

Nếu hiệu suất trở thành vấn đề, bạn có thể viết lại các phần chậm trên trang web của mình bằng các ngôn ngữ hoạt động tốt hơn. Hoặc bạn có thể ném thêm phần cứng vào nó. Thực sự, một vấn đề về hiệu suất là cái mà chúng tôi gọi là "một vấn đề tốt đẹp cần có" - nó có nghĩa là bạn đã thành công. Nhưng dành nhiều thời gian hơn để phát triển chức năng cơ bản của trang web của bạn hiếm khi là một lựa chọn. Viết nó bằng C để nó chạy nhanh hơn là tối ưu hóa quá sớm, như Knuth nói với chúng ta, là gốc rễ của mọi điều xấu xa.

Tất cả điều này ngụ ý rằng nếu bạn có thể sử dụng một ngôn ngữ có mức độ trừu tượng cao hơn Python hoặc Ruby, bạn có thể chiến thắng những người sử dụng Python hoặc Ruby. Câu chuyện của Paul Graham về cách ông và nhóm của mình sử dụng LISP như một "vũ khí bí mật" trong việc phát triển các trang Web có thể mang tính hướng dẫn. http://www.paulgraham.com/avg.html

Tất nhiên, nếu bạn đang phát triển một trang web để giải trí của riêng mình, hãy làm điều đó bằng bất kỳ ngôn ngữ nào bạn muốn. Và nếu trang web của bạn bị ràng buộc về CPU (hầu như không có; chúng thường bị ràng buộc I / O) thì hãy sử dụng ngôn ngữ hoạt động nhanh nhất mà bạn có thể. Tuy nhiên, nếu bạn đang cố gắng đổi mới, hãy sử dụng một ngôn ngữ cấp cao với những nội dung trừu tượng tốt nhất mà bạn có thể tìm thấy.


Bạn đang quên rằng bit xử lý đơn đặt hàng khối lượng lớn qua web được viết bằng C. Xem ghi chú ở cuối paulgraham.com/avg.html .
Giles Roberts

4

Bạn nghĩ dễ dãi không phải là lý do chính đáng. Tôi nghĩ đó là một lý do chính đáng. Nếu bạn cần hiệu suất cao nhất thì C là được, nhưng các ngôn ngữ khác sẽ loại bỏ những thứ khó để cải thiện năng suất, khả năng bảo trì và giảm thiểu lỗi.


6
Để có được hiệu suất cao nhất, bạn không chỉ cần C, mà còn cần một lập trình viên C. Và những người đó thường muốn nhiều tiền hơn các lập trình viên Java / P *.
el.pescado

4

Hãy cân nhắc rằng tôi không phải là nhà phát triển web nhưng dù sao cũng sẽ hỏi những câu hỏi này và đưa ra một hoặc hai điểm.

Trang web nào chỉ được viết bằng một ngôn ngữ? Nghiêm túc mà nói, chủ đề này dường như cho rằng một chiếc búa phù hợp với tất cả các đinh.

Lần cuối cùng có người nói rằng C phức tạp là khi nào? Ý tôi là thực sự các bạn không thể đạt được mức thấp hơn nhiều. Tôi không nói về C ++ ở đây vì cả hai thường được tham chiếu chung.

C có những lo ngại về bảo mật, điều đó không thể bị phủ nhận nhưng chúng có kém hơn những gì được thấy trong kludges có tên là PHP & Perl không? Trong cả hai trường hợp, một trang web an toàn là một chức năng của kỷ luật lập trình viên.

Trong bất kỳ trường hợp nào tắt các ý kiến. Khó khăn của việc sử dụng bất kỳ ngôn ngữ nào phụ thuộc rất nhiều vào vấn đề trong tay C & đặc biệt C ++ có thể dẫn đến giải pháp nhanh chóng cho một vấn đề trong tay có kinh nghiệm.

Sử dụng công nghiệp cho các máy chủ web, đó là các máy chủ / trang web nhúng đơn giản là không có các lựa chọn ngôn ngữ mà một máy chủ web bình thường có thể có. Vì vậy, bạn sẽ sử dụng một biến thể của C hoặc có thể là một cái gì đó giống như BASIC. Mục tiêu của bạn là cung cấp chức năng mà thiết bị yêu cầu và không phải lo lắng về ngôn ngữ. Trên một máy chủ web chính thống, hầu hết thời gian để làm điều đó là sử dụng các ngôn ngữ cấp cao. Bước ra khỏi bàn ủi lớn và quyền tự do lập trình của bạn sẽ ra khỏi cửa.

Nếu không có các Thư viện phù hợp, sẽ thật là ngu ngốc trong hầu hết các trường hợp để thực hiện một dự án web khởi động ở C. Việc thiếu các thư viện được tiêu chuẩn hóa tốt là một tiêu cực lớn ở đây.


3

Dưới đây là một số mã liên quan đến web khác được viết bằng C đáng xem khi xây dựng thư viện C của riêng bạn cho web:

  • cgic: thư viện ANSI C cho Lập trình CGI
  • cgit: giao diện người dùng web cho kho lưu trữ git
  • wbox: công cụ kiểm tra HTTP
  • wget html-parse.c
  • curl cookie.c
  • Giảm giá, David Parsons 'C triển khai văn bản Markdown của John Gruber sang ngôn ngữ html
  • Protothreads (đặc biệt dành cho hệ thống nhúng), http://www.sics.se/~adam/software.html
  • protothread, dự án mã Google của LarryRuane
  • dự án nguồn của uriparser
  • http-parser, http request / response parser for c by Ryan Dahl trên github
  • nginx
  • ...

2

Vâng, với thực tế là phát triển Web là vấn đề của việc có các thư viện hữu ích (loại được sử dụng bởi PHP) thì tôi không thấy C sẽ không hữu ích như thế nào.

Rốt cuộc, logic thủ tục là như nhau: làm trong khi, cho, nếu thì khác, v.v. cho dù đây là C, PHP, .Net hay Perl.

Và một vòng lặp hoặc bài kiểm tra C không khó viết hơn vì nó được viết bằng C.

Hầu hết các thư viện PHP được tạo bằng C nên lập luận thiếu C-library-for-the-Web trông không thuyết phục cho lắm.

Tôi đoán là C đã không được quảng cáo như một ngôn ngữ lập trình Web bởi những người quảng bá Java (SUN) và .Net (MICROSOFT) vì họ có tài sản trí tuệ độc quyền (được cấp bằng sáng chế lớn) của riêng họ để thúc đẩy việc áp dụng.

Là một tiêu chuẩn miễn phí (không được cấp phép), C không đưa ra bất kỳ sự ràng buộc nào đối với các nhà phát triển ... do đó, có thể việc vận động hành lang trong các trường học và trường đại học rất nặng nề để đảm bảo rằng tiền của người nộp thuế sẽ tài trợ cho việc áp dụng công nghệ kém hơn được hỗ trợ bởi lợi ích tư nhân.

Nếu C đủ tốt cho IBM và MICROSOFT (họ không phát triển sản phẩm của mình bằng PHP hoặc .Net) nhưng không đủ tốt cho người dùng cuối, thì người dùng cuối có thể tự hỏi tại sao họ được mời sử dụng tiêu chuẩn kép này.


1
Uhhhh Microsoft.com và sharepoint đều nằm trong ASP.NET. Phần lớn Visual Studio 2010 là trong .NET (WPF). Tuyên bố này là sai nghiêm trọng. Sử dụng ngôn ngữ cấp cao nhất đáp ứng yêu cầu thiết kế của bạn. Đối với web, điều đó có nghĩa là C # / Python / etc và các thành phần trong C / C ++ / etc nơi hiệu suất trở thành một vấn đề - mặc dù điều đó hầu như không bao giờ xảy ra.
3Dave,

2

Tôi sẽ sử dụng C cho một ứng dụng web nếu:

  1. Tôi có một ít ngân sách cho máy chủ lưu trữ (VPS nhỏ) và thời gian của tôi không tốn kém.
  2. Tôi đang làm việc cho Facebook, Twitter hoặc ai đó cần giảm lượng máy chủ được sử dụng (với hàng nghìn đến hàng triệu người dùng).
  3. Tôi muốn học C và tôi cần tìm một ứng dụng trong thế giới thực để tôi có thể sử dụng nó.
  4. Tôi biết C tốt hơn nhiều so với các ngôn ngữ kịch bản khác.
  5. Tôi là một chàng trai sinh thái và tôi muốn giảm lượng khí thải carbon trong ứng dụng của mình.

G-WAN chạy mã dưới dạng tập lệnh, có các tập lệnh C như Play! Khung làm việc cho Java. G-WAN rất nhanh và có một API dễ dàng. G-WAN có thể sử dụng C / C ++ cho các ứng dụng web khi các máy chủ khác không làm được điều đó.

Có một điều rõ ràng: bạn cần một lập trình viên giỏi để viết một trang web bằng C, bất kỳ nhà phát triển tồi tệ nào cũng có thể tạo một trang bằng spaghetti PHP :-)


2

Tất cả các ngôn ngữ bạn đã đề cập thực sự được viết bằng C / ++. Sự khác biệt duy nhất là các lớp và thư viện nâng cao được tạo ra từ C tạo nên những ngôn ngữ thông dịch khác bây giờ. Đó cũng là lý do tại sao chúng được gọi là ngôn ngữ kịch bản.

Hãy nghĩ về nó giống như nướng một chiếc bánh (PHP / JS):

  • 2 quả trứng, 1 cốc sữa, 2 que bơ, 4 cốc bột mì, 1 cốc đường, Baking Soda

Nhưng hãy tưởng tượng phải tạo ra tất cả các yếu tố mà những thứ đó được cấu thành. (C / ++)

  • 17 mg natri bicacbonat, 15 tấn protein, 12 tấn màng Vitelline, Axit amin, Lưu huỳnh, ... Các hạt neutron

C là nền tảng của nhiều ngôn ngữ hiện đại. Nó là tuyệt vời và gần như là ngôn ngữ mạnh mẽ nhất được lắp ráp. Bạn có thể làm điều đó, bạn chỉ cần đầu tư vào việc xây dựng tất cả các mã mà các ngôn ngữ khác đã làm. Giống như việc xây dựng một chiếc bánh từ bảng tuần hoàn.

Tìm hiểu nó, bạn có thể thực sự làm cho nó làm bất cứ điều gì!


1

Xử lý chuỗi trong C có thể dễ dàng hơn bằng cách sử dụng:

Các kiểu dữ liệu (một phần của libslack)

Libslack cung cấp một kiểu dữ liệu mảng con trỏ có thể phát triển chung được gọi là Danh sách, một kiểu dữ liệu bảng băm có thể phát triển chung được gọi là Bản đồ và một kiểu dữ liệu Chuỗi phù hợp đi kèm với đống hàm (nhiều hàm được nâng lên từ Perl). Ngoài ra còn có các kiểu dữ liệu danh sách liên kết đôi và đơn trừu tượng với các nhà tự do "có thể phát triển" tùy chọn.

hoặc là:

Thư viện chuỗi được quản lý (dành cho C)

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


1

"domachine" đã viết:

phụ thuộc nền tảng: C cần được biên dịch thành mã gốc. Mã này không chạy trên tất cả các nền tảng. Các ngôn ngữ được thông dịch (như PHP) chạy ở bất cứ nơi nào có trình thông dịch. Tất nhiên vấn đề này có thể được giải quyết nhưng bạn sẽ thấy lợi thế của việc phát triển bằng PHP trong trường hợp cụ thể này.

Bạn có bao giờ tự hỏi trình thông dịch PHP di động được viết bằng ngôn ngữ nào không?

Trong ANSI C.

Vì vậy, trước khi bạn loại bỏ tính di động của ANSI C một lần nữa, hãy tự hỏi mình ngôn ngữ lập trình yêu thích của bạn đã được viết bằng ngôn ngữ nào ... (mẹo: hầu hết tất cả đều được viết bằng C / C ++).

Các trình biên dịch ANSI C có sẵn trên tất cả các nền tảng mà tôi phải làm việc - và điều này không đúng với PHP và thời gian chạy khổng lồ của nó.

Quá nhiều cho đối số về tính di động .


2
Chà, PHP KHÔNG phải là ngôn ngữ yêu thích của tôi. Tôi chưa viết bất cứ thứ gì bằng PHP. Tôi là một lập trình viên C và C ++. Tôi chưa bao giờ bác bỏ tính di động của C! Điều duy nhất tôi đề cập, là sự dễ dàng để áp dụng PHP-Scripts vào một WebSpace hiện có. Chỉ cho tôi trường hợp bạn có thể có được một WebSpace ngân sách thấp, nơi bạn có một trình biên dịch. Có lẽ tôi sai nhưng tôi nghĩ bạn là một trong những Lập trình viên cuồng tín yêu thích một ngôn ngữ nhưng không thấy ưu điểm của những ngôn ngữ khác, có thể phù hợp hơn. Tôi yêu C và C ++ nhưng tôi có thể suy nghĩ bên ngoài.
domachine,

0

Tương tự như G-WAN, nhưng đối với Cocoa / Objective-C là Bombax, một khung ứng dụng web.

http://www.bombaxtic.com

Nhắc đến Objective-C, tôi không thể cưỡng lại việc chỉ ra MacRuby, thứ có tiềm năng cách mạng hóa cách chúng ta tạo ra ứng dụng web vào một ngày không xa.


Giờ thì MacRuby đã chết.
Banjocat

0

Một điểm khác có thể là sự phụ thuộc vào nền tảng. C cần được biên dịch thành mã gốc. Mã này không chạy trên tất cả các nền tảng.

Các ngôn ngữ được thông dịch chạy ở bất cứ nơi nào có trình thông dịch. Ví dụ, nhiều nhà cung cấp cung cấp Trình thông dịch PHP được cài đặt trên máy chủ của họ nhưng với Hệ điều hành Windows. Nếu bây giờ bạn đang phát triển trên máy Linux. Bạn có một vấn đề.

Tất nhiên vấn đề này có thể được giải quyết nhưng bạn sẽ thấy lợi thế của việc phát triển bằng PHP trong trường hợp cụ thể này.

Hy vọng điều này sẽ hữu ích, liên quan đến domachine


0

PHP, Python, v.v. dễ dàng mở rộng quy mô bằng cách ném phần cứng vào vấn đề.

Giả sử 1 người tốn 1 năm nỗ lực để phát triển một ứng dụng bằng PHP và họ tốn 3 năm để làm điều đó trong C (vì C đòi hỏi nhiều nỗ lực hơn để làm điều tương tự). Điều đó có nghĩa là nhu cầu phần cứng giảm của mã C phải tương ứng với 2 năm tiền lương để C trở nên hấp dẫn. Trong thực tế, điều đó (hầu như) không bao giờ xảy ra.

Giống như với mọi quy tắc, có một ngoại lệ. Quy mô của Facebook quá lớn nên phần cứng là một chi phí đủ lớn để quan tâm. Đó là lý do tại sao họ phát triển HipHop , tính năng này có thể biên dịch chéo từ PHP sang C ++. Nó mang lại những gì tốt nhất của cả hai thế giới: sự đơn giản của lập trình trong PHP và hiệu suất thô của C ++. Facebook vẫn được phát triển bằng PHP, nhưng khi bạn sử dụng nó, tất cả đều là mã gốc.


0

Cuối cùng, bạn hoàn toàn có thể sử dụng bất kỳ ngôn ngữ nào để phát triển các trang web, bao gồm cả trình hợp dịch (thông qua CGI, v.v.). Nếu bạn muốn nói tại sao chúng tôi không sử dụng một ngôn ngữ biên dịch, thì chúng tôi đã có .NET, Java và các ngôn ngữ khác.


0

Bạn phải yêu thích những gì bạn đang làm để đạt được kết quả. Các ngôn ngữ như java và php đã được tạo ra với rất nhiều nỗ lực để làm cho cuộc sống của mọi người dễ dàng hơn. Đặc biệt Php đã mang lại lợi ích cho nhiều lập trình viên web tự học ngày nay. Bạn có thể thấy loại hỗ trợ mà nó có trong thế giới phát triển web.

Java iam chắc chắn được viết ra để giúp bạn làm bất cứ điều gì có thể trong thế giới ngày nay. Cuốn sách khổng lồ là một chỉ dẫn rõ ràng, và nó là một con thú nếu bạn cũng đang chuẩn bị phát triển web. Tương tự với Python. Đây là những ngôn ngữ và nền tảng tuyệt vời. Không có gì ngạc nhiên khi họ cực kỳ phổ biến.

Tôi là một tín đồ C và một phần là do những hạn chế nhất định khiến tôi không thể tìm hiểu các ngôn ngữ khác như php. Tôi đang viết bằng C hàng ngày và mỗi ngày tôi đều tự hào về e và cũng học được một điều mới. Điều này khiến tôi cảm thấy rất tốt và tôi cũng đã bắt đầu tìm hiểu về cách C là lựa chọn mặc định khi viết ứng dụng cho các trang web thông qua Cgi. Điều này được tóm tắt trong các nền tảng khác và khi bạn phát triển các trang web liên quan đến cơ sở dữ liệu và dịch vụ web, bạn cần biết những gì đang xảy ra đằng sau hậu trường.

Tuy nhiên, nếu bạn biết tất cả những điều đó và vẫn muốn sử dụng một ngôn ngữ script, thì phải có một lý do xác đáng và chúng tôi không cần bất kỳ ai khuyên ngăn điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.