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++ ?
Hello, World!
От: Deeman  
Дата: 29.06.10 08:28
Оценка: :)))
Друзья, тыкните новичка носом в ключевые слова для поиска!

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

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

Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?
Re: Hello, World!
От: AlexGin Беларусь  
Дата: 29.06.10 09:14
Оценка: -1 :)
Здравствуйте, Deeman, Вы писали:

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


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


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


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


Любой язык высокого уровня имеет свой набор библиотек.
Если рассматривать С++, то это библиотеки стандартных функций ввода-вывода, библиотеки строковых и математических функций, наконец библиотека шаблонов STL. Если немного расширить область практического применения С++, то следует обратить внимание на библиотеки классов MFC и VCL.
Re[13]: Hello, World!
От: carpenter СССР  
Дата: 01.07.10 10:17
Оценка: 3 (1)
Здравствуйте, Deeman, Вы писали:

и еще — погугли — "real hello world" — думаю будет интересно
Re[11]: Hello, World!
От: LuciferSaratov Россия  
Дата: 30.06.10 06:11
Оценка: 2 (1)
Здравствуйте, Deeman, Вы писали:

D>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?


Это не стиль программирования, это просто бывает нужно в некоторых достаточно редких случаях. Если можно избежать написания кода в таком стиле, то так и следует поступать.
А почитать — ну, к примеру, Джефри Рихтер, Windows для профессионалов.

И вот еще — на этом форуме используется древовидная структура сообщений, поэтому в одном сообщении нужно отвечать одному собеседнику. Так здесь принято, всем понятно и у каждого будет возможность заметить твой ответ. Я вот не с сразу заметил, мог и не ответить.
Re[3]: Hello, World!
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 01.07.10 22:11
Оценка: 2 (1)
Здравствуйте, Deeman, Вы писали:


AG>>Любой язык высокого уровня имеет свой набор библиотек.

AG>>Если рассматривать С++, то это библиотеки стандартных функций ввода-вывода, библиотеки строковых и математических функций, наконец библиотека шаблонов STL.

D>Вот я и пытаюсь понять, как они устроены и могу ли я сам написать определение функции printf() в своей программе.


Можешь, конечно. Кстати, если речь о Visual C++, то CRT (runtime-библиотека C, которая содержит printf) давно поставляется в исходных текстах вместе со студией. Так что, возьми, да посмотри, никто из её текста секрета давно уже не делает.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[8]: Hello, World!
От: Deeman  
Дата: 29.06.10 11:18
Оценка: 1 (1)
AlexGin, Вы писали:

AG>мы имеем черный ящик


Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.

Поэтому, наверное, мало кто интересуется тем, как же на самом деле всё устроено. Зачем забивать себе мозг?
Re[9]: Hello, World!
От: Тот кто сидит в пруду Россия  
Дата: 30.06.10 04:55
Оценка: 1 (1)
Здравствуйте, Deeman, Вы писали:

D>Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.


Отладчиком зайди да посмотри, делов-то. Да и всяко полезней будет, чем свой принтф писать.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: Hello, World!
От: Vamp Россия  
Дата: 29.06.10 20:20
Оценка: +1
D>Спасибо! Становится немного понятнее и уже интереснее.))
А что понятнее-то? Заменили один черный ящик — printf — на другой — WriteConsoleA. Сделали програму сложнее, непортируемую, и без каких бы то ни было улучшений.
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Hello, World!
От: Ops Россия  
Дата: 30.06.10 18:23
Оценка: :)
Здравствуйте, Deeman, Вы писали:

D>Не совсем "заменили". На мой взгляд, printf и WriteConsoleA — два совершенно разных понятия, поскольку WriteConsoleA — это прямое обращение к операционной системе, а printf — опосредованное.


Вы не поверите, но WriteConsoleA — тоже опосредованное, это обертка над WriteConsoleW
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
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[6]: Hello, World!
От: Сергей Мухин Россия  
Дата: 29.06.10 09:11
Оценка:
Здравствуйте, AlexGin, Вы писали:

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


причем тут ассемблер? в MSVC, например, практически все написано на С/C++ (может быть некоторые для оптимизации и на ассемблере, но это не обязательно)
---
С уважением,
Сергей Мухин
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>Эти абстракции сделаны, чтобы помочь программисту сконцентрировать внимание НА ВЫПОЛНЯЕМОЙ ЗАДАЧЕ и на поиске оптимального решения ЗАДАЧ ПОЛЬЗОВАТЕЛЯ/ЗАКАЗЧИКА, а не не том, КАКОВА РЕАЛИЗАЦИЯ рутинных функций компьютера/стандартной библиотеки и т.д.[...]

Это не означает, что никому не нужно знать, как реализованы функции стандартной библиотеки. Я, к примеру, сейчас работаю над проектом на С++, в котором активно используются классы, шаблоны — в общем, многие из высокоуровневых фич языка. Но при этом в этом проекте нельзя пользоваться стандартной библиотекой С и С++, да и само предназначение проекта весьма низкоуровневое. И тут как раз очень нужны знания об устройстве стандартных библиотек С и С++, о том, как реализуется их функциональность, и о том, как программный код взаимодействует с ОС.
Re[3]: Hello, World!
От: AlexGin Беларусь  
Дата: 29.06.10 11:02
Оценка:
Здравствуйте, Deeman, Вы писали:


AG>>Любой язык высокого уровня имеет свой набор библиотек.

AG>>Если рассматривать С++, то это библиотеки стандартных функций ввода-вывода, библиотеки строковых и математических функций, наконец библиотека шаблонов STL.

D>Вот я и пытаюсь понять, как они устроены и могу ли я сам написать определение функции printf() в своей программе.


А что конкретно тебе даст "велосипед" под названием printf?

Этот велосипед можно реализовать миллионом разных способов...
Все из них будут работать, будут иметь свои достоинства и недостатки...

Не проще ли сделать что-то свое из примерно того же рода: например даны Фамилия Имя Отчество человека (возможно введены даже всеми строчными или всеми заглавными буквами), написать функцию которая:
1) Сделает первые буквы заглавными, остальные строчные
2) Сформирует инициалы — пример:
на входе: иванов иван иванович (или: ИВАНОВ ИВАН ИВАНОВИЧ)
на выход: Иванов И.И.

Вот простой пример обработки строк — но пример не тривиальный (как printf)
Re[9]: Hello, World!
От: AlexGin Беларусь  
Дата: 29.06.10 11:10
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

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


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

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

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


Sorry, может я не понял ситуации у топик-стартера, но ИМХО у меня сложилось мнение, что человек просто немного не представляет основного назначения таких объектно-ориентированных языков как C++.

З.Ы. В то же время Вы не станете утверждать, что Ваш случай (в указанном выше проекте) — это пример типового программирования на C++. Это скорее редкое исключение из правил.
Re[9]: Hello, World!
От: K13 http://akvis.com
Дата: 29.06.10 12:52
Оценка:
D>Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.

D>Поэтому, наверное, мало кто интересуется тем, как же на самом деле всё устроено. Зачем забивать себе мозг?


А устройство процессора представляете? Сумматора? Блока умножения? Как работает доступ к памяти — с диаграммами сигналов по ножкам проца?

Когда-то я это знал (для 8086) — но в программировании ценность этой информации == 0.

"Как устроена printf" — это любознательность. "Все вручную" -- это глупость.
Re[2]: Hello, World!
От: Аноним  
Дата: 29.06.10 13:41
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

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>


Тут используется куча статических либ для инициализации CRT и пр.
Для чистоты эксперимента нужно указать линкеру точку входа.
Re[10]: Hello, World!
От: Deeman  
Дата: 29.06.10 13:46
Оценка:
K13, Вы писали:

K13>"Как устроена printf" — это любознательность. "Все вручную" -- это глупость.


Я любознателен, но ручную рутину не люблю.))

LuciferSaratov, Вы писали:

LS>Если стоит задача не использовать никаких библиотек, в том числе библиотек импорта, то фактически задача сведется к получению интерфейса к ОС.


LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?
Re[11]: Hello, World!
От: K13 http://akvis.com
Дата: 30.06.10 04:47
Оценка:
D>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?

взять большой листок бумаги и сто раз карандашиком написать "лучше так не делать, а писать простой код используя стандартные функции".
потом стереть ластиком и повторять до просветления.

ситуации, где нельзя пользоваться стандартным рантаймом -- экзотика.
Re[3]: Hello, World!
От: LuciferSaratov Россия  
Дата: 30.06.10 05:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Тут используется куча статических либ для инициализации CRT и пр.

А>Для чистоты эксперимента нужно указать линкеру точку входа.

По заявкам радиослушателей вот исправленный вариант:
typedef unsigned int HANDLE;
typedef unsigned int DWORD;
typedef unsigned int UINT;
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);
__declspec(dllimport) VOID WINAPI ExitProcess(UINT uExitCode);

void myentry(void) {
    DWORD dwWritten;
    char msg[] = "Hello, World!";
    WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), &msg[0], sizeof(msg)-1, &dwWritten, NULL);
    ExitProcess(0);
}


В настройках компилятора нужно отключить опцию Buffer security check (/GS), а то линковаться не будет.
Re: Hello, World!
От: dcb-BanDos Россия  
Дата: 30.06.10 08:42
Оценка:
Здравствуйте, Deeman, Вы писали:

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


отладчик отменили?
зайди внутрь printf под отладкой и посмотри, как реализован printf(CRT) в поставке твоего компилятора, если используется MSVC 2005, то по дефолту смотри "C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\"
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[11]: Hello, World!
От: saf_e  
Дата: 30.06.10 10:49
Оценка:
Здравствуйте, Deeman, Вы писали:

D>K13, Вы писали:


K13>>"Как устроена printf" — это любознательность. "Все вручную" -- это глупость.


D>Я любознателен, но ручную рутину не люблю.))


D>LuciferSaratov, Вы писали:


LS>>Если стоит задача не использовать никаких библиотек, в том числе библиотек импорта, то фактически задача сведется к получению интерфейса к ОС.


D>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?


Скажите, а вас не смущает, что вы не знаете как работают системные АПИ? КАК происходит вывод символов из программной памяти на экран монитора? То, что в данном примере происходит неявное линкование на kernell32.dll (и более того, любая виндоус программа неявно линкуется с ntdll.dll). Вас не пугает, что компилятор+линкер из "простого и понятно" С-кода соберет машинный код и поклеит в файл с секциями напихав его "волшебными значениями", о которых вы и не подозреваете? А система когда запустит образ будет делать с ним еще более противоестественные вещи? Вы тоже хотите сделать это сами?

Знать что происходит (в частности как работает printf) это одно, а писать на самом низком из возможных уровней это другое. Вся история программирования состоит в уходе на все более высокоуровневые конструкции (ASM — C — C++ — ну и т.д.), на каком уровне остановиться решать вам, но использование готовых конструкций/библиотек сильно облегчит жизнь. А понимать надо, да...
Re[4]: Hello, World!
От: Deeman  
Дата: 30.06.10 18:18
Оценка:
Здравствуйте, Vamp, Вы писали:

D>>Спасибо! Становится немного понятнее и уже интереснее.))

V>А что понятнее-то? Заменили один черный ящик — printf — на другой — WriteConsoleA. Сделали програму сложнее, непортируемую, и без каких бы то ни было улучшений.

Не совсем "заменили". На мой взгляд, printf и WriteConsoleA — два совершенно разных понятия, поскольку WriteConsoleA — это прямое обращение к операционной системе, а printf — опосредованное.

Но я нигде не говорил, что так лучше. Вопрос стоял "как это работает", а не "как сделать лучше".
Re[6]: Hello, World!
От: Ops Россия  
Дата: 30.06.10 18:29
Оценка:
Причем, вполне вероятно, что лет через 5-10 MS нагло удалит WriteConsoleA из WINAPI (если раньше вендекапец не случится), а вот printf будет работать.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[12]: Hello, World!
От: Deeman  
Дата: 30.06.10 18:36
Оценка:
Здравствуйте, K13, Вы писали:

D>>LuciferSaratov, скажите, если мне захочется почерпнуть побольше информации о таком стиле программирования, то что бы вы порекомендовали почитать?


K13>взять большой листок бумаги и сто раз карандашиком написать "лучше так не делать, а писать простой код используя стандартные функции".

K13>потом стереть ластиком и повторять до просветления.

По-моему, это беда всех форумов. Я вот модератор, правда, на форуме музыкальном. И иногда приходят люди и спрашивают — а как устроена музыка, почему в натуральных ладах семь нот, откуда беруться искажения в ухе? И вот про новичка все думают — о, он считает, что познав искажения в ухе он начнёт писать хорошую музыку! Конечно не начнёт. И есть новички, которые это прекрасно понимают, но тем не менее хотят знать суть вещей. А сопротивление форума лишь мешает достижению этой цели, "отцы" ставят новичков "на место", убивая в них всякое разумное стремление к познанию чёрных ящиков (мол, не трогай, всё испортишь!), в результате чего произростает глупость, лень и неверные представления об мироздании.

И поэтому, пока у меня есть силы, желание и мозг мой не столь стар, я хочу знать, какие это такие поршня вертятся в двигателе моего автомобиля, зачем они нужны и как их делают. А на права каждый дурачок может сдать, как показывает практика.
Re[12]: Hello, World!
От: Deeman  
Дата: 30.06.10 18:37
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

LS>Это не стиль программирования, это просто бывает нужно в некоторых достаточно редких случаях. Если можно избежать написания кода в таком стиле, то так и следует поступать.

LS>А почитать — ну, к примеру, Джефри Рихтер, Windows для профессионалов.

Спасибо. Книжка эта, оказывается, у меня есть.
Re[6]: Hello, World!
От: Deeman  
Дата: 30.06.10 18:40
Оценка:
Ops, Вы писали:

Ops>Вы не поверите, но WriteConsoleA — тоже опосредованное, это обертка над WriteConsoleW


Поверю, отчего ж.))
Re[3]: Hello, World!
От: Vamp Россия  
Дата: 30.06.10 18:47
Оценка:
D>Спасибо! Становится немного понятнее и уже интереснее.))
Ок. Тебе понятнее.
Тогда вот тебе вопрос для размышления.

howthisworks.exe > file

Эта команда запустит howthisworks.exe и, в случае использования print, вместо консоли сохранит текст в файл file.
Вопрос:
1. При использовании WriteConsoleA это поведение сохранится?
2. Объясни, почему.

Интереснее?
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Hello, World!
От: Deeman  
Дата: 30.06.10 19:46
Оценка:
Здравствуйте, Vamp, Вы писали:

D>>Спасибо! Становится немного понятнее и уже интереснее.))

V>Ок. Тебе понятнее.
V>Тогда вот тебе вопрос для размышления.

V>
V>howthisworks.exe > file
V>

V>Эта команда запустит howthisworks.exe и, в случае использования print, вместо консоли сохранит текст в файл file.
V>Вопрос:
V>1. При использовании WriteConsoleA это поведение сохранится?
V>2. Объясни, почему.

Понятия не имею. Но предполагаю, что pintf, будучи более сложной функцией, может "адаптироваться" и выводить текст не только в файл, но и ещё куда-нибуть, в зависимости от того, чего нужно пользователю. В отличии от WriteConsoleA, которая всегда выполняет одно и то же действие.
Re[5]: Hello, World!
От: yozhik89 Украина  
Дата: 30.06.10 22:59
Оценка:
Здравствуйте, Deeman! На мой взгляд, Вы немножко не туда зашли. Если вы только начинаете программировать, и пишите программы на уровне Hello, world, то по своему опыту могу Вам посоветовать не лезть покаместь в реализации стандартных функций, а для начала научитесь нормально ими пользоваться. И читать Рихтера Вам пока еще очень рано, так что не забивайте себе етим голову. Избыток информации — ето так же плохо, как и ее недостаток.
Итак, что я могу Вам посоветовать:

1. Разберитесь, что нужно для минимально работающей программы.
2. Постепенно разберайтесь со всеми констукциями языка, изучите цыклы, указатели, функции и т.д. Советую Подбельского почитать Язык Си++, Дейтел — Как программировать на Си++ и выполнять ВСЕ упражнения, без практики никуда!
3. После всего етого уже можно начинать читать Рихтера.

Что еще могу добавить, так ето то, что неважно на каком языке ты будешь программировать — изучение нового языка, после того как ты знаешь хорошо один из них и принцыпы действия ето одна неделя — не больше, самое главное библиотека под етот язык! Так что не углубляйся чрезмерно в ети тонкости, смотри на картину в целом, а не на конкретные пиксели!
Извинити за мой русский:)
Re: Hello, World!
От: Pzz Россия https://github.com/alexpevzner
Дата: 01.07.10 00:20
Оценка:
Здравствуйте, Deeman, Вы писали:

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


Как бы не работала внутри себя функция printf(), в конечном итоге она должна сказать операционной системе, "выведи, пожалуйста, строку "Hello, World!" туда, где у тебя консоль припаяна". Проблема в том, что в Си нет встроенных средств сказать что-либо операционной системе. Поэтому на чистом Си, без использования библиотек, сделать этого нельзя.

В самих же библиотеках для переговоров с операционной системой используется либо ассемблер, либо нестандартные расширения Си (например, позволяющие воткнуть пару ассемблерных команд в середину сишной функции).
Re[4]: Поросята в краске
От: Micht  
Дата: 01.07.10 08:43
Оценка:
Здравствуйте, Vamp, Вы писали:

V>1. При использовании WriteConsoleA это поведение сохранится?

V>2. Объясни, почему.

Мне кажется, должно сохраниться, т.к. задано перенаправление вывода из консоли в файл, а этим делом должна рулить ось...
Поправьте, плз, если не прав.
Re[9]: Hello, World!
От: carpenter СССР  
Дата: 01.07.10 10:11
Оценка:
Здравствуйте, Deeman, Вы писали:

D>AlexGin, Вы писали:


AG>>мы имеем черный ящик


D>Я хочу знать, как работает чёрный ящик. Я не собираюсь писать его заново, я хочу знать, как он работает, потому что чёрный цвет меня пугает. Это, знаете ли, психологическое — если перед тобой неизвестность, ты её боишься. А известность тебя мотивирует.



желание похвальное ... но меня например мотивирует только неизвестность .


ну а если по делу — стоит посмотреть чтонибудь типа ассембелер под виндовс подсистемы ввода вывода ,
ну или как советовали — под отладчиком пройтись ... но эт тоже надо немного асм знать
Re[13]: Hello, World!
От: carpenter СССР  
Дата: 01.07.10 10:14
Оценка:
Здравствуйте, Deeman, Вы писали:

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

... когда то давно я тоже стремился проследить выполнение программы от кода до пробегания электрона по ноге процессора
Re[2]: Hello, World!
От: Deeman  
Дата: 01.07.10 10:15
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Как бы не работала внутри себя функция printf(), в конечном итоге она должна сказать операционной системе, "выведи, пожалуйста, строку "Hello, World!" туда, где у тебя консоль припаяна". Проблема в том, что в Си нет встроенных средств сказать что-либо операционной системе.


Как это? А как же мне обращаться к dll-кам? Неужто в С++ нет для этого встроенных средств?
Re[6]: Hello, World!
От: Deeman  
Дата: 01.07.10 10:25
Оценка:
Здравствуйте, yozhik89, Вы писали:

Y>Здравствуйте, Deeman! На мой взгляд, Вы немножко не туда зашли. Если вы только начинаете программировать, и пишите программы на уровне Hello, world, то по своему опыту могу Вам посоветовать не лезть покаместь в реализации стандартных функций, а для начала научитесь нормально ими пользоваться.


Дык я как раз и хотел представить картину в целом. Мне было известно, что операционная система управляет "железом", операциями ввода-вывода. Мне так же было известно, что написание любой программы всегда частично является системным программированием, так как в любом случае программе приходится общаться с операционной системой (получать данные с внешнего мира и выводить туда результаты программа без ОС не способна (я знаю, что это очень спорное заявляение)). И из этого выходит, что любой язык должен иметь в себе конструкции для взаимодействия с исполняющей средой, то есть ОС. Пока LuciferSaratov не показал мне пример использования этих конструкций, я не знал, что стандартные библиотечные функции являются "надстройкой" к элементарным функциям обращения к внешнему миру.
Re[3]: Hello, World!
От: Pzz Россия https://github.com/alexpevzner
Дата: 01.07.10 10:26
Оценка:
Здравствуйте, Deeman, Вы писали:

Pzz>>Как бы не работала внутри себя функция printf(), в конечном итоге она должна сказать операционной системе, "выведи, пожалуйста, строку "Hello, World!" туда, где у тебя консоль припаяна". Проблема в том, что в Си нет встроенных средств сказать что-либо операционной системе.


D>Как это? А как же мне обращаться к dll-кам? Неужто в С++ нет для этого встроенных средств?


1) И как же в C++ называются встроенные средства для обращения к dll-кам? 2) Какое отношение обращение к dll-кам имеет к решению задачи "сказать что-либо операционной системе"?
Re[14]: Hello, World!
От: Deeman  
Дата: 01.07.10 10:27
Оценка:
Здравствуйте, carpenter, Вы писали:

C>Здравствуйте, Deeman, Вы писали:


C>и еще — погугли — "real hello world" — думаю будет интересно


Вот это круто, спасибо.
Re[4]: Hello, World!
От: Deeman  
Дата: 01.07.10 10:39
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>1) И как же в C++ называются встроенные средства для обращения к dll-кам? 2) Какое отношение обращение к dll-кам имеет к решению задачи "сказать что-либо операционной системе"?


1) Я полагаю примерно так, как написано вот здесь: http://wm-help.net/books-online/print-page/59464/59464-12.html

...при компиляции приведенного выше кода MYLIBAPI за счет заголовочного файла MyLib.h будет определен как _declspec (dllimport). Встречая такой модификатор перед именем переменной, функции или С++-класса, компилятор понимает, что данный идентификатор импортируется из какого-то DLL-модуля


2) Опять же, прибегну к цитате.))

Динамически подключаемые библиотеки (dynamic-link libraries, DLL) — краеугольный камень операционной системы Windows, начиная с самой первой ec версии. В DLL содержатся все функции Windows API. Три самые важные DLL: Kernel32.dll (управление памятью, процессами и потоками), User32.dll (поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений) и GDI32.dll (графика и вывод текста).

Re[5]: Hello, World!
От: Pzz Россия https://github.com/alexpevzner
Дата: 01.07.10 10:47
Оценка:
Здравствуйте, Deeman, Вы писали:

D>

...при компиляции приведенного выше кода 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 как раз является внешней библиотекой
Re[6]: Hello, World!
От: Guard_h4s Россия  
Дата: 01.07.10 11:01
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Топикстартер, кстати, спросил, как напечатать слово без внешних библиотек.

В рамках защищенного режима — никак) любое действие рано или поздно приведет к системному вызову(внешняя библиотека).
Re[6]: Hello, World!
От: Deeman  
Дата: 01.07.10 11:07
Оценка:
Здравствуйте, 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.
Re[7]: Hello, World!
От: Pzz Россия https://github.com/alexpevzner
Дата: 01.07.10 11:31
Оценка:
Здравствуйте, Deeman, Вы писали:

Pzz>>Это не встроенное средство C++, а нестандартное расширение языка, специфическое для данной платформы.


D>Вы придираетесь.))


Отнюдь.

Pzz>>А DLL пишут боги на волшебных божественных языках программирования?


D>Ну, мне казалось, что фундаментальные объекты операционной системы пишут на ассемблере, нет?


Нет. Почти все пишут на Си/С++. Но при этом если надо из user space позвать ядро, используют переходнички, написанные на ассемблере или с использованием нестандартных расширений Си.

Pzz>>Топикстартер, кстати, спросил, как напечатать слово без внешних библиотек. DLL как раз является внешней библиотекой


D>Под библиотеками топикстартер имел в виду заголовочные файлы .h, включаемые в код директивой #include.


Ну, он просто не знал некоторых деталей
Re: Hello, World!
От: GhostCoders Россия  
Дата: 01.07.10 14:42
Оценка:
Здравствуйте, Deeman, Вы писали:

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

D>Изучаю С++ и по ходу обучения появилось желание постичь фундаментальные основы. Желание сформулировалось задачу следущего содержания:
D>"Написать минимальную программу, выводящую в командной строке "Hello, World!", не используя директив #include". (то есть вообще никаких сторонних библиотек, один на один с компилятором и один файл .срр).
D>Существует ли решение? В какую сторону искать? Как, чёрт побери, конкретно работает функция printf()?

Решения этой задачи не существует.

Вообще на голом C или C++ нет способа вывести строчку "Hello, World!" на экран.

Любое решение как или иначе будет или использование внешнего модуля или библиотеки, или использование ассемблера.
Третий Рим должен пасть!
Re[2]: Hello, World!
От: Vamp Россия  
Дата: 01.07.10 14:48
Оценка:
GC>Любое решение как или иначе будет или использование внешнего модуля или библиотеки, или использование ассемблера.
Не обязательно. В незащищенных режимах вполне можно вывести строку, непосредственно обращаясь к видеопамяти. Для этого не нужен ассемблер.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Hello, World!
От: GhostCoders Россия  
Дата: 01.07.10 14:53
Оценка:
Здравствуйте, Vamp, Вы писали:

GC>>Любое решение как или иначе будет или использование внешнего модуля или библиотеки, или использование ассемблера.

V>Не обязательно. В незащищенных режимах вполне можно вывести строку, непосредственно обращаясь к видеопамяти. Для этого не нужен ассемблер.

Но это решение не будет работать на всех платформах, там где видеопамять начинается с другого адреса например.
Вы привели только частное решение.
Третий Рим должен пасть!
Re[4]: Hello, World!
От: Vamp Россия  
Дата: 01.07.10 20:59
Оценка:
GC>Но это решение не будет работать на всех платформах, там где видеопамять начинается с другого адреса например.
Я просто опровергнул квантор всеобщности ("любое решение").
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.