Неоднократно упоминал, что инструмент разработки - надстройка над классическим С++... Вот решил показать на простом примере - нашел мелкую программу для теста влияния функции "паузы" на остальные работающие приложения.
1. Исходный код с комментариями.
2. Всё, как бы написано на презренном ЯП xBase, однако команды xBase типа @ 0,0 SAY или WAIT - это просто инструкции предпроцессора и как показывал выше данными инструкциями легко описать все конструкции ЯП 1С:Предприятие или Pascal, т.е. программа может писаться на "любимом" ЯП... Только нужно создать схему языка.
При анализе синтаксиса компилятором Harbour исходная программа преобразуется в так называемый p-code:
и уже его анализирует компилятор. Увидеть данный код можно установив ключ компиляции -p. Покажу его - команды xBase преобразовались в набор процедур, функций ЯП и удалены комментарии:
3. При отсутствии ошибок компиляции исходный код на ЯП Harbour преобразуется в исходный код на классическом C++, но указывается для компилятора С++ какого производителя он создан. Как правило дистрибутив системы разработки Harbour поставляется на одного из 5-10 компиляторов С++. Я использую Borland C++ 5.0 как наиболее совместимый с любой версией Windows, начиная от Windows 95. Что получается после работы компилятора Harbour:
Код:
/*
* xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 6633)
* Generated C source code from <pinkey.PRG>
* Command: pinkey.PRG -gc
* Created: 2023.01.20 11:35:19 (Borland C++ 5.5.1 (32 bit))
*/
#include "hbvmpub.h"
#include "hbpcode.h"
#include "hbinit.h"
#define __PRG_SOURCE__ "pinkey.PRG"
HB_FUNC( PINKEY );
HB_FUNC( MAIN );
HB_FUNC_EXTERN( INKEY );
HB_FUNC_EXTERN( DEVPOS );
HB_FUNC_EXTERN( DEVOUT );
HB_FUNC_EXTERN( SCROLL );
HB_FUNC_EXTERN( SETPOS );
HB_FUNC_EXTERN( __WAIT );
HB_FUNC_EXTERN( STR );
#undef HB_PRG_PCODE_VER
#define HB_PRG_PCODE_VER 10
#include "hbapi.h"
HB_INIT_SYMBOLS_BEGIN( hb_vm_SymbolInit_PINKEY )
{ "PINKEY", {HB_FS_PUBLIC | HB_FS_LOCAL | HB_FS_FIRST}, {HB_FUNCNAME( PINKEY )}, &ModuleFakeDyn },
{ "MAIN", {HB_FS_PUBLIC | HB_FS_LOCAL}, {HB_FUNCNAME( MAIN )}, &ModuleFakeDyn },
{ "INKEY", {HB_FS_PUBLIC}, {HB_FUNCNAME( INKEY )}, NULL },
{ "DEVPOS", {HB_FS_PUBLIC}, {HB_FUNCNAME( DEVPOS )}, NULL },
{ "DEVOUT", {HB_FS_PUBLIC}, {HB_FUNCNAME( DEVOUT )}, NULL },
{ "SCROLL", {HB_FS_PUBLIC}, {HB_FUNCNAME( SCROLL )}, NULL },
{ "SETPOS", {HB_FS_PUBLIC}, {HB_FUNCNAME( SETPOS )}, NULL },
{ "__WAIT", {HB_FS_PUBLIC}, {HB_FUNCNAME( __WAIT )}, NULL },
{ "STR", {HB_FS_PUBLIC}, {HB_FUNCNAME( STR )}, NULL }
HB_INIT_SYMBOLS_END( hb_vm_SymbolInit_PINKEY )
#if defined(__ICL)
#pragma warning(disable:177)
#endif
#if defined( HB_PRAGMA_STARTUP )
#pragma startup hb_vm_SymbolInit_PINKEY
#elif defined( HB_DATASEG_STARTUP )
#define HB_DATASEG_BODY HB_DATASEG_FUNC( hb_vm_SymbolInit_PINKEY )
#include "hbiniseg.h"
#endif
HB_FUNC( PINKEY )
{
static const BYTE pcode[] =
{
/* 00000 */ HB_P_BASELINE, 1, 0, /* 1 */
HB_P_ENDPROC
/* 00004 */
};
hb_vmExecute( pcode, symbols );
}
HB_FUNC( MAIN )
{
static const BYTE pcode[] =
{
HB_P_FRAME, 1, 0, /* locals, params */
/* 00003 */ HB_P_BASELINE, 5, 0, /* 5 */
HB_P_LOCALNEARSETINT, 1, 0, 0, /* NCOUNT 0*/
/* 00010 */ HB_P_LINEOFFSET, 1, /* 6 */
HB_P_PUSHSYMNEAR, 2, /* INKEY */
HB_P_PUSHNIL,
HB_P_ONE,
HB_P_DOSHORT, 1,
/* 00018 */ HB_P_LINEOFFSET, 3, /* 8 */
HB_P_PUSHSYMNEAR, 3, /* DEVPOS */
HB_P_PUSHNIL,
HB_P_ZERO,
HB_P_ZERO,
HB_P_DOSHORT, 2,
HB_P_PUSHSYMNEAR, 4, /* DEVOUT */
HB_P_PUSHNIL,
HB_P_PUSHSTRSHORT, 45, /* 45 */
141, 160, 166, 172, 168, 226, 165, ' ', 170, 171, 160, 162, 168, 233, 227, ' ', 'E', 's', 'c', ' ', 164, 171, 239, ' ', 167, 160, 162, 165, 224, 233, 165, 173, 168, 239, ' ', 175, 224, 174, 163, 224, 160, 172, 172, 235, 0,
HB_P_DOSHORT, 1,
/* 00079 */ HB_P_LINEOFFSET, 4, /* 9 */
HB_P_PUSHSYMNEAR, 2, /* INKEY */
HB_P_PUSHNIL,
HB_P_PUSHBYTE, 10, /* 10 */
HB_P_FUNCTIONSHORT, 1,
HB_P_PUSHBYTE, 27, /* 27 */
HB_P_NOTEQUAL,
HB_P_JUMPFALSENEAR, 8, /* 8 (abs: 00099) */
/* 00093 */ HB_P_LINEOFFSET, 5, /* 10 */
HB_P_LOCALNEARINC, 1, /* NCOUNT */
HB_P_JUMPNEAR, 238, /* -18 (abs: 00079) */
/* 00099 */ HB_P_LINEOFFSET, 7, /* 12 */
HB_P_PUSHSYMNEAR, 5, /* SCROLL */
HB_P_PUSHNIL,
HB_P_DOSHORT, 0,
HB_P_PUSHSYMNEAR, 6, /* SETPOS */
HB_P_PUSHNIL,
HB_P_ZERO,
HB_P_ZERO,
HB_P_DOSHORT, 2,
/* 00113 */ HB_P_LINEOFFSET, 8, /* 13 */
HB_P_PUSHSYMNEAR, 7, /* __WAIT */
HB_P_PUSHNIL,
HB_P_PUSHSTRSHORT, 9, /* 9 */
145, 164, 165, 171, 160, 173, 174, ' ', 0,
HB_P_PUSHSYMNEAR, 8, /* STR */
HB_P_PUSHNIL,
HB_P_PUSHLOCALNEAR, 1, /* NCOUNT */
HB_P_PUSHBYTE, 4, /* 4 */
HB_P_FUNCTIONSHORT, 2,
HB_P_PLUS,
HB_P_PUSHSTRSHORT, 7, /* 7 */
' ', 232, 160, 163, 174, 162, 0,
HB_P_PLUS,
HB_P_DOSHORT, 1,
/* 00151 */ HB_P_LINEOFFSET, 9, /* 14 */
HB_P_ENDPROC
/* 00154 */
};
hb_vmExecute( pcode, symbols );
}
... Понятно, что данный С++ код могу в дальнейшем как угодно использовать и дорабатывать, но не настолько хорошо, а точнее вообще не знаю C?