Является ли C императивным или декларативным языком программирования?

Довольно сложно понять разницу между императивным и декларативным программированием. Может ли кто-нибудь объяснить разницу между ними в терминах реального мира?

Просьба уточнить, является ли C императивным или декларативным языком?

5 ответов

C является императивным языком программирования.

Разница между ними в одной строке будет декларативным программированием, когда вы говорите, что хотите, а императивным языком - когда вы говорите, как получить то, что вы хотите. В декларативном программировании основное внимание уделяется тому, что должен делать компьютер, а не тому, как он должен это делать (например, SQL), в то время как в императивном программировании основное внимание уделяется тому, какие действия должен предпринять компьютер, а не тому, что будет делать компьютер (например, C)., C++, Java).

Императивное программирование - это парадигма программирования, которая описывает вычисления в терминах операторов, которые изменяют состояние программы

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

Многие императивные языки программирования (такие как Fortran, BASIC и C) являются абстракциями языка ассемблера.

Вики говорит:

В качестве императивного языка C использует операторы для определения действий. Наиболее распространенным оператором является оператор выражения, состоящий из выражения для оценки, за которым следует точка с запятой; как побочный эффект оценки, функции могут быть вызваны, и переменным могут быть назначены новые значения. Чтобы изменить нормальное последовательное выполнение операторов, C предоставляет несколько операторов потока управления, идентифицированных зарезервированными ключевыми словами. Структурное программирование поддерживается условным выполнением if(-else) и do-while, while и для итеративного выполнения (зацикливания). Оператор for имеет отдельные выражения инициализации, тестирования и повторной инициализации, любое или все из которых можно опустить. break и continue можно использовать, чтобы оставить оператор внутреннего цикла или перейти к его повторной инициализации. Существует также неструктурированный оператор goto, который разветвляется непосредственно на назначенную метку внутри функции. Переключатель выбирает регистр, который должен быть выполнен, на основе значения целочисленного выражения.

Предостережение

Я пишу много общих слов, поэтому, пожалуйста, потерпите меня.

Теоретически

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

В императивных языках вы сосредоточены на алгоритме / реализации. Инжиниринг по своей сути является императивом, потому что вы нацелены на эффективность процесса: затраты на выполнение чего-либо с точки зрения времени или денег (или памяти в CS).

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

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

Что означает z = x + y? (Семантика)

На императивном языке это означает чтение из областей памяти x и y, сложение этих значений вместе, помещение результата в область памяти z и выполнение этого прямо сейчас. Если вы назначите другое значение для x, вам придется использовать z = x + y заявление снова пересчитать з.

В декларативном (ленивом) языке это означает, что z - это переменная, значением которой является сумма значений двух других переменных x и y. Операция сложения не будет выполнена, пока вы не попытаетесь прочитать значение z. В чем смысл? Если вы читаете из z, значение всегда будет суммой x и y в тот момент времени; Вам не нужно переиздавать заявление. В чистых декларативных языках, где нет переменных, переиздание может быть фактически перехвачено как ошибка!!!

Запомните этот пример, и вы поймете, почему математики предпочитают декларативные языки. Например, я могу определить hypotenuse = sqrt( height^2 + length^2) и никогда не беспокоиться о необходимости повторного выражения этого утверждения. Отношения - это инвариант, который всегда будет сохраняться, как всегда имеет место математическая истина.

В реальной жизни (и почему я должен заботиться?)

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

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

Конечно, ничто не является на 100% обязательным или декларативным. Правильный кодекс, который является правильным и хорошо написанным, подразумевает определенные отношения. OTOH, декларативный код, достаточно глубокий и в сочетании со спецификациями языка, описывает эти отношения достаточно хорошо, чтобы компилятор / интерпретатор превратил ваш код в серию инструкций процессора.

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

Поэтому декларативный язык требует, чтобы программист сосредоточился на определении отношений между переменными и другими инвариантами. Компилятор / интерпретатор должен превратить эти отношения в серию инструкций / операций для CPU. Большинство декларативных компиляторов / интерпретаторов достаточно умны, чтобы справляться с большинством реальных случаев, но могут иметь проблемы с крайними случаями. К сожалению, в таких ситуациях вам придется уговорить компилятор / интерпретатор.

Какой из них лучше?

Сторонники декларативных языков утверждают, что такие языки позволяют программистам сосредоточиться на предметной области и писать код, который легче читать для непрограммистов. Проще написать правильный код, утверждают адвокаты. Однако компромисс заключается в том, что уговор компилятора / интерпретатора для правильного компромисса между памятью и скоростью может потребовать некоторых сложных знаний языка. Вы поймете эту проблему, если будете использовать декларативный язык, такой как R или SQL или LISP. Конечно, возможно определить новый декларативный язык, который не имеет ничего общего с компьютерами (но это может усложнить работу автора интерпретатора / компилятора). Многим математикам и исследователям чистых компьютерных наук нравятся декларативные языки.

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

С является императивным языком.

Императивный язык определяет, как делать то, что вы хотите. Декларативный язык определяет, что вы хотите, но не как это сделать; язык работает, как это сделать. Пролог является примером декларативного языка.

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

int i = 4;
int j = 5;

float f = i/j;

может показаться, что вы намереваетесь использовать число с плавающей точкой 0,80 (и, скорее всего, на декларативном языке это будет)... но поскольку существуют хорошо определенные процедуры, int/int оценивает int с использованием целочисленного деления (которое в C этажное подразделение).

это аспект явно определенного поведения, который делает C императивным.

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

§5.1.2.3 часть 10:

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

и конкретный пример из следующей части:

Пример 2. При выполнении фрагмента.

char c1, c2; /* ... */
c1 = c1 + c2; 

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

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

-> Декларативное программирование: расскажите "машине" о том, что вы хотели бы случиться, и дайте компьютеру понять, как это сделать.

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

Другие вопросы по тегам