Рассекающие функции

Мне любопытно посмотреть, как была написана функция cout, где ее искать?

Мой второй вопрос: могу ли я действительно разобрать каждый компонент языка, чтобы понять его?

Например, я могу посмотреть, как компилятор читает операторы? Даже если это в машинном коде, как я могу найти себя в нем?

-2

Решение

Мне любопытно посмотреть, как была написана функция cout, где ее искать?

cout это не функция. Вы имеете в виду один из operator<< функции-члены или не-члены для потоков вывода.

В любом случае, хотя стандарт C ++ не предписывает файлы для заголовков стандартной библиотеки, эти функции обычно реализуются в терминах самого языка и находятся в файлах, которые поставляются с вашим компилятором. Например, в моей системе Windows есть файл с именем C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\iostream, который компилятор Visual C ++ использует для обработки строки, как #include <iostream> в коде пользователя.

Ожидайте увидеть в этих файлах много нестандартных, трудно читаемых, зараженных макросами и недокументированных внутренних псевдо-C ++.

Мой второй вопрос: могу ли я действительно разобрать каждый компонент языка, чтобы понять его?

Только если компилятор с открытым исходным кодом, например, GCC, но не Visual C ++, и только если вы достаточно разбираетесь в написании компилятора.

Например, я могу посмотреть, как компилятор читает операторы?

Только если компилятор с открытым исходным кодом, например, GCC, но не Visual C ++, и только если вы достаточно разбираетесь в написании компилятора.

Даже если это в машинном коде, как я могу найти себя в нем?

Узнайте, как посмотреть разборки в вашей системе и с вашими инструментами.

1

Другие решения

Большая часть C ++ — это Стандартная библиотека, написанная на C ++. Если вы хотите изучить его части, нет проблем — просто посмотрите в соответствующий заголовочный файл — для cout, его iostream, расположенный где-то в вашей файловой системе.

Если вы используете отладчик (например, MS Visual Studio или gdb), вы можете «шагнуть» внутрь реализации, как если бы это был ваш собственный код. Например, в Visual Studio при отладке следующей строки кода

std::cout << "hello";

вы нажимаете F11, и он покажет вам реализацию соответствующих operator<<,

Части «основного» языка C ++ не могут быть рассмотрены таким образом. Однако вместо этого вы можете просмотреть сгенерированный машинный код. Например, вам интересно, как ваш компилятор реализует виртуальные функции? Нажмите Ctrl+F11 в Visual Studio, и он покажет вам код.

Граница между «основными» и «библиотечными» функциями немного размыта. Вещи как dynamic_cast могут быть реализованы с помощью специальных функций C / C ++ или машинного кода — вы должны открыть это для себя. В любом случае, это легко отлаживать / исследовать.

1

Изучайте язык ассемблера, вероятно, не x86, поскольку это стало очень сложным. Выберите чип RISC, например, в Raspberry PI.

Вы увидите, что такие языки, как C, довольно легко собираются. Практически каждый оператор C имеет эквивалент, который представляет собой один или два оператора сборки. Есть даже такие вещи, как ++, соответствующие INC (инкремент ассемблера), когда язык мог быть определен как разрешающий только + = 1.

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

0

Вы можете попробовать проанализировать ассемблерный код, сгенерированный из кода C ++.

https://godbolt.org/ <- Это хороший инструмент, потому что он позволяет показать, как разные компиляторы генерируют одни и те же вещи. Вы можете сравнить их.

Если вы хотите увидеть, как это написано на C ++, вы можете посмотреть на это в iostream стандартная библиотека.

0
По вопросам рекламы [email protected]