LINUX.ORG.RU

Почему «С» процедурный язык?

 


0

3

Здрасть, здрасьте люди добрые. Скажите пожалуйста, почему 'С' процедерный язык. Чего я не понимаю? По мне так его можно считать и обьектно-ориентированным. Напишите пожалуйста, если несложно, что определяет язык, как Функциональный, а что модульный, и что относит язык к обьектно-ориентированному?

Слишком толсто

anonymous
()

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

Этим он отличается от своих потомков в виде Objective-C или C++, где для создания объектно-ориентированных программ из коробки доступны необходимые средства.

Напишите пожалуйста, если несложно, что определяет язык, как Функциональный, а что модульный, и что относит язык к обьектно-ориентированному?

Встроенные средства языка доступные программисту «из коробки» и определяют.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)

Язык диктует стиль. Конечно, все полные по Тьюрингу ЯП эквивалентны, можно на хаскеле писать в императивном стиле, а на С — в функциональном. Ну так и сексом заниматься можно стоя в гамаке на лыжах. Что это доказывает?

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

Хорошо. Что значит процедурный? Мне думается что в СИ нет процедур. Процедуры в ассемблере. Тогда как он может быть процедурным? Пож не обижайтесь. Я просто хочу понять.

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

Нет, нет. Разве вы не видите отличия между процедурой и функцией?

void func(void);

Это устройство функции. Она что то получает на вход, и что то выдает на выход. Даже тут функция получает пустоту и возвращает также пустоту. Но она и получает, и выдает. Это функция.

Процедура же, по своему строению иная.

Это может быть любой кусок кода

mov $, 
...
...
mov $,

Который я буду использовать в коде. Эта часть кода под именем процедура ничего не принимает и не выдает. Нет даже намека на входные параметры

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

Эта часть кода под именем процедура ничего не принимает и не выдает.

А например, процедура (procedure) в паскале имеет входные параметры (может иметь и выходные, если по ссылке передавать). Так что твой пример - частный случай.

Практично считать процедуру частным случаем функции. А ещё был термин «подпрограмма» (тот самый subroutine, который чуть выше уже вспоминали).

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

Да не за что.

Вообще, гораздо интереснее не спорить о терминах, а писать открытый код и обмениваться им. Если тебе нравится ассемблер, попробуй написать что-нибудь для Колибри, например. Меня этот вариант не слишком привлекает из-за прибитости к архитектуре процессора: напишешь что-нибудь под интел, и всякие малины в пролёте будут…

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

А например, процедура (procedure) в паскале

Кстати, в Oxygene Object Pascal это разделение выкинули. Так как в нём всё является объектом, то там больше нет procedure и function, а только method, который может возвращать, а может и не возвращать, значение.

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

Практично считать процедуру частным случаем функции.

В Обероне наоборот всё процедурами называется в не зависимости от наличия возвращаемого значения. И это логично, т.к. процедура - это стековый фрейм и набор императивных команд, а функция - это сопоставление каждому элементу множества определения элемента множества значений.

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

Проще делить на императивный и функциональный, процедурный это ненужное уточнение которое не соответствует действительности.

anonymous
()

Ты обкурился чтоле? Схерали си объектно ориентирован? Гиде ты там объекты нашёл? Структуры это не объекты.

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

Конечно структуры не обьекты. И классы не обьекты.

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

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

Assembler
() автор топика

Его и грушей можно считать. Просто называешь грушей и игнорируешь всех кто говорит что это не груша.

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

Функция ВСЕДА возвращает значение

a=f();

Процедура может возвращать значение только в параметрах

p(a,&b);

p1();

anonymous
()

Читаю всё это, вижу сплошной хейт вокруг процедурного кода. Чем вам так, народ, не нравится процедурный код? А чем так хорош тогда ООП?

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

А чем так хорош тогда ООП?

Тем, что не надо таблицы виртуальных методов и приведение типов руками писать.

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

В Си их нет. Придётся руками конструировать через enum и union.

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

Читаю всё это, вижу сплошной хейт вокруг процедурного кода.

То ли я слепой, то ли у тебя глюки…

anonymous
()
11 января 2021 г.
Ответ на: комментарий от Assembler

Так С и называют высокоуровневым ассемблером, потому и процедурный. Процедура это «1. Порядок выполнения, ряд последовательных действий, необходимых для выполнения чего-нибудь». Просто плюсы не умеют как в Gentoo отрубать неиспользуемые куски объектов. А Си в свою очередь объект может иметь, если его создать вручную. Собственно любая команда языка С это тоже последовательность действий. Вот научатся понторезы, что создали плюсовый компилятор вырубать лишнее, тогда и появится очень медленный, но эффективный компилятор плюсов. А то у слова задница, которой они думают при создании компиляторов десятки тысяч значений и объект задница таким образом занимает слишком много времени и места, отчего программы получаются жирнее, чем должны были быть.

anonymous
()
/*Это процедура, она же в простонародии функция*/
int procedure(void)
{
   return 42;
}

/*Если не считать простых логических конструкций вроде for/if/switch то всё остальное в языке это типы данных на основе уже которых можно реализовать хоть опп хоть что-что угодно иное, но так как это не встроено в язык на уровне синтаксиса это не может быть отношением к языку, си это чистый процедурный язык, хоть и называют все процедуры функциями, хотя тут уж пофигу, хоть так называй хоть сяк*/

/*Си самый чистый,логичный и красивый язык из когда либо придуманных*/


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

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

anonymous
()
Ответ на: комментарий от Assembler
Процеду́рное программи́рование — программирование на императивном языке, при котором последовательно выполняемые операторы можно собрать в подпрограммы, то есть более крупные целостные единицы кода, с помощью механизмов самого языка.

Вики же. А теперь в чём C тут не подходит? Причём рассматривай в первую очередь структуру { ... }, а не её специализацию в виде функции или цикла.

Result-Code
()

Про ООП это инкапсуляция, наследование и полиморфизм из коробки и не через жопу. Функциональщина это математическая трактовка функций со всеми вытекающими (привет лямбдам и замыканиям), процедурная это функции как подпрограммы, императивщина это последовательное выполнение команд, по типу when something do something (но я её очень поверхностно представляю, так что могу и ошибаться). Модульное программирование это про модули, которые как бы готовые и независимые подпрограммы.

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

Практично считать процедуру частным случаем функции

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

Princesska ★★★★
()
Последнее исправление: Princesska (всего исправлений: 1)

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

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

сексом заниматься можно стоя в гамаке на лыжах

Описал всю суть ЛОРа.

Не до конца. Он не написал, с кем сексом-то заниматься!

OneManOneJar
()
Ответ на: комментарий от LongLiveUbuntu

Это искусственное разделение, предложенное Виртом и нигде не прижившееся (даже в современных диалектах паскаля типа Oxygene Object Pascal от этого избавились). write выполняется ради побочного эффекта, а не ради результата, а могла бы и вообще не возвращать результат, функции OpenGL1, например, не возвращают, код ошибки надо получать отдельной функцией.

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

Не до конца. Он не написал, с кем сексом-то заниматься!

С возвращением, Мистер D!

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

Это искусственное разделение, предложенное Виртом

Потом и Вирт от него отказался в пользу всё называть процедурами.

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

Что функция, что процедура, что метод - это синонимы подпрограммы (subroutine), но не из области concurrency (т.е. не coroutine), а как последовательность инструкций.

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

Если тебе сейчас это нужно сдавать - просто сдай так, как требует преподаватель и забей на это. А то только время потеряешь, для тебя это нафиг не нужно.

Result-Code
()
Последнее исправление: Result-Code (всего исправлений: 1)
Ответ на: комментарий от gremlin_the_red

искусственное разделение, предложенное Виртом

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

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