Возможные будущие компиляторы для Колибри

...
  • Последний SDK на официальном сайте, я думаю, что именно он у тебя и есть.
    Вот kolibri.h, которым я пользуюсь (не знаю, кто его написал, но так как он используется в Shell, то наверное Albom). Работает с gcc и msvc.

    Code: Select all

    
    
    #define NULL ((void*)0)
    
    
    
    typedef struct 
    
    {
    
    unsigned	p00 __attribute__((packed));
    
    unsigned	p04 __attribute__((packed));
    
    unsigned	p08 __attribute__((packed));
    
    unsigned	p12 __attribute__((packed));
    
    unsigned	p16 __attribute__((packed));
    
    char		p20 __attribute__((packed));
    
    char		*p21 __attribute__((packed));
    
    } kol_struct70 __attribute__((packed));
    
    
    
    
    
    typedef struct
    
    {
    
    unsigned	p00 __attribute__((packed));
    
    char		p04 __attribute__((packed));
    
    char		p05[3] __attribute__((packed));
    
    unsigned	p08 __attribute__((packed));
    
    unsigned	p12 __attribute__((packed));
    
    unsigned	p16 __attribute__((packed));
    
    unsigned	p20 __attribute__((packed));
    
    unsigned	p24 __attribute__((packed));
    
    unsigned	p28 __attribute__((packed));
    
    unsigned	p32[2] __attribute__((packed));
    
    unsigned	p40 __attribute__((packed));
    
    } kol_struct_BDVK __attribute__((packed));
    
    
    
    typedef struct
    
    {
    
    char	*name __attribute__((packed));
    
    void	*data __attribute__((packed));
    
    } kol_struct_import __attribute__((packed));
    
    
    
    
    
    void kol_exit();
    
    void kol_sleep(unsigned d);
    
    void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c);
    
    void kol_wnd_move(unsigned x, unsigned y);
    
    void kol_wnd_caption(char *s);
    
    void kol_event_mask(unsigned e);
    
    unsigned kol_event_wait();
    
    unsigned kol_event_wait_time(unsigned time);
    
    unsigned kol_event_check();
    
    void kol_paint_start();
    
    void kol_paint_end();
    
    void kol_paint_pixel(unsigned x, unsigned y, unsigned c);
    
    void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c);
    
    void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c);
    
    void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c);
    
    void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d);
    
    void kol_paint_image_pal(unsigned x, unsigned y, unsigned w, unsigned h, char *d, unsigned *palette);
    
    unsigned kol_key_get();
    
    unsigned kol_key_control();
    
    void kol_key_lang_set(unsigned lang);
    
    unsigned kol_key_lang_get();
    
    void kol_key_mode_set(unsigned mode);
    
    unsigned kol_key_mode_get();
    
    void kol_btn_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned d, unsigned c);
    
    unsigned kol_btn_get();
    
    void kol_btn_type(unsigned t);
    
    unsigned kol_mouse_pos();
    
    unsigned kol_mouse_posw();
    
    unsigned kol_mouse_btn();
    
    void kol_board_putc(char c);
    
    void kol_board_puts(char *s);
    
    void kol_board_puti(int n);
    
    int kol_file_70(kol_struct70 *k);
    
    kol_struct_import* kol_cofflib_load(char *name);
    
    void* kol_cofflib_procload (kol_struct_import *imp, char *name);
    
    unsigned kol_cofflib_procnum (kol_struct_import *imp);
    
    void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n);
    
    unsigned kol_system_end(unsigned param);
    
    unsigned kol_system_cpufreq();
    
    unsigned kol_system_mem();
    
    unsigned kol_system_memfree();
    
    unsigned kol_system_time_get();
    
    unsigned kol_system_date_get();
    
    void kol_path_file2dir(char *dir, char *fname);
    
    void kol_path_full(char *full, char *fname);
    
    void kol_screen_wait_rr();
    
    void kol_screen_get_size(unsigned *w, unsigned *h);
    
    unsigned kol_skin_height();
    
    unsigned kol_thread_start(unsigned start, unsigned stack);
    
    unsigned kol_time_tick();
    
    unsigned kol_sound_speaker(char data[]);
    
    unsigned kol_process_info(unsigned slot, char buf1k[]);
    
    int kol_process_kill_pid(unsigned process);
    
    
    Вот menuet/os.h (кроме os.h есть еще console.h, gui.h, net.h, sem.h, thread.h и другие):

    Code: Select all

    #ifndef __GLIBC__MENUET_OS_H
    #define __GLIBC__MENUET_OS_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    typedef unsigned char       __u8;
    typedef unsigned short      __u16;
    typedef unsigned long       __u32;
    
    #pragma pack(push,1)
    
    void __menuet__define_window(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,
         __u32 body_color,__u32 grab_color,__u32 frame_color);
    void __menuet__window_redraw(int status);
    void __menuet__putpixel(__u32 x,__u32 y,__u32 color);
    int __menuet__getkey(void);
    __u32 __menuet__getsystemclock(void);
    void __menuet__write_text(__u16 x,__u16 y,__u32 color,char * text,int len);
    void __menuet__delay100(int m);
    __u32 __menuet__open(char * name,char * data);
    void __menuet__save(char * name,char * data,__u32 count);
    void __menuet__putimage(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,char * image);
    void __menuet__make_button(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,
                               int id,__u32 color);
    int __menuet__get_button_id(void);
    int __menuet__wait_for_event(void);
    int __menuet__check_for_event(void);
    void __menuet__bar(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,__u32 color);
    void __menuet__sys_exit(void);
    void * __menuet__exec_thread(void (* func_ptr)(void),__u32 stack_size,int * retp);
    void __menuet__idle(void);
    
    void __menuet__exec_ramdisk(char * filename,char * args,...);
    void __menuet__exec_hd(char * filename,char * args,...);
    
    struct process_table_entry
    {
     __u32 cpu_usage;
     __u16 pos_in_windowing_stack;
     __u16 win_stack_val_at_ecx;
     __u16 reserved1;
     char name[12];
     __u32 memstart;
     __u32 memused;
     __u32 pid;
     __u32 winx_start,winy_start;
     __u32 winx_size,winy_size;
     __u16 thread_state;
     __u16 reserved2;
     __u32 client_left,client_top,client_width,client_height;
     __u8 window_state;
     __u8 reserved3[1024-71];
    };
    
    #define PID_WHOAMI		(-1)
    
    int __menuet__get_process_table(struct process_table_entry * proctab,int pid);
    void __menuet__get_screen_max(__u16 * x,__u16 * y);
    
    #define BTYPE_TILE                  1
    #define BTYPE_STRETCH               2
    
    void __menuet__set_background_size(__u32 xsz,__u32 ysz);
    void __menuet__write_background_mem(__u32 pos,__u32 color);
    void __menuet__draw_background(void);
    void __menuet__set_background_draw_type(int type);
    void __menuet__background_blockmove(char * src_ptr,__u32 bgr_dst,__u32 count);
    
    void __menuet__reset_mpu401(void);
    void __menuet__write_mpu401(__u8 d);
    
    __u32 __menuet__get_date(void);
    
    void __menuet__line(__u16 x1,__u16 y1,__u16 x2,__u16 y2,__u32 color);
    
    void __menuet__set_bitfield_for_wanted_events(__u16 ev);
    
    #define EVENT_REDRAW              0x00000001
    #define EVENT_KEY                 0x00000002
    #define EVENT_BUTTON              0x00000004
    #define EVENT_END_REQUEST         0x00000008
    #define EVENT_DESKTOP_BACK_DRAW   0x00000010
    #define EVENT_MOUSE_CHANGE        0x00000020
    #define EVENT_IPC		  0x00000040
    #define EVENT_GET_IRQS_MASK       0xFFFF0000
    #define EVENT_GET_IRQ(e)          (((e)>>16)&0xFFFF)
    
    __u32 __menuet__get_irq_owner(__u32 irq);
    int __menuet__get_data_read_by_irq(__u32 irq,__u32 * num_bytes_in_buf,__u8 * data);
    int __menuet__send_data_to_device(__u16 port,__u8 val);
    void __menuet__program_irq(void * intr_table,__u32 irq_num);
    int __menuet__reserve_irq(int irqno);
    int __menuet__free_irq(int irqno);
    int __menuet__reserve_port_area(__u32 start,__u32 end);
    int __menuet__free_port_area(__u32 start,__u32 end);
    
    
    #define NAME_LEN                   512
    
    #define STC_READ                  0
    #define STC_WRITE                 1
    #define STC_APPEND                2
    
    struct systree_info
    {
    	__u32 command;
    	__u32 file_offset_low;
    	__u32 file_offset_high;
    	__u32 size;
    	__u32 data_pointer;
    	char _zero;
    	const char* nameptr;
    };
    
    struct systree_info2
    {
    	__u32 command;
    	__u32 file_offset_low;
    	__u32 file_offset_high;
    	__u32 size;
    	__u32 data_pointer;
    	char name[NAME_LEN];
    };
    
    struct bdfe_time
    {
    	__u8 seconds;
    	__u8 minutes;
    	__u8 hours;
    	__u8 reserved;
    };
    struct bdfe_date
    {
    	__u8 day;
    	__u8 month;
    	__u16 year;
    };
    struct bdfe_item
    {
    	__u32 attr;
    	__u8 nametype;
    	__u8 reserved[3];
    	struct bdfe_time ctime;
    	struct bdfe_date cdate;
    	struct bdfe_time atime;
    	struct bdfe_date adate;
    	struct bdfe_time mtime;
    	struct bdfe_date mdate;
    	__u32 filesize_low;
    	__u32 filesize_high;
    };
    
    int __kolibri__system_tree_access(struct systree_info * info);
    int __kolibri__system_tree_access2(struct systree_info2 * info);
    
    int __fslayer_open(char * name,int flags);
    int __fslayer_close(int fd);
    int __fslayer_lseek(int fd,int pos,int seek_type);
    int __fslayer_tell(int fd);
    int __fslayer_read(int fd,void * buffer,__u32 count);
    int __fslayer_write(int fd,void * buffer,__u32 count);
    
    typedef struct
    {
     __u8 lock;
     __u8 resvd[3];
     __u32 ptr_to_fmsg_pos;
     /* Below is for message */
     __u32 sender_pid;
     __u32 msg_length;
    } msgrcva_t /*__attribute__((packed))*/;
    
    void send_message(int pid,void * msg_ptr,int message_size);
    void define_receive_area(msgrcva_t * rcva_ptr,int size);
    
    void __menuet__sound_load_block(char * blockptr);
    void __menuet__sound_play_block(void);
    
    void __menuet__dga_get_caps(int * xres,int * yres,int * bpp,int * bpscan);
    
    void get_pci_version(__u8 * major,__u8 * minor);
    void pci_get_last_bus(__u8 * last_bus);
    void get_pci_access_mechanism(__u8 * mechanism);
    
    void pci_write_config_byte(__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u8 val);
    void pci_write_config_word(__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u16 val);
    void pci_write_config_dword(__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u32 val);
    __u8 pci_read_config_byte(__u8 bus,__u8 dev,__u8 fn,__u8 reg);
    __u16 pci_read_config_word(__u8 bus,__u8 dev,__u8 fn,__u8 reg);
    __u32 pci_read_config_dword(__u8 bus,__u8 dev,__u8 fn,__u8 reg);
    
    typedef struct{
    	char* name;
    	void* pointer;
    } IMP_ENTRY;
    typedef const IMP_ENTRY* IMP_TABLE;
    IMP_TABLE __kolibri__cofflib_load(const char*);
    __u32 __kolibri__cofflib_getproc(IMP_TABLE, const char*);
    //int __kolibri__cofflib_link(FUNC*, IMP_TABLE);
    
    static __inline__ void __menuet__debug_out_byte(const char ch){
        __asm__ __volatile__ ("int $0x40"::"a"(63L),"b"(1L),"c"((__u8)ch));
    }
    void __menuet__debug_out(const char* str);
    
    #define TIME_GETH(x)	((x)&0x000000FF)
    #define TIME_GETM(x)	((((x)&0x00FF00)>>8)&0xFF)
    #define TIME_GETS(x)	((((x)&0xFF0000)>>16)&0xFF)
    
    #pragma pack(pop)
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    
    Ссылка на kolibri.h-- проскакивала в теме Flood-it. На websvn в папке /programs/develop/ktcc есть версия kolibri.h для ktcc.
  • Ой, а можно не сдержаться? Это же просто жесть!

    То есть, получается, что каждый программист создаёт себе SDK сам, под свой компилятор? А где же ваш "комитет по стандартам"? Тогда да, разработка на ЯВУ под Колибри кагбэ не существует. :-(
  • Это просто обёртки системных функций. И каждый может их называть по-своему. С точки зрения кода - это всего лишь наборы меток, после которых идёт разбор параметров (в зависимости от способа передачи), выполнение определённых действий, подготовка результата (обычно в регистре eax), корректировка стека (если таковая требуется) и возвращение на адрес, следующий за командой вызова процедуры. Свой вариант обёрток я написал за выходные. Кстати, исходники библиотеки раньше не выкладывал - только заголовочные файлы. И diamond написал свой вариант (с теми же названиями функций, но ассемблерные вставки в стиле Intel, а не AT&T, как у меня).
  • На самом деле ничего жестокого нет, мне кажется. В Windows пользователь может работать с winapi через классические подключаемые файлы или писать свои обертки. При программировании для Колибри для функций системы (исключительно функций системы, а не стандартных библиотек!!!) тоже можно использовать свои обертки (см. выше) или устоявшийся способ вызова функций (inline-ассемблер). Строго говоря, это необязательно. Большая часть моих портов не использует ни menuet/os.h, ни kolibri.h вообще. Ничего, кроме libc и console.c (для работы с console.obj - getch, printf).
  • Хорошо, задам вопрос напрямик: Колибри думает становиться полноценной платформой? Самобытной, да. Но при этом платформой -- самодостаточным основанием, на которое можно опереться.

    Грубо говоря, вы воспринимаете все эти libc и прочие как данность, и механически их воспроизводите. Я же предлагаю сделать нечто вроде Kolibri API, не базирующийся ни на чём, кроме Колибри. Для большинства языков программирования от системы требуется лишь malloc/free, и всё. Процедуры API могут быть любыми.

    Да, в школе и ВУЗе учат, что printf непременно должен выводить на консоль. И что? Кровь из носу, но чёрное окошко обязательно?
  • Т.е. ты предлагаешь сделать некую kolibri.obj для программ на ЯВУ, и эту библиотеку со стандартным набором функций через стандартный набор функций чтобы могли вызывать все языки?
  • > Kolibri API
    Зачем? Ты считаешь себя умнее тех кто разработал API libc, glib, pascal rtl/crt. Зачем придумывать новый интерфейс, чем именно этот новый интерфейс будет лучше существующих (чем хуже понятно). (Я разделяю понятия интерфейса и реализации, так что под Kolibri API понимаю именно интерфейс, который придётся несколько раз реализовать.)

    > чёрное окошко обязательно?
    Да. (c) КО :-)

    p.s. Это всё оффтопик. Может стоит выделить в тему "Kolibri API"?

    ..bw
  • SoUrcerer wrote:Т.е. ты предлагаешь сделать некую kolibri.obj для программ на ЯВУ
    Я не думаю, что это будет именно kolibri.obj -- всё равно ведь всё через прерывания вызывается. Скорее kolibri.h с ассемблерными макросами (как оно называется в Си?), kolibri.pas, kolibri.ctx и т. п.
    bw wrote:под Kolibri API понимаю именно интерфейс, который придётся несколько раз реализовать.
    Интерфейс, если за него принимать printf и WriteLn, реализуется уже поверх API, какую ОС ни возьми. API первичен.

    Представьте, например, что для того, чтобы писать под Windows, пришлось бы сначала по MSDN придумывать себе kernel32.h с CreateFile, CloseHandle, самостоятельно описывать структуры, вроде WNDCLASS, и т. п. И под каждый язык и компилятор было бы что-то своё, придуманное наспех программистом имярек.
  • Freeman Так действуй. ;)
    Spoiler:Мне бы очень не помешал такой kolibri.h, чтобы в нём было функций 200-300 (начальный минимум) для работы с памятью (malloc, calloc, free - и чтобы можно было выделять память меньше 4 кб), окнами, шрифтами, графикой, контроллами (хотя бы для начала box_lib, а там может ещё чего захочу), аудио и видео (хочу, чтобы при запуске программы играла музыка), файлами различных типов (чтобы загружать JPEG одной командой и одной командой его отрисовывать) и чтобы HTMLv можно было в свои приложения встраивать (а что, IE в винде встраивать можно). И чтобы каждая функция была документирована, и примеры на каждую группу функций были. Сможешь сделать?
  • Здравствуйте.

    Для переноса на Колибри есть очень хорошая система программирования с открытым исходным кодом BlackBox
    http://www.oberoncore.ru
    Язык - Компонентный Паскаль.
    Преимущества - рано находятся ошибки, формы рассматриваются как документы (сильно упрощает создание GUI приложений).
    Есть русскоязычное сообщество.
    Есть компилятор для Линукс (может быть примером), windows и linux бинарники собираются из одних и тех же модулей.
    Для переноса на Колибри надо переписать подсистему Host и часть подсистемы Dev (есть примеры для windows и linux).
    Перенос этой системы на Колибри позволит легко создавать программы для Колибри.
  • Про js почитал, самое верное направление. А что с поддержкой llvm, по форуму поискал, нашел 2 сообщения. А ведь штука стоящая внимания http://ru.wikipedia.org/wiki/Low_Level_Virtual_Machine?

    Императивщина не нужна, имхо, ну разве что для разработки виртуальной машины.
    У Алана Кея интересные идеи насчет операционок http://www.computerra.ru/65749/steps/.

    Вы ассемблерный слой операционки реализовали просто потрясающе, честно, восхищен, растете от релиза к релизу в лучшую сторону. На фоне ReactOS и экспериментов Canonical gui классно смотрится, ярко так, душевно.

    Нормальная виртуальная машина + функциональный язык, лучший вариант - js, ну такие реалии, в том же JS уже и линукс запускали http://bellard.org/jslinux/ и jvm завести удалось и каких-то эмуляторов/интерпретаторов не получалось запустить, про успех ноды и метеора, basicjs на serverside думаю распространяться не надо, со встроенным браузером как понял беда.

    Будет такая система - автоматом DSL / трансляторы других языков появятся, ну и распылять уже силы не будете на кучу языков, можно будет просто слой этой виртуалки развивать, заодно зависимости развяжутся между ядром Колибри и инструментальным кодом/эмуляторами, да с прикладным софтом проблемы разрешатся.

    Мужики, момента не упускайте, делайте виртуальную машину, функциональный язык вторым основным языком для Колибри. У Вас исторический шанс забацать новую архитектуру с виртуальной машинкой и метапрограммированием. Вот как раз то, о чем Кей говорит.

    Вы можете, я уверен, это будущее сделать настоящим, в историю IT войти.
  • phpjscoder, спасибо за ссылку. Действительно, имеется тенденция унификации.
    Только вот вопрос, выльется ли это во что то реальное, или как обычно будут только рассуждения?

    Впрочем, система Oberon уже представляет из себя достаточно интересный образец такого, скажем, самобытного программирования. Когда в условиях ограниченных ресурсов разработчика, приходилось делать упор на максимальную степень code reuse. Там есть чему поучиться. Та же самая документо-ориентированность. Все, кто занимается на этом поле, рано или поздно придут в одну точку. И даже неважно, какой конкретно язык программирования будет использован - паскаль там или яваскрипт. Это уже будет зависеть от самого разработчика.

    Хотелось бы верить, что движение в этом направлении идёт, хотя и рассуждения тоже полезны.
  • Who is online

    Users browsing this forum: No registered users and 2 guests