为什么你不使用C为您的networking应用程序?
当我遇到G-WAN时,我今天早上看了几个不同的Web服务器。 据我所知,它是一个用C语言编写的网页服务器,你必须用C编写你的网站/networking应用程序来利用它。一个明显的好处就是G-WAN网站的速度。
然而,在论坛上,G-WAN的创造者问为什么不使用C来开发基于networking的应用程序,除了难以想象的一个原因之外(无论如何,对于C来说,我是新手)。 除了易于使用这些语言开发之外,我们必须有更多的理由使用PHP,Python,Ruby等。 我不认为这是一个很好的理由。
所以我把它给你:为什么你不使用C为您的networking应用程序?
要使C程序正确和安全,需要非常小心。 这意味着你需要有非常好的人写你的程序。 这意味着你付出更多。
另外,C没有像.NET(和其他主要的以Web为中心的平台)那样从一个巨大的单一标准function库中获取好处。 所以,你可能不得不购买组件,或者执行互操作,或者使用更多的“免费”function来滚动你自己的function,我们应该说“以networking为中心”的语言,比如PHP或者C#或者Ruby等等。 这意味着你付出更多。
把所有这些join到单线程计算速度在networking上并不重要的事实上。 如果您需要更多的可扩展性,大多数组织可以在经济上只是抛出更多的核心问题,并罚款。 当然,这对每个人都是不正确的。 我可以想象,Google引擎的核心是用C语言或类似的语言编写的,不仅速度快,而且还能节约真正的电力成本。
我们在大多数编程中不使用C的原因是一样的。 好处(主要是性能)不会超过成本(开发时间,缺乏自动内存pipe理,缺乏对缓冲区溢出的自动保护,在编辑和testing阶段之间进行编译阶段等)。
哼…
我在这个讨论中似乎有点晚了 – 但我现在才发现它。 我感谢你们所有人的这么多的意见。
我是G-WAN的作者,这表明我已经认真地处理了这个问题:G-WAN比所有其他Web服务器(没有处理) 和所有其他Web应用程序服务器(任何你可以想象的处理)都要快。
是的,ANSI C还可以处理更多的静态内容 – CPUfunction不太强大(ANSI C不仅仅是dynamic内容的飞行)。
顺便说一下,G-WAN使用C脚本(不需要C编译器和链接器),所以编译/链接周期/延迟不存在。
在比较G-WAN到.NET Java和PHP的过程中,我用四种语言编写了类似的应用程序: http : //gwan.ch/source/
令我沮丧的是,现代脚本语言并不容易使用。
这个工作的一个特别令人沮丧的部分是拼命search “魔术”的API调用,它会做你想做的事情。
想想如何做到“漂亮的千人”:
C#
String.Format("{0:n}"...
Java的
new DecimalFormat("0.00"); ...
PHP
number_format($amount, 2); ...
ANSI C
sprintf("%'.2f", amount);
“…”表示一些预configuration或后处理是必要的。 ANSI C显然更易于使用和记忆。
当PHP有超过5900个API调用(C#和Java不远处)时,find正确的 API调用本身就是一个挑战。 浪费时间find这个(然后发现本地 API调用被实现了多么糟糕),下次需要它的时候学习它,这一直是剥夺你解决你的应用程序所需的时间问题。
我已经阅读(上面)PHP比ANSI C更简洁? 为什么然后使用"//:: this is a comment ::"
而不是"// this is a comment"
? 为什么有一个如此愚蠢复杂的'漂亮的数千'语法?
另一个通常的观点是,Java等为Web应用程序提供了专门的调用。
我无法find任何东西来逃避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) 要求程序员将多行string与“+”
C#(从C派生) 要求程序员将多行string与“+”
PHP(源自C) 要求程序员将多行string与“。”连接起来。
ANSI C没有这个现在完全愚蠢(过时)的要求。
那么,现代语言所取得的进展如此明显呢? 我仍在寻找它。
此致
皮埃尔。
大多数networking应用程序,特别是networking服务器,远比“I / O绑定”要多得多,即它们能够以比networking可以接受的速度快得多的速度输出数据。 因此,高CPU效率的东西并不是一个巨大的胜利,而可扩展和可维护的东西是。 所以没有理由接受C的缺点,并且失去了像Java,.NET,Python,Perl或其他语言这样的pipe理环境的优点。
C不是操纵string的方便语言。
比较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
如果困难和复杂性根本就不是问题(ha!),那么我就不会停下来。我会写x86集合。 我已经使用任何不是x86的networking服务器已经有好几年了,每天看起来越来越less。
使用C(而不是汇编,或者更高层次的东西)是build议C是程序员效率和计算机效率的最佳select。
对于我编写的程序来说,情况并非如此:C与我想写的程序types不匹配,而且它比一个体面的macros汇编程序的优点并不那么重要。 我现在正在编写的程序在我的HLL中并不困难,但是在程序集或C中的复杂程度将非常高,以至于无法完成。 我承认,一个足够聪明的程序员有足够的时间可以使它在汇编或C中运行得更快,但我不是程序员。
- 这是不安全的
- 很难阅读
- 很难维持,开发时间在一个数量级上是慢的
- 大多数的networking资料可能是I / O绑定的,所以加速并不重要,特别是当你使用像Java或C#这样的快速语言时,
C是相当低级的语言,用于多种目的:无OOP,大量的手动资源pipe理。
C的用途有限,例如Klone 。 它主要用于低资源embedded式应用情况。
但是,有像CppCMS这样的C ++ Web框架用于高性能Web应用程序的开发。
C ++使您可以享受高度的抽象和细粒度的访问,从而为部署和开发大型应用程序提供更好的select。
但是,如果性能和资源使用情况更为重要,那么在使用良好的Web框架(例如Java,Python或PHP等语言)时,通常Web开发的开发速度会更快,而上市时间和开发成本会更高。 同样,一般来说,C ++和Java / P *语言的薪水相对较低。
所以这是优先考虑的问题,对于PHP / Python / Perl或Java而言,C ++ Web开发的工具也较less。
我知道这个问题已经被解决了,但是到目前为止没有提到的两件事对于任何编程范例的成功都是非常重要的,特别是在networking开发中,你得到了很多不一定是程序员的人,使用代码。
- 有关的,有用的社区,也就是已经解决了我的问题的人。 即使是noobs的noobs也很容易Google为什么会在PHP中得到“头文件已经发送”的错误,而这些信息可能不适用于新的框架或语言,否则没有临界质量。
- 框架,使大多数程序员可以解决业务问题,而不是一起黑客代码。
如果我有一个需要极高性能的关键应用程序,我会使用C,但写这个需要很长的时间,我永远不会上市。 在没有#1或#2之前,使用它是不可行的。
除了易于使用这些语言开发之外,我们必须有更多的理由使用PHP,Python,Ruby等
这是完整的原因,也是唯一需要的。 它有很多好处,其中主要是上市时间。 如果你可以在一个月内使用PHP而不是两个月的时间使用C在线获得你的Web应用程序,那么你可能会赢。 如果您可以使用Ruby on Rails在一周内添加新function,而不是使用C两周,那么您就赢了。 如果你可以在一天内使用Python而不是两天使用C来修复一个bug,那么你将再次获胜。 如果你可以添加一个function,因为你使用的语言X是你的竞争对手无法添加的,因为他们正在使用Y语言,而且考虑到他们的资源限制,这个语言太难了,那么你肯定会赢。
而通过“赢”我真的意味着你不会输。 您的竞争对手正在使用更高级的语言和框架来开发他们的网站,所以如果您使用C,那么您就不会与其他使用C的人竞争,而是与其他不使用C的人竞争。为了竞争,使用具有相似抽象级别的工具。
如果性能成为问题,则可以使用性能更好的语言来重写网站的缓慢部分。 或者你可以扔更多的硬件。 真的,性能问题就是我们所说的“有问题” – 这意味着你已经成功了。 但花费更多的时间来开发您的网站的基本function是很less的select。 把它写成C就是为了跑得更快是过早的优化,正如Knuth告诉我们的,它是万恶的根源。
所有这一切都意味着,如果您可以使用比Python或Ruby更高级别的抽象语言,则可以赢得使用Python或Ruby的人员的胜利。 Paul Graham关于他和他的团队如何将LISP作为开发网站的“秘密武器”的故事可能是有益的。 http://www.paulgraham.com/avg.html
当然,如果你正在开发一个自己的娱乐网站,可以用你想要的任何语言来做。 如果你的站点是CPU绑定的(几乎没有;它们通常是I / O绑定的),然后使用性能最快的语言。 但是,如果您尝试创新,则可以使用具有最佳抽象的高级语言。
你觉得简单不是一个好的理由。 我认为这是一个很好的理由。 如果你需要最终的性能,那么C就没问题,但是其他语言却把抽象的东西抽象出来,以提高生产力,可维护性和减less缺陷。
考虑到我不是一个Web开发人员,但会问这些问题,并提供一两点。
什么网站只用一种语言书写? 严重的这个线程似乎假设一个锤子适合所有的指甲。
有人最后一次严正指出C是复杂的? 我的意思是,真正的家伙,你不能得到更低的水平。 我不是在说C ++,因为这两者经常被引用。
C有安全问题,这是不能否认的,但是它们比在PHP和Perl这些杂志中看到的要less得多。 无论哪种情况,一个安全的网站是程序员纪律的一个function。
在任何情况下closures评论。 使用任何给定的语言的困难是非常依赖于手头上的问题,特别是C ++可以导致有经验的人快速解决问题。
Web服务器的工业用途,即embedded式服务器/站点根本没有正常Web服务器可能具有的语言select。 所以你最终使用C的变体或可能类似BASIC的东西。 您的目标是提供设备所需的function,而不用担心语言。 在主stream的Web服务器上,大多数情况下,高级语言都是这样做的。 走开大铁,你的编程自由出门。
没有合适的图书馆,在大多数情况下,用C开展一个基础的networking项目是愚蠢的。缺乏高质量的图书馆是一个很大的负面因素。
@Joeri Sebrechts
FUD在行动:
抛开硬件问题,PHP,Python等很容易扩展。
那么,实际上没有。 它们不能垂直缩放,水平缩放很差。 请参阅: http : //gwan.ch/en_scalability.html ,其中解释了performance不佳的人面临多less麻烦。
假设花费1人1年的时间来开发一个PHP应用程序,花费3年才能在C中完成(因为C需要更多的努力去做同样的事情)。
又错了。 如果PHP库已经用C语言编写,那么他们可以直接从C中使用,并且提供您声称PHP拥有的“独特的生产力”。
这意味着C代码的硬件需求减less必须代表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编码者,但是向embedded式程序员展示这些代码,他会为Facebook感到难过。
“一个没有一切的语言实际上比一些语言更容易编程” – 丹尼斯·M·里奇
与(大多数)编程语言END-USERS不同的是,丹尼斯似乎知道这件事的一些事情。
下面是一些用C编写的与Web相关的代码,在为Web构build自己的C库时值得一看:
- cgic:用于CGI编程的ANSI C库
- cgit:git仓库的web前端
- wbox:HTTPtesting工具
- wget html-parse.c
- curlcookie.c
- David Parsons将John Gruber的Markdown文本转换为HTML语言的折扣
- Protothreads(特别是embedded式系统), http://www.sics.se/~adam/software.html
- Protothread,由LarryRuane编写的Google代码项目
- uriparser sourceforge项目
- HTTPparsing器,http请求/响应parsing器由Ryan Dahl在github上
- nginx的
- …
那么,鉴于Web开发是一个有用的库(PHP所使用的那种)的事实,那么我不明白C将不会有用。
毕竟,程序逻辑是一样的:做,而不是,如果然后其他,等这是C,PHP,.Net或Perl。
并且C循环或者testing不是更难写,因为它是用C写的。
大多数PHP库都是用C语言编写的,所以缺lessC语言库的Web参数看起来不那么令人信服。
我的猜测是,C并没有被Java(SUN)和.Net(MICROSOFT)的推动者广告为Web编程语言,因为他们拥有自己的专利 (高度专利)的知识资产来推动采用。
作为一项免费(非专利)的标准,C并没有对开发商提供任何“locking”的手段……因此,也许是在学校和大学游说的重要手段,以确保纳税人的钱将资助采用由私人利益支持的低劣技术。
如果C对于IBM和MICROSOFT来说足够好(他们不是用PHP或者.Net开发他们的产品),但是对于最终用户来说还不够好,那么最终用户可能会想知道为什么他们会受到这种双重标准的困扰。
C中的string处理可以使用以
数据types(libslack的一部分)
Libslack提供了一个名为List的通用可扩展指针数组types,一个名为Map的通用可扩展哈希表数据types和一个带有堆栈函数(很多从Perl中提取)的体面的String数据types。 还有抽象单数和双数列表数据types与可选的“可增长”空闲列表。
要么:
托pipestring库(for C)
“domachine”写道:
平台依赖:C需要被编译成本地代码。 此代码不能在所有平台上运行。 解释型语言(如PHP)在解释器存在的地方运行。 当然,这个问题可以解决,但是在这种特殊情况下,你会发现在PHP中开发的优势。
你有没有想过使用哪种语言编写可移植的 PHP解释器?
在ANSI C.
因此,在再次解散ANSI C的可移植性之前,先问问自己用哪种语言编写了你最喜欢的编程语言……(提示:几乎所有的都是用C / C ++编写的)。
ANSI C编译器在我必须处理的所有平台上都可用 – 对于PHP及其庞大的运行时,情况也是如此。
对于可移植性的争论非常多。
如果出现以下情况,我将使用C来作为networking应用
- 我有一个主机服务器(小VPS)的小预算,我的时间并不昂贵。
- 我正在为Facebook,Twitter或有需要的人员工作,以减less使用的服务器数量(数千到数百万用户)。
- 我想学习C,我需要find一个真正的世界的应用程序,我可以使用它。
- 我知道C比其他脚本语言好得多。
- 我是一个生态家伙,我想减less我的应用程序的碳足迹。
G-WAN运行代码作为脚本,是像Play一样的C脚本! 框架适用于Java。 G-WAN速度非常快,并且具有简单的API。 当其他服务器没有这样做时,G-WAN使得C / C ++可以用于Web应用程序。
有一点很清楚:你需要一个好的程序员用C编写一个网站,任何蹩脚的开发人员都可以用意大利面创build一个网站PHP :-)还有一些泄漏检测器,甚至C的垃圾收集器。
类似于G-WAN,但对于Cocoa / Objective-C则是Web应用框架Bombax。
谈到Objective-C,我无法抗拒指出MacRuby,它有可能彻底改变我们将有一天制作networking应用程序的方式。
另一点可能是平台依赖。 C需要被编译成本地代码。 此代码不能在所有平台上运行。
口译语言运行在任何一个口译员存在的地方。 许多提供商例如提供安装在他们的服务器上的PHP解释器,但是具有Windows操作系统。 如果你现在正在Linux机器上开发。 你有问题。
当然,这个问题可以解决,但是在这种特殊情况下,你会发现在PHP中开发的优势。
希望这可以帮助,关于domachine
抛开硬件问题,PHP,Python等很容易扩展。
假设花费1人1年的时间来开发一个PHP应用程序,花费3年才能在C中完成(因为C需要更多的努力去做同样的事情)。 这意味着C代码的硬件需求减less必须代表2年的工资价格才能吸引C。 在实践中(几乎)不会发生。
像每一条规则一样,有一个例外。 Facebook的规模是如此之大,硬件是一个足够大的成本照顾。 这就是为什么他们开发了HipHop ,它将PHP交叉编译为C ++。 它带来了两全其美:PHP中编程的简单性,以及C ++的原始性能。 Facebook仍然是用PHP开发的,但是使用它的时候,都是原生代码。
最后,您可以绝对使用任何语言来开发网站,包括汇编程序(通过CGI等)。 如果你的意思是为什么我们不使用一种编译语言,那么我们已经有了.NET,Java等等。
你必须爱你正在做什么来取得成果。 诸如java和php之类的语言是为了让人们的生活更轻松而创build的。 Php今天特别受益于许多自学Web程序员。 你可以看到它在Web开发领域的支持。
Java IAM肯定是写给你帮助在今天的世界任何可能的事情。 这本巨大的书是一个明确的指示,如果你正在寻求networking发展,这是一个野兽。 Python也一样。 这些都是很棒的语言和平台。 难怪他们非常受欢迎。
我是C的奉献者,部分原因是由于某些限制,无法看看其他语言,如PHP。 我每天都用C写作,每天我都很自豪地学习新事物。 这让我感觉非常好,而且我也开始了解如何通过Cgi为网站编写应用程序时C是默认select。 这是在其他平台上抽象出来的,当你开发与数据库和Web服务有关的网站时,你需要知道幕后发生了什么。
但是,如果你知道所有这些,并且仍然希望使用脚本语言,那么必须有一个合理的理由,而且我们不需要任何人提出build议。