Реферат: Философские аспекты программирования. Будьте всегда любопытными. Морально - этические проблемы программирования

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

«Философия»

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

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

УДК 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** (размер слова)). В дополнительном двоичном представлении это преобразование является пустым, и никаких реальных изменений в двоичном представлении не происходит.

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

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

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

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

Функция Мировоззрение(Ценности) Ценности = Алгоритм вычисления ценностей() Вернуть Ценности Конец Функции Основная программа Цикл (повторять бесконечно){ Ценности = Мировоззрение(Ценности) } Конец программы

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

Как известно, для компьютер способен записывать слова (текст) и объекты (3д модели, картинки). Единственная брешь, которая стоит на пути создании ИИ - понятие. Т.е. то, что связывает слово и объект. Если кто-то придумает, как засунуть в машину систему понятий, то ИИ будет создан.



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

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

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

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

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

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

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

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

Посмотрело: 873

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

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

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

Здесь и далее я буду рассматривать общекнижный пример с сотрудниками предприятия, писать будем на чем-то СИ-подобном. Наследовать класс Сотрудник (Employee) от класса Человек (Person) – прекрасная идея, особенно если хранить данные исключительно в памяти: SQL имеет некоторые проблемы с наследованием таблиц, но речь не об этом - ООП со своим иерархизмом, агрегациями, композициями и наследованиями предлагает идеальный способ организации данных. Проблемы с методами.

За каждым методом бизнес-логики стоит факт мира, который этот метод (чаще не в одиночку) моделирует. Факты программирования – это операции: дальше будем называть их так. Делая метод членом класса, ООП требует от нас привязать операцию к объекту, что невозможно, потому что операция – это взаимодействие объектов (двух и более), кроме случая унарной операции, чистой рефлексии. Метод ВыдатьЗарплату (PaySalary) может быть отнесен к классам Сотрудник (Employee), Касса (Cash), БанковскийСчет (Account) – все они равнозначны в праве владения им. Дилемма о расположении методов сопутствует всему процессу разработки: неловкое ее разрешение может оказаться критичным и даже фатальным.

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

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


В 2015 году вы могли заметить перемены в способе разработки приложений на JavaScript. Разработчики уходят от непредсказуемой архитектуры с мутабельным состоянием в сторону более предсказуемой иммутабельной архитектуры приложений .

С такими фреймворками как Backbone, было принято синхронизировать сами данные и представление данных – для этого приходилось вручную подписываться на нужные события dom. Такой способ был подвержен ошибкам и вынуждал использовать слишком много типового кода. Пришел Angular и исправил это с помощью автоматизированного двустороннего биндинга.

Но сейчас все движется в другом направлении.

… но это нормально. Любое проектирование отстой. И всегда будет отстоем.

Если вы мне не верите, давайте объясню…

Ни один проект не переживает встречи с реализацией

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

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

Это нормально.

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

Недостающие данные могут быть сделаны опциональными или заменены умолчальными.

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

Ограничение уникальности можно

Еще по ходу чтения мне вспомнился Эдсгер Дейкстра с его знаменитой фразой: «Я денно и нощно молю, чтобы как можно больше моих собратьев-программистов нашли способ освободиться от проклятья совместимости» («I pray daily that more of my fellow-programmers may find the means of freeing themselves from the curse of compatibility») из книги Смиренный программист (1972 sic!!!). А позже и Эрик Реймонд с своим Собором и Базаром (1997 год). Но текст Винджа не только о проклятье совместимости, на трех страничках поднят (и в общем то оставлен без ответов) целый пласт вопросов:

  1. Проблема совместимости в широком смысле;
  2. Проблема поддержки старого кода;
  3. Проблема зависимости человеческой жизни «от бесчувственных роботов» (с), к чему мы стремительно приближаемся;
  4. Проблема data mining`а вообще и поиска готового решения в бездонной бочке рецептов в частности (github, stack overflow?);
  5. Проблема «переписывания» старого кода (и плохого, и хорошего) - этот момент так и хочется перечитывать:);
  6. Проблема необъятности ИТ-технологий. Иногда говорят, что последний универсальный физик жил в середине пошлого века, имея ввиду Льва Ландау. Похоже сейчас наступает (или уже наступило) время, когда найти универсального программиста таки уже невозможно;
  7. В тексте нет слова хакер, ни в позитивной, ни в негативной коннотации. Но написано и об исследователях, и о тех преимуществах, которые можно получить зная те или иные backdoor`ы и о том, какую власть это может дать.
  8. и наверное это не все… :)

Складывается впечатление, что писал это человек, на своей шкуре прочувствовавший эти самые проблемы.
Хочу отметить, что «Глубина в небе» была написана в 1999 году, когда многое из того, о чем пишет Виндж еще не было проблемой, или вообще только показалось на горизонте.

В качестве критики хочется отметить, что Виндж прошел мимо ИИ (и сильного и слабого, вообще мимо пробежал, даже нейронные сети не затронул) и свел преимущества ИТ к производительности. Так же в тексте не ощущается присутствие мегакорпораций (хотя конечно «Глубина в небе» не относится к киберпанку), если не считать Кенг-Хо таковой. Нет патентных войн, не затронуты вопрос копирайта и проблема закрытых проприетарных разработок, исходные коды к которым так и не были опубликованы.

Не о программировании, но о стандартах

Дальше в той же главе затронут интереснейший вопрос галактического вещания с целью распространения собственных технологий. Зачем? Стандартизация. Распространение собственного языка и собственных стандартов и технологий, что позволит с одной стороны подтянуть отсталые цивилизации до приемлемого для торговли уровня, а с другой снизить затраты на коммуникацию и обеспечение совместимости и как следствие облегчит торговлю и повысит маржинальность. Интересно, знал ли Виндж на момент написания книги о стандартизации корабельной оснастки английского флота времен великих завоеваний, позволившей снизить затраты на ремонт и обслуживание? А о распространении английского языка в качестве делового, научного и т.д.? Англичане учили (заставляли учить?) местных аборигенов своему языку. Аналогично поступали испанцы и французы. И сейчас английский, испанский, французский, португальский имеют очень широкое распространение. А вот голландцы считали, что аборигенов не нужно учить своему языку. Много ли мест на земном шаре, где говорят на голландском кроме самой Голландии?
Сейчас обучение английскому поставлено на поток по всему миру. Использование стандартизированных методик и учебников, стандартизированных экзаменов и шкал оценок. Только ли частный бизнес?

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

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

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

Кто умеет копировать, тот умеет ДЕЛАТЬ. Это сказал Леонардо да Винчи. Видите ли, вы исходите из своих представлений, о том, что такое ХР, винда, операционка. Люди как рассуждают:

Мне было ещё мало лет у меня стояла ХР, вот были золотые деньки, но тепереча не то, что давеча. Новые времена, современное ПО. Не понимаю, зачем копаться в старье? Вы бы хоть делали клон десятой винды, но куда с вашей то скоростью, вы его сделаете лет через 100.

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