AG>>Любой язык высокого уровня имеет свой набор библиотек. AG>>Если рассматривать С++, то это библиотеки стандартных функций ввода-вывода, библиотеки строковых и математических функций, наконец библиотека шаблонов STL.
D>Вот я и пытаюсь понять, как они устроены и могу ли я сам написать определение функции printf() в своей программе.
А что конкретно тебе даст "велосипед" под названием printf?
Этот велосипед можно реализовать миллионом разных способов...
Все из них будут работать, будут иметь свои достоинства и недостатки...
Не проще ли сделать что-то свое из примерно того же рода: например даны Фамилия Имя Отчество человека (возможно введены даже всеми строчными или всеми заглавными буквами), написать функцию которая:
1) Сделает первые буквы заглавными, остальные строчные
2) Сформирует инициалы — пример:
на входе: иванов иван иванович (или: ИВАНОВ ИВАН ИВАНОВИЧ)
на выход: Иванов И.И.
Вот простой пример обработки строк — но пример не тривиальный (как printf)
Здравствуйте, LuciferSaratov, Вы писали:
LS>Здравствуйте, AlexGin, Вы писали:
AG>>Все ЯВУ — языки высокого уровня — предполагают облегчение труда программиста, за счет АБСТРАКЦИЙ. AG>>Эти абстракции сделаны, чтобы помочь программисту сконцентрировать внимание НА ВЫПОЛНЯЕМОЙ ЗАДАЧЕ и на поиске оптимального решения ЗАДАЧ ПОЛЬЗОВАТЕЛЯ/ЗАКАЗЧИКА, а не не том, КАКОВА РЕАЛИЗАЦИЯ рутинных функций компьютера/стандартной библиотеки и т.д.[...]
LS>Это не означает, что никому не нужно знать, как реализованы функции стандартной библиотеки. Я, к примеру, сейчас работаю над проектом на С++, в котором активно используются классы, шаблоны — в общем, многие из высокоуровневых фич языка. Но при этом в этом проекте нельзя пользоваться стандартной библиотекой С и С++, да и само предназначение проекта весьма низкоуровневое. И тут как раз очень нужны знания об устройстве стандартных библиотек С и С++, о том, как реализуется их функциональность, и о том, как программный код взаимодействует с ОС.
Sorry, может я не понял ситуации у топик-стартера, но ИМХО у меня сложилось мнение, что человек просто немного не представляет основного назначения таких объектно-ориентированных языков как C++.
З.Ы. В то же время Вы не станете утверждать, что Ваш случай (в указанном выше проекте) — это пример типового программирования на C++. Это скорее редкое исключение из правил.
Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.
Поэтому, наверное, мало кто интересуется тем, как же на самом деле всё устроено. Зачем забивать себе мозг?
D>Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.
D>Поэтому, наверное, мало кто интересуется тем, как же на самом деле всё устроено. Зачем забивать себе мозг?
А устройство процессора представляете? Сумматора? Блока умножения? Как работает доступ к памяти — с диаграммами сигналов по ножкам проца?
Когда-то я это знал (для 8086) — но в программировании ценность этой информации == 0.
"Как устроена printf" — это любознательность. "Все вручную" -- это глупость.
K13, Вы писали:
K13>"Как устроена printf" — это любознательность. "Все вручную" -- это глупость.
Я любознателен, но ручную рутину не люблю.))
LuciferSaratov, Вы писали:
LS>Если стоит задача не использовать никаких библиотек, в том числе библиотек импорта, то фактически задача сведется к получению интерфейса к ОС.
LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?
D>Спасибо! Становится немного понятнее и уже интереснее.))
А что понятнее-то? Заменили один черный ящик — printf — на другой — WriteConsoleA. Сделали програму сложнее, непортируемую, и без каких бы то ни было улучшений.
D>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?
взять большой листок бумаги и сто раз карандашиком написать "лучше так не делать, а писать простой код используя стандартные функции".
потом стереть ластиком и повторять до просветления.
ситуации, где нельзя пользоваться стандартным рантаймом -- экзотика.
Здравствуйте, Deeman, Вы писали:
D>Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.
Отладчиком зайди да посмотри, делов-то. Да и всяко полезней будет, чем свой принтф писать.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Аноним, Вы писали:
А>Тут используется куча статических либ для инициализации CRT и пр. А>Для чистоты эксперимента нужно указать линкеру точку входа.
По заявкам радиослушателей вот исправленный вариант:
Здравствуйте, Deeman, Вы писали:
D>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?
Это не стиль программирования, это просто бывает нужно в некоторых достаточно редких случаях. Если можно избежать написания кода в таком стиле, то так и следует поступать.
А почитать — ну, к примеру, Джефри Рихтер, Windows для профессионалов.
И вот еще — на этом форуме используется древовидная структура сообщений, поэтому в одном сообщении нужно отвечать одному собеседнику. Так здесь принято, всем понятно и у каждого будет возможность заметить твой ответ. Я вот не с сразу заметил, мог и не ответить.
Здравствуйте, Deeman, Вы писали:
D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
отладчик отменили?
зайди внутрь printf под отладкой и посмотри, как реализован printf(CRT) в поставке твоего компилятора, если используется MSVC 2005, то по дефолту смотри "C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\"
Ничто не ограничивает полет мысли программиста так, как компилятор.
Здравствуйте, Deeman, Вы писали:
D>K13, Вы писали:
K13>>"Как устроена printf" — это любознательность. "Все вручную" -- это глупость.
D>Я любознателен, но ручную рутину не люблю.))
D>LuciferSaratov, Вы писали:
LS>>Если стоит задача не использовать никаких библиотек, в том числе библиотек импорта, то фактически задача сведется к получению интерфейса к ОС.
D>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?
Скажите, а вас не смущает, что вы не знаете как работают системные АПИ? КАК происходит вывод символов из программной памяти на экран монитора? То, что в данном примере происходит неявное линкование на kernell32.dll (и более того, любая виндоус программа неявно линкуется с ntdll.dll). Вас не пугает, что компилятор+линкер из "простого и понятно" С-кода соберет машинный код и поклеит в файл с секциями напихав его "волшебными значениями", о которых вы и не подозреваете? А система когда запустит образ будет делать с ним еще более противоестественные вещи? Вы тоже хотите сделать это сами?
Знать что происходит (в частности как работает printf) это одно, а писать на самом низком из возможных уровней это другое. Вся история программирования состоит в уходе на все более высокоуровневые конструкции (ASM — C — C++ — ну и т.д.), на каком уровне остановиться решать вам, но использование готовых конструкций/библиотек сильно облегчит жизнь. А понимать надо, да...
Здравствуйте, Vamp, Вы писали:
D>>Спасибо! Становится немного понятнее и уже интереснее.)) V>А что понятнее-то? Заменили один черный ящик — printf — на другой — WriteConsoleA. Сделали програму сложнее, непортируемую, и без каких бы то ни было улучшений.
Не совсем "заменили". На мой взгляд, printf и WriteConsoleA — два совершенно разных понятия, поскольку WriteConsoleA — это прямое обращение к операционной системе, а printf — опосредованное.
Но я нигде не говорил, что так лучше. Вопрос стоял "как это работает", а не "как сделать лучше".
Здравствуйте, Deeman, Вы писали:
D>Не совсем "заменили". На мой взгляд, printf и WriteConsoleA — два совершенно разных понятия, поскольку WriteConsoleA — это прямое обращение к операционной системе, а printf — опосредованное.
Вы не поверите, но WriteConsoleA — тоже опосредованное, это обертка над WriteConsoleW
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, K13, Вы писали:
D>>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?
K13>взять большой листок бумаги и сто раз карандашиком написать "лучше так не делать, а писать простой код используя стандартные функции". K13>потом стереть ластиком и повторять до просветления.
По-моему, это беда всех форумов. Я вот модератор, правда, на форуме музыкальном. И иногда приходят люди и спрашивают — а как устроена музыка, почему в натуральных ладах семь нот, откуда беруться искажения в ухе? И вот про новичка все думают — о, он считает, что познав искажения в ухе он начнёт писать хорошую музыку! Конечно не начнёт. И есть новички, которые это прекрасно понимают, но тем не менее хотят знать суть вещей. А сопротивление форума лишь мешает достижению этой цели, "отцы" ставят новичков "на место", убивая в них всякое разумное стремление к познанию чёрных ящиков (мол, не трогай, всё испортишь!), в результате чего произростает глупость, лень и неверные представления об мироздании.
И поэтому, пока у меня есть силы, желание и мозг мой не столь стар, я хочу знать, какие это такие поршня вертятся в двигателе моего автомобиля, зачем они нужны и как их делают. А на права каждый дурачок может сдать, как показывает практика.
Здравствуйте, LuciferSaratov, Вы писали:
LS>Это не стиль программирования, это просто бывает нужно в некоторых достаточно редких случаях. Если можно избежать написания кода в таком стиле, то так и следует поступать. LS>А почитать — ну, к примеру, Джефри Рихтер, Windows для профессионалов.
D>Спасибо! Становится немного понятнее и уже интереснее.))
Ок. Тебе понятнее.
Тогда вот тебе вопрос для размышления.
howthisworks.exe > file
Эта команда запустит howthisworks.exe и, в случае использования print, вместо консоли сохранит текст в файл file.
Вопрос:
1. При использовании WriteConsoleA это поведение сохранится?
2. Объясни, почему.