|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
CLASHA - Объектно-ориентированное программирование на Си
Author |
Message |
Valen
Junior
Joined: 26 Apr 2007 07:23 Posts: 7 Location: Kyiv/Ukraine
|
Тоже не хотелось слезать с С++ и программиить под z80 (юзая С компилятор SDCC).
Искал возможные (некоммерческие) методы трансляции С++ в С.
Пробовал юзать LLVM with C back-end. Работало, но при возникновении у меня вопросов, тамошние девелоперы посоветовали мне не юзать C back-end. Так как он в довольно зачаточном виде и не является приоритетом. На этом с LLVM и закончил.
Сейчас, когда есть время, посматриваю в сторону разных ООП языков, генерящих C код. (Естественно с уклоном на минимализм.)
1. Virgil. Вроде всем хорош, интересен, но вся целочисленная арифметика работает со 32-битовым типом, посему мне сразу не подходит (т.к. много юзаю типы 8, 16 битовые)
http://compilers.cs.ucla.edu/virgil/
2. nesC. Ещё не читал мануал.
http://nescc.sourceforge.net/
|
24 Apr 2011 04:20 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
на голом си тоже можно писать в ооп стиле
|
24 Apr 2011 04:28 |
|
|
Valen
Junior
Joined: 26 Apr 2007 07:23 Posts: 7 Location: Kyiv/Ukraine
|
|
24 Apr 2011 04:42 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Щаз я вас расстрою... Но если свет не сошелся клином на платформе персональных компьютеров,
то есть платформы, где ни на голом С, ни на С++ ничего не напишешь.
И хотя "наш ВАСИК" Шаоса смешит, но вот он там как раз и справляется.
Слышал, что и Паскаль могёт (но не видел). А вот С и С++ - нервно
курят в сторонке и всех смешат...
|
04 May 2011 15:32 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
| | | | Lavr wrote: Щаз я вас расстрою... Но если свет не сошелся клином на платформе персональных компьютеров, то есть платформы, где ни на голом С, ни на С++ ничего не напишешь. И хотя "наш ВАСИК" Шаоса смешит, но вот он там как раз и справляется. Слышал, что и Паскаль могёт (но не видел). А вот С и С++ - нервно курят в сторонке и всех смешат... | | | | |
это что за платформы такие? спектрум чтоли?
нынче все платформы программируются на сях - исключений нет
а если и есть, то это либо дилетанская поделка, либо бессмысленное ностальжи...
|
04 May 2011 17:35 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Ну, попробуй что-нибудь для Fleet на Си напиши, я с удовольствием посмотрю на результат.
_________________ Extreme Entertainment
|
04 May 2011 23:28 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А вот не надо бросаться столь категоричными суждениями, если не знаешь... И кстати говоря, если ВАСИК тебя смешит - то уточнил бы какой. Под словом ВАСИК прячутся тучевы кучи альтернативных языков и диалектов. Мне казалось - спектрум относится к персональным компьютерам...
|
05 May 2011 04:14 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
ну Fleet это ещё не платформа, а экспериментальная архитектура, которая из стен университета ещё не вылезла...
|
06 May 2011 09:59 |
|
|
bar
Senior
Joined: 07 Aug 2006 10:18 Posts: 185
|
А что, компилятор васика для Fleet уже существует?
|
07 May 2011 07:38 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Тут я нечайно попал на страницу софта для никсов...
У мню валосья встали дыбом!!! Столько ВАСИКОВ я под ДОС/Виндовс не знал,
сколько их есть под никсами!!! УжОс!!!
|
05 Jun 2011 19:30 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Вот ещё на тему объектности и сей:
http://habrahabr.ru/post/239505/
P.S. И ещё (взято из комментов): http://libcello.org
|
07 Oct 2014 18:36 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Глядя на это думаю действительно надо в начало структуры класса вписывать идентификатор, чтобы просто delete(ObjPtr) мог вызывать нужный деструктор самостоятельно...
|
07 Oct 2014 22:31 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Вот более качественная (и рабочая) версия того, что было в начале топика:
| | | | Code: /* shaobj.h - objects in pure C by Shaos
Copyright (c) 2007,2014 A.A.Shabarshin <me@shaos.net>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef CLASS
#include <stdarg.h>
#define SHA "Sha$" #define $$$(x) $$(x) #define $$(x) #x #define $(x,y) x##_##y #define NEW(x) $(new,x) #define DEL(x) $(del,x) #define BAD(x) $(bad,x) #define CON(x) $(x,con) #define CON_(x) $(x,con_) #define DES(x) $(x,des) #ifdef LIGHT #define CLASS_BEGIN(x) typedef struct $(t,x) { #else #define CLASS_BEGIN(x) typedef struct $(t,x) { char _s_[12]; int _n_; #endif #define CLASS_END(x) } x; #define PUBLIC extern #define BEGIN CLASS_BEGIN(CLASS) #define END CLASS_END(CLASS) \ PUBLIC void CON(CLASS) (CLASS *p, int t, ...); \ PUBLIC void CON_(CLASS) (CLASS* p, int t, va_list a); \ PUBLIC void DES(CLASS) (CLASS *p); \ PUBLIC CLASS* NEW(CLASS) (int t, ...); \ PUBLIC void DEL(CLASS) (CLASS *p); \ PUBLIC int BAD(CLASS) (CLASS *p);
#else
#include <stdlib.h>
void CON(CLASS) (CLASS *p, int t, ...) { va_list a; #ifndef LIGHT int i,c = -1; char s0[4] = SHA; char *s1 = (char*)p; char s2[] = $$$(CLASS); for(i=0;i<12;i++) { if(i<4) s1[i]=s0[i]; else if(!c) s1[i]=0; else { c = s2[i-4]; s1[i] = c; } } #endif va_start(a,t); CON_(CLASS) (p,t,a); va_end(a); }
CLASS* NEW(CLASS) (int t, ...) { int i; CLASS* p; p = (CLASS*)malloc(sizeof(CLASS)*((t>0)?t:1)); if(p) { if(t > 0) /* array */ { for(i=0;i<t;i++) { CON(CLASS) (&p[i],0); #ifndef LIGHT p[i]._n_ = t - i; #endif } } else { va_list a; va_start(a,t); CON_(CLASS) (p,t,a); va_end(a); #ifndef LIGHT p->_n_ = 1; #endif } } return p; }
void DEL(CLASS) (CLASS* p) { #ifndef LIGHT char s0[4] = SHA; char *s1 = (char*)p; int i,n = p->_n_; if(BAD(CLASS)(p)) { return; } #endif DES(CLASS) (p); #ifndef LIGHT for(i=1;i<n;i++) { DES(CLASS) (&p[i]); } #endif free(p); }
int BAD(CLASS) (CLASS* p) { #ifndef LIGHT int i,c; char s0[4] = SHA; char *s1 = (char*)p; char s2[] = $$$(CLASS); for(i=0;i<4;i++) { if(s0[i]!=s1[i]) return -1; } for(i=4;i<12;i++) { c = s2[i-4]; if(!c) break; if(c!=s1[i]) return -1; } #endif return 0; }
#endif
| | | | |
и пример использования: | | | | Code: #include "shaobj.h"
#define CLASS MyClass
BEGIN int id; char str[10]; END
PUBLIC void $(MyClass,print) (CLASS *this);
#include <stdio.h> #include <string.h>
#include "shaobj.h" // bodies
#define MY_CLASS_DEFAULT 0 #define MY_CLASS_CHARP -1 #define MY_CLASS_CHARP_INT -2
void MyClass_con_(MyClass* this, int t, va_list a) { if(t<=MY_CLASS_DEFAULT) { *this->str = 0; this->id = 0; } if(t<=MY_CLASS_CHARP) { strncpy(this->str,va_arg(a,char*),10); this->str[9] = 0; } if(t<=MY_CLASS_CHARP_INT) { this->id = va_arg(a,int); } }
void MyClass_des(MyClass* this) { }
void MyClass_print(MyClass* this) { printf("id=%i str='%s'\n",this->id,this->str); }
main() {
MyClass obj,*pobj;
MyClass_con(&obj,MY_CLASS_CHARP,"test"); MyClass_print(&obj); MyClass_des(&obj);
pobj = new_MyClass(MY_CLASS_CHARP_INT,"test2",2); MyClass_print(pobj); del_MyClass(pobj);
}
| | | | |
|
08 Oct 2014 00:28 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Вот более продвинутая версия с хешем вместо строкового идентификатора класса:
| | | | Code: /* shaobj.h - objects in pure C by Shaos
Copyright (c) 2007,2014 A.A.Shabarshin <me@shaos.net>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef IMPLEMENTATION #ifdef CLASS #undef CLASS #endif #endif
#ifndef CLASS
#ifndef SHAOBJ_H #define SHAOBJ_H #include <stdarg.h> #define Q(x) #x #define QQ(x) Q(x) #define $(x,y) $$(x,_,y) #define $$(x,y,z) x##y##z #define NEW(x) $(new,x) #define DEL(x) $(del,x) #define BAD(x) $(bad,x) #define SET(x) $(set,x) #define CON(x) $(x,con) #define CONS(x) $(x,cons) #define DES(x) $(x,des) #define HASH(x) $(x,hash) #ifdef LIGHT #define CLASS_BEGIN(x) typedef struct $(t,x) { #else #define CLASS_BEGIN(x) typedef struct $(t,x) { int _h_,_n_; #ifdef __cplusplus extern "C" { #endif /* optional class registration */ void register_class(int,void(*f)(void*)); /* optional common delete */ void common_delete(void *p); #ifdef __cplusplus } #endif #define delete(x) common_delete(x) #endif #define CLASS_END(x) } x; #ifdef __cplusplus #define PUBLIC extern "C" #else #define PUBLIC extern #endif #define METHOD(x) $(CLASS,x) #define BEGIN CLASS_BEGIN(CLASS) #define END CLASS_END(CLASS) \ PUBLIC void CON(CLASS) (CLASS *p, int t, ...); \ PUBLIC void CONS(CLASS) (CLASS* p, int t, va_list a); \ PUBLIC void DES(CLASS) (CLASS *p); \ PUBLIC CLASS* NEW(CLASS) (int t, ...); \ PUBLIC void DEL(CLASS) (CLASS *p); \ PUBLIC int BAD(CLASS) (CLASS *p); #endif
#else
#include <stdlib.h> /* for malloc and free */
/* private methods */
#ifndef LIGHT int HASH(CLASS) = 0;
void SET(CLASS) (CLASS* p) { int i,c,h=0; char *o,s[] = QQ(CLASS); if(!HASH(CLASS)) { o = s; while(c=*o++) h += (h<<5) + c; HASH(CLASS) = h; } p->_h_ = HASH(CLASS); } #endif
/* public methods */
int BAD(CLASS) (CLASS* p) { #ifndef LIGHT if(HASH(CLASS)!=p->_h_) return -1; #endif return 0; }
void CON(CLASS) (CLASS *p, int t, ...) { va_list a; #ifndef LIGHT SET(CLASS) (p); #endif va_start(a,t); CONS(CLASS) (p,t,a); va_end(a); }
CLASS* NEW(CLASS) (int t, ...) { int i; CLASS* p; p = (CLASS*)malloc(sizeof(CLASS)*((t>0)?t:1)); if(p) { if(t > 0) /* array */ { for(i=0;i<t;i++) { CON(CLASS) (&p[i],0); #ifndef LIGHT p[i]._n_ = t - i; #endif } } else { va_list a; va_start(a,t); #ifndef LIGHT SET(CLASS) (p); #endif CONS(CLASS) (p,t,a); va_end(a); #ifndef LIGHT p->_n_ = 1; #endif } } return p; }
void DEL(CLASS) (CLASS* p) { #ifndef LIGHT int i,n = p->_n_; if(BAD(CLASS)(p)) { exit(-1); } #endif DES(CLASS) (p); #ifndef LIGHT p->_h_ = 0; for(i=1;i<n;i++) { DES(CLASS) (&p[i]); p[i]._h_ = 0; } #endif free(p); }
#undef CLASS
#endif
| | | | |
|
10 Oct 2014 00:47 |
|
|
lbodnar
Novelist
Joined: 24 Dec 2004 13:58 Posts: 39 Location: UK
|
Вот недавно набрел на вырезанный кусок из интервью с самим создателем, Бйорном Страуструпом. Не знаю, троль или нет.
http://harmful.cat-v.org/software/c++/I_did_it_for_you_all
Не для склоки пост сей, а информации ради.
|
10 Oct 2014 02:00 |
|
|
Who is online |
Users browsing this forum: No registered users and 2 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|