Розробка транслятора в середовищі Java і С

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Введення

Тема, мета, актуальність роботи

Аналіз проектів, реалізованих на мовах програмування 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.

Інші символи: '<', '>', ':', ',',''','; ',' {», '}', '(",') '

Класи лексем

  • зарезервовані слова;

  • знаки операцій та роздільники;

  • літерали;

  • ідентифікатори

Лексика мов

  1. Клас ідентифікатори: до цього класу відносяться всі набори ланцюжків, крім зарезервованих слів

  2. Клас зарезервованих слів:

    1. Для C #

using, class, int, float, char, public, protected, private, return, namespace

    1. Для Java

using, class, int, float, char, public, protected, private, return

  1. Клас знаків операцій і роздільників:

() {}:; = ->. , '*

  1. Клас літералів:

Літерал - цілочисельна або текстова константа.

Структура таблиці ідентифікаторів

ім'я

номер у класі

тип




Структура таблиці літералів

ім'я

тип



Розробка синтаксичного аналізатора

Граматика мов

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

Граматика С #

1 <програма>: = 2 <предпроцессор> 3 namespace 4 {5 <оператори> 6}

7 <предпроцессор>: = 9 using 10 <предпроцессор>

8 <предпроцессор>: = 11 е

12 <оператори>: = 16 <клас> 17 <оператори>

13 <оператори>: = 18 ідентифікатор 19 <продолженіе1>

20 <оператори>

14 <оператори>: = 21 е

15 <оператори>: = 22 <декларація> 23 <оператори>

24 <клас>: = 25 class 26 ідентифікатор 27 <спадкування> 28 {29 <оператори> 30} 31;

32 <спадкування>: = 34: 35 ідентифікатор

33 <спадкування>: = 36Е

37 <продолженіе1>: = 40. 41 ідентифікатор 42 <продолженіе2> 43;

38 <продолженіе1>: = 44 <продолженіе2> 45;

39 <продолженіе1>: = 46;

47 <продолженіе2>: = 49 (50)

48 <продолженіе2>: = 80 е

51 <декларація>: = 52 <тип> 53 ідентифікатор 55 <продолженіе3>

56 <продолженіе3>: = 58 (59) 60 (61 <оператори> 62 return 63 літерал 64; 81)

57 <продолженіе3>: = 65 <продолженіе4>

66 <продолженіе4>: = 68, 69 ідентифікатор 70 <продолженіе4>

67 <продолженіе4>: = 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 <продолженіе1>

20 <оператори>

14 <оператори>: = 21 е

15 <оператори>: = 22 <декларація> 23 <оператори>

24 <клас>: = 25 class 26 ідентифікатор 27 <спадкування> 28 {29 <оператори> 30} 31;

32 <спадкування>: = 34: 35 ідентифікатор

33 <спадкування>: = 36Е

37 <продолженіе1>: = 40 -> 41 ідентифікатор 42 <продолженіе2> 43;

38 <продолженіе1>: = 44 <продолженіе2> 45;

39 <продолженіе1>: = 46;

47 <продолженіе2>: = 49 (50)

48 <продолженіе2>: = 80 е

51 <декларація>: = 52 <тип> 53 <посилання> 54 ідентифікатор 55 <продолженіе3>

56 <продолженіе3>: = 58 (59) 60 (61 <оператори> 62 return 63 літерал 64; 81)

57 <продолженіе3>: = 65 <продолженіе4>

66 <продолженіе4>: = 68, 69 ідентифікатор 70 <продолженіе4>

67 <продолженіе4>: = 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}

<Спадкування> = {: | {}

<Продолженіе1> = {. | (|;)

<Продолженіе2 >={(|;)

<Продолженіе3 >={(|, |;)

<Продолженіе4> = {, |;}

<Тип> = {int | float | char | ідентифікатор}

Граматика java

<Предпроцессор> = {using | class | ідентифікатор | int | float | char}

<Оператори> = {class | ідентифікатор | int | float | char}

<Спадкування> = {: | {}

<Продолженіе1 >={-> | (|;)

<Продолженіе2 >={(|;)

<Продолженіе3 >={(|, |;)

<Продолженіе4> = {, |;}

<Тип> = {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

-

-

+

-

Розробка програми

Класова модель

Діаграма прецедентів

Діаграма класів

Аналіз результатів роботи програми та висновки

Обидва аналізованих мови - об'єктно-орієнтовані, з синтаксисом, успадкованим від C + +, але значно переробленим. Отже, вони мають багато спільного, наприклад, при аналізі проектів, ми використовуємо один загальний клас роздільників і знаків операцій.

Класи зарезервованих слів для кожної мови відрізняються. У даному проекті досліджується лише мала частина можливостей і особливостей вищевказаних мов. У зв'язку з цим, класи зарезервованих слів для цих мов включатимуть лише ті ключові слова та оператори, які нам необхідні.

Проект дозволяє проаналізувати взаємодію між класами і вивести результат у файл *. xml. Досить багато часу було витрачено саме на висновок результату в *. xml, тому що раніше з подібними завданнями не стикалися.

При реалізації були виконані критерії ООП і модульності, розставлені коментарі (за атрибутами, методам, за параметрами методів, класами).

Проект може існувати як автономне застосування, однак, на мій погляд, його можна доповнити і доопрацювати функціонально, розширити класи зарезервованих слів, внести зміни до LL (1) - граматику і т.д.

На даному етапі розробки програма працює коректно, чітко виконує поставлені вимоги.

Список використаної літератури

  1. Р. Хантер Проектування і конструювання компіляторів

  2. http://www.linuxcenter.ru/lib/articles/programming

  3. Джеффрі Ріхтер CLR via C # / / М., Видавництво «Російська редакція», 2007

  4. http://javaportal.ru/

  5. Конспект лекцій з ТОПТ

Посилання (links):
  • http://www.linuxcenter.ru/lib/articles/programming
  • http://javaportal.ru/
    Додати в блог або на сайт

    Цей текст може містити помилки.

    Програмування, комп'ютери, інформатика і кібернетика | Курсова
    252кб. | скачати


    Схожі роботи:
    Розробка програми на Java
    Розробка Webпріложеній із застосуванням Java Servlet-технології
    Розробка Web додатків із застосуванням Java Servlet технології
    Розробка програм у середовищі програмування Turbo Pascal 70
    Розробка програм у середовищі програмування Turbo Pascal 7 0
    Розробка в середовищі Turbo Pascal програми сортування елементів рядків матриці
    JAVA технологія 2
    Java Управління ресурсами
    Вісім міфів про Java
  • © Усі права захищені
    написати до нас