Автор: Пользователь скрыл имя, 26 Октября 2011 в 22:24, курсовая работа
Ознайомлення з програмним забезпеченням для перекладу початкового коду з одних мов програмування на інші.
Розглянуто відповідні засоби для ОС Windows та Linux.
Завдання на курсову роботу 3
Теоретична частина 4
Практична частина 6
3.1 Конвертери мов програмування для ОС Linux 6
3.1.1 Програма OpenCobol 6
3.1.1 Програма F2C 13
3.2 Конвертери мов програмування для ОС Windows 15
3.2.1 Програма BCX 15
Висновки 22
Список використаної літератури
Міністерство освіти і науки України
Національний авіаційний університет
Факультет
комп'ютерних систем
Курсова робота
з системного
програмного забезпечення
Пояснювальна
записка
Тема: Програмне забезпечення
для перекладу початкового коду з одних
мов програмування на інші.
Виконала:
студентка ФКС - 307
Бундзяк
Олександра
Прийняв:
Глазок О.М.
Київ
– 2009
Зміст
3.1 Конвертери мов програмування для ОС Linux 6
3.1.1 Програма OpenCobol 6
3.1.1 Програма F2C 13
3.2 Конвертери мов програмування для ОС Windows 15
3.2.1 Програма BCX 15
1. Завдання на курсову
роботу
Ознайомитись з програмним забезпеченням для перекладу початкового коду з одних мов програмування на інші.
Розглянути відповідні засоби для ОС Windows та Linux.
2. Теоретична частина
Програмне забезпечення для перекладу початкового коду з одних мов програмування на інші часто називають конвертерами програмного коду. Ці утиліти почали розроблятися порівняно недавно, з переходом на більш сучасні мови програмування. Багато старалися переписати рядки, написані на Коболі, PL/I і інших мовах програмування, але не багатьом це вдавалося. Мовні перетворення викликають багато трудностей. Тому багато програмістів й до тепер продовжили використовувати ці мови, інші -- почали розробку автоматизованих мовних конвертерів.
Багато фірм-розробників ставили перед собою ціль «розробити конвертери, які б працювали в режимі простого майстра, і з якими могла б працювати люба секретарка», але це виявилося зовсім не легко.
На
сьогодні вже існує велике різноманіття
таких утиліт-конвертерів, але досконалих
майже не існує. Постановка завдання для
мовних перетворень дуже проста: перевести
дану систему на іншу мову програмування,
залишивши незмінним її зовнішню поведінку.
Зазвичай, легкість формулювання проблеми
перекладу залежить від наявності в цільовій
мові відповідних вбудованих мовних конструкцій.
Наприклад, якщо необхідно вибрати один
з варіантів в залежності від якоїсь умови,
то мова, що підтримує умовні пропозиції,
буде найбільш зручною. Якщо ж доведеться
використовувати мову, в якій конструкція
if-then-else відсутня, її доведеться емулювати.
Подібні фрагменти коду називають емульованими
мовними конструкціями. Наприклад, можна
емулювати об'єкти в мові, що не має підтримки
об'єктної орієнтації. Проблема мовних
перетворень зводиться до відображення
вбудованих і емульованих конструкцій
вихідної мови у вбудовані (по можливості)
конструкції цільової мови. Існує як мінімум
шість різних категорій подібного відображення;
вони продемонстровані на рис. 1.
Рис.1
Відображення мовних
конструкцій
При
конвертуванні складних програм
виникає багато труднощів. Тексти згенерованих
програм повинні бути добре структуровані,
містити мінімум глобальних даних
і т.п. На жаль, дуже мало вихідних програми
задовольняють таким вимогам, і тому будь-яке
осмислене перетворення мов має починатися
з всебічної реструктуризації, - незважаючи
на всі проблеми, що виникають при використанні
класичних засобів реструктуризації.
Реструктуризація вихідної програми виконується з метою зменшення числа проблематичних перетворень.
У
переважній більшості перетворень
реструктуризація є обов'язковим
попереднім етапом для того, що ми називаємо
заміною синтаксису. На цьому кроці синтаксис
спеціально підготовленого і реструктуризованого
початкового тексту замінюється на цільовий
синтаксис. Це відносно нескладний крок.
Перетворені програми зазвичай виглядають
потворно, тому необхідна ще одна реструктуризація
(тепер уже в термінах цільового тексту),
щоб максимально наблизити отриманий
код до цільового мови.
На
сьогодні вже існує велике різноманіття
таких утиліт-конвертерів, але досконалих
майже не існує.
3. Практична
частина
Розглянемо
роботу конвертерів мов програмування
на прикладі програми BCX (перетворення програмного
коду з мови програмування Basic на мову
C) для операційної системи Windows та програм f2cpp
(fortran to C++) та Open-cobol (компілятор для мови програмування
Cobol та конвертер з мови Cobol на мову C) для
ОС Linux.
3.1
Конвертери мов програмування
для ОС Linux
3.1.1 Програма OpenСobol
OpenCOBOL
є відкритим вихідним COBOL компілятор.
OpenCOBOL реалізує значну частину COBOL 85 і COBOL
2002 стандартів, а також багато розширень
існуючих компіляторів COBOL.
Також,
OpenCOBOL перекладає COBOL в С і компілює перекладений
код за допомогою власного компілятора
C. Ми можете працювати з цією програмою
на різних платформах, включаючи Unix / Linux,
Mac OS X і Microsoft Windows.
Для
ознайомлення з програмою, я встановила
пакет Open-cobol-1.1.0 на Ubuntu 8 – дистрибутиві
ОС Linux.
Ознайомлення я почала з написаної простої програми на мові Cobol (рис. 2), яку я зберегла у файлі під назвою Hello.cob:
Рис. 2
Код програми на мові Cobol
Для перевірки її роботи, за допомогою командного рядка і команди cobc –x hello.cob створимо виконувану програму hello і запустимо її на виконання з допомогою команди ./hello. В результаті отримаємо: Hello World! (рис. 3)
Рис.
3 Результат виконання
команд
cobc –x hello.cob та ./hello
Для перекладу коду програми Hello, написаного на мові Cobol в мову програмування C використаємо команду cobc –C hello.cob . В директорії, де знаходився файл hello.cob з’явилося ще три файли hello.c, hello.c.h та hello.c.l.h .
Відкривши
файл hello.c ми вже побачили програмний
код, написаний на мові C. І зразу замітили
різницю між кодом, написаним вручну і
кодом, перекладеним автоматично мовним
конвертером. Об’єм коду є значно більшим.
/* Generated by cobc 1.1.0 */
/* Generated from hello.cob */
/* Generated at Дек 17 2009 02:22:57 EET */
/* OpenCOBOL build date Dec 13 2009 20:50:05 */
/* OpenCOBOL package date Feb 06 2009 10:30:55 CET */
/* Compile command
cobc -C hello.cob */
#define __USE_STRING_INLINES 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <libcob.h>
#define COB_SOURCE_FILE "hello.cob"
#define COB_PACKAGE_VERSION "1.1"
#define COB_PATCH_LEVEL 0
/* Global variables */
#include "hello.c.h"
/* Function prototypes */
int HELLO (void);
static int HELLO_ (const int);
/* Functions */
int
HELLO ()
{
return HELLO_ (0);
}
static int
HELLO_ (const int entry)
{
/* Local variables */
#include "hello.c.l.h"
static int initialized = 0;
static cob_field *cob_user_parameters[COB_MAX_
static struct cob_module
module = { NULL, NULL, NULL, NULL, cob_user_parameters, 0, '.', '$',
',', 1, 1, 1, 0 };
/* Start of function
code */
/* CANCEL callback handling */
if (unlikely(entry < 0)) {
if (!initialized) {
return 0;
}
initialized = 0;
return 0;
}
/* Initialize frame stack */
frame_ptr = &frame_stack[0];
frame_ptr->perform_through
= 0;
/* Push module stack */
module.next = cob_current_module;
cob_current_module =
&module;
/* Initialize program */
if (unlikely(initialized == 0))
{
if (!cob_initialized) {
cob_fatal_error (COB_FERROR_INITIALIZED);
}
cob_check_version (COB_SOURCE_FILE, COB_PACKAGE_VERSION, COB_PATCH_LEVEL);
if (module.next)
cob_set_cancel ((const char *)"HELLO", (void *)HELLO, (void *)HELLO_);
(*(int *) (b_1)) = 0;
initialized = 1;
}
cob_save_call_params
= cob_call_params;
/* Entry dispatch */
goto l_2;
/* PROCEDURE DIVISION */
/* Entry HELLO */
l_2:;
/* MAIN SECTION */
/* MAIN PARAGRAPH */
/* hello.cob:7: DISPLAY */
{
cob_display (0, 1, 1, &c_1);
}
/* hello.cob:8: GOBACK */
{
goto exit_program;
}
/* Program exit */
exit_program:
/* Pop module stack */
cob_current_module =
cob_current_module->next;
/* Program return */
return (*(int *) (b_1));
}
/* End functions */
Вмістиме файла
hello.c.h:
/* Generated by cobc 1.1.0 */
/* Generated from hello.cob */
/* Generated at Дек 17 2009 02:22:57 EET */
/* OpenCOBOL build date Dec 13 2009 20:50:05 */
/* OpenCOBOL package date Feb 06 2009 10:30:55 CET */
/* Compile command
cobc -C hello.cob */
/* Frame stack declaration */
struct cob_frame {
int perform_through;
void *return_address;
};
/* Union for CALL statement */
union cob_call_union {
void *(*funcptr)();
int (*funcint)();
void *func_void;
};
union cob_call_union cob_unifunc;
/* Storage */
/* PROGRAM-ID : HELLO */
static unsigned char b_1[4]
__attribute__((aligned)); /* RETURN-CODE */
/* End of storage */
/* Attributes */
static const cob_field_attr a_1 = {33, 0, 0, 0, NULL};
/* Constants */
static cob_field c_1 = {12,
(unsigned char *)"Hello World!", &a_1};