Pull to refresh

Comments 30

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

После такого всем лень будет поддерживать эту опцию и в итоге она сломается и сквозная совместимость будет утеряна. Это если диалект в общем случае.


А вот если речь идёт про только поддержку ключевых слов то наверно можно — ведь там всего лишь надо отключить распознавание токена как ключевого слова.

А как будет решаться проблема если вы подключаете библиотеку которая написана на старой Java, а сами пишете на новой?

А как будет решаться проблема если вы подключаете библиотеку которая написана на старой Java, а сами пишете на новой?

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

Для сравнения — в Rust для каждой библиотеки указывается своя редакция языка (2015 или 2018). А если вдруг старая библиотека использует в идентификаторах новые ключевые слова, то даже синтаксис-костыль вида r#async выдумали, чтобы можно было к ним обратиться

Так библиотеки-то подключаются в уже скомпилированном виде (.jar-архив или набор .class-файлов)
Так имя метода или публичное поле или имя класса в подключенной библиотеке может быть ключевым словом в новой версии языка…

Ну, такая проблема на самом деле уже есть — имя метода/поля, это просто строка. Можно даже из пробелов, чем пользуются всякие обфускаторы.

Я вообще .net'чик. В "спеке" java я не нашел ничего про пробелы. Возможно на уровне JVM это так, но на уровне source code нет. В CLR, к примеру, используются идентификаторы с угловыми скобками <>, но в source code это не допускается.

В C# можно использовать префикс @, чтобы указать компилятору, что это идентификатор, а не ключевое слово.

Если в будущем какое-нибудь слова, например, «mutable», «stop», станут ключевыми, можно будет продолжить использовать старые библиотеки, экспортирующие методы или переменные с такими именами, обращаясь к ним как
if (someobj.@mutable) someobj.@stop();

Подключение библиотек работает на уровне JVM и правила к идентификаторам дает она же. Что же касается языка Java, никто не мешает вызвать код через рефлексию или сгенерировав байткод. Да даже банально можно написать ClassLoader, который автоматически подменит невозможные в Java идентификаторы возможными. Так что никакой проблемы совместимости нет.


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

В rust так сделали недавно. Посмотрим к чему это приведет.

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

Уже сломали один раз, и еще смогут

UFO landed and left these words here

В статье упоминается, как минимум, assert и enum.

пометить сеттер/метод-билдер в качестве возвращающего свой получатель
Замечательный перевод, не помеченный как перевод :)
За символ подчеркивания в качестве ключевого слова нужно отстрел вести таким придумщикам, а тем, кто их использует в именах переменных(намеренно злоупотребляя, см. коды программ на C/C++ с двумя и более подряд символами с обоих сторон слова), руки отрубать, нещадно!
Ваши варианты названий переменных аzs00000, aaab005350? — и ниже в комментах полная расшифровка?
Лингвист и создатель одного из самых гибких и удивительных языков Ларри Уолл считает ровно наоборот. Просто во всем нужна мера.
Давайте только не будем слушать тех, кто придумывает ЯП с «птичьим» синтаксисом. Удивительный язык — да, но лингвист из него никакущий, от слова совсем
Не знаком с его работами как лингвиста, меня это мало интересует. Хотелось лишь подчеркнуть, что вдумчивое использование специальных символов не вредит языку, а расширяет возможности. При этом не принципиально, где именно используются эти символы — в начале, конце, середине, аннотациях, именах переменных. Perl — наглядное тому подтверждение. Даже в Java есть место так ненавистному вам именованию (мета-модель JPA). В конце концов, вкусы у всех разные, не всем же нравится подход 1С-овцев к именованию.
Да, полностью согласен относительно того, что вкусы у всех разные и некоторые моменты в JPA лично для меня спорны и безосновательны, поэтому я высказал свое мнение, не старался кого-то оскорбить или унизить, ни ваше, ни Ларри, ни чье бы то ни было
striver
Роберт Мартин: Чистый код. Создание, анализ и рефакторинг. Глава 2. Содержательные имена.
Перечитайте на досуге
А почему бы и нет. Как раз неделя чтива текущего осталось, искал, чтобы почитать. Перевод нормальный есть или же стоит сразу за оригинал браться?
Оригинал не читал, перевод мне показался приемлемым
Можно сделать так что ключевое слово в обратных кавычках, к примеру, `private` будет считаться идентификатором…
Sign up to leave a comment.

Articles