iodiot ([info]iodiot) wrote,
@ 2008-02-11 22:26:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Entry tags:philosophy, programming, thoughts

Изящный пробел

Если раньше философы обожали выводить из под пера (палки?) трактаты о соотношении материального и идеального, конкретного и абстрактного, задавались вопросами "а есть ли бог в подлунном мире" или "насколько конечно бесконечное", выделяли концепты, строили онтологии… то сегодня новые философы, но уже от программирования, просто завалили резиновый Интернет статьями о менеджменте проектов, применении шаблонов, о разумности использования принципов ООП, о своих языковых предпочтениях и, наконец, о стилях программирования. О последних и поговорим.

Смешно, просто если рассудить, стиль программирования — это всего лишь множество правил по расстановке ‘ ’, ‘\n’ и ‘\t’. Ещё иногда сюда добавляются символы выделения блоков, к примеру, такие как ‘{’ и ‘}’ и правила именования. Но стиль, как известно, конечному компилятору по бую, чего не скажешь о бедных уставших программистах. Я не зря отписал такой витиеватый первый абзац, не зря, потому что тоже прочитал одну статейку о программировании в общем, в которой изобличались лжекодеры, пренебрегающие пробелами и переносами, и фанатики, устраивающие holly-wars на такую тонкую тему как… штиль! И соответственно появилась мысль.

Рассмотрим классический пример:

#include <stdio.h> int main() { int x; scanf(“%d”, &x); if(x>0) printf(“hello\n”); return 0; }

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

Например, я отлично знаю, что подобный код компилятор C/C++ ну никогда не осилит:

if a > b {
a = b;
}

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

if(a > b) a = b;

Пусть теперь данный код не компилируется по причине отсутствия пробела между "if” и ‘(’. Также следует указать, что операторы после условия, даже если он один, следует заключать в блок, ведь мы же знаем чем иногда чревато такое пренебрежение. Другими словами, подобный код должен всегда выглядеть так (иначе минимум warning):

if (a > b) {
a = b;
}

И ничего страшного в этом нет. Это не ущемление прав и не падение демократических устоев, а, как раз наоборот — забота о человеке, который потенциально может заглянуть в твой код. Ведь разве сложно ВСЕГДА константы писать большими буквами, делать соответствующие отступы, давать вменяемые имена переменным, отделять операнды от операторов… Стилевые правила обычно описываются в документации самими же разработчиками того или иного языка. В своё время я проглядел Java и С/С++ code agreements, малость изменил привычки, но всё пошло во благо, честное слово.

Кстати, разработчики языка Python исторические придерживались подобного мнения. Читаем: «Одной из интересных синтаксических особенностей языка является выделение блоков кода с помощью отступов (пробелов или табуляций), поэтому в Питоне отсутствуют операторные скобки begin/end как в языке Паскаль или фигурные скобки, как в Си. Этот «трюк» позволяет заметно сократить количество строк и символов в программе». Пример и вся информация по ссылке.

В живых языках подобные проблемы также имеют место быть. Намедни с [info]miri_on_air как раз разговаривали о полезности/бесполезности буквы Ё. И я не понимаю, зачем её букву Ё выкидывать на помойку, если она минимум улучшает воспринимаемость текста. Тем более в устной речи буква Ё почему-то ж всегда звучит, для чего же тогда это разногласие между письмом и речью? В общем, я за букву Ё на уровне правил по аналогии с вышесказанным.

[update]
Ещё бы не плохо ввести стандраты на смайлики, а то достали ретрограды-скобари с одной ')' и метрограды с расширенной версией в виде ":-)". Шутка, но первый вариант нужно запретить дабы такой частый парад скоб не наблюдать как ")))))))".




(22 comments) - (Post a new comment)


[info]miri_on_air
2008-02-11 10:41 pm UTC (link)
Абсолютно со всем до буквы Ё исключая согласен на 100%. Даже добавить нечего — сам наглотался избыточности пока работал с языками семейства XML, и все грезил "самым железным стилем" — чтоб расстрел за шаг влево/вправо. Я за всеми конечностями.

Буква йо. Ссылаться на Ководство Лебедева — моветон, но я сошлюсь. Ссылаюсь. Это один из параграфов ководства, с которым я совершенно согласен.

Я не предлагаю выбрасывать ё на помойку. Просто предлагаю использовать ее так, как задумывалось изначально — для избежания противоречий. Кстати, пробегись глазами по книгам: в печати такое обращение с буквой Ё — стандарт.

(Reply to this) (Thread)


[info]iodiot
2008-02-12 06:35 am UTC (link)
>> "...в печати такое обращение с буквой Ё — стандарт."

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

(Reply to this) (Parent)(Thread)


[info]miri_on_air
2008-02-12 06:41 am UTC (link)
>> В живых языках подобные проблемы также имеют место быть.

...только не в ту сторону, в которую ты изначально указал: есть достаточно четкое правило насчет употребления Ё, но его нарушают, тыкая еЁ где попало. Но смягчающее обстоятельство в том, что живому языку не нужна формализация — избыточность его как раз только украшает.

(Reply to this) (Parent)(Thread)


[info]iodiot
2008-02-12 06:44 am UTC (link)
Но буква Ё и есть прекрасная избыточность, которая делает язык более живым и насыщенным, Ё.

(Reply to this) (Parent)(Thread)


[info]miri_on_air
2008-02-12 06:47 am UTC (link)
ДаYOшь правомерноYO использованиYO буквы YO!

(Reply to this) (Parent)


[info]miri_on_air
2008-02-11 10:51 pm UTC (link)
>> Этот «трюк» позволяет заметно сократить количество строк и символов в программе

Кстати, спорный момент. А разве три табуляции в начале каждой строки влока в страницу длиной не перекроют собою многократно две фигурные скобки?..

(Reply to this) (Thread)


[info]iodiot
2008-02-12 06:18 am UTC (link)
Вопрос конечно не совсем ко мне. Могу только сказать, что у языка Python есть своя большая аудитория поклонников, значит, такое положение вещей их устраивает. И думаю, что три табуляции — это ещё не самое страшное :)

(Reply to this) (Parent)(Thread)


[info]miri_on_air
2008-02-12 06:27 am UTC (link)
Ну, страшно или не страшно, а экономия в символах была бы как раз если запретить индент пробелами/табами вообще, ставить операторные скобки как в си, но чтоб все IDE под страхом смерти обязаны были рисовать лесенку сами... Я даже уверен, что такой язык существует. Возможно, я даже его знаю, просто забыл.

(Reply to this) (Parent)(Thread)


[info]iodiot
2008-02-12 06:37 am UTC (link)
Хороший стиль обычно не предполагает как раз экономию символов. А подобные IDE — да, есть.

(Reply to this) (Parent)(Thread)


[info]miri_on_air
2008-02-12 06:50 am UTC (link)
Само собой. Но я ж об этом: Этот «трюк» позволяет заметно сократить количество строк и символов в программе.

(Reply to this) (Parent)


[info]sharpc
2008-02-12 12:22 am UTC (link)
Надо юзать indent и не париться. Я пытаюсь оформлять свой код семантическим стилем, когда то или иное выравнивание выбирается, исходя из важности этого куска, его легкочитаемости и легкопонимаемости. Например,
x1 = (-b + sqrt(b*b - 4*a*c)) / (2*a)
а не
x1=-b+sqrt(b*b-4*a*c)/2/a
или
x1 = ( -b + sqrt( b * b - 4 * a * c ) ) / ( 2 * a )

(Reply to this) (Thread)


[info]iodiot
2008-02-12 06:16 am UTC (link)
Ну а стиль оформления конструкций if, for, while ты тоже выбираешь таким образом? А именование переменных?

(Reply to this) (Parent)(Thread)


[info]sharpc
2008-02-12 11:10 am UTC (link)
В целом да. В моем коде встречается и
if(...) ...
, и
if( ... ){ ... }
, и т.п.
KMegaClass
спокойно соседствует с
i, j, a, b, c
и
getAdapter
.

(Reply to this) (Parent)


[info]technocrator
2008-02-12 03:54 am UTC (link)
Про Ё - абсолютно согласен. Не надо калечить русский язык.
Про жёсткие стандарты в кодировании - так сразу не скажу... Во всяком случае, не лишено смысла.
Но это только в отношении новых языков. Понятно, что вводить такое по отношению к уже существующим, на которых написаны миллионы строк кода - нереально.

(Reply to this) (Thread)


[info]iodiot
2008-02-12 06:21 am UTC (link)
Ну можно ввести это на уровне IDE. К примеру, Eclipse написанный Java-код достаточно хорошо подгоняет под стандарты, но не идеально.

(Reply to this) (Parent)


[info]amikhailov
2008-02-12 06:17 am UTC (link)
Стандартам кодирования быть! Другое дело, что в каждой компании они свои. Вот ежели бы можно было настраивать компиляторы и интерпретаторы, чтобы они выбрасывали ошибки, когда разработчик написал все в одну строку или не удосужился прокомментировать сложный участок кода... Ах, ах, мечты )

(Reply to this) (Thread)


[info]iodiot
2008-02-12 06:19 am UTC (link)
Пора собирать подписи и писать ноту :)

(Reply to this) (Parent)


[info]r0l
2008-02-12 05:30 pm UTC (link)
Согласен. Из этой темы ты мог изящно вырулить к задаче Тьюринга и аргументу Гёделя, кстати, легло бы красиво. Но, видимо, у тебя были иные цели.

Про букву Ё все сказал [info]miri_on_air, и позор ссылки на 119 параграф тЁмы Лебедева он тоже взял на себя, так что тут я ничего не добавлю, кроме своего согласия. То есть, буква нужная, но очень редко нужная и заменяемая вполне.

(Reply to this) (Thread)


[info]iodiot
2008-02-12 05:43 pm UTC (link)
Честно говорю, маршрут выруливания к Гёделю и Тьюрингу как-то не сильно представляю в данном случае. Подскажешь?

(Reply to this) (Parent)(Thread)


[info]r0l
2008-02-12 06:14 pm UTC (link)
Из проблемы формализованности любых компьютерных систем - к вопросам истинного искусственного интеллекта... Как печень отпустит (см. мой последний пост), откопаю ссылки и приведу аргументацию. Сейчас состояние не позволяет, пишу через слезы на глазах, буквально.

(Reply to this) (Parent)


[info]juri_jurta
2008-02-21 12:59 pm UTC (link)
Как это ни парадоксально выглядит, но, например, в Лиспо-подобных языках наиболее регулярная структура среди всех языков программирования достигается избыточностью скобок.

Кстати, я поддерживаю использование незаслуженно притесняемой буквы Ё. Я думаю, она не избыточна.

(Reply to this) (Thread)


[info]iodiot
2008-02-21 03:54 pm UTC (link)
Да-а-а, Lisp я никогда не забуду... скоба на скобе.

(Reply to this) (Parent)


(22 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…