Разработка метода информационной совместимости программных средств автоматизации начальных этапов проектирования изделий

Изучение программно-математического обеспечения информационной совместимости, анализ проблем. Реализация и преимущества преобразования данных в CAD/CAM-системах. Представление кривых и поверхностей в NURBS. Проблемы сохранения точности и валидации.

Рубрика Программирование, компьютеры и кибернетика
Вид диссертация
Язык русский
Дата добавления 13.09.2014
Размер файла 3,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Все компоненты массива имеют одинаковый тип, который называется типом компонент массива. Если тип компонент массива - T, тогда массив пишется T [].

Например, рассмотрим диапазон выражение от 1 до 10. Это очень простой массив, который дает значения от 1 до 10, один за другим. Такой массив может быть использован при следующей итерации:

for (int i : (1 : 10)) { /* операции */ }

Или это может быть аргументом для совокупности методов, которые выполняют вычисления по полученным значениям и возвращают одно значение:

int p = prod(1 : 10);

int s = sum(2 * (1 : 4));

Этот пример показывает возможность использования совокупности методов prod и sum. Совокупные методы могут также использоваться для массивов:

int[] a = {1, 2, 3, 4, 5};

int s = sum(a);

Массивы часто используется в контексте запросов. Например, следующее выражение вычисляет длину всех экземпляров класса F, диаметр которого превышает пороговое значение t:

float len = sum((* f:F, (f.diameter > t) *).length);

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

long* fibonacci(int n) {

long a = 1, b = 1;

while (--n >= 0) {

yield a;

long t = a; a = b; b += t;

}

}

Вышеуказанную сумму первых 10 чисел Фибоначчи, можно вычислить с помощью выражения sum(fibonacci(10)) и её можно вывести в консоль:

System.out.println(fibonacci (10));

Массив может быть реализован без условия завершения. В принципе, это вычисление чисел Фибоначчи может выполняться до бесконечности:

long* fibonacci() {

long a = 1, b = 1;

while (true) {

yield a;

long t = a; a = b; b += t;

}

}

Теперь прекращения должны быть реализованы внешне:

int n = 10;

for (long f : fibonacci()) {

System.out.println(f);

if (--n < 0) {

break;

}

}

2.МОДЕЛЬ ДАННЫХ

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

Интерфейс между внутренним языком и конкретным источником данных делится на две части:

1) На этапе компиляции - время компиляции модели обеспечивает статическую информацию об источнике данных для компилятора.

2) Во время выполнения - связанные с компиляции модели и операции для источника данных.

2.1 Модуль компилятции

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

1. Объявление пакета (package), содержащее полностью квалифицированное имя пакета, которому принадлежит модуль компиляции.

2. Объявление импорта (import), которое разрешает использовать простые имена типов из других пакетов.

3. Объявления классовых и интерфейсных типов.

2.2 Модель реального времени

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

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

3.ВИРТУАЛЬНАЯ МАШИНА

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

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

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

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

Виртуальная машина Java исполняет файлы .class или .jar, эмулируя инструкции путем интерпретирования или использования just-in-time компилятора, такого, как HotSpot от Sun microsystems.

Как и большинство виртуальных машин, виртуальная машина Java имеет stack-ориентированную архитектуру, свойственную микроконтроллерам и микропроцессорам.

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

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

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

- StackOverflowError: виртуальная машина использовала весь стек для потока, обычно это случается в результате того, что поток делает неограниченное число рекурсивных вызовов из-за ошибки в написании программы.

- UnknownError: исключение или ошибка произошла, но по каким-то причинам, виртуальная машина неспособна сообщить о фактической причине исключения или ошибки.

4.ЛЕКСИЧЕСКАЯ СТРУКТУРА

Эта глава определяет лексическую структуру внутреннего языка моделирования. Данная структура основана на языке программирования Java.

Программы записываются символами Unicode, поэтому необходимы лексические преобразования для того, чтобы Unicode-последовательности, состоящие только из символов ASCII, могли быть использованы для записи любого Unicodе-символа. Ограничители строки определены для того, чтобы поддерживать различные соглашения существующих систем по нумерации строк.

Программы на внутреннем языке моделирования записываются с помощью набора Unicode-символов, исключая комментарии, идентификаторы, содержимое символьных и строковых литералов, все элементы ввода в программе образуются только из символов ASCII (или Unicode-последовательностей, которые дают символы ASCII).

Трансляция Unicode-последовательностей в соответствующие Unicode-символы. Unicode-последовательность формы \uxxxx, где xxxx - шестнадцатиричное число, представляет Unicode-символ, чьим кодом является xxxx. Этот шаг позволяет представить любую программу, используя только ASCII-символы.

4.1 Идентификаторы

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

Идентификатор не может иметь то же самое написание (последовательность Unicode-символов) как и ключевое слово, логический литерал или null-литерал.

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

4.2 Ключевые слова

Следующие последовательности символов, сформированные из ASCII-букв, являются ключевыми словами и не могут использоваться как идентификаторы:

Таблица 4.1. Ключевые слова

1

abstract

11

import

21

transient

31

static

41

for

2

do

12

public

22

extends

32

while

42

continue

3

in

13

trybyte

23

interface

33

class

43

assert

4

return

14

final

24

strictfp

34

synchronized

44

double

5

case

15

long

25

yield

35

throw

45

instanceof

6

finally

16

super

26

new

36

boolean

46

void

7

module

17

goto

27

private

37

else

47

catch

8

switchconst

18

this

28

throws

38

short

48

float

9

package

19

implements

29

break

39

volatile

49

native

10

default

20

protected

30

int

40

char

50

if

Ключевое слово goto зарезервировано, хотя не используется в настоящее время. Ключевое слово const зарезервировано для языка программирования Java, но используется во внутреннем языке моделирования в качестве модификатора при объявлениях переменных. Слова true, false и null могут быть приняты как ключевые слова, однако они являются техническими литералами.

Тип null имеет одно значение, нулевая ссылка, представляемая пустым литеральным указателем, который сформирован из символов ASCII. Нулевой литерал всегда имеет тип null.

4.3 Разделители и знаки операций

Следующие символы ASCII являются разделителями (знаками пунктуации):

Таблица 4.2. Разделители

1

(

4

*)

7

}

10

@

13

,

2

(*

5

{

8

`

11

]

14

.

3

)

6

\(

9

[

12

;

 

 

Следующие символы являются знаками операций:

Таблица 4.3. Операции

1

=

11

:-=

21

/

31

?

41

:^=

51

<--

2

==

12

==>>

22

/=

32

||

42

<+

52

>>

3

+

13

<

23

:/=

33

|

43

--

53

>>=

4

+=

14

>=

24

->

34

|=

44

%

54

<=>

5

:+=

15

*

25

~

35

:|=

45

%=

55

>>>

6

==>

16

*=

26

&&

36

+>

46

:=

56

>>>=

7

>

17

:*=

27

&

37

:

47

-->

57

::

8

<=

18

::>

28

&=

38

++

48

<<

 

 

9

-

19

!

29

:&=

39

^

49

<<=

 

 

10

-=

20

!=

30

<-

40

^=

50

**

 

 

5.ТИПЫ ДАННЫХ

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

Типы языка программирования Java разделены на две категории: примитивные типы и ссылки:

1. Примитивные типы - это тип boolean и числовые типы. Числовые типы - целочисленные типы: byte, short, int, long, и char, а также вещественные типы float и double.

2. Ссылочные типы - классовые типы, интерфейсные типы, и типы массивов.

Имеется также специальный тип null.

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

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

Таблица 6.1. Основные типы данных

Type

::=

ReferenceType | PrimitiveType

PrimitiveType

::=

boolean | byte | short | char | int | long | float | double

ReferenceType

::=

Name | ArrayType

ArrayType

::=

Type '[' ']'

5.1 Аффиксы

Аффиксы используются для формирования имен с общим префиксом или суффиксом, но разных типов. Тип аффикса определяется следующим образом:

a for reference types,

d for double,

f for float,

l for long,

i for the other types.

5.2 Перекрестные типы

Перекресные типы - это типы, которые возникают в запросах, но не могут быть записаны непосредственно в рамках программы. Пересечения типов определены в языке программирования Java.

6.ПЕРЕМЕННЫЕ

Переменная размещается в памяти и имеет тип, иногда этот тип называется типом времени компиляции, который является примитивным или ссылочным типом. Переменная всегда содержит значение, которое совместимо по присваиванию с типом. Значение переменной изменяется либо с помощью присваивания, либо с помощью операций ++ (инкремента) или -- (декремента) в префиксной или постфиксной форме.

Существует семь видов переменных:

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

2. Переменная экземпляра - поле, объявленное в пределах описания класса без использования ключевого слова static. Если класс T имеет поле a которое является переменной экземпляра a, тогда новая переменная экземпляра создается и инициализируется значением, установленным по умолчанию как часть каждого вновь созданного объекта класса T или любого класса, который является подклассом T.

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

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

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

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

7. Локальные переменные, объявленные с помощью операторов описания локальных переменных. Всякий раз, когда поток управления входит в блок или оператор for, для каждой локальной переменной создается новая переменная, немедленно объявленная в операторе описания локальной переменной, которая содержится в пределах того блока или оператора for.

Внутренний язык моделирования использует вышеуказанные виды переменных, а также вводит два новых вида переменных:

1. Переменные запроса являются новым особого рода видом локальных переменных.

2. Наследственные переменные являются объявлением текущего времени компиляции модели.

Как пример - класс T индуцирует один экземпляр переменной для каждого экземпляра поля этого класса Т, а наследственные переменные существуют для каждого свойства Т.

Свойства (не массив) ссылочного типа T объявлены при компиляции модели m следующим образом:

За каждый действительный идентификатор n во внутреннем языке моделирования (вызов метода m.getDirectProperty(T,n) возвращает (не пустой) экземпляр p class de.grogra.xl.lang.Property) существует наследственная переменная p с именем n и объявлен тип Т. Тип этого свойства имеет возвратный тип с вызовом метода p.getType().

Для каждого свойства p используется тип Т, который является ссылочным типом S и для каждого не пустого ссылочного типа C, который может быть отнесен к S - вызов метода p.getTypeCastProperty(C) используется для возврата экземпляра q класса de.grogra.xl.lang.Property, а q представляет собой наследственный тип p типа C, который должен быть таким же, как и тот тип, который используется в возвращаемом методе вызова q.getType(), где q - ссылка на тип Т.

Для каждого свойства p используется тип Т, который не является массивом, а ссылкой типа S и для каждого действительного идентификатора n внутренний язык моделирования возвращает не пустой экземпляра и класс de.grogra.xl.lang.Property, что относится к s и p типа Т. Тип этого свойство имеет возвратный тип с вызовом метода s.getType().

До этого обработка исходного кода задавала время компиляции. Поэтому для свойства p компилятор внутреннего языка использует строковый идентификатор, возвращенный в вызов метода p.getRuntimeName() в качестве идентификатора для этого свойства в скомпилированном исходном коде. Этот идентификатор используется во время выполнения с тем, чтобы определить p и время выполнения программы, а впоследствии обозначается pR. Именно для модели реального времени вызов метода r.propertyForName(id, L) должен возвращать не пустое значение, например pR класса de.grogra.xl.runtime.Property. Тип pR - тип p.

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

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

Если pR является временем компиляции, то p предполагает наличие числа n свойства компонента, т.е. n вызова getComponentProperty и как описано выше необходимо для того, чтобы получить от свойства p, а затем и индексы n для дальнейшего доступа к массиву. Они должны быть в рамках реализации pR-get- и set-методов, где верхнее значение на стек соответствует последнему компоненту в цепочке.

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

Наследственные переменные могут использоваться в квазипараллельных моделях.

7.ПРЕОБРАЗОВАНИЯ И РАСШИРЕНИЯ

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

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

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

1. Тождественное преобразование

2. Расширяющее примитивное преобразование

3. Сужающее примитивное преобразование

4. Расширяющее ссылочное преобразование

5. Сужающее ссылочное преобразование

6. Строковые преобразования

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

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

Далее описаны пять преобразований контекстов:

1. Преобразование присваивания конвертирует тип выражения к типу указанной переменной.

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

3. Преобразование приведения конвертирует тип выражения к типу явно указанному операцией приведения.

4. Строковое преобразование позволяет любому типу быть конвертированным в тип String.

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

Каждое выражение, используемое во внутреннем языке моделирования, использует множество типов во время компиляции. Путем преобразования из типа S для типа T, выражение типа S может рассматриваться как имеющее типы Т во время компиляции.

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

7.1 Расширения сужающих преобразований

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

byte to short, int, long, float, or double

short to int, long, float, or double

char to int, long, float, or double

int to long, float, or double

long to float or double

float to double

double to float, если компилятор поддерживает эту операцию.

7.2 Преобразование типов

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

Некоторые приведения времени компиляции считаются неверными; такие приведения заканчиваются ошибкой времени компиляции.

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

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

- Если какой-то операнд имеет тип double, то другой преобразовывается в тип double.

- Иначе, если какой-то операнд имеет тип float, то другой преобразовывается в тип float.

- Иначе, если какой-то операнд имеет тип long, то другой преобразовывается в тип long.

- Иначе, оба операнда преобразовываются в тип int.

8.ИМЕНА

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

Имена в программах на языке программирования Java бывают простые, состоящие из единственного идентификатора или квалифицированные, состоящие из последовательности идентификаторов отделенных знаками ".".

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

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

Далее представлен синтаксис имен:

Таблица 8.1. Синтаксис имени

Name

::=

Identifier {'.' Identifier}

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

8.1 Объявления

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

- Пакет, указанный в объявлении пакета package;

- Импортированный тип, объявленный в описании одиночного импорта типа, или в описании импорта типа по шаблону;

- Класс, объявленный в описании классового типа;

- Интерфейс, объявленный в описании интерфейсного типа;

- Член ссылочного типа, один из следующего:

o поле, одно из следующего:

§ поле объявленное в классовом типе;

§ константное поле объявленное в интерфейсном типе;

§ поле length, которое, неявно является членом каждого типа массив;

o метод, один из следующих:

§ метод (абстрактный или иной) объявленный в классовом типе;

§ метод (всегда абстрактный) объявленный в интерфейсном типе;

- Параметр, один из следующего:

o параметр метода или конструктора класса;

o параметр абстрактного метода интерфейса;

o параметр обработчика исключительных ситуаций, объявленный в операторе catch оператора try.

- Локальная переменная, одна из следующих:

o локальная переменная, объявленная в блоке;

o локальная переменная, объявленная в операторе for;

- Конструкторы также вводятся объявлениями, но используют имя того класса, в котором они объявлены, а не новое имя.

8.2 Определение значения имени

Значение имени зависит от контекста, в котором оно используется. Определение значения имени зависит от:

1. в зависимости от контекста и синтаксиса имена делятся на пять категорий:

a. PackageName;

b. TypeName;

c. ExpressionName;

d. MethodName;

e. AmbiguousName (неоднозначное имя);

2. имя, которое изначально классифицируется своим контекстом в качестве AmbiguousName, переклассифицируется по определенным правилам области действия, чтобы представлять собой PackageName, TypeName или ExpressionName;

3. результирующая категория указывает конечное определение значения имени (или ошибку времени компиляции, если имя не имеет значения).

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

Значение имени классифицированного как PackageName определено следующим образом:

- Если имя пакета состоит из одного Identifier, тогда этот идентификатор указывает пакет верхнего уровня с именем того же идентификатора. Если пакет с тем именем не доступен, как определено базовой системой, тогда происходит ошибка времени компиляции.

- Если имя пакета имеет вид Q.Id, то Q должно также быть именем пакета. Имя пакета Q.Id обозначает пакет, который представляет собой член с именем Id внутри пакета с именем Q. Если Q не имя доступного пакета, или Id не имя доступного подпакета этого пакета, то происходит ошибка времени компиляции.

Значение имени классифицированного как TypeName определено следующим образом.

- Если имя типа состоит из одного Identifier, тогда идентификатор должен появляться в области действий описания типа с этим именем, либо происходит ошибка времени компиляции.

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

Значение имени классифицированного как ExpressionName определено следующим образом.

Если имя выражения состоит из одного Identifier, тогда:

- Если Identifier появляется внутри области действий описания локальной переменной или описания параметра с этим именем, тогда вид имени указывает переменную, то есть, локальную переменную либо параметр. Локальные переменные и параметры никогда не скрыты, таким образом обязательно должна быть более, чем одна такая локальная переменная, либо параметр. Тип имени выражения представляет собой объявленный тип локальной переменной или параметра.

- Иначе, если Identifier появляется внутри описания класса.

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

- Если имя метода состоит из отдельного Identifier, тогда Identifier - это имя метода, используемое для вызова метода. Identifier должен быть именем по крайней мере одного метода класса или интерфейса, в пределах которого он появляется.

- Если имя метода имеет форму Q.Id, тогда Q классифицируется уже как имя пакета, имя типа, или имя выражения. Если Q - имя пакета, тогда происходит ошибка времени компиляции. Иначе, Id - имя метода, используемое для вызова метода. Если Q - имя типа, тогда Id должен определять по крайней мере один static-метод типа Q. Если Q - имя выражения, и T - тип выражения Q; тогда Id должен определять по крайней мере один метод типа T.

9.ПАКЕТЫ

Программы организованы как наборы пакетов. Каждый пакет имеет собственный набор имен для типов, который помогает предотвращать конфликты между именами. Тип доступен вне пакета, в котором он объявлен, только если этот тип объявлен как public.

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

Пакет можно сохранить в файловой системе или в базе данных. Пакеты, которые сохранены в файловой системе, имеют некоторые ограничения на организацию их модулей компиляции для более легкого нахождения классов. В любом случае, набор пакетов определен базовой системой, но всегда должен включать по крайней мере три стандартных пакета java.lang, java.util, и java.io. В большинстве вычислительных сред, стандартные пакеты java.applet, java.awt, и java.net, которые не описаны в этой спецификации, являются также доступными.

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

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

Один из типов блоков компиляции, обычно обозначается именем с расширением .java, в то время как другой тип имеет расширение.xl.

9.1 Объявление пакетов

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

Таблица 9.1. Объявление пакета

CompilationUnit

::=

[PackageDeclaration] {ImportDeclaration} {TypeDeclaration}

PackageDeclaration

::=

package Name ';'

Каждый модуль компиляции автоматически и неявно импортирует всякое имя типа с модификатором public, объявленное в предопределенном пакете java.lang, так, чтобы имена всех типов были доступны как простые имена.

9.2 Объявление импорта

Объявление импорта (import) разрешает использовать простые имена, объявленные в другом пакете, состоящие из одиночного идентификатора. Без использования соответствующего объявления import, единственный способ обратиться к типу, объявленному в другом пакете - состоит в том, чтобы использовать полностью квалифицированное имя.

Объявление import делает типы доступными по их простым именам только внутри модуля компиляции, который содержит объявление import. Область действия имени (имен) не включает в себя оператор package, другие import-операторы текущего модуля компиляции или другие модули компиляции в том же пакете.

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

Таблица 9.2. Объявление импорта

ImportDeclaration

::=

SingleTypeImportDeclaration | TypeImportOnDemandDeclaration | SingleStaticImportDeclaration | StaticImportOnDemandDeclaration

SingleTypeImportDeclaration

::=

import Name ';'

TypeImportOnDemandDeclaration

::=

import Name '.' '*' ';'

SingleStaticImportDeclaration

::=

import static Name '.' Identifier ';'

StaticImportOnDemandDeclaration

::=

import static Name '.' '*' ';'

Первые два способа объявления используются в языке программирования Java. Последние два способа определяются для внутреннего языка моделирования.

SingleStaticImportDeclaration - импорт всех доступных статических членов с заданным именем name из данного типа.

StaticImportOnDemandDeclaration - декларации импорта со всеми доступными статическими членами, объявленными в данном типе.

10.КЛАССЫ И ИНТЕФЕЙСЫ

Классы и интерфейсы объявляются, как в языке программирования Java:

Таблица 10.1. Объявление классов и интерфейсов

TypeDeclaration

::=

ClassDeclaration | InterfaceDeclaration

ClassDeclaration

::=

Modifiers class Identifier [ extends Name ] [ implements Name {',' Name } ] '{' { ClassBodyDeclaration } '}'

ClassBodyDeclaration

::=

TypeDeclaration | AbstractMethodDeclaration | ConcreteMethodDeclaration | InstancingMethodDeclaration | FieldDeclaration | ConstructorDeclaration | InstanceInitializer | StaticInitializer | ';'

InterfaceDeclaration

::=

Modifiers interface Identifier [ extends Name {',' Name } ] '{' { InterfaceBodyDeclaration } '}'

InterfaceBodyDeclaration

::=

TypeDeclaration | AbstractMethodDeclaration | FieldDeclaration | ';'

Но внутренний язык моделирования определяет следующее:

- Классы, интерфейсы и их члены, могут быть использованы с аннотациями, точно так же, как указано в аннотации языка программирования Java.

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

10.1 Аннотации

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

Аннотацию типа реализует интерфейс de.grogra.reflect.Annotation. Аннотацию типа определяет количество элементов.

Таблица 10.2. Аннотации

Modifiers

::=

{ Modifier }

Modifier

::=

Annotation | public | protected | private | abstract | static | final | synchronized | native | strictfp | transient | volatile | const

Annotation

::=

NormalAnnotation | MarkerAnnotation | SingleElementAnnotation

NormalAnnotation

::=

'@' Name '(' [ ElementValuePairs ] ')'

MarkerAnnotation

::=

'@' Name

SingleElementAnnotation

::=

'@' Name '(' ElementValue ')'

ElementValuePairs

::=

ElementValuePair { ',' ElementValuePair }

ElementValuePair

::=

Identifier '=' ElementValue

ElementValue

::=

Annotation | ExpressionNoAssignment | ElementValueArrayInitializer

ElementValueArrayInitializer

::=

'{' [ ElementValues ] [ ',' ] '}'

ElementValues

::=

ElementValue { ',' ElementValue }

Идентификатор элемента - значение пары нормальной аннотации и простого имени одного из элементов типа аннотации. Значение может состоять только из констант примитивного типа или строк, литералов класса, аннотаций и массивов этих значения (с помощью ElementValueArrayInitializer).

Для генерации соответствующих компонентов:

@Range(min=0, max=360) private float angle;

@Editable String name;

@Choice({"Center", "Left", "Right"}) int alignment;

10.2 Объявления методов

Таблица 10.3. Объявеление методов

AbstractMethodDeclaration

::=

Modifiers ResultType Identifier [ OverloadableOperator ] '(' FormalParameterList ')' [ Throws ] ';'

ConcreteMethodDeclaration

::=

Modifiers ResultType Identifier [ OverloadableOperator ] '(' FormalParameterList ')' [ Throws ] Block

InstancingMethodDeclaration

::=

Modifiers void Identifier '(' FormalParameterList ')' [ Throws ] '==>' { Instantiation } ';'

ResultType

::=

Type [ '*' ] | void

OverloadableOperator

::=

'!' | '~' | '+' | '-' | '*' | '/' | '%' | '**' | '+=' | '-=' | '*=' | '/=' | '%=' | '<<' | '>>' | '>>>' | '<<=' | '>>=' | '>>>=' | '^' | '|' | '&' | '||' | '&&' | '^=' | '|=' | '&=' | '++' | '--' | '==' | '!=' | '>' | '>=' | '<' | '<=' | '<=>' | in | '::' | ':' | '[' ']'

Методы, объявленные как члены классов и интерфейсов - схожи с методами в языке программирования Java, но с некоторыми отличиями:

- В языке программирования Java можно объявить метод, который возвращает массив, как, например, в строке getNames() [] {...}

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

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

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

10.2.1 Генератор объявления методов

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

char* chars(CharSequence s) {

for (int i = 0; i < s.length(); i++) {

yield s.charAt(i);

}

}

Тело генератора объявления метода не должно содержать сведения о том, что происходит возврат на его значение.

Тип С-класс находится в пакете de.grogra.xl.lang. Если T является результатом типа генератора метода, то пусть S-тип - аффикс Т. Например, эквивалентный метод заголовка char(CharConsumer S, библиотеки java.s) выглядит следующим образом:

char chars(CharConsumer c, CharSequence s) {

for (int i = 0; i < s.length(); i++) {

c.consume(s.charAt(i));

}

return 0;

}

10.2.2 Оператор объявления методов

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

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

Complex operator+ (Complex b) {

return new Complex(this.real + b.real, this.imag + b.imag);

}

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

Таблица 10.4. Операторы объявления методов

Оператор

Метод

!

operator$not

~

operator$com

+

operator$pos

-

operator$neg

++

operator$inc

--

operator$dec

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

Ошибка времени компиляции происходит, если метод является abstract или native и имеет блок для тела. Ошибка времени компиляции также происходит, если метод объявлен ни как abstract и ни как native, но содержит точку с запятой для тела.

Таблица 10.5. Операторы бинарного объявления методов

Оператор

Метод

+

operator$add

-

operator$sub

*

operator$mul

/

operator$div

%

operator$rem

<<

operator$shl

>>

operator$shr

>>>

operator$ushr

^

operator$xor

|

operator$or

&

operator$and

||

operator$cor

&&

operator$cand

**

operator$pow

==

operator$eq

!=

operator$neq

>

operator$gt

>=

operator$ge

<

operator$lt

<=

operator$le

<=>

operator$cmp

in

operator$in

::

operator$guard

:

operator$range

[]

operator$index

++

operator$postInc

--

operator$postDec

Последний параметр бинарного объявления методов для операторов ++ и -- должен иметь тип int.

Если порядок больше, чем два и оператор [], то эквивалентный метод называется operator$index.

11.КЛАСС ПРЕДИКАТОВ

Предикат -- любое выражение, в котором есть, по меньшей мере, одна переменная. Класс предикатов используется в качестве предикатов в запросах. Он объявлен в подклассе de.grogra.xl.qnp.ClassPredicate.

Пусть P-конкретный подкласс ClassPredicate. Если P имеет статический метод m имени подписи. Иначе ни один класс предикатов не может быть объявлен.

Пусть U1, ..., Un типы m параметров. Если ClassPredicate.InOut, то подпись является подпоследовательностью U1, ..., Un, где In-out-параметр предикатов указывает на индекс k. Это приводит к ошибке компиляции, т.е. если k равно n.

В противном случае, если Ui находится в ClassPredicate.In, то должно быть Uo, которое равно ClassPredicate.Out, иначе во время компиляции возникает ошибка. Подпись является подпоследовательностью U1, ..., Un, где Ui и Uo были удалены. В параметре предикатов индекс Ui+1 - out-параметр предикатов, который имеет индекс Uo+1 в этой последовательности.

В противном случае, подписей U1, ..., Un нет в in-out-параметрах.

Пусть T - это организация, которая является членом P (таким образом, T - пакет или тип). Класс предикат определяется как член T, чье простое имя - это простое имя P. Ее доступность такая же, как у P.

Кроме того, если T является типом, пусть E-организация, в которой T-членов. Класс предикат определяется как член E, у которого каждое имя - это простое имя T. Ее доступности такое же, как в P.

12.СИГНАТУРА МЕТОДА

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

12.1 Наследование сигнатур метода


Подобные документы

  • Программная и техническая характеристика информационных систем предприятия. Требования к информационной и программной совместимости. Проектирование программного обеспечения с использованием специализированных программных пакетов. Разработка базы данных.

    отчет по практике [1,3 M], добавлен 11.04.2019

  • Документ, на основании которого ведется разработка. Требования к составу и параметрам технических средств, к информационной и программной совместимости. Проработка программных средств. Переопределение стандартных операций для абстрактных типов данных.

    курсовая работа [371,5 K], добавлен 21.02.2012

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

    курсовая работа [403,9 K], добавлен 26.03.2015

  • Требования к составу и параметрам технических средств, информационной и программной совместимости. Разработка функциональных моделей автоматизированной системы "Деятельность бетонно-растворного узла". Интерфейс Web-приложения, руководство пользователя.

    курсовая работа [4,6 M], добавлен 04.10.2014

  • Этапы решения задачи классификации цифр арабского алфавита на основе нейронных сетей: выбор класса, структуры и пакета нейронной сети, ее обучение, требования к информационной и программной совместимости, составу и параметрам технических средств.

    реферат [111,6 K], добавлен 19.10.2010

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

    курсовая работа [3,3 M], добавлен 12.01.2015

  • Среда проектирования программного обеспечения Rational Rose. Унифицированный язык моделирования UML. Требования к функциональности, к безопасности, интерфейсу, настраиваемости, информационной и программной совместимости, программная документация.

    курсовая работа [582,0 K], добавлен 20.07.2011

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

    дипломная работа [3,6 M], добавлен 07.07.2012

  • Анализ и разработка информационной системы, структура сети предприятия. Описание процесса разработки конфигураций и выявление потребностей в автоматизации функций. Средства разработки проектирования и архитектура базы данных. Разработка модели угроз.

    дипломная работа [1,4 M], добавлен 13.07.2011

  • Появление системы управления базами данных. Этапы проектирования базы данных "Строительная фирма". Инфологическая и даталогическая модель данных. Требования к информационной и программной совместимости для работы с базой данных "Строительная фирма".

    курсовая работа [93,0 K], добавлен 31.03.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.