Создайте свой собственный (очень простой) компилятор, используя Java

Я хочу попробовать создать свой собственный очень простой язык с его очень простым компилятором. Все с использованием Java.

На данный момент нужно будет только разрешить «программисту» печатать на экране.

У меня была идея, как это сделать, и я хотел узнать: будет ли это считаться настоящим «компилятором», настоящим «языком» и настоящей «виртуальной машиной»? (Все очень, очень просто, конечно).

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

Это означает, что IDE не будет компилировать написанный код в какой-то существующий машинный код, такой как байт-код Java, а фактически скомпилирует какой-то скомпилированный код, составленный мной.

Этот скомпилированный код будет понятен только моей программе "виртуальной машины" и сможет работать только внутри этой программы. Программа «виртуальная машина» будет использовать высокоуровневые операции Java для понимания и выполнения скомпилированного кода.

Программа «виртуальной машины» будет программой Java, работающей на JVM.

Мой вопрос: Концептуально считается ли это виртуальной машиной и «машинным кодом»? Если нет, то считается ли это «языком программирования», даже если его скомпилированный байт-код может работать только внутри определенной программы?


person Aviv Cohn    schedule 03.03.2014    source источник
comment
возможно, вы захотите проверить github.com/NiklasRosenstein/beak-lang. Код немного документирован (хотя и не плохо)   -  person Niklas R    schedule 03.03.2014
comment
Если вы планируете сделать что-то подобное, взгляните на Xtext! Использовать его, безусловно, проще, чем писать все с нуля + вы также получаете IDE для вашего нового языка.   -  person Balázs Édes    schedule 03.03.2014
comment
Какой смысл реализовывать еще одну виртуальную машину поверх JVM? Просто сгенерируйте байт-код JVM напрямую, это очень просто и просто. Взгляните на библиотеку ASM.   -  person SK-logic    schedule 03.03.2014
comment
И да, любая форма перевода с одного языка на другой по определению является компиляцией. Любой достаточно сложный язык (даже не обязательно полный по Тьюрингу) с четко определенной семантикой является языком программирования.   -  person SK-logic    schedule 03.03.2014


Ответы (1)


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

Чтобы быть «виртуальной машиной», вам нужно создать способы взаимодействия со «всем» на ПК, на котором она работает. Предоставление вашим пользователям/разработчикам функции «печать на экран» — это не виртуальная машина.

http://en.wikipedia.org/wiki/Виртуальная_машина

Редактировать: вы спросили: «Также: концептуально, вы бы сказали, что язык программирования, который может создавать только программы, которые могут работать внутри другой программы, по-прежнему считается языком программирования?»

Это зависит от особенностей этой "другой программы". Если вы спрашиваете о JVM: да. Определение языка программирования в Википедии можно найти здесь:

http://en.wikipedia.org/wiki/Programming_language

Язык программирования — это искусственный язык, предназначенный для передачи инструкций машине.

И мы говорим, что виртуальная машина выполняет это свойство. Так что да, Java (и другие языки, которые компилируются в байт-код, запускаемый соответствующей виртуальной машиной) — это язык программирования.

person Xabster    schedule 03.03.2014
comment
В чем именно разница между компилятором и интерпретатором? Является ли компилятор в Eclipse компилятором или интерпретатором? - person Aviv Cohn; 03.03.2014
comment
Компилятор не запускает вашу программу, вот в чем разница. - person Marko Topolnik; 03.03.2014
comment
Кроме того: Концептуально, вы бы сказали, что язык программирования, который может создавать только программы, которые могут выполняться внутри другой программы, по-прежнему считается языком программирования? - person Aviv Cohn; 03.03.2014
comment
Спасибо. Могли бы вы сказать, что программа, которая служит платформой для запуска других программ, должна иметь «постоянное подключение» к ОС, чтобы считаться виртуальной машиной? Я не уверен, но я думаю, что техническое определение виртуальной машины состоит в том, что это еще одна платформа, на которой запускаются программы. Моя гипотетическая виртуальная машина имеет подключение к ОС, как и любая другая программа. Должен ли он иметь «специальное» соединение, чтобы считаться виртуальной машиной? - person Aviv Cohn; 03.03.2014
comment
@Xabster, не хочешь уточнить? Чем еще не виртуальная машина то? SECD? СТГ? ЛЛВМ? - person SK-logic; 03.03.2014
comment
@Xabster Ответьте на мой вопрос, пожалуйста? :) Я спросил, должна ли программа, которая служит платформой, которая понимает и выполняет код других программ, иметь специальное постоянное соединение с ОС, чтобы считаться виртуальной машиной? - person Aviv Cohn; 03.03.2014
comment
@Prog, виртуальные машины не имеют ничего общего с операционными системами. Это совершенно не связанные понятия. Виртуальной машиной можно назвать все, что имеет четко определенную операционную семантику. - person SK-logic; 03.03.2014
comment
@SK-logic Xabster сказал: Чтобы быть виртуальной машиной, вам нужно создать способы взаимодействия со всем на ПК, на котором она работает. Предоставление вашим пользователям/разработчикам возможности печати на экране — это не виртуальная машина.. Так ты не согласен? - person Aviv Cohn; 03.03.2014
comment
@Prog, да, я не согласен, я понятия не имею, откуда Xabster взял свои определения. ОС, аппаратное обеспечение и прочее — понятия, ортогональные по отношению к идее виртуальной машины. Как только семантика вашего оценщика становится достаточно сложной, это виртуальная машина. - person SK-logic; 03.03.2014
comment
@Xabster, вашим источникам не хватает академического авторитета. Не могли бы вместо этого сослаться на что-нибудь рецензируемое? - person SK-logic; 04.03.2014
comment
@Xabster, и, кстати, ваш забавный источник перечисляет виртуальные машины TrueType и SQLite в качестве допустимых примеров, а также такие вещи, как WAM. Подумай об этом. - person SK-logic; 04.03.2014