Здравствуйте, Deeman, Вы писали:
VC>>не совсем VC>>код printf (скомпилированный) обычно берется из библиотеки, поставляемой с компилятором
D>А как бы его посмотреть? Или даже — как бы его прям в свою программу и вставить, без использования этой поставляемой с компилятором библиотеки?
Уважаемый Deeman, определитесь, пожалуйста, какую Вы ставите перед собой цель?
a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере)
b) Изучить программирование на языке высокого уровня C++ ?
Друзья, тыкните новичка носом в ключевые слова для поиска!
Изучаю С++ и по ходу обучения появилось желание постичь фундаментальные основы. Желание сформулировалось задачу следущего содержания:
"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).
Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Здравствуйте, Deeman, Вы писали:
D>Друзья, тыкните новичка носом в ключевые слова для поиска!
D>Изучаю С++ и по ходу обучения появилось желание постичь фундаментальные основы. Желание сформулировалось задачу следущего содержания:
D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).
D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Любой язык высокого уровня имеет свой набор библиотек.
Если рассматривать С++, то это библиотеки стандартных функций ввода-вывода, библиотеки строковых и математических функций, наконец библиотека шаблонов STL. Если немного расширить область практического применения С++, то следует обратить внимание на библиотеки классов MFC и VCL.
Здравствуйте, Deeman, Вы писали:
D>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?
Это не стиль программирования, это просто бывает нужно в некоторых достаточно редких случаях. Если можно избежать написания кода в таком стиле, то так и следует поступать.
А почитать — ну, к примеру, Джефри Рихтер, Windows для профессионалов.
И вот еще — на этом форуме используется древовидная структура сообщений, поэтому в одном сообщении нужно отвечать одному собеседнику. Так здесь принято, всем понятно и у каждого будет возможность заметить твой ответ. Я вот не с сразу заметил, мог и не ответить.
AG>>Любой язык высокого уровня имеет свой набор библиотек. AG>>Если рассматривать С++, то это библиотеки стандартных функций ввода-вывода, библиотеки строковых и математических функций, наконец библиотека шаблонов STL.
D>Вот я и пытаюсь понять, как они устроены и могу ли я сам написать определение функции printf() в своей программе.
Можешь, конечно. Кстати, если речь о Visual C++, то CRT (runtime-библиотека C, которая содержит printf) давно поставляется в исходных текстах вместе со студией. Так что, возьми, да посмотри, никто из её текста секрета давно уже не делает.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.
Поэтому, наверное, мало кто интересуется тем, как же на самом деле всё устроено. Зачем забивать себе мозг?
Здравствуйте, Deeman, Вы писали:
D>Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.
Отладчиком зайди да посмотри, делов-то. Да и всяко полезней будет, чем свой принтф писать.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
D>Спасибо! Становится немного понятнее и уже интереснее.))
А что понятнее-то? Заменили один черный ящик — printf — на другой — WriteConsoleA. Сделали програму сложнее, непортируемую, и без каких бы то ни было улучшений.
Здравствуйте, Deeman, Вы писали:
D>Не совсем "заменили". На мой взгляд, printf и WriteConsoleA — два совершенно разных понятия, поскольку WriteConsoleA — это прямое обращение к операционной системе, а printf — опосредованное.
Вы не поверите, но WriteConsoleA — тоже опосредованное, это обертка над WriteConsoleW
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Deeman, Вы писали:
D>Друзья, тыкните новичка носом в ключевые слова для поиска!
D>Изучаю С++ и по ходу обучения появилось желание постичь фундаментальные основы. Желание сформулировалось задачу следущего содержания:
D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).
D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
ты определись:
1. не использовать библиотек
2. не использовать инклюдов
если 2., то легко:
int printf( const char *format, ... );
int main(void)
{
printf("Hello, World!");
return 0;
}
VC>ты определись: VC>1. не использовать библиотек VC>2. не использовать инклюдов
Да, под библиотеками я имел в виду заголовочные файлы. Обычно подобная минимальная программа содержит ссылку на <stdio>, в которой содержится определение (или только объявление?!) функции prinf(). При этом мне понятно, что в коде надо писать что-то, что понимает ОС.
Здесь содержиться лишь объявление printf(). То есть, когда программа скомпилирована и запущена, то этот самый printf как бы является указанием ОС, чего мы от неё хотим, правильно я понимаю?
Здравствуйте, Deeman, Вы писали:
D>Здесь содержиться лишь объявление printf(). То есть, когда программа скомпилирована и запущена, то этот самый printf как бы является указанием ОС, чего мы от неё хотим, правильно я понимаю?
не совсем
код printf (скомпилированный) обычно берется из библиотеки, поставляемой с компилятором
Здравствуйте, Deeman, Вы писали:
VC>>не совсем VC>>код printf (скомпилированный) обычно берется из библиотеки, поставляемой с компилятором
D>А как бы его посмотреть? Или даже — как бы его прям в свою программу и вставить, без использования этой поставляемой с компилятором библиотеки?
поищи в инете реализацию printf, наверняка найдешь, и не одну
Здравствуйте, AlexGin, Вы писали:
AG>a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере)
причем тут ассемблер? в MSVC, например, практически все написано на С/C++ (может быть некоторые для оптимизации и на ассемблере, но это не обязательно)
Здравствуйте, Deeman, Вы писали:
D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).
С компилятором идет стандартная библиотека.
Так что когда ты пишешь #include <stdio.h> или #include <iostream>, ты один на один с компилятором и не используешь никаких сторонних библиотек.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, AlexGin, Вы писали:
AG>>a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере)
СМ>причем тут ассемблер? в MSVC, например, практически все написано на С/C++ (может быть некоторые для оптимизации и на ассемблере, но это не обязательно)
Конечно, можно и без ассемблера — все писать на простом С
Но — главный вопрос: Зачем изучать C++ в этом случае? Лично мне — непонятно
ИМХО любое изучение нового языка/технологии и т.д. должно преследовать точную и конкретную цель.
Здравствуйте, Deeman, Вы писали:
D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).
Как уже говорилось коллегами, #include вставляет заголовочный файл в конкретный компилируемый файл, а не указывает, какие библиотеки использовать или не использовать (последнее задается ключами компилятора).
D>Существует ли решение?
Под Linux, насколько я помню, решение состоит в ассемблерной вставке, генерирующей прерывания.
D>Как, чёрт побери, конкретно работает функция printf()?
Вызывает соответствующие функции операционной системы, так что оно зависит от конкретной платформы. А как иначе?
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Здравствуйте, Deeman, Вы писали:
D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Конкретно она работает так: формирует строку на основе форматной строки и остальных аргументов, далее, используя интерфейс к ОС, выводит содержимое этой строки на стандартный вывод.
Если стоит задача не использовать никаких библиотек, в том числе библиотек импорта, то фактически задача сведется к получению интерфейса к ОС. В частности, в VC++ есть расширение синтаксиса под названием __declspec, чем можно воспользоваться. Получится вот так:
AG>Любой язык высокого уровня имеет свой набор библиотек. AG>Если рассматривать С++, то это библиотеки стандартных функций ввода-вывода, библиотеки строковых и математических функций, наконец библиотека шаблонов STL.
Вот я и пытаюсь понять, как они устроены и могу ли я сам написать определение функции printf() в своей программе.
AG>Уважаемый Deeman, определитесь, пожалуйста, какую Вы ставите перед собой цель?
AG>a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере) AG>b) Изучить программирование на языке высокого уровня C++ ?
Цель — понять, как конкретно реализуются те или иные функции, представленные в заголовочных файлах, как они определяются.
LS>Если стоит задача не использовать никаких библиотек, в том числе библиотек импорта, то фактически задача сведется к получению интерфейса к ОС. В частности, в VC++ есть расширение синтаксиса под названием __declspec, чем можно воспользоваться. Получится вот так: LS>
Здравствуйте, Deeman, Вы писали:
AG>>Уважаемый Deeman, определитесь, пожалуйста, какую Вы ставите перед собой цель?
AG>>a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере) AG>>b) Изучить программирование на языке высокого уровня C++ ?
D>Цель — понять, как конкретно реализуются те или иные функции, представленные в заголовочных файлах, как они определяются.
Все ЯВУ — языки высокого уровня — предполагают облегчение труда программиста, за счет АБСТРАКЦИЙ.
Эти абстракции сделаны, чтобы помочь программисту сконцентрировать внимание НА ВЫПОЛНЯЕМОЙ ЗАДАЧЕ и на поиске оптимального решения ЗАДАЧ ПОЛЬЗОВАТЕЛЯ/ЗАКАЗЧИКА, а не не том, КАКОВА РЕАЛИЗАЦИЯ рутинных функций компьютера/стандартной библиотеки и т.д.
Программиста на ЯВУ важно оптимально решить задачу пользователя, а не придумать реализацию очередного "велосипеда"!
Если объяснить это проще — мы имеем черный ящик X, который выполняет функцию y=f(x).
Пример абстракции из жизни: когда я нажимаю кнопку нужного этажа в лифте, меня не интересует какие сработали контакты реле и/или магнитных пускателей, открылись или закрылись транзисторные ключи, какого типа электромотор и т.д.
Мнея интересует конечный результат: я и мой груз доставлены на нужный этаж
Здравствуйте, AlexGin, Вы писали:
AG>Все ЯВУ — языки высокого уровня — предполагают облегчение труда программиста, за счет АБСТРАКЦИЙ. AG>Эти абстракции сделаны, чтобы помочь программисту сконцентрировать внимание НА ВЫПОЛНЯЕМОЙ ЗАДАЧЕ и на поиске оптимального решения ЗАДАЧ ПОЛЬЗОВАТЕЛЯ/ЗАКАЗЧИКА, а не не том, КАКОВА РЕАЛИЗАЦИЯ рутинных функций компьютера/стандартной библиотеки и т.д.[...]
Это не означает, что никому не нужно знать, как реализованы функции стандартной библиотеки. Я, к примеру, сейчас работаю над проектом на С++, в котором активно используются классы, шаблоны — в общем, многие из высокоуровневых фич языка. Но при этом в этом проекте нельзя пользоваться стандартной библиотекой С и С++, да и само предназначение проекта весьма низкоуровневое. И тут как раз очень нужны знания об устройстве стандартных библиотек С и С++, о том, как реализуется их функциональность, и о том, как программный код взаимодействует с ОС.
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>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?
взять большой листок бумаги и сто раз карандашиком написать "лучше так не делать, а писать простой код используя стандартные функции".
потом стереть ластиком и повторять до просветления.
ситуации, где нельзя пользоваться стандартным рантаймом -- экзотика.
Здравствуйте, Аноним, Вы писали:
А>Тут используется куча статических либ для инициализации CRT и пр. А>Для чистоты эксперимента нужно указать линкеру точку входа.
По заявкам радиослушателей вот исправленный вариант:
Здравствуйте, 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 — опосредованное.
Но я нигде не говорил, что так лучше. Вопрос стоял "как это работает", а не "как сделать лучше".
Здравствуйте, K13, Вы писали:
D>>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?
K13>взять большой листок бумаги и сто раз карандашиком написать "лучше так не делать, а писать простой код используя стандартные функции". K13>потом стереть ластиком и повторять до просветления.
По-моему, это беда всех форумов. Я вот модератор, правда, на форуме музыкальном. И иногда приходят люди и спрашивают — а как устроена музыка, почему в натуральных ладах семь нот, откуда беруться искажения в ухе? И вот про новичка все думают — о, он считает, что познав искажения в ухе он начнёт писать хорошую музыку! Конечно не начнёт. И есть новички, которые это прекрасно понимают, но тем не менее хотят знать суть вещей. А сопротивление форума лишь мешает достижению этой цели, "отцы" ставят новичков "на место", убивая в них всякое разумное стремление к познанию чёрных ящиков (мол, не трогай, всё испортишь!), в результате чего произростает глупость, лень и неверные представления об мироздании.
И поэтому, пока у меня есть силы, желание и мозг мой не столь стар, я хочу знать, какие это такие поршня вертятся в двигателе моего автомобиля, зачем они нужны и как их делают. А на права каждый дурачок может сдать, как показывает практика.
Здравствуйте, LuciferSaratov, Вы писали:
LS>Это не стиль программирования, это просто бывает нужно в некоторых достаточно редких случаях. Если можно избежать написания кода в таком стиле, то так и следует поступать. LS>А почитать — ну, к примеру, Джефри Рихтер, Windows для профессионалов.
D>Спасибо! Становится немного понятнее и уже интереснее.))
Ок. Тебе понятнее.
Тогда вот тебе вопрос для размышления.
howthisworks.exe > file
Эта команда запустит howthisworks.exe и, в случае использования print, вместо консоли сохранит текст в файл file.
Вопрос:
1. При использовании WriteConsoleA это поведение сохранится?
2. Объясни, почему.
Здравствуйте, Vamp, Вы писали:
D>>Спасибо! Становится немного понятнее и уже интереснее.)) V>Ок. Тебе понятнее. V>Тогда вот тебе вопрос для размышления.
V>
V>howthisworks.exe > file
V>
V>Эта команда запустит howthisworks.exe и, в случае использования print, вместо консоли сохранит текст в файл file. V>Вопрос: V>1. При использовании WriteConsoleA это поведение сохранится? V>2. Объясни, почему.
Понятия не имею. Но предполагаю, что pintf, будучи более сложной функцией, может "адаптироваться" и выводить текст не только в файл, но и ещё куда-нибуть, в зависимости от того, чего нужно пользователю. В отличии от WriteConsoleA, которая всегда выполняет одно и то же действие.
Здравствуйте, Deeman! На мой взгляд, Вы немножко не туда зашли. Если вы только начинаете программировать, и пишите программы на уровне Hello, world, то по своему опыту могу Вам посоветовать не лезть покаместь в реализации стандартных функций, а для начала научитесь нормально ими пользоваться. И читать Рихтера Вам пока еще очень рано, так что не забивайте себе етим голову. Избыток информации — ето так же плохо, как и ее недостаток.
Итак, что я могу Вам посоветовать:
1. Разберитесь, что нужно для минимально работающей программы.
2. Постепенно разберайтесь со всеми констукциями языка, изучите цыклы, указатели, функции и т.д. Советую Подбельского почитать Язык Си++, Дейтел — Как программировать на Си++ и выполнять ВСЕ упражнения, без практики никуда!
3. После всего етого уже можно начинать читать Рихтера.
Что еще могу добавить, так ето то, что неважно на каком языке ты будешь программировать — изучение нового языка, после того как ты знаешь хорошо один из них и принцыпы действия ето одна неделя — не больше, самое главное библиотека под етот язык! Так что не углубляйся чрезмерно в ети тонкости, смотри на картину в целом, а не на конкретные пиксели!
Здравствуйте, Deeman, Вы писали:
D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Как бы не работала внутри себя функция printf(), в конечном итоге она должна сказать операционной системе, "выведи, пожалуйста, строку "Hello, World!" туда, где у тебя консоль припаяна". Проблема в том, что в Си нет встроенных средств сказать что-либо операционной системе. Поэтому на чистом Си, без использования библиотек, сделать этого нельзя.
В самих же библиотеках для переговоров с операционной системой используется либо ассемблер, либо нестандартные расширения Си (например, позволяющие воткнуть пару ассемблерных команд в середину сишной функции).
Здравствуйте, Deeman, Вы писали:
D>AlexGin, Вы писали:
AG>>мы имеем черный ящик
D>Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.
желание похвальное ... но меня например мотивирует только неизвестность .
ну а если по делу — стоит посмотреть чтонибудь типа ассембелер под виндовс подсистемы ввода вывода ,
ну или как советовали — под отладчиком пройтись ... но эт тоже надо немного асм знать
все правильно — не слушай их
— только поняв как это работает — поймешь , что эти знания на фиг не нужны .... но и карман не тянут
... и иногда даже и пригождаются
... когда то давно я тоже стремился проследить выполнение программы от кода до пробегания электрона по ноге процессора
Здравствуйте, Pzz, Вы писали:
Pzz>Как бы не работала внутри себя функция printf(), в конечном итоге она должна сказать операционной системе, "выведи, пожалуйста, строку "Hello, World!" туда, где у тебя консоль припаяна". Проблема в том, что в Си нет встроенных средств сказать что-либо операционной системе.
Как это? А как же мне обращаться к dll-кам? Неужто в С++ нет для этого встроенных средств?
Здравствуйте, yozhik89, Вы писали:
Y>Здравствуйте, Deeman! На мой взгляд, Вы немножко не туда зашли. Если вы только начинаете программировать, и пишите программы на уровне Hello, world, то по своему опыту могу Вам посоветовать не лезть покаместь в реализации стандартных функций, а для начала научитесь нормально ими пользоваться.
Дык я как раз и хотел представить картину в целом. Мне было известно, что операционная система управляет "железом", операциями ввода-вывода. Мне так же было известно, что написание любой программы всегда частично является системным программированием, так как в любом случае программе приходится общаться с операционной системой (получать данные с внешнего мира и выводить туда результаты программа без ОС не способна (я знаю, что это очень спорное заявляение)). И из этого выходит, что любой язык должен иметь в себе конструкции для взаимодействия с исполняющей средой, то есть ОС. Пока LuciferSaratov не показал мне пример использования этих конструкций, я не знал, что стандартные библиотечные функции являются "надстройкой" к элементарным функциям обращения к внешнему миру.
Здравствуйте, Deeman, Вы писали:
Pzz>>Как бы не работала внутри себя функция printf(), в конечном итоге она должна сказать операционной системе, "выведи, пожалуйста, строку "Hello, World!" туда, где у тебя консоль припаяна". Проблема в том, что в Си нет встроенных средств сказать что-либо операционной системе.
D>Как это? А как же мне обращаться к dll-кам? Неужто в С++ нет для этого встроенных средств?
1) И как же в C++ называются встроенные средства для обращения к dll-кам? 2) Какое отношение обращение к dll-кам имеет к решению задачи "сказать что-либо операционной системе"?
Здравствуйте, Pzz, Вы писали:
Pzz>1) И как же в C++ называются встроенные средства для обращения к dll-кам? 2) Какое отношение обращение к dll-кам имеет к решению задачи "сказать что-либо операционной системе"?
...при компиляции приведенного выше кода MYLIBAPI за счет заголовочного файла MyLib.h будет определен как _declspec (dllimport). Встречая такой модификатор перед именем переменной, функции или С++-класса, компилятор понимает, что данный идентификатор импортируется из какого-то DLL-модуля
2) Опять же, прибегну к цитате.))
Динамически подключаемые библиотеки (dynamic-link libraries, DLL) — краеугольный камень операционной системы Windows, начиная с самой первой ec версии. В DLL содержатся все функции Windows API. Три самые важные DLL: Kernel32.dll (управление памятью, процессами и потоками), User32.dll (поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений) и GDI32.dll (графика и вывод текста).
...при компиляции приведенного выше кода MYLIBAPI за счет заголовочного файла MyLib.h будет определен как _declspec (dllimport). Встречая такой модификатор перед именем переменной, функции или С++-класса, компилятор понимает, что данный идентификатор импортируется из какого-то DLL-модуля
Это не встроенное средство C++, а нестандартное расширение языка, специфическое для данной платформы.
D>
D>Динамически подключаемые библиотеки (dynamic-link libraries, DLL) — краеугольный камень операционной системы Windows, начиная с самой первой ec версии. В DLL содержатся все функции Windows API. Три самые важные DLL: Kernel32.dll (управление памятью, процессами и потоками), User32.dll (поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений) и GDI32.dll (графика и вывод текста).
А DLL пишут боги на волшебных божественных языках программирования?
Топикстартер, кстати, спросил, как напечатать слово без внешних библиотек. DLL как раз является внешней библиотекой
Здравствуйте, Pzz, Вы писали:
Pzz>Топикстартер, кстати, спросил, как напечатать слово без внешних библиотек.
В рамках защищенного режима — никак) любое действие рано или поздно приведет к системному вызову(внешняя библиотека).
Здравствуйте, Pzz, Вы писали:
Pzz>Это не встроенное средство C++, а нестандартное расширение языка, специфическое для данной платформы.
Вы придираетесь.))
D>>
D>>Динамически подключаемые библиотеки (dynamic-link libraries, DLL) — краеугольный камень операционной системы Windows, начиная с самой первой ec версии. В DLL содержатся все функции Windows API. Три самые важные DLL: Kernel32.dll (управление памятью, процессами и потоками), User32.dll (поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений) и GDI32.dll (графика и вывод текста).
Pzz>А DLL пишут боги на волшебных божественных языках программирования?
Ну, мне казалось, что фундаментальные объекты операционной системы пишут на ассемблере, нет?
Pzz>Топикстартер, кстати, спросил, как напечатать слово без внешних библиотек. DLL как раз является внешней библиотекой
Под библиотеками топикстартер имел в виду заголовочные файлы .h, включаемые в код директивой #include.
Здравствуйте, Deeman, Вы писали:
Pzz>>Это не встроенное средство C++, а нестандартное расширение языка, специфическое для данной платформы.
D>Вы придираетесь.))
Отнюдь.
Pzz>>А DLL пишут боги на волшебных божественных языках программирования?
D>Ну, мне казалось, что фундаментальные объекты операционной системы пишут на ассемблере, нет?
Нет. Почти все пишут на Си/С++. Но при этом если надо из user space позвать ядро, используют переходнички, написанные на ассемблере или с использованием нестандартных расширений Си.
Pzz>>Топикстартер, кстати, спросил, как напечатать слово без внешних библиотек. DLL как раз является внешней библиотекой
D>Под библиотеками топикстартер имел в виду заголовочные файлы .h, включаемые в код директивой #include.
Здравствуйте, Deeman, Вы писали:
D>Друзья, тыкните новичка носом в ключевые слова для поиска! D>Изучаю С++ и по ходу обучения появилось желание постичь фундаментальные основы. Желание сформулировалось задачу следущего содержания: D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр). D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Решения этой задачи не существует.
Вообще на голом C или C++ нет способа вывести строчку "Hello, World!" на экран.
Любое решение как или иначе будет или использование внешнего модуля или библиотеки, или использование ассемблера.
GC>Любое решение как или иначе будет или использование внешнего модуля или библиотеки, или использование ассемблера.
Не обязательно. В незащищенных режимах вполне можно вывести строку, непосредственно обращаясь к видеопамяти. Для этого не нужен ассемблер.
Здравствуйте, Vamp, Вы писали:
GC>>Любое решение как или иначе будет или использование внешнего модуля или библиотеки, или использование ассемблера. V>Не обязательно. В незащищенных режимах вполне можно вывести строку, непосредственно обращаясь к видеопамяти. Для этого не нужен ассемблер.
Но это решение не будет работать на всех платформах, там где видеопамять начинается с другого адреса например.
Вы привели только частное решение.
GC>Но это решение не будет работать на всех платформах, там где видеопамять начинается с другого адреса например.
Я просто опровергнул квантор всеобщности ("любое решение").