48695 (608738)
Текст из файла
Введение
Тема, цель, актуальность работы
Анализ проектов, реализованных на языках программирования Java и C# на предмет взаимодействия между классами.
Результат работы программы необходимо вывести в файл *.xml.
Актуальность работы заключается в том, что на сегодняшний день нет известных аналогов программы. Не стоит сравнивать данный проект с такими программными продуктами как Telelogic Rapsody или Rational – он является полной противоположностью названных выше программ, так как анализирует уже «готовый», написанный проект, в то время как Telelogic Rapsody (Rational) генерирует код по диаграммам.
Данный проект может использоваться для углубленного изучения языков программирования Java и C# в рамках программы университета, анализа проектов на предмет взаимодействия классов.
Проект может существовать как автономное приложение, а также может быть дополнен и доработан функционально.
Исследовательская часть
C# и Java– два очень похожих между собой современных языка программирования со сборкой мусора и компиляцией при выполнении. Оба языка – объектно-ориентированные, с синтаксисом, унаследованным от C++, но значительно переработанным.
Java – объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems и официально выпущенный 23 мая 1995 года. Java – так называют не только сам язык, но и платформу для создания приложений уровня предприятий на основе данного языка.
Изначально язык программирования назывался Oak (русск. Дуб) и разрабатывался Джеймсом Гослингом для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания клиентских приложений и серверного программного обеспечения. Программы на Java транслируются в байт-код, выполняемый виртуальной java-машиной (JVM) – программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор, но с тем отличием, что байтовый код, в отличие от текста, обрабатывается значительно быстрее. Достоинство подобного способа выполнения программ – в полной независимости байт-кода от ОС и оборудования, что позволяет выполнять Java-приложения на любом устройстве, которое поддерживает виртуальную машину. Другой важной особенностью технологии Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной.
Длины и диапазоны значений примитивных типов определяются стандартом. Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к Java и одной из причин её успеха. Тем не менее, одна небольшая проблема с платформенной независимостью всё же осталась. Некоторые процессоры используют для промежуточного хранения результатов 10-байтовые регистры или другими способами улучшают точность вычислений.
В языке Java имеются только динамически создаваемые объекты. Причем переменные объектного типа и объекты в Java – совершенно разные сущности. Переменные объектного типа являются ссылками, то есть неявными указателями на динамически создаваемые объекты. Это подчёркивается синтаксисом описания переменных.
C# (произносится си-шарп) – язык программирования, сочетающий объектно-ориентированные и аспектно-ориентированные концепции. Разработан в 1998–2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как основной язык разработки приложений для платформы Microsoft.NET. C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к С++ и Java. Язык имеет строгую статическую типизацию, поддерживает полиморфизм, перегрузку операторов, указатели на функции-члены классов, атрибуты, события, свойства, исключения, комментарии в формате XML. Переняв многое от своих предшественников – языков С++, Java, Delphi, Модула и Smalltalk – С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем: так, C# не поддерживает множественное наследование классов (в отличие от C++).
В Java модификатор protected в описании, помимо доступа из классов-потомков, разрешает доступ из всех классов, входящих в тот же пакет, что и класс-владелец.
В C# для объектов, которые должны быть видны в пределах сборки (примерный аналог пакета Java) введён отдельный модификатор internal, а protected сохраняет свой изначальный смысл, взятый из C++ – доступ только из классов-потомков. Допускается комбинировать internal и protected – тогда получится область доступа, соответствующая protected в Java.
Внутренние классы в C# имеют доступ только к статическим членам внешнего класса, а для доступа к нестатическим членам нужно явно указывать экземпляр внешнего класса. Локальные внутренние классы в C# не поддерживаются, обработка событий в нём не требует таких классов, поскольку строится на других механизмах. В обоих языках методы, по аналогии с C++ – функции, определённые в классе. Тело метода располагается внутри описания класса. Поддерживаются статические методы, абстрактные методы. В C# также есть явная реализация методов интерфейса, что позволяет классу реализовывать методы интерфейса отдельно от собственных методов или давать разные реализации одноимённых методов, принадлежащих двум разным интерфейсам. C# также поддерживает явное описание передачи параметров по ссылке (ключевые слова ref и out). При использовании out компилятор контролирует наличие в методе присваивания значения. C# позволяет создавать пользовательские типы-значения, используя ключевое слово struct. Это прямое наследие языка С++ от которого создатели Java сознательно отказались.
Java поддерживает импорт статических имён (import static) из классов, позволяющий отдельно импортировать некоторые или все статические методы и переменные класса и использовать их имена без квалификации в импортирующем модуле. В C# импортируется только сборка и при каждом использовании импортируемых статических имён требуется указывать класс.
В Java константы в операторы switch должны относиться либо к целочисленному, либо к перечислимому типу. В C# в switch можно использовать текстовые строки.
Java содержит конструкцию strictfp, гарантирующую одинаковые результаты операций с плавающей точкой на всех платформах.
C# содержит конструкции checked и unchecked, позволяющие локально включать и выключать динамическую проверку арифметического переполнения.
C# поддерживает оператор перехода goto. Обычное использование – передача управления на разные метки case в операторе switch и выход из вложенного цикла. В Java от использования goto сознательно отказались.
Java поддерживает метки в циклах и позволяет использовать их в командах break и continue, благодаря чему исключается такой повод использования goto, как выход из вложенного цикла.
C# поддерживает отдельное понятие именованной типизированной константы и ключевое слово const. В Java констант как таковых нет, вместо них используются статические переменные класса с модификатором final – эффект от их использования точно такой же.
Разработка транслятора
Разработка лексического анализатора
Алфавит языка
Большие и малые буквы английского алфавита: a..z, A..Z
Цифры: 0,1,2,3,4,5,6,7,8,9.
Другие символы: ‘’, ‘:’, ‘, ’, ‘’’, ‘;’, ‘{», ‘}’, ‘(», ‘)’
Классы лексем
-
зарезервированные слова;
-
знаки операций и разделители;
-
литералы;
-
идентификаторы
Лексика языков
-
Класс идентификаторы: к этому классу относятся все наборы цепочек, кроме зарезервированных слов
-
Класс зарезервированных слов:
-
Для C#
-
using, class, int, float, char, public, protected, private, return, namespace
-
Для Java
using, class, int, float, char, public, protected, private, return
-
Класс знаков операций и разделителей:
() {} : ; = -> . , ‘ *
-
Класс литералов:
Литерал – целочисленная или текстовая константа.
Структура таблицы идентификаторов
имя | номер в классе | тип |
Структура таблицы литералов
имя | тип |
Разработка синтаксического анализатора
Грамматика языков
В данном проекте исследуется лишь малая часть возможностей и особенностей вышеуказанных языков. В связи с этим спроектированные грамматики для этих языков будут включать лишь те структуры языка, которые нам необходимы
Грамматика С#
1 := 2 3 namespace 4 {5 6}
7 := 9 using 10
8 := 11 е
12 := 16 17
13 := 18 идентификатор 19
20
14 := 21 е
15 := 22 23
24 := 25 class 26 идентификатор 27 28 {29 30} 31;
32:= 34: 35 идентификатор
33:= 36е
37:= 40. 41 идентификатор 42 43;
38:= 44 45;
39:= 46;
47 := 49 (50)
48 := 80 е
51 := 52 53 идентификатор 55
56:= 58 (59) 60 (61 62 return 63 литерал 64; 81)
57:= 65
66 := 68, 69 идентификатор 70
67 := 71;
72 := 76 int
73 := 77 float
74 := 78 char
75 := 79 идентификатор
Грамматика java
1 := 2 3
7 := 9 using 10
8 := 11 е
12 := 16 17
13 := 18 идентификатор 19
20
14 := 21 е
15 := 22 23
24 := 25 class 26 идентификатор 27 28 {29 30} 31;
32:= 34: 35 идентификатор
33:= 36е
37:= 40 -> 41 идентификатор 42 43;
38:= 44 45;
39:= 46;
47 := 49 (50)
48 := 80 е
51 := 52 53 54 идентификатор 55
56:= 58 (59) 60 (61 62 return 63 литерал 64; 81)
57:= 65
66 := 68, 69 идентификатор 70
67 := 71;
72 := 76 int
73 := 77 float
74 := 78 char
75 := 79 идентификатор
82:= 84 *
83:= 85 e
Доказательство принадлежности к LL(1) – грамматике
С#
={using | namespace}
={class | идентификатор |} | int | float | char}
={: | {}
={. | (|;)
={(|;)
={(|, |;)
={, |;}
={int | float | char | идентификатор}
Грамматика java
={using | class | идентификатор | int | float | char}
={class | идентификатор | int | float | char}
={: | {}
={-> | (|;)
={(|;)
={(|, |;)
={, |;}
={int | float | char | идентификатор}
={* | идентификатор}
Таблицы разбора
Таблица разбора С#
№ | Ожидаемый терминал | Переход | Принять | В стек | Из стека | Ошибка |
1. | ~ | 2 | - | - | - | - |
2. | ~ | 7 | - | - | - | - |
3. | namespace | 4 | + | - | - | + |
4. | { | 5 | + | - | - | + |
5. | ~ | 12 | - | + | - | - |
6. | } | 0 | + | - | + | + |
7. | using | 9 | - | - | - | - |
8. | ~ | 11 | - | - | - | - |
9. | using | 10 | + | - | - | + |
10. | ~ | 7 | - | - | - | - |
11. | ~ | 3 | - | - | - | - |
12. | class | 16 | - | - | - | - |
13. | идентификатор | 18 | - | - | - | - |
14. | } | 21 | - | - | - | - |
15. | ~ | 22 | - | - | - | - |
16. | ~ | 24 | - | + | - | - |
17. | ~ | 12 | - | - | - | - |
18. | идентификатор | 19 | + | - | - | + |
19. | ~ | 37 | - | + | - | - |
20. | ~ | 12 | - | - | - | - |
21. | ~ | 0 | - | - | + | - |
22. | ~ | 51 | - | + | - | - |
23 | ~ | 12 | - | - | - | - |
24 | ~ | 25 | - | - | - | - |
25 | class | 26 | + | - | - | + |
26 | идентификатор | 27 | + | - | - | + |
27 | ~ | 32 | - | + | - | - |
28 | { | 29 | + | - | - | + |
29 | ~ | 12 | - | + | - | - |
30 | ) | 31 | + | - | - | + |
31 | ; | 0 | + | - | + | + |
32 | : | 34 | - | - | - | - |
33 | ~ | 36 | - | - | - | - |
34 | : | 35 | + | - | - | + |
35 | идентификатор | 0 | + | - | + | + |
36 | ~ | 0 | - | - | + | - |
37 | . | 40 | - | - | - | - |
38 | ( | 44 | - | - | - | - |
39 | ; | 46 | - | - | - | + |
40 | . | 41 | + | - | - | + |
41 | идентификатор | 42 | + | - | - | + |
42 | ~ | 47 | - | + | - | - |
43 | ; | 0 | + | - | + | + |
44 | ~ | 47 | - | + | - | - |
45 | ; | 0 | + | - | + | + |
46 | ; | 0 | + | - | + | + |
47 | ( | 49 | - | - | - | - |
48 | ~ | 80 | - | - | - | - |
49 | ( | 50 | + | - | - | + |
50 | ) | 0 | + | - | + | + |
51 | ~ | 52 | - | - | - | - |
52 | ~ | 72 | - | + | - | - |
53 | идентификатор | 55 | + | - | - | + |
54 | ||||||
55 | ~ | 56 | - | - | - | - |
56 | ( | 58 | - | - | - | - |
57 | ~ | 65 | - | - | - | - |
58 | ( | 59 | + | - | - | + |
59 | ) | 60 | + | - | - | + |
60 | { | 61 | + | - | - | + |
61 | ~ | 12 | - | + | - | - |
62 | return | 63 | + | - | - | + |
63 | литерал | 64 | + | - | - | + |
64 | ; | 81 | + | - | - | + |
65 | ~ | 66 | - | - | - | - |
66 | , | 68 | - | - | - | - |
67 | ; | 71 | - | - | - | + |
68 | , | 69 | + | - | - | + |
69 | идентификатор | 70 | + | - | - | + |
70 | ~ | 66 | - | - | - | - |
71 | ; | 0 | + | - | + | + |
72 | int | 76 | - | - | - | - |
73 | float | 77 | - | - | - | - |
74 | char | 78 | - | - | - | - |
75 | идентификатор | 79 | - | - | - | + |
76 | int | 0 | + | - | + | + |
77 | float | 0 | + | - | + | + |
78 | char | 0 | + | - | + | + |
79 | идентификатор | 0 | + | - | + | + |
80 | ~ | 0 | - | - | + | - |
81 | } | 0 | + | - | + | + |
Таблица разбора java
№ | Ожидаемый терминал | Переход | Принять | В стек | Из стека | Ошибка |
1. | ~ | 2 | - | - | - | - |
2. | ~ | 7 | - | - | - | - |
3. | ~ | 12 | - | - | - | - |
7. | using | 9 | - | - | - | - |
8. | ~ | 11 | - | - | - | - |
9. | using | 10 | + | - | - | + |
10. | ~ | 7 | - | - | - | - |
11. | ~ | 3 | - | - | - | - |
12. | class | 16 | - | - | - | - |
13. | идентификатор | 18 | - | - | - | - |
14. | } | 21 | - | - | - | - |
15. | ~ | 22 | - | - | - | - |
16. | ~ | 24 | - | + | - | - |
17. | ~ | 12 | - | - | - | - |
18. | идентификатор | 19 | + | - | - | + |
19. | ~ | 37 | - | + | - | - |
20. | ~ | 12 | - | - | - | - |
21. | ~ | 0 | - | - | + | - |
22. | ~ | 51 | - | + | - | - |
23 | ~ | 12 | - | - | - | - |
24 | ~ | 25 | - | - | - | - |
25 | class | 26 | + | - | - | + |
26 | идентификатор | 27 | + | - | - | + |
27 | ~ | 32 | - | + | - | - |
28 | { | 29 | + | - | - | + |
29 | ~ | 12 | - | + | - | - |
30 | ) | 31 | + | - | - | + |
31 | ; | 0 | + | - | + | + |
32 | : | 34 | - | - | - | - |
33 | ~ | 36 | - | - | - | - |
34 | : | 35 | + | - | - | + |
35 | идентификатор | 0 | + | - | + | + |
36 | ~ | 0 | - | - | + | - |
37 | -> | 40 | - | - | - | - |
38 | ( | 44 | - | - | - | - |
39 | ; | 46 | - | - | - | + |
40 | -> | 41 | + | - | - | + |
41 | идентификатор | 42 | + | - | - | + |
42 | ~ | 47 | - | + | - | - |
43 | ; | 0 | + | - | + | + |
44 | ~ | 47 | - | + | - | - |
45 | ; | 0 | + | - | + | + |
46 | ; | 0 | + | - | + | + |
47 | ( | 49 | - | - | - | - |
48 | ~ | 80 | - | - | - | - |
49 | ( | 50 | + | - | - | + |
50 | ) | 0 | + | - | + | + |
51 | ~ | 52 | - | - | - | - |
52 | ~ | 72 | - | + | - | - |
53 | ~ | 82 | - | - | + | - |
54 | идентификатор | 55 | + | - | - | + |
55 | ~ | 56 | - | - | - | - |
56 | ( | 58 | - | - | - | - |
57 | ~ | 65 | - | - | - | - |
58 | ( | 59 | + | - | - | + |
59 | ) | 60 | + | - | - | + |
60 | { | 61 | + | - | - | + |
61 | ~ | 12 | - | + | - | - |
62 | return | 63 | + | - | - | + |
63 | литерал | 64 | + | - | - | + |
64 | ; | 81 | + | - | - | + |
65 | ~ | 66 | - | - | - | - |
66 | , | 68 | - | - | - | - |
67 | ; | 71 | - | - | - | + |
68 | , | 69 | + | - | - | + |
69 | идентификатор | 70 | + | - | - | + |
70 | ~ | 66 | - | - | - | - |
71 | ; | 0 | + | - | + | + |
72 | int | 76 | - | - | - | - |
73 | float | 77 | - | - | - | - |
74 | char | 78 | - | - | - | - |
75 | идентификатор | 79 | - | - | - | + |
76 | int | 0 | + | - | + | + |
77 | float | 0 | + | - | + | + |
78 | char | 0 | + | - | + | + |
79 | идентификатор | 0 | + | - | + | + |
80 | ~ | 0 | - | - | + | - |
81 | } | 0 | + | - | + | + |
82 | * | 84 | - | - | - | - |
83 | ~ | 85 | - | - | - | - |
84 | * | 0 | + | - | + | + |
85 | ~ | 0 | - | - | + | - |
Разработка программы
Классовая модель
Диаграмма прецедентов
Диаграмма классов
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.