Изначально это было одно из моих сообщений в рассылках ALTLinux
AM> Т.е. ваше мнение что на Си нужно (и достаточно безопасно) писать
AM> только системное ПО (модули, ядра, драйвера)? А приложения (и уж
AM> тем более взаимодействующие с интернет) на чем-то ином?
Именно так.
AM> А на чем тогда
Хоть на Visual Basic. Я абсолютно серьёзно.
Если совсем серьёзно, то при программировании по Windows лучше всего использовать любой. NET язык, а при портабельном программировании либо Java (из распространённых), либо, что гораздо лучше, Tcl.
AM> (вроде тотже апач, mysql, squid на Си и писаны)?
Ну и светятся в багтраке с завидной периодичностью. И будут светиться всегда. Просто потому, что при программировании на C нужно иметь очень высокую квалификацию, и требуемая квалификация растёт экспоненциально с ростом программы. Притом затраты на организацию совместной разработки тоже растут нелинейно.
Кстати апач, mysql и squid не совсем прикладные программы всё-таки, и при их написании вставки кода на си отнюдь не помешают (особенно это касается апача и сквида).
SQL-сервер можно и нужно писать на языках вроде OCaml, ибо бОльшая часть нагрузки на процессор это:
Всё это прекрасно оптимизируется. Я не удивлюсь если движок типа SQLite,
написаный на OCaml, окажется:
Но это всё _сейчас_ имеет смысл только в mission critical приложениях. Просто потому, что хороших программистов на языках отличных от C и жабы за разумные деньги найти сложно, и они _потребуют_ великолепной зарплаты, соц программ, хорошего менеджмента. Далеко не всегда руководство просто достаточно квалифицировано, чтобы создать такие тепличные условия (дело не в деньгах даже, программисты за 2–3k$ реально дешевле программистов за 500–1000$).
Поэтому:
интерфейс — пишется на Tcl (превосходная переносимость, элементарно
сам встраивается в программы на других языках, а также в него легко
встраиваются модули).
логика — зависит от её объёмов, в порядке убывания: OCaml, Tcl, Java, C
вещи, требующие максимальной производительности — OCaml, C, Java
Ну и далее смотреть и смотреть по ситуации.
Главный принцип программиста — лень.
Второй главный принцип — «разделяй и властвуй»
Если код можно не писать, а лицензировать — он лицензируется. Если код можно не писать, а взять готовую библиотеку и написать вокруг обёртку — так и делается. Если код не является тем, ради которого покупается написаный продукт — код продвигается в виде правок к используемым библиотекам (пусть другие люди, которые лучше знают эту сферу, занимаются его поддержкой).
В случае свободных программ не зазорно использовать в качестве _расширений_ проприетарные библиотеки (IMHO). Например написать патч к mplayer, который бы использовал Intel'овские примитивы для DSP _если они есть у пользователя_ было бы полезно (это как пример).
Ну и следует понимать, что написаное выше есть всего лишь результат _моего_ весьма небольшого опыта в IT — я знаю меньше десятка языков программирования и практически не владею функциональным программированием, а значит уже большую часть возможностей попросту не вижу. Посему каждый раз надо внимательно обследовать сферу, для которой пишется программа, и искать наилучший инструмент. После чего садиться, и изучать этот инструмент.
Скажем пример — пишется приложение. Приложение должно быть _очень_ масштабируемых (грубо говоря от сотового телефона до мейнфрейма). Какой язык будет выбран? Java. Просто потому что это «политика партии» и в этом случае можно получить больше поддержки, больше кода будет написано сторонними разработчиками.
Или смотреть что нужно пользователю. Скажем _сейчас_ производительность находится чуть ли не на последнем месте по важности, а _безопасность_ на первом. Поэтому выбирая интерпретируемые языки программирования, или языки вроде OCaml, где написание кривого кода несколько усложняется, можно получить преимущество на рынке за счёт большей надёжности и более быстрого добавления новой функциональности.
В любом случае, надо действовать осознанно — где приоритет «плыть туда
же, куда main stream», где «плаву не туда, куда плывёт течение, а туда,
куда я хочу», где ориентироваться на дешивизну разработчиков, а где на
качество результата.
Если же вопрос в плане «чему учиться?» то я рекомендую:
Стоит обратить внимание на Lisp — так говорят умные люди, которым я доверяю. Времени пока не нахожу.
Самый главный недостаток C — ASCIIZ-строки:
Второй недостаток — адресная арифметика. Это мощнейший инструмент для специалиста (коих по сравнению с общим количеством программистов на C в лучше случвае 1:100), а для человека, который не понимает до конца как это работает, это хороший способ сделать ненадёжную программу.
Третий недостаток — невозможность ни в С, ни в С сделать по-настоящему хорошую сборку мусора. Собственно это одна из причин, почему многие современные программы требует несоизмеримое задачам количество памятью: просто в C и C не так уж и легко с ней работать.
Обсудить статью можно здесь
(C) Denis Smirnov 15 Aug 2004
так как статья находится в разработке, её копирование на другие сайты запрещается