Каков наилучший способ перехода на C с языков более высокого уровня? - PullRequest
1 голос
/ 19 мая 2009

Я веб-кодер: в настоящее время я наслаждаюсь AS3 и имею дело с PHP. У меня есть Nintendo DS, и я хочу попробовать C.

Какие базовые вещи / удобства существ пропадут с более высокого уровня? Я не могу найти петли [для ... in], поэтому я предполагаю, что их там нет. Похоже, мне придется декларировать вещи неукоснительно, и я предполагаю, что у меня нет объектов (о которых я говорил в PHP некоторое время назад).

Хеш-таблицы? Смешные типы данных?

Ответы [ 12 ]

9 голосов
/ 19 мая 2009

Подводя итог, вы в основном получите:

  • Типизированные переменные
  • Функции
  • 1008 * Pointers *
  • Стандартные библиотеки

Затем вы делаете все остальное - это может быть слишком упрощенно, но это грубое представление о том, с чем столкнуться.

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

Строка? Какая строка?

Одна большая вещь, к которой нужно привыкнуть, это строки. В C. нет такой вещи, как string. Строка - это "null -определенный массив символов" (иногда называемый C строк ), который в основном означает массив типа char с последний элемент - \0 (char значение 0).

В памяти массив char длиной 4, содержащий Hi!, будет выглядеть как:

char[0] == 'H'
char[1] == 'i'
char[2] == '!'
char[3] == '\0'

Кроме того, строки не знают своей собственной длины (нет таких вещей, как «объекты», которые поставляются бесплатно в C), поэтому потребуется использование стандартного библиотечного вызова strlen, который более или менее for цикл, который проходит через строку, пока не достигнет символа \0. (Это означает, что это операция O (N) - чем длиннее строка, тем больше времени требуется, чтобы найти длину, в отличие от операции O (1) большинства реализаций string в современных языках.)

Сборка мусора?

Нет такой вещи, как сборщик мусора в C. На самом деле вам нужно выделять и освобождать память самостоятельно:

/* Allocate enough memory for array of 10 int values. */
int* array_of_ints = malloc(sizeof(int) * 10);

/* Done with the array? Don't forget to free the memory! */
free(array_of_ints);

Невозможность очистки после выделения памяти может привести к тому, что называется утечки памяти , о которых, я уверен, вы слышали раньше.

Pointers!

И, как всегда, когда мы говорим о C, мы не можем забыть о указателях . Вся концепция ссылок на переменные и разыменовывающие указатели может быть серьезной концепцией, вызывающей головную боль, но как только вы ее освоите, это на самом деле не так уж и плохо.

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

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

Типы

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

Однако возможно выполнить typecasts , поэтому можно привести тип int (которые являются целочисленными значениями) к типу double (значение с плавающим типом). Однако невозможно попытаться привести int непосредственно к строке, например char*.

Так, например, на некоторых языках допускается следующее:

// Example of a very weakly-typed pseudolanguage with implicit typecasts:
number n = 42
string s = "answer: "
string result = s + n  // Result: "answer: 42"

В C нужно было бы вызвать функцию itoa, чтобы получить char* представление int, затем использовать strcat для объединения двух строк. .

Заключение

Сказано, что изучение C на более высоком языке может быть очень откровенным и, вероятно, трудным для начала, но как только вы освоитесь, с ним будет довольно весело работать.

Я бы порекомендовал начать экспериментировать с компилятором C и иметь хорошую книгу или справочник.

Я думаю, что многие порекомендуют книгу K & R , которая действительно является превосходной книгой.

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

Удачи!

6 голосов
/ 19 мая 2009

Ну ... Возможно, вас ожидает культурный шок. Это - 32 стандартных ключевых слова в C, включая основные типы.

Стандартная библиотека C довольно функциональна (больше, чем, возможно, ожидают люди), но очень и очень тонка по сравнению с тем, что дают языки более высокого уровня. В поле зрения нет хеш-таблицы, и вы правильно предполагаете, что C не имеет синтаксической или семантической поддержки для объектов.

В любом случае можно написать симпатичный объектно-ориентированный код, но вам придется перепрыгнуть через несколько обручей и сделать гораздо больше вручную, поскольку язык вам не поможет. См., Например, набор инструментов GTK + UI для примера хорошо спроектированной объектно-ориентированной библиотеки C / API.

2 голосов
/ 19 мая 2009

Я веб-кодер: в настоящее время я наслаждаюсь AS3 и имею дело с PHP. У меня есть Nintendo DS, и я хочу попробовать C.

Почему вы хотите заниматься программированием на С? Каковы ваши причины, чего вы надеетесь достичь? Это для того, чтобы написать программное обеспечение для Nintendo DS?

Какие базовые вещи / удобства существ пропадут с более высокого уровня?

Учитывая ваше прошлое, я думаю, что вы лично упустите отсутствие поддержки динамической типизации, другими словами, вы должны быть очень явными в своих программах на C, ваши данные должны быть указаны с надлежащими типами, чтобы компилятор знал, с каким типом данных вы работаете. Это также относится к любому виду управления памятью, т. Е. В основном ко всему, когда вы начинаете работать со структурами данных, которые не являются POD.

Например, если вы сделаете что-то подобное в php:

function multiply(x) {
 return (x*x);
}

Вы должны сделать что-то подобное в C:

int multiply(int x) {
 return (x*x);
}

Хотя они могут показаться довольно схожими, есть большие различия, а именно ограничения на типирование: версия php также будет работать со значениями с плавающей запятой, в то время как в C вам придется явно предоставлять версии для различных типов и диапазонов значений (типы C) ограничены определенными диапазонами).

Я не могу найти петли [for ... in], поэтому предположим, что их там нет

в C, это больше похоже на следующее:

int c; для (с = 0; с <= 10; с ++) { // тело цикла } </p>

похоже, мне придется декларировать вещи религиозно

Да, очень, гораздо больше, чем вы оцените

и я предполагаю, что у меня нет объектов (с которыми я имел дело в PHP некоторое время назад).

правильно, нет объектов - но ООП все еще можно эмулировать другими способами, такими как функция (struct obj)

В зависимости от ваших целей и мотивации, я думаю, вы можете найти C довольно разочаровывающим языком, с которого можно начинать серьезное программирование, возможно, вы захотите взглянуть на некоторые из связанных альтернатив, таких как, например, Java.

1 голос
/ 19 мая 2009

Я просто проводил некоторые онлайн-исследования, и кажется, что есть реальная возможность использовать lua для разработки на «nintendo DS», на самом деле это может быть самый простой способ для тех, кто знаком с языками высокого уровня, начать работать со встроенными развитие, не жертвуя слишком большой мощностью HLL и не испытывая неизбежного культурного шока при переходе от HLL к C: microlua , вот документы API .

Так что вы можете попробовать, возможно, использовать эмулятор для начинающих.

Держите нас в курсе!

1 голос
/ 19 мая 2009

Вам особенно не хватит автоматического управления памятью и семантически значимых типов данных, таких как строки, таблицы и т. Д. Тем не менее, изучение языка C весьма поучительно, даже если вы, вероятно, не хотите использовать его для программирования на уровне приложений, поэтому я предлагаю вам взять «K & R» (оригинальную книгу Кернигана и Ричи) и попробовать - вы В Интернете вы найдете множество бесплатных библиотек, которые вы сможете использовать и изучать по мере продвижения вперед, хотя вам придется дисциплинировать себя, чтобы использовать правильную эвристику управления памятью ... счастливого обучения!

1 голос
/ 19 мая 2009

Динамические массивы и сборка мусора. Он не встроен в C, поэтому вам придется свернуть свое собственное или использовать уже существующее решение.

Стандартная процедура заключается в том, что вы сами управляете памятью, которая может звучать как нечто ужасное, но на самом деле это не так. Например, в AS3 и PHP вы можете создать массив и забыть его, когда закончите с ним. В C вы должны быть уверены, что освободите его самостоятельно, иначе память утечет, и плохие вещи могут / произойдут.

0 голосов
/ 24 мая 2009

Нам нужно больше доморощенных разработчиков. Я являюсь GBA / NDS и многими другими разработчиками встраиваемых платформ и надеюсь, что вы продолжите в том же духе. Я бы сказал: переходите на ассемблер, а затем обратно на C или любой другой язык, который вам нравится, когда вы знаете, как работает процессор, языки - это просто синтаксис.

Я предполагаю, что ваш предыдущий опыт охватывает мышление программистов, разбивку на куски по размеру, а затем написание кода для выполнения этих кусков. Затем еще один модуль, который связывает их вместе и так далее. Тогда C - это просто другой язык, очень очень простой язык, не нужно погружаться в его углы, двигаться вниз. Это хорошая привычка объявлять переменные и т. Д., И здесь вам придется это делать. Компиляторы сообщат вам, когда вы что-то забудете. Вам не понадобятся большие понятия, большие структуры, языковая магия, это встроено, вы ограничены в ресурсах, напишите здесь несколько байтов, прочитайте регистр, извлеките немного из данных, чтобы увидеть, была ли нажата кнопка, напишите регистр в ответ на перемещение спрайта и т. д.

Я думаю, вы сначала найдете NDS намного сложнее, чем C, есть два процессора и некоторая инфраструктура для получения простейшего из работающих двоичных файлов. Конечно, есть много примеров. Я обычно (и до сих пор) рекомендую начать с GBA, а затем перейти к NDS. куски размера укуса.

0 голосов
/ 19 мая 2009

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

Один из таких примеров - прямой доступ к памяти, опасности и чудеса арифметики указателей. Указатели очень мощные, быстрые и удобные, однако требуют тщательного управления. См. ТАК вопрос для примера.

Также, как уже упоминалось другими ответчиками, вам придется самостоятельно управлять памятью. Снова мощно и больно.

Я бы порекомендовал изучить хороший учебник и найти пример качественного кода. Главное - выучить шаблоны, которые заставляют все это правильно и элегантно соединяться (ну, насколько это возможно). Хороший отладчик также очень поможет и познакомится со стандартными библиотеками Си.

Вы можете заметить, что ваши приложения вначале рушатся без промедления, но perservere, поскольку C определенно стоит хотя бы побаловаться. Вы поймете некоторые из удивительных абстракций, которые предоставляют языки более высокого уровня, и что на самом деле происходит под капотом.

0 голосов
/ 19 мая 2009

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

Nintendo DS имеет только 4 МБ ОЗУ, 66 МГц ARM-7, нет операционной системы, а доступные библиотеки разработки (например, libnds) обеспечивают лишь тонкую абстракцию над самим оборудованием.

Таким образом, помимо необходимости иметь дело с ручным управлением памятью, более простым языком с меньшим количеством удобств существ, статической типизацией, отсутствием объектов и необходимостью выполнить этап компиляции, прежде чем вы сможете увидеть какие-либо изменения, вы также должны иметь дело с фрагментацией памяти, очень медленным процессором по современным стандартам и необходимостью напрямую взаимодействовать с оборудованием, чтобы делать что-то полезное.

Написание кода для DS, единственный другой вариант - C ++. Вы не можете использовать множество расширенных функций, которые делают C ++ полезным в такой ограниченной системе. Вы будете писать код на C, используя компилятор C ++.

Тем не менее, это очень весело. Вы можете использовать все необходимое оборудование, и вам не нужно взаимодействовать с операционной системой, потому что его нет.

0 голосов
/ 19 мая 2009

Многое из ООП одинаково или почти одинаково в PHP и C #.

Вы не играете с указателями в C # (по сравнению с C ++), поэтому я определенно рекомендую использовать C #, если вы хотите играть с C.

О чем ты говоришь?

C #

foreach(string item in itemsCollection)
{
...
}

PHP

foreach($itemsCollection as $key=>$value)
{
...
}

и т.д.

Мне нравится C #, потому что он строго типизирован, и ваши типы автоматически проверяются при написании кода ... Возможность попытки сохранить целое число в строку или наоборот равна нулю по сравнению с PHP, где вы можете сохранить что угодно в любом месте. ..

...