Каковы основные различия между C и Objective C. Возможна ли абстракция в C? - PullRequest
0 голосов
/ 28 сентября 2010

Каковы основные различия между C и Целью C. Возможна ли абстракция в C?

Ответы [ 5 ]

8 голосов
/ 28 сентября 2010

Если кто-нибудь когда-нибудь спросит вас: «Может ли A сделано языком B быть сделано в C?»Ответ всегда «да», потому что все программы действительно являются Си-программами.Позвольте мне проиллюстрировать.

Objective-C - это C, с библиотекой, написанной на C, для обработки передачи сообщений, которая упрощает абстракцию.

Ruby, Python, Perl?Все они являются программами на Си, интерпретирующими большие текстовые файлы, которые определяют, как обрабатывать другие текстовые файлы.Таким образом, все Perl, Python и Ruby программы - это программы на C с безумно большими наборами данных.

LISP начинался как программа на C для подсчета скобок, которые пошли в колледж, чтобы получить докторскую степень по абстрактной математике, а затем средактор больших размеров, теперь он отвлекает программистов от написания программ на Си с помощью редактора Tetris, электронной почты и IRC.

Java - это отвратительная вещь.Написано на языке C. Но написано несколькими группами людей, которые не удосужились поговорить друг с другом и, таким образом, придумали несколько программ на языке C, названных Java, для обработки одних и тех же наборов данных Java в разные несовместимые результаты.Веб-браузеры, опасаясь пробела в режиме «одна запись, каждый тест», создали JavaScript (на C), чтобы гарантировать, что ни один проект никогда не будет таким простым.

Yacc - это программа на C для создания большего количества программ на C.Некоторые ученые считают, что Як является прото живым организмом, о чем свидетельствует его способность воссоздавать себя.Другие полагают, что Yacc является естественным результатом программы на C, вращающейся со скоростью 5400 об / мин, пока она не закружится и не испортит ковер.

Конечно, сама C написана на C для преобразования источника C в сборку, котораясобирается в исполняемый машинный код ассемблером.

Написано на C.

8 голосов
/ 28 сентября 2010

Конечно, абстракция возможна в C. Это возможно, если вы пишете код, устанавливая биты «намагниченной иглой и твердой рукой».

Функция - это единица абстракции. Если я представляю колоду карт в виде массива char[52], то я могу написать функцию, чтобы перемешать ее. После того, как я написал эту функцию, мне больше не нужно думать о том, как ее снова перемешать. Я могу просто сказать, shuffle(deck);

Обратите внимание, что я мог бы писать это на ассемблере, в шестнадцатеричном редакторе или намагниченной иглой.

4 голосов
/ 28 сентября 2010

Вкратце, Objective-C добавляет объектно-ориентированные функции в C.

Абстракция возможна практически во всех общепринятых языках программирования. Все, что на самом деле означает абстракция, это «Сокрытие деталей того, как что-то реализовано».

Программирование - это создание абстракций. Когда вы разрабатываете функцию, это абстракция. Например, если функция складывает все элементы массива, абстракция позволяет вам думать «Эй, я складываю элементы этого массива» вместо того, чтобы думать «Хорошо, позвольте мне создать переменную счетчика, и затем установите его на первый элемент в массиве, затем захватите это значение и добавьте его к сумме, теперь увеличивайте счетчик и продолжайте, если я не дошел до конца массива ".

Ответ Барри - пример немного более сложной абстракции, где вы создаете абстрактный тип данных. Например, struct _myADT может быть struct circle, и у вас могут быть функции для создания круга, измерения его площади, изменения его размера и т. Д. И т. Д. В действительности вы передаете указатель на место в памяти, которое содержит центр круга, радиус и т. д. и т. д., но абстракция заключается в том, что вы передаете представление окружности.

Разница между Objective C и C в том, что C не очень хорош в создании абстрактных типов данных. Вы должны пройти через все виды неприятностей, чтобы скрыть детали того, что происходит внутри структуры, и кто-то всегда может решить: «Мне действительно не нужны ваши абстракции, позвольте мне протянуть руку и вертеть эти биты, потому что я знаю лучше вас ». В объектно-ориентированных языках, таких как Objective-C, вы можете фактически применять свои абстракции, решая, к каким элементам ваших объектов можно получить доступ, и как к ним можно получить доступ.

0 голосов
/ 28 сентября 2010

Да, абстракция, безусловно, возможна в C (см. Ниже), как и практически в любом языке программирования.Разница между C и Objective-C заключается не в абстракции, а в зависимостях.Явная цель Objective-C состоит в том, чтобы отделить зависимые модули, чтобы большие сложные системы не становились такими неудобными для разработчиков.В частности, передача сообщений в Objective-C во время выполнения (вместо вызовов функций, связанных с компиляцией / связыванием во времени) позволяет менее тесно связывать модули.Вызывающий модуль должен знать только имя, а не двоичное представление метода для его вызова.Таким образом, модули можно обновлять по отдельности, заменять или даже изменять во время выполнения, не нарушая всех зависимостей в системе.

Для полноты, классический подход к созданию инкапсуляции и абстракции в C - это " abstractтип данных"шаблон.При применении этого шаблона разделение объявления и определения C позволяет вам как инкапсулировать, так и абстрагировать реализацию типа данных.

Например, в общедоступном заголовке

// MyADT.h
typedef struct _myADT *myADT;

myADT myadt_create();
void myadt_perform(myADT adt);
void myadt_free(myADT);

Клиенты могут использоватьAPI без знания реализации моего типа данных.Определение структуры и функций находится в отдельном (и потенциально частном) модуле:

// MyADT.c

typedef struct _myADT {
 ...
};

void myadt_create()
{
   struct _myADT adt = malloc(sizeof(struct _myADT));
   ...
   return adt;
}

//etc...
0 голосов
/ 28 сентября 2010

C ++ и Objective-C

Короткий ответ - огромная разница. Эта ссылка является хорошей отправной точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...