C--. Перше знайомство

Процес портування і створення засобів розробки програм для KolibriOS триває. З найбільш активно використовуваних мов програмування ми публікуємо статті. Сьогодні ми починаємо розповідати про мову З--, навколо якого склалося активне співтовариство в 2000-і роки. Подробиці під катом.
Коротко про мову з офіційного сайту:
C-- — це мова програмування, що займає проміжне положення між ассемблером і Сі. Ідеально підходить для написання маленьких програм, резидентів (TSR), драйверів, обробників переривань. Для роботи з мовою C-- необхідно знайомство з ассемблером і Сі. Зараз З-- вміє генерувати 32-бітний код під DOS і Windows (прим. ред. а також під MenuetOS, KolibriOS).

Автором мови SPHINX C-- є Peter Cellik (CANADA). Остання авторська версія SPHINX C-- v0.203 від 28.Oct.96. На жаль автор відмовився від подальшого розвитку мови. Сам мову разом із вихідні текстами був оголошений сиротою і відданий нікому в нікуди. Тобто робіть що хочете. А чому б і не зробити? На цій сторінці Ви знайдете саму останню (але вже не авторську) версію самої мови, бібліотеки, приклади програм, опис мови та бібліотек в форматі Notron Guide і багато іншої корисної інформації по мові C--.
Після Пітера Селлика підтримкою займався Михайло Шекер, але він припинив розробку кілька років тому. Торік исходники були викладені на Github https://github.com/jossk/c--sphinx, але ми дізналися про це тільки у березні 2016 року.
Було вирішено розповісти про даному мовою з двох причин:
  1. На ньому написані кілька популярних програм KolibriOS, серед яких і Eolite — мабуть, самий використовуваний файловий менеджер.
  2. Відносно недавно компілятор мови був портований для KolibriOS (відповідь на питання про ліцензії можна знайти на тут).
Трохи про процесі портування від GerdtR:
Отже. Спочатку я переробив код під gcc. Исходники просто були написані для Watcom C, ну і нехай не значна, але несумісність була. Виправив кілька назв змінних(extern в ваткоме можна, мабуть), і позначення 64битных чисел по іншому. Потім вже Leency виявив, що gcc-версія зовсім не шукає файли в поточній папці, в папці з самим экзешником. Коли і це виправив залишилося найскладніше: порт для Колібрі. Ну так як під С я в КОС не писав, то була стандартна проблема — з ким линковать, та які инклудники брати. Вибір не широкий, menuetlibc відпав відразу, як я, покопавшись в исходниках, побачив ще старі функції звернення до файлів(ф56 зразок). Коротше menuetlibc сильно застарів, залишився newlib. Довго розбирався, як все-таки на виході отримати kex, а не PE, допоміг один Makefile, де писалася додатково обробка objcopy. Ну а далі вже дописування функцій, яких немає в newlib(наприклад stat не було, в port.c лежить його реалізація). Ну і пара функцій перетворення кодувань ANSI->ASCII, а точніше заглушок, бо як російських букв все одно в рядках компілятора немає. Ну і останньою проблемою було, так і частково залишилося ось це: newlib(швидше за все, більше нікому) поточний каталог встановлюється як шлях до самого смм(а зазвичай /rd/1), бо виявляється, що дізнатися, де лежить ісходник компілятор не може, хоч звідки його запускай. Вихід на даний момент — копіювати компілятор в папку з исходниками, або вказувати абсолютний шлях. До речі, раніше символ '/' вважався початком параметра і абсолютний шлях вказати було не можливо, зараз можна. Але з абсолютним шляхом поки не впевнений, що инклудники знаходити буде. Поки що не хочеться з цим возитися, та й можна просто написати -IP="/hd1/1/my_source". В теорії має працювати, на практиці ніхто не питав. До речі… вказати в форумі чи що, що параметри через '-' вказувати тепер… І при запуску без параметрів, в тій таблиці поправити, а то деяка плутанина виходить. Гаразд, потім як-небудь. Ну ось загалом, вся історія. Найскладніше було — це розібратися, звідки брати либы :) Сам код досить нескладний, не в супер порядку, але особливо копирсатися в коді не довелося
Керівництво по мові знаходиться за адресою http://www.c--sphinx.narod.ru/c--doc.htm. Розглянемо приклад простої програми для KolibriOS:
#define MEMSIZE 4096*10

#include "../lib/io.h"
#include "../lib/gui.h"

void main()
{
word id;
dword file;
io.dir.load(0,DIR_ONLYREAL);
loop() switch(WaitEvent())
{
case evButton:
id=GetButtonID(); 
if (id==1) ExitProcess();
break;

case evKey:
GetKeys();
if (key_scancode == SCAN_CODE_ESC ) ExitProcess();
break;

case evReDraw:
draw_window();
break;
}
}
void draw_window()
{
proc_info Form;
int i;
DefineAndDrawWindow(215,100,350,300,0x34,0xFFFFFF,"Window header");
GetProcessInfo(#Form, SelfInfo);
for (i=0; i<io.dir.count; i++)
{
WriteText(5,i*8+3,0x80,0xFF00FF,io.dir.position(i));
}
DrawCaptButton(100, 10, 100, 22, 22, 0xCCCccc, 0x000000, "Button");
WriteText(100,50,0x80,0,"Textline small");
WriteText(100,70,0x90,0,"Textline big");
DrawBar(100, 110, 100, 100, 0x66AF86);
}


Як бачите, цей код майже не відрізняється від коду на Сі, але при цьому є можливість писати спокійно в майже ассемблерном стилі, аналогічно написання обгорток для системних функцій. Наприклад, функція створення вікна:
void DefineAndDrawWindow(dword x, y, size_w, size_h, byte WindowType,dword WindowAreaColor, EDI, ESI)
{
EAX = 12; 
EBX = 1;
$int 0x40

$xor EAX,EAX
EBX = x << 16 + size_w;
ECX = y << 16 + size_h;

EDX = WindowType << 24 | WindowAreaColor;
$int 0x40

EAX = 12; 
EBX = 2;
$int 0x40
}

Чому ж він привабливий для розробників ПЗ для KolibriOS? По-перше тим, що почати писати на ньому дуже легко. Це був єдиний мову, не рахуючи FASM, на якому можна було просто почати писати, не заморочуючись з налаштуванням крос-компіляції (зараз в цій справі Сі вже набирає обороти). По-друге, для C-- було написано безліч бібліотек і різних обгорток над системними функціями. Серед них власний набір елементів інтерфейсу і навіть непогані шрифти:


Ви напевно запитаєте: якщо все так чудово, то в чому ж проблема? Чому він не застосовується повсюдно, хоча б у рамках проекту KolibriOS?
Відповідь наступний. Незважаючи на перевагу в простоті освоєння, при його використанні спливають і недоліки:
  • погана оптимізація результуючого коду;
  • практично відсутні пріоритети операцій (C-- всі вважає зліва направо, т. е. 2+2*2=8, а не 6);
  • найголовніше, хоч він і схожий на Сі, але це інша мова програмування зі своєю сферою застосування. В рамках KolibriOS він найбільш підходить для створення програм з графічним інтерфейсом і майже не використовується в системному програмуванні.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.