> А что если я буду утверждать, что абсолютно все ошибки, связанные с > переполнением буфера, прорыва программного стека и нарушением границ памяти связаны напрямую > с особенностями реализации языка программирования высокого уровня C и C++ в > частности? Заметьте: не низкоуровневая реализация среды исполнения, ни компилятора, а > именно самого ЯВУ. Что вы на это скажете? "Писать надо уметь, > тогда и ошибок не будет"? Не возражу. Трудно возразить на то, > что НЕ_ПОДДЕРЖИВАЕТ хотя бы минимальный уровень качества программирования, как это делает > Java. В данном случае не "не поддерживает" а предоставляет больше возможностей, имеет большую гибкость. Поэтому их и используют как основной язык для системных приложений. Заметьте, все языки, которые обладают эффектом "синей бороды" (что разрешено - используй, а что нет - сразу по рукам) используют только на прикладном уровне. Потому что когда идет нестандартное окружение сразу появляются костыли, позволяющие обойти ограничения языка (например, попробуйте в Perl распарсить бинарный блоб известной вам структуры только средствами языка, не используя unpack). Как вы правильно указали, "Писать надо уметь" (притом это относится ко всем языкам), особенно если язык предоставляет эту возможность. Например в С++ есть очень хорошая концепция RAII. Даже просто следуя ей, можно забыть про сборщик мусора, так как эта работа ложится на компилятор. Так что еще раз повторюсь - тут вопрос только том, насколько человек владеет выбранным инструментом.
|