Smalltalk по-русски
Advertisement

В 1994 году сформировалась объединенная команда, состоящая из специалистов по системам типов и нескольких разработчиков языка и виртуальной машины Self. В течении следующих двух лет была создана очень интересная реализация Смолтока, Strongtalk. Вскоре после демонстрации технологии на OOPSLA'96 фирма Animorphic Systems, Inc была куплена Sun Microsystems, а разработчики Strongtalk брошены на разработку ВМ HotSpot для Java.

Ниже предлагается вольный перевод статьи "История проекта Strongtalk", написаной руководителем группы разработчиков Дейвом Гризволдом.

(перевод сырой, нуждается в редактуре)

Статья "История проекта Strongtalk"[]

Предыстория Strongtalk распадается на две ветви, началом которых были независимые исследования на противоположных концах страны.

На Западном побережье группа под руководством Дэвида Юнгара (David Ungar) и Рэндалла Смита (Randall Smith) работала над радикально новой технологией виртуальных машин, которая позволила бы с достойной скоростью исполнять программы основанного на прототипах объектно-ориентированного языка Self. У них были мощная ВМ и великолепный сборщик мусора, но настоящая проблема заключалась в компиляции. Примитивные типы данных Self являются "честными" объектами, как в Smalltalk, а не специальными сущностями, как в C++, C# или Java [это означает, что для них должен работать полиморфизм -- б.б.]. В сочетании с тем, что Self (как, опять-таки, и Smalltalk) является языком с динамической типизацией, это приводит к серьезным накладным расходам при работе с фундаментальными вещами вроде битов и целых чисел, поскольку видя выражение a+b (или flag ifTrue: [...]) компилятор не может быть уверен, что имеет дело с целыми или с булевскими величинами. Еще один источник накладных расходов -- определение управляющих конструкций через блоки кода.

Положение усугублялось тем, что в Self нет прямого доступа к переменным экземпляра -- доступ к ним происходит только через методы доступа (то, что на первый взгялд выглядит как обращение к переменным, на самом деле является "синтаксическим сахаром" для вызова этих методов). В силу этих причин в технологию компиляции было вложено огромное количество усилий.

Настоящим прорывом со стороны ВМ стал созданый Урсом Хольцле (Urs Hoezle) type-feedback-компилятор, впервые позволивший заинлайнить большую часть посылок сообщений в обычном коде. После инлайнинга (иногда весьма многоуровневого), компилятор мог намного лучше оптимизировать код -- необходимое условие для существенного прироста производительности. Для осуществления всего этого потребовались весьма экзотичные механизмы вроде оптимистического инлайнинга с возможностью обратной свертки на лету в случае, нарушены предположения, исходя из которых выполнялся инлайнинг.

Self был огромным прорывом в исследованиях, но это был принципиально другой язык, нежели Smalltalk, и Self-система не была пригодна для промышленного использования из-за нестабильной работы и объема занимаемой памяти. Но благодаря ему было впервые показано, что языки с динамической типизацией могут в принципе достигнуть скоростей исполнения, сопоставимых с C.

На Восточном побережье я (Дейв Гризволд) был опечален многочисленными препятствиями, мешающими промышленному использованию Смолтока. Реализации ParcPlace и Digitalk прошли большой путь, во частности за счет механизма динамической трансляции Дойча/Шифмана (Deutch, Shiffman), который на тот момент обеспечил ускорение в 1.6 раза. Но такая скорость была совершенно недостаточной для интенсивных вычислений (которыми я занимался), а кроме того, я ощущал и другие препятствия, мешающие массовому использованию языка. Одним из таких препятствий с моей точки зрения было отсутствие системы типов -- свойство, придающее языку необычайную гибкость, но в то же время делающее созидание и понимание больших систем намного более сложным. Другим препятствием была слабая поддержка средств пользовательского интерфейса конкретных платформ, принесенная в жертву во имя переносимости. Неплохая идея с точки зрения человека, приверженного идеологии переносимости, но на практике она оборачивалась (и, в большой степени, оборачивается и сейчас) тем, что получающиеся в результате интерфейсы выбиваются из окружения (эмуляция средств конкретной платформы, например Windows, проблему до конца не решает).

Несколько человек уже пытались создавать систему типов для Смолтока (Borning&Ingalls, Palsberg&Schwartzbach, Graver&Johnson), однако эта задача показала себя как весьма сложная из-за чрезвычайной гибкости языка по сравнению со статически типизированными, не говоря уже о неподъемной задаче натягивания системы типов на уже существующий натипизированный код. Все предыдущие системы типов работали на крошечных фрагментах кода и даже близко не подошли уровню, необходимому для практического использования.

Однако я был уверен, что создать такую систему можно. Я нанял Джилада Браху (Gilad Bracha), который много знал о подобных вещах, и у которого были интересные идеи насчет вещей вроде микс-инов (mixins) и мы принялись создавать систему типов для Смолтока, которая работала бы. Первый вариант системы, о котором мы писали в трудах OOPSLA'93, работал, но весьма неуклюже, поскольку был намертво привязан к библиотекам ParcPlace. Это затрудняло работу, так как в "правильном" Смолтоке с типами базовые библиотеки должны быть иначе организованы, чтобы дать возможность проверки типов при наследовании. Существующие библиотеки полны отношениями наследования между несовместимыми типами (например, Dictionary и Set), так что мы были вынуждены задавать иерархию типов, отличающуюся от имевшей место в действительности иерархии классов.

В это время я исследовал различные пути способы ускорить Смолток (система типов для оптимизации не использовалась), но без экзотичных механизмов вроде оптимистического инлайнинга, эта задача не решалась. Лучшее, чего удалось достичь в направлении инлайнинга без использования type-feedback -- это специализация (customization): копирование методов вниз по иерархии наследования, позволяющее считать класс константой [в контексте конкретного метода] и инлайнить посылки сообщений самому себе. Я подсчитал, что в случае библиотеки ParcPlace это позволит заинлайнить около 25% методов.

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

Две технологии встретились, когда я начал общаться с Урсом Хольцле, только что закончившим type-feedback-компилятор (и диссертацию в Стенфорде) и ищущим, что бы поделать интересного. Прочитав его диссертацию я осознал, что механизм type-feedback не настолько сложен, как считали люди, читавшие о нем в контексте Self и впечатленные им до степени испуга. Походе, никто не оценил того, что type-feedback может стать основой для великолепного компилятора промышленного качества (хотя переход от Self к Смолтоку потребовал бы серьезных изменений).

Это была прекрасная возможность -- с технологией Урса (а также Ларса Бака (Lars Bak), внесшего огромный вклад в ВМ Self и знавшего ее вдоль и поперек) мы получали независимые друг от друга систему типов и технологию компиляции, которые могли стать основанием для Смолток-системы промышленного качества. Эта независимость очень важна, поскольку позволяла людям писать как типизированный, так и нетипизированный код, используя систему типов ровно в той степени, в которой это удобно и не жертвуя при этом производительностью.

Вместе с еще несколькими талантивыми людьми мы получили великолепную команду. В алфавитном порядке:

  • Ларс Бак (Lars Bak) -- был кудесником по части ВМ
  • Джилад Браха (Gilad Bracha) написал проверку типов, поддержку reflective interface, а также микс-ины в их смолтоковской части
  • Стивен Грерап (Steffen Grarup), работавший не только над ВМ (особенно над сборщиком мусора), но и на стороне Смолтока, где им были написаны среда программирования, система управления исходным кодом и многое другое
  • Дэвид Гризволд (David Griswold) написал типизированные версии библиотек из Синей книги систему пользовательского интерфейса на основе глифов (glyph-based user interface framework), виджеты, HTML-браузер, а также руководил работой группы
  • Роберт Гриземер (Robert Griesemer) написал интерпретатор, генератор интерпретаторов, большую часть компилятора и другие части ВМ (он также написал альтернативный компилятор, еще более быстрый, но он не был доведен и в этот релиз не включен)
  • Урс Хольцле (Urs Hoelzle) работал, разумеется, над компилятором, а также над хитрыми механизмами инлайнинга и другими частями ВМ
  • Позднее присоединился Срджан Митрович (Srdjan Mitrovic), проделавший основную работу по адаптации технологии к языку Java

Как сказано во введении, работа над системой началась осенью 1994, и к 1996 система неплохо работала, но затем всему настала Java, и мы вынуждены были переключиться на нее ещё до выпуска хоть чего-нибудь. Единственная публичная демонстрация данной технологии имела место в конце 1996, когда наш стенд на OOPSLA привлек некоторое внимание. Несколько человек оценивали её частным образом, и получали удивительные результаты в тестах производительности (один широко известный деятель получил двенадцатикратное ускорение для реального кода на Смолтоке), но затем она пропала из виду, а мы переключились на Java.

Глядя в будущее: Strongtalk содержит инновации, которые до сих пор остаются далеко впереди мейнстримных языков и ВМ. Теперь, когда исходники системы полностью открыты, будущее зависит от вас.

Дальнейшая судьба участников проекта[]

  • Ларс Бак работал над встраиваемой версией HotSpot, а в 2002г. покинул Sun, и вместе со Стивеном Грерапом основал фирму OOVM, предлагающую одноименную встраиваемую реализацию Смолтока -- OOVM. В 2004г. фирма была куплена швейцарской компанией Esmertec, которая предлагает OOVM под названием Object-Oriented software platform (OSVM). Работы над OSVM в настоящее время ведет японское отделение Esmertec (citation needed)
  • Джилад Браха продолжает исследования в области систем типов и реализации ОО-языков. Долгое время провел в Sun. В конце 2006 он покинул Sun ради Cadence (последняя запись в его рабочем блоге в Sun). В настоящее время работает над языком Newspeak.
  • К 2006 году Роберт Гриземер и Урс Хольцле в Google
  • В 2008 году Бак и Гризволд также оказываются в Google, где ведут работу над ВМ для Javascript -- V8 (письмо Гризволда)

Смотрите также[]

Advertisement