Добавить или изменить ключевые слова на языке Java

Я знаю, что мой вопрос кажется неуместным, но он искренний. При написании java я должен использовать слово import, чтобы импортировать классы из пути к классам. Пользователю new требуется инициировать определенные объекты и другие ключевые слова в java. Мой вопрос заключается в том, есть ли у нас хоть малейшая возможность улучшить этот великолепный язык путем определения новых ключевых слов и того, что они делают, или изменения существующего ключевого слова, чтобы делать то же самое. Например, вместо того, чтобы писать:

import java.io.File;

Какая возможность изменить слово import на боснийский, например:

uvoziti java.io.File;

и все работает так же. Пожалуйста, не закрывайте, пока у меня не появятся идеи.


person ErrorNotFoundException    schedule 02.09.2014    source источник
comment
Вы можете написать свой собственный компилятор Java с любыми зарезервированными словами, которые вам нравятся.   -  person Eran    schedule 02.09.2014
comment
всего наилучшего в ваших начинаниях!   -  person Vihar    schedule 02.09.2014
comment
Единственная возможность - написать свой собственный язык. У Java есть открытые исходники, я не уверен, как там с лицензией на ветвление.   -  person Danubian Sailor    schedule 02.09.2014
comment
Легко определить Java на боснийском языке, чем обновить существующую Java!   -  person CHowdappaM    schedule 02.09.2014
comment
Представьте, что вам приходится работать с кодом, имеющим собственные ключевые слова...   -  person Alexis Leclerc    schedule 02.09.2014
comment
Правильный запрос на новую версию Java, которая поддерживает своего рода словарь. Это означает, что JDK содержит такой словарь, который содержит сопоставление между переведенными ключевыми словами и оригиналом. И что касается добавления ключевых слов, это невозможно, поскольку ключевые слова представляют фиксированное действие.   -  person Reporter    schedule 02.09.2014
comment
Как насчет добавления новых ключевых слов и определения их действий?   -  person ErrorNotFoundException    schedule 02.09.2014
comment
Думаю, это делает разработчик компилятора.   -  person Reporter    schedule 02.09.2014
comment
Было бы неплохо использовать правильный async/await в стиле C# по сравнению с другими библиотеками async/await, такими как EA-async.   -  person Thomas Andreè Wang    schedule 02.04.2019


Ответы (6)


Один подход, который использует довольно сложную цепочку инструментов и может рассматриваться как «излишняя», но не так много усилий, как написание собственного компилятора или около того:

  • Загрузите ANTLR4 с http://www.antlr.org/download.html.
  • Загрузите грамматику Java по адресу https://github.com/antlr/grammars-v4/blob/master/java/Java.g4
  • Измените грамматику Java в соответствии с вашими потребностями...
  • Бегать

    java -classpath "antlr-4.4-complete.jar" org.antlr.v4.Tool Java.g4
    

    Это создаст несколько файлов, один из которых JavaLexer.java.

  • Создайте проект Java, содержащий файл ANTLR JAR и файл JavaLexer.java.
  • Создайте класс, подобный следующему, который выполняет перевод:

    import java.io.IOException;
    
    import org.antlr.v4.runtime.ANTLRFileStream;
    import org.antlr.v4.runtime.CharStream;
    import org.antlr.v4.runtime.CommonTokenStream;
    import org.antlr.v4.runtime.TokenStream;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            CharStream s = new ANTLRFileStream("Input.javaX");
            JavaLexer lexer = new JavaLexer(s);
            TokenStream t = new CommonTokenStream(lexer);
            int i = 1;
            while (true) {
                if (t.LA(i) == -1) {
                    break;
                }
                if (t.LA(i) == JavaLexer.IMPORT) {
                    System.out.print("import ");
                } else {
                    System.out.print(t.LT(i).getText() + " ");
                }
                i++;
            }
        }
    }
    

    (конечно, это только пример, который только переводит токен IMPORT, который был определен в файле грамматики как "uvoziti". Для более общего и гибкого перевода можно было бы определить перевод во внешнем файл и, вероятно, прочитать этот файл, чтобы создать карту Map<Integer, String>, которая отображает JavaLexer.IMPORT в "import" и т. д...)

  • Создайте входной файл из примера: Input.javaX:

    uvoziti java.io.File;
    
    public class Input
    {
        public static void main(String args[])
        {
            File file = null;
            System.out.println("done");
        }
    }
    

    Когда вы затем запустите Main, он прочитает этот входной файл, в конце концов найдет токен IMPORT и вместо исходного текста (uvoziti) напечатает import.

  • Результатом будет содержимое Java-файла с ужасным форматированием...

    import java . io . File ; public class Input { public static void main ( String args [ ] ) { File file = null ; System . out . println ( "done" ) ; } } 
    

    но, к счастью, компилятор не заботится о форматировании: вы можете записать этот вывод непосредственно в файл .java, и компилятор его проглотит.

Как это описано здесь, это только доказательство концепции. Для гибкого и универсального перевода многих (всех) ключевых слов нужно было бы построить вокруг всего этого некоторую инфраструктуру. Входные файлы должны считываться автоматически (File.listFiles(), рекурсивно для пакетов). Каждый из них должен быть переведен (используя Map<Integer, String>, о котором я упоминал ранее). Затем выходные файлы должны быть записаны и скомпилированы либо с помощью среды выполнения JavaCompiler или вручную вызвав javac с помощью Время выполнения#exec.

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

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

person Marco13    schedule 02.09.2014
comment
Я теряюсь в момент записи внешнего файла input.javax как я могу добиться этого без записи внешнего файла. Я запустил файлы, и в моем проекте есть файл javaLexer.java. - person ErrorNotFoundException; 02.09.2014
comment
Input.javaX был задуман как один из примеров входного файла с измененными ключевыми словами. Когда вы написали свою программу в виде файлов javaX (с измененными ключевыми словами), вы можете обработать их (как показано в классе Main выше) для создания действительных файлов .javaнастоящими ключевыми словами). Затем их можно нормально скомпилировать с помощью javac. - person Marco13; 02.09.2014
comment
Что ж, думаю, я откусил больше, чем могу прожевать, я внимательно изучу уроки по этому поводу, прежде чем приступить к чему-то, о чем потом могу пожалеть :) - person ErrorNotFoundException; 03.09.2014
comment
Обратите внимание, что процесс, который я описал, был только одним, о котором я думал. Могут быть альтернативы, и некоторые из них могут быть даже проще. (Что-то вроде stackoverflow .com/questions/6525059/ выглядит очень просто. У него могут быть некоторые ограничения, но когда цель состоит в том, чтобы только заменить ключевые слова, это также может быть допустимый подход). Однако, возможно, я смогу расширить ответ дополнительной информацией, если вы скажете, где вы сейчас застряли. - person Marco13; 03.09.2014
comment
Я действительно видел этот пример, и мне больше нравится ваш подход, я сделал все шаги до Create a Java Project that contains the ANTLR JAR and the JavaLexer.java, где появился файл input.javax. Я запутался, так как не знал содержимого файла. - person ErrorNotFoundException; 03.09.2014
comment
Более высокоуровневое представление: подход заключался в создании проекта, состоящего из файлов Java с переведенными ключевыми словами (я назвал их .javaX, чтобы указать, что они не являются обычными .java файлами). Одним из примеров такого файла является Input.javaX, который содержится в ответе, где uvoziti используется вместо import. Затем этот проект, состоящий из всех javaX файлов, можно было перевести обратно на обычную Java. Это показано в опубликованном мной классе Main для одного файла примера (а именно, для Input.javaX). После перевода полученные файлы можно скомпилировать с помощью javac - person Marco13; 03.09.2014
comment
Хорошо понял. Я надеялся, что смогу писать простые файлы .java с помощью uvoziti, но это нормально. - person ErrorNotFoundException; 03.09.2014

Java не предоставляет никакого способа переопределения ключевых слов.

Если вы добавляете или удаляете ключевые слова в языке Java, это уже не Java.

Вы можете написать свой собственный язык, который компилируется в Java. Это может быть так же просто, как написать программу, которая заменяет строку uvoziti на import, а затем запускает ее через компилятор javac.

person Kevin Boyle    schedule 02.09.2014
comment
Нет, не будет, потому что это будет дублировать ключевое слово, а не заменять его. - person Danubian Sailor; 02.09.2014
comment
Я не совсем понимаю ваш комментарий @donaudampfschifffreizeitfahrt. Я пытался объяснить, что если вы изменяете язык, это не Java. Если вы хотите создать свой собственный язык, вы всегда можете выполнить кросс-компиляцию/транспиляцию в Java, как это происходит с TypeScript, CoffeeScript и т. д. Если вы можете дать мне больше информации о том, где мой ответ неясен/неправилен, я буду рад обновить его. . - person Kevin Boyle; 03.09.2014
comment
Я имею в виду ту часть, когда вы рекомендуете предварительно обработать файл и отправить его компилятору Java. «Новые» ключевые слова будут преобразованы в «старые» ключевые слова, но «старые» ключевые слова останутся «ключевыми словами». Так что это не дало бы ОП именно то, что он хотел. - person Danubian Sailor; 03.09.2014
comment
Я все еще не уверен, что понимаю проблему. Если вы обрабатываете файл заранее, когда он содержит NewShinyLang, вы можете определить NewShinyLang, чтобы он содержал любые ключевые слова, которые вы хотите. Затем вы «компилируете» этот язык в Java, который затем отправляете компилятору Java. В NewShinyLang вы можете определить все, что захотите. Тот факт, что он сначала скомпилирован в Java, прежде чем перейти к байт-коду, является деталью реализации компилятора NewShinyLang. - person Kevin Boyle; 04.09.2014

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

Я думаю, что этот подход должен работать для вашего случая.

person Community    schedule 02.09.2014

Java сама по себе не поможет вам в этом.

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

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

person Alberto Zaccagni    schedule 02.09.2014
comment
Тот, что написан на английском, понимают только люди, понимающие английский язык; - person ErrorNotFoundException; 02.09.2014
comment
@Stanley, правда, но если вы измерите, что люди понимают английский по сравнению с теми, кого вы понимаете по-боснийски, вы можете понять, почему синтаксис кода на английском языке. - person apomene; 02.09.2014
comment
Это правильно, но, пожалуйста, подумайте, насколько гибко было бы даже на английском языке определять новые ключевые слова и новую последовательность выполнения и команды. - person ErrorNotFoundException; 02.09.2014

Вы не можете решить это, чтобы работать в целом; java строго определяет ключевые слова в своей языковой спецификации, и в языке java нет механизма для добавления ключевых слов (например, макросов).

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

Еще одним шагом будет написание собственного компилятора; опять же, это плохо интегрируется с существующими наборами инструментов. Вы по-прежнему не получаете должной поддержки от вашей IDE.

Как увлекательно, как идея; препятствия делают его крайне непрактичным для общего использования.

Ситуация отличается в языках, которые поставляются с макроязыком времени компиляции (у большинства языков ассемблера он есть). Определение C - еще один пример. У всех них по-прежнему есть проблема, заключающаяся в том, что они основаны на препроцессоре, поэтому добавленные конструкции более сложны (только базовая проверка синтаксиса и т. д.).

person Durandal    schedule 02.09.2014

JVM и JDK понимают ключевые слова Java. Если вы хотите перейти на свой язык, вам также необходимо изменить JDK и JVM.

person CHowdappaM    schedule 02.09.2014
comment
JVM не имеет ничего общего с ключевыми словами. - person Marco13; 02.09.2014