Що означає, що "мова A написана мовою B"?


31

Я часто чую термін, що мова A написана мовою B. Наприклад, PHP було написано C , C # написано на C ++ .

Може хтось, будь ласка, пояснить, що це означає і якщо це навіть правильно? Чи має це щось спільне з компілятором перекладача, який використовується мовою?

Крім того, на яких чинниках ґрунтується вибір мови реалізації?


19
Строго кажучи, "PHP написано на C" - це неправильно. Мова сама по собі є формальним визначенням, тому вона не написана іншою мовою програміста (а скоріше англійською); тільки компілятор, перекладач та / або бібліотека можуть бути написані на C, C ++ або будь-якому іншому На практиці для багатьох мов існує один домінуючий компілятор або інтерпретатор, і розмежування між мовним визначенням та реалізацією не проводиться.
користувач281377

Цікаво, що BCPL здебільшого написано в BCPL
OldCurmudgeon

7
PHP "per se", це не формальне визначення. Це програма С.
Каз

8
s/written/implemented/і це набагато зрозуміліше.
TMN

2
@ugoren В збірці написано багато компіляторів C. Не так вже й це століття.
Росс Паттерсон

Відповіді:


30

Більшість мов програмування поділяються на дві категорії: інтерпретовані та компільовані мови.

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

PHP - це інтерпретована мова. Вам потрібна окрема програма для запуску PHP-коду, комп'ютер не запускає програму безпосередньо. Ця окрема програма, інтерпретатор PHP, сама написана на С.

C # - це компільована мова, але вона не компільована до машинного коду. Натомість його компілюють на спеціалізовану мову, байт-код, щоб запустити на віртуальній машині. Java - ще один приклад такого налаштування. Ви можете бачити це як гібрид між компіляцією та інтерпретацією, де віртуальна машина є інтерпретатором. Віртуальна машина для C # (CLI, або загальна мовна інфраструктура ) написана на C ++.

Інші приклади:

  • Python: Інтерпретатор Python компілює код Python в байт-код Python, потім інтерпретує байт-код. Сам інтерпретатор написаний на C. З тих пір були додані нові реалізації, включаючи таку, яка компілює python для запуску на тому самому CLI, який використовується для C #, який називається IronPython , і той, який працює на віртуальній машині Java, Jython . Для завершення кола існує версія Python, написана в (підмножині) Python, PyPy .
  • Ruby: Ruby почався як чиста інтерпретована мова, але остання версія перейшла на використання байтового коду. Для Ruby теж є проект, який компілюється в CLI, названий IronRuby , і один для Java VM, JRuby .

Вибачте, чим віртуальна машина відрізняється від перекладача? Я не бачу, як використання однієї точки є на півдорозі до компіляції. Ви кажете, що байт-код наполовину складений?
Філіп

1
@Philip: Байт-код не є машинним кодом; тому замість надання центральному процесору прямих інструкцій вам все-таки потрібен перекладач, щоб взяти байт-код і інтерпретувати його, перекласти його в машинні інструкції. Перевага полягає в тому, що віртуальна машина простіша для порту в інші архітектури, і ви можете застосовувати хитрощі, такі як компіляція JIT .
Martijn Pieters

Хтось відчуває, що термін "складений" був розведений для маркетингових цілей?
Філіп

2
Ого! Я повертаю це назад. Я ненадовго йшов туди неправильною дорогою. Я припускав, що "компільований" означав перетворення в машинний код і лише машинний код, що насправді не відповідає дійсності. Це просто термін для перекладу коду в інший код. Будьте цим машинним кодом, байт-кодом або будь-якою мовою. Крім того, виявляється, що там є компілятори PHP, тому ви можете сказати лише, що це "типово" інтерпретується.
Філіп

Також гарне джерело: youtube.com/watch?v=e4ax90XmUBc
Адам

34

Ви в принципі праві. Якщо сказано, що Рубі написано на С, це означає, що перекладач мови та частини основної бібліотеки написані на С.

Отже, інтерпретатор Ruby - це програма C, яка приймає текстовий файл як вхідний, обробляє його, а потім викликає функції, які знаходяться або в іншому текстовому файлі (якщо він написаний у Ruby), або які складаються з коду C, як багато основної функціональності, яка потребує безпосередньо отримувати доступ до системних ресурсів, таких як пам'ять, файлова система та інше. І деякі функції, які вимагають дуже високої продуктивності.

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

Фактори прийняття рішення можуть бути такими ж, як і для інших складних застосувань. Продуктивність одна. Можливість запису коду, який може отримати доступ до системних ресурсів безпосередньо іншого. Тож у більшості випадків це повинна бути мова, що складена (хоча теоретично ви можете написати перекладача Ruby на Python). Наявність у різних системах важливо, якщо ви хочете, щоб ваша мова працювала на Linux, Win, OS X та інших.


Хтось знає, чому я бачу три відгуки на свою відповідь в той момент, коли я її опублікував?
thorsten müller

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

Хм, так. Можливо, я врятував його, а потім відредагував, знову врятував і забув про перше збереження (я старію). Для мене здавалося, що я отримав перші три оновлення з моменту публікації.
thorsten müller

@ thorstenmüller +1 за "Ніщо не заважатиме тобі писати перекладача на C та бібліотеках на C ++", я щойно збирався запитати вас про це. Чи є якісь відомі реалізації для цього, коли інтерпретатор / компілятор є однією мовою, а основні бібліотеки - іншою мовою?
Сонго

@ thorstenmüller У мене це траплялося кілька разів. Якщо декілька хтось переглядав це питання під час публікації, протягом секунди або двох з вас натискатиметься невелике повідомлення з надписом "Нова відповідь опубліковано", щоб вони могли пропустити всю відповідь і анульовано протягом 10 секунд. вашої публікації. Крім того, зміни, внесені протягом 5 хвилин після публікації відповіді, не відображаються в історії редагування, що могло б ще більше викликати плутанину з вашого боку.
Ізката

10

Це просто означає, що більшість ядер мови A написано мовою B. Що "ядро мови A" може відрізнятися від мови до мови, але, загалом, ви здогадуєтесь, це означає, що це компілятор чи перекладач. Вирішальним фактором вибору мови для написання іншої мови є, як і майже у кожному проекті, якими мовами розробники більше знайомі.

Сказане, що "мова A написана мовою B" - це надмірне спрощення для більшості сучасних мов. Якщо взяти Python як приклад, тоді як референтна реалізація, CPython , справді була написана на C, є такі реалізації, написані іншими мовами, як Jython (написано на Java), IronPython (написано на C #), PyPy (написано на Python), CLPython (написано загальним Lisp), Stackless Python (написано на C та Python) та Ластівка без навантаження (написана на C ++).

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


2
Я б не назвав Psyco іншою реалізацією, оскільки вона працює як розширення до CPython.
Martijn Pieters

@MartijnPieters Це також мертвий проект, згідно з його сайтом. Вилучено.
Янніс

@YannisRizos Чи не вмерла також Ластівка без одягу ?
Андрес Ф.

1
@Songo: Крім цього string.lower(s), це функція python, яка делегує це return s.lower(), це правильно. В операції випадку 3,3 струнних CPython реалізуються в С.
Мартейн Пітерс

3
@Songo: Реалізація Jython на Java , реалізація IronPython в C # .
Martijn Pieters

3

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

Отже, якби ви хотіли створити свою власну версію PHP, ви можете почати з того, якою мовою ви найбільше володієте. Потім ви напишете програму, яка може читати код у форматі PHP і робити все, що вимоги PHP говорять, що має робити ваша програма. . Таким чином, ви створюєте мову PHP мовою X.


Цікавий момент. Отже, якщо я маю вбудовану функцію в PHP, explodeяка приймає a Stringі повертає Array, її реалізація (тобто код, який буде працювати над рядком для створення масиву) пишеться на C , правда?
Сонго

@Songo: правильно. Знову ж таки, PHP - це просто програма, не відрізняється від Word, Apache, Notepad або vi або emacs. Він читає дані і аналізує їх відповідно до мовної специфікації, а потім робить все, що мовна специфікація каже, що повинна робити.
Брайан Оуклі

Ця відповідь погано пов'язує мову з реалізацією.
Рассел Борогов

Я думаю, що це найпростіша і найпряміша відповідь, і я не бачу, як це щось змінює. Це навіть дозволяє припустити, що PHP може бути більше, ніж одна реалізація. Насправді є декілька, оригінальний PHP та Facebook, а також інші.
Warren P

@RussellBorogove: ти не вважаєш, що "з точки зору використання мови програмування" допомагає уточнити відповідь? Пам'ятайте, що ми маємо справу з абсолютним початківцем із цим питанням, тому жертвувати невеликою точністю, щоб проілюструвати суть, справедливо, IMO.
Брайан Оуклі

3

Дуже схоже словосполучення із зовсім іншим значенням - це "мова письма A мовою B", наприклад "написання C на Java".

Це описує код, який синтаксично правильний в одній мові, але використовує структури, ідіоми та конвенції з іншої мови. У прикладі "написання С на Java" ознаками цього буде оголошення всіх локальних змінних поверх кожного методу, використання цілих констант замість перерахунків, використання identifiers_with_underscores тощо.

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


"CPython написаний на C", безумовно, не означає "цей користувач пише на Python так, як це було C". Це означає, що CPython (Python.exe на windows, / usr / bin / python на Unix) написано на C.
Warren P

@Warren P: впевнений, але фрази дуже схожі, тому люди, які не знайомі ні з одним, легко можуть опинитися тут, шукаючи пояснення.
Майкл Боргвардт

3

Технологія є суттєво ітераційним процесом. Ми починаємо з простих інструментів, а потім використовуємо ці інструменти, щоб зробити кращі. Мови першої збірки були майже 1: 1 перекладом стандартизованих байткодів інструкцій для чіпа; архітектура 8086 та її асемблер стали домінуючими перед іншими архітектурами, такими як Z80, RISC тощо, і тому ми почали розробляти мови, які можна було б перетворити на збірку 8086, як FORTRAN, COBOL, Pascal і C. Програма, що інтерпретує вихідний код ці мови повинні бути написані чимось більш примітивним, інакше ви опинитесь в аргументі курка-яйце; якщо вихідний код для першого компілятора C був написаний на C, що тоді компілював цей вихідний код C, чи не став би це, за визначенням, першим компілятором C?

В основному, "C # написано на C ++" слід розуміти, що перша та / або найпопулярніша бібліотека компілятора та виконання / основні бібліотеки, які підпорядковуються специфікації мови C # (такі, що Microsoft .NET Framework Microsoft, і компілятор командного рядка програма CSC.exe) написані на C ++.


0

"Мова A написана мовою B" означає, що єдиною реалізацією мови A (або єдиною, яка широко використовується) є тією, яка є насправді проектом, розробленим мовою B, і єдиною повною, актуальною специфікація A - це вихідний код B, який реалізує його таким чином, що якщо документація та програма B не згодні, програма B зазвичай вважається правильною.


Немає жодної авторитетної реалізації C ++. У випадку C ++ специфікація правильна, і невизначена поведінка в специфікації може зробити все, що завгодно у вашій реалізації. Так ні, це не правильно.
Warren P

Я не бачу, що стосується попереднього коментаря до моєї відповіді. Я не робив жодної універсально оціненої заяви щодо всіх мов, тому контрприклад C ++ не застосовується. Заява форми "A пишеться в B", де A - "C ++", не має сенсу, за винятком випадків, коли B є "англійською".
Каз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.