Вольный, впрочем как всегда, перевод
вступительного слова к новому языку программирования от (в большей части) сотрудников Google.
Что такое Noop?
Noop (своеобразное «ничего», как инструкция
NOP в ассемблере) — это новый экспериментальный язык программирования, взявший всё лучшее из языков старых и новых, впитавший в себя лучшие находки индустрии и отринувший худшие, в том числе и касающиеся синтаксиса. Noop изначально предназначен для запуска на
виртуальной машине Java (JVM).
Кто стоит за Noop?
Noop — это совместный проект сообщества единомышленников, состоящего из программистов и сочувствующих (
список на сайте). Мы собрались из нескольких компаний, включая, но не ограничиваясь,
Google.
Мировозрение Noop.
Разработчики Noop прекрасно знают о лучших достижениях и чудовищных промахах в мире программного обеспечения, разработки ПО и эволюции языков программирования. Noop будет поддерживать прекрасное и бороться с чудовищным настолько хорошо, насколько это возможно. Например:
Noop поощряет:
—
Dependency injection (внедрение зависимости) так называемые внешние зависимости вновь созданного объекта;
— Testability (тестируемость) — шов между каждой парой классов;
— Immutability (неизменяемость);
— Читаемость кода важнее любой синтаксической функции;
— Документирование, которое позволяет всегда иметь актуальную документацию;
— Properties, strong typing, современная и разумная stdlib.
Noop порицает:
— Статику, в любом ее проявлении (статические методы и т.д.);
— Реализацию наследования (subclassing);
— Примитивы;
— --Ненужную — шаблонизацию.
Почему Noop?
Dependency injection (внедрения зависимости) изменили представление о том, как разрабатывать программное обеспечение.
Spring догнал
EJB в сфере коммерческих приложений, и
Guice и
PicoContainer сегодня являются важной частью хорошо написаных и спроектированных приложений.
Автоматизированное тестирование, в особенности
Unit Testing, также является важнейшим элементом построения надежного программного обеспечения, без труда поддерживаемого и легко масштабируемого. Любой приличный разработчик программного обеспечения обязан писать тесты, лучшие из них автоматизированы и охватывают большую часть кода.
Noop — новый язык программирования, который выполняется на виртуальной машине Java, и в своей исходной форме весьма схож с
Java. Смысл сего мероприятия в том, чтобы построить систему зависимостей и тестирования в языке с самого его зарождения, а не полагаться на сторонние библиотеки, как это сейчас делают все другие языки.
Неизменяемость и минимальная зона видимости переменных воодушевляют на использование final/const поведения по умолчанию и обеспечивают легкий доступ к
функциональному стилю программирования. Тестируемость предполагается путем предоставления возможности внедрения зависимостей (Dependency injection) на уровне языка, а также компактным синтаксисом конструкторов внедрения зависимостей.
Запланировано три пути использования исходных файлов Noop:
— Java транслятор: транслирует Noop код в исходные коды Java. Позволяет вам использовать Noop без преобразования вашего текущего кода, но не все возможности рантайма языка поддерживаются;
— Интерпретация: читает и исполняет код Noop через интепретатор. Медленно, зато будет иметь интерфейс командной строки;
— Компиляция: компиляция непосредственно в
байткод Java.
<тут заканчивается вольный перевод>
Кто перейдет по всем ссылкам в переводе и прочитает все статьи, тому +10 к скиллу «Наука».
Традиционный, но ни о чем не говорящий, HelloWorld.noop:
import noop.Application;
import noop.Console;
class HelloWorld(Console console) implements Application {
Int main(List args) {
String s = "Hello World!";
console.println(s);
return 0;
}
}
Итак, зачем и кому оно нужно? Будет нужно? Нужно ли?
Я тут размышлял 10 минут об этом, ничего здравого мне на ум не приходит. Разве что (судя по интерпретации и компиляции в Java код / байткод) Google готовит запасной вариант на случай «новая, вкусная, но немножко дорогая и ограниченная патентами Java от Oracle!».
комментарии (60)
так всё красиво вроде бы, на словах, а в примерах уныние. по примерам, кстати, сразу заметно, что «интерпретация» в Java code будет работать безукоризненно (:
допиливают. скоро можно будет.
короче либо что-то тут нечисто, либо это академическая игрушка а-ля немерле.
надо ждать реальных примеров, а не этого кодобреда, что сейчас у них в examples.
На что получил ответ: «В Шарпе строки называются string, а в Яве — String.»
Так вот Noop похоже отличается тем, что в нём целые числа называются Int, а не Integer…
System.String = string
System.In32 = int
…
String res = "?";
String a = "text", b = "text";
if( a == b )
res = "C#";
else
res = "Java";
Ведь вроде как a.equals(b) определен давать Истина если строки равны, а не только если объект динаковый
Java объекты сравнивает в данном случае, а не содержимое String.
В Java есть несколько нюансов для вашего примера связанных хранением строк в пуле для увеличения производительности, т.е. ваш пример не совсем корректен
String res = "?";
// В данном случае для s1 и для s2 создаются их собственые различные обьекты
String s1 = new String(«str»);
String s2 = new String(«str»);
if (s1 == s2) {
ref = «WTF?!»;
} else {
res = «good:)»;
}
System.out.println(res);
res = "?";
// VM смотрит если строка «str» во внутреннем пуле строк
// она ее там не находит по-этому создает новую строку «str» и добавляет в пул
String s3 = «str»;
// VM ищет строку «str» в пуле, находит ее и возвращает ее
String s4 = «str»;
// по итогу s3 и s4 указывает на один и тот же обьект
if (s3 == s4) {
res = «good:)»;
} else {
res = «WTF?!»;
}
System.out.println(res);
Наоборот. Наследование реализации.
> Итак, зачем и кому оно нужно? Будет нужно? Нужно ли?
Эксперимент, «борьба со злом». И это, вы же сами описали проблемы, которые язык пытается решить, в вольном переводе. :)
интересно было бы почитать почему то, что язык порицает, является злом?
Ага, и вдруг чего, они быстренько перепишут все свои килотонны Java кода. ;)
В общем, я хочу сказать, что заявленные цели и выбор платформы очень соответствуют тренду.
Еще один никому не нужный язык.
Ну да, люди пишут новый язык. Начали, судя по истории проекта, месяц назад. Естественно, пока со стороны ничего не понятно. Они и сами, наверное, не во всем определились.
Выводы про то, что гугл что-то хочет переводить с Явы на это дело — безосновательные домыслы. Есть у тамошних разработчиков 20% своодного времени — вот они и развлекаются.
Хорошо быть сотрудниками гугла: две с половиной тысячи строк, из которых треть копирайты, и все уже обсуждают и делают далеко идущие выводы :-)
%)
«No operation»
Ничто не мешает компилятору генерировать вместо a+b вызов AClass.add(a,b)
Ага. Мало на свете отличных и элегантных языков. Давайте придумаем еще один, вместо того, чтобы дать новый виток загибающимся шедеврам, вроде Форта или оберона.
Или гуглоидов?
Глупый вопрос. Название говорит за себя изначально
Под пониманием «лучшего» следует понимать тонны ненужных лексем и тупое клонирование С\Явы с добьавлением криворукости авторов.
И Вы наивно считаете, что Вы сможете сделать язык лучше использующий виртуальную машину Явы, нежели её создатели? (а если хотите сказать, что это не Ваша цель, тогда зачем вообще трогаете ВМ Явы?)
int 20h?
«Сочувствующие»… А чему они сочувствуют? Лучше бы искали единомышленников.
Сенсация! Первый язык программирования обладающий мировоззрением) Я так понимаю, что философии у языка нету…
Напоминает лозунг политической партии. Даешь борьбу за идеалы!
О, это интересно…
Ага. И вечная головная боль при низкоуровневой отладке:)
Ну да, полиморфизм — это для слабаков)))))
Бред. Кстати, читаемости то в примерах как раз и не видно.
Дети, напишите 30 раз предложение: «Не знал какой плюс языка написать, поэтому съехал на документацию». А как на счет человечных документаций (MSDN, Spin и т.д.)
Чтобы любой дурак писал проги не вдаваясь в оптимизацию)
про него действительно ничего не понятно).
JVM не равно Java, можно любить JVM и не любить Java. Ориентация на JVM —
это выбор целевой платформы, а не языка. Количество языков для JVM сейчас
довольно велико. У нее есть свои плюсы и свои минусы, как у всякой
технологии, многие языки для JVM ставят своей целью эти минусы разрешить
(например, отсутствие tail-call optimization).
Dependency Injection тесно связан с практикой юнит-тестирования,
последовательное использование которой может вообще сделать дебаггер
ненужным, желательно, чтобы при этом сам язык обладал свойствами,
делающими возможным доказательство корректности программ, написанных
на нем.
Immutability — это отсутствие деструктивного присваивания, оно не
противоречит полиморфизму. В Haskell, например, реализовано два типа
полиморфизма, при этом все структуры данных в нем immutable. Более того,
концепция Data Object/Entity в DDD реализует ту же самую идею, только в
Java или C# ее приходится реализовывать на уровне конвенций.
«Шаблонизация» — в английском тексте было boilerplate, это ошибка в
переводе. Вы даже не заглянули в оригинал.
Поставил бы минус, если б мог.
Ах да, еще… Задумайтесь на мгновение, что будет, когда на Вашем компьютере будет под сотню ядер. Большое число инноваций в языках программирования связано именно с этим вопросом.
Другое дело, что вряд ли все эти цели будут 1) достигнуты в Noop 2) достигнуты в нем первом. Элементы это есть и в Haskell, в Scala, Nemerle, F#, Clojure.
Не секрет, что индустрия создания ПО во всех смысла требует не академической чистоты, а практичности и совместимости с существующими наработками. Главная наработка — императивный стиль мышления и подход; он пронизывает все вокруг — начиная от основ информатики в школе и заканчивая мейнстримами вроде java или с++. Немногие «доживают» до ФП, принципы которого открываются только на старших курсах ВО, а то и позже :)
Поэтому Noop можно считать только попыткой, но точно не солюшеном. Видимо, это и хотел сказать автор коммента выше в 5% своей реплики (в остальных 95% он зачем-то брызжет ядом без повода, а то и по заблуждению)
Почитал статью в википедии, в ней на основе примера рассказывается, как здорово декларировать, что аргументом метода является объект, который гарантированно имеет определенные методы. Но ведь это и есть шаблон проектирования «Interface»!