Начало программирования в Виндовс 10

Кулик в кулика метит издалека.

Где бы сегодня были Библия и Коран, если бы каждому страждущему, прежде, чем приступить к вожделенному чтению, приходилось бы изучать технологию лесоповала, производства бумаги, а потом, самолично изготавливать пяток килограмм оной для своего экземпляра? Ответ очевиден.

И это не смешно. Потому, что описанная модель и сегодня де факто стандарт в программировании. Чтобы быть полностью уверенным на все 100 в том, что твоя прога действительно правильно складывает 3+1, начинать надо с написания собственного компилятора, а то и вовсе, с изобретения собственного языка программирования, как сделал это когда-то старина Ритчи. Ибо, чем дальше и больше текст твоей проги отклоняется от классического Hello world, тем более зыбкой и шаткой становится почва у неё под ногами, а достижение приемлемого результата принимает лишь вероятностный характер.

Как ты думаешь? - почему компилятор и отладчик жить друг без друга не могут? Потому, что ты тупой? -да, нет? Ну, если только в начале. Hello world в языке Go имеет размер 1 мегабайт. Солидно. Ну и скажи теперь сам, как ты в таком количестве дерьма, без местной отладки, сам, сможешь разобраться? То, что другие компиляторы делают высеры поменьше, сути дела не меняет. Если кто помнит, когда-то вся MSDOS умещалась в 64 килобайта. Но, что это была за MSDOS? - фу! И, что это за Go-Hello-world? - класс! Короче, ты понял.

Постулат ОЕ_Терешкова №0. Не хоти много из чужого ночного горшка. Хоти всё. Или пошло оно куда подальше.

Может ли правильный компилятор сделать из неправильного исходника правильный ексешник? - нет. А неправильный компилятор из неправильного исходника правильный ексешник? - да. Ибо минус на минус всегда даёт плюс. И я не шучу.

Захотелось мне, как-то, поженить Lcc32 и Yasm. Свадьба прошла успешно, пока однажды не вылезла вот эта картинка. А потом ещё и ещё - много раз.


Ну, написал я, значит, брату-Яше прям в Париж, что мол и как, и да что ж это, бляха-муха, за такое? Ответ был классическим - А зачема тю бе? Где "тю бе", это не тебе и не тибе, а тю - досада, бе - парижский вариант нашего бараньего бэ-э-э-э. К счастью(?), Lcc32 сам глотает этот свой собственный дефектный asm и компилит его без всяких ручных исправлений. На выходе - всё ОК. Брату-Яше уже 70. Понятно, что никто ничего исправлять уже не будет. Ибо немощь, альцгеймер, да и пофиг. И кто знает, на сколько случаен этот подлый баг. Ибо movl %si,%bx в объектном файле по-тихому превращается в movl %esi,%ebx вместо сообщения об ошибке. В отличие от Yasm. И это то, что буквально само вылезло само-собой, стоило мне лишь сделать шаг в сторону. А сколько в Lcc-win32 ещё всего никем и мною непознанного?! Сколько в нём ещё чего во что превращается?! Стоит Lcc32 $30. Какая занятная игрушка для тренировки внимательности! Стоит прикупить.

Постулат ОЕ_Терешкова №1. Дефектный компилятор лучше бездефектного. Ибо, первый из дефектного же исходника может сделать бездефектную прогу, второй - никогда.

Следствие №1 из постулата ОЕ_Терешкова №1 - дефектный компилятор - лучшее средство от паркинсона и альцгеймера. Для Lcc-win32, например, можно написать автоматический корректор asm-файлов. Ну, чтобы кровь в мозгах разогнать. Когда-то я для развлечения написал автоматический детектор пропущенных инструкций OrangeC. После чего полностью отказался от этого навеки-сырого компилятора.

Хорошая идея скормить дефектный Lcc32.asm Tcc. Скормил. Не дошло. Tcc не врубается в movb %bl,(,%edi). Выкинул её. Теперь, инструкция movl %si,%bx глотается Tcc наура. Очевидно, что и Tcc, и Lcc-win32 хлебали из одного не их дефектного корыта. Но у Tcc это корыто оказалось ещё и дырявым. Таковы они, многозначительные последствия идиотического синтаксиса AT&T. И такова она - лицензия GNU - сделай своё дерьмо всеобщим. Когда читаешь аннотации к программам, так они все, эти проги, ну всё могут: и боком, и раком, и стоя на голове. А слегка копнёшь, сразу поднимается собачий вой - А зачема тю бе? Да не зачема - вас е#ёт? На#уй пошли. 99%, из заявленного, в ваших компиляторах - не глядя передранные у кого-то дефекты, а я вам буду объяснять зачема мине. А мозгов тупых хватит, чтобы понять?

А ты думал, почему ракеты на старте взрываются или падают в океан? Потому, что Сталин и Берия. Исчез Арал. Но не потому, что США на территории СССР ядерные испытания проводил и Земля от этих испытаний треснула и вода в эти трещины так и утекла. А потому, что Сталин, Берия, Брежнев и Хрущёв.

С некоторых пор, в gmail завелась досадная ашиппка, связанная с невозможностью переслать zip, exe, obj и т.д. адресату. Написал я, значит, патч - простенький конвертер в текстовый формат. На Си + msvcrt.dll написал. Потестил его, значит, в разных компиляторах. Всё ОК. Но связка cl+ml+link не пошла. Ха! - думаю. Опять Майкрософт не того. Закинул патч в OlyDbg, потыкал, запустил. Всё ОК. Закинул в исходную папку патчи от других компиляторов - ни один не работает. Значит, дело в названии папки или её содержимом. Я неопытный программист. 2 дня ушло у меня на поиск безусловно верного решения. И вот, что я скажу. Прежде, чем начинать биться головой о стену и размазывать сопли по щекам или идти вешаться, закинь свою прогу в простую, пустую и понятную системе папку C:\000 и потесть её там, для начала. Хотя, папка C:\BullShitMS будет по-адекватнее. :)

Постулат ОЕ_Терешкова №2. Правильные программы в неправильных папках работают неправильно.

Следствие №1 из постулата ОЕ_Терешкова №2 - чтобы позволить определять свою судьбу полиграфу, надо быть конченым идиотом.

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

int main(int argc,char *argv[]){

unsigned char ch[]={48,49,50,51,52,53,54,55,56,57};

unsigned char buffer_in[2048];

unsigned char buffer_out[4096];

как тут же выяснится, что твой компилятор на столько тупой и подлый, что отказывается сам обсчитать даже указатель стека. Для этого ему зачем-то требуется левая подпрограмма. А сам он, падла, тыкнуть строчку subl %eax,%esp в код не может. И нахер эта строчка здесь вообще нужна? А что символизирует этот маразм, даже сам Брат-Яша-Парижский не скажет - А зачема тю бе? В MSVC, TCC и увизде - точно так же. И только PCC подобной хернёй не страдает. Уважаю.

_main:

pushl %ebp

movl %esp,%ebp

.extern __stackprobe

movl $6137,%eax

call __stackprobe

pushl %ebx

pushl %esi

pushl %edi

.....

__stackprobe:

subl $4096,%esp

subl $4096,%eax

test (%esp),%eax

cmpl $4096,%eax

jnb __stackprobe

subl %eax,%esp

test (%esp),%eax

ret

Кстати, __stackprobe - это в Lcc32. __chkstk - это в MSVC, PellesC и TCC. ___substack - это в cc386 и OrangeC. __chkstk_ms - в GCC. В Dmc шаманство все сие происходит прямо внутри кода. Суть одна, а названия и степень путаности - разные. Препод мне говорил, что всё делается только для удобства пользователя. Нашёл дурака. И только PCC величаво плюёт на всё это дело с высокой горки - восхищаюсь и хвалю. Во всех этих подпрограммах нет никакого смысла, кроме реализации желания напаскудить. В начале цикла статей была оставлена вилка - "...то ли по недомыслию, то ли из жадности..." Абсолютно очевидно, что никакого недомыслия и в помине нет. Остаётся жадность. Кстати, stdio.h от Lcc32 подходит ко всем компиляторам. Чего не скажешь, например, про stdio.h от GCC. Язык Си - он такой, везде разный. Особенно, в GNU.

И чего у вас ракеты падают и самолёты горят? В отношении локальных массивов все компиляторы Си одинаково тупые. Долбаные копирасты. Понятно, что после таких объяв, просто так такой объектник нигде уже не слинкуешь. Даже по месту. Названия функций с локальными массивами, при этом, могут быть любыми - значения не имеет. char *argv[], тоже, не однозначен - одни игрушки требуют одну звёздочку, другие - две. Расскажите мне ещё что-нибудь про совместимость и переносимость. Буду я ещё, без особой нужды и допиливания компилятора, пользоваться локальными массивами в Си? - никогда! Кстати, Lcc32 я уже допилил. Прювет Поцольдам.

И ещё пример. Такое объявление

#include <stdio.h>

int main(){const int N = 11; int mas[N][N], i, j;

почти везде потянет за собой загадочную функцию extrn alloca, которой нет в msvcrt.dll. А вместе с alloca в твой ексешник придут 40к какой-то никому не нужной фигни из местной либы вместо одной простой и понятной инструкции sub esp, 500. Интересно, что такое объявление

#include <stdio.h>

int main(){const int N = 11; int mas[11][11], i, j;

никакой extrn alloca нигде не потребует. Понятно, что всё это от большого ума, но можешь на всякий случай уточнить у господ аффторов. Хотя, ответ известен уже - А зачема тю бе? А если тюбе потребуется массив из 400к целых, то, без дополнительных подстроек, стеком ты уже всё равно не обойдёшься. Прювет Поцольдам ещё раз.

Постулат ОЕ_Терешкова №3. Компилятор твой - враг твой.

Может показаться, что возня со всем этим компиляторным мусором напрасная трата времени. Так и есть. Но только так и можно приобрести осознанность, к которой на словах так тянутся все. Ну, чтобы никому не верить и больше понапрасну ощупью не искать. К примеру, мне удалось таки выяснить почему не работал мой конвертер. Дело оказалось в именах и одной тупой особенности FAT/NTFS запущенной в обиход в далёком 1981-м году, когда никакими папками на пятидюймовых дискетах ещё и в помине не воняло. Да так всё и осталось. Добытое Знание открывает известный простор для подлянок и порчи крови особо выпрашивающим. Тем более, что молчаливость Майкрософт способствует этому более, чем всегда.

Постулат ОЕ_Терешкова №4. Файл и папка в одном каталоге не могут иметь одинаковые имена.

Следствие №1 из постулата ОЕ_Терешкова №4 - определить о файле или о папке идёт речь по названию C;\temp наличными средствами языка Си в 2020-м году определить не возможно. Ибо пофиг. Ибо, язык Си не имеет дела с папками вообще - только с файлами. Между тем, как писать в файл можно, а в папку нельзя. Со всеми вытекающими.

Естественно, о деталях я умолчу. Ибо, Говна в этом божественном мире и так хватает, а новое на подходе. Никогда не видели, как папки "самопроизвольно" переименовываются в имена вновь создаваемых файлов? Восхитительное зрелище. Переименовываешь файл, но переименовывается папка. Потому, что - смотри постулат четвёртый. И только уникальная заторможенность вин10 позволяет рассмотреть этот процесс воочию.

Постулат ОЕ_Терешкова №5. Написание операционной системы - тонкое искусство поддержания дерьма в максимальном количестве так, чтобы "наши" люди были постоянно нужны, но и система всё ещё не тонула окончательно. Операционка? - это тебе не холодильник(включил и пользуйся).

Постулат ОЕ_Терешкова №6. Программирование - это искусство обхождения дефектов оборудования и операционной системы.

Постулат ОЕ_Терешкова №7. Лучший способ изучить язык - написать самому его бездефектный компилятор и рантайм. А заодно и операционку под них.

Nils M Holm - The SubC Compiler, http://www.t3x.org/subc/index.html . Так вот, на этой страничке есть кое-что скачать. В архиве subc-dos.zip приведен список ограничений SubC Compiler, которые Нилс Холм к 2014 году так и не смог преодолеть. При этом, Нилсу ничего не мешало и ничего концептуального не надо было ни выдумывать, ни изобретать. Денис Ритчи не только всё выдумал и изобрёл с 0, но и реализовал. Сам. Во время обеденных перерывов. Какой молодец! А Шекспир, будучи приказчиком в лавке, написал Гамлета и всю остальную кутерьму, пока сухари за ужином жевал. Бывает. Но почему же не с Нилс Холм? Печально, так же, что GCC и PCC не умеют правильно рассчитывать размеры comm-массивов целых, но это, видимо, потому, что писал их, тоже, не Шекспир. Оба эти компилятора являются основными во Free BSD. А следовательно, Free BSD - это очень надёжно.

Постулат ОЕ_Терешкова №8. Умные не ошибаются. Правило, писать тесты раньше самой программы, существует только для дураков.

А теперь, вернёмся к нашим баранам. Не запрещала бы Google zip, exe, obj - не было бы и этой статьи. Не знаю, была бы жизнь хуже или лучше, но не надо было водку трогать. Правда, и забыченность __stackprobe, __chkstk, ___substack, __chkstk_ms, тоже, помогла, но всё равно - не надо было zip, exe и obj трогать.

ОБЛАКА - БЕЛОКРЫЛЫЕ ЛОШАДКИ

Мы рождены, чтоб сказку сделать былью. Так оно и есть. Но не все. Многие, чтобы ставить палки в колёса. И не только в колёса. А то и, вовсе, откровенно от апельсинов отгонять. Каждый действует в соответствии со своими конструктивными особенностями. Воровка никогда не станет прачкой, людоед - миссионером, а Запорожец - Лексусом. Согласен? Возьмём для примера GNU. Узнал я тут недавно с какой злобой GNU относится к Облачным сервисам и Облачным вычислениям. От самой GNU узнал.

А чтобы ты понимал о чём идёт речь - просто вспомни. Заходишь ты, значит, такой на Переводчик Гугл, закидываешь туда свой сырец и получаешь через мгновение, в ответ, готовый каркас, а то и вовсе - сразу законченный перевод. Зависит от того на сколько ты сам хорош в родном языке. И всё это, совершенно бесплатно - только за трафик. Что может быть для GNU ужаснее?

В чём состоит идея? Не для тебя, но глобально. Где-то на далёком сервере лежит востребованная многими компьютерная программа, к которой организован всеобщий доступ. Поэтому, зовётся она уже не программой, а сервисом. И что при этом происходит? Не для тебя, но глобально. Во первых - это удобно. Во вторых - утилитарно. В мире освобождается огромное количество места на жёстких дисках, которое бы иначе заняла эта программа. Согласен? Когда происходит обновление, обновляется один сервер, а не сразу сто тысяч миллионов. И ты лично в этой ненавистной процедуре ну никак не участвуешь. Сравни, для примера, с Виндой 10 и ея бесконечными, внезапными и не отключаемыми обновлениями. Экономия твоего трафика и твоего времени - сто тысяч миллионов раз, налицо. Плохо всё это или хорошо? Я считаю, что хорошо. И люди, которые это организовали, тоже, считают, что очень хорошо. Возможны ли на этом пути издержки? - как и везде.

А теперь, давай, вспомним с чего все эти Ритчи и Столманы сами начинали. В далёком 1970-м году у них не было персоналок. Эти персоналки не только были им не по-карману, персоналок тогда ещё вообще не было. В универе или на фирме стоял один здоровенный комп, размером с большую комнату, доступ которому осуществлялся с помощью терминалов. И все, кто принимал участие в этом все святейшем таинстве, страшно этим гордились - творили Историю, как говорят. Буквально. И сам Столман, бывало, лукаво лебезя, ползал перед имущими на коленках, лишь бы ему дали эти заветные клавиши потыкать. И он не считал, тогда, это рабством или какой-то не свободой. Таковы они - человеческие хочушки. Чего ради них только не сделаешь, верно?

Как всё у Столмана изменилось с тех пор! А ничего и не изменилось. Просто, тогдашняя зависть окончательно разъела парню душу. Ибо, сказано же - не метайте бисер перед свиньями. И вообще, им его не показывайте. Иначе, оборотившись, попрут они вас ногами. История повторяется, а мир просто возвращается к истокам. Будет один всемирный здоровенный комп, размером со стадион, с супер операционкой по типу фильма "Она", у нас в руках терминалы, а жизнь - гораздо более отвратительной и жестокой. Аксиому - Радио есть, а счастья нет - пока ещё никто не отменял. Но в любом случае, хорошо, что Столман в этом деле Облаколизации всей Земли не участвует и вот почему.

Во первых, за 40 лет GCC так и не научился адекватно или хотя бы единообразно писать .comm-переменные в ассемблерный файл. А во вторых, потому, что Линух - это GNU. А большинство серваков - это Линух. И именно на базе Линух реализован NAT - механизм, благодаря которому ты не попадёшь на свой собственный комп никогда, не заплатив предварительно за дополнительный IP. И именно на этой удивительной фиче, в том числе, построен весь теперешний бизнес с продажей хостингов и все эти бесконечные капчи, по поводу того, что твой придурок-провайдер подвесил весь город на один единственный IP. Какая тут нах свобода? Ну чем бы нас-дурачков без этого NAT ещё контролировали? Всё, что угодно, но не второй бесконтрольный fido net. Бесконтрольный=свободный. А всякие там Аськи, Вк, ФейсБук, Телеграмм - сколько угодно, пожалуйста. Или бесконтрольный=бесконтрольный?

Только азиатки в порно фильмах сами срут в свой собственный рот. И Столман. Хорошо ещё, что хоть Tor пока жив и torrent, пока ещё.

Покончим со Свободой. Горячо любимый мной Андрюшка Столяров написал о свободе целый опус. Подробненько так написал, разбирая все ейныя виды и сорта. Мой мозг на много скромнее и из всего известного, видит только два. При отсутствии прямого рабства, как такового, Первая свобода - внутренняя - более-менее успешно водить за нос всех остальных и в первую очередь самого себя, всегда. И Вторая свобода - внешняя - когда никто никого занос не водит и даже не пытается водить, и не собирается, никогда. Тогда первый вид свободы не требуется, но тут сразу же наступает скукота и Застой, как в СССР. Все остальные виды свободы, изобретённые досужими "мыслителями" для того, чтобы сделать рабство "тех рабов" окончательно безнадёжным, суть вторые имена насилия.

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

Если не получается, переходят в режим ожидания - живут надеждой кого-нибудь отиметь, если не в масштабах страны, как Горбачёв или дефолты, то хотя бы ближнего своего, как супермаркеты и все бизнесмены-реализаторы на рынке. Известно, что надежда не умирает раньше хозяина. Поэтому, второй вид свободы сам собой не наступает никогда. СССР, изначально построенный исключительно на освобождённом от оплаты рабском труде, лишь при Брежневе, начал превращаться в то самое исключение. А всякие там Иисусы, с их Христовой политграмотой, заканчивают на кострах или крестах. Каким может быть Прогресс в обществе, где 100% населения озабочены одной мыслью - обобрать ближнего своего? А если кто чужой(не Билл Гейтс) и преуспеет в этом многотрудном деле, сразу же возникнет Государство и предложит всё отдать. А для того, чтобы не надо было лично к каждому мелко-умному ходить, существуют инфляция и дефолт, на худой конец - революция.

Чтобы понять на сколько ты изначально зависим и не свободен, достаточно вспомнить, что даже трусы, которые прикрывают твою наготу сделал не ты сам и не сумеешь. Особенно, если с посева льна начать и с добычи руды и угля для производства швейных игл. Для огромного количества населения, так называемая, свобода отличненько себе умещается в пространство между гастрономом и унитазом. А большего они и не хотят. И особенно не хотят понимать, что вся их теперешняя свобода-безответственность-разгильдяйство основана на достижениях современной цивилизации. Закинь их по одному на необитаемый остров и сразу всей их такой свободе придёт конец. Или поймал рыбку, или сдох. И так каждый день, без выходных. Но и на острове свобода есть - рыбу эту никто не будет отбирать, налогом облагать, за неё штрафовать и т.д.

Не лезь к людям. Не мешай им. Е#ут они себе друг-друга потихоньку и пусть е#ут. Главное, что не тебя - хотя, это иллюзия. Каждый твой плевок, каждая твоя сопля, каждый твой пук существуют в этом мире лишь для того, чтобы делать богатых ещё богаче, а бедных ещё беднее. Только и всего. Забудь про Свободу. Занимайся своими делами. И про свободу в стиле GNU, тоже, забудь. Среди всех свобод, в человеческом обществе легче всего реализуются только две - замёрзнуть от холода и с голода умереть. Свобода, это для граждан. А мы, в лучшем случае, - рабы. Вне зависимости от того кто бы, что бы об этом ни думал. Всё понял?

Должен ли раб при этом любить своего господина, даже если этот господин - Столман? - вопрос конечно интересный. Ибо, холуй и есть полностью довольный своим положением раб. Хотя, в привычном тебе демократическом обществе, раб - это привилегия, высший комсостав. Этих рабов хотя бы кормят, а мы - простое мясо, которое, чтобы не сдохнуть, должно всю жизнь денно и нощно бегать, прыгать и выше своей головы скакать. Покой нам и не снится. Всё пока ясно?

И если метрополия и даёт тебе "бесплатно" какой-то программный продукт, то только, как инструмент с помощью которого, потом, будет иметь тебя и иметь. И никакие Столманы не в силах этого отменить и не собираются, и максимально этому способствуют. Все системы автоматического штрафования и блокировки зарплатных карт базируются именно на Линух. А ты эту операционку бесплатно поддерживаешь и развиваешь. Не останавливайся, старайся. Ведь, Ты меняешь Мир!

Ты - зэк, который собственными руками строит свою тюрьму, а заодно и всем остальным. Спасибо. Но не все просили. Я же тебе говорил - каждая порция говна, которая вываливается из тебя, вываливается только для того, чтобы богатые становились ещё богаче, а бедные ещё беднее, но ты не верил. Теперь ещё и автоматически. Вы многого добились. Молодцы!

Такая она - плата за Контр Страйк, Android, YouTube, "бесплатные" музыку, кино и картинки. Поздно уже GPRS-5 крушить и отменять. Творения пожирают своих творцов. Как и требовалось - автоматически. Так это тупые творения. А что будет, когда они подтянутся до уровня Терминатора и начнут селекционировать человеков как в I am mother, наконец?

В Таскиги на живых неграх свободно изучали сифилис 40 лет подряд. Потом свободно извинились, что не на всех неграх, а только из Таскиги. "Статус этих людей не вызывал этических дебатов. Они были объектами, а не пациентами, клиническим материалом, а не больными людьми." И это не фашизм, это демократия за долго до фашизма. Свободно взорвали Херосиму. Во Второй мировой свободно вырезали 100 млн. человек, в Первой - 21.5 млн. Во Вьетнаме свободно разливали горящий напалм по головам.

Что ещё вы хотите знать о Свободе, само-кузнецы собственного счастья? - зачем в Венгрии кончали казаков-собак или когда Украину, как Югославию, начнут окончательно зачищать? Сдавайся, Враг! Умри и ляг! Вот только леса почему-то, тоже, свободно горят. А за ними и пшеничные, и гречневые поля. И домики. И тоже - очень свободно.

Посеял ты такой пшеничку, а собрал её огонек. А у тебя должок в банке. Земелька твоя - тю-тю. А дрон-поджигатель сам банк и послал. Но не сам сам, а заказал. По интернету. И даже не заказывал. Всё автоматом. Единая база прокредитованных + единый земельный кадастр. Слышал историю о том, как бабе на огороде в Пакистане дрон ракетой задницу разворотил? А управлялся тот дрон то ли из Сиэтла, то ли из Бостона. А дроны с кумулятивными зарядами и функцией опознавания фейса? Короче, ты понял - в этом мире только Столман свободным и может быть и то на словах. Хорошие времена грядут!

COVID-19, опять же, - сплошное олицетворение свободы. Не зря ты Линух развивал. Хочешь сказать, что у тебя нет долгов? - появятся. А после второго поджога, земелька - тю-тю. А Массачусетс - далеко. Ой, как далеко. Не слушай Столмана - сиди тихо.. на Облаках. Либо ты - либо тебя. Но пока-что - только тебя. И весьма успешно.

Поговорим лучше о компиляторах. Если ты девственник и это твой первый раз - выбери Pure Basic - будешь благодарить. Если девственник, но чувствуешь склонность к Си - выбери TCC. Раз в 100 лучше, чем GCC и помещается в 100 килобайт. Познай премудрость управления компилятором из командной строки именно с TCC. Станешь опытнее, переходи в MSVC - приобретёшь профессию. Из ассемблеров, тоже, - три. MASM, как продолжение MSVC. YASM, как незаменимый универсал в мире GCC. И FASM, как самый лёгкий и самодостаточный из всех трёх. Есть ещё много чего, но я о нём уже много раз упоминал - PellesC, lcc-win32, Pcc, cc386, Uasm, GoAsm. А на этой страничке http://asmgges.chez.com/index.htm находится совершенно невероятная сборка NASM и ещё трёх ассемблеров.

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

Но только не жди, пожалуйста, одного. Что откроешь ты папку c:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\, увидишь там кучу исполняемых файлов, а к ним, там же на месте, файлик с описанием того, что мол за хрень тут лежит и для чего предназначена, хотя бы. Нет, в MSVC такого не будет, нигде и никогда. Не за то ты свои $2000 Microsoft платил. Это же Си! А Си - это Квест. Или, что вот прям так с ходу поймёшь такую шифровку-белиберду #include &lt;windows.h&gt в каком-нибудь PDF-е;. Это же Си! А Си - это Квест. А компилятор, как чужая душа, - потёмки. Возьмём простую программку и откомпилируем в MSVC через ассемблерный файл и свяжем с msvcrt.dll.

#include <stdio.h>

int main(int argc,char *argv[]) {

int count ;

//------------------

for (count=0;count < argc;count++) {

printf( "Argument %d = %s\n",count,argv[count]);}

//------------------

getchar();

return 0;}

Запускаем, а она вылетает с ошибкой. Ибо, getchar у нас такой:

; Line 9 getchar();

mov eax, DWORD PTR __iob+4

sub eax, 1

mov DWORD PTR __iob+4, eax

js SHORT $L807

mov ecx, DWORD PTR __iob

movsx edx, BYTE PTR [ecx]

and edx, 255 ; 000000ffH

mov DWORD PTR tv78[ebp], edx

mov eax, DWORD PTR __iob

add eax, 1

mov DWORD PTR __iob, eax

jmp SHORT $L808

;_____________________________________________________

$L807:

push OFFSET FLAT:__iob

call __filbuf

add esp, 4

mov DWORD PTR tv78[ebp], eax

;_____________________________________________________

$L808:

; Line 10 return 0;

xor eax, eax

Берём ключик /MD и теперь getchar у нас такой - call DWORD PTR __imp__getchar, а printf такой - call DWORD PTR __imp__printf, хоть уже и не вылетает. Теперь меняем шапку вот так -

#include <stdio.h>

extern int getchar(void);

extern int printf (const char *,...);

И ничего не получается. Убираем #include <stdio.h> и всё сразу становится на свои места - call _getchar и call _printf. Не просто просто, а очень просто. И всё это натихаря. Это к вопросу - А можно ли без #include <>? Не, ну реально - есть за что $2000 заплатить. Си - это Квест. А компилятор, это и квест, и, как чужая душа - потёмки. И хорошо, когда компиляторов у тебя несколько и разных. Скучать не придётся. :)

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

Видишь, как тут всё красивенько и на русском. Ещё одна свобода быть оттраханным и при помощи кодировок. Пишешь в блокнотике на русском, а в консоли - крякозябры. Говоришь, что Консоль тупая? - согласен. Говоришь, что Microsoft тоже тупая? Тупая и ленивая? За 30 лет могла бы уже и какой-нибудь cmd+.exe написать? Не согласен. Ведь ты тогда мучаться перестанешь. И чито это будет для тебя за жизнь? Не жизнь - Застой! А так, всё время чё-нить новенькое узнаёшь, стараешься. Сказано же - Квест!

Чито делать практически? Никаких хедеров Аля-урус, как добрые люди советуют, подключать не надо, да и не везде они есть. Берёшь AkelPad или любой другой, который может работать с oem(dos 866) кодировкой, и сохраняешь свою прогу именно в ней - в oem(dos 866). После первого сохранения файла, далее, при каждом его повторном открытии, AkelPad распознаёт всё сам - автоматически, так, как надо и никаких дополнительных телодвижений уже не требует. И никаких тебе крякозябров в консоли.

Делаешь в AkelPad чёрную бумагу и серые чернила, как в консоли, чтобы сетчатка от монитора не горела, ставишь Comic Sans MS, чтобы буковки эль от единичек отличать, 20-й размер шрифта, чтобы хрусталик не трещал и не сыпался - и вперёд. Не, ну может твоя IDE из коробки, тоже, поддерживает русскую oem в консольных приложениях на автомате. Тогда молчу. Но обычно - нет. Зачем, вообще, нужна IDE? Как зачем! Ведь именно за ней и прячут всю несостоятельность компилятора и всю его наготу. (При цитировании, ссылка на меня обязательна :)

А как тебе такая отфонарная фраза - "Константа FOPEN_MAX ограничивает число одновременно открытых файлов." И как же она их ограничивает, сама по себе, особенно, когда её никто ни о чём не спрашивает? Хорошо, что хоть хлеб пока ещё не печёт. А дети верят. Но ведь это же Си! А Си - это Квест!

Эта прога в MSVC 2003/08/10 так и не ожила :(. Может я флажки какие не выставил :). Но только этот квест мне уже окончательно надоел :). Может тебе повезёт :)

#include <stdio.h>

int main(void){

for (int i = 0; i< 2;i++) {

printf("outer i is %d\n",i);

int i = 87;

for (int i = 0;i<2;i++) {

printf("i=%d\n",i); } }

return 0; }

А почему ниже следующая прога в MSVC не работает? Потому, что если заработает, то как же тогда тебя и пасти?

//d.c (c) Tereshkov_OE

//PellesC

//sites.google.com/site/excelmidi

extern int printf (const char *,...);

void bb(void){_asm {db 'Hello world!',10,0}}

//------------------------------------//

void aa (void){

int cc;cc=(int)bb;cc=cc+3;

printf((char *)cc);

return;}

//------------------------------------//

int main(void){

aa();

return 0;

}//------------------------------------//

Перечитал я тут себя :). Подумал. И решил прислушаться к словам мудреца:

"Дорогой студент — не пиши код.

Если пишешь — не сохраняй.

Если сохраняешь — не выкладывай.

Если выложил — не в интернет.

Если в интернет — удали.

Если удалил — сделал добро людям."

Подписываюсь под каждым словом - (какой умный!, как всё сообразил!, слушай, а!) - в пещеру, к мамонтам, к оспе и к чуме! Но действительно, а нахера? Ведь есть же Столман! Пусть он и корячится, свободно(безоплатно). Дворник, не мети! Повар, не вари! Маршрутчик! - не вози! Работодатель - не плати. Зеленский - оштрафуй! Сантехник, бл#, ну не выгребай ты из под них говно! Перестань! Наконец, и до меня дошло - нахрена это всё?

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

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

(с) Терешков Олег Евгеньевич. Ноябрь. 2020

Поскольку, писать больше не о чем, подведём итоги. Идеальных компиляторов нет и не будет. Зато, полно с причудами. И у каждого из них эти причуды свои. Начинать с постижения всех этих их выворотов вряд ли стоит. Поэтому берёте что-то адекватное и толчётесь в нём. Обычно, даже хитро сделанные, но здравые писатели компиляторов подтягиваются к MSVC, пытаясь обеспечить хоть какую-то совместимость. Тасовать объектные файлы между компиляторами у вас не получится потому, что ленинцы, в этом смысле, идут каждый своим путём, как батарейки для мобильных телефонов. Поэтому, даже не заморачивайтесь. Попробуйте попользоваться пакетом, как он есть. И только потом переходите к извращениям. У меня на компе лежат минимальные сборки MSVC, PellesC, Lcc32, PCC, TCC, cc386. И все из командной строки. К каждому из них прикручена моя IDE на 2 кнопки и цветной редактор. Я с ними разобрался. Мне хватает. Моя первая и не проходящая любовь - TCC, советую. Сейчас, я препарирую Lcc32. Зачема такое изобилие? Для кругозора. Потому, что Си везде разный. И в каждом компиляторе он свой. С такой сторочкой TCC может справиться

asm (".byte 'P','i','d','o','r','a','s','i',10,0"); а Lcc32 и Yasm - никогда.

Единственное, чему следует уделить самое пристальное внимание, так это, чтобы ваше увлечение не отнимало у вас слишком много времени, будь то программирование или пива питиё. Встроенный ассемблер прекрасен, но язык высокого уровня опережает его куда, как далеко. Все выше названные, кроме TCC, способны выдать ассемблерный листинг. Обязательно позаглядывайте в него. Вряд ли вы напишите лучше, особенно, на автомате. Начинайте программировать без #include <stdio.h>. И только окончательно разобравшись, продолжайте использовать и его. Тогда вы, кроме знаний и навыков, получите и радость, и настоящее удовольствие от лёгкости бытия. В случае затруднений, пишите в PureBasic. После, адаптируйте в Си. Ну, а остальное - детали.

Много бумаги испачкано по поводу структурирования программ. Но никто из мухоморов ещё не догадался структурировать цветом. Мне это вполне удалось. Пишешь в одну строчку(64 знака) почти без пробелов, а выглядит великолепно, компактно - всё перед глазами и не надо ничего постоянно крутить. Быть добру.