Objective-C и C++, рождение

Удивительно, но всего 15-20 лет назад между поклонниками этих языков шла чуть ли не война. Асимметричная. Со стороны “ущемляемого меньшинства”. “Большинство” даже не подозревало о существовании противника и не сопротивлялось. Интересно: в наши дни кто-нибудь догадается какой из этих языков был “большинством”, а какой – наоборот? Открою еще одну Америку: у каждого из этих языков были и есть свои фирменные недостатки, и они оба относятся к великим языкам программирования. Автору этих срок довелось “пожить” в этих языках, 6 лет в C++ и 15 в Objective-C, что ни о чем не говорит и ничего не гарантирует. Кроме того, пожалуй, что автор кое-что про эти языки знает…

Кто родился раньше?
Удивительно, но если бы Objective-C и в самом деле появился на свет раньше, чем C++, в споре между поклонниками этих языков это был бы, скорее, аргумент в пользу C++.
Вот что мне удалось установить: информация об этих языках была впервые опубликована в 18 томе авторитетного издания SIGPLAN, в 1983 году. Про Objective-C – в первом номере этого тома, в январе. Про C++ – в каком-то другом (не первом) номере. То есть, позже. Ура!
А теперь разберемся. Эмоции, бушевавшие двадцать с лишним лет тому назад, больше не искажают реальность, и теперь я могу писать про Objective-C объективно. Архив SIGPLAN в сети есть, но доступ к текстам статей… платный.
Но это не единственный источник информации об этих языках. В 1979 году, датский программист Бьярн Строустроп пришел к выводу (который хоть и перестал в наши дни быть очевидным, но все еще правильный), что объектно-ориентированный подход на порядок ускоряет и облегчает разработку сложного программного обеспечения.
Вот только простому программисту в 1979 году этот подход был недоступен. А программы, которыми мы пользуемся, которые сразу любим и ненавидим, пишутся именно “простыми” программистами, которые занимаются этим непростым делом по 8-10 часов в день пять дней в неделю, год за годом…
Проект, разрабатываемый для себя, Бьярн назвал “C с классами” (C with Classes). Суть замысла была проста и логична: из всех преимуществ ООП (объектно-ориентированное программирование) важнее всего то, что ускоряет и облегчает разработку.
Поэтому “C с классами” был объектно-ориентированным языком только в исходном коде, где существовали классы и объекты, наследование и другие признаки ООП. Компилятор превращал все эти теоретические построения в обычный процедурный код, который не уступал (в начале почти не уступал) по эффективности коду, написанному на традиционных языках программирования обычным способом, без привлечения магии.
С 1979 по 1983 Бьярн выполнил колоссальный объем работы, спроектировав и реализовав “улучшенный C”, добившись его устойчивой работы и даже опубликовал несколько статей о CwC (C with Classes), которые привлекли к ним внимание. В 1983 году Бьярн решил, что язык имеет смысл не только для него, и что пришло время для его активного продвижения. Бьярн переименовал его в C++, написал статью в SIGPLAN и приступил к написанию книги “C++ Programming Language”.
C++ впервые был упомянут в 1983, в публикации в SIGPLAN – это правда, но не вся правда. К тому моменту это был реально существующий язык, его уже пробовали сотни (или даже тысячи) добровольцев. Перед публикацией его, всего лишь, переименовали в “дважды приплюснутый Си”.
В 1985 году C++ стал продаваться, и к началу 90-х тал главным языком программирования во всем мире. Я начал им пользоваться в 1995, по сравнению с Object Pascal C++ был как Боинг 787 по сравнению с кукурузником. Сложнее, разнообразнее, современнее. Мощнее, в конце концов.
Освоение C++ требовало времени и приличных усилий (язык непрост), но он того стоил.

Замысел, приведший к появлению Objective-C
Статья в первом номере 18 тома SIGPLAN называлась “The object-oriented pre-compiler: programming Smalltalk 80 methods in C language”. То есть, “Объектно-ориентированный пре-компилятор: программирование методов Smalltalk 80 на языке C”. В статье, и в отзывах на неё, для обозначения предка Objective-C использовали аббревиатуру OOPC.
В 1983 году OOPC появился в публичном пространстве, находясь в эмбриональной фазе своего развития. Он был чем-то вроде “C с классами”, но от еще одной команды.
Когда соотношение числа использующих Objective-C и C++ было примерно 1:1000, если не 1:10000 (умозрительная оценка), почему-то это причиняло боль и требовало оправданий. Оправдания были найдены: создатели Objective-C, Брэдли Кокс и Том Лав, названные в википедии “учеными”, будто бы просто экспериментировали, и вообще не планировали для него никакого коммерческого применения.
Просто так, ради чистой науки. Глава и владелец частной компании StepStone Брэд Кокс и один из сотрудников той же компании Том Лав. Ну да…
По сравнению с понятной и привлекательной для обычного программиста концепцией C++, замысел Брэда и Тома был глубже и, поскольку никто так и не смог его внятно и понятно изложить, казался заумным и притянутым за уши.
Но мы исправим их ошибку: замысел был что надо.
По старому программистскому поверью, в каждых ста строках нового кода, независимо от того насколько тщательно и педантично он тестируется, обязательно есть два серьезных бага, которые проявят себя только оказавшись в руках пользователей. При увеличении размера кода в N раз, число таких багов возрастает в N в третьей степени раз.
Это, естественно, преувеличение и шутка юмора, но реально существующая проблема в ней отражена точно. Есть ли способ решения этой проблемы? Есть.
Повторное использование кода (reuse). Код, который уже обкатан на пользователях, в котором уже выявили и истребили всех (почти всех) багов, заведомо надежнее чем новый, только что написанный, код.

В объектно-ориентированных средах программирования (типа Smalltalk) нужный эффект достигается проще и быстрее, чуть ли не сам собой (или при соблюдении определенной гигиены при принятии решений). Вот только… Этот подход, как уже сообщалось в эпизоде про создание C++, простому программисту в начале 80-х был практически недоступен.
Использовать Smalltalk можно было только на мощных рабочих станциях (то есть, на очень дорогих), даже на этих станциях написанный на Smalltalk код был невероятно медлителен. И лицензия на сам Smalltalk была, мягко говоря, не бесплатной.
А кроме того, язык был слишком необычен – как используемыми в нем принципами (всё, что в нем есть – объекты, включая числа и классы; все действия, в том числе арифметика, осуществляются отправкой сообщений от объекта к объекту…), так и синтаксисом.
Это не так сложно, как кажется. Язык был разработан в Xerox PARC (Palo Alto Research Center) в Learning Research Group (LRG, группе исследований процесса обучения), проект и группу возглавлял Алан Кэй, и разработчики Smalltalk проводили опыты над детьми.
Дети от 8 до 15 лет, после короткого и совсем несложного обучения основным принципам Smalltalk, запросто решали очень сложные задачи, приводя гостей центра в изумление. На решение подобных задач у взрослых и опытных программистов ушли бы месяцы…
Но взрослому, тем более профессионалу, тем более во власти привычек и под гнетом его производственной программы, совершить подобное насилие над собой намного сложней.
Рождение OOPC (Objective-C)
Брэд, Том и оставшиеся безымянными сотрудники StepStone, разработали OOPC, язык для пре-компилятора – код на “чистом C” с добавленными в него обращениями к объектно-ориентированной среде времени исполнения, полностью реализующей ОО-парадигму Smalltalk, за исключением двух её “фич”: сборщика мусора и замыканий.
ОО-парадигма Smalltalk звучит страшновато, на самом деле в С были добавлены три или четыре грамматические конструкции, и она директива. Минимум!
И сам пре-компилятор, который превращал исходные коды на OOPC в коды на обычном стандартном C – который скармливали стандартному компилятору, получая на выходе работающие программы.
Все это делалось в одним из Unix’ов, и к 1983 году работало безупречно. Среда времени исполнения, на порядок более “легкая”, чем аналогичная среда Smalltalk, устанавливалась в Unix’е легко, непринужденно и стандартными средствами.
Для тех, кто понимал что к чему, эффект был потрясающий.
Помимо “повторного использования кода”, о котором мечтали Брэд и Том, и которое эта система разве что делала более удобным и естественным (но его она не гарантировала), это была настоящая действующая объектно-ориентированная среда, аналоги которой стоили десятки (если не сотни) тысяч долларов, которой было достаточно самого обычного компьютера.
Замечательные инженеры и отличные программисты, они так и не смогли превратить созданное ими чудо в источник доходов, сделав его достоянием всего мира. Сколько они хотели за OOPC, неизвестно. Книгу (куда более необходимую для OOPC, чем для C++) они даже не пытались написать.
Канал распространения – через знакомых, знакомых этих знакомых, никакой рекламы. А Интернета еще не было. Трети желающих OOPC достался вообще за так.
В OOPC управление памятью (создание и уничтожение объектов) было делегировано C. Никаких счетчиков ссылок, они появились только в NeXTSTEP 2.0.
В базовом классе (благодаря особенностям OOPC, проблема “хрупкого базового класса” библиотекам OOPC не грозила) Object, был реализован механизм превращения любого объекта в “плоское” представление, для сохранения на диск, и для восстановления из “плоского” представления, и два метода, save и load, для переопределения в подклассах.
Библиотека OOPC была фрагментом библиотеки Smalltalk, в которой отсутствовало все, что связано с графическим пользовательским интерфейсом, с перехватом и обработкой событий, с графикой в любом виде – в современных терминах это был Foundation Kit.
В конце 80-х, когда NeXT взяла в аренду OOPC, язык и базовая библиотека OOPC почти не изменились. У StepStone, к тому времени, уже был полноценный компилятор Objective-C, но NeXT он чем-то не удовлетворил – и они разработали собственный, основанный на GCC.
Продолжение следует
__

[ оригинал ]