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

12

Удивительно, но всего 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.

Продолжение следует

Лучший комментарий

12 комментариев Оставить свой

  1. 2

    Спасибо, познавательно!

  2. -11

    Хотел избавиться от жира на боках и на животе. В остальном мне все нравилось. Раньше регулярно занимался в зале, но теперь времени нет, жена все чаще упрекала о появившимся пузе. Я решил заказать пояс, и заодно узнать, проверить его эффективность. Все намного лучше чем я ошидал. следуя инструкциям я привел свое тело в порядок —- http://qrf.in/laif6t

  3. 1

    Спасибо.

    • 0
      Олег Свиргстин

      evav1955, Да, спасибо за уточнение!
      Про Smalltalk/V слышу в первый раз, про Simula собираюсь написать, сверхпрожорливость Smalltalk была в мое время «всем известна»… И все реализации, с которыми довелось, и в самом деле были жадными до ресурсов.
      Плюсую.

      • 0

        Олег, Сам я со Smalltalk/V не работал, но некоторые мои приятели разрабатывали пакет на нем. Помнится делали они это на Wang’ах с монохромными — зелененькими 😉 — экранами.

  4. -2

    Да что это такое вообще

  5. -2

    Что за беллетристика?

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

    Вам действительно такое приятно читать? Если так, то мне очень жаль вас

  6. 0

    > Бьярн Строустроп

    http://www.stroustrup.com/bs_faq.html#pronounce

    > My second name is Stroustrup — not Stroustroup, Stroustrop,

  7. 0

    Хотел избавиться от жира на боках и на животе. В остальном мне все нравилось. Раньше регулярно занимался в зале, но теперь времени нет, жена все чаще упрекала о появившимся пузе. Я решил заказать пояс, и заодно узнать, проверить его эффективность. Все намного лучше чем я ожидал. следуя инструкциям я привел свое тело в порядок —- http://qrf.in/laif6t

Авторизуйтесь Чтобы оставить комментарий

Новости партнеров