В какой папке находятся файлы создаваемые системой в процессе компиляции
Я делал небольшую программу с визуальной студией. До сих пор каждый раз, когда я отлаживаю .exe создается в основной папке / debug /. Но с сегодняшнего дня в этой папке я нахожу много логов, манифеста и прочего, но нет .exe. Моя программа все еще правильно отлаживает. Что я могу сделать?
Где находится exe файл Visual Studio?
Вот их исполняемые файлы. Все они расположены в C:Program Files (x86)Microsoft Visual Studio 14.0Common7IDE каталоге.
Как отлаживать DLL в Visual Studio?
Отладка из проекта DLL
- Задайте точки останова в проекте DLL.
- Щелкните проект DLL правой кнопкой мыши и выберите Назначить запускаемым проектом.
- Убедитесь, что в поле Конфигурация решений установлено значение Отладка. Нажмите клавишу F5, щелкните зеленую стрелку Запуск или выберите Отладка > Начать отладку.
Чем отличаются расширения java и jar?
Файлы с расширением .java — исходники классов, .class — скомпилированные в байткоды классы, .jar — это обычный архив, типо zip, только как бы джавовский.
Java это исходный код программы, а jar архив в котором хранится папка META-INF и ваш пакет в котором находится байт-код (классы) а так-же прочие файлы.
Решение
Свойства-> Свойства вашего проекта-> Свойства конфигурации-> Общие-> Выходной каталог
Введите полное имя папки, например: C:\Users\dell\Desktop\myfolderproject\bin\debug
3) Ассемблирование
Так как x86 процессоры исполняют команды на бинарном коде, необходимо перевести ассемблерный код в машинный с помощью ассемблера.
Ассемблер преобразовывает ассемблерный код в машинный код, сохраняя его в объектном файле.
Объектный файл — это созданный ассемблером промежуточный файл, хранящий кусок машинного кода. Этот кусок машинного кода, который еще не был связан вместе с другими кусками машинного кода в конечную выполняемую программу, называется объектным кодом.
Далее возможно сохранение данного объектного кода в статические библиотеки для того, чтобы не компилировать данный код снова.
Получим машинный код с помощью ассемблера (as) в выходной объектный файл driver.o:
Но на данном шаге еще ничего не закончено, ведь объектных файлов может быть много и нужно их всех соединить в единый исполняемый файл с помощью компоновщика (линкера). Поэтому мы переходим к следующей стадии.
Как запустить код в Visual Studio 2019?
Чтобы запустить программу в Visual Studio, нажмите комбинацию Ctrl+F5 . Если всё хорошо, то вы увидите следующее: Это означает, что компиляция прошла успешно и результат выполнения вашей программы следующий: Hello, world!
Где находится исполняемый файл Visual Studio?
Вы можете найти его под C:Program Files (x86)Microsoft Visual Studio2017ProfessionalCommon7IDEdevenv.exe .
Где найти exe файл?
Если ярлык программы, EXE-файл которой Вы хотите найти, недоступен, Вы можете просмотреть C:Program Files или C:Program Files (x86) на Вашем компьютере, чтобы найти основную папку программы приложения. Найдите папку с именем, похожим на название издателя программы или название самого приложения.
Этапы компиляции:
Перед тем, как приступать, давайте создадим исходный .cpp файл, с которым и будем работать в дальнейшем.
driver.cpp:
5) Загрузка
Последний этап, который предстоит пройти нашей программе — вызвать загрузчик для загрузки нашей программы в память. На данной стадии также возможна подгрузка динамических библиотек.
Запустим нашу программу:
2) Компиляция
На данном шаге g++ выполняет свою главную задачу — компилирует, то есть преобразует полученный на прошлом шаге код без директив в ассемблерный код. Это промежуточный шаг между высокоуровневым языком и машинным (бинарным) кодом.
Ассемблерный код — это доступное для понимания человеком представление машинного кода.
Используя флаг -S, который сообщает компилятору остановиться после стадии компиляции, получим ассемблерный код в выходном файле driver.s:
Мы можем все также посмотреть и прочесть полученный результат. Но для того, чтобы машина поняла наш код, требуется преобразовать его в машинный код, который мы и получим на следующем шаге.
Зачем нужно компилировать исходные файлы?
Исходный C++ файл — это всего лишь код, но его невозможно запустить как программу или использовать как библиотеку. Поэтому каждый исходный файл требуется скомпилировать в исполняемый файл, динамическую или статическую библиотеки (данные библиотеки будут рассмотрены в следующей статье).
Как запустить получившийся exe файл на исполнение?
Windows. Дважды щелкните по EXE файлу, чтобы запустить его. EXE файлы Windows – это исполняемые файлы, предназначенные для запуска программ. Если EXE файл был скачан из интернета, откроется диалоговое окно с запросом на подтверждение действия.
В какой по дефолту папке обычно лежит екзешник?
В какой папке лежит корзина?
Всем привет. Где лежит файл Корзины? Пробовал искать по Recycle — не находит.
Как узнать в какой папке лежит письмо?
Всем привет. Речь идет о mail8.ntf встала задача выводить в таблице писем еще и папку в которой.
В какой папке WordPress лежит код шапки темы?
Ситуация такая: В шапке стоит слайдер — на слайдер выводится изображение и надпись (установленные.
Какой процент обычно платят дизайнерам?
Добрый день! Начал заниматься мобильной разработкой относительно недавно, сейчас появились.
Дисклеймер: Я не 23 летний сеньор (мне 19 и до сеньора мне еще ой как далеко, года 4, поэтому супер статьи от меня не ждите.
Основа пути моего, разработчика как — обучение/изучение нового постоянное. Надеюсь, у вас тоже.
Я бы хотел подробно рассмотреть процесс компиляции и сборки Android приложения в конечный .apk. Да, при разработке очередного приложения какашкибезholoстилей эта информация вам нафиг не сдалась, но для общего развития будет полезна всем Android разработчикам.
- Напишите код
- Нажмите кнопочку Build & Run в вашей IDE
- Продолжайте быть Android разработчиком
В общих чертах процесс сборки приложения выглядит так:
Нас особенно интересует второй этап (компиляция и сборка ресурсов), так что, рассмотрим его более подробно (21 этап как никак):
Что есть что на диаграмме:
1. Ресурсы приложения — это все xml ресурсы из папки res вашего проекта + некомпилируемые бинарные ресурсы, например, картинки из res/drawable или файлы из /res/raw, а так же файлы из /assets/
2. aapt — утилита, которая ищет в вашем проекте компилируемые ресурсы, такие как AndroidManifest.xml и xml файлы из res/ и компилирует их в бинарное представление, а изначально бинарные ресурсы, такие как картинки, и файлы из /res/raw и /assets не компилируются. Далее, эта утилита генерирует важнейший класс R.java для вашего приложения, благодаря которому вы можете обращаться к ресурсам из вашего кода без всяких заморочек с чтением файлов, как скажем с /assets.
Кстати, кроме компиляции xml ресурсов, aapt создает файл resources.arsc, который представляет собой таблицу для маппинга ресурсов во время выполнения приложение, туда входят все ресурсы из /res/, в том числе и /res/raw/, содержимое /assets не включается в таблицу.
3. R.java — класс, генерируемый утилитой aapt для того, чтобы вы могли обращаться к ресурсам из папки res без явной работы с файловой системой через библиотеки ввода/вывода.
Если кто-то еще не знал — всякие R.string, R.menu и прочее — это статические вложенные классы, а в R.string.app_name, app_name — public static final int поле класса. Получается, что правило-принцип CamelCase, применяемый в Java, для них нарушен, должно то быть: R.String, R.Menu, а с константами — R.String.APP_NAME, айайай Google.
4. Исходный код приложения — это ваши (или украденные форкнутые с других проектов) .java файлы с кодом проекта из папки src, все просто.
5. Java интерфейсы — это не те, обычные интерфейсы (обычные входят в состав исходного кода приложения, предыдущий пункт), которые вы используете в вашем коде, это интерфейсы, сгенерированные утилитой aidl (следующий пункт содержит пояснение).
7. aidl — утилита, которая транслирует ваши .aidl файлы в Java код, она находится в папке platform-tools вашего Android SDK.
8. Java компилятор — (наконец-то мы до него добрались!) это обычный javac из вашего JDK, которому дают на обработку исходный код приложения (4), R.java (3) и интерфейсы aidl, которые переведены в java код с помощью утилиты aidl
9. .class файлы — это «выхлоп» javac — байткод для JVM. Так как Dalvik VM не может интерпретировать java bytecode, а использует свой велосипед под название dex bytecode, то на этом компиляция проекта не заканчивается.
Разработчики Android выбрали регистровую архитектуру Dalvik VM, вместо привычной для JVM — стековой архитектуры из двух ключевых соображений:
1. Производительность регистровой ВМ выше (инфа 100%), особенно на процессорах с RISC-архитектурой, а это все ARM процессоры. Первые версии Dalviik VM даже не включали JIT (до Android 2.2), но давали терпимую производительность приложений, скажем я не испытывал особых проблем с HTC Desire на 2.1.
2. java bytecode транслируется в меньший по объему dex bytecode, что уменьшает размер скомпилированного приложения.
Сам компилятор находится в папке platform-tools вашего Android SDK, запускать его можно через dx.bat (для Windows), при этом будет задействован dx.jar из папки platform-tools/lib
11. Сторонние библиотеки и .class файлы — это все то, что вы подключаете в проект как библиотеку или включаете в Build Path. Так как в качестве основного ЯП для Android выбрана Java, вы можете без проблем использовать практически любые java библиотеки, они просто будут обработаны dex компилятором.
12. classes.dex — в данный файл dex компилятор записывает весь исполняемый код вашего проекта.
Да-да, все будет в одном файле, хотя в документации написано, что файлов .dex может быть несколько, но на практике, я не встречал, чтобы .apk содержал .dex файлы кроме classes.dex, может в комментариях меня поправят.
13. Скомпилированные ресурсы — xml ресурсы приложения, скомпилированные в бинарное представление.
14. Другие ресурсы — это реально другие ресурсы, которые не обрабатываются aapt — например файлы, которые вы зачем то хотите засунуть в .apk, так же туда попадают файлы из .jar`ов, которые добавлены в Build Path, но не являются компилируемыми.
15. apkbuilder — утилита, которой на вход подают скомпилированные ресурсы (2, 13), classes.dex (12) и другие ресурсы (14), а она собирает из этого наш вожделенный .apk файл. Утилита лежит в папке tools вашего Android SDK
16. Собранное приложение в файл .apk — это архив, содержащий скомпилированные и нескомпилированные ресурсы, classes.dex, resources.arsc, META-INF, AndroidManifest.xml и т.д.
Формат .apk это надстройка над .jar, а .jar — надстройка над zip, так что, .apk вы можете открыть zip архиватором, такая вот матрешка.
17. jarsigner — это Oracle`вская утилита для подписания .jar архивов. Он подписывает ваш .apk выбранным вами ключом.
Но не надо думать, что ваш .apk теперь защищен от декомпиляции, ничего подобного. В .apk только добавляется папка META-INF, в которой вы можете обнаружить публичную часть release (или debug) сертификата — файл CERT.RSA, а так же файл CERT.SF — который содержит контрольные суммы для всех файлов внутри .apk, кроме тех, что в папке META-INF
Пример содержания CERT.SF:
Signature-Version: 1.0
SHA1-Digest-Manifest-Main-Attributes: O1qITQssq6nv0FUt+eR1aLnqk5w=
Created-By: 1.6.0_43 (Apple Inc.)
SHA1-Digest-Manifest: OwzyFA/Qjd+5X1ZwaJQSxFgdciU=
Name: res/drawable-mdpi-v4/ic_premium_pin.jpg
SHA1-Digest: 8ksQB8osCHTnMlpL6Ho/GDc719Q=
Name: res/drawable/round_bottom_white.xml
SHA1-Digest: rQelve4dQmwCfkVlYZ2+9j5aW5w=
Еще немного важной информации о подписи приложения:
В Android уникальным идентификатором приложения является имя пакета приложения, например ru.habrahabr.android. Но чтобы злоумышленник не смог подменить ваше установленное приложение на свое с таким же пакетом, Android выполняет проверку, на то чтобы новый .apk был подписан тем же сертификатом, что и уже установленный.
Кроме того, если у вас есть выложенное приложение в Google Play, вы не сможете обновить его, если новая версия подписана другим сертификатом! Так что советую забекапить сертификат, а так же не забыть пароль к нему. Иначе вы не сможете обновлять свои приложения.
18. Debug или Release хранилище ключей — хранилище из которого jarsigner возьмет ключи для подписи приложения. Если вы собираете Debug версию (для запуска на эмуляторе или подключенном устройстве), то .apk подписывается debug ключем, в Windows он находится в папке пользователя/.android/.
19. Подписанный .apk — .apk файл вашего приложения, в который добавлена информация о подписи (см. пункт 17).
Важное замечание: приложение надо сначала подписать, а затем применить zipalign, т.к. подпись — это добавление папки META-INF в архив, а это изменение архива, следовательно нарушение его оптимизации. То есть, если вы сначала примените zipalign, а потом измените архив — смысла в zipalign не будет. Насчет нарушения контрольных сумм, которые рассчитала утилита jarsign, бояться не стоит, т.к. zipalign делает оптимизации по выравниванию данных в архиве, все это происходит на уровне zip, сами данные не изменяются.
Хозяйке на заметку: во время сборки debug версии проекта zipalign не вызывается, скорее всего, чтобы вы не ждали выполнения еще и этой операции (спасибо и на этом).
21. Подписанный (и, возможно, выравненный) .apk — вожделенный .apk вашего приложения. Конец.
Я думаю, что теперь понятно, почему сборка и запуск Android приложения происходит так долго :) Так что, советую поставить SSD, ну и процессор побыстрее и сэкономить себе нервы и время.
Немного полезного оффтопа:
1. Всегда используйте обфускацию вашего кода. Декомпилировать java приложение очень легко. Даже несмотря на то, что в .apk используется dex bytecode — его сначала транслируют обратно в java bytecode, а затем к нему применят обычные java декомпиляторы. Потратьте пару часов на выбор и настройку обфускатора, иначе можете просто выложить исходники проекта на гитхаб, секономите людям время, а может еще и пулл реквесты получите :)
2. Вы знали, что Android инстанциирует для каждого запущенного приложения отдельный экземпляр Dalvik VM? Это сделано для того, чтобы исключить ситуации, когда одно приложение валит Dalvik VM, а за ним тянет все другие запущенные приложения. Яркий пример подобного вмешательства — Facebook, они через reflection изменяют параметры Dalvik VM (не стоит так делать). Если бы Android использовал один инстанс Dalvik — это изменение затронуло бы все запущенные приложения.
3. Dalvik VM не является JVM, т.к. во-первых он не понимает java bytecode, а во-вторых не реализует спецификации для JVM, т.к. использует свой байт код. Так что, советую называть Dalvik VM именно Dalvik VM.
Дисклеймер: Я не 23 летний сеньор (мне 19 и до сеньора мне еще ой как далеко, года 4, поэтому супер статьи от меня не ждите.
Основа пути моего, разработчика как — обучение/изучение нового постоянное. Надеюсь, у вас тоже.
Я бы хотел подробно рассмотреть процесс компиляции и сборки Android приложения в конечный .apk. Да, при разработке очередного приложения какашкибезholoстилей эта информация вам нафиг не сдалась, но для общего развития будет полезна всем Android разработчикам.
- Напишите код
- Нажмите кнопочку Build & Run в вашей IDE
- Продолжайте быть Android разработчиком
В общих чертах процесс сборки приложения выглядит так:
Нас особенно интересует второй этап (компиляция и сборка ресурсов), так что, рассмотрим его более подробно (21 этап как никак):
Что есть что на диаграмме:
1. Ресурсы приложения — это все xml ресурсы из папки res вашего проекта + некомпилируемые бинарные ресурсы, например, картинки из res/drawable или файлы из /res/raw, а так же файлы из /assets/
2. aapt — утилита, которая ищет в вашем проекте компилируемые ресурсы, такие как AndroidManifest.xml и xml файлы из res/ и компилирует их в бинарное представление, а изначально бинарные ресурсы, такие как картинки, и файлы из /res/raw и /assets не компилируются. Далее, эта утилита генерирует важнейший класс R.java для вашего приложения, благодаря которому вы можете обращаться к ресурсам из вашего кода без всяких заморочек с чтением файлов, как скажем с /assets.
Кстати, кроме компиляции xml ресурсов, aapt создает файл resources.arsc, который представляет собой таблицу для маппинга ресурсов во время выполнения приложение, туда входят все ресурсы из /res/, в том числе и /res/raw/, содержимое /assets не включается в таблицу.
3. R.java — класс, генерируемый утилитой aapt для того, чтобы вы могли обращаться к ресурсам из папки res без явной работы с файловой системой через библиотеки ввода/вывода.
Если кто-то еще не знал — всякие R.string, R.menu и прочее — это статические вложенные классы, а в R.string.app_name, app_name — public static final int поле класса. Получается, что правило-принцип CamelCase, применяемый в Java, для них нарушен, должно то быть: R.String, R.Menu, а с константами — R.String.APP_NAME, айайай Google.
4. Исходный код приложения — это ваши (или украденные форкнутые с других проектов) .java файлы с кодом проекта из папки src, все просто.
5. Java интерфейсы — это не те, обычные интерфейсы (обычные входят в состав исходного кода приложения, предыдущий пункт), которые вы используете в вашем коде, это интерфейсы, сгенерированные утилитой aidl (следующий пункт содержит пояснение).
7. aidl — утилита, которая транслирует ваши .aidl файлы в Java код, она находится в папке platform-tools вашего Android SDK.
8. Java компилятор — (наконец-то мы до него добрались!) это обычный javac из вашего JDK, которому дают на обработку исходный код приложения (4), R.java (3) и интерфейсы aidl, которые переведены в java код с помощью утилиты aidl
9. .class файлы — это «выхлоп» javac — байткод для JVM. Так как Dalvik VM не может интерпретировать java bytecode, а использует свой велосипед под название dex bytecode, то на этом компиляция проекта не заканчивается.
Разработчики Android выбрали регистровую архитектуру Dalvik VM, вместо привычной для JVM — стековой архитектуры из двух ключевых соображений:
1. Производительность регистровой ВМ выше (инфа 100%), особенно на процессорах с RISC-архитектурой, а это все ARM процессоры. Первые версии Dalviik VM даже не включали JIT (до Android 2.2), но давали терпимую производительность приложений, скажем я не испытывал особых проблем с HTC Desire на 2.1.
2. java bytecode транслируется в меньший по объему dex bytecode, что уменьшает размер скомпилированного приложения.
Сам компилятор находится в папке platform-tools вашего Android SDK, запускать его можно через dx.bat (для Windows), при этом будет задействован dx.jar из папки platform-tools/lib
11. Сторонние библиотеки и .class файлы — это все то, что вы подключаете в проект как библиотеку или включаете в Build Path. Так как в качестве основного ЯП для Android выбрана Java, вы можете без проблем использовать практически любые java библиотеки, они просто будут обработаны dex компилятором.
12. classes.dex — в данный файл dex компилятор записывает весь исполняемый код вашего проекта.
Да-да, все будет в одном файле, хотя в документации написано, что файлов .dex может быть несколько, но на практике, я не встречал, чтобы .apk содержал .dex файлы кроме classes.dex, может в комментариях меня поправят.
13. Скомпилированные ресурсы — xml ресурсы приложения, скомпилированные в бинарное представление.
14. Другие ресурсы — это реально другие ресурсы, которые не обрабатываются aapt — например файлы, которые вы зачем то хотите засунуть в .apk, так же туда попадают файлы из .jar`ов, которые добавлены в Build Path, но не являются компилируемыми.
15. apkbuilder — утилита, которой на вход подают скомпилированные ресурсы (2, 13), classes.dex (12) и другие ресурсы (14), а она собирает из этого наш вожделенный .apk файл. Утилита лежит в папке tools вашего Android SDK
16. Собранное приложение в файл .apk — это архив, содержащий скомпилированные и нескомпилированные ресурсы, classes.dex, resources.arsc, META-INF, AndroidManifest.xml и т.д.
Формат .apk это надстройка над .jar, а .jar — надстройка над zip, так что, .apk вы можете открыть zip архиватором, такая вот матрешка.
17. jarsigner — это Oracle`вская утилита для подписания .jar архивов. Он подписывает ваш .apk выбранным вами ключом.
Но не надо думать, что ваш .apk теперь защищен от декомпиляции, ничего подобного. В .apk только добавляется папка META-INF, в которой вы можете обнаружить публичную часть release (или debug) сертификата — файл CERT.RSA, а так же файл CERT.SF — который содержит контрольные суммы для всех файлов внутри .apk, кроме тех, что в папке META-INF
Пример содержания CERT.SF:
Signature-Version: 1.0
SHA1-Digest-Manifest-Main-Attributes: O1qITQssq6nv0FUt+eR1aLnqk5w=
Created-By: 1.6.0_43 (Apple Inc.)
SHA1-Digest-Manifest: OwzyFA/Qjd+5X1ZwaJQSxFgdciU=
Name: res/drawable-mdpi-v4/ic_premium_pin.jpg
SHA1-Digest: 8ksQB8osCHTnMlpL6Ho/GDc719Q=
Name: res/drawable/round_bottom_white.xml
SHA1-Digest: rQelve4dQmwCfkVlYZ2+9j5aW5w=
Еще немного важной информации о подписи приложения:
В Android уникальным идентификатором приложения является имя пакета приложения, например ru.habrahabr.android. Но чтобы злоумышленник не смог подменить ваше установленное приложение на свое с таким же пакетом, Android выполняет проверку, на то чтобы новый .apk был подписан тем же сертификатом, что и уже установленный.
Кроме того, если у вас есть выложенное приложение в Google Play, вы не сможете обновить его, если новая версия подписана другим сертификатом! Так что советую забекапить сертификат, а так же не забыть пароль к нему. Иначе вы не сможете обновлять свои приложения.
18. Debug или Release хранилище ключей — хранилище из которого jarsigner возьмет ключи для подписи приложения. Если вы собираете Debug версию (для запуска на эмуляторе или подключенном устройстве), то .apk подписывается debug ключем, в Windows он находится в папке пользователя/.android/.
19. Подписанный .apk — .apk файл вашего приложения, в который добавлена информация о подписи (см. пункт 17).
Важное замечание: приложение надо сначала подписать, а затем применить zipalign, т.к. подпись — это добавление папки META-INF в архив, а это изменение архива, следовательно нарушение его оптимизации. То есть, если вы сначала примените zipalign, а потом измените архив — смысла в zipalign не будет. Насчет нарушения контрольных сумм, которые рассчитала утилита jarsign, бояться не стоит, т.к. zipalign делает оптимизации по выравниванию данных в архиве, все это происходит на уровне zip, сами данные не изменяются.
Хозяйке на заметку: во время сборки debug версии проекта zipalign не вызывается, скорее всего, чтобы вы не ждали выполнения еще и этой операции (спасибо и на этом).
21. Подписанный (и, возможно, выравненный) .apk — вожделенный .apk вашего приложения. Конец.
Я думаю, что теперь понятно, почему сборка и запуск Android приложения происходит так долго :) Так что, советую поставить SSD, ну и процессор побыстрее и сэкономить себе нервы и время.
Немного полезного оффтопа:
1. Всегда используйте обфускацию вашего кода. Декомпилировать java приложение очень легко. Даже несмотря на то, что в .apk используется dex bytecode — его сначала транслируют обратно в java bytecode, а затем к нему применят обычные java декомпиляторы. Потратьте пару часов на выбор и настройку обфускатора, иначе можете просто выложить исходники проекта на гитхаб, секономите людям время, а может еще и пулл реквесты получите :)
2. Вы знали, что Android инстанциирует для каждого запущенного приложения отдельный экземпляр Dalvik VM? Это сделано для того, чтобы исключить ситуации, когда одно приложение валит Dalvik VM, а за ним тянет все другие запущенные приложения. Яркий пример подобного вмешательства — Facebook, они через reflection изменяют параметры Dalvik VM (не стоит так делать). Если бы Android использовал один инстанс Dalvik — это изменение затронуло бы все запущенные приложения.
3. Dalvik VM не является JVM, т.к. во-первых он не понимает java bytecode, а во-вторых не реализует спецификации для JVM, т.к. использует свой байт код. Так что, советую называть Dalvik VM именно Dalvik VM.
В данной статье я хочу рассказать о том, как происходит компиляция программ, написанных на языке C++, и описать каждый этап компиляции. Я не преследую цель рассказать обо всем подробно в деталях, а только дать общее видение. Также данная статья — это необходимое введение перед следующей статьей про статические и динамические библиотеки, так как процесс компиляции крайне важен для понимания перед дальнейшим повествованием о библиотеках.
Все действия будут производиться на Ubuntu версии 16.04.
Используя компилятор g++ версии:
1) Препроцессинг
Самая первая стадия компиляции программы.
Получим препроцессированный код в выходной файл driver.ii (прошедшие через стадию препроцессинга C++ файлы имеют расширение .ii), используя флаг -E, который сообщает компилятору, что компилировать (об этом далее) файл не нужно, а только провести его препроцессинг:
Взглянув на тело функции main в новом сгенерированном файле, можно заметить, что макрос RETURN был заменен:
В новом сгенерированном файле также можно увидеть огромное количество новых строк, это различные библиотеки и хэдер iostream.
Какие файлы имеют расширение exe?
EXE (сокр. англ. executable — исполнимый) — расширение исполняемых файлов, применяемое в операционных системах DOS, Windows, Symbian OS, OS/2 и в некоторых других, соответствующее ряду форматов.
Где найти EXE файл результат компиляции моего проекта?
Как сделать отладку в Visual Studio?
Установка точки останова и запуск отладчика
Где находится Visual Studio Code?
папка: %HOMEPATH%AppDataLocalProgramsMicrosoft VS Code исполняемый файл: %HOMEPATH%AppDataLocalProgramsMicrosoft VS Codebincode.
Заключение
В данной статье были рассмотрены основы процесса компиляции, понимание которых будет довольно полезно каждому начинающему программисту. В скором времени будет опубликована вторая статья про статические и динамические библиотеки.
Файлы, содержащие исходный код, написанный на языке программирования Java, сохраняются с расширением JAVA. Такие файлы могут быть дополнительно скомпилированы в файлы классов с использованием Java-компиляторов. Многие приложения и веб-сайты закодированы в Java или используют Java-компоненты для выполнения различных функций.
JAVA-файлы содержат исходный код Java, который сохранен в текстовом формате. Java — это объектно-ориентированный язык программирования. Данные в файле Java, структурированные с использованием классов, используются для реализации экземпляров различных объектов в определенное время выполнения.
Как создать файл в формате exe?
Часть 1 Как создать EXE-файл
Состав компилятора g++
Мы не будем вызывать данные компоненты напрямую, так как для того, чтобы работать с C++ кодом, требуются дополнительные библиотеки, позволив все необходимые подгрузки делать основному компоненту компилятора — g++.
4) Компоновка
Компоновщик (линкер) связывает все объектные файлы и статические библиотеки в единый исполняемый файл, который мы и сможем запустить в дальнейшем. Для того, чтобы понять как происходит связка, следует рассказать о таблице символов.
Таблица символов — это структура данных, создаваемая самим компилятором и хранящаяся в самих объектных файлах. Таблица символов хранит имена переменных, функций, классов, объектов и т.д., где каждому идентификатору (символу) соотносится его тип, область видимости. Также таблица символов хранит адреса ссылок на данные и процедуры в других объектных файлах.
Именно с помощью таблицы символов и хранящихся в них ссылок линкер будет способен в дальнейшем построить связи между данными среди множества других объектных файлов и создать единый исполняемый файл из них.
Получим исполняемый файл driver:
Как именно происходит компиляция java?
хорошо, я знаю это: мы пишем исходный код java, компилятор, который не зависит от платформы, переводит его в байт-код, а затем jvm, который зависит от платформы, переводит его в машинный код.
Итак, с самого начала мы пишем исходный код java. Компилятор javac.exe это .файл EXE. Что именно это .exe-файл? Разве компилятор java не написан на java, тогда как это происходит .exe-файл, который его выполняет? Если код компилятора пишется java, тогда как код компилятора выполняется на этапе компиляции, так как его работа jvm для выполнения кода java. Как может сам язык компилировать свой собственный код языка? Все это кажется мне проблемой курицы и яйца.
теперь что именно делает .файл класса содержит? Это абстрактное синтаксическое дерево в текстовой форме, это табличная информация, что это такое?
может кто-нибудь сказать мне, ясно и подробно о том, как мой исходный код Java преобразуется в машинный код.
хорошо, я знаю это: мы пишем исходный код java, компилятор, который не зависит от платформы, переводит его в байт-код,
собственно сам компилятор работает как собственный исполняемый файл (отсюда javac.исполняемый.) И правда, он преобразует исходный файл в байт-код. Байт-код не зависит от платформы, поскольку он предназначен для виртуальной машины Java.
затем jvm, который зависит от платформы, переводит его в машину код.
не всегда. Как для JVM от Sun существует две виртуальные машины: клиентом и сервером. Они оба могут, но не обязательно должны компилироваться в машинный код.
Итак, с самого начала мы пишем исходный код java. Компилятор javac.exe это .файл EXE. Что именно это .exe-файл? Разве компилятор java не написан на java, тогда как это происходит .exe-файл, который его выполняет?
этой exe файл представляет собой обернутый байт-код java. Это удобство-избежать сложных пакетных сценариев. Он запускает JVM и выполняет компилятор.
если код компилятора написан на java, то как код компилятора выполняется на этапе компиляции, так как его работа jvm для выполнения кода java.
это именно то, что делает код упаковки.
как может сам язык компилировать свой собственный код языка? Все это похоже на проблему курицы и яйца мне.
правда, сбивает с толку на первый взгляд. Хотя, это не только идиома Java. Компилятор Ada также написан в самой Ada. Это может выглядеть как "проблема курицы и яйца", но на самом деле это проблема только загрузчик.
теперь что именно .файл класса содержит? Это абстрактное синтаксическое дерево в текстовой форме, это табличная информация, что это такое?
это не абстрактное синтаксическое дерево. AST используется только токенизатором и компилятор во время компиляции представляет код в памяти. .class файл похож на сборку, но для JVM. JVM, в свою очередь, является абстрактной машиной, которая может запускать специализированный машинный язык, предназначенный только для виртуальной машины. В нем проще всего, .class файл имеет очень похожую структуру на обычную сборку. В начале объявляются все статические переменные, затем идут некоторые таблицы сигнатур внешних функций и, наконец, машинный код.
Если вам действительно интересно, вы можете копать classfile с помощью утилиты" javap". Вот пример (запутанный) вывода вызова javap -c Main :
так что вы уже должны иметь представление, что это такое на самом деле.
может кто-нибудь сказать мне, ясно и подробно о том, как мой исходный код Java преобразуется в машинный код.
Я думаю, что это должно быть более ясно прямо сейчас, но вот краткое резюме:
вызов javac указывая на исходный код файл. Внутренний читатель (или токенизатор) javac считывает ваш файл и создает из него фактический AST. Все синтаксические ошибки происходят с этого этапа.
The javac еще не закончил работу. Когда у него есть AST, может начаться истинная компиляция. Он использует шаблон посетителя для обхода AST и разрешает внешние зависимости, чтобы добавить значение (семантику) в код. Готовый продукт сохраняется как содержащий байткод.
теперь пришло время запустить эту штуку. Вы вызываете java именем .файл классов. Теперь JVM начинается снова, но до интерпретировать ваш код. JVM может или не может скомпилировать ваш абстрактный байт-код в собственную сборку. Компилятор Sun HotSpot в сочетании с компиляцией Just In Time может сделать это, если это необходимо. Запущенный код постоянно профилируется JVM и перекомпилируется в машинный код, если выполняются определенные правила. Обычно элемент горячий код является первым для компиляции в собственном коде.
правка: без javac можно было бы вызвать компилятор, используя что-то вроде этого:
как вы можете видеть, он вызывает частный API Sun, поэтому он связан с реализацией Sun JDK. Это сделало бы системы сборки зависимыми от него. Если один переключился на любой другой JDK (wiki lists 5, кроме Sun) , то выше код должен быть обновлен, чтобы отразить изменение (так как это маловероятно компилятор будет находиться в COM.солнце.инструменты.и javac пакет). Другие компиляторы могут быть написаны в машинном коде.
разве компилятор java не написан на java, тогда как это происходит .exe-файл, который его выполняет?
откуда вы получаете эту информацию? Элемент javac исполняемый файл может быть написан на любом языке программирования, это не имеет значения, все, что важно то, что это исполняемый файл, который получается .java файлы .class файлы.
для получения подробной информации о двоичной спецификации a .файл класса вы можете найти эти главы в Java Спецификация Языка полезно (хотя, возможно, немного технически):
вы также можете взглянуть на Спецификация Виртуальной Машины, которая включает:
компилятор javac.exe это .файл EXE. Что именно это .exe-файл? Не компилятор java, написанный на java, тогда как же так получилось .EXE-файл, который исполняет его?
компилятор Java (по крайней мере тот, который поставляется с Sun/Oracle JDK) действительно написан на Java. javac.exe — Это просто средство запуска, которое обрабатывает аргументы командной строки, некоторые из которых передаются в JVM, который запускает компилятор, а другие-в компилятор себя.
Если код компилятора написан java, тогда как код компилятора выполняется на этапе компиляции , так как его работа jvm для выполните код java. Как может язык сам компилируешь свой собственный языковой код? Все это похоже на курицу и яйцо проблема для меня.
многие (если не большинство) компиляторы написаны на языке, который они компилируют. Очевидно, что на каком-то раннем этапе компилятор сам должен был быть скомпилирован чем-то иначе, но после этой "начальной загрузки", любая новая версия компилятора может быть скомпилирована более старой версией.
теперь что именно .файл класса содержать? Это абстрактное синтаксическое дерево в текстовой форме, это таблично информация, что это?
подробности формата файла класса описаны в спецификация виртуальной машины Java.
ну, javac и jvm обычно являются собственными двоичными файлами. Они написаны на Си или что-то еще. Конечно, можно написать их на Java, просто вам сначала нужна родная версия. Это называется "привязка ботинка".
забавный факт: большинство компиляторов, которые компилируются в машинный код, написанный на их родном языке. Однако все они должны были иметь родную версию, написанную на другом языке (обычно C). Первый компилятор C, для сравнения, был написан на ассемблере. Я предполагаю, что первый ассемблер был написан в машинном коде. (Или,С помощью бабочек;)
.файлы классов-это байт-код, генерируемый javac. Они не текстовые, это двоичный код, похожий на машинный код (но с другим набором команд и архитектурой).
jvm во время выполнения имеет два варианта: он может либо интепретировать байтовый код (притворяясь самим процессором), либо он может JIT (just-in-time) скомпилировать его в собственный машинный код. Последнее, конечно, быстрее, но все гораздо сложнее.
The .файл класса содержит байт-код, который является вроде очень сборка высокого уровня. Компилятор вполне может быть написан на Java, но JVM должен быть скомпилирован в машинный код, чтобы избежать проблемы курицы/яйца. Я считаю, что он написан на C, как и нижних этажах стандартных библиотек. Когда JVM запускается, он выполняет компиляцию just-in-time, чтобы превратить этот байт-код в собственные инструкции.
Краткое Описание
напишите код в текстовом редакторе, сохраните его в формате, понятном компилятору —".java" расширение файла, javac (компилятор java) преобразует это в ".класс" формат файла (байт — код-класс файла). Для JVM выполняет .файл класса в операционной системе, в которой он находится.
Длинное Объяснение
всегда помните, что java не является базовый язык, который распознает операционная система. Исходный код Java интерпретируется операционной системой с помощью переводчика под названием виртуальная машина Java (JVM). JVM не может понять код, который вы пишете в Редакторе, ему нужен скомпилированный код. Вот где компилятор входит в картину.
каждый компьютерный процесс позволяет себе манипуляции с памятью. Мы не можем просто написать код в текстовом редакторе и скомпилировать его. Нам нужно поместить его в память компьютера, то есть сохранить его до того, как скомпилировать.
Как javac (компилятор java) распознает сохраненный текст как тот, который будет скомпилирован? — у нас есть отдельный текстовый формат, который распознает компилятор, т. е. .java. Сохраните файл внутри .расширение Java и компилятор распознает его и скомпилировать его, когда спросил.
что происходит при компиляции? — компилятор-это второй переводчик (не технический термин), участвующий в процессе, он переводит понятный пользователю язык (java) в JVM понятный язык(байтовый код — .формат класса).
что происходит после компиляции? — компилятор выдает .файл класса, который понимает JVM. Затем программа выполняется, то есть.файл класса выполняется с помощью виртуальной машины и операционной системы.
факты, которые вы должны знать
1) Java не Multi-платформы это независимая платформа.
2) JVM является разработано с использованием C / C++. Одна из причин, почему люди называют Java более медленным языком, чем C/C++
3) байтовый код Java (.класс) находится в "Ассемблере", единственный язык, понятный JVM. Любой код, который производит .файл класса при компиляции или сгенерированный байтовый код может быть запущен на JVM.
Windows не знает, как вызывать программы Java перед установкой среды выполнения Java, и Sun выбрала собственные команды, которые собирают аргументы, а затем вызывают JVM вместо привязки jar-суффикса к движку Java.
Решение
Свойства-> Свойства вашего проекта-> Свойства конфигурации-> Общие-> Выходной каталог
Введите полное имя папки, например: C:\Users\dell\Desktop\myfolderproject\bin\debug
Как открыть exe файл в Visual Studio?
Создание EXE-проекта для существующего приложения
- В Visual Studio последовательно выберите Файл > Открыть > Проект.
- В диалоговом окне Открыть проект выберите Все файлы проекта, если они еще не выбраны, в раскрывающемся списке рядом с полем Имя файла.
- Перейдите к EXE-файлу, выберите его и щелкните Открыть.
Как сохранить файл в Visual Studio?
В visual studio code на сегодняшний день Вы можете нажать Ctrl + K + S чтобы сохранить все несохраненные файлы, открытые в данный момент в вашем редакторе.
Как декомпилировать exe файл?
- Способ 1: VB Decompiler.
- Способ 2: ReFox.
- Способ 3: DeDe.
- Способ 4: EMS Source Rescuer.
Читайте также: