Чи використовуються компілятори поза розробкою?


14

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

Натомість розробники просто використовують компілятор для перетворення свого коду в машинний код, який потім транспортується на інші машини для використання в якості додатків.

Чи мають компілятори функції поза цим процесом? Якщо так, коли вони використовуються?


21
Так, компілятори компілюють код.
Tom Squires

@Tom: Я десь прочитав, що C-компілятори встановлені на різних машинах, включаючи ігрові консолі. Чи означає це, що ми пишемо код на C, потім він надсилається на ці пристрої, де їх збирає компілятор і потім виконує інтерпретатор?
Pankaj Upadhyay

3
@Pankaj Upadhyay: Цілком можливо, що код може бути відправлений на машину, а потім складений внутрішнім процесом. Навряд чи користувач пристрою ніколи не побачив би це чи дізнався про це. Це може бути зроблено, якщо частини коду потрібно компілювати для конкретного обладнання та рішень, які перевіряють апаратне забезпечення під час виконання занадто повільно, що призводить до необхідності розподілу коду та компіляції під час встановлення. Можливо ...
FrustratedWithFormsDesigner

3
@Pankaj Жодна з ігрових консолей не постачається з компіляторами, але деякі з них можна встановити. Sony надала версію Linux та GCC, яку можна встановити, наприклад, на PS2. Інші люди зламали / зламали шлях до отримання інших ОС та програмного забезпечення на консолі.
IronMensan

4
@Stargazer: Ви мали на увазі: "Ні, компілятори перекладають із мови-джерела на цільову мову"? Якщо пропустити кому, ваше речення означає протилежне вашому наміченому значенню.
Даніель Приден

Відповіді:


19

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

Там є кілька винятків з цього , хоча. По-перше, багато проектів з відкритим кодом розповсюджуються головним чином (або навіть виключно) у формі вихідного коду, і очікує, що кінцевий користувач встановить їх, ввівши пару команд, як, makeа потімmake intall. Це дозволить викликати компілятор, лінкер тощо для створення машинного коду з вихідного коду для цього комп'ютера користувачів. Однак у цих випадках процес створення та встановлення автоматизований (принаймні призначений для) автоматизований до того, що користувачеві рідко потрібно багато знань про нього, крім того, що якщо вони ніколи раніше не встановлювали пакет лише для вихідного коду , їх менеджер пакунків, як правило, перераховує певний пакет "розробки" як необхідну умову для встановлення додатка, який їм дійсно важливий (хоча деякі досі вважають це недружньою для кінцевих користувачів).

Інший виняток (на який натякали, але не дуже добре пояснено в інших відповідях, які я бачив) - це щойно вчасно (JIT) компілятори. Кілька очевидних прикладів компіляторів JIT - це загальна мова виконання (CLR) Microsoft і віртуальна машина Java (JVM). У цих випадках зазвичай є два абсолютно окремих компілятори, які беруть участь у перекладі вихідного коду в машинний код. Один використовується розробником. Однак замість того, щоб генерувати машинний код безпосередньо, він генерує машинно-незалежний байт-код. Потім CLR / JVM включає в себе другий компілятор, повністю відокремлений від першого, який перетворює ці байтові коди в машинний код для цільового комп'ютера.

Додам, що другий компілятор не є строго необхідним. Ранні версії JVM (для одного прикладу) просто інтерпретували байтові коди, а не компілювали їх. Це часто несе в собі досить серйозне покарання за продуктивність, тому більшість останніх JVM, призначених для використання у виробництві, включають компілятор JIT.


24

Так, компілятори в основному використовуються розробниками, за кількома помітними винятками. Кінцеві користувачі іноді використовують компілятори для компіляції та встановлення найновішого програмного забезпечення з відкритим кодом, навіть якщо вони не вносять жодних змін у код. Також деякі мови програмування не мають компіляторів. Вони замість цього використовують інтерпретаторів, які "складають" на льоту. У цьому випадку кінцевим користувачам потрібно встановити перекладач на своїх машинах.


4
Якби ми обмежили визначення "компілятори" означати програми, які генерують виконувані файли, то це була б хороша відповідь. Однак це лише підмножина справжнього визначення поняття "компілятор"
riwalk

16
@Jan Soltis: Я не згоден. Я склав ядро Linux з вихідних текстів: це означає , що я ядро Linux розробник ? Я ніколи не змінював код ядра Linux і не надсилав патч - я б сказав, це означає, що я не розробник ядра. Плюс за те, що я використовував Gentoo як свою основну операційну систему протягом декількох років, я збирав кожне програмне забезпечення на машині. Однак переважна більшість із них були складені системою управління пакетами Portage автоматично. Я б заперечував, що в такому випадку я виступав як кінцевий користувач, але не як розробник .
Даніель Приден

8
@Jan Soltis: Я знаю, що це ваша думка. Я з повагою не згоден. Я надав контраргументи на підтримку моєї позиції, поки ви продовжуєте робити непідтримувані твердження. Ви, здається, думаєте, що між «розробником» та «кінцевим користувачем» існує різка межа, яку, на мою думку, не існує.
Даніель Приден

6
Завантаження джерел та запуску "make install" не є розробником. Це, безумовно, операція з кінцевим користувачем.
Крістофер Джонсон

3
@Jan: Я можу погодитись, що використання дистрибутива, подібного до Gentoo, який збирає пакети, робить вас принаймні енергетичним користувачем, але це все одно очевидно тип користувача. Складання чужого коду, не змінюючи його, додаючи до нього чи навіть читаючи, не робить вас розробником.
Carson63000

10

Так

Компілятор визначається як програма, яка переводить код з однієї мови на іншу (див. Вікіпедію ). Найбільш розповсюджене використання компіляторів - це переклад мови-джерела в машинний код, але це все-таки визначає слово "компілятор".

Наприклад, Python генерує байт-код, коли імпортує модуль, і, таким чином, вписується у визначення компілятора (тому що він перетворює з мови-джерела, Python, в цільову мову, байт-код Python).

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


4

Один випадок - це програма, яка динамічно генерує код під час виконання, а потім запускає згенерований код. Цей код потрібно було б скласти під час виконання.

Редагувати: Є й інші винятки, але вони вже згадувалися в інших відповідях.


+1 просто скажіть JIT
gnat

1
Двигун V8 в Chrome не є дивним винятком.
riwalk

Оновлено для уточнення. Я усвідомлюю, що є й інші винятки.
Morgan Herlocker

3

компілятори призначені лише для розробників для того, щоб скласти свій код мови програмування у виконувані файли (machin-code)

Я б сказав, що "компілятори призначені для розробників первинними ...". Але я бачив приклади, коли програми генерують новий код мови програмування на ходу, і тому потрібен компілятор для встановлення на машині кінцевих користувачів. Це не означає, що кінцевий користувач сам повинен працювати з компілятором.

Можливі причини розробки цієї програми:

  • продуктивність: придумайте додаток, керований правилами, в якому правила зберігаються в якомусь сховищі даних для кінцевих користувачів, і у вас є деякі масові дані, які повинні бути оброблені цими правилами. Замість того, щоб інтерпретувати правила знову і знову, програма спочатку генерує код обробки, компілює його та запускає його до даних, що підлягають обробці

  • придумайте програму, де кінцевий користувач може додати якусь математичну формулу, а розробник програми не хоче для цього реалізувати власний парсер / інтерпретатор. Натомість програма приймає цю формулу, вносить деякі доповнення, щоб перетворити її на дійсний фрагмент програмного коду, дозволити компілятору її скласти та запустити після цього.


хм .... Це не означає, що кінцевий користувач сам повинен працювати з компілятором . Це в значній мірі пояснює і уточнює.
Pankaj Upadhyay

2

Правильно - компілятори компілюють вихідний код у виконувану форму, яка потім зв'язується у виконуваний бінарний файл за допомогою посилання. Вихідний код також може бути виконаний безпосередньо інтерпретатором, таким як одна з багатьох оболонок командного рядка (C-shell, bash, zsh тощо), awk, sed тощо.

Провести чітку межу між "розробником" та "кінцевим користувачем" може бути важко, якщо ви не обмежите свою дискусію певним продуктом. Усі розробники - це "кінцеві користувачі" інструментів, які вони використовують, а "кінцеві користувачі" можуть мати на своїх машинах інструменти розробки, такі як компілятори та інтерпретатори.


2
Гаразд, я перейду до -1 цього, тому що тут багато непорозумінь щодо компіляторів. Компілятори переводять код з мови-джерела на цільову мову. Скажімо, вони генерують машинний код схожий на те, що транспортні засоби мають 4 колеса (так, більшість транспортних засобів мають 4 колеса, але мотоцикл теж транспортний засіб. Таким же чином, більшість компіляторів генерують машинний код, але перетворювач C # -> VB - це компілятор також)
riwalk

1
@ Stargazer712, запевняю, що непорозумінь немає - я добре знаю, що роблять компілятори, дякую. Але якщо хтось, хто не знає, запитає мене, що таке машина, я, мабуть, сказав би, що машина має чотири колеса, незважаючи на те, що деякі ні . Педантичне визначення часто бентежить більше, ніж пояснює людині, яка намагається впоратися з поняттям. "Компілятор" також може бути описом вакансії, але згадка про це не допоможе тут.
Калеб

1

Також для адміністраторів може виникнути потреба у використанні мов програмування при написанні сценаріїв для виконання різних автоматизованих завдань. Наприклад, наявність сценарію, який видаляє старі файли журналу з сервера через 90 днів, щоб звільнити деякий простір на диску. Мова, що використовується для написання сценарію, повинна бути інтерпретована або складена так, щоб її можна було запустити в системі.


1

Деякі програми є метапрограмами : під час запуску вони можуть генерувати якусь іншу програму (або якийсь вихідний код) і компілювати її, а потім якось запустити. Читайте також про багатоступеневе програмування .

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

Для прикладу див. MELT (який генерує код C ++ для розширення GCC ) або систему штучного інтелекту Дж. Пітрата (J.Pitrat) для розв'язання комбінаторних задач (наприклад, власний код C).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.