Sunday, October 17, 2010

Как говорят, на прошлой неделе состоялись 2 важных визита в Москву: А.Шварценеггера, наверное, вы его встречали в метро, и Б.Страуструпа.
Я поучаствовал в мастер-классе Б.Страуструпа “Advanced Programming Techniques”, переведенное название (уверен, что В.Павловым) “Виртуозное программирование”. Семинар состоялся 13-го октября во Дворце культуры МГТУ с 8:30 до 14:00. Он был частью (лакомый кусочек для российских программистов) недельной конференции SECR 2010. Вел конференцию Владимир Павлов, многие хорошо помнят его по ярким и темпераментным проектам и тренингам в Intel. 


Несколько фотографий здесь

Бьярне Страуструп, далее БС


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

Семинар, он же мастер-класс и workshop

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


Главная идея презентации заключается в следующем
  • The key to reliability and perf are simple “lightweight”classes, type safety, absence of direct pointer use, and inlining.
  • without libraries every task is difficult and tedious
  • the tutorial focuses on the language features and programming we use to design, implement and use good libraries
  • my aim is improved understanding
  • my assumption is that you are a programmer who wants to deliver quality systems, not an academic
По плану, семинар должен был бы представлен в 3 частях:
  • C++, mapping to the machine, error handling
  • Generic programming, classes and class hierarchies
  • C++0x summary
это 128 слайдов в течение 4 часов вместе с вопросами. Но неполадки с проектированием слайдов и задержка начала семинара скомкали и укоротили выступление. Ниже - коротко и схематично, что из этого получилось. Вам встретятся также тексты нескольких слайдов, как это уже случилось выше.

Свойства языка не интересны, интересны технологии программирования, проектирование, и стиль.
  • A prog lang exists to help people express ideas
  • The primary value of a prog lang is in the app written in it
  • Ideals: work at the highest  feasible level of abstraction, represent concepts directly in code, represent relationships among concepts directly - hierarchical relationships (OOP), Parametric relationships (Generic programming)
Тысячи языков программирования, каждый (в действительности, многие) действует изолированно в изолированном окружении.
Последние 50 лет появлялось около 2 тыс языков в десятилетие
Почему не один язык. Картинка на слайде иллюстрирует как под действием языков различного уровня абстракций сформировался С++ и как он эволюционирует согласно требованиям разработчиков приложений и взглядам разработчиков языка.

В языке желательно поддержать такой высоты уровень абстракций, который бы был близок к тому, как мы думаем о решении проблемы для того, чтобы представить концепции прямо в коде. С помощью чего этого добиваются?
  • simple user-defined types. Classes.  Amazingly flexible, zero overhead
  • hierarchical organization. Class hierarchies, virtual functions. OOP, fixed min overhead
  • parameterized abstraction. Template. Generic programming, amazingly flexible, zero overhead
Отображение генерируемого кода на архитектуру определяет производительность кода.
  • C++ maps directly onto HW. build-in types fit into registers, matches machine instructions.
  • Abstractions: user-defined types are created by simple composition, zero-overhead principle: what you don’t use you don’t pay for, what you do use, you couldn’t hand code any better.
В вопросе контроля ошибок рассмотрены традиционные способы, затем пришли к полушутливому выводу, что крэш и перезагрузка является лучшим способом реагировать на ошибки в коде. Здесь же БС обратился к аудитории - “думаете сообщение перед абортированием приложения это решение?”.
  • Traditional error handling: error state (errno), error return codes, (err_code,value) pairs, give up
  • Traditional techniques do not integrate well with C++:  errors in constr, in composite objects
  • Caller knows (in principle) how to handle an error, but cannot  detect it
  • Callee can detect an error but doesn’t  know how to handle it
Эволюция контроля ошибок в использовании файла дана в кодах на следующих 3-х картинках.
Первый код никакой обработки не содержит и приведет к крэшу. 


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

Третий код использует RAII (resource acquisition is initialization) и может считаться надежным

Для надежности программы вы должны знать, что программа по мере выполнения находится в хорошем состоянии (по русски легко спутать с “в хорошей форме”) - “good state”, и состояние не должно быть случайным. Для этого вводится понятие инварианта (вы, конечно, читали об этом у Н.Вирта)
  • to recover from an error we must leave our prog in a “good” state
  • each class has a notion of what is its “good state”, called its invariant
  • an invariant is established by a constructor
Есть несколько уровней гарантии защищенности кода (exception-safety guarantees)
  • Basic guarantee (for all operations): the basic lib invariants are maintained, no resources are leaked
  • Strong guarantee (for some key operations): either the operation succeeds or it has no effects
  • No throw guarantee (for some key operations): the operation does not throw an exception
Пара критических замечаний
  • конструктор может и часто должен порождать исключения
  • деструктор не должен порождать исключения
Даны рекомендации по обеспечению надежности кода
  • decide which level of fault tolerance you need. not every piece of code needs to be exception safe
  • aim at providing the strong guarantee. Keep a good state until you have constructed  a new state, then update
  • always provide the basic guarantee if you can’t afford the  strong guarantee
  • define “good state” (invariant) carefully
  • minimize explicit try blocks
  • represent resources directly: avoid free standing new and delete operations, prefer RAII over code where possible
  • keep code structured, “random code”easily hides exception problems
Тут БС упомянул про ошибку в коде MS, которая просуществовала 17 лет. Причина ее была в выделении инициализирующего кода в отдельную от конструктора функцию.

С++0х
Далее неожиданно и слишком коротко речь пошла о новом стандарте С++0х. БС сказал, что до окончания работы над стандартом осталось 2 митинга в Мадриде, что демократия при принятии решения заставляет работать с каждым членом комитета (около 60 на заседании), а коротко об этой работе можно сказать так
  • slow, bureaucratic, democratic process
  • 22 nations
  • memberships 100-200
  • ISO. started 1990, final draft 2010, will be C++11
Похоже, что главная работа заключается в рассмотрении и отклонении предложений типа “а мне в моих приложениях нужно”, “а в Haskell реализованы”. При создании новой версии С++ руководствовались 2-мя главными целями
  • Make C++ a better language for systems programming and library building
  • Make C++ easier to teach and learn
Вы можете легко найти драфт и множество обсуждений стандарта в интернете.
В короткий перерыв успел купить последнюю книжку Страуструпа и надписать ее у автора.

Далее речь пошла о шаблонах (лучше сказать о generic programming) и стандартной библиотеке с частым упоминанием А.Степанова и даже его дочери (она два года использовала / испытывала STL).
  • A.Stepanov: “Aim: the most general, most efficient, most flexible representation of concepts”
  • Don’t abstract for the sake of abstraction
  • Generalize from concrete example
  • Maintain performance
Templates are great
  • Flexible
  • General
  • Great performance in time and place
  • The language base for modern generic programming in C++
  • The language base for most current high-perf work in C++
  • The language base for template meta-programming in C++
But
  • Brittle: spectacularly bad error message
  • Poor overloading - leading to verbosity
  • Much undisciplined hacking
  • Much spectacularly obscure code
Далее - про итераторы, обеспечивающие прорывную эффективность программирования, про наследование, про высокую производительность кода благодаря шаблонам и inline. В частности, про наследование
Benefit of inheritance. Interface
  • a function expecting a shape can accept any object of a class derived from shape. simplifies use
  • we can add derived classes to a program without rewriting user code
Benefit of inheritance. Implementation
  • simplifies implementation of derived class. common functionality can be provided in one place, changes can be done in one place.
Problems with inheritance
  • anyone can provide a derived class that overrides a virtual function. “insanity is hereditary: you can get it from your kids
  • anyone can provide a derived class with a larger object size. arrays + inheritance = trouble
  • you cannot change a base class after deploying
  • Manipulate a class from a hierarchy through a ptr or ref

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


Накладки
  • Задержка начала семинара почти на час, хотя БС появился раньше, чем в 8:30
  • Во второй половине семинара перестали переключаться слайды. Похоже, презентационный компьютер был включен в сеть через wifi для подсоединения к проектору, терял связь, и просил авторизоваться, когда находил. Тех специалисты раз за разом тупо авторизовались, вместо того, чтобы решить проблему с презентацией. БС сначала шутил, потом перестал. Переходил на ответы на вопросы и пытался продолжить рассказ без слайдов. Ощущение было позорное
  • Невозможно было выпить кофе, то есть, для меня позавтракать, - короткий перерыв и длинная очередь в узкую дверь буфета с 2-мя продавщицами и одной кофе-машиной.
  • Согласно отзывам, синхронный перевод был “кошмарным”
Заданные вопросы. Не понял 2 из них, пометил “?”. В.Павлов сказал, как правильно задавать вопросы.

  • Использование библиотек полных ошибок и небрежного кода. БС: долгосрочное решение - переписывать, краткосрочное - симулировать ресурсы и их ограничения.
  • ? контролируемые исключения. БС: вижу в этом притворство, ни вижу, кто сделал это, даже в Java. Мы не знаем, как это делать.
  • Исключения в call-back. БС: это не проблема исключений, это проблема правильности, анализируйте инварианты в функциях.
  • Возможное разрушение кода в процессе оптимизации, можно ли построить компилятор, чтобы поддержать 2 подъязыка - нижнего и верхнего уровня? БС: я не знаю никого, кто бы пытался сделать такое. Наша задача высокий уровень абстракции с достаточной производительностью кода. DSL может быть использован.
  • Почему нет базового класса для всех исключений? БС: универсальности не существует, возникнут проблемы, если использовать много разных библиотек, конфликт имен, например.
  • Инъекция, например, состояния, как в Java. БС: не нравится, сложно поддерживать.
  • Почему из C++0x исключен concepts? БС: не хватило времени сделать качественно.
  • ? проверка синтаксиса на полный стандарт. БС: не думаю, что многие согласятся, у меня например есть код, которым я не горжусь.
  • Взаимодействие с разработчиками компиляторов. БС: мы разрабатываем стандарт, не может воздействовать на них и запретить их частные расширения языка
  • Компилятор, находящий проблемы на стеке. БС: если вы про массивы, то используйте стандартные контейнеры, использующие динамическую память.
  • ООП сделано 25 лет назад, что дальше? БС: я до сих пор в ООП. Может быть многопоточность.
  • Шаблоны хороши параметризацией, что, если мне нужен один тип сегодня, а завтра обобщенный тип (число)? БС: используйте указатель.
  • Метапрограммирование сложно, как сделать проще? БС: если у вас 5 параметров, то код плохой. мое предпочтение - не больше 3-х. Лямбда в новой версии поможет.
  • Traits, почему только на чтения? БС: const упрощенная версия, с которой мы начали.
  • Вы предпочитаете не изменяемый интерфейс, как насчет функционального программирования? БС: стало популярным, мне нравятся его свойства, но не производительность кода. В С++0х мы ввели лямбда функции.
  • Как часто вы используете unit тестирование? БС: должен использовать чаще.
  • Мне нравится С++, но С лучше. Если официальные данные о сравнении? БС: трудно сравнивать языки. Есть свидетельства в пользу С++.
И все-таки у БС есть чувство юмора, судите об этом по следующей картинке


No comments:

Post a Comment