LINUX.ORG.RU

C with objects

 


1

7

есть ли ЯП с таким фичлистом:

- компилируемый в быстрый нативный код

- без обязательного сборщика мусора

- умеет сишные либы (возможно, с небольшими допиливаниями)

- структуры с методами

- не С++

понимаю, что фантастика, но вдруг

★★★★★

Ответ на: комментарий от MyTrooName

что насчет структур с методами?

Всё более-мнее хорошо

typedef struct {
...
} my_obj_t;

void my_type_method_one(my_obj_t, ...);
void my_type_method_two(my_obj_t, ...);
сахара в си для этого нет, выходит немного многословно. Но жить можно если под методами подразумеваются только методы.

mashina ★★★★★
()

C with classes или то во что оно в итоге превратилось.

mm3 ★★★
()
Ответ на: комментарий от MikeDM

Objective-C все методы являются виртуальными, то есть могут быть переопределены.

тоже не совсем гут

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

как я понял, там нестрогая типизация в объектах?

да все там строгое.

ООП у наследников Си есть только в c++ obj-c и модном go

MikeDM ★★★★★
()
Ответ на: комментарий от mashina

сахара в си для этого нет

по сути, этот сахар и нужен

MyTrooName ★★★★★
() автор топика

Не вчитывался, но как понял, единственное отличие — методы.

ООП вполне себе работает и на чистом Си. Посмотри как устроена работа с GTK+ или, например, с UEFI.

Deleted
()
Ответ на: комментарий от Hrenomoto

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

если есть тут телепаты, подскажите, плз

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

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

Либо сам не знаешь чего хочешь, либо херню несёшь.

mashina ★★★★★
()
Ответ на: комментарий от MyTrooName

Выброс исключения без расхреначивания стека и принудительного вызова всех деструкторов до ближайшего catch?

ilammy ★★★
()

Я у себя сделал так, лол.

// Типа публичные методы, которые есть у всех камер
typedef struct
{
    void *camera;
    void (*screen2world) (void*, vox_dot, int, int, int, int);
    float* (*get_position) (void*);
    void (*get_rot_angles) (void*, float*, float*, float*);
    void (*set_rot_angles) (void*, float, float, float);
    void (*move_camera) (void*, vox_dot, int (*) (vox_dot, void*), void*);
} vox_camera_interface;

// Класс-реализация
typedef struct
{
    vox_camera_interface iface;

    vox_dot position; /**< \brief Position of the camera */
    float fov; /**< \brief Field of view */
    float rotx; /**< \brief Rotation angle around axis Ox (left-right) */
    float roty; /**< \brief Currently unused */
    float rotz; /**< \brief Rotation angle around axis Oz (up-down) */

    vox_quat rotation;
} vox_simple_camera;
esandmann
()
Ответ на: комментарий от esandmann

было б не жалко - взял бы питон или жабу

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

Как минимум в том, что непонятно, откуда прилетело исключение (стека-то уже нет).

Но это... а в чём проблема использовать Си++ без исключений, без темплейтов, без всего того, что не надо? Ведь в конце концов Бьярн как раз для этого его и создал. И gcc так делает.

ilammy ★★★
()
Ответ на: комментарий от MyTrooName

foo * bar(baz* ne)

? не как поле в структурке-обьекте?

qulinxao ★★☆
()
Ответ на: комментарий от nanoolinux

Да я так понял, ему необходима как раз перегрузка. Чтобы не было 100500 privet_Foo, а только один privet, который в compile-time знаёт, что у него за первый аргумент.

ilammy ★★★
()
Ответ на: комментарий от ilammy

без исключений

к сожалению, иначе ошибку из конструктора/деструктора не вернуть никак.

можно попробовать вместо них сделать init/done, конечно... надо подумать, спасибо

MyTrooName ★★★★★
() автор топика
Последнее исправление: MyTrooName (всего исправлений: 1)
Ответ на: комментарий от ilammy

Ну тогда „спп без объектов“

struct A
{
  int i;
}

void dver_zapili(A *a, int i) {printf("zapilil %d\n", a->i +i);}
void dver_zapili(A *a, flout f) {printf("zapilil %f\n", a->i -f);}

да и вообще, автор хочет странного. Из-за исключений в деструкторе, которые он кстати в списке требований не указал, отказывается от такого чудесного и лёгкого как воздух языка как спп )

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от nanoolinux

не перегрузка, просто немного сахара.

a->dver_zapili

знаю, мелочь, но очень уж удобно выделять один из параметров функции за скобки

Из-за исключений в деструкторе, которые он кстати в списке требований не указал

зато указал «не С++» :)

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

и да, исключения тоже пригодятся.

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

Выше же уже предложили хранить указатели на функции в структуре? Будет как-то так:

a->dver_zapili(a);

Плюс такого метода - можно переопределить в рантайме функцию (метод).

Что-то похоже на исключения можно сделать с помощью setjmp/longjmp. В википедии есть пример http://en.wikipedia.org/wiki/Setjmp.h

anonymous
()
Ответ на: комментарий от nanoolinux

Из деструктора нельзя исключения выбрасывать?

Можно, но аккуратно, а то может закончится утечками ресурсов или вызовом std::terminate.

Begemoth ★★★★★
()
Ответ на: комментарий от anonymous

дикий перерасход памяти. если полей на 12 байт, а десяток методов займут 80 байт, и таких объектов десятки миллионов...

если б не упиралось в производительность, писал бы на питоне

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

дикий перерасход памяти

Можно хранить указатель на табличку. Тогда будет дикий перерасход памяти на 8 байт и дикие потери производительности на косвенной адресации.

ilammy ★★★
()
Ответ на: комментарий от anonymous

Что-то похоже на исключения можно сделать с помощью setjmp/longjmp

И оно будет неплохо так тормозить, потому что setjmp надо делать при каждом входе в try. И try-finally-блоки надо делать везде, где захватываются ресурсы.

ilammy ★★★
()
Последнее исправление: ilammy (всего исправлений: 1)
Ответ на: комментарий от ilammy

... и синтаксис вызова будет a->vt[METHOD](a, params)

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от ilammy

и да, 80 мбайт - это дикий перерасход памяти там, где можно обойтись 8 байтами

MyTrooName ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

к сожалению, иначе ошибку из конструктора/деструктора не вернуть никак.

Ну да, проблема решается явными init() / deinit(). Только это создаёт некоторые затруднения с хранением таких объектов в стандартных контейнерах.

ilammy ★★★
()
Ответ на: комментарий от MikeDM

ООП у наследников Си есть только в c++ obj-c и модном go

есть лисапедный ООП на C как в GTK, например, сделан.

dn2010 ★★★★★
()
Ответ на: комментарий от ilammy

И оно будет неплохо так тормозить

Ну, ТС как-то сбивчиво сообщает что ему нужно. Если он так уж хочет производительности, то наверное вместо исключений вообще лучше использовать С error handling с помощью goto

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.