Почему Вы не используете C для своих веб-приложений?

Я взглянул на несколько различных веб-серверов этим утром, когда я столкнулся с G-WAN. Как я понимаю, это - веб-сервер, записанный в C, и необходимо использовать его путем записи веб-сайтов/веб-приложений в C. Одно ясное преимущество является скоростью, как сайт G-WAN предполагает.

Однако на форумах, создатель G-WAN попросил, почему бы не использовать C для веб-приложений, и я не могу думать о единственной причине кроме него являющийся трудным (для меня так или иначе, я - новичок когда дело доходит до C). Должно быть больше причин, почему все мы используем PHP, Python, Ruby и т.д. кроме него являющийся легким разработать на этих языках. Я не рассматриваю что как серьезное основание.

Таким образом, я поместил его в Вас: Почему Вы не используете C для своих веб-приложений?

98
задан Abs 20 June 2010 в 12:07
поделиться

19 ответов

Чтобы получить программу на C, нужно приложить много усилий. правильный и надежный. Эта забота означает, что вам нужны действительно хорошие люди, пишущие ваши программы. Это означает, что вы платите больше.

Кроме того, у C нет возможности использовать огромную единую стандартную библиотеку функциональных возможностей, как у .NET (и других основных веб-ориентированных платформ). Таким образом, вам, возможно, придется либо покупать компоненты, либо выполнять взаимодействие, либо использовать собственную функциональность, которая поставляется «бесплатно» с дополнительным, скажем так, «веб-ориентированным» языком, таким как PHP, C #, Ruby или что-то еще. Это означает, что вы платите больше.

Добавьте все это к тому факту, что скорость однопоточных вычислений не так важна в Интернете. Если вам нужна большая масштабируемость, большинство организаций могут просто добавить больше ядер для решения проблемы и все будет в порядке. Конечно, это верно не для всех. Я полагаю, что ядро ​​движка Google написано на C или подобном языке не только для скорости, но и для экономии реальных денег на расходах на электроэнергию.

77
ответ дан 24 November 2019 в 05:09
поделиться

Обработку строк в C можно упростить, используя:

Типы данных (часть libslack)

Libslack предоставляет общий тип данных массива растущих указателей под названием List, общий тип данных растущей хеш-таблицы под названием Map и достойный Тип данных String, который поставляется с кучей функций (многие заимствованы из Perl). Существуют также типы данных абстрактных односвязных и двусвязных списков с дополнительными, расширяемыми свободными списками.

или:

Библиотека управляемых строк (для C)

http://www.cert.org/secure-coding/managedstring.html

1
ответ дан 24 November 2019 в 05:09
поделиться

По той же причине, по которой мы не используем C в большинстве программ. Преимущества (которые в основном заключаются в производительности) не перевешивают затраты (время разработки, отсутствие автоматического управления памятью, отсутствие автоматической защиты от переполнения буфера, наличие стадии компиляции между стадиями редактирования и тестирования и т. Д.).

47
ответ дан 24 November 2019 в 05:09
поделиться

Учтите, что я не веб-разработчик, но все равно задам эти вопросы и предложу пару пунктов.

Какой веб-сайт написан только на одном языке? Серьезно, эта тема, кажется, предполагает, что один молоток подходит ко всем гвоздям.

Когда в последний раз кто-нибудь серьезно заявлял, что C комплексный? Я имею в виду, на самом деле, ребята, вы не можете получить намного более низкий уровень. Я не говорю здесь о C ++, поскольку на них часто ссылаются вместе.

У C есть проблемы с безопасностью, которые нельзя отрицать, но разве они меньше, чем то, что можно увидеть в кладжах под названием PHP и Perl? В любом случае безопасный веб-сайт - это результат дисциплины программиста.

В любом случае прочь до комментариев. Сложность использования любого данного языка очень зависит от рассматриваемой проблемы. C и особенно C ++ может привести к быстрому решению проблемы в опытных руках.

Промышленное использование веб-серверов, то есть встроенные серверы / сайты, просто не имеют выбора языка, который мог бы иметь обычный веб-сервер. Таким образом, вы в конечном итоге используете вариант C или, возможно, что-то вроде BASIC. Ваша цель - предложить функциональные возможности, необходимые устройству, и не беспокоиться о языках. На обычном веб-сервере это чаще всего делается с помощью языков высокого уровня. Отойдите от большого железа, и ваша свобода программирования исчезнет.

Без правильных библиотек в большинстве случаев было бы глупо делать основательный веб-проект на C. Отсутствие хороших стандартизированных библиотек здесь является большим недостатком.

4
ответ дан 24 November 2019 в 05:09
поделиться

Подобно G-WAN, но для Cocoa / Objective-C используется Bombax, фреймворк для веб-приложений.

http://www.bombaxtic.com

Говоря об Objective-C, я не могу удержаться от упоминания MacRuby, который может революционизировать способ, которым мы когда-нибудь будем создавать веб-приложения.

0
ответ дан 24 November 2019 в 05:09
поделиться

C - это языки довольно низкого уровня для многих целей: нет -OOP, много ручного управления ресурсами.

Использование C в Интернете ограничено, например Klone . Он в основном используется для встраиваемых приложений с низким уровнем ресурсов.

Однако существуют веб-фреймворки C ++ , такие как CppCMS , которые используются для разработки высокопроизводительных веб-приложений.

C ++ позволяет вам наслаждаться высокой абстракцией и мелкозернистым доступом к тому, что вы делаете, что дает гораздо лучший вариант для развертывания и разработки больших приложений.

Но вы используете их в том случае, если производительность и использование ресурсов намного более критичны. затем время вывода на рынок и затраты на разработку, поскольку в целом веб-разработка выполняется быстрее использование хороших веб-фреймворков для таких языков, как Java, Python или PHP. Также обычно есть менее компетентные программисты для C ++, чем для языков Java / P * за ту же зарплату.

Так что это вопрос приоритетов, также меньше инструментов для веб-разработки на C ++, чем для PHP / Python / Perl или Java.

6
ответ дан 24 November 2019 в 05:09
поделиться

Я знаю, что на этот вопрос уже дан смертельный ответ, но есть 2 вещи, не упомянутые до сих пор, которые чрезвычайно важны для успеха в любой парадигме программирования, и особенно в веб-разработке, где много людей не обязательно программисты, работающие с кодом.

  1. Вовлеченное полезное сообщество, также известное как «Люди, которые уже решили мою проблему». Даже для самых глупых новичков в Google довольно легко понять, почему они получают ошибки "заголовки уже отправлены" в PHP, тогда как эта информация может быть недоступна для фреймворка или языка, которые являются новыми для сцены, или по другим причинам не имеют критическая масса.
  2. Фреймворки, чтобы большинство программистов могли решать бизнес-задачи, а не взламывать код вместе.

Если бы у меня было критически важное приложение, требующее высочайшей производительности, я бы использовал C, но его написание заняло бы так много времени, что я бы никогда не вышел на рынок. Пока не будет №1 или №2, я не могу его использовать.

7
ответ дан 24 November 2019 в 05:09
поделиться

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
15
ответ дан 24 November 2019 в 05:09
поделиться

Вот еще несколько веб-кода, написанного на C, на который стоит обратить внимание при создании собственной библиотеки C для Интернета:

  • cgic: библиотека ANSI C для программирования CGI
  • cgit: веб-интерфейс для репозиториев git
  • wbox: инструмент тестирования HTTP
  • wget html-parse.c
  • curl cookie.c
  • Discount, реализация Дэвида Парсонса C текста Markdown Джона Грубера в html language
  • Protothreads (особенно для встроенных систем), http://www.sics.se/~adam/software.html
  • protothread, проект кода Google от LarryRuane
  • проект uriparser sourceforge
  • http-parser, http-анализатор запросов / ответов для c от Райана Даля на github
  • nginx
  • ...
3
ответ дан 24 November 2019 в 05:09
поделиться
  • это небезопасно
  • это трудно читать
  • это трудно поддерживать, время разработки замедляется на порядок
  • большая часть ваших веб-материалов, вероятно, связана с вводом-выводом, поэтому возможное ускорение даже не имеет значения, особенно если вы используете быстрый язык вроде Java или C#
7
ответ дан 24 November 2019 в 05:09
поделиться

Вы думаете, что легкость - плохая причина. Я думаю, это хорошая причина. Если вам нужна максимальная производительность, то C подойдет, но другие языки абстрагируются от сложных вещей, чтобы повысить производительность, удобство обслуживания и уменьшить количество дефектов.

4
ответ дан 24 November 2019 в 05:09
поделиться

Если бы трудность и сложность вообще не были проблемой (ха!), То я бы не останавливался на C. Я бы написал сборку x86. Прошло много лет с тех пор, как я использовал веб-сервер, отличный от x86, и с каждым днем ​​это выглядит все менее и менее вероятным.

Использование C (вместо ассемблера или чего-то более высокого уровня) означает предположение, что C - это золотая середина эффективности программиста и производительности компьютера.

Для программ, которые я пишу, дело обстоит иначе: C плохо подходит для программ, которые я хочу написать, и его преимущества перед приличным макроассемблером не так уж и значительны. Программа, которую я пишу прямо сейчас, несложна в моем выбранном HLL, но ее сложность на ассемблере или на языке C будет настолько высока, что она никогда не будет завершена. Я признаю, что достаточно умный программист, у которого достаточно времени, мог бы заставить его работать быстрее на ассемблере или C, но я не такой программист.

11
ответ дан 24 November 2019 в 05:09
поделиться

Большинство сетевых приложений, особенно веб-серверов, гораздо более "привязаны к вводу-выводу", т. Е. Они способны перекачивать данные намного быстрее, чем сеть может их принять. Поэтому то, что высокоэффективно с точки зрения ЦП, не является большой победой, в то время как то, что масштабируется и поддерживается. Таким образом, нет причин принимать недостатки C и терять преимущества управляемой среды, такой как Java, .NET, Python, Perl или других языков.

28
ответ дан 24 November 2019 в 05:09
поделиться

PHP, Python и т. Д. Легко масштабируются, если решить проблему аппаратным обеспечением.

Предположим, что разработка приложения на PHP обходится 1 человеку в 1 год усилий, а разработка приложения на языке C - 3 года (поскольку C требует больше усилий, чтобы сделать то же самое).Это означает, что уменьшенная потребность кода C в оборудовании должна составлять 2 года заработной платы, чтобы C стал привлекательным. На практике этого (почти) никогда не бывает.

Как и в любом правиле, есть исключения. Масштабы Facebook настолько велики, что аппаратные средства обходятся достаточно дорого. Вот почему они разработали HipHop , который кросс-компилирует PHP в C ++. Он сочетает в себе лучшее из обоих миров: простоту программирования на PHP и чистую производительность C ++. Facebook по-прежнему разрабатывается на PHP, но когда вы его используете, это весь собственный код.

0
ответ дан 24 November 2019 в 05:09
поделиться

Еще одним моментом может быть зависимость от платформы. C необходимо скомпилировать в собственный код. Этот код работает не на всех платформах.

Интерпретируемые языки работают везде, где есть интерпретатор. Многие провайдеры, например, предоставляют PHP-интерпретаторы, установленные на своих серверах, но с ОС Windows. Если вы сейчас занимаетесь разработкой на Linux-машине. У тебя проблема.

Конечно, эту проблему можно решить, но вы видите преимущество разработки на PHP в данном конкретном случае.

Надеюсь, это поможет, с уважением domachine

0
ответ дан 24 November 2019 в 05:09
поделиться

"domachine" написал:

зависимость платформы: C необходимо скомпилировать в собственный код. Этот код работает не на всех платформах. Интерпретируемые языки (например, PHP) работают везде, где есть интерпретатор существуют. Конечно, эту проблему можно решить, но вы видите преимущество разработки на PHP в данном конкретном случае.

Вы когда-нибудь задумывались, на каком языке написан переносимый интерпретатор PHP?

В ANSI C.

Итак, прежде чем вы снова откажетесь от переносимости ANSI C, спросите сами на каком языке ваш любимый язык программирования было написано ... (подсказка: почти все написаны на C / C ++).

Компиляторы ANSI C доступны на всех платформах, которые мне приходилось работать над - и то же самое не относится к PHP и его гигантским время выполнения.

Вот и все, что касается аргумента переносимости .

1
ответ дан 24 November 2019 в 05:09
поделиться

Что ж, учитывая тот факт, что веб-разработка - это вопрос наличия полезных библиотек (тех, что используются в PHP), я не понимаю, насколько C бесполезен.

В конце концов, процедурная логика такая же: делать, пока, для, если потом еще и т. Д., Будь то C, PHP, .Net или Perl.

А цикл или тест C написать не сложнее, потому что он написан на C.

Большинство PHP-библиотек написано на C, поэтому аргумент «отсутствующие библиотеки C для Интернета» не выглядит так, как будто очень убедительно.

Я предполагаю, что C не рекламировался как язык веб-программирования популяризаторами Java (SUN) и .Net (MICROSOFT), потому что у них были свои собственные проприетарные (сильно запатентованные) интеллектуальные ресурсы для продвижения для усыновления.

В качестве бесплатного (непатентованного) стандарта C не предлагает никакого «фиксированного» контроля над разработчиками ... отсюда, возможно, тяжелая рука лоббирования в школах и университетах, чтобы убедиться, что деньги налогоплательщиков будут финансировать принятие некачественной технологии, поддерживаемой частными интересами.

Если C достаточно хорош для IBM и MICROSOFT (они не разрабатывают свои продукты на PHP или .Net), но недостаточно хорош для конечных пользователей, то конечные пользователи могут задаться вопросом, почему их приглашают страдать от этой двойной проблемы. стандарт.

2
ответ дан 24 November 2019 в 05:09
поделиться

@Joeri Sebrechts

F.U.D. в действии:

PHP, Python и другие легко масштабируются, решая проблему аппаратным обеспечением.

Вообще-то нет. Они совсем не масштабируются по вертикали и очень плохо масштабируются по горизонтали. См .: http://gwan.ch/en_scalability.html , где объясняется, сколько неприятностей впереди плохие исполнители.

Предположим, что разработка приложения на PHP стоит 1 человека и 1 год, и это стоит им 3 года, чтобы сделать это на C (поскольку C требует больше усилий, чтобы сделать то же самое).

Снова неверно. Если библиотеки PHP были написаны на C, то их можно использовать напрямую. от C - мгновенно обеспечивая «уникальную продуктивность», которую, как вы утверждаете, имеет PHP.

Это означает, что сокращение потребности в аппаратном обеспечении кода C должно составлять 2 года. размер заработной платы, чтобы C стал привлекательным. На практике этого (почти) никогда не бывает.

Чистый F.U.D. (см. ответ выше).

Масштаб Facebook настолько велик, что аппаратные средства обходятся достаточно дорого. Вот почему они разработали HipHop, который кросс-компилирует PHP в C ++. Он сочетает в себе лучшее из обоих миров: простоту программирования на PHP, и чистая производительность C ++. Facebook все еще разрабатывается на PHP, но когда вы его используете, это весь собственный код.

HipHop намного быстрее PHP, в этом нет никаких сомнений.Но если сравнить HipHop с простой реализацией C у вас есть два уровня накладных расходов:

  • интерфейсы PHP-C ++ (которые используют раздутые библиотеки C ++);
  • раздувание самого C ++ (что делает C ++ в 2-10 раз медленнее, чем простой C ).

Кроме того, HipHop был написан в бессознательном и неэффективном академическом режиме. (оторванный от любой реальности реального мира). конечно, это может впечатлить программистов PHP но покажите этот код встроенному программисту, и он пожалеет Facebook.

«Язык, на котором нет всего, на самом деле проще программировать чем некоторые из них »- Деннис М. Ричи

В отличие от (большей части) языка программирования КОНЕЧНЫХ ПОЛЬЗОВАТЕЛЕЙ, Деннис знал пару кажется, о вещах по этому поводу.

5
ответ дан 24 November 2019 в 05:09
поделиться

Хм ...

Кажется, я немного опоздал в этом обсуждении - но я только что обнаружил это сейчас. И я благодарен всем вам за такой большой вклад.

Я автор G-WAN, что дает понять, что я серьезно работал над этим вопросом: G-WAN и быстрее, чем все другие веб-серверы (без обработки) и все остальные серверы веб-приложений (любая обработка, которую вы можете себе представить).

Да, ANSI C также сделал возможным обрабатывать больше статического контента - с менее мощными процессорами (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 native ), время на то, чтобы научиться этому в следующий раз, когда он вам понадобится, все это время лишает вас время, необходимое для решения проблем с вашим приложением.

Я читал (выше), что PHP более краток, чем ANSI C? Зачем тогда использовать "// :: это комментарий ::" вместо "// это комментарий" ? Почему у вас такой дурацкий сложный синтаксис «довольно тысячи»?

Другой обычный аргумент состоит в том, что Java и подобные им предоставляют специальные вызовы для Web-приложений.

Мне не удалось найти ничего, что могло бы избежать HTML в Java, поэтому я написал свою версию:

  // 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 не имеет этого теперь совершенно глупого (устаревшего) требования.

Итак, были ли современные языки столь очевидным прогрессом? Я все еще ищу это.

С уважением,

Пьер.

47
ответ дан 24 November 2019 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: