четверг, 11 июля 2013 г.

Немного мыслей о языках программирования



Есть такая штука - естественный язык. Википедия определяет его как язык для общения людей, не созданный целенаправленно.

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

Словом, то, что в моём сознании стоит за "естественным языком", это язык, служащий для выражения мыслей и идей общего назначения. Это бытовые мысли: "хочу есть", "как пройти в библиотеку", это художественные произведения, это философские трактаты, это вообще научные произведения в гуманитарных науках, да и в какой-то мере в естественных и абстрактных тоже - хотя там встречаются и другие языки.

Причём, у естественных языков есть правила. Синтаксические (грамматические), семантические, прагматические. При том, что адресат языка допускает широкие отклонения от правил без потери передаваемой мысли, тем не менее, это поглощает дополнительные ресурсы считывателя на отсеивание этих помех. Когда отступлений от правил немного (запятая там, не та гласная здесь), это ещё не так заметно, но когда их много, и хуже того, в пределах грамматической, семантической и прагматической норм находится отличная от желаемой трактовка - возникает коллизия и адресат высказывания вынужден как-то эту коллизию решать. Если же информации для решения коллизии недостаточно, приходится даже запрашивать дополнительную информацию - переспрашивать. Синтетический пример: "Простите, а где вы пропустили запятую в "Оставаться в школе не разрешаю никому покинуть помещение."?".

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

А вот есть такая область человеческого знания, как музыка. Для того, чтобы записывать музыкальные мысли и идеи есть язык. И этот язык - ноты. Музыканты как-то договорились его использовать и очень довольны. На самом деле, музыкальную идею можно рассказать и на естественном языке. Но там будет довольно плохое соотношение "сигнал-шум". Этот язык относится к категории "формальных", что в бытовом понимании означает всего лишь более строгие правила. Более формальная трактовка понятия "формальный язык" говорит, что это множество конечных цепочек над конечным алфавитом, порождённых некоей, опять-таки, формальной структурой (грамматикой, БНФ-конструкцией или вообще конечным словарём), что тоже намекает нам, что он менее свободен, чем естественный. За счёт большей ограниченности исчезают коллизии (в естественном языке коллизии можно уменьшить избыточностью, именно поэтому на любом формальном языке идея занимает меньше места), то есть, исчезает необходимость переспрашивать и вероятность быть неправильно понятым. При этом, адресат языка всё ещё человек, и он всё ещё может иногда правильно понять идею, даже если она изложена с нарушением правил нотной грамоты. Однако в лучшем случае это вызовет у него раздражение, в худшем же будет потерян смысл.

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

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

Не так. Программы пишутся для людей. Об этом говорят хотя бы отступы и выравнивание, которые большинство языков программирования игнорируют. И ваш браузер, в котором вы это читаете, допускает большое количество отклонений от нормы html, пытаясь донести высказанную человеком мысль до другого человека - вас.

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

Опять-таки, есть масса не синтаксических правил в компьютерных языках, на которые компьютеру наплевать. Про отступы я уже говорил, но есть ещё именование идентификаторов, предельная сложность одной единицы кода, шаблоны проектирования, уровни доступа, запахи кода, парадигмы (функциональное / объектное / аспектное программирование), мутабельность-иммутабельность... Которые важны исключительно людям.

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

А выводов два.

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

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

P.S. На картинке сверху Чарль Сандерс Пирс, основоположник семиотики.