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或类似的语言编写,不仅仅是为了提高速度,还能节省电力成本.
Que*_*tin 47
我们在大多数编程中都不使用C的原因相同.好处(主要是性能)不会超过成本(开发时间,缺乏自动内存管理,缺少缓冲区溢出的自动保护,编辑和测试阶段之间的编译阶段等).
小智 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}"...
Java的
new DecimalFormat("0.00"); ...
PHP
number_format($amount, 2); ...
ANSI C
sprintf("%'.2f", amount);
"......"表示某些预配置或后处理是必要的.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(" ");  else
          if(c == '"')  sb.append("""); else
          if(c == '&')  sb.append("&");  else
          if(c == '<')  sb.append("<");   else
          if(c == '>')  sb.append(">");   else
          if(c == '\n') sb.append("<br/>"); 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中的相同代码会更复杂吗?不,这将是非常简单和快速.
Java(派生自C)要求程序员将多行字符串与'+' 
C#(从C派生)链接,要求程序员用多行字符串链接'+' 
PHP(从C派生)需要程序员使用'.'链接多行字符串
ANSI C现在没有这个完全愚蠢(过时)的要求.
那么,现代语言声称的进展是如此明显吗?我还在找它.
此致
皮埃尔.
Pau*_*lin 28
大多数网络应用程序,尤其是Web服务器,更加"受I/O约束" - 即它们能够以比网络接受它更快的速度抽出数据.因此,具有高CPU效率的东西并不是一个巨大的胜利,而可扩展和可维护的东西则是.因此没有理由接受C的缺点并失去Java,.NET,Python,Perl或其他语言等托管环境的优势.
Chr*_*isW 15
C不是操作字符串的方便语言.
比较C#:
string foo = "foo";
string bar = "bar";
string foobar = foo + bar;
对应的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
Ken*_*Ken 11
如果难度和复杂性根本不是问题(哈!),那么我不会停留在C.我会写x86汇编.自从我使用任何不是x86的网络服务器以来,它已经有好几年了,而且每天看起来越来越不可能.
使用C(而不是汇编或更高级别的东西)是建议C是程序员效率和计算机效率的最佳点.
对于我编写的程序,情况并非如此:C与我想要编写的程序类型不匹配,并且它相对于一个体面的宏汇编程序的优势并不那么重要.我现在正在编写的程序在我选择的HLL中并不难,但是它在程序集或C中的复杂性都会很高,以至于它永远不会完成.我承认,一个足够聪明的程序员有足够的时间可以使它在汇编或C中运行得更快,但我不是那个程序员.
我知道这个问题已经被解决了,但到目前为止还没有提到的两件事对于任何编程范例的成功都非常重要,尤其是在Web开发中你会得到很多不一定是程序员的人,使用代码.
如果我有一个需要极端性能的关键应用程序,我会使用C,但写入需要更长的时间,我永远不会进入市场.在#1或#2之前,我不可能使用它.
对于许多目的而言,C是非常低级的语言:no-OOP,大量的手动资源管理.
C用于网络的用途有限,例如Klone.它主要用于低资源嵌入式应用程序案例.
但是,有一些C++ Web框架,如CppCMS,用于高性能Web应用程序开发.
C++允许您享受高度抽象和细粒度访问您正在做的事情,为部署和开发大型应用程序提供了更好的选择.
但是,如果性能和资源使用比上市时间和开发成本更加重要,那么您可以使用它们,因为通常使用Java,Python或PHP等语言的Web框架可以更快地进行Web开发.对于C++而言,通常还有那些不太称职的程序员,然后是相同薪水的Java/P*语言.
所以这是优先级问题,对于PHP/Python/Perl或Java,C++ Web开发的工具也较少.
小智 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实现进行比较,则有两层开销:
另外,HipHop是以毫无效率的低效率学术模式(与任何现实世界分离)编写的。当然,它可以打动PHP编码人员,但向嵌入式程序员展示此代码,他将为Facebook感到遗憾。
“实际上,一种不具备所有功能的语言比具有某种功能的语言更容易编程” –丹尼斯·里奇(Dennis M. Ritchie)
与(大多数)编程语言最终用户不同,丹尼斯似乎对此事有两点了解。
除了很容易用这些语言开发之外,我们都必须有更多的理由来使用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绑定的),那么请使用性能最快的语言.但是,如果您正在尝试创新,请使用具有最佳抽象功能的高级语言.