为什么不使用C作为您的网络应用程序?

Abs*_*Abs 98 php c web-applications

今天早上,当我遇到G-WAN时,我正在看几个不同的网络服务器.据我所知,它是一个用C语言编写的Web服务器,您必须通过在C中编写您的网站/ Web应用程序来利用它.一个明显的好处是G-WAN网站建议的速度.

然而,在论坛上,G-WAN的创建者问为什么不将C用于基于网络的应用程序,除了难以理解之外我无法想到一个单一的原因(对我来说,无论如何,我是C的新手).除了很容易用这些语言开发之外,我们都必须有更多的理由来使用PHP,Python,Ruby等.我不认为这是一个很好的理由.

所以我把它告诉你:为什么你不使用C作为你的网络应用程序?

Dav*_*kle 77

要使C程序正确且安全,需要非常谨慎.这种关心意味着你需要有非常优秀的人来编写你的程序.这意味着你付出更多.

此外,C不具备从.NET(以及其他主要的以Web为中心的平台)所具有的巨大单一标准功能库中获取的优势.因此,你可能不得不购买组件,或执行互操作,或推出自己的功能,"免费"使用更多,我们会说"以网络为中心"的语言,如PHP或C#或Ruby或其他.这意味着你付出更多.

将所有这些添加到单线程计算速度在Web上并不重要的事实上.如果您需要更高的可扩展性,大多数组织可以经济地在问题上投入更多内核并且没问题.当然,这对每个人都不是这样.我认为Google引擎的核心是用C或类似的语言编写,不仅仅是为了提高速度,还能节省电力成本.

  • 哇,由于*库*,.NET反对C的论点?当然,stdlib比较小,但我们在C中有数十年的库(很多开源).我在.NET stdlib中没有想到任何成熟且免费的C库. (48认同)
  • @Ken:如果你拥有一套功能强大的功能,而不是在功能集,许可和支持方面有很多不同的小型库,那么就会有很多不同之处. (23认同)
  • @Ken字符串操作是一个非常常见的Web应用程序任务.存在C库,但它们并不像[选择高级语言]中的库那么多或可用. (16认同)
  • 我不认为他是专门针对.NET争论的,我认为他只是意味着那里有许多具有大量内聚库的语言.我确信C有负载,但说实话,我没有遇到任何类型的回购,它们将它们全部收集在一个地方或打包它们. (3认同)

Que*_*tin 47

我们在大多数编程中都不使用C的原因相同.好处(主要是性能)不会超过成本(开发时间,缺乏自动内存管理,缺少缓冲区溢出的自动保护,编辑和测试阶段之间的编译阶段等).

  • 输入相同的东西,你打败了我.我只是想补充一点,保护网站免受恶意行为是一个挑战,因为我们不需要通过滥用内存管理,指针等来添加潜在的攻击媒介. (10认同)
  • 确实如此,假设您的网站有任何用户交互的地方,无论是通过URL还是表单输入.将数据传递给服务器后,由程序员决定是否正确分配内存.G-WAN有一些关于查询参数的抽象,但这不会完全拯救你.我不是说正确完成,C Web编程不能安全快速,但它更容易受到更严重的错误. (2认同)
  • **叹气**@Kinopiko:如果你不知道缓冲区溢出是什么,你不应该用C编码.**'nuff说.**更多信息:https://www.securecoding.cert .ORG /合流/显示/ seccode/CERT + C + +安全编码+标准 (2认同)

小智 47

哼...

我在讨论中似乎有点迟了 - 但我现在才发现它.我非常感谢你们所有人的投入.

我是G-WAN的作者,这清楚表明我已经认真研究过这个问题:G-WAN比所有其他Web服务器(无处理)所有其他Web应用程序服务器(您可以想象的任何处理)都快.

是的,ANSI C还可以处理更多静态内容 - 使用功能较弱的CPU(ANSI C不仅仅是使动态​​内容飞行).

顺便说一句,G-WAN使用C脚本(不需要C编译器和链接器),因此编译/链接周期/延迟不存在.

在将G-WAN与.NET Java和PHP进行比较的过程中,我用所有4种语言编写了类似的应用程序:http://gwan.ch/source/

令我沮丧的是,现代脚本语言并不容易使用.

特别令人沮丧的工作的一部分是拼命寻找能够做你想做的'魔术'API调用.

想想如何做'成千上万':

C#

String.Format("{0:n}"...
Run Code Online (Sandbox Code Playgroud)

Java的

new DecimalFormat("0.00"); ...
Run Code Online (Sandbox Code Playgroud)

PHP

number_format($amount, 2); ...
Run Code Online (Sandbox Code Playgroud)

ANSI C

sprintf("%'.2f", amount);
Run Code Online (Sandbox Code Playgroud)

"......"表示某些预配置或后处理是必要的.ANSI C显然更易于使用和记忆.

当PHP有超过5900个API调用(C#和Java不远处)时,找到合适的 API调用本身就是一个挑战.浪费时间来找到这个(然后找出原生 API调用的执行情况有多糟糕),下次你需要的时候通过hart来学习,所有这一切都让你失去了解决你的应用程序所需的时间问题.

我已经读过(上面)PHP比ANSI C更简洁?为什么然后使用"//:: this is a comment ::"而不是"// this is a comment"?为什么有一个如此愚蠢的复杂"数千种"语法?

另一个常见的论点是Java等为Web应用程序提供专用调用.

我无法在Java中找到任何可以逃避HTML的内容,因此我编写了我的版本:

  // 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();
  }
Run Code Online (Sandbox Code Playgroud)

你真的相信ANSI C中的相同代码会更复杂吗?不,这将是非常简单快速.

Java(派生自C)要求程序员将多行字符串与'+'
C#(从C派生)链接,要求程序员用多行字符串链接'+'
PHP(从C派生)需要程序员使用'.'链接多行字符串

ANSI C现在没有这个完全愚蠢(过时)的要求.

那么,现代语言声称的进展是如此明显吗?我还在找它.

此致

皮埃尔.

  • 我不太明白你关于额外处理数千的评论; 对于C#你离开了`,数量)`,PHP是没关系的,你的ANSI C例子还需要两个参数(缓冲区和缓冲区长度).除了Java之外,你的例子似乎证明了相反的观点.另外,我以前从未见过`// :: comment ::`语法; PHP肯定不需要它. (10认同)
  • C更容易记住,更难以正确. (5认同)
  • 那么这解释C? (2认同)

Pau*_*lin 28

大多数网络应用程序,尤其是Web服务器,更加"受I/O约束" - 即它们能够以比网络接受它更快的速度抽出数据.因此,具有高CPU效率的东西并不是一个巨大的胜利,而可扩展和可维护的东西则是.因此没有理由接受C的缺点并失去Java,.NET,Python,Perl或其他语言等托管环境的优势.

  • 如果我可以用Java或Perl填充网络管道(我可以),C更快的事实是无关紧要的. (14认同)
  • 您需要记住,Web应用程序只是处理用户请求的"服务器堆栈"的一小部分,而不是性能关键的部分.还有其他部分 - 操作系统内核(通常用C编写),文件系统(C),Web服务器(通常是C),语言解释器(C),数据库(通常是C或C++).Web应用程序通常只将数据从一个部分传递到另一个部分,对其应用一些基本操作,并且它的性能根本不是至关重要的. (3认同)

Chr*_*isW 15

C不是操作字符串的方便语言.

比较C#:

string foo = "foo";
string bar = "bar";
string foobar = foo + bar;
Run Code Online (Sandbox Code Playgroud)

对应的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
Run Code Online (Sandbox Code Playgroud)

  • 所以我们应该使用C++,因为它获得了与C相同的性能,但是编译你的C#例子就像魅力一样? (12认同)
  • 更不用说处理unicode(多字节)字符串了! (5认同)
  • C通过运行时库函数处理多字节和unicode.使用strncpy等安全功能也非常安全. (5认同)
  • PHP也不能正确处理Unicode,但它是非常流行的面向Web的语言. (4认同)
  • 在字符串操作方面 - web applkication通常只输出字符串,因此C的`printf`应该可以完成工作. (2认同)
  • 或者你可以使用asprintf(&foobar,"%s%s",foo,bar); (2认同)

Ken*_*Ken 11

如果难度和复杂性根本不是问题(哈!),那么我不会停留在C.我会写x86汇编.自从我使用任何不是x86的网络服务器以来,它已经有好几年了,而且每天看起来越来越不可能.

使用C(而不是汇编或更高级别的东西)是建议C是程序员效率和计算机效率的最佳点.

对于我编写的程序,情况并非如此:C与我想要编写的程序类型不匹配,并且它相对于一个体面的宏汇编程序的优势并不那么重要.我现在正在编写的程序在我选择的HLL中并不难,但是它在程序集或C中的复杂性都会很高,以至于它永远不会完成.我承认,一个足够聪明的程序员有足够的时间可以使它在汇编或C中运行得更快,但我不是那个程序员.


L̲̳*_*̲̳̳ 7

  • 这是不安全的
  • 很难读
  • 它很难维护,开发时间在一个数量级上更慢
  • 您的大多数Web内容可能都受I/O约束,因此加速甚至不重要,尤其是当您使用Java或C#等快速语言时

  • "和C肯定没有任何动态语言那样多的安全漏洞"_That_,我的朋友,完全是胡说八道.为什么这个评论有3个赞成票? (5认同)
  • @Kinopiko:动态语言有哪些弱点?当一个noob程序员明确表示他想通过`eval`和php的`include`执行任意代码?请注意,在C/C++中,您没有声明要执行任意代码,它就是这样.`eval`不是bug,而是程序员的意图.在C/C++中,任何bug都可能导致远程代码执行,在动态语言中,除非有些傻瓜搞乱`eval`,否则情况并非如此. (3认同)
  • "像Java或C#这样的快速语言"是什么意思? (2认同)
  • @Kinopiko:实际上,你无法在任何地方解释它.没有解释.C比任何动态语言都有更大的问题.在动态语言中可能发生的更糟糕的事情是"未找到属性,呐喊". (2认同)

Jor*_*dan 7

我知道这个问题已经被解决了,但到目前为止还没有提到的两件事对于任何编程范例的成功都非常重要,尤其是在Web开发中你会得到很多不一定是程序员的人,使用代码.

  1. 参与,有用的社区,也就是那些已经解决了我的问题的人.对于谷歌来说,即使是最愚蠢的新手也很容易为什么他们在PHP中获得"已经发送的标题"错误,而这些信息可能不适用于场景新的框架或语言,或者没有临界质量.
  2. 框架,以便大多数程序员可以解决业务问题而不是一起黑客代码.

如果我有一个需要极端性能的关键应用程序,我会使用C,但写入需要更长的时间,我永远不会进入市场.在#1或#2之前,我不可能使用它.


Art*_*yom 6

对于许多目的而言,C是非常低级的语言:no-OOP,大量的手动资源管理.

C用于网络的用途有限,例如Klone.它主要用于低资源嵌入式应用程序案例.

但是,有一些C++ Web框架,如CppCMS,用于高性能Web应用程序开发.

C++允许您享受高度抽象和细粒度访问您正在做的事情,为部署和开发大型应用程序提供了更好的选择.

但是,如果性能和资源使用比上市时间和开发成本更加重要,那么您可以使用它们,因为通常使用Java,Python或PHP等语言的Web框架可以更快地进行Web开发.对于C++而言,通常还有那些不太称职的程序员,然后是相同薪水的Java/P*语言.

所以这是优先级问题,对于PHP/Python/Perl或Java,C++ Web开发的工具也较少.

  • 有趣的是,我不知道CppCMS是一个用C++编写的低级Web框架.可能是两个世界中最好的,坐在C语言和Web语言之间. (2认同)

小智 5

@Joeri Sebrechts

FUD的作用:

通过将硬件投入该问题,PHP,Python等易于扩展。

好吧,实际上没有。它们根本不垂直缩放,而水平缩放非常差。请参阅:http : //gwan.ch/en_scalability.html,其中说明了表现不好的人要面对的麻烦有多大。

假设用PHP开发一个应用程序需要花费1人1年的精力,而用C来开发它需要3年的时间(因为C需要花费更多的精力来完成相同的事情)。

又错了。如果PHP库是用C编写的,则可以直接从C使用它们-立即提供您声称PHP具有的“独特生产力”。

这意味着减少的C代码硬件需求必须代表2年的工资,才能使C变得有吸引力。在实践中(几乎)永远不会发生。

纯FUD(请参阅上面的答案)。

Facebook的规模是如此之大,以至于硬件成本足以应付。这就是他们开发HipHop的原因,该工具将PHP交叉编译为C ++。它带来了两全其美的优点:用PHP编程的简单性以及C ++的原始性能。Facebook仍然是用PHP开发的,但是当您使用它时,它都是本机代码。

毫无疑问,HipHop比PHP快得多。但是,如果将HipHop与纯C实现进行比较,则有两层开销:

  • PHP到C ++的接口(使用膨胀的C ++库);
  • C ++膨胀本身(使C ++比普通C慢2-10倍)。

另外,HipHop是以毫无效率的低效率学术模式(与任何现实世界分离)编写的。当然,它可以打动PHP编码人员,但向嵌入式程序员展示此代码,他将为Facebook感到遗憾。

“实际上,一种不具备所有功能的语言比具有某种功能的语言更容易编程” –丹尼斯·里奇(Dennis M. Ritchie)

与(大多数)编程语言最终用户不同,丹尼斯似乎对此事有两点了解。

  • (1)不要以个人身份来处理东西,因为我什至都不知道您的产品,所以我也不愿意放弃您的产品。(2)您使用G-wan进行了有趣的概念证明,但是如果我不等观察方法,直到我看到实际的Web应用程序正在使用它,希望您能对不起我,而不仅仅是几个综合基准。(3)您错误地描述了Facebook有关水平扩展的抱怨,因为它们的问题在于内存缓存和数据库多核性能,这是现实世界Web应用程序的瓶颈,这是G-wan无法解决的问题。(4)我确信HipHop欢迎您的代码贡献。 (3认同)

kin*_*all 5

除了很容易用这些语言开发之外,我们都必须有更多的理由来使用PHP,Python,Ruby等

这是完整的原因,也是唯一需要的原因.它有许多好处,主要是上市时间.如果你可以在一个月内使用PHP而不是两个月使用C在线获取Web应用程序,那么你可能会赢.如果你可以使用Ruby on Rails在一周内添加新功能而不是使用C两周,那么你再次获胜.如果您可以使用Python在一天内修复错误而不是使用C两天,那么您将再次获胜.如果你可以添加一个功能,因为你使用的语言X是你的竞争对手根本无法添加的,因为他们使用的是语言Y而且由于资源有限,这种语言太难了,那么你肯定会赢.

通过"赢",我的意思是你不输.你的竞争对手正在使用更高级别的语言和框架来开发他们的网站,所以如果你使用C,你就不会与使用C的其他人竞争,你就会输给其他不使用C的人.只是为了竞争,你有使用具有相似抽象级别的工具.

如果性能成为问题,您可以用性能更好的语言重写网站的缓慢部分.或者你可以扔掉更多的硬件.实际上,性能问题就是我们所说的"很好的问题" - 这意味着你已经成功了.但是花费更多时间来开发网站的基本功能很少是一种选择.在C语言中写它只会这样运​​行得更快就是过早的优化,正如Knuth告诉我们的那样,它是所有邪恶的根源.

所有这些意味着如果你可以使用比Python或Ruby更高抽象级别的语言,你可以赢得使用Python或Ruby的人.Paul Graham关于他和他的团队如何使用LISP作为开发网站的"秘密武器"的故事可能具有指导意义.http://www.paulgraham.com/avg.html

当然,如果您正在开发一个自己娱乐的网站,可以用您想要的任何语言进行.如果您的站点受CPU限制(几乎没有;它们通常是I/O绑定的),那么请使用性能最快的语言.但是,如果您正在尝试创新,请使用具有最佳抽象功能的高级语言.