C++ulture
АрхивМненияЧто такое хороший язык программирования? Всякое люди говорят: тут и дуракоустойчивость, и Тьюринг-полнота, и формализуемость, и еще 1024 критерия. Ерунда!
Что такое хороший язык программирования и каким он должен быть? Всякое люди говорят: тут тебе и дуракоустойчивость (прошу прощения, "защита от новичка"), и Тьюринг-полнота, и формализуемость, и еще 1024 критерия. Ерунда! Все нижеследующее прошу рассматривать как эссе в вольном стиле, а не научную статью.
Бывают языки красивые, бывают строгие, бывают такие, которым легко обучиться, и такие, на которых легко писать. Их не используют.
Бывают такие, в которых черт ногу сломит, - и на них пишет полмира (программистского, естественно, раз уж мы о языках программирования), но никто не любит.
Бывают языки сложные и неочевидные: чтобы писать на них хорошие программы, нужно учиться несколько лет и прочесть кучу книг. В них влюбляются, им посвящают стихи, о них спорят до хрипоты, визга и метания в собеседника банановой кожуры.
Я - программист. Я знаю пять языков - и верен одному. Я прочел два десятка книг только об этом языке - а хотел бы две сотни. Я могу математически доказать правильность своей программы - и скрещиваю пальцы на удачу, когда запускаю программу на компиляцию. Я могу переписать одну строку восьмью разными способами - но работает только девятый. Я безнадежен.
Один мой коллега (и все профессора в моем институте) верит, что главное - это научиться программированию. Мол, человек, умеющий программировать вообще, за пару недель освоит новый язык и будет писать на нем великолепные программы. Поэтому в университетских курсах - огромное количество сухой теории, а языки преподаются на уровне пресловутого "Хелло, Ворлд". Но это все равно что научить стихосложению вообще - а потом студент за пару недель осваивает финский или хинди и выдает первоклассные стихи, входит в историю поэзии и энциклопедический словарь. Абсурд!
Каждый язык программирования - из тех, в которые влюбляются, - порождает свою культуру. Совершенно так же, как человеческий язык. У него есть свой букварь (Кафедра программного обеспечения, курс "Язык С++", 48 часов). Но это - только самое-самое начало. Есть лексика - и даже нецензурная (скажите опытному программисту на С++ магическое слово goto, только с безопасного расстояния) - как и в естественном языке, иногда она бывает к месту. Есть синтаксис. Это всё вещи понятные, относительно легко изучаемые и относительно легко формализуемые. Именно поэтому можно автоматизировать проверку синтаксической и лексической правильности как программы, так и данной статьи.
Но и это всё - лишь начало. Ни "Война и мир", ни "безбашенная" проза Харуки Мураками, ни Linux не являются математически стройными системами. Их нельзя назвать написанными "правильно" или "неправильно". Более того, и то, и другое, и третье можно было написать несчетным (в математическом, а не поэтическом смысле этого слова) количеством способов - но написаны (и ценны) они именно такими.
Нельзя "научить" писать эпиграммы, сказки или статьи, которые нравятся редакторам "Компьютерры". Каждое произведение - это результат творческого переосмысления опыта предыдущих поколений + немножко вдохновения + владение языком + собственный стиль. Нельзя научить писать программы на C++ - это результат (см. выше).
У C++ есть свои идиомы - краткие, но очень емкие конструкции. Есть традиции - и возможность плевать на них. Есть свобода выбора стиля. Есть возможность разными словами написать одну и ту же фразу. Есть классика - и есть классики: Бьярн Страуструп, Джефф Элджер, Герб Саттер, Николай Джосаттис. На этом языке можно сказать двусмысленность - и не получить линейкой по рукам от компилятора (...а потом трое суток искать, почему программа вылетает, когда i=17). Здесь есть место творчеству, здесь есть место спорам, здесь есть место 48-часовым марафонам по отладке программ. Есть тонкости, доступные только снобам. Здесь нет только одного - места, где можно было бы остановиться и сказать: всё, ничего нового для меня в этом мире не осталось.
Поймите меня правильно: пользователю, в общем-то, плевать, на каком языке написана программа и насколько освоился в этом языке ее автор. В отличие от написания текстов, в программировании конечный продукт очень слабо связан со стилем и культурой автора текста (разумеется, связан сильно, но совсем неочевидно для конечного потребителя). Тем не менее, программа, которой "еще жить и жить" от версии к версии, просто обязана быть красивой - а не то в следующей версии никто уже не поймет, куда там дописывать новый кусок и почему старый до сих пор работает и "черт побери, кто вообще это писал?!" Но я вам другое скажу: программа, написанная с любовью и вдохновением, все же немножко другая. Не такая, как вышедшая из-под клавиатуры человека, любимая фраза которого: "Надо сидеть и педалить код".
Поймите меня правильно еще раз. С++, будучи изначально и по определению промышленным языком, является крайне неудачным выбором для промышленного производства. Там нужен язык другой - пригодный для производства штампованных программ штампованными программистами. Язык, который подразумевает только один вариант выражения мысли. Язык, на котором десять разных программистов по одному и тому же заданию напишут практически идентичный код. Язык, в котором шаг влево, а равно и шаг вправо просто нельзя выразить средствами языка.
Язык, который никто и никогда не будет любить.
Я - программист. Мой любимый язык - С++. Это отвратительный язык. Я могу сказать на нем любую глупость. Мне не помогут и двести книг. Девятый вариант строчки тоже не сработал. Я безнадежен.
- Из журнала "Компьютерра" от 08 июня 2004 года.