Перейти к содержанию
    

честно говоря, я уже начал уставать...

 

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

...

А вот это непонятно, почему тогда конечный результат получился прямо противоположный?

 

У функций одинаковый прототип, почему тогда отличаются 'подготовительные действия по вызову функций'?

отвечу вашими же словами:
один gcc знает

 

Это огромный минус - вы придумали себе идеальную модель мира и пытаетесь запихнуть в нее идеологию языка С, а она туда не лезет. Вместо того, что бы прочувствовать эту идеологию, вы заявляете, что все, что противоречит вашей модели мира является неправильным и противоречащим здравому смыслу, и объявляете это вне закона.
снова вынужден повторить: не подгоняю я, не объявляю вне закона. это вы подгоняете реальность под рамки Си, а я как раз предлагаю этого не делать, оставив все в более простом и естественном виде. тем более что даже вы доказали, что по сути разницы в размере кода нет:
Помещение всех функций в один файл и добавление static к var1/var2 дала 8876 для обоих вариантов.
то есть, как я и догадывался, компилятор оказался умнее

 

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

 

раз уж мы снова прибегаем к красочным примерам, я приведу тоже пример. вот абориген австралийский - он ничуть не смущаясь выковыривает из муравейника личинок и ест их. а цивилизованный человек как минимум перед этим принимает пол-литра виски :) но скорее он ест хорошо прожаренный бифштекс - а ведь для приготовления бифштекса надо гораздо больше усилий и стредств... при этом их цель - насытиться - одинакова, обоим их поведение кажется наиболее естественным. НО!!! обратите внимание: абориген гораздо ближе к природе - он не делает ничего, что не укладывается в примитивные рамки выживания. Си, как тут меня пытались просветить, язык, приближенный к архитектуре, и позволяет программисту вести себя, как абориген в сельве: не делть ничего, кроме самого примитивно-необходимого. о каких приличиях тут можно говорить? чтобы не сдохнуть, надо есть, а что именно и в каком виде, тем более, как это выглядит со стороны - это вторично.

 

я предлагаю быть цивилизованным, и совершать чуть больше действий, чтобы получить тот же конечный результат, что и дикарь. и все это только для того, чтобы чувствовать себя цивилизованным человеком. я предлагаю усложнять внешне (хотя и не совсем это верно - усложнять, но пусть так), сохраняя суть и результат, а не следовать неписанным правилам. ведь нигде в стандарте Си не сказано, что надо писать именно !a ^ !b вместо чего-тоиного. это кое-кто считает это лучшим, без каких-то существенных доказательств.

 

P.S. прошу всех оппонентов: не делайте равенства между ИНЫМ МНЕНИЕМ и ГЛУПОСТЬЮ или НЕЗНАНИЕМ. это несколько утомляет при чтении.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видите, какие умные компиляторы стали? А Вы код компилятора видели? Я пытался понять один кусочек кода GCC (подозревал, что там есть баг) и не понял ничего :( Уровень абстракции в том месте куда я сунулся был не сравнить с тем, что здесь подавалось как высший пилотаж.
Досадно что ничего не поняли. Не с того места начали изучение...

 

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

 

А здесь и "тусуются", по крайней мере несколько человек точно. И я, если честно, не понял вашего сарказма совсем...

Вам что-то не понравилось в моём высказывании? Или не в силах принять такой укол судьбы, что кто-то дал более развёрнутый ответ чем ваш?

Вы становитесь похожи на ARV в своём "стремлении" познать новое...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Будьте последовательны.

Стандарт предусматривает запись типа

x = x + 10

С математической точки зрения это полная ерунда, так как не может быть верно ни при каких значениях x

Добейтесь признания сообщества, что так писать нельзя.

вы опять пытаетесь мне приписать попытку свергнуть стандарт. что МОЖНО и НЕЛЬЗЯ по стандарту - я знаю, принимаю, и не протестую. заметьте, я лишь говорю, что НЕ ВСЕ и НЕ ВСЕГДА из того, что МОЖНО, СЛЕДУЕТ применять. причем кое-что не следует (в моем понимании) применять именно с целью приближения к тому самому идеалу - совпадению с логикой. вы же считаете, что если я говорю "не делай так", то это равносильно "это неверно". я такое не утверждаю.

 

смотрите, вас уже подводит привычка отказываться от математической логики в пользу Сишного стандарта!

 

дано: Вася говорит, что дважды два - пять.

 

я говорю: Вася не прав.

 

вы говорите: Вася глуп (вариант: не умеет считать)

 

 

если сказанное записать на языке Си - получится как раз то, что говорите вы, но на самом-то деле верно то, что говорю я!

 

поясню.

 

прав - это истина, не прав - это отрицание правоты.

 

умен - это истина, не умен - это отрицание ума.

 

любое отрицание истины в Си - это однозначно ложь.

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если вы [все ещё] про логические операции, то (27>0) == (1>0), и из этого никак не следует, что 27 == 1.

Или речь уже про что-то другое?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Абсолютно честно никакого абсурда.

Вижу идею: приведение целых к булу (пусть и с инверсией - не важно) и последующее исключающее или двух целых. Очень лаконично и красиво. Повторюсь - никакого абсурда.

Если честно, то тогда это недоразумение. Мы говорили о записи, в которой используется остаток от деления. Именно эту запись я предлагал Вам произнести.

 

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

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

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

Но за думающего человека спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы [все ещё] про логические операции, то (27>0) == (1>0), и из этого никак не следует, что 27 == 1.
не совсем об этом. я говорил о сравнении результатов отрицания. видимо, вы пропустили: ИКС равно НЕ НОЛЬ на самом деле обозначает непустое множество вариантов ИКС, среди которых только ИКС равное НУЛЮ будет исключено. впрочем, я повтояюсь.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Досадно что ничего не поняли. Не с того места начали изучение...

 

Перефразирую: Не говорите мне куда идти и я не скажу кто вы.

 

А здесь и "тусуются", по крайней мере несколько человек точно. И я, если честно, не понял вашего сарказма совсем...

Вам что-то не понравилось в моём высказывании? Или не в силах принять такой укол судьбы, что кто-то дал более развёрнутый ответ чем ваш?

Вы становитесь похожи на ARV в своём "стремлении" познать новое...

Что не понял - действительно достадно. Если бы рядом был человек, который бы помог сделать первые шаги - было бы хорошо. А одному с наскока не получилсоь.

 

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

Ваше высказывание мне понравилось. Мне комфортнее читать a&0x7, вы напомнили, что компилятор выдаст для a%8 тот же результат. Я Вас понял и принял замечание.

 

Более того, а знаю, что Вы, как раз, общаетесь с разработчиками GCC и пытаетесь улучшить компилятор.

 

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

 

Пора, пора закрывать эту ветку....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Отвечу, как часть мод. корпуса. Вы совершенно справедливо беспокоитесь о судьбе ветки. В этом свете особо хотел бы попросить уважаемого demiurg_spb сдерживать эмоции и не переходить на личности.

А вот по поводу некоего особо трепетного отношения именно к Вам "некоторой части мод. корпуса" - уверен, Вы заблуждаетесь. И мне очень жаль, что Вами были сделаны столь "персональные" выводы. Был бы рад, если бы Вы смогли спокойно пересмотреть суть претензий к Вам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если честно, то тогда это недоразумение. Мы говорили о записи, в которой используется остаток от деления. Именно эту запись я предлагал Вам произнести.
Хорошо. Мы поговорим о

с = (!a + !b) % 2;

Тут я виду солжение двух булов по модулю 2.

ИМХО, написано самым выразительным образом из всех возможных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо. Мы поговорим о

.....

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

Тут я виду солжение двух булов по модулю 2.

ИМХО, написано самым выразительным образом из всех возможных.

 

Ну, если это - самый выразительный... :laughing:

 

А я тут вижу присваивание переменной с остатка от деления (что, кстати, не является логической операцией!) на два суммы двух аргументов, в данном случае приведенных к булам.

О том, что результат является логическим и что он соответствует "исключающему ИЛИ", можно догадаться, лишь расшифровав эту запись и поняв, что же происходит в ходе выполнения последовательности, описанной столь причудливо.

Не пойму, для чего Вы привели ссылку, ибо там как раз говорится противоположное тому, что Вы доказываете:

 

В естественном языке операция «сложение по модулю» эквивалентна двум выражениям:

 

«результат истинен (равен 1), если A не равно B (A≠B)»;

«если A не равно B (A≠B), то истина (1)».

 

Часто указывают на сходство между сложением по модулю 2 и конструкцией «либо … либо …» в естественном языке.

 

Как по-Вашему, можно таким, естественным языком прочесть обсуждаемую запись?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто когда знешь термин сложение по модулю два то это читается очень просто (видишь сложение и видишь взятие модуля 2).

Если этого не знаешь никто не мешает написать так как предлагаете вы.

с = (!a != !b);

Никакой принципиальной разницы тут нет.

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

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

Поэтому я на автомате уже пишу конструкции подобные

с = !a ^ !b;

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

Поймите, есть разные подходы к программированию и разные задачи.

У меня за более чем 15-ти летний стаж фактически ежедневного программирования было много различных задач: от промышленных приборов и автоматики, до комплексов искробезопасных ПЛК для горнорудной промышленности и приборов для военных применений на флоте и в авиации.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут я виду солжение двух булов

то есть приведенных к ближайшему целому типу 0 и 1?

и опять в этом случае мы уходим от как такового bool к целочисленному типу

 

я не говорю, что это непонятно. Я никоим образом не утверждаю, что это абсурд, ибо машиное слово - оно и есть машинное, и процессор оперирует только ими. Также все "логические" типы - это только приведение в некий машинный вид операнда. Но ARV ратует именно за интуитивно по-человечески понятную запись, стиль Pascal не дает покоя :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Напишу еще немного. :) Во первых, я хочу сказать, что несмотря на бурную дискуссию с ARV я согласен с почти всеми его высказываниями. Различие я вижу лишь в том, что считать 'естественным, логичным и интуитивно понятным', а что таковым не является.

 

Disclamer: Все нижеслдующее никоим образом не связанно ни с какими участниками этой дискуссии

 

Что же такое 'естественое и огичное'? Давайте споросим у бубульки возле подъезда - нужно ли разделять логические и арифметические операции? Как думаете, что она вам ответит? ;) Ладно, согласен - не та целевая аудитория. Давайте спросим у программиста, но тут есть загвоздка - у какого именно? Не бывает 'сферического программиста в ваккуме'. Каждый язык програмирования построен вокруг некоторого набора принципов и правил, и наборы эти разные. И не надо аппелировать к математической логике - она напрямую не применима к языкам програмирования, т.к. они строились не для доказательства математических теорем, а для написания программ.

 

Как вы думаете, эти коды согласуются с 'здравым смыслом и математической логикой'?

 

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

 

select: aBlock
| newCollection |
newCollection := self species new.
self do: [:each |
    (aBlock value: each)
        ifTrue: [newCollection add: each]].
^newCollection

 

gcd2(A, 0, A).
gcd2(A, B, G) :- A>0, B>0, N is mod(A, B), gcd2(B, N, G).

gcdn(A, [], A).
gcdn(A, [B|Bs], G) :- gcd2(A, B, N), gcdn(N, Bs, G).
gcdn([A|As], G) :- gcdn(A, As, G).

:- initialization(main).

str2int([], []).
str2int([S|St], [N|Nt]) :- number_atom(N, S), str2int(St, Nt).

main :-
    argument_list(Args),
    str2int(Args, Numbers),
    gcdn(Numbers, G),
    write(G), nl.

 

(~R∊R∘.×R)/R←1↓⍳R

 

На возможный ответ 'что это за бред' сразу отвечу - вполне законные куски программ на разных языках, а именно - Haskel, Smalltalk, Prolog, APL

 

Давайте возмем более близкие языки - С и Pascal. Несмотря на их внешнюю схожесть (по сравнению с вышеизложенными кусками кода), они очень разные. И как это пародоксально не звучит, С более простой язык. В С уменьшено количество сущностей языка и практически убраны какие либо ограничения на использование конкретных конструкций в конкретных местах. Все описывается именно на уровне сущностей.

Например - в Pascal'е операция сравнения, присваивание и арифметика это разные сущности и используются они в разных, строго определенных контекстах. В С это все выражения, и использоваться они могут везде, где ожидается выражение. В Pascal'е все очень строго оговорено и определено. Шаг влево, шаг вправо - расстрел :)

Поэтому запись на С

int a=b==c;

вызывает у Pascal'иста взрыв мозга - как так, тут же сравнение, значит должен быть if!

И не надо аппелировать к логике и здравому смыслу - у програмистов на С и Pascal'е они будут разными. Более того, они и должны быть разными - языки же разные!

Так же становится понятными жалобы со стороны Pascal'истов на сложность С. На самом деле они жалуются не на сложность, а на то, что способы применения вроде бы понятных и тривиальных конструкций порой оказываются совершенно другими. Так же понятно, почему с Pascal'я неохотно переходят на С - не хочется вылезать из песочницы, там все так просто и безопасно ;) И понятно, почему все же перейдя на С обратно уже не возвращаются - мир интереснее, чем песочница.

 

На самом деле есть гораздо более опасная связка - переход с С на С++. Несмотря на их внешнюю практически идентичность, эти языки отличаются горадо больше, чем С и Pascal. А если неофиту еще скажут, что в настоящей ООП программе все должно быть в виде классов, то получаются жуткие классовые монстры, такие, что не в сказке сказать не вслух произнести ;)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...