C++ulture
АрхивЧто такое хороший язык программирования и каким он должен быть? Всякое люди говорят: тут тебе и дуракоустойчивость (прошу прощения, «защита от новичка»), и Тьюринг-полнота, и формализуемость, и еще 1024 критерия.
Что такое хороший язык программирования и каким он должен быть? Всякое люди говорят: тут тебе и дуракоустойчивость (прошу прощения, «защита от новичка»), и Тьюринг-полнота, и формализуемость, и еще 1024 критерия. Ерунда! Все нижеследующее прошу рассматривать как эссе в вольном стиле, а не научную статью.
Бывают языки красивые, бывают строгие, бывают такие, которым легко обучиться, и такие, на которых легко писать. Их не используют.
Бывают такие, в которых черт ногу сломит, — и на них пишет полмира1, но никто не любит.
Бывают языки сложные и неочевидные: чтобы писать на них хорошие программы, нужно учиться несколько лет и прочесть кучу книг. В них влюбляются, им посвящают стихи, о них спорят до хрипоты, визга и метания в собеседника банановой кожуры.
Я — программист. Я знаю пять языков — и верен одному. Я прочел два десятка книг только об этом языке — а хотел бы две сотни. Я могу математически доказать правильность своей программы — и скрещиваю пальцы на удачу, когда запускаю программу на компиляцию. Я могу переписать одну строку восьмью разными способами — но работает только девятый. Я безнадежен.
Один мой коллега (и все профессора в моем институте) верит, что главное — это научиться программированию. Мол, человек, умеющий программировать вообще, за пару недель освоит новый язык и будет писать на нем великолепные программы. Поэтому в университетских курсах — огромное количество сухой2 теории, а языки преподаются на уровне пресловутого «Хелло, Ворлд». Но это все равно что научить стихосложению вообще — а потом студент за пару недель осваивает финский или хинди и выдает первоклассные стихи, входит в историю поэзии и энциклопедический словарь. Абсурд!
Каждый язык программирования — из тех, в которые влюбляются, — порождает свою культуру. Совершенно так же, как человеческий язык. У него есть свой букварь3. Но это — только самое-самое начало. Есть лексика — и даже нецензурная4 (как и в естественном языке, иногда она бывает к месту). Есть синтаксис. Это всё вещи понятные, относительно легко изучаемые и относительно легко формализуемые. Именно поэтому можно автоматизировать проверку синтаксической и лексической правильности как программы, так и данной статьи.
Но и это всё — лишь начало. Ни «Война и мир», ни «безбашенная» проза Харуки Мураками, ни Linux не являются математически стройными системами. Их нельзя назвать написанными «правильно» или «неправильно». Более того, и то, и другое, и третье можно было написать несчетным5 количеством способов — но написаны (и ценны) они именно такими.
Нельзя «научить» писать эпиграммы, сказки или статьи, которые нравятся редакторам «Компьютерры». Каждое произведение — это результат творческого переосмысления опыта предыдущих поколений + немножко вдохновения + владение языком + собственный стиль. Нельзя научить писать программы на C++ — это результат (см. выше).
У C++ есть свои идиомы — краткие, но очень емкие конструкции. Есть традиции — и возможность плевать на них. Есть свобода выбора стиля. Есть возможность разными словами написать одну и ту же фразу. Есть классика — и есть классики: Бьярн Страуструп, Джефф Элджер, Герб Саттер, Николай Джосаттис. На этом языке можно сказать двусмысленность — и не получить линейкой по рукам от компилятора6. Здесь есть место творчеству, здесь есть место спорам, здесь есть место 48-часовым марафонам по отладке программ. Есть тонкости, доступные только снобам. Здесь нет только одного — места, где можно было бы остановиться и сказать: всё, ничего нового для меня в этом мире не осталось.
Поймите меня правильно: пользователю, в общем-то, плевать, на каком языке написана программа и насколько освоился в этом языке ее автор. В отличие от написания текстов, в программировании конечный продукт очень слабо связан со стилем и культурой автора текста7. Тем не менее, программа, которой «еще жить и жить» от версии к версии, просто обязана быть красивой — а не то в следующей версии никто уже не поймет, куда там дописывать новый кусок и почему старый до сих пор работает и «черт побери, кто вообще это писал?!» Но я вам другое скажу: программа, написанная с любовью и вдохновением, все же немножко другая. Не такая, как вышедшая из-под клавиатуры человека, любимая фраза которого: «Надо сидеть и педалить код».
Поймите меня правильно еще раз. С++, будучи изначально и по определению промышленным языком, является крайне неудачным выбором для промышленного производства. Там нужен язык другой — пригодный для производства штампованных программ штампованными программистами. Язык, который подразумевает только один вариант выражения мысли. Язык, на котором десять разных программистов по одному и тому же заданию напишут практически идентичный код8. Язык, в котором шаг влево, а равно и шаг вправо просто нельзя выразить средствами языка.
Язык, который никто и никогда не будет любить.
Я — программист. Мой любимый язык — С++. Это отвратительный язык. Я могу сказать на нем любую глупость. Мне не помогут и двести книг. Девятый вариант строчки тоже не сработал. Я безнадежен.
1 Программистского мира, естественно, раз уж мы о языках программирования.
2 Ну ладно — полусухой.
3 Кафедра программного обеспечения, курс «Язык С++», 48 часов. © расписание 2-го курса.
4 Скажите любому опытному программисту на С++ магическое слово goto. Только с безопасного расстояния.
5 В математическом, а не поэтическом значении этого слова.
6 …а потом трое суток искать, почему программа вылетает, когда i=17.
7 Разумеется, связан сильно, но совсем неочевидно для конечного потребителя.
8 Кстати, это уже шаг в сторону автоматической генерации программ или «Цель деятельности всех программистов — чтобы их деятельность стала не нужна».