Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций Языки программирования.doc
Скачиваний:
9
Добавлен:
01.04.2025
Размер:
1.42 Mб
Скачать

Язык Java.

В языке Java практически ничего не было изменено. Хотя с точки зрения синтаксиса, средства языка Java побогаче. Спецификатор доступа должен стоять перед каждым членом класса: Base::protected int i. Всего спецификаторов в Java четыре - private, protected, public и пустой спецификатор (т.е. отсутствие ключевого слова), который означает пакетный доступ. Концепции друзей в Java нет. Семантика первых трех спецификаторов точно такая же.

Private скрывает детали реализации не от злоумышленников (от них все равно не скроешься), а от незнания (чтобы случайно не была нарушена целостность структуры данных). От себя защищаться не нужно, нужно защищаться от клиентских модулей. В С++ пришлось вводить друзей из-за того, что классы слишком обособлены друг от друга, и private слишком строг - он укрывает классы, принадлежащие одному программисту друг от друга, хотя его функция скрывать классы от клиентских модулей. Эти проблемы возникают из-за проблем раздельной компиляции, которые достались языку С++ в наследство от языка Си. Все недостатки С++ (90%) достались от языка Си.

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

Рассмотрим механизм protected-членов. Для этого сначала необходимо сказать несколько слов о наследовании. Рассмотрим класс Base у которого есть наследники C1 и С2. У класса С1 есть наследник С3. Функция-член класса С3 в С++ имеет доступ к защищенным членам классов С1,С2, Base. В Java такой возможности нет, т.е. из С3 можно обращаться только к прямым предкам (С1 и Base).

Глава 6. Раздельная трансляция.

Различают несколько видов трансляции:

1. Цельная трансляция. Этот вид трансляции реализован в таких языках, как Алгол-60, Паскаль, и некоторых других. Компилятору предъявляется вся программа целиком. Понятно, что проект может быть лишь небольшого масштаба - это либо конкретные алгоритмы, либо студенческие программы.

2. Пошаговая трансляция. Программа предъявляется компилятору небольшими частями, и он тут же эти части транслирует. Примером пошагового транслятора является транслятор Бейсика в первых IBM машинах, который автоматически загружался из ROM, если не происходила загрузка с дискеты или с другого какого-либо устройства. Пошаговая трансляция достаточна только для языков с примитивной структурой.

3. Инкрементная трансляция. Это расширение пошаговой трансляции. программа разбивается на куски (большие и более значимые), и каждый кусок транслируется отдельно. С инкрементной трансляцией связана динамическая трансляция с языка Java. Транслятор с этого языка преобразовывает файл с расширением .java в файл с расширением .class, который является программой на байт-коде, которая в свою очередь, интерпретируется виртуальной Java-машиной. Интерпретация всегда связана с неэффективностью, поэтому используется динамическая трансляция, когда часть байт-кода "налету" транслируется в машинный код. это наиболее эффективно, когда, например, выполняется некоторый цикл, который нет смысла интерпретировать каждый раз.

4. Раздельная независимая трансляция. Программа разбивается на физически независимые куски и компилятору в каждый момент времени доступен только один кусок. Эта трансляция употреблялась в языке Fortran. Каждая подпрограмма (процедура или функция) и сама программа транслировались раздельно. Этот вид трансляции также используется в языках Ассемблер и Си.

5. Раздельная зависимая трансляция. Язык и/или система программирования устроены таким образом, что компилятору доступен не только текст модуля, но и информация о других модулях. Зависимая трансляция обладает более богатыми возможностями.

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

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

Лекция 16

Нас будут интересовать как раз раздельная независимая трансляция и раздельная зависимая трансляция. Следует сразу условиться о терминологии: мы для краткости под «раздельной трансляцией» будем понимать «раздельную зависимую трансляцию», соответственно, раздельная независимая трансляция так и будет использоваться.