Как сделать компилятор на java

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

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

Наш проект будет состоять всего из двух классов, причём один будет вызывать метод другого.

Класс Other, единственный метод которого выводит строку текста на экран:

public class Other public String getMessage() return "Привет, мир!" ;
>
>

Сохраним этот текст как есть в файл, имя которого обязательно должно совпадать с именем класса, т.е. Other.java.

Класс Main:

class Main public static void main(String. args) Other other = new Other();
System.out.println(other.getMessage());
>
>

Сохраним исходники этого класса в файле Main.java.

Теперь мы готовы к тому, чтобы скомпилировать написанный нами код. Для этого используется утилита javac, которая поставляется вместе с jdk. Выполним эту команду в той папке, где лежат оба наших файла:

Опция -d указывает, какие именно файлы мы хотим скомпилировать. В результате в нашей папке помимо исходников появится иерархическая структура папок и файлов:

class-файлы - это бинарные файлы с байт-кодом, которые может обрабатывать виртуальная машина Java. Обратите внимание, что каждый класс компилируется в свой собственный файл. Таким образом достигается модульность нашего приложения. Более того, скомпилированный класс будет работать в любой операционной системе на любой java-машине.

Но когда мы говорим о приложении, то ожидаем увидеть один файл, а не кучу папок. Давайте упакуем наши class-файлы в jar-архив. В этом нам поможет одноимённая утилита.

Опция c говорит, что нужно создать новый архив, f задаёт имя будущего архива, а e указывает полное имя main-класса. В конце указываем папку, в которой лежает все class-файлы.

В результате вы получите файл lesson1.jar, который готов к запуску:

В результате на экране вы увидите приветствие, которые генерирует наш класс Other.

Примечательно, что jar-архив - это обычный zip-архив определённой структуры. Открыв его любым архиватором вы увидите наши class-файлы в иерархии пакетов, а также папку META-INF с файлом MANIFEST.MF. Этот файл содержит вспомогательную информацию об архиве.

У меня этот файл манифеста выглядит так, но у вас может отличаться:

Здесь указано, в какой версии java был создан архив, а также указан Main-Class. Как видите, ничего сложного.

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

Продолжаем курс программирования java для android-разработчиков. Данный урок научит вас запускать java программы из командной строки, для общего понимания процесса компиляции и запуска программ на языке java.

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

Независимо от того, какую операционную систему вы используете, Linux, Mac или Windows, если на вашем компьютере установлен JDK (Java Development Kit), вы можете в консоли набрать следующие команды чтобы скомпилировать и запустить программу:

  • javac (или javac.exe)
  • java (или java.exe)

В первом случае будет вызван компилятор javac.exe, а во втором случае — запускалка java.exe, которая стартует нашу программу. Эти файлы лежат в папке bin вашего JDK.

Рассмотрим на примере. Вспомним код из первого урока — создадим файл с названием Main.java.

Эта команда вызовет компилятор, который создаст файл Main.class, содержащий скомпилированный код нашей java программы.

Чтобы запустить ее, нужно ввести команду java с именем класса (не файла!) в качестве параметра:

Аргументы

В главном классе нашей программы есть метод public static void main(. ) , который в качестве аргумента принимает массив String[] args.

Массив строк в качестве аргумента можно передать в программу при запуске из командной строки .

Любой массив в Java имеет переменную длину, это число элементов в этом массиве.

Добавим такой код в класс Main.java:

И чтобы скомпилировать и запустить программу с аргументами, пишем в консоль:

Упражнение

Создайте программу, которая выводит аргументы, переданные при запуске, в одну строку.

Дополнительное чтение:

Механизм обратного вызова(callbacks) широко распространен в программировании. При обратном вызове программист задает действия, которые должны

Рассмотрим, что такое интерфейсы в языке программирования java, а также поговорим о множественном наследовании

Когда ввожу команду javac Main.java, ошибок не выдает и объект с расширением class появляется, но когда пишу команду java Main пишет, что файл не найден. Как решить проблему?

Убедитесь, что каталог выбран правильно

код из примера один компилируется след. образом:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

public class Main public Main() >

команда java main выдает ошибку

все решил, забыл одну фигурную скобку)) странно, что без нее эклипс скомпилировать дал

Для компиляции программ из командной строки используется команда javac.

Чтобы получить список возможных ключей, выполните:

Чтобы скомпилировать программу MyFirstApp , запустите компилятор, указав имя исходного файла в командной строке следующим образом:

Компилятор javac создаст файл MyFirstApp.class , содержащий версию байт-кода.

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

2. Компиляция с помощью -d.

По умолчанию компилятор записывает сгенерированный .class в тот же каталог, где находится исходный класс .java . Это хорошо для маленьких проектов, но при работе на больших проектах файлы .java и .class должны храниться отдельно.

Ключ -d позволяет указать компилятору, куда записывать сгенерированные .class файлы.

Например, у нас есть такая структура папок:

Структура папок фото

Следующая команда, выполненная из project1 папки сгенерирует файл MyFirstApp.class и запишет его в папку classes (предполагаем, что MyFirstApp не содержит оператора package ):

Структура папок фото

Следующая команда, выполненная из src каталога, сгенерирует файл MyFirstApp.class , и запишет его в каталог classes/com/company/lesson1:

Если каталог classes/com/company/lesson1 не существует, то он будет создан при компиляции.

Если же не существует каталог classes, то вы получите ошибку компиляции.

3. Запуск программы с помощью команды java.

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

Для получения списка возможных ключей, выполните:

Чтобы выполнить программу, передадим имя класса MyFirstApp (предполагаем, что MyFirstApp не содержит оператора package ) в качестве аргумента командной строки:

Если класс MyFirstApp находится в пакете, то выполняем команду:

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

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 4 года назад .

Как сделать компилятор для мобильных устройств например компилятор по c++, java, html. И что для этого нужно знать?



Для этого нужно прочитать не одну книгу, начиная с ассемблера и вряд ли вы дойдете до чтения чего то о JAVA

1 ответ 1

Путь героя выглядит так:

  1. Придумайте свою грамматику, ну то есть свой язык (если речь идет о C++, то все сильно упрощается поскольку грамматику уже до вас разработали Керниган, Риччи и Страуструп)
  2. Далее пишем парсер вашей грамматики - к вашему счастью это уже давно формализовано и доведено до автоматизма - берите ANTLR или yacc - они переводят формализованную грамматику вашего языка до генератора парсера - то есть разобьют ваши грамматические изыски до токенов, лексем и проч.
  3. Далее для лексем и токенов, до которых будет разбит ваш язык пишете машинные коды/инструкции. Типа если есть конструкция if это соответствует ассемблерной инструкции jnz ну и т.д.
  4. Потом собираете линкер, то есть некую аппу, которая разрешает внешние ссылки - привязывает ваш код, в котором есть вызовы внешних библиотек к либам, добавляет необходимые прибамбасы, что получился нормальный executable - исполняемый согласно правилам оси файл.
  5. В итоге на выходе получаете компилятор в первой итерации (вся процедура называется bootstrapping
  6. Если применимо (то есть, если бутстраппинг был сделан на самом языке) то получившийся код компилятора компилируете своим компилятором еще раз - self-hosting

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками java android c++ компилятор или задайте свой вопрос.

Похожие

дизайн сайта / логотип © 2022 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2022.1.26.41266

Читайте также: