Я рассматриваю возможность изучения C
Нет особой причины не изучать C, но я бы предложил C ++. Он предлагает большую часть того, что делает C (поскольку C ++ - это супер-набор C), с большим количеством «дополнений». Изучение C до C ++ не является необходимым - они фактически являются отдельными языками.
Другими словами, если бы C был набором деревообрабатывающих инструментов, он, вероятно, был бы:
- молоток
- ногти
- ручная пила
- ручная дрель
- блок шлифовальный
- долото (возможно)
Вы можете создать что - нибудь с этими инструментами - но ничего хорошего потенциально требует много времени и мастерства.
C ++ - это набор мощных инструментов в вашем местном хозяйственном магазине.
Если вы придерживаетесь базовых языковых возможностей, C ++ имеет относительно небольшую дополнительную кривую обучения.
Но почему люди используют C (или C ++), если его можно использовать «опасно»?
Потому что некоторые люди не хотят мебель от ИКЕА. знак равно
Если серьезно, то, хотя многие языки, которые «выше» C или C ++, могут иметь вещи, которые делают их (потенциально) «более простыми» в использовании в определенных аспектах, это не всегда хорошо. Если вам не нравится то, как что-то делается, или функция не предоставляется, скорее всего, вы ничего не можете с этим поделать. С другой стороны, C и C ++ предоставляют достаточно «низкоуровневых» языковых возможностей (включая указатели), чтобы вы могли получить доступ ко многим вещам довольно напрямую (особенно с аппаратной или операционной системой) или создать их самостоятельно, что может быть невозможно в других случаях. языки как реализовано.
В частности, C имеет следующий набор функций, которые делают его желательным для многих программистов:
- Скорость - из-за относительной простоты и оптимизации компиляции в течение многих лет, она изначально очень быстрая. Кроме того, многие люди при использовании языка нашли множество ярлыков для конкретных целей, что делает его потенциально еще быстрее.
- Размер. По тем же причинам, которые указаны для скорости, программы на Си могут быть очень маленькими (как с точки зрения размера исполняемого файла, так и использования памяти), что желательно для сред с ограниченным объемом памяти (т. Е. Встроенных или мобильных).
Совместимость - C существует уже давно, и у каждого есть инструменты и библиотеки для него. Сам язык также не требователен - он ожидает, что процессор будет выполнять инструкции, а память - для хранения информации, и это все.
Кроме того, существует нечто, известное как двоичный интерфейс приложения (ABI) . Короче говоря, это способ взаимодействия программ на уровне машинного кода, который может иметь преимущества перед интерфейсом прикладного программирования (API) . В то время как другие языки, такие как C ++, могут иметь ABI, обычно они менее единообразны (согласованы), чем C, поэтому C делает хороший базовый язык, когда вы хотите по какой-то причине использовать ABI для взаимодействия с другой программой.
Почему программисты не просто используют Java, Python или другой скомпилированный язык, такой как Visual Basic?
Эффективность (и иногда схемы управления памятью, которые не могут быть реализованы без относительно прямого доступа к памяти).
Прямой доступ к памяти с помощью указателей вводит много аккуратных (обычно быстрых) трюков, когда вы можете положить свои грязные лапы на маленькие и нули прямо в свои ячейки памяти и не нужно ждать, пока этот учитель раздаст игрушки во время игры, затем выкопайте их снова.
Короче говоря, добавление материала потенциально создает задержку или иным образом создает нежелательную сложность.
Что касается скриптовых языков и тому подобного, вы должны усердно работать, чтобы получить языки, требующие, чтобы вторичные программы работали так же эффективно, как изначально C (или любой скомпилированный язык). Добавление интерпретатора «на лету» по своей сути вводит возможность снижения скорости выполнения и увеличения использования памяти, поскольку вы добавляете в микшер еще одну программу. Эффективность ваших программ зависит как от эффективности этой вторичной программы, так и от того, насколько хорошо (плохо =) вы написали исходный программный код. Не говоря уже о том, что ваша программа часто полностью зависит от второй программы. Эта вторая программа по какой-то причине не существует в конкретной системе? Код не идет.
Фактически, введение чего-то «лишнего» потенциально замедляет или усложняет ваш код. В языках «без страшных указателей» вы всегда ждете, чтобы другие кусочки кода очистились позади вас, или иным образом выясните «безопасные» способы сделать что-то - потому что ваша программа все еще выполняет те же операции доступа к памяти, что и с указатели. Вы просто не тот, кто с этим справляется (так что вы не можете его обдумать, genius = P).
Под опасным я имею в виду указатели и другие подобные вещи. [...] Как и вопрос переполнения стека. Почему функция gets настолько опасна, что ее не следует использовать?
Согласно принятому ответу:
«Он оставался официальной частью языка до стандарта ISO C 1999 года, но он был официально удален стандартом 2011 года. Большинство реализаций C все еще поддерживают его, но по крайней мере gcc выдает предупреждение для любого кода, который его использует».
Представление о том, что, поскольку что-то может быть сделано на языке, это должно быть сделано, глупо. У языков есть недостатки, которые исправляются. По соображениям совместимости со старым кодом эта конструкция все еще может использоваться. Но нет ничего (вероятно), заставляющего программиста использовать get (), и, фактически, эта команда была по существу заменена более безопасными альтернативами.
Более того, проблема с get () сама по себе не является проблемой указателя . Это проблема с командой, которая не обязательно знает, как безопасно использовать память. В абстрактном смысле, это все проблемы с указателями - чтение и запись вещей, которые вы не должны делать. Это не проблема с указателями; это проблема с реализацией указателя.
Чтобы уточнить, указатели не опасны, пока вы случайно не получите доступ к области памяти, которую вы не собирались. И даже тогда это не гарантирует, что ваш компьютер тает или взрывается. В большинстве случаев ваша программа просто перестанет функционировать (правильно).
Тем не менее, поскольку указатели предоставляют доступ к областям памяти и поскольку данные и исполняемый код существуют в памяти вместе, существует реальная опасность случайного повреждения, что вы хотите правильно управлять памятью.
В связи с этим, поскольку в действительности операции прямого прямого доступа к памяти часто дают меньше преимуществ, чем они могли бы получить много лет назад, даже языки без сбора мусора, такие как C ++, ввели такие вещи, как интеллектуальные указатели, чтобы помочь преодолеть разрыв между эффективностью и безопасностью памяти.
Таким образом, существует очень мало причин бояться указателя, если он используется безопасно. Просто возьмите намек на версию Стива "Охотник за крокодилами" Ирвина из Саут-Парка - не торопитесь засунуть большой палец в дырки крокодилов .