Tiny C Compiler

...
  • Андрей,хорошую работу проделал!

    Компилятор языка высокого уровня под Колибри мне очень нужен(не хочу писать под винду и линукс, а ассемблер далеко не все знают(язык высокого уровня для того мне нужен ,чтобы можно было проверить логику работы моей программы другим людям)).

    Насколько я понимаю,для портирования сомого компилятора под Колибри необходимо до конца портировать стандартную библиотеку libc.
    Переписать часть кода с учетом новых системных функций(58 заменить на 70 и некоторое другое).В той части кода,что сейчас присутствует,портированы почти все стандартные функции библиотеки libc.

    А это случайно не та libc,что портировал Ярек ?


    Думаю,что библиотеку нужно будет выложить на svn после её портирования(и компилятор тамже).
    Вот только сишник из меня неахти,поэтому,к сожалению,помоч немогу.
  • andrew_programmer wrote:А это случайно не та libc,что портировал Ярек?
    Нет не та. У него лучше, но она слишком портируемая - там куча не нужных #if и #ifdef, поэтому в ней сложно разобраться (что мне и не удалось).
    andrew_programmer wrote:Думаю,что библиотеку нужно будет выложить на svn после её портирования(и компилятор тамже).
    Не понял про портирование библиотеки - она уже под KolibriOS, куда ее еще портировать? Если имеется в виду завершение ее написания, то думаю это произойдет не скоро :( ... Да и какой смысл выкладывать на svn завершенные проекты :? ?
    andrew_programmer wrote:Вот только сишник из меня неахти,поэтому,к сожалению,помоч немогу.
    А на чем ты пишешь?
  • Опс, забыл про лидирующие подчеркивания. Исправленный melibc.a можно взять здесь: http://shade.msu.ru/~msu-se/metccfix.zip
    metcc.zip также перезалит.
  • >Не понял про портирование библиотеки - она уже под KolibriOS, куда ее еще портировать?

    Я имел ввиду замену в коде 58-ой функции функции на 70.

    > Да и какой смысл выкладывать на svn завершенные проекты ?

    А я думал,что раздел "скачать" предназначен для скачивания софта под Колибри.Оказалось,что почему-то нет.


    >А на чем ты пишешь?

    Всё завичит от того,для какой цели пишется программа.

    1) Если код программы будут анализировать другие люди,то использую языки высокого уровня.Самой простой из тех,что я изредка использую, - это borland pascal.Но у него ограничения на размер используемой памяти.Если мне нужно работать с памятью большей чем 64 килобайта,то я использую си.А именно компилятор gcc.Но то ,как в си реализована работа с указателями - мне ОЧЕНЬ ненравиться.А ещё у си синтаксис дурацкий.А также у него размер кода получается большой и не очень быстрый.Поэтому использую его только когда деваться некуда.


    2)Если пишу для души,то использую исключительно Ассемблер и исключительно операционную систему Колибри.90% того времени,что я провожу за компьютером - я провожу именно в Колибри.Я хочу чтобы,Колибри стала моей основной операционной системой.И насколько могу,вношу влад в её развитие.


    P.S.
    Существуют различные вкрсии паскаля кроме borland pascal.К примеру Free Pascal.Только скачивать 12 мегов - это для меня нереально много(и дорого и провайдер не позволяет).

    Считается,что Ассемблер сложный язык программирования.А помоему наоборот - он самый простой(по синтаксису) язык программирования.Многие вещи в нём(к примеру работа с указателями) реализуется проще и понятней чем в си.
  • Я своим предыдущим сообщением совсем не хотел сказать,что компилятор си под Колибри не нужен.Он ОЧЕНЬ даже нужен.Это позволит программистам,пишущим на си(таких сейчас немало) писать программы под Колибри.Они портируют многоплатформенные библиотеки(к примеру SDL) и тогда,можно будет спокойно писать программы под Колибри и при этом быть уверенным,что они будут так-же хорошо работать и на других платформах.
  • Но то ,как в си реализована работа с указателями - мне ОЧЕНЬ ненравиться.
    Почему? Работать с указателями в Си намного проще чем в Паскале. Компилятор сам отслеживает размер данных при арифметических опреациях с указателями. Массивы и указатели - близнецы-братья что тоже очень удобно.
  • Отличная работа! Осталось только параметры командной строки реализовать, а остальное (библиотеки) можно сделать на базе того что уже есть.
    В дистрибутиве всего один пример, и то, помойму это проверка malloc`а. Если комуто интересно вот мой пример :

    Code: Select all

    #include "stdio.h"
    #include "string.h"
    #include "mesys.h"
    
    #define FONT0		0
    #define FONT1		0x10000000
    
    #define BT_NORMAL	0
    #define BT_DEL		0x80000000
    #define BT_HIDE		0x40000000
    #define BT_NOFRAME	0x20000000
    
    char header[]={" -= C demo programm. Compiled whith TCC 0.9.23 halyavin port =-   "};
    
    void rotate_str(char *str){
    	char tmp;
    	int i;
    	tmp = str[0];
    	for(i = 1; str[i ]; i++)str[i - 1] = str[i];
    	str[i - 1] = tmp;
    }
    
    void draw_window(){
    	static int offs = 0;
    	static int fcolor = 0;
    	static int col = 0;
    	
    	_msys_window_redraw(1);
    	_msys_draw_window(100, 100, 300, 120, 0xaabbcc, 2, 0x5080d0, 0, 0x5080d0);
    	_msys_write_text(6 - offs, 8, fcolor | FONT0, header, strlen(header));
    	_msys_draw_bar(1, 6, 5, 13, 0x05080d0);
    	_msys_draw_bar(274, 6, 26, 13, 0x05080d0);
    	_msys_make_button(300 - 19, 5, 12, 12, 1 | BT_NORMAL, 0x6688dd);
    	_msys_window_redraw(2);
    
    	offs = (offs + 1) % 6;
    	if(!offs)rotate_str(header);
    	
    	fcolor += (col)?-0x80808:0x80808;
    	if(fcolor > 0xf80000 || fcolor == 0)col = !col;
    }
    
    int main(int argc, char **argv){
    
    	while(!0){
    		switch(_msys_wait_for_event(10)){
    		case 2:return 0;
    			
    		case 3:
    			if(_msys_get_button_id() == 1)return 0;
    			break;
    			
    		default:
    			draw_window();
    			break;
    		}
    	}
    }
    
    помойму здесь всё понятно. Удачи!
  • Serge

    У меня 100% образное мышление и от того,каким образом будет обозначаться объект(в данном случае указатели) ,зависит моё восприятие этого объекта.Синтаксис обозначения указателей,принятый в си,мне непросто понять(следовательно увеличивается время на разбирание кода).А вот синтаксис работы с указателями в паскале - для меня прост и легко понятен.А самый понятный для меня синтаксис указателей - это Ассемблерный.В общем всё это связано с особенностями мышления,которое у разных людей разное.


    Ghost

    Хороший пример.
  • Незнаю почему пример Serge у меня не запустился ни в эмуляторе ни в реальной системе...
  • bug fix скачал?
  • оо.. заработало.. всем спасибо
  • Ошибка в функции _msys_putimage, в файле draw_image.asm нужно добавить mov eax, 7 (кстати, как компилять либу ?). Временно я использовал такой код :

    Code: Select all

    void _msys_putimage(int x, int y, int xsize, int ysize, void* image){
    	asm("movl	8(%esp), %edx");
    	asm("movl	16(%esp), %ecx");
    	asm("shll	$16, %ecx");
    	asm("shll	$16, %edx");
    	asm("movw	20(%esp), %cx");
    	asm("movw	12(%esp), %dx");
    	asm("movl	24(%esp), %ebx");
    	asm("movl 	$7,%eax");
    	asm("int	$0x40");
    }
    в tcc используется синтаксис AT&T ассемблера.
  • Ghost
    Спасибо, нашел еще одну существенную ошибку - системные функции объявлены как stdcall, но они не освобождали стек. выкладываю новую версию melibc.a: http://shade.msu.ru/~msu-se/metccfix1.zip. Перезалил metcc.zip (там соотвественно исправлены глюки с неосвобождением стека).
  • Либа компилится с помощью скрипта compile.js. Только там нужно в тексте подправить пути к компилятору С и ассемблера.
  • Who is online

    Users browsing this forum: No registered users and 3 guests