Hello, World!
От: Deeman  
Дата: 29.06.10 08:28
Оценка: :)))
Друзья, тыкните новичка носом в ключевые слова для поиска!

Изучаю С++ и по ходу обучения появилось желание постичь фундаментальные основы. Желание сформулировалось задачу следущего содержания:

"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).

Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Re: Hello, World!
От: VsevolodC Россия  
Дата: 29.06.10 08:35
Оценка:
Здравствуйте, 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;
}
Re[2]: Hello, World!
От: Deeman  
Дата: 29.06.10 08:44
Оценка:
VC>ты определись:
VC>1. не использовать библиотек
VC>2. не использовать инклюдов

Да, под библиотеками я имел в виду заголовочные файлы. Обычно подобная минимальная программа содержит ссылку на <stdio>, в которой содержится определение (или только объявление?!) функции prinf(). При этом мне понятно, что в коде надо писать что-то, что понимает ОС.



VC>если 2., то легко:

VC>
VC>int printf( const char *format, ... );

VC>int main(void)
VC>{
VC>  printf("Hello, World!");

VC>  return 0;
VC>}
VC>


Здесь содержиться лишь объявление printf(). То есть, когда программа скомпилирована и запущена, то этот самый printf как бы является указанием ОС, чего мы от неё хотим, правильно я понимаю?
Re[3]: Hello, World!
От: VsevolodC Россия  
Дата: 29.06.10 08:51
Оценка:
Здравствуйте, Deeman, Вы писали:

D>Здесь содержиться лишь объявление printf(). То есть, когда программа скомпилирована и запущена, то этот самый printf как бы является указанием ОС, чего мы от неё хотим, правильно я понимаю?


не совсем
код printf (скомпилированный) обычно берется из библиотеки, поставляемой с компилятором
Re[4]: Hello, World!
От: Deeman  
Дата: 29.06.10 08:56
Оценка:
VC>не совсем
VC>код printf (скомпилированный) обычно берется из библиотеки, поставляемой с компилятором

А как бы его посмотреть? Или даже — как бы его прям в свою программу и вставить, без использования этой поставляемой с компилятором библиотеки?
Re[5]: Hello, World!
От: VsevolodC Россия  
Дата: 29.06.10 09:01
Оценка:
Здравствуйте, Deeman, Вы писали:

VC>>не совсем

VC>>код printf (скомпилированный) обычно берется из библиотеки, поставляемой с компилятором

D>А как бы его посмотреть? Или даже — как бы его прям в свою программу и вставить, без использования этой поставляемой с компилятором библиотеки?


поищи в инете реализацию printf, наверняка найдешь, и не одну
Re[5]: Hello, World!
От: AlexGin Беларусь  
Дата: 29.06.10 09:06
Оценка: 1 (1) +1 -1
Здравствуйте, Deeman, Вы писали:

VC>>не совсем

VC>>код printf (скомпилированный) обычно берется из библиотеки, поставляемой с компилятором

D>А как бы его посмотреть? Или даже — как бы его прям в свою программу и вставить, без использования этой поставляемой с компилятором библиотеки?


Уважаемый Deeman, определитесь, пожалуйста, какую Вы ставите перед собой цель?

a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере)
b) Изучить программирование на языке высокого уровня C++ ?
Re[6]: Hello, World!
От: Сергей Мухин Россия  
Дата: 29.06.10 09:11
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере)


причем тут ассемблер? в MSVC, например, практически все написано на С/C++ (может быть некоторые для оптимизации и на ассемблере, но это не обязательно)
---
С уважением,
Сергей Мухин
Re: Hello, World!
От: AlexGin Беларусь  
Дата: 29.06.10 09:14
Оценка: -1 :)
Здравствуйте, Deeman, Вы писали:

D>Друзья, тыкните новичка носом в ключевые слова для поиска!


D>Изучаю С++ и по ходу обучения появилось желание постичь фундаментальные основы. Желание сформулировалось задачу следущего содержания:


D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).


D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?


Любой язык высокого уровня имеет свой набор библиотек.
Если рассматривать С++, то это библиотеки стандартных функций ввода-вывода, библиотеки строковых и математических функций, наконец библиотека шаблонов STL. Если немного расширить область практического применения С++, то следует обратить внимание на библиотеки классов MFC и VCL.
Re: Hello, World!
От: jazzer Россия Skype: enerjazzer
Дата: 29.06.10 09:16
Оценка:
Здравствуйте, Deeman, Вы писали:

D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).


С компилятором идет стандартная библиотека.
Так что когда ты пишешь #include <stdio.h> или #include <iostream>, ты один на один с компилятором и не используешь никаких сторонних библиотек.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[7]: Hello, World!
От: AlexGin Беларусь  
Дата: 29.06.10 09:19
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, AlexGin, Вы писали:


AG>>a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере)


СМ>причем тут ассемблер? в MSVC, например, практически все написано на С/C++ (может быть некоторые для оптимизации и на ассемблере, но это не обязательно)


Конечно, можно и без ассемблера — все писать на простом С
Но — главный вопрос:
Зачем изучать C++ в этом случае? Лично мне — непонятно

ИМХО любое изучение нового языка/технологии и т.д. должно преследовать точную и конкретную цель.
Re: Hello, World!
От: slava_phirsov Россия  
Дата: 29.06.10 09:27
Оценка:
Здравствуйте, Deeman, Вы писали:

D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).


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

D>Существует ли решение?


Под Linux, насколько я помню, решение состоит в ассемблерной вставке, генерирующей прерывания.

D>Как, чёрт побери, конкретно работает функция printf()?


Вызывает соответствующие функции операционной системы, так что оно зависит от конкретной платформы. А как иначе?
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re: Hello, World!
От: LuciferSaratov Россия  
Дата: 29.06.10 09:27
Оценка:
Здравствуйте, Deeman, Вы писали:

D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?


Конкретно она работает так: формирует строку на основе форматной строки и остальных аргументов, далее, используя интерфейс к ОС, выводит содержимое этой строки на стандартный вывод.

Если стоит задача не использовать никаких библиотек, в том числе библиотек импорта, то фактически задача сведется к получению интерфейса к ОС. В частности, в VC++ есть расширение синтаксиса под названием __declspec, чем можно воспользоваться. Получится вот так:
typedef unsigned int HANDLE;
typedef unsigned int DWORD;
typedef DWORD *LPDWORD;
typedef unsigned int BOOL;
typedef void VOID;
typedef VOID *LPVOID;
#define WINAPI __stdcall
#define NULL (0)
#define STD_OUTPUT_HANDLE ((DWORD)-11)

__declspec(dllimport) HANDLE WINAPI GetStdHandle(DWORD nStdHandle);
__declspec(dllimport) BOOL WINAPI WriteConsoleA(HANDLE hConsoleOutput, const VOID *lpBuffer, DWORD nNumberOfCharsToWrite,
                                               LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved);

int main(int argc, char *argv) {
    DWORD dwWritten;
    char msg[] = "Hello, World!";
    WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), &msg[0], sizeof(msg), &dwWritten, NULL);
    return 0;
}
Re[2]: Hello, World!
От: Сергей Мухин Россия  
Дата: 29.06.10 09:31
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

LS> char msg[] = "Hello, World!";

LS> WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), &msg[0], sizeof(msg), &dwWritten, NULL);

я не уверен, но вроде надо sizeof(msg)-1
---
С уважением,
Сергей Мухин
Re[3]: Hello, World!
От: LuciferSaratov Россия  
Дата: 29.06.10 09:36
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>я не уверен, но вроде надо sizeof(msg)-1


Да без разницы, консоль от вывода нулей не помирает.
Re[2]: Hello, World!
От: Deeman  
Дата: 29.06.10 10:17
Оценка:
AG>Любой язык высокого уровня имеет свой набор библиотек.
AG>Если рассматривать С++, то это библиотеки стандартных функций ввода-вывода, библиотеки строковых и математических функций, наконец библиотека шаблонов STL.

Вот я и пытаюсь понять, как они устроены и могу ли я сам написать определение функции printf() в своей программе.
Re[6]: Hello, World!
От: Deeman  
Дата: 29.06.10 10:24
Оценка:
AG>Уважаемый Deeman, определитесь, пожалуйста, какую Вы ставите перед собой цель?

AG>a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере)

AG>b) Изучить программирование на языке высокого уровня C++ ?

Цель — понять, как конкретно реализуются те или иные функции, представленные в заголовочных файлах, как они определяются.
Re[2]: Hello, World!
От: Deeman  
Дата: 29.06.10 10:31
Оценка:
LS>Если стоит задача не использовать никаких библиотек, в том числе библиотек импорта, то фактически задача сведется к получению интерфейса к ОС. В частности, в VC++ есть расширение синтаксиса под названием __declspec, чем можно воспользоваться. Получится вот так:
LS>
LS>typedef unsigned int HANDLE;
LS>typedef unsigned int DWORD;
LS>typedef DWORD *LPDWORD;
LS>typedef unsigned int BOOL;
LS>typedef void VOID;
LS>typedef VOID *LPVOID;
LS>#define WINAPI __stdcall
LS>#define NULL (0)
LS>#define STD_OUTPUT_HANDLE ((DWORD)-11)

LS>__declspec(dllimport) HANDLE WINAPI GetStdHandle(DWORD nStdHandle);
LS>__declspec(dllimport) BOOL WINAPI WriteConsoleA(HANDLE hConsoleOutput, const VOID *lpBuffer, DWORD nNumberOfCharsToWrite,
LS>                                               LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved);

LS>int main(int argc, char *argv) {
LS>    DWORD dwWritten;
LS>    char msg[] = "Hello, World!";
LS>    WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), &msg[0], sizeof(msg), &dwWritten, NULL);
LS>    return 0;
LS>}
LS>


Спасибо! Становится немного понятнее и уже интереснее.))
Re[7]: Hello, World!
От: AlexGin Беларусь  
Дата: 29.06.10 10:52
Оценка:
Здравствуйте, Deeman, Вы писали:

AG>>Уважаемый Deeman, определитесь, пожалуйста, какую Вы ставите перед собой цель?


AG>>a) НЕ использовать библиотеки C++ (и даже простого C)? (вместо этого ВСЕ писать на ассемблере)

AG>>b) Изучить программирование на языке высокого уровня C++ ?

D>Цель — понять, как конкретно реализуются те или иные функции, представленные в заголовочных файлах, как они определяются.


Все ЯВУ — языки высокого уровня — предполагают облегчение труда программиста, за счет АБСТРАКЦИЙ.
Эти абстракции сделаны, чтобы помочь программисту сконцентрировать внимание НА ВЫПОЛНЯЕМОЙ ЗАДАЧЕ и на поиске оптимального решения ЗАДАЧ ПОЛЬЗОВАТЕЛЯ/ЗАКАЗЧИКА, а не не том, КАКОВА РЕАЛИЗАЦИЯ рутинных функций компьютера/стандартной библиотеки и т.д.

Программиста на ЯВУ важно оптимально решить задачу пользователя, а не придумать реализацию очередного "велосипеда"!

Если объяснить это проще — мы имеем черный ящик X, который выполняет функцию y=f(x).

Пример абстракции из жизни: когда я нажимаю кнопку нужного этажа в лифте, меня не интересует какие сработали контакты реле и/или магнитных пускателей, открылись или закрылись транзисторные ключи, какого типа электромотор и т.д.
Мнея интересует конечный результат: я и мой груз доставлены на нужный этаж
Re[8]: Hello, World!
От: LuciferSaratov Россия  
Дата: 29.06.10 10:59
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Все ЯВУ — языки высокого уровня — предполагают облегчение труда программиста, за счет АБСТРАКЦИЙ.

AG>Эти абстракции сделаны, чтобы помочь программисту сконцентрировать внимание НА ВЫПОЛНЯЕМОЙ ЗАДАЧЕ и на поиске оптимального решения ЗАДАЧ ПОЛЬЗОВАТЕЛЯ/ЗАКАЗЧИКА, а не не том, КАКОВА РЕАЛИЗАЦИЯ рутинных функций компьютера/стандартной библиотеки и т.д.[...]

Это не означает, что никому не нужно знать, как реализованы функции стандартной библиотеки. Я, к примеру, сейчас работаю над проектом на С++, в котором активно используются классы, шаблоны — в общем, многие из высокоуровневых фич языка. Но при этом в этом проекте нельзя пользоваться стандартной библиотекой С и С++, да и само предназначение проекта весьма низкоуровневое. И тут как раз очень нужны знания об устройстве стандартных библиотек С и С++, о том, как реализуется их функциональность, и о том, как программный код взаимодействует с ОС.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.