Рефераты
 

Исторический обзор, классификация и характеристика языков программирования

p align="left">В 1964 году все та же корпорация IBM создала язык PL/1, который был призван заменить Cobol и Fortran в большинстве приложений. Язык обладал исключительным богатством синтаксических конструкций. В нем впервые появилась обработка исключительных ситуаций и поддержка параллелизма. Надо заметить, что синтаксическая структура языка была крайне сложной. Пробелы уже использовались как синтаксические разделители, но ключевые слова не были зарезервированы. В частности, следующая строка -- это вполне нормальный оператор на PL/1: IF ELSE=THEN THEN THEN; ELSE ELSE.

В силу таких особенностей разработка компилятора для PL/1 была исключительно сложным делом. Язык так и не стал популярен вне мира IBM.

Создание каждого из вышеупомянутых языков (за исключением Algol'а) было вызвано некоторыми практическими требованиями. Эти языки послужили фундаментом для более поздних разработок. Все они представляют одну и ту же парадигму программирования. Следующие языки пошли существенно дальше в своем развитии, в сторону более глубокого абстрагирования.

Сведения о более поздних языках будем приводить в виде описания семейств языков. Это позволит лучше проследить взаимосвязи между отдельными языками

Pascal-подобные языки

В 1970 году Никлаусом Виртом был создал язык программирования Pascal для обучения программированию. Язык замечателен тем, что это первый широко распространенный язык для структурного программирования (первым, строго говоря, был Алгол, но он не получил столь широкого распространения). Впервые оператор безусловного перехода перестал играть основополагающую роль при управлении порядком выполнения операторов. В этом языке также внедрена строгая проверка типов, что позволило выявлять многие ошибки на этапе компиляции.

Отрицательной чертой языка было отсутствие в нем средств для разбиения программы на модули. Вирт осознавал это и разработал язык Modula-2 (1978), в котором идея модуля стала одной из ключевых концепций языка. В 1988 году появилась Modula-3, в которую были добавлены объектно-ориентированные черты. Логическим продолжением Pascal и Modula являются язык Oberon и Oberon-2. Они характеризуются движением в сторону объектно- и компонентно-ориентированности.

C-подобные языки

В 1972 году Керниганом и Ритчи был создан язык программирования C. Он создавался как язык для разработки операционной системы UNIX. C часто называют <переносимым ассемблером>, имея в виду то, что он позволяет работать с данными практически так же эффективно, как на ассемблере, предоставляя при этом структурированные управляющие конструкции и абстракции высокого уровня (структуры и массивы). Именно с этим связана его огромная популярность и поныне. И именно это является его ахиллесовой пятой. Компилятор C очень слабо контролирует типы, поэтому очень легко написать внешне совершенно правильную, но логически ошибочную программу.

В 1986 году Бьярн Страуструп создал первую версию языка C++, добавив в язык C объектно-ориентированные черты, взятые из Simula, и исправив некоторые ошибки и неудачные решения языка. C++ продолжает совершенствоваться и в настоящее время, так в 1998 году вышла новая (третья) версия стандарта, содержащая в себе некоторые довольно существенные изменения. Язык стал основой для разработки современных больших и сложных проектов. У него имеются, однако же, и слабые стороны, вытекающие из требований эффективности.

В 1995 году в корпорации Sun Microsystems Кеном Арнольдом и Джеймсом Гослингом был создан язык Java. Он наследовал синтаксис C и C++ и был избавлен от некоторых неприятных черт последнего. Отличительной особенностью языка является компиляция в код некоей абстрактной машины, для которой затем пишется эмулятор (Java Virtual Machine) для реальных систем. Кроме того, в Java нет указателей и множественного наследования, что сильно повышает надежность программирования.

В 1999-2000 годах в корпорации Microsoft был создан язык C#. Он в достаточной степени схож с Java (и задумывался как альтернатива последнему), но имеет и отличительные особенности. Ориентирован, в основном, на разработку многокомпонентных Интернет-приложений.

Языки Ada и Ada 95

В 1983 году под эгидой Министерства Обороны США был создан язык Ada. Язык замечателен тем, что очень много ошибок может быть выявлено на этапе компиляции. Кроме того, поддерживаются многие аспекты программирования, которые часто отдаются на откуп операционной системе (параллелизм, обработка исключений). В 1995 году был принят стандарт языка Ada 95, который развивает предыдущую версию, добавляя в нее объектноориентированность и исправляя некоторые неточности. Оба этих языка не получили широкого распространения вне военных и прочих крупномасштабных проектов (авиация, железнодорожные перевозки). Основной причиной является сложность освоения языка и достаточно громоздкий синтаксис (значительно более громоздкий, чем Pascal).

Языки обработки данных

Все вышеперечисленные языки являются языками общего назначения в том смысле, что они не ориентированы и не оптимизированы под использование каких-либо специфических структур данных или на применение в каких-либо специфических областях. Было разработано большое количество языков, ориентированных на достаточно специфические применения. Ниже приведен краткий обзор таких языков.

В 1957 году была предпринята попытка создания языка для описания математической обработки данных. Язык был назван APL (Application Programming Language). Его отличительной особенностью было использование математических символов (что затрудняло применение на текстовых терминалах; появление графических интерфейсов сняло эту проблему) и очень мощный синтаксис, который позволял производить множество нетривиальных операций прямо над сложными объектами, не прибегая к разбиению их на компоненты. Широкому применению помешало, как уже отмечалось, использование нестандартных символов как элементов синтаксиса.

В 1962 году появился язык Snobol (а в 1974 - его преемник Icon), предназначенный для обработки строк. Синтаксис Icon напоминает С и Pascal одновременно. Отличие заключается в наличии мощных встроенных функций работы со строками и связанная с этими функциями особая семантика. Современным аналогом Icon и Snobol является Perl --язык обработки строк и текстов, в который добавлены некоторые объектно-ориентированные возможности. Считается очень практичным языком, однако ему недостает элегантности.

В 1969 году был создан язык SETL - язык для описания операций над множествами. Основной структурой данных в языке является множество, а операции аналогичны математическим операциям над множествами. Полезен при написании программ, имеющих дело со сложными абстрактными объектами.

Объектно-ориентированные языки

Первым объектно-ориентрованным языком был язык Simula (1967). Этот язык был предназначен для моделирования различных объектов и процессов, и объектно-ориентированные черты появились в нем именно для описания свойств модельных объектов.

Популярность объектно-ориентированному программированию принес язык Smalltalk, созданный в 1972 году. Язык предназначался для проектирования сложных графических интерфейсов и был первым по-настоящему объектно-ориентированным языком. В нем классы и объекты -- это единственные конструкции программирования. Большим недостатком Smalltalk являются большие требования к памяти и низкая производительность полученных программ. Это связано с не очень удачной реализацией объектно-ориентированных особенностей. Популярность языков C++ и Ada 95 связана именно с тем, что объектно-ориентированность реализована без существенного снижения производительности.

Существует язык с очень хорошей реализацией объектно-ориентированности, не являющийся надстройкой ни над каким другим языком. Это язык Eiffel (1986). Являясь чистым языком объектно-ориентированного программирования, он, кроме того, повышает надежность программы путем использования <контрольных утверждений>.

Языки параллельного программирования

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

Язык Оccam был создан в 1982 году и предназначен для программирования транспьютеров -- многопроцессорных систем распределенной обработки данных. Он описывает взаимодействие параллельных процессов в виде каналов -- способов передачи информации от одного процесса к другому. Отметим особенность синтаксиса языка occam -- в нем последовательный и параллельный порядки выполнение операторов равноправны, и их необходимо явно указывать ключевыми словами PAR и SEQ.

В 1985 году была предложена модель параллельных вычислений Linda. Основной ее задачей является организация взаимодействия между параллельно выполняющимися процессами. Это достигается за счет использования глобальной кортежной области (tuple space). Процесс может поместить туда кортеж с данными (то есть совокупность нескольких, возможно разнородных, данных), а другой процесс может ожидать появления в кортежной области некоторого кортежа и, после его появления, прочитать кортеж с возможным последующим его удалением. Заметим, что процесс может, например, поместить кортеж в область и завершиться, а другой процесс может через некоторое время воспользоваться этим кортежем. Таким образом обеспечивается возможность асинхронного взаимодействия. Очевидно, что при помощи такой модели может быть симулировано и синхронное взаимодействие. Linda -- это модель параллельных вычислений, она может быть добавлена в любой язык программирования. Существуют достаточно эффективные реализации Linda, обходящие проблему существования глобальной кортежной области с потенциально неограниченным объемом памяти.

Логические языки программирования

В начале 70-х годов Роберт Ковальский, в то время работавший в Эдинбурге, и Алан Колмероэ из Марселя разрабатывали сходные идеи и даже работали вместе в течение одного лета. В результате были сформулированы основные положения логического программирования, в 1972 году описан и реализован первый язык логического программирования - Пролог (“программирование на языке логики” -- PROgramming in LOGic).

Функциональные языки программирования

Теория, положенная в основу функционального подхода родилась в 20-х -- 30-х годах XX века. В числе разработчиков математических основ функционального программирования можно назвать Мозеса Шёнфинкеля (Германия и Россия) и Хаскелла Карри (Англия), разработавших комбинаторную логику, а также Алонзо Чёрча (США) -- создателя -исчисления.

Теория так и оставалась теорией, пока в 1958 году Джон Маккарти не разработал язык Lisp, который стал первым функциональным языком программирования. Хотя Lisp всё ещё используется, он уже не удовлетворяет некоторым современным запросам, которые заставляют разработчиков программ взваливать как можно большую ношу на компилятор, облегчив тем самым свой непосильный труд. Необходимость в этом, конечно же, возникла из-за всё более возрастающей сложности программного обеспечения.

В связи с этим обстоятельством всё большую роль начинает играть типизация. В конце 70-х -- начале 80-х годов XX века интенсивно разрабатываются модели типизации, подходящие для функциональных языков. Появляется множество типизированных функциональных языков: ML(Робин Милнер, 1979, из ныне используемых диалектов известны Standard ML и Objective CAML), Scheme(1975), Hope, Miranda(Дэвид Тёрнер, 1985),Clean и многие другие. Вдобавок постоянно увеличивается число диалектов.

В результате вышло так, что практически каждая группа, занимающаяся функциональным программированием, использовала собственный язык. Это препятствовало дальнейшему распространению этих языков и порождало многочисленные более мелкие проблемы. Чтобы исправить ситуацию, объединенная группа ведущих исследователей в области функционального программирования решила воссоздать достоинства различных языков в новом универсальном функциональном языке. Первая реализация этого языка, названного Haskell в честь Хаскелла Карри, была создана в 1990 году. В настоящее время действителен стандарт Haskell-98.

Ниже приведем схему «Эволюция языков программирования».

\

4. Характеристики языков программирования

4.1 Элементы объектной модели

Каждый стиль программирования имеет свою концептуальную базу. Каждый стиль требует своего умонастроения и способа восприятия решаемой задачи. Для объектно-ориентированного стиля концептуальная база -- это объектная модель. Она имеет четыре главных элемента:

· абстрагирование;

· инкапсуляция;

· модульность;

· иерархия.

Эти элементы являются главными в том смысле, что без любого из них модель не будет объектно-ориентированной. Кроме главных, имеются еще три дополнительных элемента:

· типизация;

· параллелизм;

· сохраняемость.

Называя их дополнительными, мы имеем в виду, что они полезны в объектной модели, но не обязательны.

Без такой концептуальной основы вы можете программировать на языке типа Smalltalk, Object Pascal, C++, CLOS, Eiffel или Ada, но из-под внешней красоты будет выглядывать стиль FORTRAN, Pascal или С. Выразительная способность объектно-ориентированного языка будет либо потеряна, либо искажена. Но еще более существенно, что при этом будет мало шансов справиться со сложностью решаемых задач.

Абстрагирование

Абстрагирование является одним из основных методов, используемых для решения сложных задач.

Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко определяет его концептуальные границы с точки зрения наблюдателя.

Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от несущественных. Абельсон и Суссман назвали такое разделение смысла и реализации барьером абстракции, который основывается на принципе минимизации связей, когда интерфейс объекта содержит только существенные аспекты поведения и ничего больше. Существует еще один дополнительный принцип, называемый принципом наименьшего удивления, согласно которому абстракция должна охватывать все поведение объекта, но не больше и не меньше, и не привносить сюрпризов или побочных эффектов, лежащих вне ее сферы применимости.

Выбор правильного набора абстракций для заданной предметной области представляет собой главную задачу объектно-ориентированного проектирования.

По мнению Сейдвица и Старка "существует целый спектр абстракций, начиная с объектов, которые почти точно соответствуют реалиям предметной области, и кончая объектами, не имеющими право на существование". Вот эти абстракции:

Абстракция сущности

Объект представляет собой полезную модель некой сущности в предметной области

Абстракция поведения

Объект состоит из обобщенного множества операций

Абстракция виртуальной машины

Объект группирует операции, которые либо вместе используются более высоким уровнем управления, либо сами используют некоторый набор операций более низкого уровня

Произвольная абстракция

Объект включает в себя набор операций, не имеющих друг с другом ничего общего

Абстракция фокусируется на существенных с точки зрения наблюдателя характеристиках объекта.

Инкапсуляция

Абстракция и инкапсуляция дополняют друг друга: абстрагирование направлено на наблюдаемое поведение объекта, а инкапсуляция занимается внутренним устройством. Чаще всего инкапсуляция выполняется посредством скрытия информации, то есть маскировкой всех внутренних деталей, не влияющих на внешнее поведение. Обычно скрываются и внутренняя структура объекта и реализация его методов.

Инкапсуляция, таким образом, определяет четкие границы между различными абстракциями. Возьмем для примера структуру растения: чтобы понять на верхнем уровне действие фотосинтеза, вполне допустимо игнорировать такие подробности, как функции корней растения или химию клеточных стенок. Аналогичным образом при проектировании базы данных принято писать программы так, чтобы они не зависели от физического представления данных; вместо этого сосредотачиваются на схеме, отражающей логическое строение данных. В обоих случаях объекты защищены от деталей реализации объектов более низкого уровня.

Дисков утверждает, что "абстракция будет работать только вместе с инкапсуляцией". Практически это означает наличие двух частей в классе: интерфейса и реализации. Интерфейс отражает внешнее поведение объекта, описывая абстракцию поведения всех объектов данного класса. Внутренняя реализация описывает представление этой абстракции и механизмы достижения желаемого поведения объекта. Принцип разделения интерфейса и реализации соответствует сути вещей: в интерфейсной части собрано все, что касается взаимодействия данного объекта с любыми другими объектами; реализация скрывает от других объектов все детали, не имеющие отношения к процессу взаимодействия объектов.

Инкапсуляцию можно определить следующим образом:

Инкапсуляция -- это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации.

Инкапсуляция скрывает детали реализации объекта.

Модульность

По мнению Майерса "Разделение программы на модули до некоторой степени позволяет уменьшить ее сложность... Однако гораздо важнее тот факт, что внутри модульной программы создаются множества хорошо определенных и документированных интерфейсов. Эти интерфейсы неоценимы для исчерпывающего понимания программы в целом". В некоторых языках программирования, например в Smalltalk, модулей нет, и классы составляют единственную физическую основу декомпозиции. В других языках, включая Object Pascal, C++, Ada, CLOS, модуль -- это самостоятельная языковая конструкция. В этих языках классы и объекты составляют логическую структуру системы, они помещаются в модули, образующие физическую структуру системы. Это свойство становится особенно полезным, когда система состоит из многих сотен классов.

Согласно Барбаре Лисков "модульность -- это разделение программы на фрагменты, которые компилируются по отдельности, но могут устанавливать связи с другими модулями". Мы будем пользоваться определением Парнаса: "Связи между модулями -- это их представления друг о друге". В большинстве языков, поддерживающих принцип модульности как самостоятельную концепцию, интерфейс модуля отделен от его реализации. Таким образом, модульность и инкапсуляция ходят рука об руку. В разных языках программирования модульность поддерживается по-разному. Например, в C++ модулями являются раздельно компилируемые файлы. Для C/C++ традиционным является помещение интерфейсной части модулей в отдельные файлы с расширением .h (так называемые файлы-заголовки). Реализация, то есть текст модуля, хранится в файлах с расширением с (в программах на C++ часто используются расширения .ее, .ср и .срр). Связь между файлами объявляется директивой макропроцессора #include. Такой подход строится исключительно на соглашении и не является строгим требованием самого языка. В языке Object Pascal принцип модульности формализован несколько строже. В этом языке определен особый синтаксис для интерфейсной части и реализации модуля (unit). Язык Ada идет еще на шаг дальше: модуль (называемый package) также имеет две части - спецификацию и тело. Но, в отличие от Object Pascal, допускается раздельное определение связей с модулями для спецификации и тела пакета. Таким образом, допускается, чтобы тело модуля имело связи с модулями, невидимыми для его спецификации.

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

Модули выполняют роль физических контейнеров, в которые помещаются определения классов и объектов при логическом проектировании системы. Такая же ситуация возникает у проектировщиков бортовых компьютеров. Логика электронного оборудования может быть построена на основе элементарных схем типа НЕ, И-НЕ, ИЛИ-НЕ, но можно объединить такие схемы в стандартные интегральные схемы (модули), например, серий 7400, 7402 или 7404.

Модульность позволяет хранить абстракции раздельно.

В традиционном структурном проектировании модульность - это искусство раскладывать подпрограммы по кучкам так, чтобы в одну кучку попадали подпрограммы, использующие друг друга или изменяемые вместе. В объектно-ориентированном программировании ситуация несколько иная: необходимо физически разделить классы и объекты, составляющие логическую структуру проекта.

Модульность -- это свойство системы, которая была разложена на внутренне связные, но слабо связанные между собой модули.

Принципы абстрагирования, инкапсуляции и модульности являются взаимодополняющими. Объект логически определяет границы определенной абстракции, а инкапсуляция и модульность делают их физически незыблемыми.

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

Иерархия

Значительное упрощение в понимании сложных задач достигается за счет образования из абстракций иерархической структуры. Определим иерархию следующим образом:

Иерархия -- это упорядочение абстракций, расположение их по уровням.

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

Типизация

Типизация -- это способ защититься от использования объектов одного класса вместо другого, или по крайней мере управлять таким использованием.

Типизация заставляет нас выражать наши абстракции так, чтобы язык программирования, используемый в реализации, поддерживал соблюдение принятых проектных решений.

Идея согласования типов занимает в понятии типизации центральное место. Например, возьмем физические единицы измерения. Деля расстояние на время, мы ожидаем получить скорость, а не вес. В умножении температуры на силу смысла нет, а в умножении расстояния на силу -- есть. Все это примеры сильной типизации, когда прикладная область накладывает правила и ограничения на использование и сочетание абстракций.

Сильная типизация заставляет нас соблюдать правила использования абстракций, поэтому она тем полезнее, чем больше проект. Однако у нее есть и теневая сторона. А именно, даже небольшие изменения в интерфейсе класса требуют перекомпиляции всех его подклассов. Кроме того, не имея параметризованных классов трудно представить себе, как можно было бы создать собрание разнородных объектов.

Полиморфизм означает, что разные объекты могут описывать различные реализации одного и того же метода.

Строгая типизация предотвращает смешивание абстракций.

Параллелизм

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

Параллелизм -- это свойство, отличающее активные объекты от пассивных.

Параллелизм позволяет различным объектам действовать одновременно.

Сохраняемость любой программный объект существует в памяти и живет во времени. Аткинсон предположил, что есть непрерывное множество продолжительности существования объектов: существуют объекты, которые присутствуют лишь во время вычисления выражения, но есть и такие, как базы данных, которые существуют независимо от программы. Этот спектр сохраняемости объектов охватывает:

· "Промежуточные результаты вычисления выражений.

· Локальные переменные в вызове процедур.

· Собственные переменные, глобальные переменные и динамически создаваемые данные.

· Данные, сохраняющиеся между сеансами выполнения программы.

· Данные, сохраняемые при переходе на новую версию программы.

· Данные, которые вообще переживают программу" .

Традиционно, первыми тремя уровнями занимаются языки программирования, а последними -- базы данных. Этот конфликт культур приводит к неожиданным решениям: программисты разрабатывают специальные схемы для сохранения объектов в период между запусками программы, а конструкторы баз данных переиначивают свою технологию под короткоживущие объекты.

Языки программирования, как правило, не поддерживают понятия сохраняемости; примечательным исключением является Smalltalk, в котором есть протоколы для сохранения объектов на диске и загрузки с диска. Однако, записывать объекты в неструктурированные файлы -- это подход, пригодный только для небольших систем.

До сих пор мы говорили о сохранении объектов во времени. В большинстве систем объектам при их создании отводится место в памяти, которое не изменяется и в котором объект находится всю свою жизнь. Однако для распределенных систем желательно обеспечивать возможность перенесения объектов в пространстве, так, чтобы их можно было переносить с машины на машину и даже при необходимости изменять форму представления объекта в памяти.

Определим сохраняемость следующим образом:

Сохраняемость -- способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства.

Сохраняемость поддерживает состояние и класс объекта в пространстве и во времени.

4.2 Характеристики языков программирования с точки зрения элементов объектной модели

Приведем характеристики объектно-ориентированных языков программирования с точки зрения семи основных элементов объектной модели.

Табл.1 Основные характеристики Smalltalk

Абстракции

Переменные экземпляра
Методы экземпляра
Переменные класса
Методы класса

Да

Да

Да

Да

Инкапсуляция

Переменных

Методов

Закрытые

Открытые

Модульность

Разновидности модулей

Нет

Иерархии

Наследование

Шаблоны

Метаклассы

Одиночное

Нет

Да

Типизация

Сильная типизация
Полиморфизм

Нет

Да (одиночный)

Параллельность

Многозадачность

Непрямая (посредством классов)

Сохраняемость

Долгоживущие объекты

Нет

Табл.2 Основные характеристики Object Pascal.

Абстракции

Переменные экземпляра
Методы экземпляра
Переменные класса
Методы класса

Да

Да

Нет

Нет

Инкапсуляция

Переменных

Методов

Открытые

Открытые

Модульность

Разновидности модулей

Модуль (unit)

Иерархии

Наследование

Шаблоны

Метаклассы

Одиночное

Нет

Нет

Типизация

Сильная типизация
Полиморфизм

Да

Да (одиночный)

Параллельность

Многозадачность

Нет

Сохраняемость

Долгоживущие объекты

Нет

Табл.3.Основные характеристики C++ .

Абстракции

Переменные экземпляра
Методы экземпляра
Переменные класса
Методы класса

Да
Да
Да
Да

Инкапсуляция

Переменных
Методов

Открытые, защищенные, закрытые
Открытые, защищенные, закрытые

Модульность

Разновидности модулей

файл

Иерархии

Наследование
Шаблоны
Метаклассы

Множественное
Да
Нет

Типизация

Сильная типизация
Полиморфизм

Да
Да (одиночный)

Параллельность

Многозадачность

Непрямая (посредством классов)

Сохраняемость

Долгоживущие объекты

Нет

Табл.4 Основные характеристики CLOS(Common Lisp Object System).

Абстракции

Переменные экземпляра
Методы экземпляра
Переменные класса
Методы класса

Да
Да
Да
Да

Инкапсуляция

Переменных
Методов

Чтение, запись, доступ
Открытые

Модульность

Разновидности модулей

Пакет

Иерархии

Наследование
Шаблоны
Метаклассы

Множественное
Нет
Да

Типизация

Сильная типизация
Полиморфизм

Возможна
Да (множественный)

Параллельность

Многозадачность

Да

Сохраняемость

Долгоживущие объекты

Нет

Табл. 5 Основные характеристики Ada

Абстракции

Переменные экземпляра
Методы экземпляра
Переменные класса
Методы класса

Да
Да
Нет
Нет

Инкапсуляция

Переменных
Методов

Открытые, закрытые
Открытые, закрытые

Модульность

Разновидности модулей

Пакет

Иерархии

Наследование
Шаблоны
Метаклассы

Нет (входит в Ada9x)
Да
Нет

Типизация

Сильная типизация
Полиморфизм

Да
Нет (входит в Ada9x)

Параллельность

Многозадачность

Да

Сохраняемость

Долгоживущие объекты

Нет

Табл. 6 Основные характеристики Eiffel.

Абстракции

Переменные экземпляра
Методы экземпляра
Переменные класса
Методы класса

Да
Да
Нет
Нет

Инкапсуляция

Переменных
Методов

Закрытые
Открытые, закрытые

Модульность

Разновидности модулей

Блок (unit)

Иерархии

Наследование
Шаблоны
Метаклассы

Множественное
Да
Нет

Типизация

Сильная типизация
Полиморфизм

Да
Да

Параллельность

Многозадачность

Нет

Сохраняемость

Долгоживущие объекты

Нет

Приложение

Таблица «популярности языков программирования» (TIOBE Programming Community Index for December 2006)

Position
Dec 2006

Position
Dec 2005

Delta in Position

Programming Language

Ratings
Dec 2006

Delta
Dec 2005

1

1

Java

19.907%

-2.36%

2

2

C

16.616%

-1.75%

3

3

C++

10.409%

-0.39%

4

5

(Visual) Basic

8.912%

+1.33%

5

4

PHP

8.537%

-2.24%

6

6

Perl

6.396%

-0.74%

7

8

Python

3.762%

+1.00%

8

7

C#

3.171%

-0.11%

9

10

Delphi

2.569%

+1.11%

10

9

JavaScript

2.562%

+0.68%

11

20

9 *

Ruby

2.334%

+1.90%

12

11

SAS

2.232%

+1.06%

13

12

PL/SQL

1.345%

+0.28%

14

27

13 *

D

0.971%

+0.67%

15

17

ABAP

0.903%

+0.35%

16

15

Ada

0.661%

+0.07%

17

13

Lisp/Scheme

0.645%

-0.12%

18

14

COBOL

0.601%

-0.13%

19

16

Pascal

0.566%

-0.01%

20

37

17 *

Transact-SQL

0.472%

+0.31%

Заключение

Выделим некоторую общую тенденцию в развитии языков программирования: языки развиваются в сторону все большей и большей абстракции. И это сопровождается падением эффективности. Но это стоит того: повышение уровня абстракции влечет за собой повышение уровня надежности программирования. С низкой эффективностью можно бороться путем создания более быстрых компьютеров. Если требования к памяти слишком высоки, можно увеличить ее объем. Это, конечно, требует времени и средств, но это решаемо. А вот с ошибками в программах можно бороться только одним способом: их надо исправлять. А еще лучше -- не совершать. А еще лучше максимально затруднить их совершение. И именно на это направлены все исследования в области языков программирования. А с потерей эффективности придется смириться.

Целью данного обзора была попытка дать представление о всем многообразии существующих языков программирования. Среди программистов часто бытует мнение о всеобщей применимости того или иного языка (C, C++, Pascal и т.п.). Это мнение возникает по нескольким причинам: недостаток информации, привычка, инертность мышления. Настоящий профессионал должен постоянно стремиться повышать свои профессиональную квалификацию. А для этого нужно не бояться экспериментировать. Разумеется, прежде чем приниматься использовать новый язык, нужно внимательно изучить все его особенности, включая наличии эффективной реализации, возможности взаимодействия с существующими модулями и т.п., и только после этого принимать решение. Конечно, всегда есть риск пойти не тем путем, но не ошибается лишь тот, кто ничего не делает.

Часто проводятся дискуссии вида <язык A лучше, чем язык B>. Прочитав этот обзор, можно убедится в бессмысленности таких споров. Максимум, о чем может идти речь -- это о преимуществах одного языка над другим при решении той или иной задачи в тех или иных условиях. Вот здесь действительно иногда есть о чем поспорить. И решение подчас отнюдь не очевидно.

Этот обзор языков программирования задумывался как ответ тем, кто кричит <язык X MUST DIE>. Надеюсь, что ответ получился достаточно адекватным и убедительным.

Литература

1.Информатика под редакцией Е.К. Хеннера, М.,Академия,2004г.

2.Информатика.Базовый курс под ред. С. В. Симоновича, С.-П «Питер» 2005г.

3.Языки программирования. Обзор-ликбез. Хакер №4,с.36-40.

4.Р.Богатырев, Природа и эволюция сценарных языков, Мир ПК, №11,2001

5.Г.Буг, Объектно-ориентированный анализ и проектирование

6.http://citforum.ru

7. http://school.keldysh.ru/sch444/MUSEUM /LANR/evol.htm

8. http://ru.wikipedia.org

9. http://www.levenez.com/lang

10. http://tiobe.com

Страницы: 1, 2


© 2010 BANKS OF РЕФЕРАТ