[php] 웹 앱에 C를 사용하지 않는 이유는 무엇입니까?

오늘 아침 G-WAN을 접했을 때 몇 가지 다른 웹 서버를 살펴 보았습니다 . 내가 알기로는 C로 작성된 웹 서버이므로 웹 사이트 / 웹 앱을 C로 작성하여 사용해야합니다. 한 가지 분명한 이점은 G-WAN 사이트에서 제안하는 속도입니다.

그러나 포럼에서 G-WAN의 제작자는 웹 기반 앱에 C를 사용하지 않는 이유를 물었고 그것이 어려운 것 외에는 하나의 이유를 생각할 수 없습니다 (어쨌든 저에게는 C에 관해서는 초보자입니다). 우리 모두가 PHP, Python, Ruby 등을 사용하는 이유는 이러한 언어로 쉽게 개발할 수 있다는 점 외에 더 많은 이유가있을 것입니다. 나는 그것이 좋은 이유라고 생각하지 않습니다.

그래서 저는 여러분에게 이렇게 말했습니다. 왜 웹 앱에 C를 사용하지 않습니까?



답변

C 프로그램을 정확하고 안전하게 만들려면 많은주의가 필요합니다. 이러한 관심은 프로그램을 작성하는 정말 좋은 사람들이 필요하다는 것을 의미합니다. 그것은 당신이 더 많이 지불한다는 것을 의미합니다.

또한 C는 .NET (및 기타 주요 웹 중심 플랫폼)이 제공하는 기능의 방대한 단일 표준 라이브러리에서 그리는 이점이 없습니다. 따라서 구성 요소를 구입하거나 상호 운용성을 수행하거나 “무료”로 제공되는 자체 기능을 추가로 제공해야 할 수 있습니다. PHP, C # 또는 Ruby 등과 같은 “웹 중심”언어라고 말할 수 있습니다. 그것은 당신이 더 많이 지불한다는 것을 의미합니다.

이 모든 것을 단일 스레드 계산 속도가 웹에서 그다지 중요하지 않다는 사실에 추가하십시오. 더 많은 확장 성이 필요한 경우 대부분의 조직은 경제적으로 문제에 더 많은 코어를 던져 문제를 해결할 수 있습니다. 물론 모든 사람에게 해당되는 것은 아닙니다. 나는 구글 엔진의 핵심이 속도뿐만 아니라 전력 비용을 절약하기 위해 C 또는 유사한 언어로 작성되었다고 생각한다.


답변

흠 …

이 토론에서 조금 늦어 보이지만 방금 발견했습니다. 많은 의견을 보내 주신 모든 분들께 감사드립니다.

저는 G-WAN의 저자입니다. G-WAN은 다른 모든 웹 서버 (처리 없음) 다른 모든 웹 애플리케이션 서버 (상상할 수있는 모든 처리)보다 빠릅니다 .

예, ANSI C는 또한 덜 강력한 CPU로 더 많은 정적 콘텐츠를 처리 할 수있게했습니다 (ANSI C는 동적 콘텐츠를 날리는 것만이 아닙니다).

그런데 G-WAN은 C 스크립트 (C 컴파일러 및 링커 필요 없음)를 사용하므로 컴파일 / 링크주기 / 지연이 존재하지 않습니다.

G-WAN을 .NET Java 및 PHP와 비교하는 과정에서 유사한 응용 프로그램을 4 개 언어로 모두 작성했습니다. http://gwan.ch/source/

그리고 실망스럽게도 현대 스크립팅 언어는 사용하기가 쉽지 않았습니다 .

특히 실망스러운 작업 중 하나는 원하는 작업을 수행 할 ‘마법의’API 호출 을 필사적으로 검색 하는 것입니다.

다음에서 ‘꽤 수천’을 수행하는 방법에 대해 생각해보십시오.

씨#

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

자바

new DecimalFormat("0.00"); ...

PHP

number_format($amount, 2); ...

ANSI C

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

“…”는 일부 사전 구성 또는 사후 처리가 필요함을 의미합니다. ANSI C는 분명히 사용하고 기억하기 쉽습니다.

PHP에 5900 개 이상의 API 호출이있는 경우 (C # 및 Java는 그리 멀지 않음) 올바른 API 호출을 찾는 것은 그 자체로 어려운 일입니다. 이를 찾는 데 낭비 된 시간 (그리고 네이티브 API 호출이 얼마나 잘못 구현 되었는지 확인하기 위해 ), 다음에 필요할 때이를 학습 할 시간,이 모든 시간은 애플리케이션을 해결하는 데 필요한 시간을 빼앗기고 있습니다. 문제.

PHP가 ANSI C보다 간결하다는 것을 (위) 읽었습니다. 왜 "//:: this is a comment ::"대신 사용 "// this is a comment"합니까? 왜 그렇게 어리석은 복잡한 ‘아주 수천’구문을 가지고 있습니까?

다른 일반적인 주장은 Java 등이 웹 응용 프로그램에 대한 전용 호출을 제공한다는 것입니다.

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의 동일한 코드가 더 복잡 할 것이라고 정말로 믿습니까? 아니요, 훨씬 더 간단 하고 빠릅니다.

(C 유래의) 자바되는 요구 는 ‘+’로 링크 멀티 라인 스트링 프로그래머
된다 (C로부터 유도 된) C 번호 요구 는 ‘+’로 링크 멀티 라인 스트링 프로그래머
(C로부터 유래) PHP 것은 필요 프로그래머 여러 줄 문자열을 ‘.’로 연결

ANSI C에는 이제 완전히 어리석은 (구식) 요구 사항이 없습니다.

그렇다면 현대 언어가 주장하는 명백한 진전이 있었습니까? 나는 아직도 그것을 찾고있다.

진정으로,

피에르.


답변

대부분의 프로그래밍에 C를 사용하지 않는 것과 같은 이유입니다. 이점 (대부분 성능)은 비용 (개발 시간, 자동 메모리 관리 부족, 버퍼 오버플로에 대한 자동 보호 부족, 편집 단계와 테스트 단계 사이에 컴파일 단계 등)을 능가하지 않습니다.


답변

대부분의 네트워크 애플리케이션, 특히 웹 서버는 훨씬 더 “I / O 바운드”입니다. 즉, 네트워크가 수용 할 수있는 것보다 훨씬 빠르게 데이터를 펌핑 할 수 있습니다. 따라서 CPU 효율성이 높은 것이 큰 승리는 아니지만 확장 가능하고 유지 관리 할 수있는 것이 좋습니다. 따라서 C의 단점을 받아들이고 Java, .NET, Python, Perl 또는 기타 언어와 같은 관리 환경의 이점을 잃을 이유가 없습니다.


답변

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


답변

어려움과 복잡성이 전혀 문제가되지 않았다면 (ha!) C에서 멈추지 않을 것입니다. x86 어셈블리를 작성합니다. x86이 아닌 웹 서버를 사용한 지 몇 년이 지났고 매일 그럴 가능성이 점점 줄어들고 있습니다.

C (어셈블리 또는 더 높은 수준의 것 대신)를 사용하는 것은 C가 프로그래머 효율성과 컴퓨터 효율성의 최적 지점임을 제안하는 것입니다.

내가 작성하는 프로그램의 경우에는 그렇지 않습니다. C는 내가 작성하려는 프로그램 종류와 잘 맞지 않으며 적절한 매크로 어셈블러에 비해 C의 장점은 그다지 중요하지 않습니다. 내가 지금 작성하고있는 프로그램은 내가 선택한 HLL에서 어렵지 않지만 어셈블리 나 C에서 복잡도가 너무 높아서 완료되지 않을 것입니다. 충분한 시간을 가진 충분히 똑똑한 프로그래머가 어셈블리 또는 C에서 더 빠르게 실행할 수 있다는 것을 인정하지만 그 프로그래머는 아닙니다.


답변

  • 안전하지 않다
  • 그건 알아보기 힘들
  • 유지 관리가 어렵고 개발 시간이 엄청나게 느립니다.
  • 대부분의 웹 자료는 아마도 I / O 바운드 일 것이므로 속도 향상은 중요하지 않습니다. 특히 Java 또는 C #과 같은 빠른 언어를 사용할 때 더욱 그렇습니다.