Используются ли компиляторы вне разработки?

14

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

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

Есть ли функции компиляторов вне этого процесса? Если да, то когда они используются?

Панкадж Упадхяй
источник
21
Да, компиляторы компилируют код.
Том Сквайрс
@ Том: Я где-то читал, что C-компиляторы установлены на разных машинах, включая игровые приставки. Означает ли это, что мы пишем код на C, который затем отправляется на эти устройства, где компилируется компилятором, а затем выполняется интерпретатором?
Панкадж Упадхьяй
3
@Pankaj Upadhyay: возможно, что код может быть отправлен на компьютер, а затем скомпилирован внутренним процессом. Маловероятно, что пользователь устройства когда-либо увидит это или узнает об этом. Это может быть сделано, если части кода необходимо компилировать для конкретного оборудования, а решения, которые тестируют оборудование во время выполнения, слишком медленны, что приводит к необходимости распространять код и компилировать во время установки. Возможно ...
FrustratedWithFormsDesigner
3
@Pankaj Игровые приставки не поставляются с компиляторами, но некоторые из них могут быть установлены на них. Sony предоставила версию Linux и GCC, которую можно установить, например, на PS2. Другие люди взломали / взломали свой путь для загрузки других консолей и ОС на программное обеспечение.
IronMensan
4
@Stargazer: Вы имели в виду: «Нет, компиляторы переводят с исходного языка на целевой язык»? Если вы пропустите запятую, ваше предложение будет означать противоположность вашего предполагаемого значения.
Даниэль Приден

Ответы:

19

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

Там являются несколько исключений из этого , хотя. Во-первых, многие проекты с открытым исходным кодом распространяются в основном (или даже исключительно) в форме исходного кода, и ожидают, что конечный пользователь установит их, введя пару команд, таких как makeи затемmake intall, Это вызовет компилятор, компоновщик и т. Д., Чтобы сгенерировать машинный код из исходного кода для этого компьютера пользователя. В этих случаях, однако, процесс сборки и установки (по крайней мере, предполагается) автоматизирован до такой степени, что пользователю редко требуется много знаний об этом, за исключением того факта, что, если они никогда ранее не устанавливали пакет только с исходным кодом, ранее их менеджер пакетов, как правило, перечисляет некоторый пакет «разработки» в качестве предварительного условия для установки приложения, которое им действительно нужно (хотя некоторые все еще считают это недружественным для конечных пользователей).

Другое исключение (на которое ссылались, но которое не очень хорошо объяснено в других ответах, которые я видел) - это JIT-компиляторы. Несколько очевидных примеров JIT-компиляторов - Microsoft Common Language Runtime (CLR) и виртуальная машина Java (JVM). В этих случаях обычно есть два совершенно отдельных компилятора, вовлеченных в перевод исходного кода в машинный код. Один используется разработчиком. Однако вместо того, чтобы генерировать машинный код напрямую, он генерирует машинно-независимый байт-код. Затем CLR / JVM включает второй компилятор, совершенно отдельный от первого, который преобразует эти байтовые коды в машинный код для целевого компьютера.

Я должен добавить, что второй компилятор не является строго необходимым. Ранние версии JVM (для одного примера) просто интерпретировали байтовые коды, а не компилировали их. Это часто несет в себе довольно серьезное снижение производительности, поэтому наиболее разумно недавние JVM, предназначенные для производственного использования, включают JIT-компилятор.

Джерри Гроб
источник
24

Да, компиляторы в основном используются разработчиками, за исключением нескольких заметных исключений. Конечные пользователи иногда используют компиляторы для компиляции и установки последних версий программного обеспечения с открытым исходным кодом, даже если они не вносят никаких изменений в код. Кроме того, некоторые языки программирования не имеют компиляторов. Вместо этого они используют интерпретаторы, которые «компилируются» на лету. В этом случае конечным пользователям необходимо установить переводчик на своих машинах.

Карл Билефельдт
источник
4
Если бы мы ограничили определение «компиляторы» программами, которые генерируют исполняемые файлы, то это был бы хороший ответ. Тем не менее, это всего лишь подмножество истинного определения «компилятор»
riwalk
16
@ Ян Солтис: я не согласен. Я составил ядро Linux из исходных текстов: это значит , что я ядро Linux разработчик ? Я никогда не изменял код ядра Linux и не представлял патч - я бы сказал, что я не являюсь разработчиком ядра. Кроме того, в течение нескольких лет, в течение которых я использовал Gentoo в качестве основной операционной системы, я собирал все части программного обеспечения на компьютере. Однако подавляющее большинство из них были скомпилированы автоматически системой управления пакетами Portage. Я бы сказал, что в этом случае я действовал как конечный пользователь, а не как разработчик .
Даниэль Приден
8
@ Ян Солтис: я знаю, что это ваше мнение. Я с уважением не согласен. Я предоставил контраргументы в поддержку моей позиции, в то время как вы продолжаете делать неподтвержденные утверждения. Вы, кажется, думаете, что существует четкая грань между «разработчиком» и «конечным пользователем», которая, я не верю, существует.
Даниэль Приден
6
Скачивание исходников и запуск "make install" не является разработчиком. Это определенно операция конечного пользователя.
Кристофер Джонсон
3
@Jan: Я мог бы принять , что использование дистрибутива , как Gentoo , который компилирует пакеты делает вас по крайней мере, мощности пользователя, но это по - прежнему явно тип пользователя. Компиляция чужого кода, без его изменения, добавления или даже чтения, не делает вас разработчиком.
Carson63000
10

да

Компилятор определяется как программа, которая переводит код с одного языка на другой (см. Википедию ). Наиболее распространенное использование компиляторов - это перевод исходного языка в машинный код, но это определяет слово «компилятор».

Например, Python генерирует байт-код при импорте модуля и, таким образом, вписывается в определение компилятора (потому что он преобразует из исходного языка Python в целевой язык, байт-код Python).

Другой пример - движок V8 JavaScript. Он преобразует JavaScript в машинный код x86 и, следовательно, вписывается в определение компилятора. V8 не только подходит под определение компилятора, но и включен в Chrome и очень широко используется на клиентских компьютерах.

riwalk
источник
4

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

Изменить: Есть и другие исключения, но они уже упоминались в других ответах.

Морган Херлокер
источник
+1 просто скажи JIT
gnat
1
Двигатель V8 в Chrome не является странным исключением.
riwalk
Обновлено, чтобы уточнить. Я понимаю, что есть и другие исключения.
Морган Херлокер
3

компиляторы предназначены только для разработчиков для компиляции их кода языка программирования в исполняемые файлы (машинный код)

Я бы сказал, что «компиляторы предназначены для разработчиков ...». Но я видел примеры, когда программы генерируют новый код языка программирования на лету и поэтому нуждаются в установке компилятора на компьютере конечного пользователя. Это не означает, что конечный пользователь должен работать с компилятором сам по себе.

Возможные причины такого дизайна программы:

  • производительность: представьте себе приложение, управляемое правилами, где правила хранятся в каком-то хранилище данных конечного пользователя, и у вас есть некоторые массовые данные, которые будут обработаны этими правилами. Вместо того, чтобы интерпретировать правила снова и снова, программа сначала генерирует код обработки, компилирует его и запускает его для обработки данных.

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

Док Браун
источник
хм .... Это не значит, что конечный пользователь должен работать с компилятором сам по себе . Это в значительной степени объясняет и разъясняет.
Панкадж Упадхьяй
2

Это верно - компиляторы компилируют исходный код в исполняемую форму, которая затем связывается в исполняемый двоичный файл с помощью компоновщика. Исходный код также может быть выполнен непосредственно интерпретатором, таким как одна из множества оболочек командной строки (C-shell, bash, zsh и т. Д.), Awk, sed и т. Д.

Может быть трудно провести четкую грань между «разработчиком» и «конечным пользователем», если вы не ограничите свое обсуждение конкретным продуктом. Все разработчики являются «конечными пользователями» используемых ими инструментов, а «конечные пользователи» могут иметь на своих машинах инструменты разработки, такие как компиляторы и интерпретаторы.

Калеб
источник
2
Хорошо, я собираюсь -1 к этому, потому что здесь есть много недоразумений о компиляторах. Компиляторы переводят код с исходного языка на целевой язык. Сказать, что они генерируют машинный код, - это то же самое, что сказать, что у транспортных средств 4 колеса (да, у большинства транспортных средств 4 колеса, но мотоцикл - это тоже транспортное средство. Точно так же большинство компиляторов генерируют машинный код, но конвертер C # -> VB компилятор тоже)
riwalk
1
@ Stargazer712, уверяю вас, в этом нет недоразумений - я очень хорошо знаю, что делают компиляторы, спасибо. Но если кто-то, кто не знает, спросит меня, что такое машина, я, вероятно, скажу, что у машины четыре колеса, несмотря на то, что некоторые этого не делают . Педантичное определение часто смущает больше, чем объясняет человеку, пытающемуся понять концепцию. «Компилятор» также может быть описанием работы, но упоминание того, что здесь не поможет.
Калеб
1

Администраторы могут также нуждаться в использовании языков программирования при написании сценариев для выполнения различных автоматизированных задач. Например, наличие сценария, который удаляет старые файлы журнала с сервера через 90 дней, чтобы освободить место на диске. Язык, используемый для написания скрипта, должен интерпретироваться или компилироваться, чтобы его можно было запустить в системе.

JB King
источник
1

Некоторые программы являются метапрограммами : во время работы они могут генерировать какую-то другую программу (или некоторый исходный код) и компилировать ее, а затем каким-либо образом запускать. Читайте также о многоступенчатом программировании .

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

Например, см. MELT (который генерирует код C ++ для расширения GCC ) или систему искусственного интеллекта J.Pitrat CAIA (которая генерирует код C - особенно его собственный код - для решения комбинаторных задач).

Кроме того, некоторые языки и некоторые реализации почти требуют, чтобы компилятор присутствовал везде (в каждой программе, закодированной на этом языке и в реализации). Во-первых, несколько веб-браузеров содержат JIT- движок Javascript (например, V8 ). Кроме того, большинство реализаций Common Lisp -eg SBCL - содержат компилятор (даже полезный для запуска приложений, которые могут генерировать и оценивать выражения). Читайте также о гомойконических языках и программах Qine .

Василий Старынкевич
источник