为什么不在 Web 应用中使用 C?[已关闭]

2022-08-30 07:37:36

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

但是,在论坛上,G-WAN的创建者问为什么不在基于Web的应用程序中使用C,除了困难之外,我想不出一个原因(无论如何,对我来说,当涉及到C时,我是新手)。除了在这些语言中易于开发之外,我们所有人都使用PHP,Python,Ruby等的原因肯定还有更多。我不认为这是一个很好的理由。

所以我对你说:为什么你不在你的Web应用程序中使用C?


答案 1

要使C程序正确和安全,需要非常小心。这种关心意味着你需要有真正优秀的人来编写你的程序。这意味着您需要支付更多费用。

此外,C语言没有像.NET(以及其他主要的以Web为中心的平台)那样从庞大的单一标准功能库中绘制的好处。因此,您可能必须购买组件,或者执行互操作,或者使用更多“免费”提供自己的功能,我们是否应该说“以Web为中心”的语言,如PHP或C#或Ruby或其他任何语言。这意味着您需要支付更多费用。

再加上单线程计算速度在网络上并不那么重要。如果您需要更大的可扩展性,大多数组织都可以在经济上投入更多核心来解决问题。当然,并非每个人都如此。我可以想象,谷歌引擎的核心是用C或类似语言编写的,这不仅是为了速度,也是为了节省真正的电力成本。


答案 2

哼。。。

似乎我在这次讨论中有点晚了 - 但我现在才发现它。我感谢你们所有人提供如此多的投入。

我是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}"...

爪哇岛

new DecimalFormat("0.00"); ...

菲律宾比索

number_format($amount, 2); ...

安西 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("&#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();
  }

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

Java(派生自C)要求程序员将多行字符串与“+”
C#(派生自C)链接,要求程序员将多行字符串与“+”
PHP(派生自C)链接,要求程序员将多行字符串与“”链接。

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

那么,现代语言是否声称取得了如此明显的进步呢?我仍然在寻找它。

真诚地

皮尔。


推荐