Что означает, что «язык A написан на языке B»?

31

Я часто слышу термин, что язык A написан на языке B. Например, PHP написан на C , C # написан на C ++ .

Может кто-нибудь объяснить, что это значит и если это даже правильно? Это как-то связано с компилятором интерпретатора, используемым языком?

Кроме того, каковы факторы, на которых основан выбор языка реализации?

Songo
источник
19
Строго говоря, «PHP был написан на C» - это неправильно. Язык сам по себе является формальным определением, поэтому он написан не на другом языке программиста (а скорее на английском); только компилятор, интерпретатор и / или библиотека могут быть написаны на C, C ++ или как угодно. На практике для многих языков существует один доминирующий компилятор или интерпретатор, и различие между определением языка и его реализацией не проводится.
user281377 20.11.12
Интересно, что BCPL был в основном написан на BCPL
OldCurmudgeon
7
PHP "per se" не является формальным определением. Это программа на Си.
Каз
8
s/written/implemented/и это намного понятнее.
TMN
2
@ugoren Было много компиляторов Си, написанных на ассемблере. Не так много в этом веке, хотя.
Росс Паттерсон

Ответы:

30

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

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

PHP - это интерпретируемый язык. Вам нужна отдельная программа для запуска кода PHP, компьютер не запускает программу напрямую. Эта отдельная программа, интерпретатор PHP, сама написана на C.

C # - это скомпилированный язык, но он не скомпилирован в машинный код. Вместо этого он компилируется в специализированный язык, байтовый код, для запуска на виртуальной машине. Java является еще одним примером такой установки. Вы могли видеть это как гибрид между компиляцией и интерпретацией, где виртуальная машина является интерпретатором. Виртуальная машина для C # (CLI или Common Language Infrastructure ) написана на 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-компиляция .
Мартейн Питерс
Кто-нибудь чувствует, что термин «скомпилированный» разбавлен в маркетинговых целях?
Филипп
2
Вау! Я забираю это обратно. Я ненадолго пошёл по неправильной дороге. Я предположил, что «скомпилированный» означает превращение в машинный код и только машинный код, что на самом деле не соответствует действительности. Это просто термин для перевода кода в другой код. Будь тот машинный код, байт-код или любой другой язык, который вы хотите. Кроме того, оказывается, что есть PHP-компиляторы, так что вы можете только сказать, что он «обычно» интерпретируется.
Филипп
Также хороший источник: youtube.com/watch?v=e4ax90XmUBc
Адам
34

Вы в основном правы. Если говорят, что Ruby написан на C, это означает, что интерпретатор языка и части базовой библиотеки написаны на C.

Таким образом, интерпретатор Ruby - это программа на C, которая принимает текстовый файл в качестве входных данных, обрабатывает его и затем вызывает функции, которые находятся либо в другом текстовом файле (если написаны на Ruby), либо являются скомпилированным кодом C, что является основной функциональностью, которая требуется прямой доступ к системным ресурсам, таким как память, файловая система и многое другое. И некоторые функции, которые требуют очень высокой производительности.

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

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

Торстен Мюллер
источник
Кто-нибудь знает, почему я вижу три ответа за мой ответ в тот момент, когда я его опубликовал?
Торстен Мюллер
1
Я вижу четыре сейчас, но я не совсем уверен, что вы спрашиваете? Возникли ли голоса слишком быстро? Если так, хорошо, много глаз на вопрос (три почти одновременных ответа), и ваш ответ хороший.
Яннис
Хм да. Может быть, я сохранил его, а затем отредактировал, сохранил снова и забыл о первом сохранении (я старею). Для меня это выглядело так, как будто я получил первые три голоса с момента публикации.
Торстен Мюллер
@ 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 (написанный на Common Lisp), Stackless Python (написанный на C и Python) и Unladen Swallow (написанный на C ++).

Язык программирования - это определение, и, как показывает пример Python, на самом деле нет никаких ограничений на том, на каких языках можно писать его компилятор, интерпретатор и библиотеки. И, конечно, также возможно, чтобы язык был написан сам по себе, через процесс, называемый начальной загрузкой .

Яннис
источник
2
Я бы не назвал Psyco другой реализацией, поскольку она работает как расширение CPython.
Мартейн Питерс
@MartijnPieters Это также мертвый проект, согласно его сайту. Удалены.
Яннис
@YannisRizos Разве Unladen Ласточка тоже мертва ?
Андрес Ф.
1
@Songo: Кроме того, string.lower(s)это функция Python, которая делегирует это return s.lower(), это правильно. В операции случае 3,3 струнных CPython реализуются в С.
Мартейн Питерс
3

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

Итак, если вы хотите создать свою собственную версию PHP, вы можете начать с любого языка, на котором вы наиболее свободно говорите. Затем вы бы написали программу, которая может читать код в формате PHP и делать все, что в спецификации PHP написано вашей программой. , Таким образом, вы создаете язык PHP на языке X.

Брайан Оукли
источник
Интересный момент. Таким образом, в основном, если у меня есть встроенная функция в PHP, explodeкоторая принимает Stringи возвращает a Array, ее реализация (т.е. код, который будет работать со строкой для создания массива) написана на C , верно?
Сонго
@ Сонго: правильно. Опять же, PHP - это просто программа, не отличающаяся от Word, Apache, Notepad, vi или emacs. Он считывает данные и анализирует их в соответствии со спецификацией языка, а затем делает все, что в языковой спецификации сказано, что должен делать.
Брайан Окли
Этот ответ плохо соотносит язык с реализацией.
Рассел Борогове
Я думаю, что это самый простой и самый прямой ответ, и я не вижу, как это связывает что-либо. Это даже предполагает, что может быть более одной реализации PHP. На самом деле их несколько, оригинальный PHP и Facebook, но могут быть и другие.
Уоррен П
@RussellBorogove: не думаете ли вы, что «с точки зрения использования языка программирования» помогает уточнить ответ? Помните, мы имеем дело с абсолютным новичком в этом вопросе, поэтому пожертвовать небольшой точностью, чтобы проиллюстрировать это, справедливо, ИМО.
Брайан Оукли
3

Очень похожая фраза с совершенно другим значением - это «написание языка A на языке B», например «написание C на языке Java».

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

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

Майкл Боргвардт
источник
«CPython написан на C» определенно не означает «этот пользователь пишет на Python, как будто это был C». Это означает, что CPython (Python.exe для Windows, / usr / bin / python для Unix) написан на C.
Уоррен P
@Warren P: конечно, но фразы очень похожи, поэтому люди, не знакомые ни с одним из них, могут легко оказаться здесь в поисках объяснения.
Майкл Боргвардт
3

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

По сути, «C # написан на C ++» должен означать, что первая и / или самая популярная библиотека компилятора и среды выполнения / ядра, которые подчиняются спецификации языка C # (это Microsoft .NET Framework и компилятор командной строки). Программа CSC.exe) написана на C ++.

Keiths
источник
0

«Язык A написан на языке B» означает, что единственной реализацией языка A (или единственной широко используемой) является та, которая фактически является проектом, разработанным на языке B, и единственной полной, современной версией. Спецификация A - это исходный код B, который реализует его так, что если с документацией и B-программой не согласны, B-программа обычно считается правильной.

Kaz
источник
Не существует ни одной авторитетной реализации C ++. В случае C ++ спецификация верна, и неопределенное поведение в спецификации может что-то сделать в вашей реализации. Так что нет, это не правильно.
Уоррен П
Я не вижу, что предыдущий комментарий имеет отношение к моему ответу. Я не делал никаких универсально выраженных заявлений по всем языкам, и поэтому контрпример C ++ неприменим. Утверждение вида «A написано на B», где A - «C ++», не имеет смысла, за исключением случаев, когда B - «английский».
Каз