Введение
В вычислительной технике, Система Объектная Модель (SOM) — это объектно-ориентированная система общих библиотек, разработанная IBM. DSOM, распределенная версия на основе CORBA, обеспечивала взаимодействие объектов на разных компьютерах. SOM определяет интерфейс между программами или между библиотеками и программами, отделяя интерфейс объекта от его реализации. SOM позволяет определять классы объектов на одном языке программирования и использовать их в другом, а также обновлять библиотеки таких классов без перекомпиляции клиентского кода. Библиотека SOM состоит из набора классов, методов, статических функций и членов данных. Программы, использующие библиотеку SOM, могут создавать объекты заданных типов, использовать определенные для этих типов методы и создавать подклассы на основе классов SOM, даже если язык программы, обращающейся к библиотеке SOM, не поддерживает строгую типизацию классов. Библиотека SOM и программы, использующие объекты и методы этой библиотеки, могут быть написаны на разных языках программирования. SOM также минимизирует влияние изменений в библиотеках. Если библиотека SOM изменяется с добавлением новых классов или методов, либо с изменением внутренней реализации классов или методов, программу, использующую эту библиотеку, можно запустить без перекомпиляции. Это не характерно для многих других библиотек C++, которые в некоторых случаях требуют перекомпиляции всех программ, использующих их, при изменении библиотек – проблема, известная как хрупкий бинарный интерфейс. SOM предоставляет интерфейс прикладного программирования (API), обеспечивающий программам доступ к информации о классе SOM или объекте SOM. Любой класс SOM наследует набор виртуальных методов, которые можно использовать, например, для определения имени класса объекта или для проверки доступности определенного метода для объекта.
In computing, the System Object Model (SOM) is an object oriented shared library system developed by IBM. DSOM, a distributed version based on CORBA, allowed objects on different computers to communicate. SOM defines an interface between programs, or between libraries and programs, so that an object's interface is separated from its implementation. SOM allows classes of objects to be defined in one programming language and used in another, and it allows libraries of such classes to be updated without requiring client code to be recompiled. A SOM library consists of a set of classes, methods, static functions, and data members. Programs that use a SOM library can create objects of the types defined in the library, use the methods defined for an object type, and derive subclasses from SOM classes, even if the language of the program accessing the SOM library does not support class typing. A SOM library and the programs that use objects and methods of that library need not be written in the same programming language. SOM also minimizes the impact of revisions to libraries. If a SOM library is changed to add new classes or methods, or to change the internal implementation of classes or methods, one can still run a program that uses that library without recompiling. This is not the case for all other C++ libraries, which in some cases require recompiling all programs that use them whenever the libraries are changed, known as the fragile binary interface problem. SOM provides an application programming interface (API) that gives programs access to information about a SOM class or SOM object. Any SOM class inherits a set of virtual methods that can be used, for example, to find the class name of an object, or to determine whether a given method is available for an object.
Уходит в прошлое
С "смертью" OS/2 в середине 1990-х годов, raison d'être SOM/DSOM в значительной степени исчез; если пользователи не собирались запускать OS/2 на настольных компьютерах, то универсальная объектная библиотека была попросту не нужна. В 1997 году, когда Стив Джобс вернулся в Apple и прекратил множество проектов разработки, включая Copland и OpenDoc, SOM был заменен на Objective-C, который уже использовался в OPENSTEP (впоследствии ставшем Mac OS X). Разработка SOM/DSOM пошла на спад и больше не ведется активно, хотя он по-прежнему включается и используется в системах на базе OS/2, таких как ArcaOS. Несмотря на фактическое прекращение существования OS/2 и OpenDoc, у SOM могла появиться еще одна ниша: Windows и кроссплатформенная разработка. SOM 3.0 для WinNT был общедоступен в декабре 1996 года. Причины, по которым развитие в этих направлениях не было продолжено, выходят за рамки проблем с распространением. Они связаны с упущенными IBM возможностями и деструктивными несовместимыми изменениями: первая версия VisualAge C++ для Windows была 3.5. Это была первая и последняя версия, поддерживающая SOM. В комплект поставки входил SOM 2.1 и поддержка Direct to SOM в компиляторе. Версии 3.6.5 и более поздние не содержали никаких следов SOM. Объекты SOM в значительной степени полагались на makefiles. VisualAge C++ 4.0 представил проекты icc и удалил из дистрибутива командную строку компилятора icc.exe и линкера ilink.exe. Невозможно собрать какой-либо пример SOM DTK "из коробки" с помощью VAC++ 4.0. VisualAge C++ поставляется со своими собственными примерами, но даже в VAC++ 4.0 для OS/2 нет примеров icc SOM. vacbld.exe, единственный инструмент компиляции из командной строки, не поддерживает SOM. Объектная компонентная библиотека (OCL), поставляемая вместе с VisualAge C++, не была основана на SOM. Предполагалось, что она будет портирована в SOM с использованием режима C++ Direct to SOM, но в VAC v3.6.5 этот режим был отменен, и OCL до сих пор не имеет интерфейса SOM. В конце 1990-х годов IBM закрыла сайты загрузки SOMobjects и больше не восстанавливала их работу. SOM 3.0 DTK для WinNT не удается найти на FTP-сервере IBM, несмотря на обилие другого устаревшего программного обеспечения, доступного для свободного скачивания. Несмотря на общую доступность SOM 3.0 для WinNT, его было практически невозможно найти до конца 2012 года. Наконец, IBM так и не открыла исходный код SOM (как это было сделано с Object REXX), несмотря на многочисленные статьи и петиции.
The first version of VisualAge C++ for Windows was 3.5. It was the first and the last version to support SOM. It had SOM 2.1 bundled in and Direct to SOM support in the compiler. Versions 3.6.5 and later had no trace of SOM. SOMobjects largely relied on makefiles. VisualAge C++ 4.0 introduced icc projects and removed icc. exe and ilink. exe command line compiler and linker from supply. It is impossible to build any SOM DTK sample out of box with VAC++ 4.0. VisualAge C++ comes with its own samples, but there are no icc SOM samples even in VAC++ 4.0 for OS/2. vacbld. exe, the only command line compilation tool, doesn't support SOM. VisualAge C++ bundled in Object Component Library (OCL) was not based on SOM. It was probably meant to be ported to SOM using C++ Direct to SOM mode, but in VAC v3.6.5 this mode was abandoned, and OCL has no SOM interface so far. Near the end of the 1990s, IBM shut down SOMobjects download sites and never put them back online. SOM 3.0 DTK for WinNT can't be found on IBM FTP, despite much other legacy stuff lying around freely. Despite general availability of SOM 3.0 for WinNT, it was nearly impossible to locate until the end of 2012. Finally, IBM never open sourced SOM (as done to Object REXX), despite several articles and petitions.
Альтернативные варианты реализации
Существуют два проекта реализации SOM с открытым исходным кодом. Один из них — Netlabs Object Model (NOM), который технически идентичен, но не имеет двоичной совместимости. Другой — somFree, разработанный по принципу "чистой комнаты" на основе IBM SOM и обеспечивающий двоичную совместимость.
Сравнение с ОМ
SOM похож по своей концепции на COM. Обе системы решают проблему создания стандартного формата библиотеки, который может быть вызван более чем на одном языке. SOM можно считать более надежным, чем COM. COM предлагает два способа доступа к методам объекта: объект может реализовать один из них или оба. Первый – динамический и поздний (IDispatch), он нейтрален к языку и аналогичен тому, что предлагает SOM. Второй, называемый пользовательским интерфейсом, использует таблицу функций, которую можно построить на C, но она также напрямую совместима с бинарной структурой виртуальной таблицы объектов C++ в компиляторе Microsoft C++. При использовании совместимых компиляторов C++ пользовательские интерфейсы можно определить непосредственно как чистые виртуальные классы C++. Полученный интерфейс может быть вызван языками, способными вызывать функции C через указатели. Пользовательские интерфейсы жертвуют надежностью ради производительности. После публикации интерфейса в выпущенном продукте его нельзя изменить, поскольку клиентские приложения этого интерфейса были скомпилированы с учетом определенной бинарной структуры этого интерфейса. Это пример проблемы «хрупкого базового класса», которая может привести к «аду DLL», когда устанавливается новая версия общей библиотеки, и все программы, основанные на старой версии, могут перестать функционировать должным образом. Чтобы предотвратить эту проблему, разработчикам COM необходимо помнить, что интерфейс нельзя изменять после его публикации, и новые интерфейсы должны быть определены, если требуются новые методы или другие изменения. SOM предотвращает эти проблемы, предоставляя только позднее связывание, что позволяет компоновщику во время выполнения перестраивать таблицу «на лету». Таким образом, изменения в базовых библиотеках разрешаются при их загрузке в программы, хотя это и влечет за собой снижение производительности. SOM также гораздо более надежен с точки зрения полной поддержки широкого спектра объектно-ориентированных языков. В то время как базовый COM по сути определяет урезанную версию C++ для программирования, SOM поддерживает почти все распространенные функции и даже некоторые более эзотерические. Например, SOM поддерживает множественное наследование, метаклассы и динамическую диспетчеризацию. Некоторые из этих функций отсутствуют в большинстве языков, что привело к тому, что большинство систем, подобных SOM/COM, стали проще за счет поддержки меньшего количества языков. Однако для IBM была важна полная гибкость многоязычной поддержки, поскольку компания прилагала значительные усилия для поддержки как Smalltalk (одиночное наследование и динамическая диспетчеризация), так и C++ (множественное наследование и фиксированная диспетчеризация). Наиболее заметное различие между SOM и COM заключается в поддержке наследования – COM ее не имеет. Может показаться странным, что Microsoft создала систему объектных библиотек, которая не могла поддерживать одну из самых фундаментальных концепций объектно-ориентированного программирования; основная причина этого заключается в том, что трудно определить, где существует базовый класс в системе, где библиотеки загружаются в потенциально случайном порядке. COM требует, чтобы программист указал точный базовый класс во время компиляции, что делает невозможным вставку других производных классов в середину (по крайней мере, в других библиотеках COM). Вместо этого SOM использует простой алгоритм, ищет потенциальные базовые классы, следуя по дереву наследования и останавливаясь на первом совпадающем; это базовая идея наследования в большинстве случаев. Недостатком этого подхода является то, что новые версии этого базового класса могут перестать работать, даже если API остается прежним. Эта возможность существует в любой программе, а не только в тех, которые используют общую библиотеку, но проблему может быть очень трудно отследить, если она существует в чужом коде. В SOM единственным решением является тщательное тестирование новых версий библиотек, что не всегда легко. Хотя IBM противопоставляла SOM и COM, они не были взаимоисключающими. В 1995 году Novell внесла технологию ComponentGlue в OpenDoc для Windows. Эта технология предоставляла различные средства для интеграции между компонентами на основе COM и SOM. В частности, объекты SOM могут быть доступны для приложений OLE2 либо через мост позднего связывания (на основе IDispatch), либо через интерфейсы COM с более высокой производительностью. По сути, классы SOM реализуют интерфейсы COM таким образом. Гибкость, предлагаемая SOM, почти всеми считалась оправданной, но подобные системы, такие как Distributed Objects Everywhere от Sun Microsystems, также поддерживали полное наследование. Portable Distributed Objects от NeXT избегали этих проблем благодаря надежной системе версионирования, позволяющей авторам библиотек поставлять новые версии вместе со старыми, тем самым гарантируя обратную совместимость за небольшую плату в виде дискового пространства.