Почта и документооборот. Домены хостинга reg ru – мечта креативщиков

Программирование рассматривается как процесс создания компьютерных программ. Слово процесс в этом определении не лишнее. Обычно рассуждают в духе «посмотрите, какую замечательную структуру данных можно описать на данном языке программирования». Философия программирования подразумевает оглянуться по сторонам, да и в глубь копнуть.

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

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

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

Например такая история:

пытаясь раскрасить карту округов Англии, Францис Гутри сформулировал проблему четырёх красок, отметив, что четырёх цветов достаточно, чтобы раскрасить карту так, чтобы любые два смежных региона имели разные цвета. Его брат передал вопрос своему учителю по математике, Огастесу де Моргану, который упомянул о нем в своём письме Уильяму Гамильтону в 1852 году. Артур Кэли поднял эту проблему на встрече Лондонского математического сообщества в 1878 году. В том же году Тэйтом было предложено первое решение этой задачи.

Понимаете? Социальное измерение. То есть вы учите не только код, но вы и знаете имена тех кто этот код придумал, вы не изучаете просто язык Си, но и историю его создания. Это даёт возможность двигаться дальше в исторической перспективе, даёт вам возможность осознать своё местонахождение в социальной структуре и найти где приложить свои силы в новом для всего человечества направлении. Русские постоянно изобретают новые языки программирования и алгоритмы, с этим нет проблем, просто из-за незнания истории и философии программирования вы изобретаете то, что уже изобретено. Либо, что ещё хуже вы изобретаете что-то новое, но не имеете понятия, куда это деть, какому «Лорду Гамильтону» написать о своей работе, и на каком «заседании лондонского клуба» зачитать доклад. Доклад-то вы напишете, и он, скорее всего, будет совершенен с технической точки зрения.

Хотя системная инженерия подразумевает анализ и постановку задачи перед собственно проектированием, алгоритмированием, разработкой структур данных, кодированием и отладкой, но задачу-то ставит заказчик. Заказчик это «Господь Бог» в философии программирования, он не осмысляется, поскольку не может быть осмыслен, он - абсолют и высшая сила. Можно только осмыслять его отдельные указания и жаловаться на несовершенство «божьих творений». Сами отношения программиста и заказчика в учебнике по Java не поднимают, это марксизм или протестантская этика: метафизика подчинения и обусловленность материальными ценностями. В Америке есть класс «супер программистов», «старт-аперов», люди не имеют заказчика, они знают жизнь настолько, что сами могут увидеть потребности. То есть он не сидит и не ждёт пока некто, кто в жизни разбирается лучше него, придёт и скажет ему, что ему делать, он сам осмысляет жизнь и находит куда двигаться чтобы заработать и реализоваться как деятель. Не пишет программу, которую люди запрашивают, а сам создаёт запрос и сам же его удовлетворяет. Был ли запрос на iphone когда Джобс его придумал? Или Джобс создал сам запрос?

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

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

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

Соответственно плюрализм в выборе ЯП, среды разработки, фреймворка, это тяготение к одному полюсу. А желание пользоваться таким-же ЯП, фреймворком, что и многие другие люди - это коллективизм, проявление атомизации, отчуждения. Программист очень одинок и одновременно перегружен общением. Это непаханое поле для исследований. Высшая нервная деятельность, работа со структурами и текстом, изучение языков - и это как обычная ежедневная деятельность. Программист удивил бы людей девятнадцатого века ёмкостью и силой своей мысли. Он бы удивил и людей двадцать первого, если бы мог с ними общаться на том уровне на котором он ежедневно работает. Тем удивительнее слепота программиста. Программиста часто отличают по внешнему виду. И это не дресс-код, человек просто не обращает внимания как выглядит и во что одет. То есть он знает что на нём одето, но почему именно оно или даже как оно правильно называется это для него далёкий космос. Вы знаете чем свитер от пуловера отличается? Джемпер от кофты? А зачем мне?

Программист это как раб лампы, как батарейка матрицы - если он вдруг начнёт применять свой мозг, свои невиданные способности по оперированию языками, логикой, работой с объёмами данных в обычной жизни - он может стать тем самым одноглазым, который король в стране слепых. Свитер облегает шею и тело, пуловер имеет широкое отверстие чтобы его было удобнее натягивать (pull-over), кофта имеет пуговицы. У джемпера вместо широкого отверстия застёжка. Это элементарно, можно написать в одну строчку кода. Но программисту не понятно одно, что эта информация, это не про одежду, это - часть описания жизни. Правда европейцы часть отличаются, есть культура программировать жизнь, особенно у англичан. Давно они открыли, что можно написать какое-то письмо, например «высылаю вам три мешка сукна, вышлите мне шесть золотых» и вдруг это можно повторять снова и снова и появляется возможность управлять жизнью просто сидя за своим рабочим столом и сочиняя письма. Венеция, Ганза, Кембрия. Это качество унаследовали и американцы, и поскольку они же полюбили и компьютеры и программирование они вышли на недосягаемый уровень. Они видят третий вектор программирования: любой код, любая программа программирует не только компьютер, не только процессор, но и пользователей.

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

Трёхнаправленное программирование. Компьютер, программист, пользователь. Невозможно внести изменения в код, не внеся изменения в будущее пользователя и программиста. Но можно об этом не думать. Так проще. Не думать - всегда проще. Человек из всех входных сигналов предпочитает принимать те, которые не требуют осмысления, а лишь ощущения. Вкус пива, чистая рубашка, похвала, или даже оскорбления и наезд начальства. Из этих эмоций далее следует эмоциональное принятие решений. Приятный фреймворк. Идиотский язык программирования. Тупой коммент. Классная статья. У меня возникла идея написать свою реализацию b-trees. Почему? Ну понравилась идея. Общение программистов, самых логически занятых сознаний, сводится к обмену эмоциями. Это два бурлящих потока, сталкиваются, отталкиваются, создают вихри - как же они вообще могут программировать? Очень просто, после часа эмоций они расходятся чтобы читать книги. Тут включается мысль. Киньте ссылку, я почитаю. Мне понравилось, есть что-нибудь почитать по этой теме? Две жизни. Программист особенно интересен тем, что для него даже кодирование это эмоциональное занятие, он бросает свои чувства в холодный экран, он пытается почуять логику и оформить себя как разум в результате. Русским программистам это особенно свойственно, а не свойственно им - рассуждать, тем более вслух, тем более письменно. Более того, человек способный рассуждать о своём проекте вызывает недоверие - он кажется вруном, который вместо того, чтобы смотреть в код, осознавать структуру алгоритма, почему-то думает о социальных проявлениях, пиарится, - сказки про Эльбрус и Фантом.

Поэтому в России нет Open Source. Потому что опенсорс это не умение программировать, это умение общаться. Это знание истории программ и программистов. Вы можете выложить на гитхаб своё творение, и даже написать к нему статьи и инструкции, но некому этого будет читать. Или они прочитают и напишут «хочу присоединиться к проекту, только не знаю, что делать». «Студент, немного знаю Яву, очень интересный проект, скажите, что делать». Почему американский студент «знающий Яву» сразу знает, что делать? Почему он может создать один опенсорс проект и присоединится к другому? Вопрос более социальный чем философский, наш социум в другом состоянии. Но философу ясно, - человек не осознаёт себя. Как говорит Гузеева в «Давай поженимся» - «ничего про себя не понимает». Он сидит в своей комнате за компом, мама ему говорит, «ну что ты у меня такой к жизни неприспособленный». «Ой, отстала бы ты, сама что ли умная». Но мама умная, это ты дурак. Точнее у неё другие входные сигналы, ты смотришь в монитор, она смотрит по сторонам. Даже отставая интеллектуально, в навыках логики и работы с информацией, наличие обширных входных сигналов из жизни, о людях, о взаимоотношениях - делает человека понимающим жизнь лучше программиста.

Мама не дура, даже по одежде и тарелкам может твоё будущее предсказать не зная асинхронной обработки данных. Это не сложно, и ты бы мог, если бы смотрел на социум и знал язык описания и программирования. По инстанциям похлопотать. Растёт ценный кадр. Толковый парень появился. Выправить документы. Начальство приметило. Это API. Ничего сложного. Программисты могут и должны править миром. Но, пока что, только небольшой слой американских программистов это понял. Гейтс понял, что программа может глючить когда её инструкции выполняются в компьютере, но она не должна глючить, когда её инструкции выполняет пользователь. Это не только цинизм, это понимание своей роли, это исследование поведения, это изучение API пользователя и всего общества. Нажми сюда, что будет если пользователь нажмёт эту кнопку? А если тут введён текст, как сделать, чтобы он ввёл текст и сюда? Открылось окно выбора файла, в какой папке по умолчанию оно должно быть открыто? Сколько часов вы потратили на отладку кода, почему вы не потратили в десять раз больше изучая поведение пользователя? Гейтс потратил.

Люди записывают на видео поведение пользователя за программой, причём с момента входа в комнату. Самое смешное, что эти люди это не программисты, это приглашенные люди - социологи, даже дрессировщики. Они сидят и выполняют работу, которую по идее программист должен выполнить эффективнее, ведь это отладка кода. Вносятся изменения. Но программа работает не быстрее после этих изменений, она может быть работает медленнее и чаще глючит, в процессоре, на компе глючит, но в поведении пользователя она работает лучше, он быстрее выполняет операции (performance), чаще достигает цели (debug), он доволен (energy saving). Он платит в конце концов. Всё, что делал Джобс - это программирование пользователя. Как он к этому пришёл? культура окружения? наркотики? личный талант? Философия. Канты-гегели, Гуссерли-расселы, Витгенштейны-сартры, тысячи их. Они создали немало языков для описания реальности и API для её осмысления. Большинство умных слов которыми мы пользуемся интуитивно, было ими некогда введено и сформулировано. Нельзя употреблять слово «культура» и думать о консерватории, говорить «консерватория» и не знать, что это в первую очередь система преподавания и отбора преподавателей. Консервативная и консервирующая опыт. Для программиста, всё чем он пользуется взялось из ниоткуда. Умные люди разберутся, преподы в универе есть для этого.

Кстати, преподаватель программирования обычно не умеет ни программировать, ни преподавать. Отдельная песня, так вышло, Сталин направил миллионы дремучих крестьян учиться инженерии, сейчас аналогичное происходит в Индии. Три миллиона выпускников ежегодно. Понятно, что люди стремятся стримлайнить преподавание, выкидывают всё лишнее. Зачем вам это знать, вы это учите - пригодится. История опытов Максвелла, очень увлекательна, но вам некогда её учить, вы выучите сразу уравнение Максвелла. Ну вы хоть скажите студентам, что до Максвелла не было ничего, после него уже наука об электричестве была развита. Какой пример для программистов! Нет ничего - что-то есть. Хотя бы расскажите как Страуструп и Торвальдс работали. Как из ничего, получается что-то. То есть преподаватель, так же философски дремуч, как и студент.

Вы смеётесь, что американцы не могут на глобусе найти Ирак. А вы над собой посмейтесь, вы можете на глобусе истории логики найти Гегеля? Вы пользуетесь BASH, вы знаете, кто и когда его создал и как он осмысляет своё творение по прошествии десятков лет? Вы знаете почему терминал называется терминал? Как он связан с телетайпом? Вы знаете, что компания IBM делала перепись населения в США более ста лет назад на деньги центробанка, а потом поставила эти механические компьютеры Гитлеру? Вы представляете, что устройство и терминология баз данных ведёт историю от тех перфокарт, а они от каталогизаторов привезённых из Англии в начале девятнадцатого века? Вы знаете как создатель Atari Бушнел не понял идеи своего работника Джобса? Вы хотя бы представляете роль Atari в истории вычислительной техники? Кто кого скопировал Atari или Sinclair? Мало знать устройства и их историю, надо в первую очередь знать людей, мысли и их историю. Отец Гёделя был священником, а отец Святого Франциска был банкиром и торговцем. Что такое львовско-варшавская школа логики?

Ну ладно, это ваше трёхнаправленное программирование, понятно, надо знать не только код и язык программирования, но и историю языка, знать себя и пользователя и историю и языки, ну а как же отладка? А что отладка? Зачем вообще нужен отладчик? Просто вы ещё не умеете мыслить, вы всё ещё реагируете и ждёте подсказок, вы не понимаете свою программу, вы останавливаете её и ждёте, что отладчик вам что-то покажет. Тогда, надеетесь вы, в голове появятся идеи. «В вашем отладчике неудобно ставить брэкпойнты.» Метапрограммирование это когда программа создаёт программу, тоже своего рода рекурсия. Так же и программа может дебажить программу, мета-отладка, но для этого программист должен быть в два раза умнее, он должен удерживать в голове сразу две программы. Люди которые используют printf() и смеются над отладчиками, просто лучше понимают, что делают.

Кстати, линковщик тоже не нужен, рудимент первых трансляторов. А типизированые языки нужны только потому, что из ста программистов только один умеет программировать, остальных нужно за ручку водить. Даже одна обезьяна напечатает «Войну и мир», если разблокировать только нужные клавиши и в нужном порядке. Потому мы так и любим подсветку синтаксиса и темы оформления - это способ воздействовать на себя, на свой разум, сконцентрировать внимание, помочь себе видеть больше. Сейчас размываются границы, где встроенная документация, где интернет, где компилятор, где интерпретатор, где ходить на работу, а где самозанятость. В таких условиях желание опереться на авторитет развивается, как у ребёнка желание схватить взрослого за рукав. Преданный взгляд в глаза Google когда они выкатывают очередную технологию для разработчиков. Надо вставать на ноги и осмотреться в большом взрослом мире, где ты не изучаешь технологии, а создаёшь их, где ты видишь не только мануал, но и руку которая тебе его протягивает и знаешь историю обоих. Это основы, это называется философия программирования.

Философия программирования



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

Когда находящийся в наркотической привязанности Булгаков пытался развить достижения Достоевского и Толстого в тупиковом, как оказалось направлении, по-сути хороня русскую классическую литературу, когда англичане поняли, что настало время массового искусства и теперь читать будут только детективы и пошлятину и писатели перестанут быть Людьми, в это время американцы обнаружили и заселили целую новую вселенную, пропагандируя не столько машины и космос, сколько так называемое научное мышление и желание жить в будущем. Культурный МАСШТАБ явления недооценён. Весь мир последствиями пронизан. Сейчас литература как наполнитель социального интеллекта игрок второстепенный, повелевают пока голливуд, ТВ и интернет, причём очевидно уже, что интернет доминирует. Интернет создали и развивают Хайнлайновцы и Азимовцы, сами себя никогда таковыми не считающие, дух той фантастики пронизывает предпринимательство Силиконовой Долины.

Сейчас вздыхать по литературе поздно, следующее поколение вырастет на ленте, которая вберёт в себя всё и отовсюду, и Шекспира всосёт и Булгакова и Галковского, всосёт Верна и Желязны. Будут их мысли, возможно анонимизируясь, как камни превращаясь цифровой рекой в цифровую гальку, плыть вниз по скроллу. А новые поколения будут пить из этой реки и не догадываться из каких древних бумажно-чернильных водоёмов она взяла начало. И только самые пытливые будут залезать в верховья в поисках истоков и удивляясь убожеству древних развалин возвращаться к сверкающей разнообразием современности своей ленты на любимом сайте.

Посмотрите на американскую современность как на битву тех кто вырос на фантастике с более архаичной частью общества. Читатели Шекспира всё ещё наверху, они с детства научены всадить нож в спину отцу, чтобы двинуться вперёд. Проблема американцев не в отсутствии собственной великой культуры, а в том, что как и везде, культура уступает место грызне. Именно такая грызня разложила Британскую Империю сто лет назад, когда всемирный королевский чиновничий аппарат ощущал своё всесилие, но уже распадался на части. Аналогичное случилось в ЦК и Политбюро. Сейчас главный вопрос культуры - как затормозить грызню всех со всеми. Вектор литературы и культуры в целом упирается в этот вопрос как в чугунную крышку люка. Упирается в каждом комменте.

Вообще-то существование государств, каких-то там «американцев», «немцев» интернет-гигантам невыгодно, у них есть, впервые в истории, инструменты для мирового доминирования, США временно нужны для надёжного хостинга серверов с ядерным щитом. Со временем интернет проглотит госаппараты, над чиновником встанет админ и тогда Интернет предприниматели станут ядром для создания нового этноса и новой аристократии - всемирной. В интернете феодальная сущность людей кристаллизуется очень быстро в привычные формы, просто в современных примитивных соцсетях и приложениях это трудно разглядеть.

Интернет это и есть «Скайнет», который развивается до точки сингулярности, а потом захватывает тот мир в котором возник, только вместо искусственного интеллекта гегемоном будет высший класс пользователей. Кто сформирует этот класс пока не ясно, скорее всего американцы, причём именно та часть, которая росла на Азимове и ко., но хорошие шансы у русских и китайцев, только у этих трёх культур развиваются свои интернет среды, остальные прочно вклеены в американскую, китайскую или русскую. В этом смысле настоящий «русский националист» это программист Яндекса. То, что американцы не перешли на метрическую систему не значит, что они отстали от технического прогресса, они создали и навязали миру свои языки программирования которые становятся ядром всех цифровых систем, а вслед за этим ядром всех культур и социумов. Какой смысл развивать литературу и прочие гиблые ответвления, когда надо сосредоточится на ГЛАВНОМ и программировать САЙТЫ? Заметьте, не делать, не сочинять в литературном смысле, не рисовать, а программировать. Потому-что в интернет обществе человек вооружённый языком программирования имеет преимущество аналогичное бластеру в эпоху мечей. А по количеству созданных языков программирования американцы мировой гегемон, с долей не снившейся Британской Империи.

Вот мой спелл чекер не знает даже слова бластер, то есть он существует в мире до фантастики.

Для стартапера чтение великой мировой литературы это минус, даже фантастика уже минус, приземляет, материализует. Брэнсон и Маск выросли на фантастике и поэтому нацелены на создание машин, потому-что фантастика уже архаична, она жила до интернета. Современная фантастика, современная культура это микроблог, это репозиторий, современный космический полёт это «миллион пользователей стартапа» в крайнем случае «миллион просмотров видеоблога». А выборы американского президента или российской Думы это ни о чём, не интересно по сути, так, шоу на два вечера, суть же в том как идёт главный процесс трансформации, как скоро Дума и государство в целом станет чем-то вроде паблика и будет управляться кликами? Вопрос лишь в одном - написать софт для этого «паблика». Но об этом - позже.

Сергей Трофимов

Последнее время, я часто слышу о том, что философия умерла. Что вместе с эпохой Аристотеля, Гегеля, Бердяева ушла и философия, что сейчас умы людей полностью занимают точные науки, а для философии не осталось места. Но философия это в первую очередь мировоззрение, призма сквозь которую человек воспринимает окружающий мир свое место в этом мире, место среди окружающих его людей. Человечество, получив при помощи технического прогресса новые инструменты изучения окружающего мира одновременно получило и инструменты воздействия на этот мир и самого себя как часть окружающего. Люди остро нуждаются в осмыслении своего места в условиях технического прогресса влияния технических новшеств на самого человека, воспитании осторожного обращения с гигантской силой, данной человечеству техническим прогрессом.

Вступление.

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

Вначале, когда программы для таких устройств были достаточно простыми, ими занимались сами изготовители вычислительных машин. Но с повышением сложности и увеличением объема программ стали требоваться люди со специальной подготовкой и, что особенно важно, с особым образом мышления, которым было под силу “вдохнуть жизнь” в становящийся все более интеллектуальным электронный “мозг”. Тогда и стали рассматривать написание программ для электронно-вычислительных машин как особый вид интеллектуальной деятельности, который иногда сравнивают с искусством.

В широком смысле слова под термином “программирование” понимается составление программ для технических устройств. Здесь будут рассмотрены вопросы составления программ для таких программно-управляемых вычислительных устройств как персональные компьютеры, которые наиболее доступны широкому кругу людей и которые достаточно развиты для так называемого “интеллектуального программирования”. Под термином “интеллектуальное программирование” здесь будет пониматься составление таких программ, которые могут соперничать с человеческим разумом или помогать ему в решении интеллектуальных задач.

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

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

Электронное воплощение человеческой мысли.

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

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

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

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

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

Сначала ЭВМ выполняли только рутинные счетные и поисковые операции, далее программы для ЭВМ становились все более сложными, их логика работы стала приближаться к работе человеческого мозга. Уже сейчас компьютерные программы играют в такие высокоинтеллектуальные игры как шахматы лучше человека. Примером тому служит победа программы “Deep Blue” в шахматном матче против чемпиона мира Гарри Каспарова.

На низшем уровне программа - это собрание миллиардов простых битов информации, нулей и единиц. Вычислительная машина преобразует эти биты информации во внутренний логический алгоритм, который с возрастанием объема программы становится все более сложным. Так же работает человеческий мозг. Его деятельность основана на электрических импульсах, пульсирующих между нейронами, которые преобразуются в мысли и команды человеческим органам. Но есть огромная разница между работой компьютера и человеческого мозга. Программа написана один раз одним или несколькими людьми и запущена в компьютере. А человек изменяет свою “программу” поведения ежесекундно, на одни и те же раздражители он может реагировать по разному, деятельность мозга, постоянно само совершенствующего свою внутреннюю программу не поддается описанию. Именно человеческая мысль вложена в электронные “мозги” четко описанная, разложенная по миллиардами бит информации и больше, чем вложено человеком взяться просто неоткуда. Можно привести простой пример. Программа - это большая книга написанная людьми и совершенно новых страниц, которые никем не написаны, там не будет никогда. Можно добавить несколько новых страниц или даже поручить это сделать компьютеру, но и в таком случае новые страницы будут скомпонованы из того что уже есть внутри “железного ума”.

Программирование - искусство или ремесло?

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

Как только появилось само понятие программирования, у людей стал возникать вопрос: программирование - это искусство или ремесло?

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

Можно привески простой пример. Если портной шьет одежду для повседневного использования, обычно никому не приходит в голову назвать такую вещь произведением искусства, но существуют специальные модельные дома, где на суд зрителей представляется одежда, выполненная известными модельерами, часто в единственном экземпляре, созерцание которой доставляет ценителям истинное наслаждение. Это ли не произведение искусства? Можно сделать предположение, что одним из признаков произведения искусства будет эксклюзивное, единичное создание. Однако никому не приходит в голову, что стихи известных поэтов после издания миллионными тиражами потеряли свою красоту. Но ведь стихи были написаны однажды, как и, например, скульптура. А затем были переписаны, во многих тысячах экземпляров. Эти копии нисколько не потеряли красоты и притягательности оригинала.

Есть своя притягательность и красота в архитектурных ансамблях и даже в механизмах, произведенных человеческим разумом и руками. Не даром не пустеют залы Политехнического музея в Москве, где собраны макеты и “живые” примеры “эволюции” механизмов созданных человеком в разное время и в разных странах.

Компьютерная программа это такое создание человеческого разума, которое впитывает в себя красоту как языка, так и механизма. Внешнее графическое проявление программ воплощается в понятие “компьютерная графика”. Сейчас компьютерная графика заняла достойное место среди таких направлений искусства, как живопись, киноискусство, мультипликация. Человек получил в свои руки инструмент, позволяющий воплотить в реальные картины свои фантазии и показать их широкой аудитории зрителей. Техническая сторона компьютерной графики достигла таких высот, что создаваемые в реальном времени электронно-вычислительной машиной картины человеческий мозг не может отличить от реальных. Однако за каждой картиной, созданной компьютером стоит ее истинный создатель-человек. Компьютер является линзой, которая увеличивает и предает широкой огласке идеи и образы, рождающиеся глубоко в человеческом сознании. Компьютер можно сравнить с мольбертом художника или кинокамерой режиссера.

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

Воплощение индивидуума в программе.

Известно философское понятие - отражение человеческого “Я” в деятельности индивидуума. Как и в любой деятельности, программист вкладывает свои знания, опыт, а хороший программист и душу в создаваемую программу. Каждый индивидуум, приобретя какой-то предыдущий опыт, вкладывает его в создаваемые им вещи. И программист не исключение. В программе воплощается его миропонимание и мироощущение. Компьютер становится как бы продолжением человеческого разума. Действуя по заложенной человеком программе компьютер “говорит” вложенными в него человеком словами и на определенные ситуации отвечает так, как ответил бы человек, его программировавший. Написание программы чем-то сродни воспитанию ребенка. Только воспитание проходит всю жизнь, а программирование все-таки имеет ограниченный срок. Также как маленькому ребенку программист объясняет, что компьютер должен делать в той или иной ситуации. Какие будут последствия на его действия и что нужно будет предпринять для изменения таких последствий. И как воспитание ребенка зависит от личности и примера родителей, так и программа зависит от личности программиста. Хороший человек будет вкладывать в компьютер набор действий, которые будут помогать людям в работе, учебе или отдыхе. Безответственный человек будет “учить” компьютер ломать, крушить, разрушать созданные другими людьми знания. Характерным примером может служить неиссякаемый поток так называемых компьютерных вирусов, программ, которые, копируя себя с компьютера на компьютер, разрушающе воздействуют на компьютерные системы, выполняя заложенный в них разрушающий алгоритм.

Влияние программы на личность.

У человека глубоко развито чувство следования авторитетам, следование за лидером. Эта черта развивается с детства, когда лидером для маленького человека являлся каждый взрослый. Все, что говорили взрослые было непреложной истиной, не подвергающейся сомнению. Взрослея, человек начинает критически относиться к окружающему миру и мнениям других людей. Однако этот критический подход во многом зависит от мировоззрения человека, его образования и жизненного опыта. Просматривается определенная закономерность, что к печатному слову человек относится менее критично, чем к живому. Это обусловлено развитием системы образования человека. Большинство научных знаний индивидуум получает через печатные издания. И по большому счету мировоззрение человека формируется именно в процессе учебы. Именно в эти годы закладывается понимание мира и места личности в нем. Формируется система ценностей и авторитетов. Именно в это время глубоко в подсознание закладывается отношение к печатному слову, как к непреложному авторитету. Можно вспомнить еще недавние времена социалистической цензуры, когда вся информация, выдаваемая через печатные издания, была тщательно отфильтрована и причесана для воспитания так называемого “коммунистического мировоззрения”.

Сейчас авторитет печатных изданий во многом утрачен. Учебники истории переписываются с завидной периодичностью. Газеты и журналы печатают такую информацию, которую в некоторых случаях можно смело отнести в разряд мифов и легенд. Однако авторитет утраченный печатными изданиями был тут же подхвачен электронными изданиями. А с развитием глобальной сети Internet перекочевал в нее. Сейчас услышать фразу “я прочитал в Интернете...” можно услышать чаще, чем “я был в библиотеке...”. Мне лично знакомы люди, обычно старшего поколения, безоговорочно верящего всему, что “сказал” компьютер. Этим широко пользуются недобросовестные торговцы. Еще недавно в самом центре Москвы можно было встретить бизнесмена с переносным компьютером, который за некоторую сумму “спрашивал” у вычислительной машины астрологический прогноз или что-нибудь в этом роде. И выдавал отпечатанные тут же прогнозы. А если присмотреться к рекламным роликам, которые крутятся на телевидении, то трудно не заметить, что в каждом втором из них компьютер играет роль советчика в использовании той или иной вещи. Образ человека в белом халате, нажимающего кнопку компьютера, на экране которого какие-то графики, просто кочует из ролика в ролик.

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

В последнее время в полной мере заявила о себе проблема непонимания истинной ценности вещей и истинных последствий своих действий. А компьютерные программы наряду с низкопробными фильмами, которые нельзя даже назвать художественными, вносят в эту проблему свой не самый маленький вклад. Особенно сильно влияние “электронного гуру” на неокрепшие души подростков. Огромное количество компьютерных программ пропагандируют насилие. Игры, где подростки управляют кровавой битвой все чаще переносятся в действительность. Подросток еще не может понять, что в компьютерной игре можно с размаха ударить противника ногой без всяких последствий, но тоже действие перенесенное в реальную жизнь может привести к трагедии. Подростки не понимают реальных последствий своих действий, они переносятся в виртуальный мир, где все не настоящее, они получают опыт, который нельзя применить на практике, у них формируется искривленное понимание окружающего мира. И чем более реалистично выполнена “виртуальная реальность”, тем тяжелее вернуться в реальный мир, с его реальными проблемами и объективными законами, не перевернутыми электронной техникой. В среде подростков существует такой термин “зависнуть”, который применим в том числе и к игрокам в компьютерные игры. В этом контексте он означает, что человек настолько погружается в “виртуальный” мир, что перестает ощущать объективную реальность, и не может оторваться от монитора, пока не “пройдет” всю игру до конца.

Это состояние сродни запою у взрослых. Ощущение то же. Человек погружается в сюрреалистический мир фантазий и вывести его оттуда довольно трудно.

Часто человек теряет понимание истинных ценностей и перестает адекватно воспринимать окружающую действительность в связи с этим. Примером такой потери ценностей может служить получившие широкое распространение в настоящее время так называемые “тамагочи” - электронные зверьки. “Тамагочи” представляет собой небольшой электронный брелок с экраном и несколькими кнопками, посредством которых можно управлять заложенной в это устройство программой. Программа сделана по такому алгоритму, что при ее работе создается впечатление, что это устройство живое. Его нужно электронным образом “кормить”, играть с ним, “лечить” и т.п. при правильной последовательности обращения “тамагочи” “растет” и “счастлив”, при неправильной последовательности он может “заболеть” или “умереть”. Таким образом программа не прекращает свой работы ни днем ни ночью, создавая впечатление что “тамагочи” живет. Взрослые с уже устоявшимися взглядами понимают, что это не более чем электронная игрушка, но дети еще не могут отличить живые существа от электронной модели. Это приходит с жизненным опытом. Ведь известно, что при развитии ребенка существует период одухотворения неживых вещей, который с возрастом проходит. Но такая электронная игрушка “ведет” себя как живая, что затрудняет правильную оценку ребенком ее одухотворенности. Известен случай, когда ребенок ударил своего младшего брата, за то, что он “убил” “тамагочи”, причем такие случаи не единичны. Таким образом изначально казалось бы неплохая идея прививать ребенку чувство заботы о ближнем, вырастает в конечном итоге в перекос взглядов и смещение жизненных ценностей. В конечном итоге, я бы не подменял живое существо, о котором можно заботиться и воспитывать в детях любовь к ближнему, на электронный суррогат.

В рассказе Рея Брэдбери “Вельд” живо обыграна именно такая ситуация. Еще до изобретения такого типа электронных игрушек гениальный писатель изобразил последствия подмены истинных ценностей на электронную модель. В этом произведении дети жестоко расправились со своими родителями только за то, что они “убили” голографическое изображение, выключив питание экрана. Здесь я не призываю полностью отказаться от электронных вещей и программ и перейти в каменный век, но к этим вещам необходимо подходить достаточно серьезно, чтобы не допустить пагубного влияния программ на неокрепшую психику.

Интересно, что программы оказывают непосредственное влияние не только на “потребителей” электронной продукции но на “производителей” т.е. программистов. Программист привыкает думать машинными категориями и перекладывает их на окружающих. Даже внешний облик становится легко узнаваемым. Если вы видите перед собой худого, молчаливого очкарика с кругами от бессонной ночи под глазами, то с высокой вероятностью можно предположить, что это заядлый компьютерщик.Программист при достаточно долгом общении с машиной приобретает особый склад ума. Он привык давать точные ответы на вопросы, как он это делает при написании программ. Известна старая история из разряда анекдотов. На улице один прохожий спрашивает у другого “Этот автобус идет до вокзала?” - “Да.”, прохожий не знал, что его собеседник - программист, который точно ответил на поставленный вопрос, но умолчал, что до того, как автобус дойдет до вокзала он сначала доедет до конечной, сделает круг и только потом пойдет в нужном направлении. Если бы прохожий задал вопрос “Как проехать к вокзалу?”и еще уточнил бы, что его интересует наиболее оптимальный путь, то получил бы ответ, что необходимо перейти улицу сесть в автобус номер такой-то и проехать две остановки. Но то, что в обычной жизни кажется смешным просто необходимо при общении с электронной машиной. Ей необходимы точные инструкции по выполнению тех или иных операций и насколько точно программист может сформулировать пошаговый алгоритм действий, зависит его квалификация. Интересно, что военные достигают определенных высот в программировании. Это можно объяснить тем, что военных учат отдавать точные распоряжения и управлять большими людскими группами, строго разделяя полномочия и работу между членами группы. Эту технику легко можно распространить на компьютерные программы, когда необходимо точно описать алгоритм работы каждой части программы, взаимодействие ее различных частей.

Жизнь электронной мысли (мыслят ли компьютеры).

В создании любой вещи рано или поздно наступает момент, когда ее создатель “положит последний мазок”, когда он решит, что сделал все, что мог и пора отправлять свое произведение в “большую жизнь”. И с этого момента программа начинает жить самостоятельной жизнью, независимо от своего создателя. Здесь возникает такое понятие как “искусственный интеллект” , которое напрямую связана с понятием “мышление” и “мозг”. Известно, что электронно-вычислительную машину часто называют “электронным мозгом”. Тогда, проведя аналогию между человеческим мозгом и его мыслями, можно назвать программу “электронной мыслью” именно электронного мозга. Рассмотрим само понятие “мозг” и может ли оно применяться к электронно-вычислительной машине. Естественно, внешне человеческий мозг и компьютер не имеют ничего общего, однако можно найти сходство в деятельности данных объектов.

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

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

Есть интересный пример из серии так называемых самообучающихся систем. Эти системы на основе проб и ошибок получают информацию о правильном решении и в дальнейшем используют ее для принятия решения в аналогичных ситуациях. Программа сохраняет в своей памяти ситуации при которых происходили ошибки и выстраивает алгоритм дальнейших действий так, чтобы эти ситуации возникали с наименьшей вероятностью. Причем эти системы могут быть построены на чисто механических принципах и логических законах. Можно сказать, что эти системы “познают” мир, но могут ли они делать выводы, умозаключения, выводить теории? Определенно нет. Получив какой-то “опыт” эти системы в той же ситуации примут правильное решение, но если ситуации отличается даже незначительно от той в которой они побывали, это поставит систему в тупик. У таких систем нет способности абстрагироваться от конкретной ситуации, нет способности к анализу и какая бы хорошая программа для ЭВМ не была она лишь выбирает решение при помощи логики из набора заложенных ситуаций, а если ситуация компьютеру не знакома это приведет к сбою.

Таким образом, можно с уверенностью сказать, что на данном этапе развития ЭВМ программы, а следовательно и компьютеры мыслить не могут.

Морально - этические проблемы программирования.

Термин “компьютерные вирусы” прочно вошел в нашу жизнь. Любой человек, хотя бы немного знакомый с современными компьютерами, слышал это словосочетание, а кто-то и сталкивался непосредственно с его разрушительными воздействиями. Итак, что же такое “компьютерные вирусы”? Это программы, которые своими действиями нарушают работу других программ, разрушают данные, не дают возможности пользователям компьютера нормально работать. Причем такие программы могут копировать себя с компьютера на компьютер, чтобы захватывать все новые территории для своих “черных дел”.

Если это программа, написанная человеком, то возникает резонный вопрос: кто составляет такие программы? Такой человек должен обладать некоторыми навыками в обращении с компьютерами, особенно в написании программ . Он должен иметь доступ к компьютеру. У него должна быть причина для распространения вируса. Безусловно, миллионы людей обладают навыками, достаточными для того чтобы преднамеренно или случайно написать программу-вирус. Любой студент, изучающий программирование, и множество сообразительных подростков способны на это.

Конечно и специалисты по программированию могут создать программы-вирусы. Но они ценят свой труд и, прежде чем взяться за дело, постараются найти более простой и менее рискованный способ достижения свой цели. Сейчас принят закон, который за умышленную порчу компьютерных данных предусматривает наказание, вплоть до уголовного (статья 273 УК). А компьютерная программа - это воплощение своего создателя, его мыслей и разума. Конечно, если вирус пишет террорист или шпион сопредельного государства, то даже угроза уголовного наказания его не остановит, однако большинство вирусов, как показала практика, написаны вовсе не террористами в полном смысле этого слова, а людьми, которым не дает покоя слава Герострата, варварами, которые не ищут выгоды от своих действий. Они хотят продемонстрировать свое умственное превосходство, показать, что они умеют делать то, чего не умеют другие, причем они вполне работоспособны, но, вместе с тем, маются от безделья . Эти люди из тех, кто бьет стекла, поджигает лифты, обливает кислотой картины в музеях. Ими движет противоречивое желание. С одной стороны они хотят продемонстрировать свое превосходство над другими людьми, а с другой стороны чисто хулиганские, варварские побуждения сделать что-нибудь гаденькое. Если такой человек обладает необходимыми навыками, он может написать компьютерный вирус.

Здесь возникает известная проблема, если взять пример Раскольникова. Топор не убивает, убивает человек. Так и компьютерный вирус, созданный человеком, несет в своем теле злой умысел программиста.

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

Заключение.

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

Список литературы

Философские вопросы кибернетики М. СОЦЭГИЗ 1961 –392с.

Кибернетика. Мышление. Жизнь М. Мысль 1964. – 511с.

Корецкий С. Искусственный интеллект – миф или реальность? Hard’n’Soft #2 1999.

Сеченов И.М. Рефлексы головного мозга. 1863.

Искусство и научно-технический прогресс. М. 1973–461с.

Соловьев В.С. Философия искусства и литературная критика. М Искусство 1991 – 699с.

Выжлецов Г.П.Эстетика в системе философского знания.ЛГУ 1983

Гегель "Эстетика" в 4-х томах, Москва, 1969 г.

Крутова О.Н. Мораль: сознание и поведение. Ин-т философии М.Наука 1986 –207с.

Панцурин В.А. Внутренний мир личности и искусство. Свердловск 1990 –212с.

Файтс Ф. Джонстоун П. Кратс М. Компьютерный вирус: проблемы и прогноз: Пер. С англ. - М. Мир, 1994.- 176с. ил.

Достоевский Ф.М. Преступление и наказание. М. 1974. 542с.

Бодалев А.А. Популярная психология для родителей. М. :Педагогика, 1988 - 256 с.

Брэдбери Р. О скитаниях вечных и о Земле: -М.:Правда, 1987.-656 с., ил.

Дмитрий Якушев

«Философия»

программирования на языке С++

издание второе, дополненное и исправленное

УДК 004.43 ББК 32.973.202

Якушев Д. М.

Я49 «Философия» программирования на языке С++. / Д. М. Яку шев. - 2 е изд. - М.: Бук пресс, 2006. - 320 с.

ISBN 5 9643 0028 6

Автором языка C++ является Бьерн Страуструп, сотрудник известной фирмы AT&T. C++ (а точнее, его предшественник, С with classes) был создан под влиянием языка Simula (надо сказать, что этот язык программирования появился еще в 1967 году). Собственно, к тому моменту, когда появился C++, С уже заработал себе популярность; профессиональные программисты уважа ют его за возможность использовать преимущества конкретной архитектуры, создавая при этом программы на языке относительно высокого уровня.

В настоящее время C++ - один из самых популярных (если не самый популярный) языков программирования. Именно С++ позволяет написать программу с использованием объектно ориентированных подходов (а про граммы, которые этого требуют, обычно очень большие) и при этом достаточ но «быструю».

Эта книга познакомит читателя с «философией» и основами програм мирования на языке С++. В книге приводится множество примеров, скомпи лированных и проверенных автором.

УДК 004.43 ББК 32.973.202

Часть 1.

Глава 1. С++ - язык программирования общего назначения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3

Глава 2. Лексика. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Глава 3. Синтаксис. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Глава 4. Область видимости. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 Глава 5. Определения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 Глава 6. Компоновка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Глава 7. Классы памяти. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Глава 8. Основные типы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Глава 9. Производные типы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 Глава 10. Объекты и LVALUE (адреса) . . . . . . . . . . . . . . . . . . . . . . . . .15 Глава 11. Символы и целые. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15 Глава 12. Преобразования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 Глава 13. Выражения и операции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18 Глава 14. Описания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31 Глава 15. Спецификаторы класса памяти. . . . . . . . . . . . . . . . . . . . . .31 Глава 16. Описатели. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 Глава 17. Описания классов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39 Глава 18. Инициализация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51 Глава 19. Перегруженные имена функций. . . . . . . . . . . . . . . . . . . . .58 Глава 20. Описание перечисления. . . . . . . . . . . . . . . . . . . . . . . . . . . . .59 Глава 21. Описание Asм. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60 Глава 22. Операторы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61 Глава 23. Внешние определения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66

Глава 24. Командные строки компилятора. . . . . . . . . . . . . . . . . . . . .68 Глава 25. Обзор типов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70 Глава 26. Соображения мобильности. . . . . . . . . . . . . . . . . . . . . . . . . .75 Глава 27. Свободная память. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .76

Часть 2. Турбо С++

Глава 1. Интегрированная среда разработки. . . . . . . . . . . . . . . . . . . .78 Глава 2. Строка меню и меню. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79 Глава 3. Окна TURBO C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79 Глава 4. Работа с экранным меню. . . . . . . . . . . . . . . . . . . . . . . . . . . . .80

Глава 5. Структура файла, типы данных и операторов ввода вывода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87

Глава 6. Арифметические, логические операции и операции отношения и присваивания. . . . . . . . . . . . . . . . . . . . . . .91

Глава 7. Логическая организация программы и простейшее использование функций. . . . . . . . . . . . . . . . . . . . . . . . . .95

Глава 8. Логическая организация простой программы. . . . . . . . . . .95 Глава 9. Использование констант различных типов. . . . . . . . . . . . .96 Глава 10. Управляющие структуры. . . . . . . . . . . . . . . . . . . . . . . . . . . .98

Глава 11. Приемы объявления и обращения к массивам, использование функций и директивы define

при работе с массивами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100

Часть 3. От теории к практике

Глава 1. Правило «право лево» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103 Глава 2. STLport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104 Глава 3. Язык программирования от Microsoft: C# . . . . . . . . . . . . . .106 Глава 4. C++ Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108 Глава 5. Применение «умных» указателей. . . . . . . . . . . . . . . . . . . . . .111 Глава 6. Рассуждения на тему «умных» указателей. . . . . . . . . . . . . .116 Глава 7. Виртуальные деструкторы. . . . . . . . . . . . . . . . . . . . . . . . . . . .122 Глава 8. Запись структур данных в двоичные файлы. . . . . . . . . . . .126

Глава 9. Оператор безусловного перехода goto . . . . . . . . . . . . . . . . . .132 Глава 10. Виртуальный конструктор. . . . . . . . . . . . . . . . . . . . . . . . . . .136 Глава 11. Чтение исходных текстов. . . . . . . . . . . . . . . . . . . . . . . . . . . .141 Глава 12. Функция gets() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143 Глава 13. Свойства. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .146 Глава 14. Комментарии. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149 Глава 15. Веб программирование. . . . . . . . . . . . . . . . . . . . . . . . . . . . .154 Глава 16. Ошибки работы с памятью. . . . . . . . . . . . . . . . . . . . . . . . . .158 Глава 17. Создание графиков с помощью ploticus . . . . . . . . . . . . . . .161 Глава 18. Автоматизация и моторизация приложения. . . . . . . . . . .164 Глава 19. Обзор C/C++ компиляторов EMX и Watcom . . . . . . . . . .183 Глава 20. Использование директивы #import . . . . . . . . . . . . . . . . . . .188

Глава 21. Создание системных ловушек

Windows на Borland C++ Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .204 Вопросы и ответы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .214

Н а у ч н о п о п у л я р н о е и з д а н и е

Якушев Дмитрий Михайлович

«ФИЛОСОФИЯ» ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ С++

Главный редактор Б. К. Леонтьев

Шеф редактор А. Г. Бенеташвили

Оригинал макет И. В. Царик

Художник О. К. Алехин

Художественный редактор М. Л. Мишин Технический редакторК. В. Шапиро

Корректоры Л. С. Зимина, К. В. Толкачева

Подписано в печать 07.05.2006. Формат 60x90/16. Гарнитура «Ньютон». Бумага офсетная. Печать офсетная. Печ. л. 20. Тираж 3000.

Введение в язык программирования С++

Часть 1. Введение в язык

программирования С++

С++ - язык программирования общего назначения

Автором языка C++ является Бъерн Страуструп, сотрудник изве стной фирмы AT&T. C++ (а точнее, его предшественник, С with classes) был создан под влиянием Simula (надо сказать, что этот язык программи рования появился еще в 1967 году). Собственно, к тому моменту (когда появлялся C++), С уже заработал себе популярность; обычно, его очень уважают за возможность использовать возможности конкретной архи тектуры, при этом все еще используя язык относительно высокого уров ня. Правда, обычно, именно за это его и не любят. Конечно же, при этом терялись (или извращались) некоторые положения построения про грамм; например, в С фактически отсутствует возможность создавать модульные программы. Нет, их конечно же создают, но при помощи не которых «костылей» в виде использования директив препроцессора - такой модульности, как, например в Modula 2 или Ada, в С нет. Кстати сказать, этого нет до сих пор и в C++.

С самого начала подчеркивалось то, что C++ - развитие языка Си, возможно, некоторый его диалект. Об этом говорит тот факт, что первым компилятором (существующим до сих пор) являлся cfront , кото рый занимался тем, что переводил исходный текст на C++ в исходный текст на Си. Это мнение бытует до сих пор и, надо сказать, до сих пор оно является небезосновательным; тем не менее, С и C++ - разные языки программирования.

Основное отличие C++, когда он только появлялся, была явная поддержка объектно ориентированного подхода к программированию. Надо понимать, что программировать с использованием ООП и ООА можно где угодно, даже если инструментарий явно его не поддерживает; в качестве примера можно взять библиотеку пользовательского интер

Введение в язык программирования С++

фейса GTK+, которая написана на «чистом» С и использованием прин ципов объектно ориентированного «дизайна». Введение в язык про граммирования средств для поддержки ООП означает то, что на стадии компиляции (а не на стадии выполнения программы) будет производит ся проверка совместимости типов, наличия методов и т.п. В принципе, это достаточно удобно.

Опять же, точно так же как и С не является в чистом виде языком программирования высокого уровня (из за того, что позволяет выпол нить слишком много трюков), C++, строго говоря, не является объект но ориентированным языком программирования. Мешают этому такие его особенности, как наличие виртуальных функций (потому что при разговоре о полиморфизме никто никогда не оговаривает того, что неко торые методы будут участвовать в нем, а некоторые - нет), присутствие до сих пор функции main() и т.п. Кроме того, в C++ нет таких сущностей, как, например, метаклассы (хотя они, наверное, не так уж сильно и нуж ны) и интерфейсы (вместо них используется множественное наследова ние). Тем не менее, C++ на текущий момент один из самых популярных (если не самый популярный) язык программирования. Почему? Да пото му что все эти «уродства» позволяют в итоге написать программу с ис пользованием объектно ориентированных подходов (а программы, ко торые этого требуют, обычно очень большие) и при этом достаточно «быструю». Этому способствует именно наличие виртуальных функций (т.е., то, что программист сам разделяет еще во время проектирования, где ему понадобится полиморфизм, а где будет достаточно объединить некоторые функции в группу по некоторому признаку), обязательное на личие оптимизатора и прочее. Все это позволяет при грамотном исполь зовании все таки написать работающую программу. Правда, достаточно часто встречаются примеры неграмотного использования, в результате чего выбор C++ для реализации проекта превращается в пытку для про граммистов и руководства.

На текущий момент на язык программирования C++ существует стандарт, в который включена, помимо прочего, стандартная библиоте ка шаблонов. О шаблонах разговор особый, формально они тоже явля ются «костылями» для того, чтобы сделать, так сказать, полиморфизм на стадии компиляции (и в этом качестве очень полезны), а вот библиотека

Бесспорно правильное со всех сторон новшество. Наличие, наконец то, стандартных способов переносимо (имеется в виду, с компилятора на компилятор) отсортировать список (кроме написания всех соответству ющих подпрограмм и структур данных самостоятельно) очень сильно облегчило жизнь программиста. Правда, до сих пор очень много людей плохо себе представляют как устроена STL и как ей пользоваться (кроме std::cin иstd::cout ).

Введение в язык программирования С++

Важной вехой в развитии программирования явилось создание и широкое распространение языка С++. Этот язык, сохранив средства ставшего общепризнанным стандартом для написания системных и при кладных программ языка С (процедурно ориентированный язык), ввел в

практику программирования возможности нового технологического подхода к разработке программного обеспечения, получившего название «объектно ориентированное программирование».

Язык программирования C++ - этоC* , расширенный введением классов,inline функций, перегруженных операций, перегруженных имен функций, константных типов, ссылок, операций управления сво бодной памятью, проверки параметров функций.

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

Объектный подход информационного моделирования предмет ных областей все более успешно применяется в качестве основы для структуризации их информационных отражений и, в частности, баз зна ний.

С++ является языком программирования общего назначения. Именно этот язык хорошо известен своей эффективностью, экономич ностью, и переносимостью.

Указанные преимущества С++ обеспечивают хорошее качество разработки почти любого вида программного продукта.

Использование С++ в качестве инструментального языка позво ляет получать быстрые и компактные программы. Во многих случаях программы, написанные наС++ , сравнимы по скорости с программами, написанными на языке ассемблера.

Перечислим некоторые существенные особенности языка С++ :

С++ обеспечивает полный набор операторов структурного программирования;

С++ предлагает необычно большой набор операций;

Введение в язык программирования С++

Разнообразие операций позволяет выбирать их различные наборы для минимизации результирующего кода;

С++ поддерживает указатели на переменные и функции;

Указатель на объект программы соответствует машинному адресу этого объекта;

Посредством разумного использования указателей можно создавать эффективно выполняемые программы, т.к. указатели позволяют ссылаться на объекты тем же самым путем, как это делает ЭВМ;

С++ поддерживает арифметику указателей, и тем самым позволяет осуществлять непосредственный доступ и манипуляции с адресами памяти.

Глава 2. Лексика

Есть шесть классов лексем: идентификаторы, ключевые слова, константы, строки, операторы и прочие разделители. Символы пробела, табуляции и новой строки, а также комментарии (собирательно - «бе лые места»), как описано ниже, игнорируются, за исключением тех слу чаев, когда они служат разделителями лексем.

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

Комментарии

Символы /* задают начало комментария, заканчивающегося сим волами*/ . Комментарии не могут быть вложенными.

Символы // начинают комментарий, который заканчивается в конце строки, на которой они появились.

Идентификаторы (имена)

Многие операции С++ соответствуют машинным командам и поэтому допускают прямую трансляцию в машинный код;

Идентификатор - последовательность букв и цифр произвольной длины; первый символ обязан быть буквой; подчерк "_" считается за бук ву; буквы в верхнем и нижнем регистрах являются различными.

Идентификаторы signed иvolatile зарезервированы для примене ния в будущем.

Константы

Есть несколько видов констант. Ниже приводится краткая сводка аппаратных характеристик, которые влияют на их размеры.

Целые константы

Целая константа, состоящая из последовательности цифр, счита ется восьмеричной, если она начинается с 0 (цифры ноль), и десятичной в противном случае. Цифры 8 и 9 не являются восьмеричными цифрами.

Последовательность цифр, которой предшествует 0х или0Х , вос принимается как шестнадцатеричное целое.

В шестнадцатеричные цифры входят буквы от а илиА доf илиF , имеющие значения от 10 до 15.

Десятичная константа, значение которой превышает наибольшее машинное целое со знаком, считается длинной (long ); восьмеричная и шестнадцатеричная константа, значение которой превышает наиболь

Введение в язык программирования С++

шее машинное целое со знаком, считается long ; в остальных случаях це лые константы считаютсяint .

Явно заданные длинные константы

Десятичная, восьмеричная или шестнадцатеричная константа, за которой непосредственно стоит l (латинская буква «эль») илиL , считает ся длинной константой.

Символьные константы

Символьная константа состоит из символа, заключенного в оди ночные кавычки (апострофы), как, например, "х" . Значением символь ной константы является численное значение символа в машинном набо ре символов (алфавите).

Символьные константы считаются данными типа int . Некоторые неграфические символы, одиночная кавычка" и обратная косая\ , могут быть представлены в соответствие со следующим спискомescape после довательностей:

символ новой строки NL(LF)

горизонтальная табуляция NT

вертикальная табуляция VT

возврат на шаг BS

возврат каретки CR

перевод формата FF

обратная косая \

одиночная кавычка (апостроф) "

набор битов 0ddd

набор битов 0xddd

Escape последовательность\ddd состоит из обратной косой, за ко торой следуют 1, 2 или 3 восьмеричных цифры, задающие значение тре буемого символа. Специальным случаем такой конструкции является\0 (не следует ни одной цифры), задающая пустой символNULL .

Escape последовательность\xddd состоит из обратной косой, за которой следуют 1, 2 или 3 шестнадцатеричных цифры, задающие значе ние требуемого символа. Если следующий за обратной косой символ не является одним из перечисленных, то обратная косая игнорируется.

Введение в язык программирования С++

Константы с плавающей точкой

Константа с плавающей точкой состоит из целой части, десятич ной точки, мантиссы, е илиЕ и целого показателя степени (возможно, но не обязательно, со знаком). Целая часть и мантисса обе состоят из после довательности цифр. Целая часть или мантисса (но не обе сразу) может быть опущена; или десятичная точка, илие (Е) вместе с целым показате лем степени (но не обе части одновременно) может быть опущена. Кон станта с плавающей точкой имеет типdouble .

Перечислимые константы

Имена, описанные как перечислители, являются константами ти

па int .

Описанные константы

Объект любого типа может быть определен как имеющий посто янное значение во всей области видимости его имени. В случае указате лей для достижения этого используется декларатор *const ; для объектов, не являющихся указателями, используется описательconst .

Строка есть последовательность символов, заключенная в двой ные кавычки: «...» . Строка имеет типмассив символов и класс памятиstatic , она инициализируется заданными символами.

Компилятор располагает в конце каждой строки нулевой (пустой) байт \0 с тем, чтобы сканирующая строку программа могла найти ее ко нец.

В строке перед символом двойной кавычки " обязательно должен стоять\ ; кроме того, могут использоваться те жеescape последователь ности, что были описаны для символьных констант.

И, наконец, символ новой строки может появляться только сразу после \ ; тогда оба, -\ и символ новой строки, - игнорируются.

Глава 3. Синтаксис

Запись синтаксиса

По синтаксическим правилам записи синтаксические категории выделяются курсивом, а литеральные слова и символы шрифтом посто янной ширины.

Введение в язык программирования С++

Альтернативные категории записываются на разных строках. Не обязательный терминальный или нетерминальный символ обозначается нижним индексом «opt», так что {выражение opt} указывает на необяза тельность выражения в фигурных скобках.

Имена и типы

Имя обозначает (денотирует) объект, функцию, тип, значение или метку. Имя вводится в программе описанием. Имя может использовать ся только внутри области текста программы, называемой его областью видимости. Имя имеет тип, определяющий его использование.

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

Область видимости

Есть четыре вида областей видимости: локальная, файл, програм ма и класс.

Локальная

Имя, описанное в блоке, локально в этом блоке и может исполь зоваться только в нем после места описания и в охватываемых блоках.

Исключение составляют метки, которые могут использоваться в любом месте функции, в которой они описаны. Имена формальных па раметров функции рассматриваются так, как если бы они были описаны

в самом внешнем блоке этой функции.

Имя, описанное вне любого блока или класса, может использо ваться в файле, где оно описано, после места описания.

Имя члена класса локально для его класса и может использовать ся только в функции члене этого класса, после примененной к объекту его класса операции, или после примененной к указателю на объект его класса операции > .

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

Введение в язык программирования С++

Класс, описанный внутри класса, не считается членом, и его имя принадлежит охватывающей области видимости.

Имя может быть скрыто посредством явного описания того же имени в блоке или классе. Имя в блоке или классе может быть скрыто только именем, описанным в охватываемом блоке или классе.

Скрытое нелокальное имя также может использоваться, когда его область видимости указана операцией :: .

Имя класса, скрытое именем, которое не является именем типа, все равно может использоваться, если перед ним стоит class ,struct илиunion . Имя перечисленияenum , скрытое именем, которое не является именем типа, все равно может использоваться, если перед ним стоитenum .

Глава 5. Определения

Описание является определением, за исключением тех случаев, когда оно описывает функции, не задавая тела функции, когда оно со держит спецификатор extern (1) и в нем нет инициализатора или тела функции, или когда оно является описанием класса.

Глава 6. Компоновка

Имя в файловой области видимости, не описанное явно как static , является общим для каждого файла многофайловой программы. Тако вым же является имя функции. О таких именах говорится, что они внеш ние.

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

Типы, специфицированные во всех описаниях внешнего имени должны быть идентичны. Может быть больше одного определения типа, перечисления, inline функции или несоставногоconst , при условии, что определения идентичны, появляются в разных файлах и все инициализа торы являются константными выражениями.

Введение в язык программирования С++

Во всех остальных случаях должно быть ровно одно определение для внешнего имени в программе.

Реализация может потребовать, чтобы составное const , использо ванное там, где не встречено никакого определенияconst , должно быть явно описаноextern и иметь в программе ровно одно определение. Это же ограничение может налагаться наinline функции.

Глава 7. Классы памяти

Есть два описываемых класса памяти:

автоматический

статический.

Автоматические объекты локальны для каждого вызова блока и сбрасываются по выходе из него.

Статические объекты существуют и сохраняют свое значение в те чение выполнения всей программы.

Некоторые объекты не связаны с именами и их времена жизни яв но управляются операторами new иdelete .

Глава 8. Основные типы

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

В настоящий момент имеются целые трех размеров, описываемые как short int ,int иlong int . Более длинные целые (long int ) предоставляют не меньше памяти, чем более короткие целые (short int ), но при реализа ции или длинные, или короткие, или и те и другие могут стать эквива лентными обычным целым.

«Обычные» целые имеют естественный размер, задаваемый архи тектурой центральной машины; остальные размеры делаются такими, чтобы они отвечали специальным потребностям.

Введение в язык программирования С++

Каждое перечисление является набором именованных констант. Свойства enum идентичны свойствамint . Целые без знака, описываемые какunsigned , подчиняются правилам арифметики по модулю2n , гдеn - число бит в их представлении.

Числа с плавающей точкой одинарной (float ) и двойной (double ) точности в некоторых машинных реализациях могут быть синонимами.

Поскольку объекты перечисленных выше типов вполне можно интерпретировать как числа, мы будем говорить о них как об арифмети ческих типах.

Типы char ,int всех размеров иenum будут собирательно называть ся целыми типами. Типыfloat иdouble будут собирательно называться плавающими типами.

Тип данных void (пустой) определяет пустое множество значений. Значение (несуществующее) объектаvoid нельзя использовать никаким образом, не могут применяться ни явное, ни неявное преобразования.

Поскольку пустое выражение обозначает несуществующее значе ние, такое выражение такое выражение может использоваться только как оператор выражение или как левый операнд в выражении с запятой. Выражение может явно преобразовываться к типу void .

Глава 9. Производные типы

Кроме основных арифметических типов концептуально сущест вует бесконечно много производных типов, сконструированных из ос новных типов следующим образом:

массивы объектов данного типа;

функции, получающие аргументы данного типа и возвращающие объекты данного типа;

указатели на объекты данного типа;

константы, являющиеся значениями данного типа;

Введение в язык программирования С++

структуры, являющиеся классами без ограничений доступа;

объединения, являющиеся структурами, которые могут в разное время содержать объекты разных типов.

В целом эти способы конструирования объектов могут приме няться рекурсивно.

Объект типа void* (указатель наvoid ) можно использовать для ука зания на объекты неизвестного типа.

Объекты и LVALUE (адреса)

Объект есть область памяти; lvalue (адрес) есть выражение, ссыла ющееся на объект. Очевидный пример адресного выражения - имя объ екта.

Есть операции, дающие адресные выражения: например, если Е - выражение типа указатель, то*Е - адресное выражение, ссылающееся на объект, на который указываетЕ .

Термин «lvalue» происходит из выражения присваиванияЕ1=Е2 , в котором левый операндЕ1 должен быть адресным (value ) выражением.

Ниже при обсуждении каждого оператора указывается, требует ли он адресные операнды и возвращает ли он адресное значение.

Глава 11. Символы и целые

Символ или короткое целое могут использоваться, если может ис пользоваться целое. Во всех случаях значение преобразуется к целому.

Преобразование короткого целого к длинному всегда включает в себя знаковое расширение; целые являются величинами со знаком. Со держат символы знаковый разряд или нет, является машинно зависи мым. Более явный тип unsigned char ограничивает изменение значения от 0 до машинно зависимого максимума.

В машинах, где символы рассматриваются как имеющие знак (знаковые), символы множества кода ASCII являются положительными.

Введение в язык программирования С++

Однако, символьная константа, заданная восьмеричной esc по следовательностью подвергается знаковому расширению и может стать отрицательным числом; так например,"\377" имеет значение1 .

Когда длинное целое преобразуется в короткое или в char , оно урезается влево; избыточные биты просто теряются.

Float и doublе

Для выражений float могут выполняться действия арифметики с плавающей точкой одинарной точности. Преобразования между числа ми одинарной и двойной точности выполняются настолько математиче ски корректно, насколько позволяет аппаратура.

Плавающие и целые

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

Преобразование интегрального значения в плавающий тип вы полняются хорошо. При нехватке в аппаратной реализации требуемых бит, возникает некоторая потеря точности.

Указатели и целые

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

Можно производить вычитание над двумя указателями на объек ты одного типа; в этом случае результат преобразуется к типу int илиlong в зависимости от машины.

Всегда при сочетании целого без знака и обычного целого обыч ное целое преобразуется к типу unsigned и результат имеет типunsigned .

Значением является наименьшее целое без знака, равное целому со знаком (mod 2** (размер слова)) (т.е. по модулю2** (размер слова)). В дополнительном двоичном представлении это преобразование является пустым, и никаких реальных изменений в двоичном представлении не происходит.

Мы привыкли к быстрому доступу к информации и столь же быстрому её поглощению. Мы предпочитаем пятиминутные ролики глубоким лекциям и коротенькие статьи - книгам. Не буду утверждать, что хорошая книга по программированию заменит любую статью, это не так. И уж точно она не заменит практику. Тем не менее, лично ко мне настоящее понимание основ программирования пришло после того, как я, прорешав сотни задач на курсе программирования и прочитав тонну статей, начал параллельно изучать теорию по книгам и хорошо так в них углубился. Я довольно долго искал свой персональный «лучший учебник по Java для начинающих». Ниже - несколько книг, которые мне пригодились в большей или меньшей степени на разных этапах учёбы. «Для самых маленьких» Следующие две книги можно начинать читать на старте учёбы, параллельно с видео или, если учитесь на JavaRush, - вместе с первыми уровнями. Они, особенно первая, подходят людям с нулевым программистским прошлым.

Head First Java

Я начал с этой книги не потому, что она мне больше всего нравится, а потому, что она самая простая. Эта книга, по мнению очень многих программистов, - лучший самоучитель Java с нуля. Причём она по-настоящему и совсем «с нуля», то есть подходит тем, кто только-только начинает и не совсем понимает ещё, что за зверь такой - программирование. Ко мне она попала слишком поздно. Думаю, именно поэтому я не смог её оценить по достоинству. «Просто читать» её было очень приятно, а вот искать что-то конкретное в ней мне приходилось подолгу. Материал там подан живо, но довольно поверхностно (потому что с нуля!) и многих тем и нужных пояснений попросту нет. А вот мой друг, которому она ушла по наследству, был от нее в восторге и кричал, что это не просто лучший учебник по Java для начинающих, а прям мировой шедевр и именно так нужно подавать сложный материал. Достоинства:
  • Лучший самоучитель Java с нуля, для полных чайников, написан живым языком;
  • Прикольные иллюстрации и юмор;
  • Пояснения с жизненными примерами.
Недостатки:
  • Многовато «воды» для тех, кто уже въехал в тему;
  • Не всегда удачные паззлы и упражнения.

Герберт Шилдт. Java 8. Руководство для начинающих

Полистав этот учебник, я подумал, что он хорошо подойдёт тем, кому нравится более традиционное изложение материала, нежели в Headfirst, и при этом они ищут самоучитель «с нуля». Местами изложение в книге очень детальное, напоминает расширенную и переведённую документацию с хорошими наглядными примерами. Иногда, как по мне, автор переходит границу, и начинает слишком уж разжевывать, читать становиться скучновато… и вдруг - кульбит - и какое-то довольно сложное место проскакивается почти мгновенно, и ты в полном недоумении пытаешься понять, что и где пропустил. Тем не менее, таких мест в книге не слишком много, и я знаю людей, которые считают, что «Руководство для начинающих» - лучший самоучитель Java для тех, кто ещё ничего не знает. Лично мне он показался не очень ровным. Скажем, начинаю разбирать коллекции, и вместо человеческого пояснения мне подсовывают задачу по самостоятельному созданию Set на основе массивов. Классная задача, но я бы хотел для начала лучше понять, что такое стандартные коллекции! Хотя эта книга, как и предыдущая, считается учебником для начинающих, мой опыт преподавателя подсказывает, что она хороша только в совокупности с другими материалами: гуманитарию-свитчеру будет не всё просто и понятно. Лучше всего "Руководство для начинающих" подойдёт тому, кто худо-бедно учил программирование (например, в универе), давным-давно на него забил, и при этом ему нравится стиль изложения автора. Достоинства:
  • Традиционное вдумчивое изложение основ;
  • Хорошие примеры.
Недостатки:
  • Есть «прыжки» от «слишком разжевано» до «мельком сказано»;
  • Местами скучновато.
Кстати, у Герберта Шилдта есть ещё одна известная книга по программированию - «Java 8. Полное руководство». Это совсем другой учебник, более фундаментальный. К нему и переходим. Справочники и расширенные руководства Книги из этого раздела пригодятся тем, кто уже ввязался в по полной и ищет книги для лучшего понимания теории и практики.

Герберт Шилдт «Java 8. Полное руководство»

Эту книгу я решил загрузить из интернета, чтобы оценить, а потом - купить или не купить. Шутка ли, 1300 страниц текста! Ну и цена впечатляет не меньше объема. Точно так же я поступил и с двухтомником «Библиотека профессионала» Кея Хорстманна (о ней - ниже). Забегая наперед скажу, что я остановил свой выбор на второй. Почему? Потому что в книге «Java. Полное руководство» я узрел те же недостатки, что и в «Руководстве для начинающих». Иногда разжевано, иногда - скомкано, но при этом не просто скомкано, а как-то многословно скомкано. Вероятно, это - авторский стиль и, думаю, кому-то он будет по нраву, а точнее - по мышлению. В целом «Java 8. Полное руководство» - это неплохой справочник по Java. Но лично мне изложение тех же самых тем больше понравилось в другой книге. Достоинства:
  • Полное руководство. Кажется, там есть все темы, которые нужно знать новичку, и не только новичку.
  • Подробные пояснения.
Недостатки:
  • Много воды (но это кому-то может нравиться!);
  • Русский перевод не лучший.

Java. Библиотека профессионала, Кей С. Хорстманн, Гари Корнелл

Книги Шилдта и Хорстманна часто сравнивают друг с другом. И у той, и у другой есть преданные поклонники. Для меня именно двухтомник Хорстманна - лучший учебник по Java. Он же стал для меня настольной книгой на начальных и средних уровнях JavaRush. Когда я не понимал какую-то тему, в основном лез именно в Хорстманна, и тот многое прояснял. В книге рассматривается всё - от синтаксиса до многопоточного программирования, локализации приложений и работы с XML. И пусть вас не пугает название «Библиотека профессионала» (меня именно оно и отпугнуло), основы тут разобраны довольно хорошо. Кроме того, её полезно периодически перечитывать, чтобы освежить и упорядочить знания. Говорят, даже профессионалы находят в ней что-то полезное для себя… Не знаю. Стану профессионалом - расскажу! Достоинства:
  • При впечатляющем количестве страниц - мало воды (в отличие от Шилдта).
  • Содержит всё, что нужно новичкам.
  • Раскрывает Java 8.
  • Хорошая подача тем по коллекциям и дженерикам.
  • Очень хорошо сочетается с JavaRush. Доходите до темы, решаете задачки, в какой-то момент что-то не понимаете - смотрите Хорстманна, пробуете снова.
Недостатки:
  • Кому-то может показаться, что книга суховата;
  • Нет практики;
  • Русский перевод с ляпами.

«Java. Методы программирования». Блинов, Романчик

Когда-то я вычитал на форуме, что есть такая книга «Промышленное программирование», и в ней неплохие задачи. Оказалось - не соврали. Я нашёл её копию в PDF на сайте белорусского EPAM’а. Там издание не самое новое (по Java 6), а написана книга как основательный университетский учебник, то есть местами изложение несколько тяжеловесное, академическое. НО! Там действительно очень хороший сборник задач по программированию на Java, а также тестовые задания. Говорят, по этой книге учатся стажёры EPAM, а также её взяли на вооружение многие оффлайновые курсы по Java.

Там подход к задачам немного не такой, как у JavaRush, то есть, в среднем тут задачи чуть сложнее и каждая из них - что-то вроде… не мини, но микро-проекта. Так что рекомендую даже студентам JavaRush, так как недостатком практической стороны курса я считаю то, что все задачи в нём уже полностью спроектированы и есть слишком много подсказок. Скажем, задачи на ООП из этого сборника помогли мне очень неплохо разобраться в этом самом ООП наряду с книгами «неувядающей классики», о которых я пишу ниже. Книга написана как бы для будущих «гребцов», поэтому в ней описаны технологии Hibernate для разработки распределённых систем, а также основы HTML, XML, JavaScript. «Промышленное программирование» - если не лучший самоучитель Java, то очень неплохое учебное пособие. Но к ней нужно приходить уже подготовленным. Скажем, после десятка-другого уровней JavaRush. Позднее я обнаружил её более новое и переработанное издание, уже под именем «Java. Методы программирования ».

Достоинства:
  • Отличная подборка задач и тестовых заданий;
  • Есть официальная бесплатная версия (я полагаю, что она официальная, поскольку лежит не на каком-нибудь рутрекере, а на сайте EPAM);
  • Сравнение с С++.
  • Возможность понять, что проходят на стажировке EPAM.
Недостатки:
  • Слишком фундаментальное изложение. Но для повторения с практикой - подойдёт.
  • Нет Java 8.
Неувядающая классика Книги, о которых я пишу ниже можно назвать священными текстами для начинающих и продолжающих «джавистов».

Effective Java, Джошуа Блох

Это просто сокровище, а не книга, и посвящена она базовым принципам языка от одного из его авторов Джошуа Блоха. Скорее всего, вы уже пользовались его библиотеками (в Java Collection, например). Сразу оговорюсь: полнейшим новичкам, кроме каких-нибудь вундеркиндов-спидлёрнеров книга Effective Java не нужна. Сначала лучше усвоить синтаксис, и получить хоть какую-то практику программирования, так сказать, «набить шишки», а затем уже - браться за творение Джошуа Блоха. Книга пригодится тем, кто хочет по-настоящему понимать Java, сформировать правильный подход при программировании на этом языке, понять не только как нужно делать, но прочему нужно делать именно так. А ещё тем, кто хочет глубоко познать ООП (в принципе, это взаимосвязанные вещи). Эта книга - лучший учебник по Java в разрезе объектно-ориентированного подхода к программированию. Достоинства
  • Блестящее изложение материала по теме ООП.
  • Приведены лучшие практики программирования.
  • Автор очень хорошо знает Java изнутри.
Недостатки
  • Пока что отсутствует перевод самого нового издания книги (третьего).

Философия Java, Брюс Эккель

Название этой книги говорит само за себя. Это ещё одна «альфа и омега» для всех, кто хочет знать Java! В этой книге вы найдёте хорошие и внятные примеры, и из них будет понятно, как работает Java. Мне сложно сказать, какая из двух книг - «Философия Java» или «Эффективное программирование» - лучше. Я бы сказал, что Эккель несколько лояльнее к новичкам, в то время как Блох требует какого-никакого опыта. Впервые я прочитал главу из «Философии Java», когда только начинал учиться на JavaRush (кажется, на одном из ранних уровней она значилась в рекомендованных). Тогда она мне не пошла. Зато после 10 или 12 уровня - это была песня! И, я скажу, очень полезная песня. Я возвращался к ней и позже, уже когда пришёл к «Эффективному программированию». Скажу так: Блох и Эккель пускай говорят об одном и том же, но по-разному, и примеры приводят разные. Достоинства
  • Глубокое изложение принципов Java от профессионала;
  • Хорошо зайдет тем, кто переходит с других языков - много сравнений с С++, например.
  • Как мне кажется, её можно начинать читать уровня с 10-го, а вот Эккеля - чуть позднее.
Недостатки
  • Очень неудачные русские переводы;
  • Отсутствие нового издания книги на русском.

Краткие выводы

  1. Лучший самоучитель Java с нуля для тех, кто совсем ничего не знает - Head First Java;
  2. Лучший справочник-учебник по Java и настольная книга - «Библиотека профессионала». И, конечно, документация Oracle.
  3. Лучший сборник задач по программированию на Java - JavaRush. Ну а среди книг - «Java. Методы программирования».
  4. Лучшая неувядающая классика - «Философия Java» и «Effective Java». Это must read для всех, кто решил разобраться во всем по-настоящему, для глубокого понимания. Но лучше их читать постепенно и с расстановкой.
  5. Дополнительный вывод: есть возможность - читайте на английском. Русские переводы в основном очень слабые.



Top