лекции (2003) (Глазкова) (1160821), страница 2
Текст из файла (страница 2)
1995 – язык Java (чисто объектно-ориентированный ЯП).
1998 – язык С#.
Языки С# и Java идейно основаны на концепции языка С.
1991 – язык Delphi.
1988 – язык Oberon-1 (ООР ЯП, компилятор языка Oberon занимает около 4000 строк – это немного)
1991 – в языке Oberon появляется динамическое связывание.
Лекция 3
На прошлой лекции мы рассмотрели, что попытки создать единый ЯП, который смог бы занять все экологические ниши, закончились неудачей.
За 90-е появилось много новых ЯП:
Delphi – 1990-91,
Java – 1995,
C # - 1999.
Это очень общие ЯП.
В какой обстановке они развивались? Какого рода приложения можно разрабатывать в рамках индустрии программирования?
Приложение Microsoft Office – это очень крупный проект (менеджер затруднился ответить, сколько денег вложено в этот проект). Подобного рода проекты пишутся на языках системного программирования. Мало кому из программистов удается поучаствовать в таких проектах. Программисты создают информационные системы.
Язык С++ в некотором смысле является универсальным языком программирования, но он недостаточно надежный и сложный.
Язык Java предлагает единую технологию. Он оказался достаточно простым языком. Язык Java обладал надежностью, недостающей в С++, и более выразительными средствами. Тем не менее поскольку программы на языке Java интерпретируются в виртуальной
Java-машине (JVM), скорость выполнения программ на Java несколько ниже, чем скорость выполнения программ на компилируемых языках (интерпретация байт-кода всегда медленнее, чем трансляция).
Для того, чтобы средства программирования было легко интегрировать, предлагается использовать единую среду программирования. CLR – единая библиотека. Знания программиста при программировании над единой средой программирования портируются (переносятся) полностью. В отличие от JVM, технология JIT осуществляет моментальную трансляцию в бинарный код.
3. Основные понятия ЯП
Рассмотрим концептуальную схему рассмотрения ЯП.
-
Виды программирования:
-
игровое программирование (программирование только для себя; в основном на Visual Basic)
-
научное программирование (тоже программирование для себя, но программа нужна автору для решения задачи; после этого она либо теряет для автора интерес, либо используется коллегами при тесных консультациях с автором – программа не отчуждаема от автора)
-
индустриальное программирование – занимается разработкой программных продуктов (автор предполагает, что программа будет использоваться не им и без него, т.е. в отчужденном от него виде)
ЯП для этих видов программирования разные. Например, FORTRAN – язык научного программирования.
Мы будем заниматься языками индустриального программирования.
-
Основные позиции при рассмотрении ЯП .
1.Технологическая позиция
Эта позиция отражает взгляд человека, желающего пользоваться ЯП как технологическим инструментом на каком-либо из этапов создания и использования программных изделий.
ЯП создается, чтобы занять экологическую нишу. Любой экологической нише соответствуют свои технологические потребности.
Языки игрового программирования не подразумевали понятия разделяющейся трансляции. Для научного и индустриального программирования необходимо разбиение программ на части для использования библиотек и написания разных частей программы разными программистами. Т.о., модульность – это критичная технологическая потребность индустриального программирования.
2.Реализаторская позиция – то, как какая-либо технологическая потребность реализуется в ЯП. Любой хороший ЯП можно объяснить в терминах высокоуровневых понятий. Многие вещи становятся более понятны, если ясно как они реализованы (например, не слишком ли накладны виртуальные методы с точки зрения реализации; надо понимать какие накладки это может вызвать).
3.Авторская позиция
Язык – это система компромиссов (например, если при создании ЯП включать в него все конструкции многих ЯП (например, ЯП PL/I), то такой язык будет неудачным).
Книга Страуструпа «Дизайн и эволюция языка С++» во многом посвящена авторской позиции.
4.Семиотическая позиция
Семиотика – наука о знаковых системах. Любой ЯП – это знаковая система. Следовательно, к любому ЯП применимы понятия семиотики.
Семиотическую позицию можно представить как позицию человека, знакомого с некоторыми знаковыми системами и желающего узнать, чем выделяются такие знаковые системы как ЯП.
5.Социальная позиция
Любой ЯП – социальный феномен. Например, ЯП Visual Basic гораздо более популярен, чем Delphi, хотя Delphi превосходит его во многих отношениях. Никакими причинами, кроме социальных это не объяснить.
Позиции 4-5 в нашем курсе подробно рассматривать не будем.
3.3.Схема рассмотрения ЯП
1.Базис:
-
скалярный (примитивные типы данных и операции над ними)
-
структурный (составные типы данных, множества, управляющие структуры).
Со временем базис ЯП не усложняется.
2. Средства развития – новые абстракции. Например, сложность – ключевая проблема современного программирования и программирования вообще. С 60-х люди стали создавать программы в миллионы строк (непрерывная распечатка текста занимает несколько ящиков!) Ориентироваться, знать и понимать такую программу невозможно.
Причина – семантический разрыв между базисными средствами и реальными объектами. Что необходимо, чтобы в языке были средства развития?
-
процедурная абстракция,
-
средства разделения данных между подпрограммами.
Например, язык С обладает средствами развития за счет
-
понятия модульности,
-
понятия функций.
Язык С++ наиболее мощный язык с точки зрения средств развития:
-
понятие класса,
-
наследование,
-
динамический полиморфизм,
-
статический полиморфизм,
-
шаблоны.
3.Средства защиты – это средства, которые поддерживают цельность создаваемых абстракций. Например, в ЯП С отсутствуют средства защиты. В языке С++ средства защиты также недостаточно хороши вследствие совместимости с языком С.
С точки зрения п.2 и 3 ЯП в основном и различаются.
3.4.Понятие о виртуальной машине языка
Стандартная библиотека – это совокупность функций и структур данных, которые должны присутствовать в любой реализации языка.
При реализации языка программирования структуры данных и алгоритмы, задействованные при выполнении программы, определяют некоторую вычислительную машину. Поскольку она всегда (хотя бы частично) моделируется программным образом, то она называется виртуальным компьютером, определяемым реализацией языка.
Виртуальная машина, используемая программистом, состоит фактически их иерархии виртуальных компьютеров.
КОМПЬЮТЕР WEB –ПРИЛОЖЕНИЯ (реализованный как HTML – страница) |
Виртуальный WEB-компьютер (браузер – программа на языке С или Java) |
Виртуальный компьютер ЯЗЫКА С (реализуется программами из библиотеки поддержки выполнения, загружаемой вместе с откомпилированной программой) |
ВИРТУАЛЬНЫЙ КОМПЬЮТЕР ОПЕРАЦИОННОЙ СИСТЕМЫ (реализуется программами на машинном языке, которые выполняются на виртуальном программно-аппаратном компьютере) |
ПРОГРАММНО-АППАРАТНЫЙ ВИРТУАЛЬНЫЙ КОМПЬЮТЕР (машинный язык этого компьютера реализуется микропрограммами, выполняемыми на аппаратном компьютере) |
РЕАЛЬНЫЙ АППАРАТНЫЙ КОМПЬЮТЕР (реализован физическими устройствами) |
В основании этой иерархии должен находится реальный компьютер. Но обычно программисты крайне редко имеют дело непосредственно с ним. Этот реальный компьютер последовательно преобразуется слоями программного обеспечения в виртуальную машину, которая может значительно отличаться от реального компьютера.
Виртуальная машина – некоторый абстрактный интерпретатор языка программирования. Пример виртуальной машины ЯП – Java VM (в ее состав входит интерпретатор байт-кода и системные библиотеки).
Лекция 4 (при составлении конспекта использовалась диктофонная запись)
3.5. Данные, операции и связывание
Это самые основные понятия во всех языках программирования, поэтому их рассмотрение мы выносим во введение. Мы уже определили ЯП как инструмент для планирования поведения исполнителя (Кауфман, «ЯП»). Данными обычно считают любые обрабатываемые объекты независимо от их внутренней природы. Совершенно очевидно, что любой исполнитель работает с какими-либо данными и обрабатывает их путем совершения некоторого рода операций. И поэтому данные – это безусловно самая важная абстракция. С другой стороны, прежде чем начать характеризовать понятия операции и данные, необходимо отметить дуализм этого понятия, т.е. данные и операции это взаимосвязанные понятия. Т.е. все, что мы делаем с данными, с точки зрения исполнителя, называется операциями. Операции –это суть воздействия изменения данного, некоторого вычисления. Между операциями и данными существует глубокий дуализм, и в структуре современных ЯП этот дуализм подчеркивается.
Что же считать данными и что считать операциями? Здесь существует 2 мнения.
Рассмотрим язык Delphi, который произошел от языка Turbo Pascal. В нем есть понятие строка (string); есть операция length(s), и в применении к данным типа string она возвращает длину строки. Функция – это абстракция понятия операция; есть пользовательские функции – это пользовательские операции, которые мы вводим над данными. С этой точки зрения, длина length(s) – это операция.
С другой стороны, вспомним язык Turbo Pascal. Что там представляет тип данных string? Это строка длиной не более чем 256 символов, и в 1-ом байте этой строки находится длина. Иначе говорят, что эти строки с признаком длины. И с этой точки зрения, что из себя представляет длина строки? Безусловно – это данные. Более того, многие программисты этим пользуются. Фактически, length(s) – это обращение к нулевому байту соответствующего массива.
Пусть есть var s:string;
Хорошим стилем программирования на Turbo Pascal считалось:
len: byte absolute s;
Слово absolute в Turbo Pascal служило для отождествления двух переменных различных типов. Т.е. по этому объявлению переменная len начиналась с того же самого адреса, что и переменная s. И поэтому i:=len; было то же самое, что и i:=length(s);
Тем самым, здесь программист заведомо использовал дуализм понятия длины строки.
Что же теперь считать длиной строки в современной стратегии? В Delphi понятие строки – это существенно более сложное понятие. Там строка – это настоящая динамическая строка; когда речь идет о строке – речь идет о некотором дескрипторе; частью этого дескриптора является указатель на символьный массив, который является строкой. Т.о., строка – это настоящая динамическая строка, размер которой может достигать 2 мегабайт.
Чем в Delphi является string? Это данные или операция? Вообще говоря непонятно. Все зависит от того, каким образом реализован string.
А если речь идет о string языка С, то строка – это любая последовательность символов, которая заканчивается нулем. Там операция strlen – это безусловно настоящая операция, которая влечет за собой сканирование области памяти.
Этот пример показывает, что данные и операции между собой связаны очень тесно.
Еще более ясен этот дуализм в некоторых языках, где есть понятие свойства.
Свойство (property) – это некоторый атрибут объекта, который выглядит как данное.
Например, в системах с графическим пользовательским интерфейсом любая визуальная компонента (т.е. компонента, которая отображается на экране) имеет свое окно. Там будут такие свойства : x, y, width, height .
Пусть Box – некоторая компонента, и у нее есть свойства box.x и box.y ;
(x,y) – координаты левого верхнего угла окна. Выглядят такие свойства исключительно как данные, т.е. запись box.x=0; box.y=0; с точки зрения ЯП выглядит как присваивание x и y компоненты box нуля, т.е. надо отправить её в левый верхний угол контейнера. На самом деле изменение свойств x и y - это целая совокупность операций:
-
найти окно
-
запросить у ОС возможность изменения геометрии окна
-
производится операция изменения положения окна
-
производится операция перерисовки.
Кроме того, соответствующая операция может и не выполнится, если какой-либо пункт запрещен. А с точки зрения ЯП все выглядит как изменение одного данного.
Т.о., понятие свойства явным образом демонстрирует дуализм операций и данных.
Более того, многие языки явным образом поддерживают понятие свойства (Delphi, С#), т.е. можно программировать свои классы и в них указывать что-либо как свойства, т.е. объявлять свойства как данные и в то же время связывать с этим свойством операции изменение его значения (set) и извлечение его значения (get).
Поговорим подробнее о данных.
Вообще говоря, в процедурных ЯП ( т.е. в ЯП, основанных на фон неймановской модели) ключевым понятием является понятие переменная/константа. И переменная и константа – это так называемые объекты данных (ОД). Это важнейшие понятия в любом ЯП.
Атрибуты (свойства) понятия переменная в любом языке:
-
имя
-
значение
-
тип
-
адрес
-
время жизни
-
область видимости
1.Имя.
Каждый ли объект данных имеет имя ( в Pascal, C)?
Нет(например, константа I =5; имени не имеет, а имеет только изображение).
Есть языки (например, LISP), в которых объекты данных могут имени не иметь.
Какие ОД не имеют имени в стандартном Pascal? Например, объекты динамической памяти, и единственно возможный способ к ним обратиться – через указатель.