Друзья, тыкните новичка носом в ключевые слова для поиска!
Изучаю С++ и по ходу обучения появилось желание постичь фундаментальные основы. Желание сформулировалось задачу следущего содержания:
"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).
Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Здравствуйте, 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, наверняка найдешь, и не одну
Здравствуйте, Deeman, Вы писали:
VC>>не совсем VC>>код printf (скомпилированный) обычно берется из библиотеки, поставляемой с компилятором
D>А как бы его посмотреть? Или даже — как бы его прям в свою программу и вставить, без использования этой поставляемой с компилятором библиотеки?
Уважаемый Deeman, определитесь, пожалуйста, какую Вы ставите перед собой цель?
a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере)
b) Изучить программирование на языке высокого уровня C++ ?
Здравствуйте, AlexGin, Вы писали:
AG>a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере)
причем тут ассемблер? в MSVC, например, практически все написано на С/C++ (может быть некоторые для оптимизации и на ассемблере, но это не обязательно)
Здравствуйте, Deeman, Вы писали:
D>Друзья, тыкните новичка носом в ключевые слова для поиска!
D>Изучаю С++ и по ходу обучения появилось желание постичь фундаментальные основы. Желание сформулировалось задачу следущего содержания:
D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).
D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Любой язык высокого уровня имеет свой набор библиотек.
Если рассматривать С++, то это библиотеки стандартных функций ввода-вывода, библиотеки строковых и математических функций, наконец библиотека шаблонов STL. Если немного расширить область практического применения С++, то следует обратить внимание на библиотеки классов MFC и VCL.
Здравствуйте, 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>Эти абстракции сделаны, чтобы помочь программисту сконцентрировать внимание НА ВЫПОЛНЯЕМОЙ ЗАДАЧЕ и на поиске оптимального решения ЗАДАЧ ПОЛЬЗОВАТЕЛЯ/ЗАКАЗЧИКА, а не не том, КАКОВА РЕАЛИЗАЦИЯ рутинных функций компьютера/стандартной библиотеки и т.д.[...]
Это не означает, что никому не нужно знать, как реализованы функции стандартной библиотеки. Я, к примеру, сейчас работаю над проектом на С++, в котором активно используются классы, шаблоны — в общем, многие из высокоуровневых фич языка. Но при этом в этом проекте нельзя пользоваться стандартной библиотекой С и С++, да и само предназначение проекта весьма низкоуровневое. И тут как раз очень нужны знания об устройстве стандартных библиотек С и С++, о том, как реализуется их функциональность, и о том, как программный код взаимодействует с ОС.