войти зарегистрироваться

Noop — новый язык программирования от (почти) Google

Вольный, впрочем как всегда, перевод вступительного слова к новому языку программирования от (в большей части) сотрудников 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)

  • после просмотра HelloWorld.noop абсолютно пропал интерес
    • примеры там жгут, да. code.google.com/p/noop/source/browse/examples/noop/delegation/
      так всё красиво вроде бы, на словах, а в примерах уныние. по примерам, кстати, сразу заметно, что «интерпретация» в Java code будет работать безукоризненно (:
  • чем он отличается от haxe, однако.
    • тем, что haxe нельзя интерпретировать \ компилировать в Java? (:
    • Вопрос тут другой: многим ли он отличается от Java?
      • как я понимаю, особо ничем. соббсно пока в нему не прикрутят хотя бы hibernate, копать глубже неинтересно.
        • мы тут с нишей языка нового разобраться не можем, а вы уже hibernate к нему «прикручиваете» (:
          • ну без чего-то подобного толку от него как от брейнфаку. или это очередная своя ява с б/дж и ш?
            • вы даже себе не представляете для скольких людей есть толк от Java, а под hibernate они подразумевают только кнопку «усыпить» в операционной системе.
              • я понимаю, зачем нужна ява, поверьте. сила ее, кстати, в том что на ней уже написано. если гугл внезапно пытается переписать яву то а) проще допилить openjdk б) портирование того же GWT займет тучу времени.

                короче либо что-то тут нечисто, либо это академическая игрушка а-ля немерле.
      • по тексту да, по коду нет.
        надо ждать реальных примеров, а не этого кодобреда, что сейчас у них в examples.
    • Наличием буквы p в конце названия, чётко характеризующей его необходимость…
  • Специально для нупов?
    • у меня блог на noop.lv. продать что ли :)
      • Лучше подождать пока язык станет популярным.
  • оно хочет яву и руби, а я их не хочу, на этом мое знакомство с языком закончилось.
  • чтооо, негативный пост о гугле на хабре?!
  • Есть мнение, что Noop был сделан на случай если начнутся проблема с Oracle и Java. Но за что купил, за то и продаю :).
    • Не минисуйте :), дочитал до конца и понял свою оплошность, а комментарий не удалить :).
      • Есть мнение, что надо сначала прочитать полностью, а уже потом высказывать своё мнение.
        • Знаю-знаю, всё время хочу себя приручить :).
  • Как то спросил у знакомого: «Чем принципиально Шарп отличается от Явы?»
    На что получил ответ: «В Шарпе строки называются string, а в Яве — String.»

    Так вот Noop похоже отличается тем, что в нём целые числа называются Int, а не Integer…
    • Вы таки издеваетесь? для шарпа есть алиасы для основных типов данных
      System.String = string
      System.In32 = int
    • ну, и кроме того, шарп сейчас гораздо более мощен
      • это как?
        • Синтаксические конструкции гораздо богаче. Тот же yield например.
          • вот в чем сила, брат!
    • String res = "?";
      String a = "text", b = "text";
      if( a == b )
          res = "C#";
      else
          res = "Java";
      • Не знаю, что у меня не так, но у Java выдает для a==b «Истина»
        Ведь вроде как a.equals(b) определен давать Истина если строки равны, а не только если объект динаковый
        • это от версии jre зависит. если срабатывает оптимизация правильно, то b становится ссылкой на a, поэтому и равны.
          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);
  • > Реализацию наследования (subclassing);

    Наоборот. Наследование реализации.

    > Итак, зачем и кому оно нужно? Будет нужно? Нужно ли?

    Эксперимент, «борьба со злом». И это, вы же сами описали проблемы, которые язык пытается решить, в вольном переводе. :)
  • Похоже хотят потягаться со Scala
  • Я вот так и не понял. Они пишут, что основная фишка языка — интеграция тестов и зависимостей. Но почему-то примера кода про эти фишки найти не смог :).
  • «шов между между» исправьте
    интересно было бы почитать почему то, что язык порицает, является злом?
  • > Google готовит запасной вариант на случай «новая, вкусная, но немножко дорогая и ограниченная патентами Java от Oracle!»

    Ага, и вдруг чего, они быстренько перепишут все свои килотонны Java кода. ;)
  • Подскажите, кто в курсе — за какие грехи нуп порицает реализацию наследования?
    • за жёсткую связь между родителем и потомком
    • Когда Гослинга спросили, чтобы он иначе сделал бы в яве, он ответил, что убрал наследование, оставив интерфейсы. Не знаю, шутил он или нет.
  • Когда я читаю Эванса (DDD), мне вечно кажется, что он излагает ФПшные концепции на каком-то своем странном лунном языке. Например, он говорит о immutable Data Object, у которого нет сеттеров и Entity, который образует persistent структуру из отдельных Data Objects, так и хочется сравнивать его с Окасаки. Похоже, Уадлер скоро выберется из своего функционального гетто…

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

  • Пост ни о чем.

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

    Выводы про то, что гугл что-то хочет переводить с Явы на это дело — безосновательные домыслы. Есть у тамошних разработчиков 20% своодного времени — вот они и развлекаются.
  • А интерпретатор-то на Scala пишется. Интересно, будут ли раскручивать на самом Noop. Если нет, то ситуация очень ироничная.

    Хорошо быть сотрудниками гугла: две с половиной тысячи строк, из которых треть копирайты, и все уже обсуждают и делают далеко идущие выводы :-)
  • Скоро! Майкрософт заговорил о намерениях випустить noop.NET :)
    • Скорее так:
      «Сотрудниками MS Research был создан принципиально новый язык программирования, при разработке которого учитывались лучшие достижения и чудовищные промахи в мире программного обеспечения, разработки ПО и эволюции языков программирования.

      Новый язык поощряет:
      — Dependency injection (внедрение зависимости) так называемые внешние зависимости вновь созданного объекта;
      — Testability (тестируемость) — шов между каждой парой классов;
      — Immutability (неизменяемость);
      — Читаемость кода важнее любой синтаксической функции;
      — Документирование, которое позволяет всегда иметь актуальную документацию;
      — Properties, strong typing, современная и разумная stdlib.

      Новый язык порицает:
      — Статику, в любом ее проявлении (статические методы и т.д.);
      — Реализацию наследования (subclassing);
      — Примитивы;
      — Ненужную шаблонизацию.

      Рабочее название языка — N#.NET»


      %)
  • >Noop (своеобразное «ничего», как инструкция NOP в ассемблере)

    «No operation»
  • А правильно я понимаю, что Noop унаследует от Java нелюбовь к переопределению операторов? Или JVM их поддерживает?
    • ты сам понял, что сказал?
      • В Java нельзя переопределять операторы. Так вот, вопрос — это ограничение JVM (и тогда в noop тоже нельзя) или ограничение только Java как языка?
        • Переопределение операторов, это всего-лишь синтаксический сахар.

          Ничто не мешает компилятору генерировать вместо a+b вызов AClass.add(a,b)
        • В Groovy есть переопределение операторов, т.е. это ограничение Java
  • Noop — новый язык программирования от (почти) Google

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

    Вольный, впрочем как всегда, перевод вступительного слова к новому языку программирования от (в большей части) сотрудников Google.

    Или гуглоидов?

    Что такое Noop?

    Глупый вопрос. Название говорит за себя изначально

    Noop (своеобразное «ничего», как инструкция NOP в ассемблере) — это новый экспериментальный язык программирования, взявший всё лучшее из языков старых и новых, впитавший в себя лучшие находки индустрии и отринувший худшие, в том числе и касающиеся синтаксиса.

    Под пониманием «лучшего» следует понимать тонны ненужных лексем и тупое клонирование С\Явы с добьавлением криворукости авторов.

    Noop изначально предназначен для запуска на виртуальной машине Java (JVM).

    И Вы наивно считаете, что Вы сможете сделать язык лучше использующий виртуальную машину Явы, нежели её создатели? (а если хотите сказать, что это не Ваша цель, тогда зачем вообще трогаете ВМ Явы?)

    Кто стоит за Noop?

    int 20h?

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

    «Сочувствующие»… А чему они сочувствуют? Лучше бы искали единомышленников.

    Мировозрение Noop.

    Сенсация! Первый язык программирования обладающий мировоззрением) Я так понимаю, что философии у языка нету…

    Разработчики Noop прекрасно знают о лучших достижениях и чудовищных промахах в мире программного обеспечения, разработки ПО и эволюции языков программирования. Noop будет поддерживать прекрасное и бороться с чудовищным настолько хорошо, насколько это возможно.

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

    Noop поощряет:

    О, это интересно…

    — Dependency injection (внедрение зависимости) так называемые внешние зависимости вновь созданного объекта;

    Ага. И вечная головная боль при низкоуровневой отладке:)

    — Immutability (неизменяемость);

    Ну да, полиморфизм — это для слабаков)))))

    — Читаемость кода важнее любой синтаксической функции;

    Бред. Кстати, читаемости то в примерах как раз и не видно.

    — Документирование, которое позволяет всегда иметь актуальную документацию;

    Дети, напишите 30 раз предложение: «Не знал какой плюс языка написать, поэтому съехал на документацию». А как на счет человечных документаций (MSDN, Spin и т.д.)

    — Properties, strong typing, современная и разумная stdlib.

    Чтобы любой дурак писал проги не вдаваясь в оптимизацию)

    Noop порицает:
    — Статику, в любом ее проявлении (статические методы и т.д.);

    Ага. Зачем нам выигрывать такты? Давайте сделаем всё динамически и сожрем нафиг кусок пирога про производительности серверов.

    — Реализацию наследования (subclassing);

    Да! Каждый класс нужно переписывать с нуля! Долой экономию времени при разработке! Релиз подождёт, инвесторы пока покурят, счетчик насчитает проценты, расходы увеличатся и проект выйдет на отметку убыточности.

    — --Ненужную — шаблонизацию.

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

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

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

    Кто перейдет по всем ссылкам в переводе и прочитает все статьи, тому +10 к скиллу «Наука».

    И -10 к здравомыслие

    Традиционный, но ни о чем не говорящий, HelloWorld.noop:

    Тем не менее он сказал очень много. И ничего позитивного, как и другие примеры.

    Вердикт: ребята решили попантоваться и придумать новый, непонятно кому и зачем нужный язык. Эксперементальным его толком не назовешь, учебным или научным — тоже. Может авторы поклонники одной из версий происхождения Си — решили сделать язык выкручивающий руки програмерам.

    Язык перечит ряду основных требований нашего сурового промышленного мира:
    А) Он заранее обречен на невысокую производительность
    Б) Производство продуктов на нём будет занимать больше времени, а значит и больше денег
    В) Язык сыр и неразвит. Вероятность того, что он станет «взрослым» неумолимо близиться к нулю. Следствие — головная боль тестеров и оптимизаторов, ведь им предется латать не только дыры программы, но и самого языка.
    • «My God, what am I doing with my life» (Rich Hickey)
    • Ну Вы меня задели, прямо, своим постом. Дело даже не в Noop (собственно,
      про него действительно ничего не понятно).

      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% он зачем-то брызжет ядом без повода, а то и по заблуждению)

  • Какая нафиг иммутабельность, если есть переменные? Или имеется ввиду что-то другое? Каким образом она поощряется?
  • Помогите понять, чем «dependency injection» отличается от шаблона проектирования «Interface».

    Почитал статью в википедии, в ней на основе примера рассказывается, как здорово декларировать, что аргументом метода является объект, который гарантированно имеет определенные методы. Но ведь это и есть шаблон проектирования «Interface»!
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.