Языки программирования. Прошлое и будущее. С.Бобровский (1012869), страница 8
Текст из файла (страница 8)
Объектно-ориентированное программирование отвечало и отвечает этим требованиям как нельзя лучше, а подходящий высокопроизводительный инструмент имелся всего один.
Однако через некоторое время стали очевидны недостатки C++ и его ограничения. С ростом объема проекта обычное операторное (по сути — все то же низкоуровневое) программирование превращалось в тормоз и приводило к лавинообразному росту числа трудно обнаруживаемых ошибок в программах. Кроме того, с внедрением локальных и глобальных сетей очень актуальной стала новая клиент-серверная идеология построения систем для обработки информации. Она требовала адекватных технологических решений, позволяющих быстро переносить программы на разные платформы. В системах работы с базами данных эта проблема была решена достаточно быстро и эффективно. Но при переносе программ, написанных на языках программирования третьего поколения, основные проблемы оказались связаны с интерфейсом пользователя. Например, программу, написанную специально для Windows, без предварительного продумывания ее структуры и выделения машинно-независимых частей перенести в Unix было очень сложно.
И тут вспомнили о языке Smalltalk. Он поддерживался и развивался в первую очередь благодаря усилиям фирмы IBM, пусть и незаметно для большинства разработчиков. При этом он пользовался постоянным спросом, растущим в прямой зависимости от увеличения производительности компьютеров. Сегодня язык Smalltalk опять выходит на лидирующие позиции среди языков программирования. В будущем он наверняка сможет оказать заметную конкуренцию языку C++ и его аналогам.
Язык Smalltalk выделяется двумя ключевыми особенностями, позволяющими ему претендовать на роль ведущего средства разработки. Во-первых, синтаксис языка базируется исключительно на понятии объекта и очень компактен. Даже само название языка в переводе на русский примерно означает «малоразговорчивый». В самом деле, в языке Smalltalk отсутствуют привычные отделенные по смыслу друг от друга понятия оператора, данных или процедуры. Абсолютно все, что входит в язык, является объектами, а сами объекты общаются друг с другом исключительно с помощью сообщений. Например, вычисление выражения 1+1 вызывает посылку сообщения «+» (прибавить) с параметром 1 объекту I. Больше никаких управляющих структур, за исключением условного «оператора», который на самом деле тоже является методом класса Boolean, в языке нет, хотя их нетрудно смоделировать.
При разработке языка Smalltalk одной из его целей было создание хорошего инструментария для моделирования процессов с большим количеством независимых объектов, общающихся друг с другом с помощью сообщений. «Жизнь» каждого объекта протекает независимо от других объектов, и в то же время одновременно с ними. Для моделирования подобных процессов в язык Smalltalk были встроены три класса для распараллеливания процессов и их синхронизации друг с другом. Но так как реализация языка Smalltalk-80 ориентировалась на однопроцессорные системы, диспетчеризацией псевдопараллельных процессов с помощью задания приоритетов и отслеживания тупиковых ситуаций занимается специальный класс. (На старых ЕС ЭВМ был такой термин «клинч», когда каждый из двух процессов бесконечно ждал освобождения ресурса, занятого «конкурентом».)
Современные разработчики ориентируются на версию Smalltalk-80, которая в силу прекрасной продуманности семантики языка уже 20 лет не нуждается в изменениях и стала общепризнанным стандартом. В него не входят описания интерфейсных классов, классов работы с графикой и платформно-зависимых элементов. Особенно важна независимость от платформы, которая позволяет, например, использовать в языке числа неограниченной длины. Для придания языку Smalltalk большей гибкости в нем имеется возможность использования чисел с различными системами счисления в диапазоне от 2 до 36. (Программисты привыкли к десятичной, двоичной и шестнадцатеричной системам, а поклонники языка С —- еще и к восьмеричной.) Почему 36, в принципе, понятно: 26 букв английского алфавита и еще 10 цифр. Любимый пример поклонников Smalltalk, иллюстрирующий выразительные возможности представления чисел, выглядит так: 36rSMALL.TALKe255.
Заявлено, что переменные в AJVSJ-стандарте языка не будут иметь типов вне зависимости от того, какие данные они хранят в любой момент исполнения программы. Это решение окончательное — разработчики стандарта заявили: «Хорошо это или плохо — тема отдельного разговора, но любой диалект Smalltalk с типизированными переменными можно назвать как угодно, но это будет уже не Smalltalk ». Создатели языка Smalltalk опираются на концепцию повторного использования объектов, поэтому они и отказались от привычного понятия типа, создав классы Integer, Boolean и другие для объектного представления данных. Таким образом, понятие полиморфизма реализовано в языке Smalltalk в наиболее точном соответствии с объектной идеологией.
Во-вторых, язык Smalltalk является полностью переносимым на уровне двоичных кодов. Дело в том, что этот язык является интерпретируемым. Программа на Smalltalk компилируется в так называемый байт-код, когда отдельная команда виртуального ассемблера занимает ровно один байт (8 бит). Эта идея, которую придумал и впервые реализовал Питер Дойч в одной из версий Лиспа, получила широкое распространение. Можно вспомнить, например, Паскаль с компиляцией в известный Р-код. Получаемый байт-код может исполняться интерпретатором на любой платформе, где реализована виртуальная Smalltalk-машина, которая содержит набор объектов (в терминологии языка), описывающих процессы компиляции и взаимодействия с пользователем. Скорость исполнения программ (интерпретации байт-кода) имеет естественные ограничения. Однако с учетом роста производительности компьютеров для некритичных по времени задач быстрота и качество разработки проекта выходят на первый план.
Благодаря объектному подходу ко всем аспектам реализации языка Smalltalk, удалось создать не просто новый язык программирования. Появилась полностью переносимая среда, хорошее владение которой, если судить по зарубежным исследованиям, приближается по ценности к профессиональному владению C++. Сегодня языки третьего поколения во многих случаях уже не «вытягивают» крупные проекты, даже при качественном продумывании структуры программы. Слишком много усилий тратится на написание и отладку кода для реализации мелких деталей разрабатываемой системы. На помощь вроде бы приходят CASE-системы, но они в большей степени ориентированы на работу с хранилищами данных. Для задач моделирования, оптимизации, управления и т. п. оптимально использовать языки с другой идеологией.
Базовые возможности языка Smalltalk осваиваются очень быстро, но программистам, привыкшим к традиционным языкам, сначала непривычно переходить на Smalltalk. Но если хорошо понятна идеология объектно-ориентированного программирования, быстро приходит осознание мощности и простоты языка, а также наглядности получаемой программы. Кроме того, ориентация на событийно-ориентированное программирование как нельзя лучше подходит для использования этого языка при реализации сверхбольших проектов.
Из бесплатных версий наиболее солидно выглядит GNU-версия языка Smalltalk, полностью соответствующая неофициальному стандарту Smalltalk-80. Из коммерческих версий необходимо выделить комплект IBM VisualAge for Smalltalk. Фирма IBM многие годы поддерживала и совершенствовала эту систему, которая сегодня является безусловным лидером на рынке. В чем этой компании не откажешь — это в профессионализме и умении заглядывать далеко в будущее (хотя она, похоже, заглядывает в будущее подчас слишком далеко, упуская из виду текущие тенденции рынка). Последняя доступная к весне 2003 года версия VisualAge Smalltalk Enterprise V6.0.1 — это прекрасная кросс-платформная среда визуальной разработки, позволяющая создавать программы для множества операционных систем: Windows, OS/390, z/OS, HP-UX, Red Hat Linux, AIX. В ней имеется набор интерфейсных объектов, объектов для работы с базами данных и для интеграции в программу мультимедийной информации, а также обеспечена поддержка технологий Java и Weft-сервисов.
Сегодня языками, массово используемыми для создания коммерческих приложений, являются Бейсик, C++ и Паскаль. Недостатки их очевидны и общеизвестны. Это отсутствие полноценной объектной идеологии, излишне «низкоуровневый» код, трудность отладки, невысокая эффективность для ряда задач. Однако из-за огромных вложений в их «раскрутку», а также искусственно поддерживаемого спроса на программистов, владеющих этими языками (что связано с незнанием руководителями других технологических возможностей), погибнуть этим языкам, конечно же, не суждено.
Но уже зарождается новое поколение языков, которые определят будущее развитие компьютерной индустрии. Это будут усовершенствованные версии Java, предназначенные не только для Интернета; интерактивные языки виртуального моделирования типа (A)VRML; встроенные языки различных систем работы с хранилищами данных (например, SQLWindows); языки быстрой разработки приложений, интегрированные с СА5.Е-системами; различные диалекты декларативных языков на основе Пролога. Для задач, требующих интенсивных вычислений, можно будет использовать параллельные версии подобных языков, благо появление первых недорогих мультипроцессорных персональных компьютеров (с 2-4 процессорами) не за горами. С их массовым распространением на рынке быстро появятся и относительно дешевые параллельные системы программирования. Сначала это будет, конечно, апробированный на суперкомпьютерах Фортран и, возможно, Модула или Ада, а затем появятся реализации и других языков. И не вызывает сомнения, что среди этой «новой волны» одно из наиболее достойных мест займет язык Smalltalk.
Последние новости об этом языке можно найти на сайте www.smalltalk.org.
Форт еще жив
Я долго думал, к какому поколению отнести этот язык. Его вполне можно причислить не то, что к третьему, а даже ко второму поколению, так как Форт допускает низкоуровневое кодирование. Но, припомнив историю С, сразу понял, что это, конечно, язык четвертого поколения. Форт создавался для тех же целей, что и С, но по потенциальной мощности вполне сопоставим с языками типа Smalltalk.
Этот удивительный язык появился на свет в начале 70-х годов благодаря стараниям Чарльза Мура. Он стал своего рода ответом на потребности программистов в языке, с одной стороны, обладающим мощными и гибкими выразительными средствами, а с другой — пригодным для эффективной реализации на компьютерах с небольшими объемами памяти. А самое главное, язык обязан был выдавать очень быстрый и компактный код. То есть была нужна подходящая замена ассемблеру, так как из-за медленных компьютеров с ограниченными ресурсами использовать существовавшие в то время языки программирования для ряда задач не представлялось возможным.
Однако ветвь Форта для большинства проектов оказалась тупиковой. Появившийся примерно в то же время язык С, который создавался с аналогичными целями, быстро завоевал всемирное признание. Про Форт многие программисты, решающие «глобальные» задачи, быстро забыли. Почему же это произошло?
Исходно Форт задумывался как цельная система, содержащая интерпретатор, компилятор, отладчик и редактор. Сегодня этим никого не удивишь, но для того времени это было весьма оригинально и удобно. Форт-система была сама написана на Форте, то есть являлась полностью переносимой и не зависящей от оборудования.
Но самое интересное, что Форт ограничивался очень небольшим набором синтаксических конструкций. Реализовать его в базовом виде можно очень быстро, и поэтому Форт-система без проблем была реализована на множестве платформ. Это связано не с числом конструкций языка, а с самой идеологией Форта, на которой надо остановиться немного поподробнее.
Форт работает с памятью только в виде виртуального стека. Все операции в нем осуществляются над данными, хранящимися на вершине стека, и записываются последовательно — в обратной польской форме. Например, при выполнении двух команд + / сначала произойдет сложение двух чисел с вершины стека. Сами числа будут удалены оттуда, а на их место будет положена сумма. Затем произойдет деление этой суммы на следующее число в стеке. То есть если в стеке были записаны числа 3 5 8, то эти две команды выполнят действие (3+5)/8. Управляющие структуры, которых довольно мало: условный оператор и оператор цикла, — также основаны на анализе данных, хранящихся на вершине стека. Например, проверяется, лежат ли там логические значения ИСТИНА или ЛОЖЬ.