nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 28 Jun 2017 06:40



Reply to topic  [ 90 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6  Next
CLASHA - Объектно-ориентированное программирование на Си 
Author Message
Junior

Joined: 26 Apr 2007 10:23
Posts: 7
Location: Kyiv/Ukraine
Reply with quote
Post 
Тоже не хотелось слезать с С++ и программиить под 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 07:20
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
на голом си тоже можно писать в ооп стиле

_________________
:eugeek: https://twitter.com/Shaos1973


24 Apr 2011 07:28
Profile WWW
Junior

Joined: 26 Apr 2007 10:23
Posts: 7
Location: Kyiv/Ukraine
Reply with quote
Post 
Shaos wrote:
на голом си тоже можно писать в ооп стиле

Практически так и делаю.


24 Apr 2011 07:42
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 11:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Щаз я вас расстрою... :wink: Но если свет не сошелся клином на платформе персональных компьютеров,
то есть платформы, где ни на голом С, ни на С++ ничего не напишешь.
И хотя "наш ВАСИК" Шаоса смешит, но вот он там как раз и справляется.
Слышал, что и Паскаль могёт (но не видел). А вот С и С++ - нервно
курят в сторонке и всех смешат... :roll:


04 May 2011 18:32
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
Lavr wrote:
Щаз я вас расстрою... :wink: Но если свет не сошелся клином на платформе персональных компьютеров,
то есть платформы, где ни на голом С, ни на С++ ничего не напишешь.
И хотя "наш ВАСИК" Шаоса смешит, но вот он там как раз и справляется.
Слышал, что и Паскаль могёт (но не видел). А вот С и С++ - нервно
курят в сторонке и всех смешат... :roll:


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

_________________
:eugeek: https://twitter.com/Shaos1973


04 May 2011 20:35
Profile WWW
Retired

Joined: 04 Aug 2003 01:37
Posts: 1483
Location: Moscow
Reply with quote
Post 
Shaos wrote:
нынче все платформы программируются на сях - исключений нет а если и есть, то это либо дилетанская поделка, либо бессмысленное ностальжи...


Ну, попробуй что-нибудь для Fleet на Си напиши, я с удовольствием посмотрю на результат.

_________________
Extreme Entertainment


05 May 2011 02:28
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 11:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
нынче все платформы программируются на сях - исключений нет
а если и есть, то это либо дилетанская поделка, либо бессмысленное ностальжи...

А вот не надо бросаться столь категоричными суждениями, если не знаешь...
И кстати говоря, если ВАСИК тебя смешит - то уточнил бы какой.
Под словом ВАСИК прячутся тучевы кучи альтернативных языков и
диалектов.

Shaos wrote:
это что за платформы такие? спектрум чтоли?

Мне казалось - спектрум относится к персональным компьютерам...
Lavr wrote:
Но если свет не сошелся клином на платформе персональных компьютеров,...


05 May 2011 07:14
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
Mac Buster wrote:
Shaos wrote:
нынче все платформы программируются на сях - исключений нет а если и есть, то это либо дилетанская поделка, либо бессмысленное ностальжи...


Ну, попробуй что-нибудь для Fleet на Си напиши, я с удовольствием посмотрю на результат.


ну Fleet это ещё не платформа, а экспериментальная архитектура, которая из стен университета ещё не вылезла...

_________________
:eugeek: https://twitter.com/Shaos1973


06 May 2011 12:59
Profile WWW
Senior

Joined: 07 Aug 2006 13:18
Posts: 186
Reply with quote
Post 
Mac Buster wrote:
Shaos wrote:
нынче все платформы программируются на сях - исключений нет а если и есть, то это либо дилетанская поделка, либо бессмысленное ностальжи...


Ну, попробуй что-нибудь для Fleet на Си напиши, я с удовольствием посмотрю на результат.

А что, компилятор васика для Fleet уже существует?


07 May 2011 10:38
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 11:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
не смешите меня вашим васиком :)
этот язык для детского садика не применим к сколько-нибудь более-менее сложным проблемам...
P.S. да хотя бы скорость получающихся программ взять - даже если VB и умеет компилировать, то мне от этого ни тепло, ни холодно, т.к. у меня линух, в котором уже есть gcc...

Тут я нечайно попал на страницу софта для никсов...
У мню валосья встали дыбом!!! Столько ВАСИКОВ я под ДОС/Виндовс не знал,
сколько их есть под никсами!!! УжОс!!! :roll:


05 Jun 2011 22:30
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
Вот ещё на тему объектности и сей:

http://habrahabr.ru/post/239505/

P.S. И ещё (взято из комментов): http://libcello.org

_________________
:eugeek: https://twitter.com/Shaos1973


07 Oct 2014 21:36
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
Shaos wrote:
Вот ещё на тему объектности и сей:

http://habrahabr.ru/post/239505/

P.S. И ещё (взято из комментов): http://libcello.org


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

_________________
:eugeek: https://twitter.com/Shaos1973


08 Oct 2014 01:31
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
Вот более качественная (и рабочая) версия того, что было в начале топика:
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);

}

_________________
:eugeek: https://twitter.com/Shaos1973


08 Oct 2014 03:28
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
Вот более продвинутая версия с хешем вместо строкового идентификатора класса:
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

_________________
:eugeek: https://twitter.com/Shaos1973


10 Oct 2014 03:47
Profile WWW
Novelist

Joined: 24 Dec 2004 16:58
Posts: 39
Location: UK
Reply with quote
Post 
Вот недавно набрел на вырезанный кусок из интервью с самим создателем, Бйорном Страуструпом. Не знаю, троль или нет.

http://harmful.cat-v.org/software/c++/I_did_it_for_you_all

Quote:
Страуструп: В один прекрасный день, когда я сидел в моем кабинете, я придумал такой небольшой план чтобы вернуть баланс на место. Я подумал: «Интересно, что бы произошло, если бы появился язык настолько сложный, настолько трудный для изучения, что никто никогда не смог бы наводнить рынок программистами умеющими на нем работать?


Quote:
...С тех пор прошло достаточно много времени, и я полагаю, большинство людей выяснили для себя что С++ — пустая трата времени. Но, надо сказать, это заняло гораздо дольше, чем я думал.


Не для склоки пост сей, а информации ради.


10 Oct 2014 05:00
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 90 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6  Next

Who is online

Users browsing this forum: No registered users and 1 guest


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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.