Время компиляции в телефоне что это
В информатике , во время компиляции (или во время компиляции ) относится либо операции , выполняемые с помощью компилятора (в «время компиляции операции»), язык программирования , требование , которые должны быть выполнены с помощью исходного кода для того , чтобы быть успешной компиляцией (далее " требования времени компиляции "), или свойства программы, которые могут быть рассмотрены во время компиляции. Время компиляции относится к продолжительности времени, в течение которого программный код преобразуется в машинный код (т. Е. Двоичный код) и обычно происходит до времени выполнения .
Время компиляции / раннее связывание против времени выполнения
Определение модели выполнения было установлено на этапе компиляции. Время выполнения - метод выполнения и распределения был установлен во время выполнения и основан на динамике времени выполнения.
Обзор
Операции, выполняемые во время компиляции, обычно включают синтаксический анализ , различные виды семантического анализа (например, проверки типов и создание экземпляра шаблона ) и генерацию кода .
Определения языков программирования обычно указывают требования ко времени компиляции, которым должен соответствовать исходный код для успешной компиляции. Например, в языках может быть оговорено, что объем памяти, необходимый для типов и переменных, может быть вычислен.
Свойства программы, о которых можно рассуждать во время компиляции, включают проверки диапазона (например, доказательство того, что индекс массива не выходит за границы массива), свободу тупиковых ситуаций в параллельных языках или тайминги (например, доказательство того, что последовательность кода принимает не более выделенного количества времени).
Время компиляции происходит до того времени связи (когда выход одного или несколько файлов скомпилированных соединены вместе) и выполнения (когда программа будет выполнена ). В некоторых языках программирования может потребоваться некоторая компиляция и компоновка во время выполнения. Существует компромисс между временем компиляции и временем компоновки в том, что многие операции времени компиляции могут быть отложены до времени компоновки без дополнительных затрат времени выполнения.
«Время компиляции» также может относиться к количеству времени, необходимого для компиляции.
Смотрите также
Эта статья по информатике незавершена . Вы можете помочь Википедии, расширив ее .
Дисклеймер: Я не 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++) на Андроиде? Я в этом без понятия, но знаю что это достаточно сложно.
Ваш код написан к примеру на Java (Это более частый случай). Каждое Android -приложение состоит из компонентов. Компоненты реализованы в виде Java-классов.
Например, Activity в Android представляет экран или часть экрана устройства пользователя. Это экземпляр класса Java с именем Android.app.Activity .
Другим примером является элемент пользовательского интерфейса Button . Кнопка в приложении Android - это экземпляр класса Java с именем Android.widget.Button .
1. Компиляторы Android (DALVIK vs ART)
Ваш исходный код компилируется стандартным компилятором Java, который использует модель компиляции JIT-Just-In-Time. Как только код скомпилирован, он становится байт-кодом (с расширением «.class»). Этот код идет на второй раунд компиляции (опять-таки к байт-коду - но на этот раз он свернут). Байт-код исполняется с помощью JVM для конкретных целей (виртуальная машина Java), которая является средой выполнения для Java. Но для Android у нас есть две разные виртуальные машины:
DALVIK
До ART (который был представлен с выпуском Android 4.4, то есть Kitkat), средой выполнения для приложений Android была DALVIK. У DALVIK был один существенный недостаток - это было МЕДЛЕННО!
Пользователям было неприятно использовать свои приложения на своих устройствах, поскольку приложения зависали во время работы.
Dalvik использует модель компиляции JIT. JIT-компилятор компилирует приложение, когда они открываются пользователями (процедура запуска приложения). Таким образом, это замедляло открытие приложений и, в свою очередь, затрудняло работу пользователя.
ART использует опережающую модель компиляции, которая компилирует приложения в машинный код после установки
Приложения работают немного быстрее! в рамках ART время запуска приложений сокращается.
Он также улучшил сборку мусора, так что пользователь видит меньше пауз и заиканий в среде с низким объемом памяти. АРТ имеет свои ограничения:
- Проблема со временем установки: Процесс установки медленный с ART, поскольку преобразование приложений в машинный код занимает много времени.
- Проблема размера: компиляция кода после установки означает, что приложение должно «жить» на вашем устройстве. Таким образом, для относительно меньшего Java-кода машина или байт-код будут сравнительно большими.
Вот тут обсуждают что лучше Dalvik или ART.
2. Процесс компиляции Android
2.1. Из исходного кода в байт-код
Вам понадобится JDK (Java Developer Kit) для компиляции кода Java вашего приложения.
Ваш код и предварительно скомпилированные классы из среды выполнения и пользовательских библиотек сначала компилируются Javac (JIT Compiler / Standard Java Compiler) .
Javac выводит набор файлов байт-кода Java. Пока это выглядит как любой процесс компиляции Java , но следующий шаг компиляции делает процесс компиляции уникальным для Android .
2.2. Обфускатор (ProGuard инструмент)
Этот шаг не является обязательным, вы можете пропустить этот шаг, если хотите.
Инструмент ProGuard берет файлы байт-кода Java (выводится как шаг № 1) и отправляет их через инструмент с именем ProGuard. Это сведет к минимуму и запутает (то есть - сделает неясным, неясным или неразборчивым) ваш код.
По умолчанию он отключен в новых проектах Android , но когда ProGuard включен, он анализирует ваш код и удаляет реализации методов, например, которые не вызываются.
Это может значительно сократить ваш пакет распространяемого приложений. Он также запутывает ваш код, изменяя имена методов и так усложняя декомпиляцию упакованного Java-кода третьим лицом или организацией.
Независимо от использования ProGuard вы снова получите файлы .class (минимизированный байт-код).
2.3. От минимизированного байт-кода до кода dex
Следующим шагом является получение выходных файлов из шага № 2 и преобразование этих файлов в байт-код dex - Dalvik EXecutable (.DEX) .
Байт-код DEX - это формат, оптимизированный для Android , который может быть выполнен в более старой среде выполнения DALVIK или более новой среде выполнения ART .
2.4. Исполнение машинного кода
Во время выполнения устройства считывают эти файлы dex (вывод шага № 3) и перекомпилируют некоторые файлы в машинный код для максимально быстрого выполнения.
В DALVIK этот шаг происходит, когда приложение работает с использованием архитектуры Just-In-Time или JIT .
В более новой версии ART перекомпиляция (или перевод в машинный код) происходит при первой установке приложения, что означает, что приложение может работать быстрее, когда пользователь запускает его на своем устройстве.
И вот как ваш код Java превращается во что-то, что работает на Android . Он начинается с Java и через пару шагов превращается в то, что может прочитать и выполнить среда выполнения Android .
Вот еще есть иллюстрация:
Вот ссылки после исследования вопроса. Некоторые были использованы для построения этого вопроса: ссылка_1 и ссылка_2. А вот и первоисточник этого ответа. Данная информация находится в полностью свободном доступе :) Надеюсь вам стало немного понятнее как именно компилируются приложения.
В информатике, к понятию времени компиляции могут относиться либо операции, проводимые компилятором и относящиеся к требованиям языка программирования (исходный код должен соответствовать правилам языка для того, чтобы успешно компилироваться), либо это свойства программы, которые могут быть выяснены в ходе компиляции. Ко времени компиляции относится время в течение которого, выражения написанные на любом языке программирования проверяются на ошибки.
Операции, выполняемые во время компиляции, как правило, включают в себя синтаксический анализ, различные виды семантического анализа (например, проверки типов и инстанцирования шаблона) и генерации кода.
Правила языка программирования, как правило устанавливают требования времени компиляции, которым исходный код должен удовлетворять, чтобы быть успешно скомпилированным. Например, в языке может существовать строгое правило, что количество места (в байтах) требуемого для хранения типов и переменных должно быть вычислимым.
Свойства программ, которые могут быть выяснены во время компиляции, это например:
- Проверка границ масивов (например, доказательством того, что индекс массива не будет выходить за границы массива)
- Отсутствие взаимных блокировок в параллельных языках
- Тайминги (например, доказательство, что определенный код выполняется не дольше отведенного времени)
Время компиляции происходит раньше времени компоновки (когда вывод одного или нескольких скомпилированных файлов объединяется вместе) и раньше времени выполнения (когда программа будет исполнена). В некоторых языках программирования может быть необходимо чтобы часть компиляции или компоновки происходила во время выполнения. Существует компромисс между временем компиляции и временем компоновки, состоящий в том, что многие операции времени компиляции могут быть отложены до времени компоновки без дополнительных временных трат.
«Время компиляции» может также относиться к фактическому количеству времени, необходимому для компиляции.
Чаще всего этот термин используют в программировании, но так же он употребим в литературе, научных трудах, музыке и финансах.
Компиляция — это.
Слово образовано от латинского compilatio, и буквально переводится как «ограбление или кража». Но в отрицательном контексте его можно встретить всё же намного реже, чем в положительном.
Компиляция — это сочинительство (не обязательно литературное) на основе чужих работ и исследований. Она представляет пересказ написанного кем-то ранее, и поэтому ничего нового не даёт.
Но на самом деле, даже в таком виде она бывает полезной. Ведь если человек, создающий сие сочинение, хорошо разбирается в теме, и связывает чужие используемые отрывки своими рассуждениями и связками, с помощью которых легче отследить логическую цепочку. И это очень важно и полезно.
Такие известные писатели, как С.Цвейг, А.Моруа, были отличными компиляторами, произведениями которых зачитывалось не одно поколение любителей литературы.
Компиляция текста — что это такое
Само понятие существует столько же, сколько талантливые книги, как научные, так и художественные.
Профессиональные компиляторы ставят в конце своего нового текста список материалов, которые они использовали. И то, что список, как правило, очень большой, уже говорит о серьёзной проделанной работе.
Количество источников — важное отличие от плагиата.
Использование множества источников создаёт информативный материал, в котором можно найти большое количество данных по заданной теме. В положительном контексте это служит популяризаторским и просветительским целям.
Но трактование слова компиляция в смысле «кража» тоже встречается.
Это, например, почти все газеты и журналы, которые очень часто вместо собственных мыслей и описаний событий, используют уже готовые, взятые в интернете, и только пересказанные своими словами, не исключено, что ещё и с искажением смысла. Случайным, или не очень, если издание ангажированное (это как?).
Компиляция в программировании — что это
Это трансляция программы, написанной на высокоуровневом языке, в программу с языком более низкого уровня, но с совпадающим или похожим машинным кодом. Для этого используются компиляторы.
Существует несколько категорий компиляции:
- условная, когда у транслируемого текста те же нормы, что и в первоначальном варианте;
- пакетная, с использованием нескольких модулей в задании;
- построчная — поочерёдная интерпретация завершённой грамматической конструкции.
Именно в программировании термин встречается особенно часто, в других сферах он чаще заменяется синонимами.
Другие примеры употребления термина
- В музыке это понятие распространено не меньше, чем в литературе, но означает несколько иное.
- Компиляцией можно назвать любое попурри.
По утверждению википедии, попурри, pot-pourri — мешанина. В переводе с французского, музыкальная пьеса из популярных мотивов и музыкальных тем. Но попурри отличается тем, что часто является импровизацией, а не ранее оформленным альбомом.
Они могут быть разными, например: составленные из узнаваемых работ одного автора, созданных им в разное время; хитпарады; музыка одного стиля, сборники одного автора или исполнителя.
Они не обязательно составляются из известных музыкальных произведений. Так называют альбомы редких записей, саундтреков к фильмам, просто жанровые сборники.
Классические танцы дополняет современный, балет (это что?) и брейк одновременно существуют на одной сцене. Музыкальное сопровождение полностью эклектично. Представители стиля — канадский цирк Дюсалей, театр Моники (США), Театр Золотых фигур (Россия).
Например, если требуется подготовить консолидированную отчётность, или отчётность по МФСО.
Эта статья относится к рубрикам:
Комментарии и отзывы (4)
Сейчас весь мир помешался на уникальности текстов, в том числе и в научных работах. Пропускают текст через специальную программу, которая выдаёт в процентах уникальность работы, вот с компиляцией тут вообще теперь ловить нечего, даже ссылки на цитируемые источники не помогут, ибо программе на них плевать, а люди за ней не подчищают.
Не соглашусь с Владимиром — учитывая сколько сейчас пишется научных работ, без компиляции никак не обойтись.
Компилируемые программы работают куда быстрее транслируемых, а всё потому что, во время работы программы не тратится время на преобразование исходного кода в машинный.
Читайте также: