Как говорят, на прошлой неделе состоялись 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
- C++, mapping to the machine, error handling
- Generic programming, classes and class hierarchies
- C++0x summary
Свойства языка не интересны, интересны технологии программирования, проектирование, и стиль.
- 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
Первый код никакой обработки не содержит и приведет к крэшу.
Второй код, уже с исключениями, выглядит правильным, но потенциально опасен тем, что код может быть рассредоточен по телу программы (БС - “число ошибок в программе пропорционально размеру кода”, затем добавил - “и его сложности”) и вы можете упустить закрытие файла, что приведет к утечке ресурсов.
Третий код использует 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
- 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
С++0х
Далее неожиданно и слишком коротко речь пошла о новом стандарте С++0х. БС сказал, что до окончания работы над стандартом осталось 2 митинга в Мадриде, что демократия при принятии решения заставляет работать с каждым членом комитета (около 60 на заседании), а коротко об этой работе можно сказать так
В короткий перерыв успел купить последнюю книжку Страуструпа и надписать ее у автора.
- slow, bureaucratic, democratic process
- 22 nations
- memberships 100-200
- ISO. started 1990, final draft 2010, will be C++11
- Make C++ a better language for systems programming and library building
- Make C++ easier to teach and learn
В короткий перерыв успел купить последнюю книжку Страуструпа и надписать ее у автора.
Далее речь пошла о шаблонах (лучше сказать о generic programming) и стандартной библиотеке с частым упоминанием А.Степанова и даже его дочери (она два года использовала / испытывала STL).
Benefit of inheritance. Interface
В целом, гораздо больше можно узнать из его книг, статей и интервью. Одно из последних интервью здесь. Есть любопытные утверждения, например
- 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
- 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++
- Brittle: spectacularly bad error message
- Poor overloading - leading to verbosity
- Much undisciplined hacking
- Much spectacularly obscure code
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
- simplifies implementation of derived class. common functionality can be provided in one place, changes can be done in one place.
- 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