CLASHA - Объектно-ориентированное программирование на Си
Moderator: Shaos
-
- Junior
- Posts: 7
- Joined: 26 Apr 2007 07:23
- 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/
Искал возможные (некоммерческие) методы трансляции С++ в С.
Пробовал юзать 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/
-
- Admin
- Posts: 24080
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
- Junior
- Posts: 7
- Joined: 26 Apr 2007 07:23
- Location: Kyiv/Ukraine
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Щаз я вас расстрою...
Но если свет не сошелся клином на платформе персональных компьютеров,
то есть платформы, где ни на голом С, ни на С++ ничего не напишешь.
И хотя "наш ВАСИК" Шаоса смешит, но вот он там как раз и справляется.
Слышал, что и Паскаль могёт (но не видел). А вот С и С++ - нервно
курят в сторонке и всех смешат...

то есть платформы, где ни на голом С, ни на С++ ничего не напишешь.
И хотя "наш ВАСИК" Шаоса смешит, но вот он там как раз и справляется.
Слышал, что и Паскаль могёт (но не видел). А вот С и С++ - нервно
курят в сторонке и всех смешат...

-
- Admin
- Posts: 24080
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
это что за платформы такие? спектрум чтоли?Lavr wrote:Щаз я вас расстрою...Но если свет не сошелся клином на платформе персональных компьютеров,
то есть платформы, где ни на голом С, ни на С++ ничего не напишешь.
И хотя "наш ВАСИК" Шаоса смешит, но вот он там как раз и справляется.
Слышал, что и Паскаль могёт (но не видел). А вот С и С++ - нервно
курят в сторонке и всех смешат...

нынче все платформы программируются на сях - исключений нет
а если и есть, то это либо дилетанская поделка, либо бессмысленное ностальжи...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Retired
- Posts: 1474
- Joined: 03 Aug 2003 22:37
- Location: Moscow
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
А вот не надо бросаться столь категоричными суждениями, если не знаешь...Shaos wrote:нынче все платформы программируются на сях - исключений нет
а если и есть, то это либо дилетанская поделка, либо бессмысленное ностальжи...
И кстати говоря, если ВАСИК тебя смешит - то уточнил бы какой.
Под словом ВАСИК прячутся тучевы кучи альтернативных языков и
диалектов.
Мне казалось - спектрум относится к персональным компьютерам...Shaos wrote:это что за платформы такие? спектрум чтоли?
Lavr wrote:Но если свет не сошелся клином на платформе персональных компьютеров,...
-
- Admin
- Posts: 24080
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
ну Fleet это ещё не платформа, а экспериментальная архитектура, которая из стен университета ещё не вылезла...Mac Buster wrote:Ну, попробуй что-нибудь для Fleet на Си напиши, я с удовольствием посмотрю на результат.Shaos wrote:нынче все платформы программируются на сях - исключений нет а если и есть, то это либо дилетанская поделка, либо бессмысленное ностальжи...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Senior
- Posts: 185
- Joined: 07 Aug 2006 10:18
А что, компилятор васика для Fleet уже существует?Mac Buster wrote:Ну, попробуй что-нибудь для Fleet на Си напиши, я с удовольствием посмотрю на результат.Shaos wrote:нынче все платформы программируются на сях - исключений нет а если и есть, то это либо дилетанская поделка, либо бессмысленное ностальжи...
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Тут я нечайно попал на страницу софта для никсов...Shaos wrote:не смешите меня вашим васиком
этот язык для детского садика не применим к сколько-нибудь более-менее сложным проблемам...
P.S. да хотя бы скорость получающихся программ взять - даже если VB и умеет компилировать, то мне от этого ни тепло, ни холодно, т.к. у меня линух, в котором уже есть gcc...
У мню валосья встали дыбом!!! Столько ВАСИКОВ я под ДОС/Виндовс не знал,
сколько их есть под никсами!!! УжОс!!!

-
- Admin
- Posts: 24080
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Вот ещё на тему объектности и сей:
http://habrahabr.ru/post/239505/
P.S. И ещё (взято из комментов): http://libcello.org
http://habrahabr.ru/post/239505/
P.S. И ещё (взято из комментов): http://libcello.org
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24080
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Глядя на это думаю действительно надо в начало структуры класса вписывать идентификатор, чтобы просто delete(ObjPtr) мог вызывать нужный деструктор самостоятельно...Shaos wrote:Вот ещё на тему объектности и сей:
http://habrahabr.ru/post/239505/
P.S. И ещё (взято из комментов): http://libcello.org
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24080
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Вот более качественная (и рабочая) версия того, что было в начале топика:
и пример использования:
Code: Select all
/* 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: Select all
#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);
}
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24080
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Вот более продвинутая версия с хешем вместо строкового идентификатора класса:
Code: Select all
/* 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
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Novelist
- Posts: 39
- Joined: 24 Dec 2004 13:58
- Location: UK
Вот недавно набрел на вырезанный кусок из интервью с самим создателем, Бйорном Страуструпом. Не знаю, троль или нет.
http://harmful.cat-v.org/software/c++/I ... or_you_all
http://harmful.cat-v.org/software/c++/I ... or_you_all
Страуструп: В один прекрасный день, когда я сидел в моем кабинете, я придумал такой небольшой план чтобы вернуть баланс на место. Я подумал: «Интересно, что бы произошло, если бы появился язык настолько сложный, настолько трудный для изучения, что никто никогда не смог бы наводнить рынок программистами умеющими на нем работать?
Не для склоки пост сей, а информации ради....С тех пор прошло достаточно много времени, и я полагаю, большинство людей выяснили для себя что С++ — пустая трата времени. Но, надо сказать, это заняло гораздо дольше, чем я думал.