Другие свойства
Помимо обеспечения объектно-ориентированного программирования, эти языки предлагают другие интересные и мощные характеристики, которые дополняют поддержку ООП. В следующих разделах я просто представлю некоторые из них.
rtti
Свойство: В строго типизованных ОО языках компилятор осуществляет весь контроль типов, так что нет особой необходимости хранить информацию о классах и типах в работающей программе. Тем не менее, есть случаи (как, например, динамическое преобразование типов), которые требуют некоторую информацию о типе. По этой причине все три ОО языка, которые мы изучаем, более или менее поддерживают Идентификацию/Информацию о Типе Времени Выполнения (rtti).
c++: Язык c++ первоначально не поддерживал rtti. Это было добавлено позже для динамического преобразования типа (dynamic_cast) и сделало доступной некоторую информацию о типе для классов. Вы можете запросить идентификацию типа для объекта, и проверить, принадлежат ли два объекта одному классу.
op: object pascal и визуальная среда поддерживает и требует много rtti. Доступен не только контроль соответствия и динамическое преобразование типов (с помощью операторов is и as). Классы генерируют расширенную rtti для своих published свойств, методов и полей. Фактически это ключевое слово управляет частью генерации rtti. Вся идея свойств, механизм потоков (файлы форм - dfm), и среда delphi, начиная с Инспектора Объектов, сильно опирается на rtti классов. У класса tobject есть (кроме прочих) методы classname и classtype. classtype возвращает переменную типа класса, объект специального типа ссылки на класс (который не является самим классом).
java: Как и в object pascal, в java тоже есть единый базовый класс, помогающий следить за информацией о классе. Безопасное преобразование типов (type-safe downcast) встроено в этот язык. Метод getclass() возвращает своего рода метакласс (объект класса, описывающего классы), и Вы можете применить функцию getname() для того, чтобы получить строку с именем класса. Вы можете также использовать оператор instanceof. java включает в себя расширенную rtti для классов или интроспекцию, которая была введена для поддержки компонентную модель javabeans.
Пример: Вот синтаксис безопасного преобразования типов на трех языках. В случае ошибки все три языка вызывают исключение:
// c++
dog* mydog = dynamic_cast <dog*> (myanimal);
// java
dog mydog = (dog) myanimal;
// object pascal
dog mydog := myanimal as dog;
Обработка исключений
Свойство: Основная идея обработки исключений - упростить код обработки ошибок в программе, предоставив стандартный встроенный механизм, с целью сделать программы более устойчивыми. Обработка исключений - это тема, требующая отдельного рассмотрения, поэтому я только очерчу некоторые ключевые элементы и различия.
c++: c++ использует ключевое слово throw для генерации исключения, try для отметки охраняемого блока и catch для записи кода обработки исключения. Исключения - объекты специального класса, которые могут образовывать некоторую иерархию во всех трёх языках. c++ выполняет опустошение стека, удаление всех объектов (и вызов деструкторов) для всех объектов в стеке.
op: object pascal использует подобные ключевые слова: raise, try, и except и обладает подобными свойствами. Единственное существенное отличие состоит в том, что опустошение стека не производится, просто потому, что в стеке нет объектов. Кроме того, вы можете добавить в конце блока try слово finally, отмечая блок, который должен выполняться всегда, независимо от того, было или нет вызвано исключение. В delphi классы исключений - производные exception.
java: Использует ключевые слова c++, но ведёт себя как object pascal, включая дополнительное ключевое слово finally. (Это общее свойство всех языков со ссылочно-объектной моделью, оно включено borland также и в c++builder 3.) Присутствие алгоритма сборки мусора ограничивает использование finally в классе, который распределяет другие ресурсы, кроме памяти. Также java строже требует, чтобы все функции, которые могут вызвать исключение, описывали в соответствующем блоке, какие исключения могут быть вызваны функцией. Эти описания исключений проверяются компилятором, что является хорошим свойством, даже если оно подразумевает некоторую дополнительную работу для программиста. В классах java объекты-исключения должны наследовать классу throwable.
Шаблоны (родовое программирование)
Свойство: Родовое программирование - это техника написания функций и классов, оставляя некоторые типы данных неопределёнными. Спецификация типа осуществляется, когда эта функция или класс используется в исходном коде. Всё делается под строгим контролем компилятора, и ничего не остаётся для определения во время выполнения. Наиболее типичный пример шаблона класса - это контейнерные классы.
c++: Только в c++ (из этих трёх языков) есть родовые классы и функции, отмечаемые ключевым словом template. Стандартный c++ включает обширную библиотеку шаблонов классов, называемую stl (Стандартная библиотека шаблонов), которая поддерживает специфический и мощный стиль программирования: родовое программирование. c++ - единственный из этих трех языков, который концентрируется на поддержке родового программирования, помимо ООП.
op: В object pascal нет шаблонов. Контейнерные классы обычно строятся как контейнеры объектов класса tobject, а затем уточняются для необходимых объектов.
java: Тоже нет шаблонов. Можно использовать (специальные) контейнеры object-ов или прибегнуть к другим трюкам.
Другие специфические свойства
Свойство: Есть еще другие свойства, не упомянутые мной, хотя они важны, только из-за того, что они специфичны только для одного из трёх языков.
c++: Я уже упомянул множественное наследование, виртуальные базовые классы и шаблоны. Эти свойства отсутствуют в двух других ОО языках. В c++ есть ещё перегрузка операторов, тогда как перегрузка методов присутствует также в java и была недавно добавлена в object pascal. c++ позволяет программистам перегружать и глобальные функции. Вы можете перегрузить операторы преобразования типов, написав конвертирующие методы, которые будут вызываться "за кулисами". Объектная модель c++ требует копировать конструкторы и перегружать операторы присваивания, в чем не нуждаются остальные два языка, поскольку базируются на ссылочно-объектной модели.
java: Только java поддерживает многопоточность непосредственно в языке. Объекты и методы поддерживают механизм синхронизации (с ключевым словом synchronised): два синхронизированных метода одного класса не могут выполняться одновременно. Для создания нового потока вы просто наследуете от класса thread, перегружая метод run(). Как альтернативу вы можете осуществить интерфейс runnable (что вы обычно делаете в апплетах, поддерживающих многопоточность). Мы уже обсуждали сборщик мусора. Ещё одно ключевое свойство java, конечно, идея переносимого байтового кода, но это не относится непосредственно к языку. Другое примечательное свойство - это поддержка основанных на языке компонентов, известных как javabeans и многие другие свойства, недавно добавленные в этот язык.
op: Вот некоторые специфические черты object pascal: ссылки на классы, легкие для использования указатели на методы (основа модели обработки событий) и, в частности, свойства (property). Свойство - это просто имя, скрывающее путь, которым вы получаете доступ к данным или методу. Свойство может проецироваться на прямое чтение или запись данных, а может ссылаться на метод, обеспечивающий доступ. Даже если вы меняете способ доступа к данным, вам не нужно менять вызывающий код (хотя вам нужно будет его перекомпилировать): это делает свойства очень мощным средством инкапсуляции.
Стандарты
Свойство: Для каждого языка требуется, чтобы кто-то установил его стандарт и проверял все реализации на соответствие ему.
c++: Стандарт ansi/iso c++ явился завершением многотрудных усилий соответствующего комитета. Большинство авторов компиляторов, кажется, пытаются подчиняться стандарту, хотя есть ещё много странностей. Теоретически развитие языка должно на этом закончиться. На практике, инициативы вроде компилятора borland c++builder, конечно, не способствуют улучшению ситуации, но многие чувствуют, что c++ очень нуждается в визуальном окружении программирования. В то же время, популярный visual c++ тянет c++ в другом направлении, например, с явным злоупотреблением макросов. (По моему личному мнению, у каждого языка есть собственная модель развития, и поэтому нет большого смысла в попытках использовать язык для того, для чего он не был предназначен.)
op: object pascal - язык-собственность, поэтому у него нет стандарта. borland лицензировал язык для пары продавцов небольших компиляторов на os/2, но это не оказало большого влияния. borland расширяет язык с каждым новым выпуском delphi.
java: java находится в очень странной ситуации. Это язык-собственность и даже обладает торговой маркой на своё имя. Однако sun лицензирует его для продавцов других компиляторов, и убедило iso создать стандарт java, не создавая специальный комитет, а просто приняв предложения sun как есть. Как известно, sun легально борется с microsoft, пытающейся расширить java на свой лад. Кроме формального стандарта, однако, java требует высокосовместимых jvm.
Заключение: Языки и программное окружение
Как я упоминал в начале, хотя я пытался исследовать эти языки, только сравнивая синтаксические и семантические характеристики, важно рассмотреть их в соответствующем контексте. Языки нацелены на различные потребности, что означает, что они решают разные проблемы разными способами и используются в очень разных средах программирования. Хотя как языки, так и их среда копируют характеристики друг друга, они были сконструированы для разных потребностей, и в этом вы можете убедиться, сравнивая их характеристики. Цель c++ - мощность и контроль за счет сложности. Целью delphi является легкое, визуальное программирование (не отказываясь от мощности) и прочная связь с windows. Цель java - мобильность, даже за счет некоторого отказа от скорости, и распределённые приложения или исполняемое содержание www (хотя это, конечно, - не microsoft-овский взгляд на java!).
Можно определить, что успех этих трех языков зависит не от технических характеристик, которые я включил в эту статью. Финансовый статус borland, операционная система управления microsoft, популярность sun в мире internet, тот факт, что java рассматривается как anti-microsoft-овский язык, будущее броузеров Паутины и win32 api, роль и признание модели activex (из-за связанной с ней проблемой безопасности) и три уровня архитектуры delphi - вот показатели, которые могли повлиять на ваши выбор сильнее, чем технические элементы. Например, такой хороший язык как eiffel, у которого object pascal и java взяли не только некоторое вдохновение, никогда не получит реальной доли рынка, хотя он был популярен во многих университетах земного шара.
Просто имейте в виду, что "модный" становится все более частым словом в компьютерном мире. Как пользователи хотят иметь инструменты этого года (вероятно, по этой причине операционные системы называются по тому году, в котором они выпущены), программисты любят работать с последним языком программирования и первыми овладеть им. Можно наверняка утверждать, что java - не последний из языков ООП. Через несколько следующих лет найдется кто-то с новым модным языком, и все прыгнут в этот поезд, думая, что нельзя отставать, и забывая, что большинство программистов в мире всё ещё печатают на клавиатуре на добром старом cobol!