Портирование нитры.
От: alex_public  
Дата: 30.01.17 20:34
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Да, да, им про это уже не раз писали. И они не раз дежурно отмахивались, что сейчас на это нет ресурсов (людей). Не понимая, что это должно быть не ещё одним побочным направлением развития, которое возможно сделает кто-то из сообщества, а именно главным направлением, над которым должен работать главный разработчик.

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

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

1. Все ваши инструменты бутстрапятся, правильно? Т.е. если мы вдруг реализуем компиляцию "hello world" в нейтив на базе ваших существующих .net компиляторов, то потом автоматически получим нативную версию всех инструментов (в первую очередь компилятора, ну и всего остального что у вас там есть)?

2. Насколько язык заточен на CLR? Т.е. от каких из негативных моментов CLR можно будет отказаться при переходе на нативный код, а от каких нельзя. В первую очередь речь о: сборщике мусора, интроспекции времени исполнения (рефлексии, от которой кстати отказываются в .net native), ссылочных (а не на стеке, кстати тоже пытаются ввести в будущем в .net) объектах, неэффективных дженериках и делегатах. А так же насколько доступны unsafe возможности (например арифметика указателей) CLR и можно ли их расширить ещё дальше (нативное выделение памяти и т.п., кстати тоже пытаются ввести определённым образом в будущем в .net)..

3. Насколько язык заточен на библиотеку .Net. Именно язык, а не предоставление .net в качестве стандартной библиотеки языка для пользователя (т.е. речь об аналоге взаимоотношений new и VirtualAlloc из C++). Саму библиотеку для пользователя на самом деле написать не так сложно (полно готовые открытых разработок на эту тему). А в самое первое время можно вообще обойтись возможностью доступа к API ОС (для нативного кода это естественно). В отличие от потребностей самого языка, которые надо будет или переделывать внутри или реализовывать функции аналогичные .net.

В зависимости от ответов можно сделать вывод о том, что с помощью например таких (https://habrahabr.ru/post/119850/) инструментов можно сделать нативную реализацию:
— легко
— сложно
— сложно и не нужно (потому что нативная реализация языка с такими врождёнными пороками просто не нужна).

01.02.17 09:45: Ветка выделена из темы Язык программирования 2016-го года: Go
Автор: Iso12
Дата: 22.01.17
— WolfHound
Re: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.17 02:11
Оценка:
Здравствуйте, alex_public, Вы писали:

_>1. Все ваши инструменты бутстрапятся, правильно? Т.е. если мы вдруг реализуем компиляцию "hello world" в нейтив на базе ваших существующих .net компиляторов, то потом автоматически получим нативную версию всех инструментов (в первую очередь компилятора, ну и всего остального что у вас там есть)?


Упрощенно говоря — да. Компилятор языка это текст плюс ратнтайм, плюс используемый внешний АПИ. Если мы можем компилировать этот текст самим собой, то все что нужно для переноса языка на другую платформу — это скомпилировать себя собой с бэкэндом для этой платформе.

Естественно при этом есть нюансы.
1. АПИ — компилятор использует ряд вызовов рантайма. Их надо воспроизвести в целевом рантайме. Собственно мы используем минимум:
* Работа со строками в формате UTF-16 (классы string и StringBuilder).
* Коллекции (List<T>, HashSet<T>, Dictionary<R, V>, ImmutableArray и т.п.) все это есть в исходниках в библиотеках на гитхабе. Да и написать с нуля не долго.
* Чтение и запись файлов.
* Динамическая загрузка библиотек, создание экземпляра объекта и вызов его метода (это нужно для динамической расширяемости).

Если брать не только компилятор, но и движок IDE, то нужны еще:
* Именованные каналы для общения с сервером движка IDE.
* АПИ по работе с потоками и процессами для организации параллельных вычислений.

Конечно же код работы непосредственно с IDE просто перекомпилировать не удастся. У все IDE свои АПИ. Для них надо писать фронтэнд вручную. Движек же IDE у нас работает в отдельном процессе и взаимодействует с фронтэндом через именованные каналы. Так что сервер может работать на платформе отличной от той на которой работает IDE. Фронтэнд у нас очень тонкий. Логики там нет. Он просто должен реализовывать АПИ IDE и преобразоывать их в посылку и прием сообщений IDE-серверу живущему в отдельном процессе.

_>2. Насколько язык заточен на CLR?


Тут, для начала, надо определиться о том, что понимать под понятием "язык". Мы делаем язык для "написания языков" (т.е. компиляторов и тулинга). Называется он Nitra. При его разработке используется как он сам, так и код на языке общего назначения — Nemerle. Сейчас используется Nemerle 1.2.х, который написан сам на себе с применением все того же бустрапинга. Его минус в том, что он не поддерживает сменяемые бэкэнды. В процессе работы над Нитрой мы хотим переписать сабсэт Nemerle используемый в Нитре на Нитре, чтобы забутстрапить и Нитру, и этот сабсэт Нимерла с использованием бэкэндов. В принципе можно было бы перевести на бэкэнды и старый Немерл. Но я в этом не вижу особого смысла. Работы много, толку мало.

В Нитре и этом сабсэте Немерла используются:
1. Автоматическое управление памятью. Для компилятора можно просто выделять память из одного непрерывного блока и тупо забить на его освобождение (делать его для всего пула в конце компиляции). Будет перерасход процентов в 10-20, но учитывая объемы современной памяти — это не критично. На первое время сойдет. Ну, или реализовать самый примитивный вариант GC и вызывать сборку мусора вручную в известных точках. Для движка IDE такой способ будет неприемлем, но для компилятора — прокатит. Далее, конечно, надо реализовать точный GC на основе поколений или один из новомодных алгоритмов. Еще один вариант — реализовать автоматическое управление памятью на базе подсчета ссылок. По сути это ограниченный ЖЦ.
2. Динамическая загрузка кода. Грамматики, код типизации и бэкнд помещаются в библиотеки. Во время исполнения они подгружаются как в компилятор, так и в движок IDE. Там они компонуются с другими такими же сущностными и получается конечный парсер, типизатор и бэкэнд. Эту часть можно абстрагировать в виде АПИ и реализовать для каждой из платформ на базе их родного АПИ. Подгружаемые типы являются монотипными (т.е. не обобщенными).
3. ООП дотнетного типа:
* Классы с одним предком.
* Интерфейсы с множественным наследованием.
* Виртуальные таблицы.
Тут нужна поддержка в рантайме. Таблицы интерфейсов и виртуальная таблица методов. Собственно как это все делается известно. Но это требует реализации.

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

Нитра предоставляет сериализацию символов и АСТ-а. Так что дженерики можно будет записывать в библиотеки в виде АСТ-а и символов, а потом материализовывать их для конкретных типов (как шаблоны С++ только без исходников).

Рефлексия нами по сути не используется. Только для той самой подгрузки грамматик (что может быть абстрагированно).

Нитра из коробки предоставляет метаданные для всех внутренностей любого языка написанного на Нитре. Так что для языка не составит труда реализовать и рефлексию и прочий блэкджек с девочками. Причем сериализация и десериализация метаинформации производится с помощью генерации кода. Это с одной стороны быстро, а с другой не привязывает нас к АПИ вроде рефлексии.

Все вышесказанное было о бутстрап-языке, т.е. минимуме необходимом для самовоспроизведении. Важно понимать, что Нитра — это конструктор.

Немерл на его базе позволит как добавлять новые фичи (в виде компонентов), так и отключать имеющиеся (при условии, что при их разработке соблюдалась модульность).

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

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

_>3. Насколько язык заточен на библиотеку .Net. Именно язык, а не предоставление .net в качестве стандартной библиотеки языка для пользователя


Этого вообще не понял. Языку просто по фигу какая там у него библиотека. Вот библиотека от языка зависит. Если у нас язык с ЖЦ, то и в библиотеке должны быть ЖЦ-типы.

Для бутстрапинга нужно воспроизвести ряд классов, но их набор не велик и почти все они есть в исходниках. Так что их надо будет просто скомпилировать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Портирование нитры.
От: alex_public  
Дата: 31.01.17 10:26
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>1. Все ваши инструменты бутстрапятся, правильно? Т.е. если мы вдруг реализуем компиляцию "hello world" в нейтив на базе ваших существующих .net компиляторов, то потом автоматически получим нативную версию всех инструментов (в первую очередь компилятора, ну и всего остального что у вас там есть)?

VD>Упрощенно говоря — да. Компилятор языка это текст плюс ратнтайм, плюс используемый внешний АПИ. Если мы можем компилировать этот текст самим собой, то все что нужно для переноса языка на другую платформу — это скомпилировать себя собой с бэкэндом для этой платформе.

Отлично.

VD>Естественно при этом есть нюансы.

VD>1. АПИ — компилятор использует ряд вызовов рантайма. Их надо воспроизвести в целевом рантайме. Собственно мы используем минимум:
VD>* Работа со строками в формате UTF-16 (классы string и StringBuilder).
VD>* Коллекции (List<T>, HashSet<T>, Dictionary<R, V>, ImmutableArray и т.п.) все это есть в исходниках в библиотеках на гитхабе. Да и написать с нуля не долго.

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

VD>* Чтение и запись файлов.

VD>* Динамическая загрузка библиотек, создание экземпляра объекта и вызов его метода (это нужно для динамической расширяемости).

VD>Если брать не только компилятор, но и движок IDE, то нужны еще:

VD>* Именованные каналы для общения с сервером движка IDE.
VD>* АПИ по работе с потоками и процессами для организации параллельных вычислений.

Ну а это всё по сути прямые обёртки над функциями ОС и пишется элементарно.

Кстати, раз вы таких специалисты по парсингу и т.п., то при переходе нативный код я бы на вашем месте первым делом решил такую простую задачу: автоматическую конвертацию заголовочных файлов из WindowsSDK (или Linux — разницы нет) в декларацию чужих импортируемых функций на вашем языке. Если будет такой простейший конвертер (кстати, помнится для каких-то языков я такое уже видел), то это решит огромное число проблем и сходу (даже без создания своей библиотеки языка) позволит писать полноценные приложения (в том числе и с GUI и всем остальным).

VD>Конечно же код работы непосредственно с IDE просто перекомпилировать не удастся. У все IDE свои АПИ. Для них надо писать фронтэнд вручную. Движек же IDE у нас работает в отдельном процессе и взаимодействует с фронтэндом через именованные каналы. Так что сервер может работать на платформе отличной от той на которой работает IDE. Фронтэнд у нас очень тонкий. Логики там нет. Он просто должен реализовывать АПИ IDE и преобразоывать их в посылку и прием сообщений IDE-серверу живущему в отдельном процессе.


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

_>>2. Насколько язык заточен на CLR?

VD>В Нитре и этом сабсэте Немерла используются:
VD>1. Автоматическое управление памятью. Для компилятора можно просто выделять память из одного непрерывного блока и тупо забить на его освобождение (делать его для всего пула в конце компиляции). Будет перерасход процентов в 10-20, но учитывая объемы современной памяти — это не критично. На первое время сойдет. Ну, или реализовать самый примитивный вариант GC и вызывать сборку мусора вручную в известных точках. Для движка IDE такой способ будет неприемлем, но для компилятора — прокатит. Далее, конечно, надо реализовать точный GC на основе поколений или один из новомодных алгоритмов. Еще один вариант — реализовать автоматическое управление памятью на базе подсчета ссылок. По сути это ограниченный ЖЦ.

Печально это конечно. Подсчёт ссылок — это ужасно (в смысле как универсальное решение для всей памяти). GC лучше, но тоже не очень (при этом его реализация очень не тривиальна).

VD>2. Динамическая загрузка кода. Грамматики, код типизации и бэкнд помещаются в библиотеки. Во время исполнения они подгружаются как в компилятор, так и в движок IDE. Там они компонуются с другими такими же сущностными и получается конечный парсер, типизатор и бэкэнд. Эту часть можно абстрагировать в виде АПИ и реализовать для каждой из платформ на базе их родного АПИ. Подгружаемые типы являются монотипными (т.е. не обобщенными).


Да, это очевидно всё.

VD>3. ООП дотнетного типа:

VD>* Классы с одним предком.
VD>* Интерфейсы с множественным наследованием.
VD>* Виртуальные таблицы.
VD>Тут нужна поддержка в рантайме. Таблицы интерфейсов и виртуальная таблица методов. Собственно как это все делается известно. Но это требует реализации.

Тут тоже всё тривиально (по сути никаких внутренних отличий от C++, так что можно взять готовую эффективную реализацию). Только вот есть один вопрос, который я уже упоминал, но не увидел на него ответа. Что у нас с разделением на типы ссылки и значения? В .net у нас экземпляры классов только ссылочные — это не эффективно. Должны быть и ссылочные механизмы и нормальные объекты-значения. И в памяти и на стеке.

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

VD>Нитра предоставляет сериализацию символов и АСТ-а. Так что дженерики можно будет записывать в библиотеки в виде АСТ-а и символов, а потом материализовывать их для конкретных типов (как шаблоны С++ только без исходников).

Позитивно.

VD>Рефлексия нами по сути не используется. Только для той самой подгрузки грамматик (что может быть абстрагированно).

VD>Нитра из коробки предоставляет метаданные для всех внутренностей любого языка написанного на Нитре. Так что для языка не составит труда реализовать и рефлексию и прочий блэкджек с девочками. Причем сериализация и десериализация метаинформации производится с помощью генерации кода. Это с одной стороны быстро, а с другой не привязывает нас к АПИ вроде рефлексии.

Вообще отлично.

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


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

_>>3. Насколько язык заточен на библиотеку .Net. Именно язык, а не предоставление .net в качестве стандартной библиотеки языка для пользователя

VD>Этого вообще не понял. Языку просто по фигу какая там у него библиотека. Вот библиотека от языка зависит. Если у нас язык с ЖЦ, то и в библиотеке должны быть ЖЦ-типы.

Речь о том, какие функции .net используются рантаймом (а не библиотекой) языка — их же придётся заменять на вызовы к ОС. Я уже приводил пример, что допустим рантайму C++ необходим доступ к функциям типа VirtualAlloc, VirtualFree и т.п. Плюс там обычно используются различные синхронизации (типа критических секций) и некоторые нюансы многопоточности (типа tls).

===============================================================================

Вообще пока что судя по твоим словам всё относительно позитивно, хотя есть и серьёзные проблемы. Из того, что я прочитал, какую-то реализацию сложнее прямых обёрток вокруг системного АПИ требуют только:

1. Своя библиотека контейнеров (в принципе элементарно)
2. Какое-то управление памятью — а это слооожно (если хотим эффективно).

Остальное получается по идее портируемо в режиме Ctrl+C/Ctrl+V.
Re[3]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.17 13:02
Оценка:
Здравствуйте, alex_public, Вы писали:

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


Дык оно так и есть. Просто библиотека и есть часть рантайма для компилятора.

_>А от рантайма должны требоваться грубо говоря только функции выделения и освобождения (если без GC) памяти.


А вот так не бывает. Библоитека она всегда рассчитана на язык. Там масса нюансов.

_>Ну а это всё по сути прямые обёртки над функциями ОС и пишется элементарно.


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

_>Кстати, раз вы таких специалисты по парсингу и т.п., то при переходе нативный код я бы на вашем месте первым делом решил такую простую задачу: автоматическую конвертацию заголовочных файлов из WindowsSDK (или Linux — разницы нет) в декларацию чужих импортируемых функций на вашем языке. Если будет такой простейший конвертер (кстати, помнится для каких-то языков я такое уже видел), то это решит огромное число проблем и сходу (даже без создания своей библиотеки языка) позволит писать полноценные приложения (в том числе и с GUI и всем остальным).


Мы конечно специалисты по парсингу и спарсить заголовочные файлы С не является особой проблемой, но опять же у нас не 100 рук. Плюс тут нужно не только парсить уметь, но и помнить все нюансы работы с этими АПИ. Если с АПИ Винды я еще знаком (хотя уже лет 15 с ними не возился), то с линукосовыми или iOS-ыми я не знаком совсем. Стало быть я плохой кандидат на эту задачу. А вот помочь с парсингом — это пожалуйста.


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


Тут опять таки лучше чтобы такой задачей занимались люди которые близки к этой платформе и этой IDE. Я шарю в MS VS. Для нее я реализацию написал. А вот написть тоже для Эклипса какого или IDEA мне будет проблематично. В то же время я могу элементарно объяснить что надо делать спецу в этих технологиях и он спокойно за месяцок-другой ненапряжной работы это сделает. Движок ведь уже отлажен.

_>Печально это конечно. Подсчёт ссылок — это ужасно (в смысле как универсальное решение для всей памяти). GC лучше, но тоже не очень (при этом его реализация очень не тривиальна).


Да нет ничего печально. Просто ты дико предвзят (причем не по делу) к GC. А для компилятора нет ничего впечатлительного и в тупейшем "нарезателе" памяти. Компилятор программа пакетная. Собрала данные, обработала, выплюнула исполнимый модуль. Основной объем памяти занимают АСТ и дерево разбора.

GC тоже не бином Ньютона. В LLVM есть вся поддержка GC. И есть готовые реализации GC. Состыковать все это вполне подъемная задача. За время компиляции ЖЦ дотнета почти не запускается.

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

_>Тут тоже всё тривиально (по сути никаких внутренних отличий от C++, так что можно взять готовую эффективную реализацию).


Ты говоришь очевидные и банальные вещи. Я тебе заранее мог бы скзазать, что все что нужно сделать евляется известным и тривиальным. Вопрос только в том, что в совокупности это не кислый объем работ который а) надо сделать; б) требует знаний в целевой платформе.

Лично у меня просто нет ни времени, ни знаний в целевых платыформах отличных от Винды. А для винды и так есть дотнет.

Я, конечно, могу взять и сделать LLVM-версию бэкэнда для Винды. Но не ясно зачем она нужна, и не это отвлечет меня от развития Нитры и Немерла, так что в итоге все встроится в очередь и отдалит результат еще дальше.

_>Только вот есть один вопрос, который я уже упоминал, но не увидел на него ответа. Что у нас с разделением на типы ссылки и значения? В .net у нас экземпляры классов только ссылочные — это не эффективно. Должны быть и ссылочные механизмы и нормальные объекты-значения. И в памяти и на стеке.


У нас — конструктор. Мы вольны добавлять в него все что захотим. Главное, чтобы в рантайме поддержка была. Для самого немерла используется дотнетное разделение на вэлью-типы и ссылочные. Ссылочные живут в хипе, вэлью на стеке и в внутри других объектов. При грамотном проектировании ник каким проблемам с производительностью это не влечет. Но если кому-то хочется это оптимизировать, то флаг ему в руки. Их можно оформить как расширение к компилятору и использовать в своих проектах или ключить в стандартную библиотеку (расширения компилятора — тоже библиотечные вещи).

_>Нуу тут опять же есть нюансы. Совсем ручное управление (как в C) мало кому интересно (хотя опять же должно быть доступно в языке, хотя бы в каком-то unsafe режиме).


Согласен.

_>А при полуавтоматическом (умные указатели и т.п.) могут всплывать различные проблемы типа "восходящего фунарга" и т.п.


Я как то с фунаргами не знаком (глянул википедию). Если речь о релизация ФВП (функций высшего порядка), то очевидно, что тут нужно делить их на два типа:
1. С копирующими замыканиями (значениями лежащими в стеке).
2. Позволять захватывать ссылки только на объекты управляемые ЖЦ или рефкаунтингом.

_>В том же C++ эта проблем сейчас по сути решена благодаря введению в язык семантики перемещения.


Тоже полезная концепция. И не только для замыканий. Я сам думал об уникальных указателях.

_>Но это уже по сути глобальная правка всего языка, а не просто изменение одной мелкой подсистемы (выделения памяти).


_>Речь о том, какие функции .net используются рантаймом (а не библиотекой) языка — их же придётся заменять на вызовы к ОС.


Рантайм на котором будет выполняется скомпилированная программа? Да нам как-то по фигу это. Хоть она просто будет в памяти биты гонять.

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

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

_>Я уже приводил пример, что допустим рантайму C++ необходим доступ к функциям типа VirtualAlloc, VirtualFree и т.п. Плюс там обычно используются различные синхронизации (типа критических секций) и некоторые нюансы многопоточности (типа tls).


Какие тут проблемы то? Это какие-то несусветные мелочи. GC будет несколько более сложным в реализации. А без него удобный язык трудно сделать. Блокировки опять таки это библиотечная сущность. Ну, надо будет реализовать аналоги функции Monitor.Enter/


_>Вообще пока что судя по твоим словам всё относительно позитивно, хотя есть и серьёзные проблемы. Из того, что я прочитал, какую-то реализацию сложнее прямых обёрток вокруг системного АПИ требуют только:


_>1. Своя библиотека контейнеров (в принципе элементарно)


Это вообще не проблема. Код оных уже есть. Остается только его скомпилировать.

_>2. Какое-то управление памятью — а это слооожно (если хотим эффективно).


Это — да.

С дженериками тоже придется повозиться. Но там тоже ясно что делать.

_>Остальное получается по идее портируемо в режиме Ctrl+C/Ctrl+V.


Это только на словах. По жизни там не не хилый объем работы. Ну, и естественно, будут разные "подводные камни всплывать" по мере погружения. Но задача вполне себе реализуемая.

Собственно действовать надо путем последовательных приближений. Сначала реализовать примитивныую реализацию на уровне С (без плюсов и классов). Потом добавить к ней классы. Отладить на этой базе ЖЦ или ее замену. Далее добавить поддержку дженериков. В конце получим полноценное решение.

Это позволит тестировать результат с самых ранних стадий.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Портирование нитры.
От: alex_public  
Дата: 31.01.17 20:12
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Ну а это всё по сути прямые обёртки над функциями ОС и пишется элементарно.

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

Ну вообще говоря обёртки над функциями ОС генерируются автоматически инструментами. Но при этом они естественно не могут служить удобной стандартной библиотекой языка (она должна быть как минимум кроссплатформенной). Так что потом естественно надо продумать какие-то удобные родные интерфейсы для базовых вещей (хотя бы в рамках стандартной библиотеки C++) и сделать их реализацию на каждой платформе (опять же через вызовы тех самых сгенерированных деклараций нативного АПИ). Но изначально, чтобы оно хоть как-то заработало можно обойтись и прямо функциями ОС.

_>>Кстати, раз вы таких специалисты по парсингу и т.п., то при переходе нативный код я бы на вашем месте первым делом решил такую простую задачу: автоматическую конвертацию заголовочных файлов из WindowsSDK (или Linux — разницы нет) в декларацию чужих импортируемых функций на вашем языке. Если будет такой простейший конвертер (кстати, помнится для каких-то языков я такое уже видел), то это решит огромное число проблем и сходу (даже без создания своей библиотеки языка) позволит писать полноценные приложения (в том числе и с GUI и всем остальным).

VD>Мы конечно специалисты по парсингу и спарсить заголовочные файлы С не является особой проблемой, но опять же у нас не 100 рук. Плюс тут нужно не только парсить уметь, но и помнить все нюансы работы с этими АПИ. Если с АПИ Винды я еще знаком (хотя уже лет 15 с ними не возился), то с линукосовыми или iOS-ыми я не знаком совсем. Стало быть я плохой кандидат на эту задачу. А вот помочь с парсингом — это пожалуйста.

Кстати, как-то забыл упомянуть в предыдущем сообщение очевидную вещь — вам же надо продумать нормальную декларацию для внешних функций (типы, соглашение о вызове и т.п.). У вас же теперь будет прямой вызов таких функций, а не всякий там маршалинг .net'а.Это один из самых важных моментов в современных нативных языках. Потому что если в вашем коде будут легко доступны функции из подключаемых C библиотек и системного АПИ, то это мгновенно даст ему библиотеку (пуская и не родную в начале) на порядок мощнее любого .net'a.

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

VD>Тут опять таки лучше чтобы такой задачей занимались люди которые близки к этой платформе и этой IDE. Я шарю в MS VS. Для нее я реализацию написал. А вот написть тоже для Эклипса какого или IDEA мне будет проблематично. В то же время я могу элементарно объяснить что надо делать спецу в этих технологиях и он спокойно за месяцок-другой ненапряжной работы это сделает. Движок ведь уже отлажен.

Ну лично я про это ничего не могу сказать, т.к. не знаком с внутренностями ни одной IDE (я только их активный пользователь). Я просто говорю о том, что для того чтобы заинтересовать людей с других платформ вам желательно в начале самим сделать хоть один плагин для одной из топовых кроссплатформенных IDE. У вас же значительная часть киллер-фич находится не в самом языке или компиляторе, а именно в интеграции с IDE.

_>>Печально это конечно. Подсчёт ссылок — это ужасно (в смысле как универсальное решение для всей памяти). GC лучше, но тоже не очень (при этом его реализация очень не тривиальна).

VD>Да нет ничего печально. Просто ты дико предвзят (причем не по делу) к GC. А для компилятора нет ничего впечатлительного и в тупейшем "нарезателе" памяти. Компилятор программа пакетная. Собрала данные, обработала, выплюнула исполнимый модуль. Основной объем памяти занимают АСТ и дерево разбора.
VD>GC тоже не бином Ньютона. В LLVM есть вся поддержка GC. И есть готовые реализации GC. Состыковать все это вполне подъемная задача. За время компиляции ЖЦ дотнета почти не запускается.

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

VD>Ну, а для своих нужды ты уже сам сможешь решить использовать тебе GC или вручную памятью управлять.


Вот это я что-то не очень понял. Так автоматическое управление памятью всё же опционально или нет? Речь про рантайм языка, который будет присутствовать в любой пользовательской программе.

_>>Тут тоже всё тривиально (по сути никаких внутренних отличий от C++, так что можно взять готовую эффективную реализацию).

VD>Ты говоришь очевидные и банальные вещи. Я тебе заранее мог бы скзазать, что все что нужно сделать евляется известным и тривиальным. Вопрос только в том, что в совокупности это не кислый объем работ который а) надо сделать; б) требует знаний в целевой платформе.
VD>Лично у меня просто нет ни времени, ни знаний в целевых платыформах отличных от Винды. А для винды и так есть дотнет.

Просто есть разные режимы работы. Может быть даже большой объём, но с гарантированным (успешным) результатом и отсутствием каких-либо вопросов по нюансам реализации. А может быть режим "ну давайте начнём и будем надеяться что всё получится". ))) Вот я и пытаюсь выяснить заранее, к какому режиму относится портирование ваших технологий из .net'a. Пока получается что основной объём работы относится к первому варианту, но не всё (по паре вопросов есть и второй вариант).

VD>Я, конечно, могу взять и сделать LLVM-версию бэкэнда для Винды. Но не ясно зачем она нужна, и не это отвлечет меня от развития Нитры и Немерла, так что в итоге все встроится в очередь и отдалит результат еще дальше.


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

_>>Только вот есть один вопрос, который я уже упоминал, но не увидел на него ответа. Что у нас с разделением на типы ссылки и значения? В .net у нас экземпляры классов только ссылочные — это не эффективно. Должны быть и ссылочные механизмы и нормальные объекты-значения. И в памяти и на стеке.

VD>У нас — конструктор. Мы вольны добавлять в него все что захотим. Главное, чтобы в рантайме поддержка была. Для самого немерла используется дотнетное разделение на вэлью-типы и ссылочные. Ссылочные живут в хипе, вэлью на стеке и в внутри других объектов. При грамотном проектировании ник каким проблемам с производительностью это не влечет. Но если кому-то хочется это оптимизировать, то флаг ему в руки. Их можно оформить как расширение к компилятору и использовать в своих проектах или ключить в стандартную библиотеку (расширения компилятора — тоже библиотечные вещи).

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

_>>А при полуавтоматическом (умные указатели и т.п.) могут всплывать различные проблемы типа "восходящего фунарга" и т.п.

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

Не эффективно)

VD>2. Позволять захватывать ссылки только на объекты управляемые ЖЦ или рефкаунтингом.


Ну понятно что при GC этой проблемы вообще нет. ))) Это актуально именно для неуправляемых языков.

_>>В том же C++ эта проблем сейчас по сути решена благодаря введению в язык семантики перемещения.

VD>Тоже полезная концепция. И не только для замыканий. Я сам думал об уникальных указателях.

Да, конечно же она придумывался для оптимизации многих нюансов (например засовывание тяжёлых объектов в контейнер), а не только этого. Просто по ходу дела ещё и гарантированно (раньше это решалось иногда, если срабатывала оптимизация RVO, что как бы существенно отличается от механизма языка) решила эту известную проблему.

_>>Но это уже по сути глобальная правка всего языка, а не просто изменение одной мелкой подсистемы (выделения памяти).

_>>Речь о том, какие функции .net используются рантаймом (а не библиотекой) языка — их же придётся заменять на вызовы к ОС.
VD>Рантайм на котором будет выполняется скомпилированная программа? Да нам как-то по фигу это. Хоть она просто будет в памяти биты гонять.

В смысле пофиг? Этот рантайм же должны предоставлять создатели языка (сейчас за вас это делает CLR).

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


Т.е. никаких синхронизаций и т.п.?

VD>Другое дело, что должна быть еще хоть какая-то стандартная библиотека: коллекции, строки, работа с файлами, сокетами, пайпами... Вот тут лучше брать интерфейс донтентых либ и реализовывать их на базе имеющихся АПИ.


Нуу это конечно тоже вариант, но скорее для далёкого будущего. А для начала логичнее просто научиться удобно подключать C библиотеки и автоматом получить набор функций на голову превосходящий весь .net вместе взятый. Только при этом с неудобными типам, и разбродом в стиле API и документации.

VD>Или делать библиотеки доступные для всех платформ (те же коллекции и строки можно тупо написать на сомом языке, так как доступ к ОС им не нужен).


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

_>>Остальное получается по идее портируемо в режиме Ctrl+C/Ctrl+V.

VD>Это только на словах. По жизни там не не хилый объем работы. Ну, и естественно, будут разные "подводные камни всплывать" по мере погружения. Но задача вполне себе реализуемая.

Объём безусловно есть в любом случае. Но как я уже писал выше, тип работы может быть существенно разным.

VD>Собственно действовать надо путем последовательных приближений. Сначала реализовать примитивныую реализацию на уровне С (без плюсов и классов). Потом добавить к ней классы. Отладить на этой базе ЖЦ или ее замену. Далее добавить поддержку дженериков. В конце получим полноценное решение.

VD>Это позволит тестировать результат с самых ранних стадий.

На мой взгляд план может быть таким:
1. подключение llvm (есть готовая инструкция) с каким-нибудь убогим готовым GC
2. разработка удобного подключения C библиотек и ОС АПИ, плюс написание автоматического трансформера заголовочных файлов
3. тут уже можно сделать первое hello world
4. попробовать решить проблему эффективного GC (а лучше ухода от GC)
5. своя библиотека контейнеров и алгоритмов
6. медленная пошаговая замена использования C библиотек на родные библиотеки
Re[5]: Портирование нитры.
От: WolfHound  
Дата: 01.02.17 06:43
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Вот это я что-то не очень понял. Так автоматическое управление памятью всё же опционально или нет? Речь про рантайм языка, который будет присутствовать в любой пользовательской программе.

Ты путаешь две вещи.
1)Компилятор и движок ИДЕ языка программирования который генерирует нитра.
Им для работы нужен ГЦ или заменитель.

2)Код который генерирует компилятор, написанный на нитре.
Тут может быть что угодно.
Этот код не зависит ни от нитры ни от компилятора языка.
Хочешь можешь использовать ГЦ. Не хочешь можешь не использовать ГЦ.
Тут у разработчика языка полный контроль.

А есть ли ГЦ в компиляторе никого волновать не должно от слова совсем.
Я не вижу ни одной причины по которой это могло бы иметь значение.

_>но не всё (по паре вопросов есть и второй вариант).

В случае с портированием только первый.

VD>>Рантайм на котором будет выполняется скомпилированная программа? Да нам как-то по фигу это. Хоть она просто будет в памяти биты гонять.

_>В смысле пофиг? Этот рантайм же должны предоставлять создатели языка (сейчас за вас это делает CLR).
Вот так. Нитре совсем пофиг для какого рантайма генерировать код.
У нас есть некоторые требования для рантайма на котором может работать компилятор, сгенерированный нитрой.
Но нет никаких ограничений на рантайм языков которые компилируют компиляторы, написанные на нитре.

_>На мой взгляд план может быть таким:

Нет. Делать нужно так как Влад сказал.
Мы начинаем с примитивного рантайма который полезен сам по себе.
Ибо позволит на нитре создавать языки, работающие без ГЦ. Что-то типа С на стероидах.
Для того чтобы научить нитру генерировать нативные компиляторы, написанные на нитре (и компилятор самой нитры, ибо он написан на нитре) этого недостаточно.
Дальше можно добавлять возможности, которые можно либо использовать, либо нет.
Те, когда мы добавим поддержку нативного рантайма с ГЦ. С на стероидах просто не будет её использовать.
Но этого будет достаточно чтобы нитра смогла генерировать нативные компиляторы.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Портирование нитры.
От: alex_public  
Дата: 01.02.17 15:22
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Вот это я что-то не очень понял. Так автоматическое управление памятью всё же опционально или нет? Речь про рантайм языка, который будет присутствовать в любой пользовательской программе.

WH>Ты путаешь две вещи.
WH>1)Компилятор и движок ИДЕ языка программирования который генерирует нитра.
WH>Им для работы нужен ГЦ или заменитель.

ОК. Для компилятора тут обычный пул наверное подошёл был. Для плагина в IDE не знаю, наверное лучше нормальный GC.

Оффтопик. Просто экспериментальный факт: все испробованные мной IDE написанные на Java (т.е. GC) ощутимо (хотя работать всё равно без проблем можно) подтормаживают в сравнение нативными с такими же возможностями. Мой список сравнения, если что: Eclipse, Netbeans, CLion, VisualStudio, QtCreator.

WH>2)Код который генерирует компилятор, написанный на нитре.

WH>Тут может быть что угодно.
WH>Этот код не зависит ни от нитры ни от компилятора языка.
WH>Хочешь можешь использовать ГЦ. Не хочешь можешь не использовать ГЦ.
WH>Тут у разработчика языка полный контроль.

Это конечно выглядит отлично. Но если вы будете предоставлять подобную технологию "голой", то вряд ли у неё найдётся много пользователей. Потому что разрабатывать свой рантайм (вместо решения прикладных задач) — это сомнительное удовольствие. Вот если у вас в коробке будет идти нормальный эффективный (и возможно кастомизируемый (отключение/подключение GC и т.п.) или просто несколько штук под базовые варианты) рантайм, то таким инструментом уже можно эффективно пользоваться. И кстати в вашем нынешнем решение именно так всё и устроено, только рантайм один и не кастормизируемый (CLR). А вот в случае создания нативной версии это всё надо сделать, что и является одной из важнейших задач на мой взгляд.

WH>А есть ли ГЦ в компиляторе никого волновать не должно от слова совсем.

WH>Я не вижу ни одной причины по которой это могло бы иметь значение.

Согласен.

_>>На мой взгляд план может быть таким:

WH>Нет. Делать нужно так как Влад сказал.
WH>Мы начинаем с примитивного рантайма который полезен сам по себе.
WH>Ибо позволит на нитре создавать языки, работающие без ГЦ. Что-то типа С на стероидах.

Ну лично я то как бы только "за" языки без GC. Только вот хотелось бы увидеть не "C без GC", a "Nemerle без GC"...

И главное. На этом этапе ещё не получится написать даже "Hello world", потому как функции типа writeln очевидно не входят в рантайм, а относятся к подключаемой библиотеке ввода-вывода. И вот тут начинаются как раз основные игры с разработкой нормального подключения внешних библиотек и т.п. Т.е. один из основных моментов у тебя в плане вообще не озвучен.

WH>Для того чтобы научить нитру генерировать нативные компиляторы, написанные на нитре (и компилятор самой нитры, ибо он написан на нитре) этого недостаточно.

WH>Дальше можно добавлять возможности, которые можно либо использовать, либо нет.
WH>Те, когда мы добавим поддержку нативного рантайма с ГЦ. С на стероидах просто не будет её использовать.
WH>Но этого будет достаточно чтобы нитра смогла генерировать нативные компиляторы.

Это всё понятно.

Кстати, хотя полезность нативных компиляторов для продукта очевидна (иначе сложно привлечь людей с других платформ), но в процессе разработки нативной версии я бы абсолютно спокойно пользовался .net компилятором. Т.е. природа самого компилятора думаю никого не волнует и если бы вы скажем сумели бы портировать (например с помощью .net core) прямо свой текущий компилятор на Linux и OSX, то думаю никто бы и не подумал требовать его нативную версию. Естественно подразумевая, что он при этом может генерировать нативный код для этих платформ.
Re[7]: Портирование нитры.
От: WolfHound  
Дата: 01.02.17 16:39
Оценка:
Здравствуйте, alex_public, Вы писали:

_>ОК. Для компилятора тут обычный пул наверное подошёл был. Для плагина в IDE не знаю, наверное лучше нормальный GC.

Работы много, а преимущества мягко говоря не очевидны.
Возможно в очень отдалённом будущем оно и будет сделано, но эта задача совершенно точно находится в самом хвосте. И выпиливание ГЦ будет далеко не главной оптимизацией.

_>Оффтопик. Просто экспериментальный факт: все испробованные мной IDE написанные на Java (т.е. GC) ощутимо (хотя работать всё равно без проблем можно) подтормаживают в сравнение нативными с такими же возможностями. Мой список сравнения, если что: Eclipse, Netbeans, CLion, VisualStudio, QtCreator.

Если там что-то и тормозит, то точно не ГЦ.

_>Это конечно выглядит отлично. Но если вы будете предоставлять подобную технологию "голой", то вряд ли у неё найдётся много пользователей. Потому что разрабатывать свой рантайм (вместо решения прикладных задач) — это сомнительное удовольствие. Вот если у вас в коробке будет идти нормальный эффективный (и возможно кастомизируемый (отключение/подключение GC и т.п.) или просто несколько штук под базовые варианты) рантайм, то таким инструментом уже можно эффективно пользоваться. И кстати в вашем нынешнем решение именно так всё и устроено, только рантайм один и не кастормизируемый (CLR). А вот в случае создания нативной версии это всё надо сделать, что и является одной из важнейших задач на мой взгляд.

Естественно всё так и устроено.
Просто по тому что так было запланировано изначально.
Причём не только рантайм, но и промежуточные языки чтобы пользователи не возились с языками низкого уровня.
Но! Это всё большой объём работы, который должен кто-то сделать.

_>Ну лично я то как бы только "за" языки без GC. Только вот хотелось бы увидеть не "C без GC", a "Nemerle без GC"...

1)Многие конструкции немерле сильно завязаны на ГЦ. Чтобы сделать его без ГЦ нужно менять дизайн. А это будет уже другой язык.
2)Нитра изначально создавалась для создания модульных языков. В смысле модульного синтаксиса и семантики. Так что имея базовый "С без маразмов" можно будет очень легко нарастить на него очень много полезных плюшек.

_>И главное. На этом этапе ещё не получится написать даже "Hello world", потому как функции типа writeln очевидно не входят в рантайм, а относятся к подключаемой библиотеке ввода-вывода. И вот тут начинаются как раз основные игры с разработкой нормального подключения внешних библиотек и т.п. Т.е. один из основных моментов у тебя в плане вообще не озвучен.

По тому что это мелкая деталь реализации.

_>Кстати, хотя полезность нативных компиляторов для продукта очевидна (иначе сложно привлечь людей с других платформ),

Совершенно не очевидна. На многих платформах .НЕТ в нужном объёме присутствует.
А если что на Яву можно будет очень просто портировать. А она вообще почти везде есть.

_>но в процессе разработки нативной версии я бы абсолютно спокойно пользовался .net компилятором. Т.е. природа самого компилятора думаю никого не волнует и если бы вы скажем сумели бы портировать (например с помощью .net core) прямо свой текущий компилятор на Linux и OSX, то думаю никто бы и не подумал требовать его нативную версию.

Да там протировать нечего. Всё давно протировано.
Немерле под линухом давно работает.

_>Естественно подразумевая, что он при этом может генерировать нативный код для этих платформ.

Как только нитра сможет генерировать нативный код она естественно будет это делать везде.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: Портирование нитры.
От: alex_public  
Дата: 01.02.17 21:57
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Оффтопик. Просто экспериментальный факт: все испробованные мной IDE написанные на Java (т.е. GC) ощутимо (хотя работать всё равно без проблем можно) подтормаживают в сравнение нативными с такими же возможностями. Мой список сравнения, если что: Eclipse, Netbeans, CLion, VisualStudio, QtCreator.

WH>Если там что-то и тормозит, то точно не ГЦ.

Я как бы не претендую на знание того, что там тормозит. ) Но подобное совпадение настораживает. )))

WH>Естественно всё так и устроено.

WH>Просто по тому что так было запланировано изначально.
WH>Причём не только рантайм, но и промежуточные языки чтобы пользователи не возились с языками низкого уровня.
WH>Но! Это всё большой объём работы, который должен кто-то сделать.

Хотелось бы для начала получить хоть что-то работающее. Мне бы хватило для начала нативного "hello world" (собранного не важно каким компилятором (но с бэкендом llvm, для приличной оптимизации), пускай даже под одну винду), написанного на языке с возможностями Nemerle. Дальше уже понятно что и куда развивать.

_>>И главное. На этом этапе ещё не получится написать даже "Hello world", потому как функции типа writeln очевидно не входят в рантайм, а относятся к подключаемой библиотеке ввода-вывода. И вот тут начинаются как раз основные игры с разработкой нормального подключения внешних библиотек и т.п. Т.е. один из основных моментов у тебя в плане вообще не озвучен.

WH>По тому что это мелкая деталь реализации.

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

_>>но в процессе разработки нативной версии я бы абсолютно спокойно пользовался .net компилятором. Т.е. природа самого компилятора думаю никого не волнует и если бы вы скажем сумели бы портировать (например с помощью .net core) прямо свой текущий компилятор на Linux и OSX, то думаю никто бы и не подумал требовать его нативную версию.

WH>Да там протировать нечего. Всё давно протировано.
WH>Немерле под линухом давно работает.

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

_>>Естественно подразумевая, что он при этом может генерировать нативный код для этих платформ.

WH>Как только нитра сможет генерировать нативный код она естественно будет это делать везде.

Ну как бы если создание нативных приложение будет доработано до конца и ваши инструменты бутстрапятся, то совершенно логично сделать нативные инструменты (они даже по скорости скорее всего лучше будут, не говоря уже о таскание зависимостей и т.п.). Но это естественно совершенно не первоочередной вопрос — сейчас можно спокойно работать и на .net'их версиях.
Re[9]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.02.17 04:52
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Хотелось бы для начала получить хоть что-то работающее. Мне бы хватило для начала нативного "hello world" (собранного не важно каким компилятором (но с бэкендом llvm, для приличной оптимизации), пускай даже под одну винду), написанного на языке с возможностями Nemerle. Дальше уже понятно что и куда развивать.


На сегодня есть вот такой игрушечный язык: Nitra-Mini-C
И статья
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.03.2017
В статье описывается реализация компилятора языка программирования Mini C на базе Nitra (под платформу .Net). Mini C — это упрощенная версия языка C. В статье описывается все этапы реализации языка от создания парсера, до генерации MSIL. И сам язык и данное описание созданы для демонстрации того как разрабатывать языки программирования на Nitra. Nitra — это средство разрабоки ЯП (language workbench). Nitra можно использовать для создания языков программирования с расширяемыми синтаксисом и семантикой, а так же языков предметной области (DSL).
описывающая нюансы его реализации на Нитре.

Язык очень простенький и с ним можено легко разобраться не имея опыта ни в Нитре, ни в компиляторостроении.

Так вот можно для начала попробовать реализовать LLVM-бэкэнд для этого языка. За одно это будет знакомство с Немерле.

Nitra-Mini-C написал парень не знакомый с Немерлом до этого. Я консультировал его и немного помогал. На все про все у него ушло около месяца ненапряжной работы. Написать бэкэнд займет (думаю) от одного дня до недели.

Не хочешь попробовать? Я буду консультировать по Нитре и Немерлу. Ну, и помогу, чем смогу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Портирование нитры.
От: alex_public  
Дата: 04.02.17 02:02
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Хотелось бы для начала получить хоть что-то работающее. Мне бы хватило для начала нативного "hello world" (собранного не важно каким компилятором (но с бэкендом llvm, для приличной оптимизации), пускай даже под одну винду), написанного на языке с возможностями Nemerle. Дальше уже понятно что и куда развивать.

VD>На сегодня есть вот такой игрушечный язык: Nitra-Mini-C
VD>И статья
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.03.2017
В статье описывается реализация компилятора языка программирования Mini C на базе Nitra (под платформу .Net). Mini C — это упрощенная версия языка C. В статье описывается все этапы реализации языка от создания парсера, до генерации MSIL. И сам язык и данное описание созданы для демонстрации того как разрабатывать языки программирования на Nitra. Nitra — это средство разрабоки ЯП (language workbench). Nitra можно использовать для создания языков программирования с расширяемыми синтаксисом и семантикой, а так же языков предметной области (DSL).
описывающая нюансы его реализации на Нитре.

VD>Язык очень простенький и с ним можено легко разобраться не имея опыта ни в Нитре, ни в компиляторостроении.
VD>Так вот можно для начала попробовать реализовать LLVM-бэкэнд для этого языка. За одно это будет знакомство с Немерле.
VD>Nitra-Mini-C написал парень не знакомый с Немерлом до этого. Я консультировал его и немного помогал. На все про все у него ушло около месяца ненапряжной работы. Написать бэкэнд займет (думаю) от одного дня до недели.

Ну это в итоге получится немного не то, что я говорил. Это будет не нужный кому-то инструмент, а разве что первый тестовый шаг для построения чего-то приличного. Причём дальнейшее развитие будет для меня (как не проектировавшего пока ещё свои языки) не очевидно. В отличие от ситуации наличия уже нормального языка, который надо только перевести на нативные рельсы.

Но если в качестве развлечения и самообучения, то можно и попробовать такое.

VD>Не хочешь попробовать? Я буду консультировать по Нитре и Немерлу. Ну, и помогу, чем смогу.


Я? Ну технически я такое могу. И даже определённый интерес (правда пока только фанового типа) имеется. Но прямо сейчас я точно не могу. У меня тут сейчас как раз пик важного проекта, так что свободного времени нет вообще (причём большая часть проблем уже не технического уровня, а всякие контракты, поставки и т.п.). Так что я вот общаясь на форуме по сути немного отдыхаю от всего этого, но на большее времени нет. Можно будет попробовать поговорить об этом где-нибудь ближе к маю, когда надеюсь проект запустится. )))
Re[11]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.17 03:33
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну это в итоге получится немного не то, что я говорил. Это будет не нужный кому-то инструмент, а разве что первый тестовый шаг для построения чего-то приличного. Причём дальнейшее развитие будет для меня (как не проектировавшего пока ещё свои языки) не очевидно. В отличие от ситуации наличия уже нормального языка, который надо только перевести на нативные рельсы.


Речь идет лишь о том, чтобы попробовать, т.е. обучение, оценка на реальном примере, оценка LLVM, pet project.

_>Но если в качестве развлечения и самообучения, то можно и попробовать такое.


Именно. Это не займет много времени, но ты сможешь сам все оценить изнутри.

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

Я сейчас занят на Нитре. А за это время, я надеюсь, что я с не закончу и вплотную займусь языками.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Портирование нитры.
От: alex_public  
Дата: 05.02.17 21:13
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Ну это в итоге получится немного не то, что я говорил. Это будет не нужный кому-то инструмент, а разве что первый тестовый шаг для построения чего-то приличного. Причём дальнейшее развитие будет для меня (как не проектировавшего пока ещё свои языки) не очевидно. В отличие от ситуации наличия уже нормального языка, который надо только перевести на нативные рельсы.

VD>Речь идет лишь о том, чтобы попробовать, т.е. обучение, оценка на реальном примере, оценка LLVM, pet project.

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

_>>Но если в качестве развлечения и самообучения, то можно и попробовать такое.

VD>Именно. Это не займет много времени, но ты сможешь сам все оценить изнутри.

ОК, тогда наверное что-то подобное попробую.

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


Слишком опасно. ) Особенно для меня (перепробовавшего множество языков, но так и не нашедшего идеала)... ))) Есть большой соблазн сделать "ещё один никому кроме тебя не нужный язык". ))) Безопаснее портировать на нужную тебе платформу какой-то приличный язык у которого уже есть сообщество и т.п.

Хотя если есть очень много свободного времени и желание поразвлечься, то... Но боюсь это не про меня. )

VD>Я сейчас занят на Нитре. А за это время, я надеюсь, что я с не закончу и вплотную займусь языками.


Тогда ближе к лету можем вернутся к этой дискуссии. )

P.S. Я на форуме общаюсь больше через почту (в смысле реагирую на пришедшие туда уведомления об ответах в темах).
Re[13]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.02.17 00:10
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну я то предпочёл бы получить готовый инструмент и ещё желательно на халяву. А тут такая суровая реальность... Эх, как тяжела жизнь.


Да. Реальная жизнь она такая.

_>ОК, тогда наверное что-то подобное попробую.


Тогда я я ниже опишу что нужно делать, и что нужно почитать для начала.

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


_>Слишком опасно. ) Особенно для меня (перепробовавшего множество языков, но так и не нашедшего идеала)... ))) Есть большой соблазн сделать "ещё один никому кроме тебя не нужный язык". ))) Безопаснее портировать на нужную тебе платформу какой-то приличный язык у которого уже есть сообщество и т.п.


_>Хотя если есть очень много свободного времени и желание поразвлечься, то... Но боюсь это не про меня. )


Я, видимо, выразился недостаточно понятно. Я не имел в виду, что тебе придется создавать новый язык с нуля. Прод реальным языком я имел ввиду Native Nemerle 2.

Просто он пока еще не существует. По сем сейчас его переносом заниматься невозможно. Но в ближайшее время мы им займемся и можно будет параллельно с нами создавать нативный бэкэнд. Причем бэнэнд будет позволять завести на LLVM и другие дотнетные языки реализованные на Nitra. Например, Cx# (расширяемый C#), который на половину уже написан.

Но так как Nemerle — это конструктор, ты все же сможешь (позже) добавить в язык необходимы именно тебе фичи или отключить не нужные. Так что идея создать свой если не язык, то диалект, становится куда реалистичнее.

_>Тогда ближе к лету можем вернутся к этой дискуссии. )


Ну, чтобы попробовать, ждать лета нет нужды. Даже наоборот полезено было бы сделать это пока есть азарт.

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

Собственно начать надо с изучения вот этой статьи:
http://rsdn.org/article/nitra/MiniC/Nitra-Mini-C.xml
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.03.2017
В статье описывается реализация компилятора языка программирования Mini C на базе Nitra (под платформу .Net). Mini C — это упрощенная версия языка C. В статье описывается все этапы реализации языка от создания парсера, до генерации MSIL. И сам язык и данное описание созданы для демонстрации того как разрабатывать языки программирования на Nitra. Nitra — это средство разрабоки ЯП (language workbench). Nitra можно использовать для создания языков программирования с расширяемыми синтаксисом и семантикой, а так же языков предметной области (DSL).

Сам код этого проекта находится тут: https://github.com/rsdn/Nitra-Mini-C
Здесь описны DSL-и для работы с AST и типизацией. Эту статью можно прочесть целиком, но скорее ее надо рассматривать как документацию. Так что если в ней что то будет не понятно — это не страшно.
Вот здесь
Автор(ы):
описание языка грамматик Нитры. Это вообще на всякий случай. Для работы с бэкэндом синтаксис вообще не важен.
Так же имеет смысл собрать Nitra с исходников (инструкция здесь).
https://github.com/rsdn/nitra/wiki/Nitra-Build-process
и проект Mini C. Для этого его надо поместить в папку рядом с папкой Nitra и собрать Nitra-Mini-C.sln. Корневую папку лучше делать неглубокой. Но об этом сказано в Nitra Build process.
Ну, а дальше мой скайп vc.rsdn.ru Просто постучись по нему и вместе наметим план работ. Вопросы можно задавать как по скайпу так и на форуме.

В зависимости от выделяемого времени это может занять от недели до 1-2 месяцев. Надеюсь это будет увлекательно!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Портирование нитры.
От: alex_public  
Дата: 07.02.17 01:45
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Слишком опасно. ) Особенно для меня (перепробовавшего множество языков, но так и не нашедшего идеала)... ))) Есть большой соблазн сделать "ещё один никому кроме тебя не нужный язык". ))) Безопаснее портировать на нужную тебе платформу какой-то приличный язык у которого уже есть сообщество и т.п.

_>>Хотя если есть очень много свободного времени и желание поразвлечься, то... Но боюсь это не про меня. )
VD>Я, видимо, выразился недостаточно понятно. Я не имел в виду, что тебе придется создавать новый язык с нуля. Прод реальным языком я имел ввиду Native Nemerle 2.

Ага, вот это уже интереснее. Причём я тут подумал — действительно наверное не получится просто перенести обычный Nemerle на нативную платформу. Точнее сделать это без проблем можно, но только результат будет мало кому интересен. А вот если сделать адаптацию, которая позволит использовать все возможности нативной платформы (чтобы грубо говоря было удобно и драйверы писать), при этом не потеряв в удобстве и безопасности, то это очень многим бы пришлось по вкусу. Хотя это и не так просто (см. например попытки в Rust'е).

VD>Но так как Nemerle — это конструктор, ты все же сможешь (позже) добавить в язык необходимы именно тебе фичи или отключить не нужные. Так что идея создать свой если не язык, то диалект, становится куда реалистичнее.


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

_>>Тогда ближе к лету можем вернутся к этой дискуссии. )

VD>Ну, чтобы попробовать, ждать лета нет нужды. Даже наоборот полезено было бы сделать это пока есть азарт.

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

VD>Как я уже сказал можно потренироваться на Mini C. Это позволит понять что нужно бдудет сделать в реальном бэкнде, а так же немного освоиться с Нитрой и Немерле. Надеюсь тебе эти языки понравятся.


На Немерле я уже когда-то давно посматривал. Выводы были такие: макросы — очень приятно, синтаксис — мне в принципе сойдёт, есть минусы (в основном имеющие свои корни в .Net). Про Нитру только слышал, но ничего не видел.

VD>Собственно начать надо с изучения вот этой статьи:

VD>http://rsdn.org/article/nitra/MiniC/Nitra-Mini-C.xml
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.03.2017
В статье описывается реализация компилятора языка программирования Mini C на базе Nitra (под платформу .Net). Mini C — это упрощенная версия языка C. В статье описывается все этапы реализации языка от создания парсера, до генерации MSIL. И сам язык и данное описание созданы для демонстрации того как разрабатывать языки программирования на Nitra. Nitra — это средство разрабоки ЯП (language workbench). Nitra можно использовать для создания языков программирования с расширяемыми синтаксисом и семантикой, а так же языков предметной области (DSL).

VD>Сам код этого проекта находится тут: https://github.com/rsdn/Nitra-Mini-C
VD>Здесь описны DSL-и для работы с AST и типизацией. Эту статью можно прочесть целиком, но скорее ее надо рассматривать как документацию. Так что если в ней что то будет не понятно — это не страшно.

Кстати мне в одном проекте требовалась интеграция в приложение исполнения вот такого https://www.compuphase.com/pawn/pawn.htm забавного язычка — в чём-то похоже, хотя он и не игрушечный. )

VD>Вот здесь
Автор(ы):
описание языка грамматик Нитры. Это вообще на всякий случай. Для работы с бэкэндом синтаксис вообще не важен.

VD>Так же имеет смысл собрать Nitra с исходников (инструкция здесь).
VD>https://github.com/rsdn/nitra/wiki/Nitra-Build-process

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

VD>и проект Mini C. Для этого его надо поместить в папку рядом с папкой Nitra и собрать Nitra-Mini-C.sln. Корневую папку лучше делать неглубокой. Но об этом сказано в Nitra Build process.


Угу, и кругом sln файлы в качестве системы сборки. И тут (ну это ещё ладно, разово собрать и всё, можно даже не на рабочем компьютере) и у Mini-C... Это вот первым делом пришлось бы переделать, если переходить на кроссплатформенный уровень.

Кстати (отвлечённые рассуждения), вот казалось бы как раз при программирование под .net (для которого готовый компилятор и библиотеки есть на любом компьютере с виндой) люди должны были бы предпочитать использовать какие-то независящие от IDE системы сборки (любой проект просто копируется и собирается в консольке на любой машине, без установки какого-то дополнительного ПО), однако тут явное засилье проектов VS. В то время как у какого-нибудь C++, у которого для сборки надо установить на компьютер кучу всего (по отдельности или одного жирного монстра типа VS) и тут казалось бы должны были предпочитать работу в проектах для VS, но вместо этого как раз процветают системы сборки (тот же CMake) даже при использование VS.

VD>Ну, а дальше мой скайп vc.rsdn.ru Просто постучись по нему и вместе наметим план работ. Вопросы можно задавать как по скайпу так и на форуме.


Да думаю без проблем договоримся там. ) Можно даже и в реале пересечься (в одном городе живём всё же) со временем.

VD>В зависимости от выделяемого времени это может занять от недели до 1-2 месяцев. Надеюсь это будет увлекательно!


Ну я обычно занимаюсь подобными фановыми вещами "запоями", так что думаю скорее будет речь про неделю. ))) Но ближе к лету. )
Re[15]: Портирование нитры.
От: WolfHound  
Дата: 07.02.17 08:50
Оценка: 30 (2) +1
Здравствуйте, alex_public, Вы писали:

_>Ага, вот это уже интереснее. Причём я тут подумал — действительно наверное не получится просто перенести обычный Nemerle на нативную платформу. Точнее сделать это без проблем можно, но только результат будет мало кому интересен. А вот если сделать адаптацию, которая позволит использовать все возможности нативной платформы (чтобы грубо говоря было удобно и драйверы писать), при этом не потеряв в удобстве и безопасности, то это очень многим бы пришлось по вкусу. Хотя это и не так просто (см. например попытки в Rust'е).

Проблема в том, что в этом случае от немерле мало что останется.
Уж слишком там всё на глобальный ГЦ завязано. А ты как я понимаю ГЦ не хочешь.

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

_>Угу, у меня как раз есть несколько идей в данной области. В том смысле что не какие-то оригинальные концепции, а скорее понимание того, какой конкретно набор известных концепций должен реализовать идеальный нативный язык.

Вот это нужно написать перед началом работы над языком.
Причём чем раньше, тем лучше.
Ибо ты можешь чего-то не знать, забыть или просто не подумать.
Чтобы снизить риски появления концептуальных косяков концепцию нужно обсудить.

Перед тем как ты будешь формулировать свои мысли прочитай эти статьи (список по ссылке).
http://joeduffyblog.com/2015/11/03/blogging-about-midori/
Букв много. Но всё по делу. Перед созданием нового языка читать обязательно.
В двух словах: Мужик работал над созданием полностью управляемой ОС и пишет какие были варианты, какие из них оказались рабочими и какие нет. А главное почему.

А вообще весь блог рекомендую.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[15]: Портирование нитры.
От: novitk США  
Дата: 07.02.17 20:05
Оценка:
Здравствуйте, alex_public, Вы писали:

K тому что написал WolfHound добавлю еще нативную Скалу (https://github.com/scala-native/scala-native)
Там вроде многое уже работает. Скала по функционалу ~N++.
Re[15]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.02.17 22:20
Оценка: :)
Здравствуйте, alex_public, Вы писали:

_>Ага, вот это уже интереснее. Причём я тут подумал — действительно наверное не получится просто перенести обычный Nemerle на нативную платформу. Точнее сделать это без проблем можно, но только результат будет мало кому интересен.


Уж если Go кому-то интересен, то уж Нативный Nemerle точно должен быть интересен. Языки и рядом не стояли. Вот только надо название сменить (наверно) и пиар-компанию продумать или найти брэнд через который язык двигать (как тот же Go).

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


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

_>Хотя это и не так просто (см. например попытки в Rust'е).


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

Удобство не должно приноситься в жертву эффективности. Если для каких-то задач GC и исключения — зло, то надо просто дать возможности их не использовать. Проконтролировать это не сложно. Нужно только альтернативные механизмы сделать.

_>Угу, у меня как раз есть несколько идей в данной области. В том смысле что не какие-то оригинальные концепции, а скорее понимание того, какой конкретно набор известных концепций должен реализовать идеальный нативный язык.


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

_>На Немерле я уже когда-то давно посматривал. Выводы были такие: макросы — очень приятно, синтаксис — мне в принципе сойдёт, есть минусы (в основном имеющие свои корни в .Net). Про Нитру только слышал, но ничего не видел.


Ну, вот почитав статейки можно хотя бы общее впечатление оставить.

_>Хы, а зачем запускать VS от админа? ) Т.е. мне то не принципиально (если не считать конечно само отсутствие VS на данный момент на моей рабочей машине), но просто глаз зацепился и интересно. )))


Откровенно говоря уже не помню. Возможно что-то регистрируется. У Немерла такое требование потому, что при сборке файлы копируются в %ProgramFiles%\Nemerle\Net-4.0, она новых версиях Винды закрыт на запись для смертных.

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

_>Угу, и кругом sln файлы в качестве системы сборки.


И что? Это стандарт в дотнете. Студия работает именно с ними, потому и sln. При этом их без проблем можно собирать MSBuild-ом, который входит в донет и запуска IDE не требует..

_>И тут (ну это ещё ладно, разово собрать и всё, можно даже не на рабочем компьютере) и у Mini-C... Это вот первым делом пришлось бы переделать, если переходить на кроссплатформенный уровень.


В дотнете с этим нет никаких проблем. sln — это не более чем список проектов. Можешь заменить его на proj-файл MSBuild-а. Но при этом ты лишишься возможности открывать его в VS. Именно по этому никто так не делает.

Вот когда тебе придется собирать компилятор под LLVM на платформе где дотнета нет, то вместо него придется что-то другое брать. А в дотнете MSBuild — стандарт, а sln — один из его стандартных форматов.

_>Кстати (отвлечённые рассуждения), вот казалось бы как раз при программирование под .net (для которого готовый компилятор и библиотеки есть на любом компьютере с виндой) люди должны были бы предпочитать использовать какие-то независящие от IDE системы сборки


Ты просто явно с дотнетом много не возился. Не зависит от IDE этот формат. Просто у VS форматом проектов служат файлы MSBuild.

С этим есть проблемы на Mono. Там есть аналог MSBuild, но он не полностью совместим с прототипом (рукожопье в Моно процветало). Но сейчас МС на всех парах опенсорсит дотнет. Они создали .Net Core в который переводят все что можно. MSBuild не стал исключением. Сначала они запилили велосипед, но разум востержествовал и MSBuild тоже двинули в Core, попутно сделав MSBuild стандартом проектов и для Core. Так как лицензия на Core очень либеральная (Апач 2, если не ошибаюсь), то Моновцы уже сказали, что будут брать тулы из Core и перейдут на MSBuild.

_>Да думаю без проблем договоримся там. ) Можно даже и в реале пересечься (в одном городе живём всё же) со временем.


Да, можно и так. Я всегда "за".

_>Ну я обычно занимаюсь подобными фановыми вещами "запоями", так что думаю скорее будет речь про неделю. ))) Но ближе к лету. )


ОК
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Портирование нитры.
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 08.02.17 00:25
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Уж если Go кому-то интересен, то уж Нативный Nemerle точно должен быть интересен. Языки и рядом не стояли. Вот только надо название сменить (наверно) и пиар-компанию продумать или найти брэнд через который язык двигать (как тот же Go).


И зря ты так Go "обижаешь". Go никому не интересен как язык (ибо какашка полная), он интересен как инфраструктура для быстрой и простой разработки сетевых приложений (сайты, сервисы, всё что угодно), и в этом он реально крут. А какая будет ключевая фича у "нативного Nemerle"? То что он классный язык – этого слишком мало, как бы и не нативному Nemerle это не шибко помогает даже при наличии всей той прорвы библиотек, что доступна благодаря .NET.
Re[17]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.02.17 00:32
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>И зря ты так Go "обижаешь". Go никому не интересен как язык (ибо какашка полная), он интересен как инфраструктура для быстрой и простой разработки сетевых приложений (сайты, сервисы, всё что угодно), и в этом он реально крут. А какая будет ключевая фича у "нативного Nemerle"? То что он классный язык – этого слишком мало, как бы и не нативному Nemerle это не шибко помогает даже при наличии всей той прорвы библиотек, что доступна благодаря .NET.


А в чем эта "инфраструктурность" заключается?

Я на Nemerle и сейчас, и 10 лет назад мог делать "сайты, сервисы, всё что угодно".

То есть вся разница в том, что он не требует виртуальной машины?

ЗЫ

Давай будем честными. Главное достоинство Go это — Google.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Портирование нитры.
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 08.02.17 00:47
Оценка: -1 :)
Здравствуйте, VladD2, Вы писали:

VD>А в чем эта "инфраструктурность" заключается?


В том, что всё просто и "из коробки". В том, что есть куча сторонних фрэймворков на все случаи жизни.

VD>Я на Nemerle и сейчас, и 10 лет назад мог делать "сайты, сервисы, всё что угодно".


Да и на C++ я тоже самое могу сделать, вопрос лишь в том, сколько на это времени уйдет. К примеру вот довольно популярный Web-framework для Go. Обрати внимание на "быстрый старт": там меньше 10 строк, которые тебе на выходе дают что-то осязаемое.

VD>То есть вся разница в том, что он не требует виртуальной машины?


Да ладно тебе, причем тут вообще VM? Я в ней проблемы не вижу, а вот то, что это не .NET – это безусловно осязаемый плюс, так как отвязывает и от WIndows и от очередного NIH приступа в MS.

VD>Давай будем честными. Главное достоинство Go это — Google.


Ни разу. Если честно – достоинство инфраструктура для разработки всего и вся связанного с сетями и не имеющего совсем уж жестких требований к производительности.
Re[19]: Портирование нитры.
От: WolfHound  
Дата: 08.02.17 07:16
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Да и на C++ я тоже самое могу сделать, вопрос лишь в том, сколько на это времени уйдет. К примеру вот довольно популярный Web-framework для Go. Обрати внимание на "быстрый старт": там меньше 10 строк, которые тебе на выходе дают что-то осязаемое.

http://www.nemerleweb.com/tutorial
1)Весь код включая ХТМЛ статически типизирован.
2)Это не тупой серверный шаблонизатор, а реактивный ГУИ живущий на клиенте.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Портирование нитры.
От: WolfHound  
Дата: 08.02.17 15:16
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я уже говорил. Беда Rust в том, что авторы отказались от GC и исключений. Это идиотизм. Вот наличие возможностей жить без них — это хорошо. А их полное отсутствие — это идиотизм.

Правильно реализованные исключения строго лучше кодов возврата.
1)Их нельзя проигнорировать, а значит программа не будет молча глотать ошибки.
2)Они делают код быстрее и меньше.
В случае с мидори:

The model I just described doesn’t have to be implemented with exceptions. It’s abstract enough to be reasonably implemented using either exceptions or return codes. This isn’t theoretical. We actually tried it. And this is what led us to choose exceptions instead of return codes for performance reasons.

...

In summary, the exceptions approach was 7% smaller and 4% faster as a geomean across our key benchmarks, thanks to a few things:

No calling convention impact.
No peanut butter associated with wrapping return values and caller branching.
All throwing functions were known in the type system, enabling more flexible code motion.
All throwing functions were known in the type system, giving us novel EH optimizations, like turning try/finally blocks into straightline code when the try could not throw.

(С)http://joeduffyblog.com/2016/02/07/the-error-model/
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Портирование нитры.
От: alex_public  
Дата: 08.02.17 16:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Проблема в том, что в этом случае от немерле мало что останется.

WH>Уж слишком там всё на глобальный ГЦ завязано.

Хм, и что же там так завязано? Я вот например особо не вижу там конструкций, которые нельзя бы было реализовать без GC.

WH>А ты как я понимаю ГЦ не хочешь.


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

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

1. Давным давно. Язык C и даже старый C++ (который был C с классами). Всё приложение нашпиговано сплошными new и delete (ну или malloc и free), причём необходимо следить за их парностью. Неудобно, но ничего лучшего со сравнимой эффективностью на тот момент нет.
2. Позже. Java и потом C#. Различных new стало даже ещё больше, но от delete (и главное необходимости следить за парностью) избавились. Ценой этого стало некоторое сужение применимости языков (в сравнение с C).
3. Современный C++. В приложение нет ни одного new или delete вообще. При этом эффективность и применимость получаемого кода не хуже чем у древнего C. Понятно, что это пример идеального приложения, написанного с нуля на современном стандарте, а в реальности такого не встречается, т.к. всегда приходится использовать разные библиотеки (типа той же Qt), которые чаще всего проектировались в древности. Но на суть общей картины это думаю не влияет.

Так вот, глядя на эту картину... Ты всё равно считаешь наличие GC прогрессом? )

_>>Угу, у меня как раз есть несколько идей в данной области. В том смысле что не какие-то оригинальные концепции, а скорее понимание того, какой конкретно набор известных концепций должен реализовать идеальный нативный язык.

WH>Вот это нужно написать перед началом работы над языком.
WH>Причём чем раньше, тем лучше.
WH>Ибо ты можешь чего-то не знать, забыть или просто не подумать.
WH>Чтобы снизить риски появления концептуальных косяков концепцию нужно обсудить.

Безусловно. Но на это тоже надо время. Чтобы изложить системно, обсудить и т.п. Пока у меня только чёткое понимание каких вещей там точно не должно быть (например интроспекции времени исполнения) и какие точно должны быть (например прозрачный вызов C библиотек и системного API).

WH>Перед тем как ты будешь формулировать свои мысли прочитай эти статьи (список по ссылке).

WH>http://joeduffyblog.com/2015/11/03/blogging-about-midori/

Да, одна статья там прямо по делу, которая "Safe Native Code". И там у него много здравых мыслей)

WH>Букв много. Но всё по делу. Перед созданием нового языка читать обязательно.

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

По факту никакие не оказались рабочими. ))) Это я про общую концепцию подобной ОС, а не про отдельные наработки в мелочах. )
Re[16]: Портирование нитры.
От: alex_public  
Дата: 08.02.17 16:44
Оценка:
Здравствуйте, novitk, Вы писали:

N>K тому что написал WolfHound добавлю еще нативную Скалу (https://github.com/scala-native/scala-native)

N>Там вроде многое уже работает. Скала по функционалу ~N++.

О, действительно интересно. Прямо на первой же странице все примеры демонстрируют именно то, о необходимости наличия чего я уже писал в этой теме. А именно: данные на стеке, работа с указателями, прямое выделение памяти, прозрачные вызовы C библиотек, бэкенд через LLVM. Правда при этом у них указано, что сам язык управляемый — интересно как это там внутри всё сочетается.

Кстати, у них там видно одно интересное решение, про которое я уже тоже тут говорил, как про полезную временную меру. Они не стали страдать с разработкой своей стандартной библиотеки, а просто взяли готовую библиотеку C. Поэтому у них там во всех примерах сплошные printf и т.п. Понятно, что для готового продукта с таким языком это конечно не верно (все знают минусы printf), но на самой первой стадии это похоже самое идеальное решение. Я его высказал в этой темке с ходу, без всякого серьёзного проектирования, но судя по этому проекту оно достаточно удачное.

Да, но вот с вопросами документации у данных товарищей всё крайне печально. Вообще полная пустота. Я не говорю даже про какие-то документации на компилятор или библиотеки — у них даже про сам язык (поддерживаемые концепции, ограничения и т.п.) вообще ничего нет. Единственное из чего можно сделать какие-то выводы, это из сравнения этого https://github.com/scala-native/scala-native/blob/master/demo/native/smallpt.scala и этого https://github.com/scala-native/scala-native/blob/master/demo/jvm/smallpt.scala исходников. ))) Кстати, забавно что у них там валяется ещё и такая https://github.com/scala-native/scala-native/blob/master/demo/cpp/smallpt.cpp реализация этого же примера — интересно сравнить быстродействие. )))
Re[16]: Портирование нитры.
От: alex_public  
Дата: 08.02.17 18:05
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Ага, вот это уже интереснее. Причём я тут подумал — действительно наверное не получится просто перенести обычный Nemerle на нативную платформу. Точнее сделать это без проблем можно, но только результат будет мало кому интересен.

VD>Уж если Go кому-то интересен, то уж Нативный Nemerle точно должен быть интересен. Языки и рядом не стояли. Вот только надо название сменить (наверно) и пиар-компанию продумать или найти брэнд через который язык двигать (как тот же Go).

Ну вообще то концепция Nemerle как раз противоположна Go. Это сложный продукт для узкой аудитории эстетов от программирования. В какой-то степени его аналогами наверное можно было бы назвать Scala из мира JVM и D из нативного мира. Кстати, среди них он вроде как самый "неудачник", но это видимо следствие позиции .net. Причём это позиционирование будет вне зависимости от того нативный/ненативный или управляемый/неуправляемый — это скорее речь о МП и т.п.

А дальше следует смотреть, в каких областях подобных эстетов обитает больше. Это уже вопрос обсуждаемый, но сразу понятно, что область написания формочек к БД в банках сюда точно не подходит.

Далее, что касается нативного Nemerle, то надо понимать, что если мы хотим просто получить одиночный исполняемый файл с машинными кодами после хорошего оптимизатора, то для этого ничего делать не надо — этим сейчас уже занимается MS в своём .net native. Вам надо только проверить что Nemerle со всем этим совместим и всё получится автоматом.

Однако пользы от этого особой не будет (разве что отсутствие зависимости от установленного фреймворка), т.к. даже крутой оптимизатор не сможет справиться с врождёнными проблемами .net. Поэтому если хочется не просто компилировать в машинные коды и независимость от винды, но и реальных нативных возможностей (по применимости языка) уровня C++, то надо целиком выкинуть всё предложенное CLR и реализовать с нуля, ориентируясь на известные эффективные низкоуровневые подходы.

_>>Хотя это и не так просто (см. например попытки в Rust'е).

VD>Я уже говорил. Беда Rust в том, что авторы отказались от GC и исключений. Это идиотизм. Вот наличие возможностей жить без них — это хорошо. А их полное отсутствие — это идиотизм.

Ну вместо исключений там есть некое бледное подобие под названием panic. Так что не уверен, что в этом есть какая-то проблема (скорее кому-то просто непривычно). А вот то, что они предложили на замену GC действительно не тривиально. Не знаю пока насколько оно эффективно (время покажет, может оно действительно того стило), но оно однозначно сложно в программирование и долго в написание.

VD>Ты просто явно с дотнетом много не возился. Не зависит от IDE этот формат. Просто у VS форматом проектов служат файлы MSBuild.

VD>С этим есть проблемы на Mono. Там есть аналог MSBuild, но он не полностью совместим с прототипом (рукожопье в Моно процветало). Но сейчас МС на всех парах опенсорсит дотнет. Они создали .Net Core в который переводят все что можно. MSBuild не стал исключением. Сначала они запилили велосипед, но разум востержествовал и MSBuild тоже двинули в Core, попутно сделав MSBuild стандартом проектов и для Core. Так как лицензия на Core очень либеральная (Апач 2, если не ошибаюсь), то Моновцы уже сказали, что будут брать тулы из Core и перейдут на MSBuild.

Я в курсе, т.к. когда-то давно (но ms build уже существовал) активно использовал VS. И поэтому так же в курсе, что эта система сборки является одной из самых ущербных. Даже без учёта отсутствия кроссплатформенности) Единственный её плюс — это автоматическая генерация файлов одной популярной IDE. )))
Re[17]: Портирование нитры.
От: WolfHound  
Дата: 08.02.17 18:11
Оценка: 5 (1) +2
Здравствуйте, alex_public, Вы писали:

_>Хм, и что же там так завязано? Я вот например особо не вижу там конструкций, которые нельзя бы было реализовать без GC.

Например, замыкания сразу становятся неполноценными.
Да и вообще весь код, написанный на немерле рассчитан на глобальный ГЦ.
Так что даже если сделать язык, который выглядит как немереле, но без глобального ГЦ программы, написанные на немерле ты на нём, не запустишь. Даже если скомпилируешь работать они не будут.

_>Нуу обязательный GC сразу закроет часть ниш для этого языка. Причём некоторые из них сейчас весьма популярны и активно развиваются. Так что с точки зрения широты обхвата лучше без этого.

Какие и почему?

_>3. Современный C++. В приложение нет ни одного new или delete вообще. При этом эффективность и применимость получаемого кода не хуже чем у древнего C.

Это одна из многих форм ГЦ.

_>Так вот, глядя на эту картину... Ты всё равно считаешь наличие GC прогрессом? )

Да. Тем более что можно сделать систему, которая будет работать намного лучше, чем, то что есть в С++.
И с точки зрения безопасности кода. И с точки зрения производительности.

_>каких вещей там точно не должно быть (например интроспекции времени исполнения)

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

_>и какие точно должны быть (например прозрачный вызов C библиотек и системного API).

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

_>Да, одна статья там прямо по делу, которая "Safe Native Code". И там у него много здравых мыслей)

Там всё нужно внимательно прочитать.
Особенно тебе. Он многие твои заблуждения разбирает.

_>По факту никакие не оказались рабочими. ))) Это я про общую концепцию подобной ОС, а не про отдельные наработки в мелочах. )

Почему?
То, что манагеры из мелкософт закрыли проект аргументом, не является.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: Портирование нитры.
От: novitk США  
Дата: 08.02.17 19:09
Оценка: 3 (1)
Здравствуйте, alex_public, Вы писали:

_>О, действительно интересно. Прямо на первой же странице все примеры демонстрируют именно то, о необходимости наличия чего я уже писал в этой теме. А именно: данные на стеке, работа с указателями, прямое выделение памяти, прозрачные вызовы C библиотек, бэкенд через LLVM. Правда при этом у них указано, что сам язык управляемый — интересно как это там внутри всё сочетается.

Дедушка без управляемости это уже бабушка, как справедливо заметил Wolfhound. Scala native это 100% Скала. В смысле там только бэкенд другой, фронтенды взяты из jvm версий [Нитра не нужна! ]. "ФронтендЫ" потому что их сейчас два: scalac (прод) и dotty (новый). Все нативные плюшки сделаны через обычные механизмы (аннотации и т.д.).

В данный момент для ГЦ традиционно используют Boehm, потом собираются менять. Это не отменяет конечно, что можно прямо звать malloc, etc, то есть "гибридный" подход в терминологии Влада.

_>Кстати, у них там видно одно интересное решение, про которое я уже тоже тут говорил, как про полезную временную меру. Они не стали страдать с разработкой своей стандартной библиотеки, а просто взяли готовую библиотеку C. Поэтому у них там во всех примерах сплошные printf и т.п.

Не совсем. Они хотят иметь совместимость до уровня работоспособности чистых Scala-библиотек типа Акка/Spark. Для этого они ограничено портируют явовские нэймспейсы на нативную Скалу ручками. Автор говорит, что это довольно просто. Если уровень поддержки достаточный, то какой-нибудь scala.collection._ должна работать из коробки.

_>Да, но вот с вопросами документации у данных товарищей всё крайне печально. Вообще полная пустота.

Проект новый, документация вроде в разработке. Посмотри на тытруба, там вроде в отдельном брэнче что-то валяется.
Отредактировано 08.02.2017 19:13 novitk . Предыдущая версия .
Re[19]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.02.17 03:04
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>В том, что всё просто и "из коробки". В том, что есть куча сторонних фрэймворков на все случаи жизни.


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

KP>Да и на C++ я тоже самое могу сделать, вопрос лишь в том, сколько на это времени уйдет. К примеру вот довольно популярный Web-framework для Go. Обрати внимание на "быстрый старт": там меньше 10 строк, которые тебе на выходе дают что-то осязаемое.


Про NemerleWeb тебе сказал. Такого у Go скорее всего никогда. Но есть варианты и по проще. Можно просто ASP.MVC-проект создать.

VD>>То есть вся разница в том, что он не требует виртуальной машины?


KP>Да ладно тебе, причем тут вообще VM?


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

Вся разница в том, что есть VM, а в go — нет.

KP>Я в ней проблемы не вижу, а вот то, что это не .NET – это безусловно осязаемый плюс, так как отвязывает и от WIndows и от очередного NIH приступа в MS.


Ну, у .NET тоже есть Моно и Core. Для сервисов и прочего не гуевого софта этого хватает.

VD>>Давай будем честными. Главное достоинство Go это — Google.


KP>Ни разу. Если честно – достоинство инфраструктура для разработки всего и вся связанного с сетями и не имеющего совсем уж жестких требований к производительности.


Ну, вот и у Немерла все тоже самое. Но Go раскрутили. И ты утверждаешь, что Google в этом не виноват.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Портирование нитры.
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 09.02.17 03:59
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ну, при том, что к дотнету и Яве фреймворков ведь в разы больше. Плюс еще на макросах решения есть для многого. Но ты мне про какую-то там инфраструктуру рассказываешь.

VD>Вся разница в том, что есть VM, а в go — нет.

Да, ты прав, отдельно стоящая VM на 50-100 мб – это перебор в ряде случаев. В нашем это было просто недопустимо. А так, я бы Python (но тут еще и исходники в открытом виде по факту) или Java предпочел бы

VD>Ну, у .NET тоже есть Моно и Core. Для сервисов и прочего не гуевого софта этого хватает.


Уй да ладно. Mono – это вообще знатное извращение, которое в теории как бы работает. Core – есть, но разнообразие библиотек автоматом исчезает, так как не входят в Core. И, что не маловажно, Core – это Microsoft, а Microsoft – это NIH и полнейшая непредсказуемость. Они столько всего закопали (включая SilverLight), что нужно быть большим оригиналом чтобы влезть в Core для коммерческого продукта.

VD>Ну, вот и у Немерла все тоже самое. Но Go раскрутили. И ты утверждаешь, что Google в этом не виноват.


Хорошо, в целом ты прав про раскрутру. Но то что Nemerle по популярности даже D не догнало – проблема почти полностью на стороне .NET-а
Re[21]: Google Graveyard
От: Qbit86 Кипр
Дата: 09.02.17 07:48
Оценка: +1
Здравствуйте, kaa.python, Вы писали:

KP>Core – есть, но разнообразие библиотек автоматом исчезает, так как не входят в Core.


Библиотеки не обязаны входить в Core, им достаточно таргетить Netstandard. После этого они могут использоваться на любой платформе, которая реализует Netstandard: .NET Framework, Xamarin, .NET Core, UWP.

KP>а Microsoft – это NIH и полнейшая непредсказуемость.


А Google Golang — предсказуемость и определённость?

KP>Они столько всего закопали (включая SilverLight)


Ну, Google наверное поболее сервисов закопали: Discontinued_products_and_services.
Глаза у меня добрые, но рубашка — смирительная!
Отредактировано 09.02.2017 7:49 Qbit86 . Предыдущая версия .
Re[18]: Портирование нитры.
От: alex_public  
Дата: 09.02.17 14:14
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Хм, и что же там так завязано? Я вот например особо не вижу там конструкций, которые нельзя бы было реализовать без GC.

WH>Например, замыкания сразу становятся неполноценными.

И в чём же их неполноценность например в C++? )

WH>Да и вообще весь код, написанный на немерле рассчитан на глобальный ГЦ.

WH>Так что даже если сделать язык, который выглядит как немереле, но без глобального ГЦ программы, написанные на немерле ты на нём, не запустишь. Даже если скомпилируешь работать они не будут.

А, ну это конечно. Но не думаю что это проблема на данный момент — вряд ли у языка есть много уже написанного полезного ПО. Кроме разве что самих же компиляторов Nemerle и остального. Ну а это мы уже обсуждали — в начале и .net версия пойдёт. А когда-нибудь потом, специально для них, можно и GC приделать.

_>>Нуу обязательный GC сразу закроет часть ниш для этого языка. Причём некоторые из них сейчас весьма популярны и активно развиваются. Так что с точки зрения широты обхвата лучше без этого.

WH>Какие и почему?

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

Далее, если говорить о классическом GC (типа того, что в .net), то автоматически отлетают ещё и все LL области (включая весьма денежную сейчас HFT). Кстати, а в последнее время наработки в области LL начали интересоваться уже и топовые онлайн игры и всяческие средства связи (аудио, видео и т.п.).

_>>3. Современный C++. В приложение нет ни одного new или delete вообще. При этом эффективность и применимость получаемого кода не хуже чем у древнего C.

WH>Это одна из многих форм ГЦ.

Ха, ну если называть это GC, то тогда можешь вполне считать что я за GC! Но на мой взгляд это называется совсем по другому: RAII+объекты на стеке+семантика перемещения+набор правильных контейнеров в стандартной библиотеке.

_>>Так вот, глядя на эту картину... Ты всё равно считаешь наличие GC прогрессом? )

WH>Да. Тем более что можно сделать систему, которая будет работать намного лучше, чем, то что есть в С++.
WH>И с точки зрения безопасности кода. И с точки зрения производительности.

С удовольствием ознакомлюсь с такими техниками. )

_>>каких вещей там точно не должно быть (например интроспекции времени исполнения)

WH>Согласен. Стандартная реализация интроспекции времени исполнения всегда не адекватна задачам, которые с её помощью решаются.
WH>Гораздо лучший вариант сгенерировать всё что нужно во время компиляции.
WH>И языки на основе нитры тут безусловные фавориты.

Позитивно)

_>>и какие точно должны быть (например прозрачный вызов C библиотек и системного API).

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

Обёртки конечно же надо делать, но это может/должен делать сам прикладной программист, подключая какую-то нестандартную C библиотеку. А для этого у него в языке должна быть встроенная возможность прозрачно объявить внешнюю функцию, что-то вроде:
extern ccall ptr malloc(size);
extern stdcall ptr VirtualAlloc(ptr, size, uint, uint);

и чтобы компилятор и компоновщик автоматом организовали правильный вызов из соответствующей библиотеки. Да, а в идеале ещё было бы иметь конвертер h файлов (потому как это не только формат языков C/C++, но ещё и формат системного API во всех современных ОС) в файлы нашего языка с подобными объявлениями.

_>>По факту никакие не оказались рабочими. ))) Это я про общую концепцию подобной ОС, а не про отдельные наработки в мелочах. )

WH>Почему?
WH>То, что манагеры из мелкософт закрыли проект аргументом, не является.

И не только они) Нигде проекты такого рода не выжили. )
Re[18]: Портирование нитры.
От: alex_public  
Дата: 09.02.17 14:22
Оценка:
Здравствуйте, novitk, Вы писали:

_>>О, действительно интересно. Прямо на первой же странице все примеры демонстрируют именно то, о необходимости наличия чего я уже писал в этой теме. А именно: данные на стеке, работа с указателями, прямое выделение памяти, прозрачные вызовы C библиотек, бэкенд через LLVM. Правда при этом у них указано, что сам язык управляемый — интересно как это там внутри всё сочетается.

N>Дедушка без управляемости это уже бабушка, как справедливо заметил Wolfhound. Scala native это 100% Скала. В смысле там только бэкенд другой, фронтенды взяты из jvm версий [Нитра не нужна! ]. "ФронтендЫ" потому что их сейчас два: scalac (прод) и dotty (новый). Все нативные плюшки сделаны через обычные механизмы (аннотации и т.д.).

Так может они ещё и всю рефлексию с боксингом от JVM оставили? ) Если да, то боюсь толка от языка много не будет...

N>В данный момент для ГЦ традиционно используют Boehm, потом собираются менять. Это не отменяет конечно, что можно прямо звать malloc, etc, то есть "гибридный" подход в терминологии Влада.


Угу, похоже на подход D. Можно использовать, а можно нет. Но вообще на мой взгляд у них тут гораздо полезнее даже не malloc и т.п, а возможность нормального размещения объектов на стеке. Хотя и с длинным синтаксисом. )))

_>>Кстати, у них там видно одно интересное решение, про которое я уже тоже тут говорил, как про полезную временную меру. Они не стали страдать с разработкой своей стандартной библиотеки, а просто взяли готовую библиотеку C. Поэтому у них там во всех примерах сплошные printf и т.п.

N>Не совсем. Они хотят иметь совместимость до уровня работоспособности чистых Scala-библиотек типа Акка/Spark. Для этого они ограничено портируют явовские нэймспейсы на нативную Скалу ручками. Автор говорит, что это довольно просто. Если уровень поддержки достаточный, то какой-нибудь scala.collection._ должна работать из коробки.

А, ну тут у них совсем другая ситуация, по отношению к Nemerle. У последнего, как я понял, нет своей персональной стандартной библиотеки — используется вариант от .net. А у Scala, как я понял, есть своя библиотека (контейнеры и т.п.), написанная на этом же языке, а не прямое использование jvm. Так что абсолютно логично, что её необходимо портировать. Т.е. с одной стороны это больше работы в самом начале, но зато быстро получается нормальный готовый продукт. А в случае Nemerle с одной стороны это не обязательно с самого начала, а с другой придётся ещё самим в начале проектировать подобную библиотеку, а потом делать реализацию под конкретную платформу.
Re[16]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.02.17 15:40
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>http://joeduffyblog.com/2015/11/03/blogging-about-midori/

WH>Букв много. Но всё по делу. Перед созданием нового языка читать обязательно.
WH>В двух словах: Мужик работал над созданием полностью управляемой ОС и пишет какие были варианты, какие из них оказались рабочими и какие нет. А главное почему.

Это в одном слове. Лучше опиши, что там у него интересного было. А то букв слишком много. Начал читать, но уснул. Все что успел прочесть — какие-то банальности.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Портирование нитры.
От: WolfHound  
Дата: 09.02.17 17:08
Оценка: 5 (1)
Здравствуйте, alex_public, Вы писали:

WH>>Например, замыкания сразу становятся неполноценными.

_>И в чём же их неполноценность например в C++? )
Захвати локальную переменную.
Сохрани замыкание.
Выйди из функции.
Что будет?

_>Ну для начале априори отлетает весь низкий уровень (драйверы, микроконтроллеры и т.п.),

Это просто не правда.
Есть работающие ОС, в которых все драйверы управляемые.

_>что закрывает доступ ко многим бурно развивающимся сейчас областям (типа IoT, носимой электроники и т.п.).

Тут вообще никаких проблем. От слова совсем. Туда почти что угодно влезет.

_>Далее, если говорить о классическом GC (типа того, что в .net), то автоматически отлетают ещё и все LL области (включая весьма денежную сейчас HFT). Кстати, а в последнее время наработки в области LL начали интересоваться уже и топовые онлайн игры и всяческие средства связи (аудио, видео и т.п.).

Так есть и другие алгоритмы например
https://www.azul.com/resources/azul-technology/azul-c4-garbage-collector/

WH>>И с точки зрения безопасности кода. И с точки зрения производительности.

_>С удовольствием ознакомлюсь с такими техниками. )
Re: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 29.10.14

Re[2]: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 29.10.14

Re[2]: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 30.10.14

Re[2]: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 30.10.14


_>Обёртки конечно же надо делать, но это может/должен делать сам прикладной программист, подключая какую-то нестандартную C библиотеку. А для этого у него в языке должна быть встроенная возможность прозрачно объявить внешнюю функцию, что-то вроде:

Ты всё на какие-то банальности скатываешься. То о чём ты говоришь делается всегда. Иначе просто программу на современной ОС не запустить.

WH>>То, что манагеры из мелкософт закрыли проект аргументом, не является.

_>И не только они) Нигде проекты такого рода не выжили. )
Это не аргумент.
До недавнего времени не было ни одного генератора парсеров который одновременно генерировал бы быстрый парсер и умел качественно восстанавливаться после ошибок без единой подсказки со стороны программиста.
А чтобы при этом ещё и умел во время разбора изменять грамматику на основе встреченных в коде данных... это была вообще не научная фантастика.
Но я такой написал. Именно его использует нитра. И в принципе понятно, как сделать его ещё лучше.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[20]: Портирование нитры.
От: alex_public  
Дата: 09.02.17 19:41
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>>>Например, замыкания сразу становятся неполноценными.

_>>И в чём же их неполноценность например в C++? )
WH>Захвати локальную переменную.
WH>Сохрани замыкание.
WH>Выйди из функции.
WH>Что будет?

Всё нормально будет:
auto f=[]{
    auto s="hello world!"s;
    return [s=move(s)]{return s;};//если записать короче, в виде "return [=]{return s;};", то тоже будет работать, но произойдёт лишнее копирование.
};
cout<<f()();//выведет "hello world!"


_>>Ну для начале априори отлетает весь низкий уровень (драйверы, микроконтроллеры и т.п.),

WH>Это просто не правда.
WH>Есть работающие ОС, в которых все драйверы управляемые.

Ну и кому надо писать под эти дано сдохшие ОС? Мы же говорим тут не об общетеоретических возможностях, а о вполне конкретном положение на рынке.

_>>что закрывает доступ ко многим бурно развивающимся сейчас областям (типа IoT, носимой электроники и т.п.).

WH>Тут вообще никаких проблем. От слова совсем. Туда почти что угодно влезет.

Ну давай, расскажи мне как написать под мой любимый (самое идеальное сочетание возможностей/цене в данный момент) STM32F042F6P6 код на каком-нибудь из современных языков с GC.

_>>Далее, если говорить о классическом GC (типа того, что в .net), то автоматически отлетают ещё и все LL области (включая весьма денежную сейчас HFT). Кстати, а в последнее время наработки в области LL начали интересоваться уже и топовые онлайн игры и всяческие средства связи (аудио, видео и т.п.).

WH>Так есть и другие алгоритмы например
WH>https://www.azul.com/resources/azul-technology/azul-c4-garbage-collector/

Угу, Zing справляется (и там кстати дело не только в GC — переделано всё). Правда результат всё равно хуже C++ решений, но хотя бы просто можно писать в данной области. Так а у тебя есть готовые наработки такого уровня, чтобы вставить их в свой язык с GC (причём это ещё и опцией должно быть, т.к. актуально только для части задач)?

WH>>>И с точки зрения безопасности кода. И с точки зрения производительности.

_>>С удовольствием ознакомлюсь с такими техниками. )
WH>Re: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 29.10.14

WH>Re[2]: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 29.10.14

WH>Re[2]: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 30.10.14

WH>Re[2]: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 30.10.14


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

_>>Обёртки конечно же надо делать, но это может/должен делать сам прикладной программист, подключая какую-то нестандартную C библиотеку. А для этого у него в языке должна быть встроенная возможность прозрачно объявить внешнюю функцию, что-то вроде:

WH>Ты всё на какие-то банальности скатываешься. То о чём ты говоришь делается всегда. Иначе просто программу на современной ОС не запустить.

Ну формально говоря это не так — если мы встроим всё нужное в рантайм языка, то он вполне будет способен работать без подобных механизмов.

Но понятно, что на практике в любом серьёзном языке естественно присутствует какая-то разновидность механизма FFI. Я же говорю не просто о самом факте наличия FFI, а уже о его конкретной реализации: для нативного языка это должно выглядеть не как P/Invoke или JNI, а ближе к варианту из C++. Причём это критически важный фактор для успешности подобного языка.

WH>>>То, что манагеры из мелкософт закрыли проект аргументом, не является.

_>>И не только они) Нигде проекты такого рода не выжили. )
WH>Это не аргумент.
WH>До недавнего времени не было ни одного генератора парсеров который одновременно генерировал бы быстрый парсер и умел качественно восстанавливаться после ошибок без единой подсказки со стороны программиста.
WH>А чтобы при этом ещё и умел во время разбора изменять грамматику на основе встреченных в коде данных... это была вообще не научная фантастика.
WH>Но я такой написал. Именно его использует нитра. И в принципе понятно, как сделать его ещё лучше.

Аналогия не является доказательством. )
Re[21]: Портирование нитры.
От: WolfHound  
Дата: 09.02.17 20:41
Оценка: 5 (1)
Здравствуйте, alex_public, Вы писали:

_>Всё нормально будет:

Это нужно не забыть написать.
А если в два замыкания?

_>Ну и кому надо писать под эти дано сдохшие ОС? Мы же говорим тут не об общетеоретических возможностях, а о вполне конкретном положение на рынке.

Там тоже ничего не мешает.

_>Ну давай, расскажи мне как написать под мой любимый (самое идеальное сочетание возможностей/цене в данный момент) STM32F042F6P6 код на каком-нибудь из современных языков с GC.

А в такой штуке вообще управление памятью нужно?
В 6К нужно сразу всю память статически распределять.

_>Угу, Zing справляется (и там кстати дело не только в GC — переделано всё). Правда результат всё равно хуже C++ решений, но хотя бы просто можно писать в данной области. Так а у тебя есть готовые наработки такого уровня, чтобы вставить их в свой язык с GC (причём это ещё и опцией должно быть, т.к. актуально только для части задач)?

1)Ничего сверхъестественного там нет.
2)Я не собираюсь с глобальным ГЦ воевать.
Большая часть памяти вообще без ГЦ будет освобождаться.

_>Если всё указанное делать руками, то не вижу никакой разницы с каким-нибудь обычным аллокатором на пуле из C++. Если же ты подразумевал в данном тексте, что это всё как-то автоматически организует компилятор, то я слабо себе представляют как подобное возможно.

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

Переписывание сигнатур тривиально. Все параметры, которые не помечены unique помещаем в один разделяемый кластер. Каждый параметр, помеченный unique помещаем в отдельный эксклюзивный кластер.
Для примерно 100% кода — это умолчание будет работать.

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

_>Аналогия не является доказательством. )

Это не аналогия. Это демонстрация несостоятельности аргумента: Если до сих пор никто не смог, то это невозможно.
А другие аргументы ты так и не представил.

Лично я считаю, что управляемая ОС не только возможна, но и неизбежна. Ибо это единственный способ значительно повысить безопасность и производительность ОС.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: Портирование нитры.
От: DarkEld3r  
Дата: 10.02.17 13:22
Оценка: 1 (1)
Здравствуйте, WolfHound, Вы писали:

WH>1)Их нельзя проигнорировать, а значит программа не будет молча глотать ошибки.

Правильно реализованные "коды возврата" тоже нельзя проигнорировать. И наоборот: при желании исключения тоже можно игнорировать: catch (...). В остальном спорить не буду.
Re[19]: Портирование нитры.
От: novitk США  
Дата: 10.02.17 15:45
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Так может они ещё и всю рефлексию с боксингом от JVM оставили? ) Если да, то боюсь толка от языка много не будет...

Не в курсе. Помню из видео, что на какой-то числодробилке (вроде raytracing) оно в данный момент на ~20% медленней плюсов.

N>>Не совсем. Они хотят иметь совместимость до уровня работоспособности чистых Scala-библиотек типа Акка/Spark. Для этого они ограничено портируют явовские нэймспейсы на нативную Скалу ручками. Автор говорит, что это довольно просто. Если уровень поддержки достаточный, то какой-нибудь scala.collection._ должна работать из коробки.


_>А у Scala, как я понял, есть своя библиотека (контейнеры и т.п.), написанная на этом же языке, а не прямое использование jvm. Так что абсолютно логично, что её необходимо портировать.

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

_>А в случае Nemerle с одной стороны это не обязательно с самого начала, а с другой придётся ещё самим в начале проектировать подобную библиотеку, а потом делать реализацию под конкретную платформу.

В случае Nemerle может вообще ничего делать будет не надо, если MS выкатить открытый AOT-компилятор, к которому можно будет подкрутить все эти stack alloc и прочее.

Проблема с Немерле в том, что сам Немерле не нужен. Я уже им говорил, что нитру надо было делать кусками (парсер, IDE плагины, типизатор и т.д.) на популярной платформе/языке. Сложный нишевой продукт, написанный на никому неизвестном языке для платформы, которой не пользуются 80% target audience?! Оно не переживет даже "hit by a bus" или просто потерю интереса сам знаешь кого. Там наверняка есть полезные куски, так как ребята толковые и мне честно говоря жалко.
Отредактировано 10.02.2017 16:52 novitk . Предыдущая версия .
Re[22]: Портирование нитры.
От: alex_public  
Дата: 10.02.17 20:07
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Всё нормально будет:

WH>Это нужно не забыть написать.

Ты про move? Ну это как бы оптимизация. Т.е. в принципе для почти всех случаев ты можешь тупо писать [=] и всё будет работать. Не сработает только для объектов у которых запрещено копирование, но тут уже ругнётся компилятор. Плюс на больших объектах (типа гигабайтного vector'а) подобный код будет тормозить — тут как раз и надо "не забыть" про move. ))) Но хороший программист на C++ естественно не забудет указать это во всех возможных местах, из соображений перфекционизма. В принципе возможно в будущем подобное сможет делать и компилятор. Т.е. он уже делает это (сам вставляет move) в очень многих случаях (когда видит, что дальше объект гарантированно не используется, например в return), но пока ещё не во всех возможных — пока программисту иногда приходится ему помогать. Но развитие то не стоит на месте и возможно что в будущих версиях компиляторов практика явного указания move будет исчезать совсем.

WH>А если в два замыкания?


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

_>>Ну и кому надо писать под эти дано сдохшие ОС? Мы же говорим тут не об общетеоретических возможностях, а о вполне конкретном положение на рынке.

WH>Там тоже ничего не мешает.

Где там? Ты можешь написать на Java или C# драйвер для ядра винды или линуха? О чём вообще речь? )

_>>Ну давай, расскажи мне как написать под мой любимый (самое идеальное сочетание возможностей/цене в данный момент) STM32F042F6P6 код на каком-нибудь из современных языков с GC.

WH>А в такой штуке вообще управление памятью нужно?
WH>В 6К нужно сразу всю память статически распределять.

Естественно не нужно. Там всё выделение решается через глобальные (статически, причём компоновщик контролирует чтобы всё влезло) и локальные (тут, на стеке и реализуется вся "динамика") переменные. Вопрос в том, чтобы язык позволял использовать все свои возможности без требования необходимости работающего "new". Вот C++ это отлично может — даже в таких условиях работает всё, включая и замыкания и контейнеры с алгоритмами из STL и всё остальное. Так вот если допустим сделать нативный вариант Nemerle в лоб, без какой либо адаптации (типа отсутствия обязательного GC и т.п.), то по твоему он сможет аналогичное? )

_>>Угу, Zing справляется (и там кстати дело не только в GC — переделано всё). Правда результат всё равно хуже C++ решений, но хотя бы просто можно писать в данной области. Так а у тебя есть готовые наработки такого уровня, чтобы вставить их в свой язык с GC (причём это ещё и опцией должно быть, т.к. актуально только для части задач)?

WH>1)Ничего сверхъестественного там нет.
WH>2)Я не собираюсь с глобальным ГЦ воевать.
WH>Большая часть памяти вообще без ГЦ будет освобождаться.

Я и не говорю, что там какая-то магия. Просто это большой объём работы. Причём позволяющий всего лишь слегка приблизиться к результатам другого варианта, в котором его эффективность получается "на халяву" (не надо никакой тяжёлой работы с оптимизациями разных GC).

_>>Если всё указанное делать руками, то не вижу никакой разницы с каким-нибудь обычным аллокатором на пуле из C++. Если же ты подразумевал в данном тексте, что это всё как-то автоматически организует компилятор, то я слабо себе представляют как подобное возможно.

WH>Главное я точно знаю, как такое возможно.
WH>Первый пример в первом сообщении использует определённые умолчания при переписывании сигнатур функции и вывод типов внутри кода. Всё управление памятью сводится к двум unique.
WH>Второй то что получается после переписывания и вывода типов.
WH>Переписывание сигнатур тривиально. Все параметры, которые не помечены unique помещаем в один разделяемый кластер. Каждый параметр, помеченный unique помещаем в отдельный эксклюзивный кластер.
WH>Для примерно 100% кода — это умолчание будет работать.
WH>Вывод типов тупая раскраска многосвязного графа.
WH>В начале граф бесцветный. Узлы графа, которые соответствуют параметрам функции и локальным вызовам unique красим в цвет соответствующего кластера. Далее красим этим цветом все смежные узлы. Если узел покрашен более чем одним цветом выдаём сообщение об ошибке. Если узел оказался бесцветным заводим ещё один кластер который живёт пока не завершиться функция и красим его цветом все бесцветные узлы.

Хм, ну если ты сделаешь реальную реализацию подобного, то может и выйдет эффективнее. Когда она будет готова можешь записать меня в первых же тестеров. )

Ну а на данный момент, из реально существующего, всё же GC далёк от современного эффективного управления памятью.

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


А что ты называешь управляемой ОС? Такую, в API которой не присутствует разновидность VirtualFree и при этом есть встроенный глобальный сборщик мусора? Или что?
Re[20]: Портирование нитры.
От: alex_public  
Дата: 10.02.17 20:42
Оценка:
Здравствуйте, novitk, Вы писали:

_>>Так может они ещё и всю рефлексию с боксингом от JVM оставили? ) Если да, то боюсь толка от языка много не будет...

N>Не в курсе. Помню из видео, что на какой-то числодробилке (вроде raytracing) оно в данный момент на ~20% медленней плюсов.

Да, у них там в репозитории как раз 3 реализации (jvm, c++ и их) примера с raytracing. Надо будет приглядеть к нему, что там за алгоритмы и циклы.

Просто это принципиальный момент. Потому как даже если взять мощный оптимизатор, умеющий разные эффективные вещи типа автовекторизации (а LLVM это отлично умеет), то в случае классической Java это будет абсолютно бесполезно, просто потому что из-за специфики устройства языка данные не будут укладываться в схему SIMD. И как следствие такой код будет уже в на порядок отставать от аналогичного C++ кода. Но только на определённых (где главную часть алгоритма занимают распараллеливаемые циклы) честных (например надо не забыть включить правильную оптимизацию в C++ варианте) тестах. Ну и SIMD — это не единственная проблема, там много чего ещё следует.

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

_>>А у Scala, как я понял, есть своя библиотека (контейнеры и т.п.), написанная на этом же языке, а не прямое использование jvm. Так что абсолютно логично, что её необходимо портировать.

N>Стандартную библиотека никто не трогает и она живет своей жизнью. Они портируют куски из явовской, необходимыe для ее поддержки.

Хм, ну тоже вариант. Позволяет максимально быстро получить нужный результат. Хотя не уверен, что такой результат будет самым оптимальным (т.к. грубо говоря java api в условиях нативного мира далеко не идеально), но для начала точно сойдёт.

_>>А в случае Nemerle с одной стороны это не обязательно с самого начала, а с другой придётся ещё самим в начале проектировать подобную библиотеку, а потом делать реализацию под конкретную платформу.

N>В случае Nemerle может вообще ничего делать будет не надо, если MS выкатить открытый AOT-компилятор, к которому можно будет подкрутить все эти stack alloc и прочее.

В MS уже сами занялись этим (размещением на стеке), так же как и убийством рефлексии и ещё некоторых оптимизациях. Естественно только в рамках .net native, т.к. там пока можно не сильно держаться за обратную совместимость. Теоретически, если это направление "развить и углубить" (например избавиться от P/Invoke и ещё несколько нюансов), а так же снять зависимость от MS (через открытие исходников под свободной лицензией), то этим всем уже реально можно будет пользоваться. Правда к современному .net это будет иметь уже совсем слабое отношение.

N>Проблема с Немерле в том, что сам Немерле не нужен. Я уже им говорил, что нитру надо было делать кусками (парсер, IDE плагины, типизатор и т.д.) на популярной платформе/языке. Сложный нишевой продукт, написанный на никому неизвестном языке для платформы, которой не пользуются 80% target audience?! Оно не переживет даже "hit by a bus" или просто потерю интереса сам знаешь кого. Там наверняка есть полезные куски, так как ребята толковые и мне честно говоря жалко.


Ну я думаю, что на данном этапе язык, на котором написан сам их продукт, не так принципиален. Во всяком случае пока есть кому заниматься его развитием. А вот насчёт не верного выбора целевой аудитории я полностью согласен.
Re[23]: Upwards funarg problem
От: Qbit86 Кипр
Дата: 10.02.17 20:46
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Всё нормально будет:

_>
_>auto f=[]{
_>    auto s="hello world!"s;
_>    return [s=move(s)]{return s;};//если записать короче, в виде "return [=]{return s;};", то тоже будет работать, но произойдёт лишнее копирование.
_>};
_>cout<<f()();//выведет "hello world!"
_>


Что если между созданием замыкания и его возвратом мы хотим использовать замыкаемую переменую?
#include <cstdlib>
#include <iostream>
#include <string>

int main()
{
    using namespace std::string_literals;

    auto f = [] {
        auto s = "hello world!"s;
        auto result = [s = move(s)] { return s; };
        std::cout << s << std::endl; // Ожидаем `hello world!`.
        return result;
    };
    std::cout << f()() << std::endl;

    std::system("pause");

    return 0;
}


_>Могут быть ссылки на совместно используемый объект.


Ну не то чтобы прям сырые ссылки; ты имеешь в виду умные указатели. Ведь в языке отсутствует такая фича как невыразимость висячик ссылок:
auto f = [] {
    auto s = "hello world!"s;
    auto result = [&] { return s; }; // &
    std::cout << s << std::endl;
    return result;
};
std::cout << f()() << std::endl;
Глаза у меня добрые, но рубашка — смирительная!
Re[21]: Портирование нитры.
От: novitk США  
Дата: 10.02.17 21:26
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну я думаю, что на данном этапе язык, на котором написан сам их продукт, не так принципиален.

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

_>Во всяком случае пока есть кому заниматься его развитием.

Немерле в данный момент времени это никому не интересное legacy, где по желанию левой пятки поправляет простые косяки три (или уже один?) человека по необходимости. Никакого развития у него нет и не будет. Новый Немерле2 на Нитре, даже если и будет реализован, согласно заявленному функционалу (более навороченные макросы) будет вряд ли круче уже выпущенной скалы.
Re[24]: Upwards funarg problem
От: alex_public  
Дата: 10.02.17 22:28
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Что если между созданием замыкания и его возвратом мы хотим использовать замыкаемую переменую?

Q>
#include <cstdlib>
Q>#include <iostream>
Q>#include <string>

Q>int main()
Q>{
Q>    using namespace std::string_literals;

Q>    auto f = [] {
Q>        auto s = "hello world!"s;
Q>        auto result = [s = move(s)] { return s; };
Q>        std::cout << s << std::endl; // Ожидаем `hello world!`.
Q>        return result;
Q>    };
Q>    std::cout << f()() << std::endl;

Q>    std::system("pause");

Q>    return 0;
Q>}


"Ожидать `hello world!`" в подобном коде могут только люди не читавшие стандарт C++. )))

_>>Могут быть ссылки на совместно используемый объект.

Q>Ну не то чтобы прям сырые ссылки; ты имеешь в виду умные указатели. Ведь в языке отсутствует такая фича как невыразимость висячик ссылок:
Q>
auto f = [] {
Q>    auto s = "hello world!"s;
Q>    auto result = [&] { return s; }; // &
Q>    std::cout << s << std::endl;
Q>    return result;
Q>};
Q>std::cout << f()() << std::endl;


На самом деле может быть что угодно (но естественно не так, как в твоём примере — очередном нарушение стандарта), смотря по ситуации. Ключевая разница будет в другом. В случае наличия необходимости работать с одним объектом в произвольных местах кода (кстати это весьма редкая ситуация, т.к. она мешает построению потокобезопасного по построению кода и соответственно применяется только если уж точно по другому нельзя), изначальное размещение нашей переменной будет произведено не на стеке, а в куче. А дальше там уже могут быть десятки разных способов как удобнее оформить этот факт, в зависимости от конкретной ситуации.
Re[22]: Портирование нитры.
От: alex_public  
Дата: 10.02.17 22:53
Оценка:
Здравствуйте, novitk, Вы писали:

_>>Ну я думаю, что на данном этапе язык, на котором написан сам их продукт, не так принципиален.

N>Нитру без Немерле использовать нельзя. То есть языками реализованными на ней пользоваться конечно можно, но если ты хочешь писать свой язык, то тебе придется узнать Немерле и еще пяток написанных на нем DSL.

Нуу как бы ради такой цели (лёгкого построения своего языка) это была бы не такая уж и большая цена. Если бы оно реально работало — пока что оно если и криво-косо существует, то только внутри мирка .net (который меня вообще не интересует).

_>>Во всяком случае пока есть кому заниматься его развитием.

N>Немерле в данный момент времени это никому не интересное legacy, где по желанию левой пятки поправляет простые косяки три (или уже один?) человека по необходимости. Никакого развития у него нет и не будет. Новый Немерле2 на Нитре, даже если и будет реализован, согласно заявленному функционалу (более навороченные макросы) будет вряд ли круче уже выпущенной скалы.

Лично мне был бы интересен язык с возможностями современного C++ и наличием макросов в стиле Scala/Nemerle. Одно время я думал, что такой язык появится уже вот вот: Rust. Но при ближайшем рассмотрение оказалось, что он менее удобен чем C++ — в одних местах они слишком перемудрили, а в других наоборот слишком упростили.

Теперь вот думаю, не попробовать ли сделать что-то своё, когда появится свободное время. Ведь если у нового языка от рождения будет поддержка в топовых IDE (как раз благодаря технологиям ребят) и при этом нативная поддержка C и возможно C++ библиотек (с автоматическим конвертером), то это уже сразу получится рабочий инструмент, а не просто игрушка одиночки для фана. )))
Re[25]: Upwards funarg problem
От: Qbit86 Кипр
Дата: 11.02.17 02:11
Оценка: +1 :)
Здравствуйте, alex_public, Вы писали:

_>"Ожидать `hello world!`" в подобном коде могут только люди не читавшие стандарт C++. )))


Так ведь его просто так не прочитаешь — он же платный!

_>На самом деле может быть что угодно (но естественно не так, как в твоём примере — очередном нарушение стандарта)


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

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


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

_>изначальное размещение нашей переменной будет произведено не на стеке, а в куче.


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

Я-то не против наличия отсуствия сборщика мусора. Просто сопроводил примером утверждение WolfHound о замыканиях в языках без GC.
Глаза у меня добрые, но рубашка — смирительная!
Re[25]: Upwards funarg problem
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.02.17 09:07
Оценка:
Здравствуйте, alex_public, Вы писали:


_>На самом деле может быть что угодно (но естественно не так, как в твоём примере — очередном нарушение стандарта), смотря по ситуации. Ключевая разница будет в другом. В случае наличия необходимости работать с одним объектом в произвольных местах кода (кстати это весьма редкая ситуация, т.к. она мешает построению потокобезопасного по построению кода и соответственно применяется только если уж точно по другому нельзя), изначальное размещение нашей переменной будет произведено не на стеке, а в куче. А дальше там уже могут быть десятки разных способов как удобнее оформить этот факт, в зависимости от конкретной ситуации.


Вот это и есть ручное управление памятью. Забыть что-то или ошибиться при этом не составляет труда. А далее сиди тупи "где же ошибка?".

Когда ты пишешь на языке с GC таких проблем просто нет.

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

Ты должен будешь продумывать каждый указатель, каждое поле.

Если для программирования микроконтроллеров это приемлемо (в виду крайне ограниченности в ресурсах), то при программировании под десктоп или даже под телефон — это явное убийство времени и занятие своего мозга не продуктивным процессом.

Как говорил Бендер из Футурамы: "не следует доверять человеку работу машины".

Ну, а твои рассуждения о "тормозах" GC и невозможности применять языки с GC в разных дарайверах — это не более чем заблуждение. И очень не хочется тратить на них время.

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

И никто не запрещает вставлять в язык средства автоматизации ручного управления памятью.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.02.17 09:29
Оценка:
Здравствуйте, novitk, Вы писали:

N>Немерле в данный момент времени это никому не интересное legacy, где по желанию левой пятки поправляет простые косяки три (или уже один?) человека по необходимости. Никакого развития у него нет и не будет. Новый Немерле2 на Нитре, даже если и будет реализован, согласно заявленному функционалу (более навороченные макросы) будет вряд ли круче уже выпущенной скалы.


Какой-то кромешный ад заблуждений.

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

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

Скала не имеет никаких возможностей по расширению синтаксиса. Сделать на ней что-то вроде Ammy невозможно в принципе. Как не странно "легаси" язык в купе с фремворком на нем же написанным (по сути Нитра это библиотеки написанные на Немерле) это делать позволяет.

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

Что касается доработок именно языка, то Немерлу они не особо то и требуются. Еще раз повторю, что в Шарпе не появлиось пока ни одной возможности которая была бы реально необходима в Немерле.

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

Наоборот я хочу в Немерле 2 убрать хардкод имевшийся в Немерле 1. То есть сам язык будет даже меньше и будет написан на более высоком уровне.

Концепция Немерла — это решение сложных проблем за счет расширения языка и создания ДСЛ-ей. Эта концепция отлично показала себе на Нитре. Нужно только сделать процесс расширения еще проще и предоставить людям базу языка и набор удобных расширений.

Что касается платформы, то тут я с вами соглашусь. Иметь нативный вариант и вариант под Яву было бы здорово. Но мы все сразу не потяем. Мы дотнетчики и в других платформах придется разбираться. А времени и так не хватает. Задачи адски сложные и объемные. Качественная их реализация требует много усилий.

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

Советовать и критиковать очередь стоит. А очередь делать никто встать не спешит.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: Портирование нитры.
От: Слава  
Дата: 11.02.17 12:18
Оценка: +1
Здравствуйте, novitk, Вы писали:

N>Здравствуйте, alex_public, Вы писали:


_>>Ну я думаю, что на данном этапе язык, на котором написан сам их продукт, не так принципиален.

N>Нитру без Немерле использовать нельзя. То есть языками реализованными на ней пользоваться конечно можно, но если ты хочешь писать свой язык, то тебе придется узнать Немерле и еще пяток написанных на нем DSL.

А то какой-нибудь bison и yacc узнавать не надо.

_>>Во всяком случае пока есть кому заниматься его развитием.

N>Немерле в данный момент времени это никому не интересное legacy, где по желанию левой пятки поправляет простые косяки три (или уже один?) человека по необходимости. Никакого развития у него нет и не будет. Новый Немерле2 на Нитре, даже если и будет реализован, согласно заявленному функционалу (более навороченные макросы) будет вряд ли круче уже выпущенной скалы.

Я так думаю, что крутизна скалы её и погубит. Понаворотили ужасов каких-то
Re[26]: Upwards funarg problem
От: alex_public  
Дата: 11.02.17 16:01
Оценка:
Здравствуйте, Qbit86, Вы писали:

_>>"Ожидать `hello world!`" в подобном коде могут только люди не читавшие стандарт C++. )))

Q>Так ведь его просто так не прочитаешь — он же платный!

https://github.com/cplusplus/draft/blob/master/papers/n4140.pdf?raw=true — текст C++14 с точностью до пары незначительных опечаток.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4618.pdf — очень близкое к тому, что будет принято в этом году как C++17.

_>>На самом деле может быть что угодно (но естественно не так, как в твоём примере — очередном нарушение стандарта)

Q>Если я нарушаю Стандарт, так пусть бы компиялтор меня остановил. Компиляторы нормальных языков обычно так делают.

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

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

Q>Не вижу проблем работать с одним объектом в произвольных местах кода, если объект не изменяется.

Если не изменяется, то конечно не мешает многопоточности. ) Кстати, а как это будет реализовано например на C#? Ну т.е. как там выглядит замыкание, захватывающее константный объект? Хотя я что-то уже не припомню как там вообще объявить неизменяемую локальную переменную нашего класса...

_>>изначальное размещение нашей переменной будет произведено не на стеке, а в куче.

Q>Так ведь не начальное, а в процессе рефакторинга. Изменился контекст, и приходится переделывать тело лямбды. В языках со сборкой мусора в данном примере — нет.

Вообще то и здесь можно изначально написать в традициях "языков со сборкой мусора", только это будет длиннее в исходном коде (в смысле длиннее чем вариант на стеке, но при этом ровно так же, как и в каком-нибудь C#/Java) и намного менее эффективно при исполнение. Поэтому естественно все будут писать изначально в нормальном удобном и эффективном стиле, а в 0,001 проценте случаев (ты сам то понял какая у нас извращённая архитектура получилась в конце всех этих рассуждений? Функция, возвращающая из себя два замыкания, связанные между собой общими данными, созданными в этой функции — ты когда-нибудь видел такое на практике?), в которых уж точно нельзя написать по нормальному, сделают рефакторинг и напишут в точности как в языках со сборкой мусора.

Q>Я-то не против наличия отсуствия сборщика мусора. Просто сопроводил примером утверждение WolfHound о замыканиях в языках без GC.


Ещё раз поясняю. Проблем нет в принципе, никаких. Есть исключительно вопрос оптимизации. В большинстве случаев замыкания в C++ будут эффективнее чем в Java/C# и т.п., а в редких случаях будут работать точно так же.
Re[26]: Upwards funarg problem
От: alex_public  
Дата: 11.02.17 16:38
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>На самом деле может быть что угодно (но естественно не так, как в твоём примере — очередном нарушение стандарта), смотря по ситуации. Ключевая разница будет в другом. В случае наличия необходимости работать с одним объектом в произвольных местах кода (кстати это весьма редкая ситуация, т.к. она мешает построению потокобезопасного по построению кода и соответственно применяется только если уж точно по другому нельзя), изначальное размещение нашей переменной будет произведено не на стеке, а в куче. А дальше там уже могут быть десятки разных способов как удобнее оформить этот факт, в зависимости от конкретной ситуации.

VD>Вот это и есть ручное управление памятью. Забыть что-то или ошибиться при этом не составляет труда. А далее сиди тупи "где же ошибка?".

Где ручное то? Там всё автоматически будет. Или под ручным ты подразумеваешь тот факт, что программист должен будет выбрать сам (а не следовать навязанному языком) где размещать объект, на стеке (в 99,9% случаев на современном C++) или в куче (в 0,1% случаев на C++ и в 100% случаев на C#)?

VD>Когда ты пишешь на языке с GC таких проблем просто нет.


Да, да, и поэтому подобные http://xoofx.com/blog/2015/10/08/stackalloc-for-class-with-roslyn-and-coreclr/ статьи мне только мерещатся. ))) Особенно мне там нравится заголовок "Less Managed, More Control". Хотя результат в конце статьи тоже выглядит не плохо:

So? What are the results of these changes? If you run the program above:
The stack version will run in 400 ms with 0 GC collect
The heap version will run in 5000 ms with 100+ GC collect


VD>Все многократно осложняется когда объектов (и вообще кода) много и когда они имеют не иерархическую структуру (имеются обратные ссылки или иными словами произвольный граф объектов с перекрестными ссылками.


Ну, да, это как раз главное преимущество языков типа Java/C# — намутите любой кривой код и он всё равно кое-как заработает. Идеально для написания всяческого нетребовательного энтерпрайза слабыми внутренними программистами. Только вот непонятно что ты хочешь ловить в этой среде со своим сложным инструментом (в котором главным преимуществом является МП, которое в принципе на уровне мозга может воспринимать только часть программистов).

VD>Ты должен будешь продумывать каждый указатель, каждое поле.

VD>Если для программирования микроконтроллеров это приемлемо (в виду крайне ограниченности в ресурсах), то при программировании под десктоп или даже под телефон — это явное убийство времени и занятие своего мозга не продуктивным процессом.
VD>Как говорил Бендер из Футурамы: "не следует доверять человеку работу машины".

Только вот почему-то я ничего не продумываю, а пишу в 99,9% случаев просто объект класса (а не ссылку или указатель). Потому что в нормальном коде ситуации с расшариванием ссылок на нестатические объекты крайне редка. Причём в этом самом редком случае опять же есть полностью известный алгоритм действий (в этом случае получается полный аналог кода на Java/C#), так что опять же не надо даже включать мозг. )))

VD>Ну, а твои рассуждения о "тормозах" GC и невозможности применять языки с GC в разных дарайверах — это не более чем заблуждение. И очень не хочется тратить на них время.


В современных ОС — невозможно.

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


Естественно GC далеко не главная причина тормозов Jvm/.Net. Главная проблема с GC не в медленности кода, а совсем в другом.

VD>И никто не запрещает вставлять в язык средства автоматизации ручного управления памятью.


Для этого в языке должно быть доступно это самое ручное управление.
Re: Портирование нитры.
От: alex_public  
Дата: 11.02.17 17:02
Оценка:
VladD2,

У меня тут в процессе дискуссии появилась ещё одна мысль. Возможно я бы смог поучаствовать в развитие проекта не просто для фана, а уже по делу. Но для возможности этого мне надо знать ответ на один вопрос. Вот предположим у тебя есть твоя доработанная Nitra. И при этом кто-то написал для неё полноценный бэкенд через LLVM. Сможешь ли ты сделать на базе этого точную копию скажем C++14 (это естественно не итоговая цель, а важнейший промежуточный шаг, хотя и он при определённом подходе может принести вам коммерческий успех)? Ну чтобы итоговый продукт мог компилировать произвольный C++ исходник и результат не отличался от clang'а. И при этом естественно работала бы поддержка в IDE.
Re[23]: Портирование нитры.
От: WolfHound  
Дата: 11.02.17 18:36
Оценка: +1
Здравствуйте, alex_public, Вы писали:

_>Где там? Ты можешь написать на Java или C# драйвер для ядра винды или линуха? О чём вообще речь? )

Где я сказал жаба или C#? Я сказал ГЦ.

_>Естественно не нужно. Там всё выделение решается через глобальные (статически, причём компоновщик контролирует чтобы всё влезло) и локальные (тут, на стеке и реализуется вся "динамика") переменные. Вопрос в том, чтобы язык позволял использовать все свои возможности без требования необходимости работающего "new". Вот C++ это отлично может — даже в таких условиях работает всё, включая и замыкания и контейнеры с алгоритмами из STL и всё остальное. Так вот если допустим сделать нативный вариант Nemerle в лоб, без какой либо адаптации (типа отсутствия обязательного GC и т.п.), то по твоему он сможет аналогичное? )

Если сделать замыкания такими же убогими как в С++ то сможет.
Только радости от этого никакой.
И я вообще считаю большой ошибкой делать один язык для систем где на всё 6К и где память измеряется гигабайтами.

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

_>А что ты называешь управляемой ОС? Такую, в API которой не присутствует разновидность VirtualFree и при этом есть встроенный глобальный сборщик мусора? Или что?

Midori was built on a foundation of three kinds of safety: type, memory, and concurrency-safety. These safeties eliminated whole classes of bugs “by-construction” and delivered significant improvements in areas like reliability, security, and developer productivity. They also fundamentally allowed us to depend on the type system in new and powerful ways, to deliver new abstractions, perform novel compiler optimizations, and more. As I look back, the biggest contribution of our project was proof that an entire operating system and its ecosystem of services, applications, and libraries could indeed be written in safe code, without loss of performance, and with some quantum leaps forward in several important dimensions.

И в мидори нет глобального сборщика мусора.
Глобальный сборщик мусора зло и не нужен.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Портирование нитры.
От: WolfHound  
Дата: 11.02.17 18:44
Оценка: :)
Здравствуйте, alex_public, Вы писали:

_>Сможешь ли ты сделать на базе этого точную копию скажем C++14

Технически (с некоторыми доработками нитры) это возможно. Но на практике из-за запутанности и монструозности С++ это не один десяток человеколет работы.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[24]: Портирование нитры.
От: alex_public  
Дата: 11.02.17 21:34
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Где там? Ты можешь написать на Java или C# драйвер для ядра винды или линуха? О чём вообще речь? )

WH>Где я сказал жаба или C#? Я сказал ГЦ.

Это было для простоты формулировки. Ну ОК, давай возьми любой другой язык с обязательным GC. Вот например можно Go взять (он даже нативный как раз). И попробуй написать на нём драйвер под винду или линух. )))

_>>Естественно не нужно. Там всё выделение решается через глобальные (статически, причём компоновщик контролирует чтобы всё влезло) и локальные (тут, на стеке и реализуется вся "динамика") переменные. Вопрос в том, чтобы язык позволял использовать все свои возможности без требования необходимости работающего "new". Вот C++ это отлично может — даже в таких условиях работает всё, включая и замыкания и контейнеры с алгоритмами из STL и всё остальное. Так вот если допустим сделать нативный вариант Nemerle в лоб, без какой либо адаптации (типа отсутствия обязательного GC и т.п.), то по твоему он сможет аналогичное? )

WH>Если сделать замыкания такими же убогими как в С++ то сможет.
WH>Только радости от этого никакой.

Ну тебе может и никакой, а другим нравится (что они в разы быстрее). Деланием продукта в ориентации на свои вкусы вы занимаетесь уже давно и успехов (я не про технические) пока не видно. Может стоит попробовать поделать что-то в ориентации на вкусы потенциальных пользователей? )

WH>И я вообще считаю большой ошибкой делать один язык для систем где на всё 6К и где память измеряется гигабайтами.


Более того, я думаю ты в курсе что те же самые языки (хотя ещё плюс Фортран, которого нет на МК) доминируют на мейнфреймах и суперкомпьтерах... ))) Ну а насчёт того ошибка это или нет... Быть может это ты чего-то не понимаешь, а не вся индустрия? )

_>>А что ты называешь управляемой ОС? Такую, в API которой не присутствует разновидность VirtualFree и при этом есть встроенный глобальный сборщик мусора? Или что?

WH>

WH>Midori was built on a foundation of three kinds of safety: type, memory, and concurrency-safety. These safeties eliminated whole classes of bugs “by-construction” and delivered significant improvements in areas like reliability, security, and developer productivity. They also fundamentally allowed us to depend on the type system in new and powerful ways, to deliver new abstractions, perform novel compiler optimizations, and more. As I look back, the biggest contribution of our project was proof that an entire operating system and its ecosystem of services, applications, and libraries could indeed be written in safe code, without loss of performance, and with some quantum leaps forward in several important dimensions.

WH>И в мидори нет глобального сборщика мусора.
WH>Глобальный сборщик мусора зло и не нужен.

Т.е. я правильно тебя понял, что именно архитектура Midori кажется тебе идеалом ОС будущего?
Re[3]: Портирование нитры.
От: alex_public  
Дата: 11.02.17 21:41
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Сможешь ли ты сделать на базе этого точную копию скажем C++14

WH>Технически (с некоторыми доработками нитры) это возможно. Но на практике из-за запутанности и монструозности С++ это не один десяток человеколет работы.

Хм, если инструмент, позиционирующийся как средство для лёгкого создания новых языков, будет требовать десяток человеколет для создания одного языка (причём речь по сути только о фронтенде), то зачем он вообще такой нужен?
Re[4]: Портирование нитры.
От: WolfHound  
Дата: 11.02.17 22:28
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Хм, если инструмент, позиционирующийся как средство для лёгкого создания новых языков, будет требовать десяток человеколет для создания одного языка (причём речь по сути только о фронтенде), то зачем он вообще такой нужен?

Я говорю не вообще, а конкретно про С++.
Такое впечатление что его создавали специально для того чтобы никто не смог компилятор написать.
Да никто и не смог. Есть хоть один компилятор который на 100% соответствует стандарту?
А уж как бедные создатели ИДЕ страдают Я обсуждал проблемы этого дела с людьми которые этим занимаются. Там АД!
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[25]: Портирование нитры.
От: WolfHound  
Дата: 11.02.17 22:28
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Это было для простоты формулировки. Ну ОК, давай возьми любой другой язык с обязательным GC. Вот например можно Go взять (он даже нативный как раз). И попробуй написать на нём драйвер под винду или линух. )))

Нативности тут недостаточно. Нужен ещё и инструментарий.
Он для ГО есть?

_>Ну тебе может и никакой, а другим нравится (что они в разы быстрее). Деланием продукта в ориентации на свои вкусы вы занимаетесь уже давно и успехов (я не про технические) пока не видно. Может стоит попробовать поделать что-то в ориентации на вкусы потенциальных пользователей? )

Так разным пользователям нужно разное.
Вот если пользователь готов платить тогда другое дело. Бросим всё и будем развивать проект в нужном этому пользователю направлении.
А пока у нас уже есть пользователь, который сделал на нитре коммерческий продукт.
http://www.ammyui.com/

_>Более того, я думаю ты в курсе что те же самые языки (хотя ещё плюс Фортран, которого нет на МК) доминируют на мейнфреймах и суперкомпьтерах... ))) Ну а насчёт того ошибка это или нет... Быть может это ты чего-то не понимаешь, а не вся индустрия? )

А давай сравним с количеством жабы и .НЕТа в индустрии.

Тут у нас два принципиально разных сценария.
1)Каждый байт на счету.
2)Инфраструктуру в несколько мегабайт никто не заметит и на перерасход памяти в десяток другой процентов всем наплевать. Но при этом есть сотни мегабайт кода, который пишут сотни программистов.

_>Т.е. я правильно тебя понял, что именно архитектура Midori кажется тебе идеалом ОС будущего?

Примерно. Там много что можно улучшить. Но глобальное направление выбрано верно.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[26]: Портирование нитры.
От: alex_public  
Дата: 12.02.17 01:29
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Это было для простоты формулировки. Ну ОК, давай возьми любой другой язык с обязательным GC. Вот например можно Go взять (он даже нативный как раз). И попробуй написать на нём драйвер под винду или линух. )))

WH>Нативности тут недостаточно. Нужен ещё и инструментарий.
WH>Он для ГО есть?

Причём тут Go? ) Он просто для примера был. Я же тебе написал, выбери ЛЮБОЙ, какой тебе нравится язык с обязательным сборщиком мусора и продемонстрируй как на нём написать драйвер ядра для винды или линуха (он же андроид, в этом смысле). Ты же сказал что с этим проблем нет...

_>>Ну тебе может и никакой, а другим нравится (что они в разы быстрее). Деланием продукта в ориентации на свои вкусы вы занимаетесь уже давно и успехов (я не про технические) пока не видно. Может стоит попробовать поделать что-то в ориентации на вкусы потенциальных пользователей? )

WH>Так разным пользователям нужно разное.

Безусловно. Для этого проводят исследования рынка и т.п. Вы делали подобное? Имеете представление в каких областях может быть востребована ваша технология? )

WH>Вот если пользователь готов платить тогда другое дело. Бросим всё и будем развивать проект в нужном этому пользователю направлении.


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

WH>А пока у нас уже есть пользователь, который сделал на нитре коммерческий продукт.

WH>http://www.ammyui.com/

Я видел. ) Кстати, вот скажи, какую основную целевую аудиторию ты видишь у Nitra:
1. встраиваемые в приложения простенькие скриптовые (правда тогда смысл от вашей поддержки в IDE теряется, но статические языки для таких целей обычно не применяются) языки (типа js, lua и т.п.)
2. простенькие статические DSL для каких-то узких утилитарных задач с поддержкой их редактирования в больших IDE (по сути случай ammy)
3. полноценные универсальные статические языки, слегка кастомизируемые для конкретных проектов и с полной поддержкой больших iDE

_>>Более того, я думаю ты в курсе что те же самые языки (хотя ещё плюс Фортран, которого нет на МК) доминируют на мейнфреймах и суперкомпьтерах... ))) Ну а насчёт того ошибка это или нет... Быть может это ты чего-то не понимаешь, а не вся индустрия? )

WH>А давай сравним с количеством жабы и .НЕТа в индустрии.

Ну в среднем это будет близко. Т.е мир C/C++ сравним с миром Java (про .net тут смешно вспоминать). Только задачи у них очень разные при этом, конкурирующие только в очень малом количестве областей. И главное эта разность не только по названиям, но и по неординарности задач, уровню программистов и т.п... )))

WH>Тут у нас два принципиально разных сценария.

WH>1)Каждый байт на счету.
WH>2)Инфраструктуру в несколько мегабайт никто не заметит и на перерасход памяти в десяток другой процентов всем наплевать. Но при этом есть сотни мегабайт кода, который пишут сотни программистов.

Ну для начала там не только перерасход памяти, но и замедление и ещё ряд негативных моментов. Но пока это всё экономически выгодно решать покупкой ещё одного сервера (т.е. для миров МК, мобильных устройств, суперкомпьютеров и с недавних пор уже и десктопов это не будет действовать) подобные решения будут процветать и дальше. Более того, языки типа Java и C# являются только промежуточным звеном в этой цепи, а в её конце наблюдаются скорее всяческие JS, Python и им подобные, которые ещё проще для работы. И кстати я сам с удовольствием пользуюсь такими решениям (это чтобы ты не думал, что у меня GC-фобия — просто всему своё место) на моём любимом Питончике.

_>>Т.е. я правильно тебя понял, что именно архитектура Midori кажется тебе идеалом ОС будущего?

WH>Примерно. Там много что можно улучшить. Но глобальное направление выбрано верно.

А как ты думаешь, почему этот проект не взлетел (ну кроме теории заговора менеджеров MS)? И есть ли шансы на реализацию (не в смысле сделать работающим, а в смысле сделать интересным хоть для каких-то групп пользователей) подобного в ближайшем будущем?
Re[5]: Портирование нитры.
От: alex_public  
Дата: 12.02.17 01:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Хм, если инструмент, позиционирующийся как средство для лёгкого создания новых языков, будет требовать десяток человеколет для создания одного языка (причём речь по сути только о фронтенде), то зачем он вообще такой нужен?

WH>Я говорю не вообще, а конкретно про С++.
WH>Такое впечатление что его создавали специально для того чтобы никто не смог компилятор написать.
WH>Да никто и не смог. Есть хоть один компилятор который на 100% соответствует стандарту?
WH>А уж как бедные создатели ИДЕ страдают Я обсуждал проблемы этого дела с людьми которые этим занимаются. Там АД!

Хм, ну вот в том же Netbeans анализатор C++ кода работает просто отлично. А при этом там всё построено на банальном ANTLR, про который я не раз тут слышал от вас, что Nitra намного круче.
Re[23]: Портирование нитры.
От: novitk США  
Дата: 12.02.17 04:04
Оценка:
Здравствуйте, Слава, Вы писали:

С>А то какой-нибудь bison и yacc узнавать не надо.

это DSL-и, коих и в нитре, как собак не резаных. Немерле там по аналогии с яком в нитре вместо C.

С>Я так думаю, что крутизна скалы её и погубит. Понаворотили ужасов каких-то

Go и Яваскрипт наше все!
Re[23]: Портирование нитры.
От: novitk США  
Дата: 12.02.17 06:25
Оценка: +2 -1
Здравствуйте, VladD2, Вы писали:

VD>Какой-то кромешный ад заблуждений.

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

VD>Немерл уже 10 лет превосходит Шарп и вероятность того, что Шарп впитает все возможности в ближайшие 10 лет не велика.

Немерле сейчас намного хуже шарпа. Языковые фичи шарпа подтянулись (по макросам консенсуса в МS пока очевидно нет), а нормальной экосистемы в Немерле, как не было 10 лет назад, так и нет.

VD>Скала не имеет никаких возможностей по расширению синтаксиса. Сделать на ней что-то вроде Ammy невозможно в принципе.

Во-первых, сравнение нитры со скалой это апельсины с яблоками. Во-вторых, на скале отлично пишутся встроенные ДСЛи (лучше чем на Немерле). В-третих, самая крутая фишка в Аммy это не Нитра, а живая модель. Я был удивлен, что до Ammy в WPF этого не было. Я могу тебе показать несколько проектов декларативных UI на питоне с подобным функционалом. При этом там не только надязык, а еще и полностью семантика (аналог WPF) полностью сделана.

VD>Как не странно "легаси" язык в купе с фремворком на нем же написанным (по сути Нитра это библиотеки написанные на Немерле) это делать позволяет.

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

VD>Это как раз Скала не нужна. Язык переусложнен и выдает медленный код бай дизайн.

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

VD>Наоборот я хочу в Немерле 2 убрать хардкод имевшийся в Немерле 1. То есть сам язык будет даже меньше и будет написан на более высоком уровне.

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

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

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

VD>Советовать и критиковать очередь стоит. А очередь делать никто встать не спешит.

Я не критикую, а помогаю алексу выбрать точку приложение усилия.
Re[23]: Портирование нитры.
От: novitk США  
Дата: 12.02.17 06:48
Оценка: +1
Здравствуйте, alex_public, Вы писали:

_>Лично мне был бы интересен язык с возможностями современного C++ и наличием макросов в стиле Scala/Nemerle. Одно время я думал, что такой язык появится уже вот вот: Rust. Но при ближайшем рассмотрение оказалось, что он менее удобен чем C++ — в одних местах они слишком перемудрили, а в других наоборот слишком упростили.


Еще твоим целям отвечает https://nim-lang.org/, но я до сих пор не понимаю зачем тебе Nemerle или Nitra.
Nemerle1 это застывшая какашка, без всякого шанса стать нативной или плюсоподобной.
Немерле2 пока существует только в голове Влада даже для .NET, то есть трогать тут просто нечего.
Nitra возможно облегчит тебе создания нового языка, но для этого надо бы сначала огласить чем он будет лучше того, что уже есть.
Re[6]: Портирование нитры.
От: WolfHound  
Дата: 12.02.17 14:12
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Хм, ну вот в том же Netbeans анализатор C++ кода работает просто отлично. А при этом там всё построено на банальном ANTLR, про который я не раз тут слышал от вас, что Nitra намного круче.

Что оно там анализирует?
Сколько на него потрачено усилий?
На сколько оно соответствует стандарту?
Что с ним происходит при встрече с Boost::Preprocessor и Boost::MPL одновременно?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[27]: Портирование нитры.
От: WolfHound  
Дата: 12.02.17 14:12
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Причём тут Go? ) Он просто для примера был. Я же тебе написал, выбери ЛЮБОЙ, какой тебе нравится язык с обязательным сборщиком мусора и продемонстрируй как на нём написать драйвер ядра для винды или линуха (он же андроид, в этом смысле). Ты же сказал что с этим проблем нет...

Ох. Сам по себе ГЦ в ядре не проблема.
Но есть ли инструменты, которые прямо сейчас позволяют скомпилировать код с ГЦ для ядра винды или линукса я не знаю.

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

Вот мы и вкладываем в то что позволит сделать полнофункциональный проект с наименьшими затратами ресурсов.

_>Я видел. ) Кстати, вот скажи, какую основную целевую аудиторию ты видишь у Nitra:

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

_>1. встраиваемые в приложения простенькие скриптовые (правда тогда смысл от вашей поддержки в IDE теряется,

Это ещё почему? Нашу поддержку ИДЕ можно легко встроить куда угодно. В том числе в своё приложение. Нужно только реализовать довольно простой интерфейс, работающий через пайпы (можно переделать на сокеты).
Учитывая то что там и так весь код общения генерируется макросами можно легко генерировать интерфейс для других языков.

_>но статические языки для таких целей обычно не применяются) языки (типа js, lua и т.п.)

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

_>И главное эта разность не только по названиям, но и по неординарности задач, уровню программистов и т.п... )))

Это феерическое заблуждение.

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

Это не правда. Если делать грамотно, то у компилятора оказывается очень много дополнительной информации что позволяет лучше оптимизировать код.
Так что оно будет на том же уровне или быстрее. Пример мидори это подтверждает.

_>Более того, языки типа Java и C# являются только промежуточным звеном в этой цепи, а в её конце наблюдаются скорее всяческие JS, Python и им подобные, которые ещё проще для работы.

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

_>И кстати я сам с удовольствием пользуюсь такими решениям (это чтобы ты не думал, что у меня GC-фобия — просто всему своё место) на моём любимом Питончике.

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

_>А как ты думаешь, почему этот проект не взлетел (ну кроме теории заговора менеджеров MS)?

С инженерной точки зрения я не вижу ни одной причины закрывать проект.

_>И есть ли шансы на реализацию (не в смысле сделать работающим, а в смысле сделать интересным хоть для каких-то групп пользователей) подобного в ближайшем будущем?

Основная проблема в том, что у кучи пользователей в голове те же заблуждения что у тебя.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[26]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.17 21:00
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Нативности тут недостаточно. Нужен ещё и инструментарий.

WH>Он для ГО есть?

у Го нет возможности энтри поинт для драйвера сделать. Ну, и там с адресной арифметикой, вроде как, плохо. В остальном никаких противопоказаний нет.

Если же в языке будут нужные фичи, то ничего, кроме домыслов, не помешает написать на нем дрова.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.17 21:18
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Причём тут Go? ) Он просто для примера был. Я же тебе написал, выбери ЛЮБОЙ, какой тебе нравится язык с обязательным сборщиком мусора и продемонстрируй как на нём написать драйвер ядра для винды или линуха (он же андроид, в этом смысле). Ты же сказал что с этим проблем нет...


http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.92.1892&amp;rep=rep1&amp;type=pdf
https://lwn.net/Articles/352519/
http://dl.acm.org/citation.cfm?id=1408654.1408657

Ты лучше объясни, что может помешать сделать язык с GC на котором можно будет писать драйверы?

Что ты видишь в GC такого, что не позволило бы запускать его в режиме ядра?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Портирование нитры.
От: alex_public  
Дата: 12.02.17 21:22
Оценка:
Здравствуйте, novitk, Вы писали:

_>>Лично мне был бы интересен язык с возможностями современного C++ и наличием макросов в стиле Scala/Nemerle. Одно время я думал, что такой язык появится уже вот вот: Rust. Но при ближайшем рассмотрение оказалось, что он менее удобен чем C++ — в одних местах они слишком перемудрили, а в других наоборот слишком упростили.

N>Еще твоим целям отвечает https://nim-lang.org/, но я до сих пор не понимаю зачем тебе Nemerle или Nitra.

Да, он мне как раз сильно понравился, когда я его первый раз увидел (пару лет назад по ссылке на этом же форуме). Главный плюс в том, что элементарно уйти на низкий уровень (в его случае это уровень C), если очень надо. Ну и подключение C библиотек естественно тоже. А главный минус в том, что его приятный питоноподобный синтаксис является всё же оригинальным со всеми соответствующими выводами для IDE (а я уже давно привык к удобным мощным IDE)... Ну и плюс мне тогда показалось, что у него сообщество на тот момент меньше чем даже у Nemerle (сейчас уже не уверен).

N>Nemerle1 это застывшая какашка, без всякого шанса стать нативной или плюсоподобной.

N>Немерле2 пока существует только в голове Влада даже для .NET, то есть трогать тут просто нечего.
N>Nitra возможно облегчит тебе создания нового языка, но для этого надо бы сначала огласить чем он будет лучше того, что уже есть.

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

Потом, в ходе дискуссии, мне пришла в голову мысль, что раз уж заявлено лёгкое создание произвольных языков, то почему бы не сделать реально полезное мне для дела, а не просто для фана (и тогда это может быть уже на совсем другом уровне и с другими ресурсами). Для этого в начале надо сделать (с меня только бэкенд на базе LLVM) копию C++ на Nitra, чтобы потом легко делать (уже мне, и тут у меня есть готовый список добавлений) надстройку в нужном направление. Причём такая система по построению будет совместима со всеми библиотеками C/C++, иметь поддержку для IDE (от Nitra) и великолепную производительность (от LLVM). Однако если WolfHound пишет, что такая схема будет требовать десятки человека лет, то это опять же теряет смысл, т.к. проще тогда самому разобраться во фронтенде clang'а или gcc, и в анализаторе кода моей IDE — всё это доступно в исходниках. Просто я думал что это слишком сложно (цена не стоит того результата), а на Nitra будет легко. Но раз нет, то нет. Правда тогда опять же появляется вопрос зачем вообще нужна Nitra, только для мелких утилитарных DSL'ей?
Re[27]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.17 21:32
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Я видел. ) Кстати, вот скажи, какую основную целевую аудиторию ты видишь у Nitra:

_>1. встраиваемые в приложения простенькие скриптовые (правда тогда смысл от вашей поддержки в IDE теряется, но статические языки для таких целей обычно не применяются) языки (типа js, lua и т.п.)
_>2. простенькие статические DSL для каких-то узких утилитарных задач с поддержкой их редактирования в больших IDE (по сути случай ammy)
_>3. полноценные универсальные статические языки, слегка кастомизируемые для конкретных проектов и с полной поддержкой больших iDE

А зачем ограничивать варианты использования вообще? Nitra — это универсальный инструмент.

1. Nitra — это основа для создания полностью расширяемых (во время выполнения) языков программирования. В частности база для Nemerle 2 (название может и поменяться). Такие языки позволят легко и качественно встраивать внешние (чужие) расширения. В том числе и встроенные DSL-и.
2. Nitra — это средство разработки полноценных языков программирования (компиляторов, интерпретаторов и тулинга, т.е. IDE, linter-ов, ...).
3. Nitra — это средство создания внешних DSL.
4. Nitra — это средство разработки IDE-плагинов, компиляторов и прочего тулинга для уже имеющихся языков. Причем использование Nitra позволяет существенно поднять уровень кода, уменьшить его объемы и сделать код легче контролируемым.
5. Nitra — это средство создания препроцессоров вроде Ammy.

А будут это скрипты или компилируемые языки в общем-то по фигу. Вот, например, Ammy вообще генерирует XAML, т.е. по сути препроцессор.

Зачем выбирать какую-то там лишившую аудиторию мне не ясно. Ниша и так очень узка. Люде занимающихся разработкой языков пока что крайне мало.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Портирование нитры.
От: Слава  
Дата: 12.02.17 21:47
Оценка:
Здравствуйте, alex_public, Вы писали:

_> Однако если WolfHound пишет, что такая схема будет требовать десятки человека лет, то это опять же теряет смысл, т.к. проще тогда самому разобраться во фронтенде clang'а или gcc, и в анализаторе кода моей IDE — всё это доступно в исходниках. Просто я думал что это слишком сложно (цена не стоит того результата), а на Nitra будет легко. Но раз нет, то нет. Правда тогда опять же появляется вопрос зачем вообще нужна Nitra, только для мелких утилитарных DSL'ей?


А при чём тут Nitra, если сам по себе стандарт С++ — ПРЕОГРОМНЫЙ? То есть, объём работы объективно большой, хоть на нитре, хоть на чём. Тут надо скорее думать, нужен ли миру еще один компилятор С++, а если нужен — то где бы взять одного спонсора и десять студентов, чтобы они год вбивали описание С++ на нитре.
Re[24]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.17 22:36
Оценка:
Здравствуйте, novitk, Вы писали:

N>Конечно нет. Язык становится легаси, когда на нем не пишут новые программы и у него нет развития.


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

Язык становится легаси только, если появляется более перспективный язык и люди переходят на него.

У нас же стуация такая. Есть реально морально устаревшие языки вроде С/С++, Шарпа и Явы. Но используют именно их, потому что:
1. Реально есть много легаси-кода.
2. Выбор языков делается не осмысленно, а брэндам и пиару.

Вот есть Котлин, Скала, но люди продолжают писать на Яве.

Есть Немерл, а люди продолжают писать на Шарпе.

Есть Ди, Раст, ... но люди продолжают писать на С++.

N>Немерле сейчас намного хуже шарпа. Языковые фичи шарпа подтянулись (по макросам консенсуса в МS пока очевидно нет), а нормальной экосистемы

в Немерле, как не было 10 лет назад, так и нет.

Это полное непонимание или намеренная неправда. По языковым фичам Шрап даже то что будет в VS 2017 не дотягивает до Немерла десятилетней дановсти. Какие-то фичи появились, но далеко не все и общий уровень удобства просто не сравним. Те же алгебраических типов данных нет. Вместо паттерн-матчинга сделана убогая пародия.

Про макросы и говорить нечего.

Я не знаю, что ты там себе подразумеваешь под экосистемой, но что нет у Немерла — это РеШарпера. Но это опять таки следствие того, что хомячки выбирают не мозгом, а задом. А библиотеки и т.п. у Немерла такие как и у других дотнет-языков. Даже более того, в F# есть определенные проблемы с использованием библиотек дотнета, а в Немерле их нет.

N>Во-первых, сравнение нитры со скалой это апельсины с яблоками. Во-вторых, на скале отлично пишутся встроенные ДСЛи (лучше чем на Немерле).


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

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

N>В-третих, самая крутая фишка в Аммy это не Нитра, а живая модель.


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

Ну, а то что Ammy умеет перезагружать XAML на лету — это фича самого WPF и заслуга автора Ammy, который эту возможность додумался задействовать.

N>Я был удивлен, что до Ammy в WPF этого не было.


Не было поддержки в IDE. А возможность менять бинарные baml-ы была изначально.

Меня вот интересует другое, данная подмена намеренная, или ты просто с логикой накосил? Мы говорили о разработке DSL, а ты подменяешь обсуждение, на обсуждение фич DSL-я. Что реализация на Скале как-то может повлиять на наличие или отсутствие этой загрузки?

N>Я могу тебе показать несколько проектов декларативных UI на питоне с подобным функционалом. При этом там не только надязык, а еще и полностью семантика (аналог WPF) полностью сделана.


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

В прочем, особо не удивлюсь их наличию. Питон (как и многие скрипты) не плохо ДСЛ-изируется. Вопрос только в только в тормозах таких решений, в выразительности и в предоставляемом сервисе. У Питона то самого проблемы с интеллисенсом, а уже о интелисенсе в ДСЛ-ях и говорить не приходится. Тут же ты получаешь полноценный язык.

N>Что странного в том, что вы написали фрейморк интеграцией раскраски и подсказок внешних языков для VisualStudio?


А ты попробуй. Я не хочу тебя огорчать, но ты только языком горазд молоть. Извращаешь все и вся. Нитра это немножко (хе-хе) больше чем просто какая-то там раскраска. Как там твои решения на Питоне все раскаршивают? Интеллисенс предоставляют?

N>Руки у вас вроде на месте. При чем здесь немерле?


Это язык на котором такой продут можно реализовать нашими силами. И Нитра была придумана в попытках осмыслить то как правильно реализовать Немерл. Открою тебе небольшой сикрет. Язык вроде Немерле очень не просто реализовать вообще. А реализовать его качественно и с поддержкой IDE вообще еще тот вызов. МС просто на переписывание C# на C# убило 6 лет. И это с ресурсами и без малейшего намека на расширяемость. Мы же работали в троем 3.5 года. Если бы мы взяли за основу C# или C++, проект неминуемо был бы завален.

N>Абсолютно также за это время можно было бы написать это на яве, шарпе или питоне (на питоне быстрее! ).


Только в твоем воображении. Ты нихрена не знаешь о устройстве и сложности Нитры, но судить о них на основе собственных домыслов.

VD>>Это как раз Скала не нужна. Язык переусложнен и выдает медленный код бай дизайн.

N>В Скале есть проблемы, но ничего лучше для общего программирования сейчас в статике просто нет.

Ага, ага. То то в ДжетБрэйс пилят Котлин, который бай дизайн упрощенная версия Скалы.

Вот тот же Немерл ничем не уступает Скале по возможностям, но при этом значительно проще его в этом само "общем программировании". Вот только возможности по пиру несоизмеримы. Да и забил я в свое время на него. Надоело, с такими как ты, сражаться.

N>Убирать ты можешь что хочешь, но популярности это не даст.


Популярность есть у очень малого количества языков. И в большинстве случаев за ними стоят серьезные конторы. И действительно благодаря таким как ты (коих большинство) никакие фичи не привлекут людей пользоваться языком. У вас всегда будет 100500 контраргументов высосанных из пальца.

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

Но я все же попробую. Это самое по себе очень интересная задача. И я хочу иметь такой язык.

Учитывая, что язык будет полным констрктором (без ограничений, что были у Немрела), возможно это привлечет людей вроде ionoy (автора Ammy) и alex_public.

Возможно попробую заинтересовать проектом какую-нибудь большую платформу.

N> Для популярности без крутого бренда нужно иметь уникальные фишки (сейчас желательно в системе типов или в рантайме, так как простые плюшки уже есть везде), а у вас их нет. "Свободный расширяемый синтакс" никому нафиг не сдался.


Наша основная фишка — возможность добавления любых фишек. Причем как авторами, так и сторонними лицами. Это всем фишкам фишка.

Даже у Немерла 1 было не мало случаев, когда приходил орел, вроде тебя, и говорил — "А у вас нет такой-то фишки". Ему отвечали — "Так сделай!". Некоторые из них брались и делали. Например, так появились Computation-Expression.

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


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

Твоя категоричность вообще умиляет.

N>Я не критикую, а помогаю алексу выбрать точку приложение усилия.


Откровенно говоря ты просто трепишься. При этом выдаешь море заблуждений с зашкаливающей категоричностью.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.17 22:42
Оценка:
Здравствуйте, novitk, Вы писали:

С>>А то какой-нибудь bison и yacc узнавать не надо.

N>это DSL-и, коих и в нитре, как собак не резаных. Немерле там по аналогии с яком в нитре вместо C.

Ну, так не пофигу ли что изучать ДСЛ bison-а или ДСЛ Нитры?

В Нитре их не дофига, а в самый раз. Все они упрощают решения той или иной проблемы. Выбор то не велик. Или учить ДСЛ и потом кратко и понятно решать проблему, или пилить все снуля попутно узнавая все тонкости предметной области.

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

Мы же накрываем не только парсинг, но и типизацию. Плюс та самая инфраструктура. Из коробки будет код для серьезных языков (причем не одного). Куча библиотечного кода. Поддержка той же IDE из коробки. Причем не просто подсветка, как ты пытаться изложить. Это полноценный движок IDE. И для его поддержки практически не надо писать специализированный код.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.17 22:56
Оценка:
Здравствуйте, alex_public, Вы писали:

_>У меня тут в процессе дискуссии появилась ещё одна мысль. Возможно я бы смог поучаствовать в развитие проекта не просто для фана, а уже по делу. Но для возможности этого мне надо знать ответ на один вопрос. Вот предположим у тебя есть твоя доработанная Nitra. И при этом кто-то написал для неё полноценный бэкенд через LLVM. Сможешь ли ты сделать на базе этого точную копию скажем C++14 (это естественно не итоговая цель, а важнейший промежуточный шаг, хотя и он при определённом подходе может принести вам коммерческий успех)? Ну чтобы итоговый продукт мог компилировать произвольный C++ исходник и результат не отличался от clang'а. И при этом естественно работала бы поддержка в IDE.


Теоретически это возможно. Вопрос лишь в том, что мне не хочется тратить свое время на С++. Кроме того, что это определенный объем работ связанный с перенесением синтаксиса и типизацией, там еще нужно решить ряд проблем связанных с препроцессором. Все инклюды в файлах нужно кэшировать и запускать обработку не с нуля, а с заранее разобранными инклюдами. Именно по этому С++ является плохо IDE-зируемым языком и при реализации для него движков IDE обычно прибегают к множеству хаков.

Я могу консультировать того кто этим займется и помогать ему (им) трудных случаях. Но у самого меня есть еще много более приоритетных задач. Так мне сначала хочется сделать Nemerle 2 и Cx#
Автор: VladD2
Дата: 12.01.17
. А чтобы заняться ими, я должен довести до приличного состояния поддержку IDE для самой Нитры (нитра пока что использует наш старый движок типзиации.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.17 22:58
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Технически (с некоторыми доработками нитры) это возможно. Но на практике из-за запутанности и монструозности С++ это не один десяток человеколет работы.


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

Сложность грамматики там соизмерима с Шарпом. Все сложности упираются в шаблоны и прероцессор. А это как бы даже не особо связано грамматикой и семантикой.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Портирование нитры.
От: WolfHound  
Дата: 12.02.17 23:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Сложность грамматики там соизмерима с Шарпом. Все сложности упираются в шаблоны и прероцессор. А это как бы даже не особо связано грамматикой и семантикой.

1)Вот именно эта сложность и съест всё время. После чего добавки попросит.
2)Это всё фронтенд. C чем ещё оно может быть связано?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.17 00:14
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>1)Вот именно эта сложность и съест всё время. После чего добавки попросит.


Ну, не "десятки человеко лет" (ц) же?
Пусть даже на это год уйдет (что явно много). Но задача то подъемная. Просто придумать как грамотно кэшировать инклюды тоже задача не простая.

WH>2)Это всё фронтенд. C чем ещё оно может быть связано?


Думаю, сложностей там будет достаточно. Но за 10 лет вручную компиляторы пишутся. Ты людей то так не пугай.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.17 00:23
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Что оно там анализирует?


Да какая разница?

WH>Сколько на него потрачено усилий?


Ну, не десятки человеко-лет точно. Я бы на их месте просто взял бы имеющийся компилятор и анализировал их внутренее представление.

Если есть качественная грамматика для АнтЛР, то перевести ее в Нитровскую вообще чисто рутинный процесс.

Ну, типизацию придется написать. Это неизбежно.

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

WH>На сколько оно соответствует стандарту?


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

WH>Что с ним происходит при встрече с Boost::Preprocessor и Boost::MPL одновременно?


Отработать должны. Типизатор С++ подразумевает реализацию интерпретатора шаблонов. Слава Богу модель вычисления там не очень сложная. Фактически простенький функциональный язык с рекурсией паттерн-матчингом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Портирование нитры.
От: WolfHound  
Дата: 13.02.17 00:51
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ну, не "десятки человеко лет" (ц) же?

VD>Пусть даже на это год уйдет (что явно много). Но задача то подъемная. Просто придумать как грамотно кэшировать инклюды тоже задача не простая.
Это самая простая из проблем. Но и её ты очень сильно недооцениваешь.
Я разговаривал с людьми, которые в джетбрейнс поддержку С++ делают. Мы с ними на одном этаже сидели. Так что я из первых рук про ужасы знаю. Да и без них догадывался.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.17 00:56
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Это самая простая из проблем. Но и её ты очень сильно недооцениваешь.


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

WH>Я разговаривал с людьми, которые в джетбрейнс поддержку С++ делают. Мы с ними на одном этаже сидели. Так что я из первых рук про ужасы знаю. Да и без них догадывался.


Надо не забывать, что у них сложность умножалась на рукопашную реализацию типизации. У нас тоже рядом орел из той команды работал. Так что я в курсах их сложностей, в какой то мере.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Портирование нитры.
От: WolfHound  
Дата: 13.02.17 00:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Отработать должны. Типизатор С++ подразумевает реализацию интерпретатора шаблонов. Слава Богу модель вычисления там не очень сложная. Фактически простенький функциональный язык с рекурсией паттерн-матчингом.

Поверь мне. Между "должны" и "отрабатывают в соответствии" со стандартом в случае с С++ огромная пропасть.
C#, Java, Scala, Kotlin итп на нитре можно сделать за пару месяцев. Но С++ это совсем другой зверь. Там всё очень страшно.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[24]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.17 00:59
Оценка:
Здравствуйте, novitk, Вы писали:

N>Nemerle1 это застывшая какашка, без всякого шанса стать нативной или плюсоподобной.


+1

N>Немерле2 пока существует только в голове Влада даже для .NET, то есть трогать тут просто нечего.


Это не совсем так. Кое что уже сделано. У Немерле 2 и Cx# будет много общего АСТ-а и типизации. Сейчас Cx# типизируется до тел методов. Т.е. остается реализовать типизацию выражений и можно спокойно заниматься бэкэндом на базе LLVM. Для этого даже дотнетный бэкэнд не нужен ведь.

N>Nitra возможно облегчит тебе создания нового языка, но для этого надо бы сначала огласить чем он будет лучше того, что уже есть.


Пилить язык с нуля, конечно можно. Но все же не оправданно. Если только захочется сделать развитие С++
Автор: alex_public
Дата: 11.02.17
какого нибудь.

А так лучше брать базовый Немерл и дорабатывать его напильником. Или использовать его как базовые блоки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Портирование нитры.
От: WolfHound  
Дата: 13.02.17 01:05
Оценка:
Здравствуйте, Слава, Вы писали:

С>А при чём тут Nitra, если сам по себе стандарт С++ — ПРЕОГРОМНЫЙ?

Преогромность там далеко не самое страшно. Стандарт C# вроде даже больше.
Там проблемы с тем что стандарт С++ состоит из огромной горы ужасных и запутанных конструкций.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: Портирование нитры.
От: WolfHound  
Дата: 13.02.17 01:05
Оценка:
Здравствуйте, VladD2, Вы писали:

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

Ох. Не хочу спорить. Если тебе будет нечем заняться можешь попробовать. Но я тебя предупредил.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.17 01:11
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Поверь мне. Между "должны" и "отрабатывают в соответствии" со стандартом в случае с С++ огромная пропасть.

WH>C#, Java, Scala, Kotlin итп на нитре можно сделать за пару месяцев. Но С++ это совсем другой зверь. Там всё очень страшно.

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

А работать в соответствии со спеками — это уже от правильности реализации типизации и АСТ-а зависит. В С++ 14 еще есть статические функции, которые можно вызвать из макросов. Для них тоже нужен интерпретатор или JIT-компилятор.

Ну, и простая логика. Те кто на этим СиЛионом работали тоже ведь с задачей справились не за 50 лет, а за 2-3. И команда у них вроде как не 100 человек. А если вспомнить, что у них все начиная от парсинга вручную делается, да еще (если не ошибаюсь) на С++ же, то понятно, что их время можно еще раза в три уменьшить.

В общем, Нитра позволит относительно просто спарсить и стипизировать С++. Надо решать следующие задачи:
1. Интерпретатор рекурсивных шаблонов.
2. Кэширование АСТ-а и символов из инклюдов.
3. Интерпретатор статических функций вызываемых из шаблонов.
4. Наверняка придется прикручивать костыли к макросам содержащимся внутри кода.

В С++ 17 вроде как обещают таки импорт реализовать. А раз так, то возможно вопрос импорта можно будет упростить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.17 01:47
Оценка: :)
Здравствуйте, WolfHound, Вы писали:

WH>Ох. Не хочу спорить. Если тебе будет нечем заняться можешь попробовать. Но я тебя предупредил.


У меня есть чем заняться и без этого. И я понимаю, что это не на форуме поболоболить. Но задача вполне подъемная.

Собственно фазы там такие:
1. Отрабатываем препроцессор и получаем "раскрытие" исходники (без макросов).
2. Парсим все это дело и получаем АСТ.
3. Строим символы для шаблнов и типов.
4. Связываем ссылки на шаблоны с символами шаблонов.
5. Запускаем интерпретатор, которые начинает заменять шаблоны на их воплощения отрабатывая при этом рекурсию, если надо. После этого этапа вместо получаем нужные воплощения шаблонов и ссылки на них в местах где были ссылки на шаблоны. Собственно после этого шаблоны раскрыты и вся магия связанная с ними выполнена.
6. Типизируется тупой С с классами и без шаблонов.

Это, конечно, без учета оптимизаций. С ними все будет по сложнее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 13.02.2017 2:03 VladD2 . Предыдущая версия .
Re[28]: Портирование нитры.
От: alex_public  
Дата: 13.02.17 08:11
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Ох. Сам по себе ГЦ в ядре не проблема.


Ну для начала язык должен поддерживать работу с указателями вне GC, что обычно редко встречается в языке с обязательным GC. Например, тот же C# это умеет только в режиме unsafe. А в большинстве языков с обязательным GC и такого нет.

Далее, если мы говорим про работу в ядре ОС, то GC должен быть реалтаймовый (надеюсь не надо напоминать про IRQ/MSI?). По типу того, что используется в Zing'e, но миниатюрный (тот то жрёт жрёт от гигабайта до 2 терабайт памяти). Если при этом хватит быстродействия (т.к. подобные GC обычно гарантируют реалтаймовость ценой общего её снижения), то теоретически такое может работать в ядре. Но про реальные воплощения подобного я не слышал.

WH>Но есть ли инструменты, которые прямо сейчас позволяют скомпилировать код с ГЦ для ядра винды или линукса я не знаю.


Собственно в теории скомпилировать не проблема. Только вот рантайм языка должен быть заточен под реализацию для ядра (речь даже не про решение проблем из предыдущего абзаца, а банально про другое системное API, используемое рантаймом). Т.е. грубо говоря в отличие от C/C++ мира, где используется один и тот же инструмент для создания кода в любых режимах работы, то тут понадобится два отдельных инструмента. Соответственно вряд ли кто-то занимается выпуском подобных профессиональных решений, разве что для фана поразвлечься.

_>>Я видел. ) Кстати, вот скажи, какую основную целевую аудиторию ты видишь у Nitra:

WH>В нитре нет ничего что можно было бы заточить на одну из перечисленных тобой аудиторий. Она будет одинаково хорошо работать для всех.

Т.е. получается что создание полноценных мощных языков тоже сюда укладывается... Хотя вариант создания копии C++ тебя пугает. )

_>>но статические языки для таких целей обычно не применяются) языки (типа js, lua и т.п.)

WH>Я уже много лет задаю один вопрос: Для каких задач (не решений, а именно задач) динамическая типизация лучше статической.
WH>Ещё никто не показал примера где динамическая типизация была бы лучше. Ни одного.

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

_>>Более того, языки типа Java и C# являются только промежуточным звеном в этой цепи, а в её конце наблюдаются скорее всяческие JS, Python и им подобные, которые ещё проще для работы.

WH>Это если сравнивать с убогой явой.
WH>А если сравнивать с немерле, то динамически типизированные языки сливают с треском.

Вообще то пока что как раз не видно ни одного статически типизированного языка, сравнимого по удобству написания с динамическими. Кстати, как ни странно ближе всего к ним подходят в этом смысле такие статические языки как Хаскель и C++, потому как они хотя бы могу предложить свой вариант написания кода без указания типов (при этом с полной статический проверкой). Но у них свои проблемы (извращения с чистотой и иммутабельностью у Хаскеля, и необходимость писать лишние auto и общая низкоуровневость у C++), так что они тоже не могут претендовать на сравнение.

_>>А как ты думаешь, почему этот проект не взлетел (ну кроме теории заговора менеджеров MS)?

WH>С инженерной точки зрения я не вижу ни одной причины закрывать проект.

Ну, судя по тому что Joe Duffy пишет: "Now, I am helping to bring many of those lessons learned back to the shipping products including, perhaps surprisingly, C++." То причины понятны.

_>>И есть ли шансы на реализацию (не в смысле сделать работающим, а в смысле сделать интересным хоть для каких-то групп пользователей) подобного в ближайшем будущем?

WH>Основная проблема в том, что у кучи пользователей в голове те же заблуждения что у тебя.

Ну т.е. не видишь. )
Re[7]: Портирование нитры.
От: alex_public  
Дата: 13.02.17 08:32
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Хм, ну вот в том же Netbeans анализатор C++ кода работает просто отлично. А при этом там всё построено на банальном ANTLR, про который я не раз тут слышал от вас, что Nitra намного круче.

WH>Что оно там анализирует?

Ну я думаю ты прекрасно знаешь чем занимается анализатор кода в IDE. )))

WH>Сколько на него потрачено усилий?


Без понятия.

WH>На сколько оно соответствует стандарту?


Стандарту в смысле успевает за изменениями в языке? С этим проблем нет.

WH>Что с ним происходит при встрече с Boost::Preprocessor и Boost::MPL одновременно?


Кстати на препроцессор ты точно зря думаешь. ))) Это же элементарная штука даже для компилятора, а уж для анализатора IDE (которому незачем раскрывать все макросы (они в коде служат просто "функциями" без типизации), а нужно отрабатывать только ifdef и include) тем более. Вот всяческое метапрограммирование на шаблонах — это действительно тяжёлая тема для таких анализаторов и обычно не весь Boost они способны переварить. )))

P.S. Кстати, если вы хотите реального большого успеха вашему продукту, то как можно этого добиться с помощью реализации простеньких вещей (которые пишутся элементарно на множестве других известных инструментов)? Как раз наоборот, надо продемонстрировать возможность решения самой сложной задачи в своей области и тогда слава сама найдёт вас.
Re[28]: Портирование нитры.
От: alex_public  
Дата: 13.02.17 08:57
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Причём тут Go? ) Он просто для примера был. Я же тебе написал, выбери ЛЮБОЙ, какой тебе нравится язык с обязательным сборщиком мусора и продемонстрируй как на нём написать драйвер ядра для винды или линуха (он же андроид, в этом смысле). Ты же сказал что с этим проблем нет...

VD>http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.92.1892&amp;rep=rep1&amp;type=pdf
VD>https://lwn.net/Articles/352519/
VD>http://dl.acm.org/citation.cfm?id=1408654.1408657

А ты сам свои ссылки смотрел? ) Там же используется не обычный Хаскель или Java, а специальные версии, в которые введена поддержка работы с указателями, прямые вызовы системного API (типа kmalloc) и т.п. Т.е. к оригинальным языкам с обязательным GC это уже имеет слабое отношение.

Но при этом народ из первой статьи повеселил конечно — не смотря на реализацию подобных возможностей (без них просто нельзя написать драйвер), они всё же решили использовать классически GC (ну переделав его естественно на вызовы ядра) для выделения внутренней памяти в своём драйвере. И в итоге получили такие очаровательные результаты:

The Java version took 178 microsecondsand the C version took 63 microseconds. When a GC occurred during a copy, the Java version took 230 microseconds.

Для их игрушечного примера (они реализовали в примере драйвер не реального устройства, а просто виртуальный RAM диск) это возможно и приемлемо, но для реальных устройств подобные ужасы (и я совсем не про разницу с C кодом) выглядят конечно смешно. )))

VD>Ты лучше объясни, что может помешать сделать язык с GC на котором можно будет писать драйверы?

VD>Что ты видишь в GC такого, что не позволило бы запускать его в режиме ядра?

Первые три абзаца здесь http://rsdn.org/forum/philosophy/6696674.1
Автор: alex_public
Дата: 13.02.17
как раз про это.
Re[26]: Портирование нитры.
От: alex_public  
Дата: 13.02.17 09:03
Оценка:
Здравствуйте, Слава, Вы писали:

С>А при чём тут Nitra, если сам по себе стандарт С++ — ПРЕОГРОМНЫЙ? То есть, объём работы объективно большой, хоть на нитре, хоть на чём. Тут надо скорее думать, нужен ли миру еще один компилятор С++, а если нужен — то где бы взять одного спонсора и десять студентов, чтобы они год вбивали описание С++ на нитре.


Просто ещё один компилятор — не нужен. Инструмент позволяющий в пару строчек добавить новую возможность в язык (причём так, что ещё и IDE тут же станет её адекватно воспринимать) — очень многим понравился бы.
Re[3]: Портирование нитры.
От: alex_public  
Дата: 13.02.17 09:34
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>У меня тут в процессе дискуссии появилась ещё одна мысль. Возможно я бы смог поучаствовать в развитие проекта не просто для фана, а уже по делу. Но для возможности этого мне надо знать ответ на один вопрос. Вот предположим у тебя есть твоя доработанная Nitra. И при этом кто-то написал для неё полноценный бэкенд через LLVM. Сможешь ли ты сделать на базе этого точную копию скажем C++14 (это естественно не итоговая цель, а важнейший промежуточный шаг, хотя и он при определённом подходе может принести вам коммерческий успех)? Ну чтобы итоговый продукт мог компилировать произвольный C++ исходник и результат не отличался от clang'а. И при этом естественно работала бы поддержка в IDE.

VD>Теоретически это возможно. Вопрос лишь в том, что мне не хочется тратить свое время на С++. Кроме того, что это определенный объем работ связанный с перенесением синтаксиса и типизацией, там еще нужно решить ряд проблем связанных с препроцессором. Все инклюды в файлах нужно кэшировать и запускать обработку не с нуля, а с заранее разобранными инклюдами. Именно по этому С++ является плохо IDE-зируемым языком и при реализации для него движков IDE обычно прибегают к множеству хаков.

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

Что касается кэширования при работе анализатора в IDE, то да, для C++ это обязательная вещь. Помнится ещё VisualAssist в древние времена 6-ой студии делал это, скидывая результаты анализа всех используемых библиотек на диск. Эклипс помнится тоже таким старадал (сейчас не знаю). А вот Netbeans и QtCreator уже полностью обходятся анализом при загрузке проекта и кэшированием в памяти. Кстати, ещё отдельная мысль по этому поводу: для ускорения компиляции больших проектов на C++ традиционно используют предкомпилированные заголовки, а вот из анализаторов IDE данный факт кажется не использует никто...

VD>Я могу консультировать того кто этим займется и помогать ему (им) трудных случаях. Но у самого меня есть еще много более приоритетных задач. Так мне сначала хочется сделать Nemerle 2 и Cx#
Автор: VladD2
Дата: 12.01.17
. А чтобы заняться ими, я должен довести до приличного состояния поддержку IDE для самой Нитры (нитра пока что использует наш старый движок типзиации.


Ладно, там посмотрим, ближе к делу)
Re[10]: Портирование нитры.
От: alex_public  
Дата: 13.02.17 10:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В С++ 14 еще есть статические функции, которые можно вызвать из макросов. Для них тоже нужен интерпретатор или JIT-компилятор.


В смысле не из макросов, а из шаблонов? Тогда да, есть такое, хотя и намного более слабое чем в D — там можно любую функцию так использовать (компилятор сам будет разбираться все ли данные ему доступны на момент компиляции), а в C++ только отдельно помеченную как constexpr.

VD>В С++ 17 вроде как обещают таки импорт реализовать. А раз так, то возможно вопрос импорта можно будет упростить.


Не, скорее всего модулей не будет в C++17. Во всяком случае в текущей версии ничего такого нет, а она уже почти итоговая.

Ну и кстати лично я не особо по этому поводу переживаю, т.к. в реальности модули для C++ являются всего лишь неким средством автоматической синхронизации h и lib файлов. Т.е. грубо говоря решают проблему, от которой и раньше никто не страдал.

Вообще C++17 выходит неправильным. В том смысле что в какой-то момент для языка выбрали план развития в виде версий каждый 3 года, причём в начале идёт с принципиальными изменениями, а следующая с доработками к ней. Т.е. C++11 — принципиальная (так и было), C++14 — доработки (так и было), C++17 — принципиальная (должна быть). И да, в C++17 планировалось добавить модули, интроспекцию, концепты, диапазоны (на базе буста, но концептами), сопрограммы (есть как библиотека в бусте, но специфическая, с использованием ассемблера) и т.п. принципиальные изменения. А по факту на данный момент этого нет ничего (по легенде — не успели договориться), так что в C++17 именно языковых изменений меньше чем в C++14 (в которой добавили полиморфные лямбды, которые реально крайне удобные и которые мало в каких статических языках имеются). Собственно из языковых изменений В C++17 скорее всего будет только несколько мелочей: "if constexpr()" (явно взятый из D), "if(init; condition)" (вообще просто сахар), декомпозицию (типа "auto [x, y]=f();//f возвращает структуру или кортеж с парой членов") и автоматическое определение параметров шаблонов при объявление переменных (типа "pair p(10, 10.0);"). А все остальные изменения касаются только стандартной библиотеки — в неё перетащили очередной кусок из Буста (т.е. для большинства программистов вообще ничего не изменилось) и добавили многопоточные версии большинства стандартных алгоритмов STL (безусловно полезно, но не тянет на революционный шаг, скорее на доработку). А все главные вкусности, получается по факту откладываются на C++20, который теоретически по плану должен был быть "доработкой C++17"...
Re[25]: Портирование нитры.
От: novitk США  
Дата: 13.02.17 14:30
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ну, так не пофигу ли что изучать ДСЛ bison-а или ДСЛ Нитры?

Пофигу. Я просто сказал, что знания DSL-ей не достаточно, надо еще и общий язык знать.

VD>В Нитре их не дофига, а в самый раз. Все они упрощают решения той или иной проблемы. Выбор то не велик. Или учить ДСЛ и потом кратко и понятно решать проблему, или пилить все снуля попутно узнавая все тонкости предметной области.

Меня лечить не надо, я примерно в курсе как сделана Нитра. Подход не нравится, но спорить смысла нет, ибо субъективно.

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

Я бы потрогал ваш парсер, но он для платформы которой я и вообще мало кто пользуется. Поэтому я продолжаю использовать parsec/ANTLR.

VD>Мы же накрываем не только парсинг, но и типизацию. Плюс та самая инфраструктура.

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

VD>Из коробки будет код для серьезных языков (причем не одного). Куча библиотечного кода. Поддержка той же IDE из коробки. Причем не просто подсветка, как ты пытаться изложить. Это полноценный движок IDE. И для его поддержки практически не надо писать специализированный код.

Слово "Будет" я слышу уже 10 лет. Сделайте один полезный и полный ЯП, тогда поговорим.
Re[8]: Портирование нитры.
От: WolfHound  
Дата: 13.02.17 15:49
Оценка: -1
Здравствуйте, alex_public, Вы писали:

WH>>Сколько на него потрачено усилий?

_>Без понятия.
Во-во, а учить лезешь.

WH>>На сколько оно соответствует стандарту?

_>Стандарту в смысле успевает за изменениями в языке? С этим проблем нет.
Я не про "как-то работает", а про "соответствует стандарту".

WH>>Что с ним происходит при встрече с Boost::Preprocessor и Boost::MPL одновременно?

_>Кстати на препроцессор ты точно зря думаешь. ))) Это же элементарная штука даже для компилятора, а уж для анализатора IDE (которому незачем раскрывать все макросы (они в коде служат просто "функциями" без типизации), а нужно отрабатывать только ifdef и include) тем более.

Ты вообще знаешь что такое Boost::Preprocessor? Судя по твоему ответу даже не догадываешься.
Да и С++ в целом плохо знаешь.

_>Вот всяческое метапрограммирование на шаблонах — это действительно тяжёлая тема для таких анализаторов и обычно не весь Boost они способны переварить. )))

ЧТД. Стандарту не соответствуют.

_>P.S. Кстати, если вы хотите реального большого успеха вашему продукту, то как можно этого добиться с помощью реализации простеньких вещей (которые пишутся элементарно на множестве других известных инструментов)? Как раз наоборот, надо продемонстрировать возможность решения самой сложной задачи в своей области и тогда слава сама найдёт вас.

А что ловля на слабо где-то кроме детского сада работает?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[29]: Портирование нитры.
От: WolfHound  
Дата: 13.02.17 16:13
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну для начала язык должен поддерживать работу с указателями вне GC, ...

Я с тебя фигею. Ты показываешь проблему и тут же показываешь, как её решать.

_>Т.е. грубо говоря в отличие от C/C++ мира, где используется один и тот же инструмент для создания кода в любых режимах работы,

Что у нас с исключениями и RTTI в ядре?

_>Т.е. получается что создание полноценных мощных языков тоже сюда укладывается... Хотя вариант создания копии C++ тебя пугает. )

Ты меня вообще не слушаешь.
С++ меня пугает по тому что его стандарт выглядит так какбудто его делает толпа обдолбанных укурков цель которых сделать всё так чтобы и пользователям языка и разработчикам инструментов было максимально больно.
Писать компилятор С++ это всё равно что писать код на брейнфаке.

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

Вот статически типизированные языки с выводом типов и в этом сценарии строго лучше динамической типизации.

_>Вообще то пока что как раз не видно ни одного статически типизированного языка, сравнимого по удобству написания с динамическими.

Ты на немерле сколько кода написал?

_>Ну, судя по тому что Joe Duffy пишет: "Now, I am helping to bring many of those lessons learned back to the shipping products including, perhaps surprisingly, C++." То причины понятны.

И что же тебе понятно?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: Портирование нитры.
От: WolfHound  
Дата: 13.02.17 16:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ну, и простая логика. Те кто на этим СиЛионом работали тоже ведь с задачей справились не за 50 лет, а за 2-3. И команда у них вроде как не 100 человек.

Умножь размер команды на время работы.
Получишь число человеко-лет, которые они на это потратили.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[25]: Портирование нитры.
От: novitk США  
Дата: 13.02.17 16:36
Оценка: :))
Здравствуйте, VladD2, Вы писали:

VD>Вот есть Котлин, Скала, но люди продолжают писать на Яве.

Потому что на Яве для них быстрей и удобней. Им не надо возиться с запутанными сообщениями в сложной системе типов, ждать медленного компилятора, получать тупые ошибки потому что языком занимаются два с половиной человека по праздникам, искать ответы на простые вопросы, которых нет на SO.

VD>Есть Немерл, а люди продолжают писать на Шарпе.

И правильно делают, на нем большинство софта можно сделать намного быстрее.

VD>Есть Ди, Раст, ... но люди продолжают писать на С++.

И правильно делают, на нем большинство софта можно сделать намного быстрее.

VD>Это полное непонимание или намеренная неправда. По языковым фичам Шрап даже то что будет в VS 2017 не дотягивает до Немерла десятилетней дановсти.

Ты не объективен, спор бессмыслен.

VD>Я не знаю, что ты там себе подразумеваешь под экосистемой, но что нет у Немерла — это РеШарпера. Но это опять таки следствие того, что хомячки выбирают не мозгом, а задом.

Это не главная проблема. Главная (о которой тебе проели все уши, но воз и ныне там) это то что Немерле дотнет-only, a на этой платформе хомячки отличаются уникальной степенью ведомости.

VD>А библиотеки и т.п. у Немерла такие как и у других дотнет-языков.

И это очень плохо. Библиотеки должны быть свои. У всех успешных jvm языков (Scala, Clojure, Kotlin) свои библиотеки.

N>>Во-первых, сравнение нитры со скалой это апельсины с яблоками. Во-вторых, на скале отлично пишутся встроенные ДСЛи (лучше чем на Немерле).

VD>Еще раз повторяю, синтаксис там не изменить. Я эти эти скаловские макросы придумал, так что понимаю о чем говорю. Там возможна только реинтерпретация исходного синтаксиса. Он довольно гибок, но произвольного синтаксического расширения не допускает. Плюс, например, Anny это не встроенный DSL. Такое на Скале делается только путем написания всего стека компилятора от печки, т.е. годы работы.
Если язык гибкий, внешние DSL-ы практически не нужны, если только он не представляет собой саму задачу (полный язык программирования, написания плагинов IDE для уже существующих DSL. Тут Нитра возможно была бы полезна!). Поэтому я говорю про встроенные DSL, где все работает, как в Нитре, из коробки и штатно. Скала оптимизирована именно под этот сценарий, а Немерле нет. Никому на скале и в голову не придет, делать Аммy. Люди просто исправят косяки WPF прямо на Скале.

Вот тебе наша Амму и WPF в придачу. Двухсторонний байндинг, рендеринг в swt и ехтjs, aвтокомплит, все дела без всяких "годов работы".


    gui {
      Window() {
        MenuBar() {
          MenuHeader(_.text := "File") {
            MenuItem(_.text := "New...")
            MenuItem(_.text := "Close")
          }
          MenuHeader(_.text := "Edit") {
            MenuItem(_.text := "Copy")
            MenuItem(_.text := "Cut")
            MenuItem(_.text := "Paste")
          }
        }
        TabFolder() {
          Group(_.tab := "Home") {
            Grid(_.columns := 2) {
              Stack(_.title := "Test") {
                Label(_.caption := "ID") <-- obj.name
                Text(_.caption := "Tenor") <-> obj.tenor
                CheckBox(_.caption := "Is EOD", _.enabled := false) <-- obj.isEod
              }
              Stack(_.title := "Test2") {
                Text(_.caption := "ID") <-- obj.name
                Text(_.caption := "Tenor") <-> obj.tenor
                ComboBox(_.caption := "MyCombo", _.selectedItem <-> obj.pickedValue) <-- obj.choices
              }
            }
          }
    ...



VD>Покажи. Хуже не будет. Уверен, что ни будет уступать Ammy хотя бы потому, что в Питоне нельзя выразить код в виде джейсона.

VD>В прочем, особо не удивлюсь их наличию. Питон (как и многие скрипты) не плохо ДСЛ-изируется. Вопрос только в только в тормозах таких решений, в выразительности и в предоставляемом сервисе.

https://github.com/nucleic/enaml
https://kivy.org/#home

N>>Что странного в том, что вы написали фрейморк интеграцией раскраски и подсказок внешних языков для VisualStudio?

VD>А ты попробуй. Я не хочу тебя огорчать, но ты только языком горазд молоть. Извращаешь все и вся. Нитра это немножко (хе-хе) больше чем просто какая-то там раскраска.
Давай пальцы веером не гнуть. Я не говорю, что это просто, но IDEA и Еclipse раскрашивает/подсказывает десятки языков. Возможно на Нитре оно проще, но это не rocket science.

VD>Как там твои решения на Питоне все раскаршивают? Интеллисенс предоставляют?

Конечно. https://github.com/kivy/kivy/wiki/Setting-Up-Kivy-with-various-popular-IDE's#kv-lang-auto-completion-and-highlighting

N>>Руки у вас вроде на месте. При чем здесь немерле?

VD>Это язык на котором такой продут можно реализовать нашими силами. И Нитра была придумана в попытках осмыслить то как правильно реализовать Немерл. Открою тебе небольшой сикрет. Если бы мы взяли за основу C# или C++, проект неминуемо был бы завален.
Извини, но не верю. Поспекулирую: начали бы на Яве/Скале/Котлине проект был бы гораздо дальше, а ты бы до сих пор работал в JB.

N>>В Скале есть проблемы, но ничего лучше для общего программирования сейчас в статике просто нет.

VD>Ага, ага. То то в ДжетБрэйс пилят Котлин, который бай дизайн упрощенная версия Скалы.
Ну вот когда допилят мы посмотрим, а пока вот так.

N>>Убирать ты можешь что хочешь, но популярности это не даст.

VD>Популярность есть у очень малого количества языков. И в большинстве случаев за ними стоят серьезные конторы. И действительно благодаря таким как ты (коих большинство) никакие фичи не привлекут людей пользоваться языком. У вас всегда будет 100500 контраргументов высосанных из пальца.
Я сейчас пользуюсь только Скалой, Питоном, Хаскелем и плюсами. За этими языками нет никакой серьезной конторы и я как раз один из малого количества adopters. Ты вообще о чем тут?

N>> Для популярности без крутого бренда нужно иметь уникальные фишки (сейчас желательно в системе типов или в рантайме, так как простые плюшки уже есть везде), а у вас их нет. "Свободный расширяемый синтакс" никому нафиг не сдался.

VD>Наша основная фишка — возможность добавления любых фишек. Причем как авторами, так и сторонними лицами. Это всем фишкам фишка.
Это типа "за все хорошее, против всей х..."? Тут надо бы показать пример. Например берем Nemerle2 и за пару месяц прикручиваем к ней типизацию ownership-а из Rust-a. Это пример того, что я не знаю как сделать на нативной Скале без плагина в компилятор, а ты мне Ammy тычешь.

VD>Даже у Немерла 1 было не мало случаев, когда приходил орел, вроде тебя, и говорил — "А у вас нет такой-то фишки". Ему отвечали — "Так сделай!".

10 лет назад я заказывал ровно одну фишку — доступность на нормальной платформе.

VD>Нда... Я тебе как раз говорю о бэкэнде для LLVM. А уж то что ты там себе понимаешь под "высокопроизводительный универсальный язык..." ты сможешь потом сам допилить в виде расширений.

У тебя телега впереди лошади. Не надо сейчас говорить о LLVM. У вас никакого языка сейчас нет, кроме N1, который никому нафиг не нужен, включая тебя. Тебе надо сначала сделать язык на том что ты знаешь (дотнет) и если он будет для меня интересен, я возможно буду готов помочь в его нативизации на LLVM. В дизайне языка неплохо было бы иметь нативизацию ввиду конечно. А сейчас обьекта приложений усилия для меня просто нет. Делать C#/"упрощенный Немерле" на Нитре мне не интересно, так как результатом будет шаг назад по сравнению со Скалой.

N>>Я не критикую, а помогаю алексу выбрать точку приложение усилия.

VD>Откровенно говоря ты просто трепишься. При этом выдаешь море заблуждений с зашкаливающей категоричностью.
В принципе да, как и ты. Я не против Нитры или Немерле2 и продолжаю несмотря на твое хамство ждать от них полезный выхлоп для себя. Пока его нет. На N2 я честно говоря не надеюсь, так как не вижу интересных идей. Нитра мне интересна, но ее режет дотнет и N1. Если бы выдача была для jvm мне было бы интересней, но сам я делать это не буду, так как не уверен, что овчинка стоит выделки.
Re[25]: Портирование нитры.
От: DarkEld3r  
Дата: 13.02.17 17:06
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>У нас же стуация такая. Есть реально морально устаревшие языки вроде С/С++, Шарпа и Явы. Но используют именно их, потому что:

VD>1. Реально есть много легаси-кода.
VD>2. Выбор языков делается не осмысленно, а брэндам и пиару.
Ты серьёзно не учитываешь, что выбирать могут вполне осмысленно, но с учётом количества готовых специалистов, инструментов и прочего? В плане библиотек у связок джава-скала или C#-Nemerle может всё и хорошо, но не у C++/D/Rust. В последнем случае надо писать биндинги и не всегда их можно генерировать.
Ну и поддержка ИДЕ важна (с этим, как я понимаю, у вас проблем нет, но не у скалы/D/раста), как и "стабильность".

VD>Ага, ага. То то в ДжетБрэйс пилят Котлин, который бай дизайн упрощенная версия Скалы.

Дык, разве в Kotlin есть метапрограммирование?

В том и дело, что в мейнстриме "нет понимания" полезности метапрограммирования, а вот как раз упрощение ценится. Вот только это упрощение в духе Go когда возможности выкидываются, а не делаются удобнее.
Re[26]: Портирование нитры.
От: novitk США  
Дата: 13.02.17 18:16
Оценка: 6 (1)
Здравствуйте, DarkEld3r, Вы писали:

DE>Ну и поддержка ИДЕ важна (с этим, как я понимаю, у вас проблем нет, но не у скалы/D/раста), как и "стабильность".

У Скалы с IDE-поддержкой проблем давно нет. В смысле там все лучше в Еclipse и IDEA чем у Немерле в студии.
Re[26]: Портирование нитры.
От: Слава  
Дата: 13.02.17 18:59
Оценка:
Здравствуйте, novitk, Вы писали:

N>10 лет назад я заказывал ровно одну фишку — доступность на нормальной платформе.


Многие люди считают, что эта платформа как раз ненормальная.
Re[9]: Портирование нитры.
От: alex_public  
Дата: 13.02.17 20:45
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>>>Сколько на него потрачено усилий?

_>>Без понятия.
WH>Во-во, а учить лезешь.

По парсерам я тебя ничему не учу (это не моя область), а скорее запрашиваю готовое решение. )

WH>>>Что с ним происходит при встрече с Boost::Preprocessor и Boost::MPL одновременно?

_>>Кстати на препроцессор ты точно зря думаешь. ))) Это же элементарная штука даже для компилятора, а уж для анализатора IDE (которому незачем раскрывать все макросы (они в коде служат просто "функциями" без типизации), а нужно отрабатывать только ifdef и include) тем более.
WH>
WH>Ты вообще знаешь что такое Boost::Preprocessor? Судя по твоему ответу даже не догадываешься.

Ну вообще то я когда-то делал на нём задание sql схемы для библиотечки SOCI. Т.е. пишешь вот так:
DECLARE_TABLE("Persons", Person, (
    ("int primary key", id),
    ("text", name),
    ("real", total)
))

И потом можешь писать так:
CreateTable<Person>();
for(int i=0; i<10; i++) Insert(Person{i, L"Имя"+to_wstring(i), sin(i/3.0)});

Но это всё древние решения, которые с появлением библиотек типа sqlpp11 уже не актуальны. Там уже давно нужная схема генерируется не макросом (хотя такое решение тоже присутствует из коробки), а скриптом на Питоне по sql файлу, а сама библиотека делает статический анализ всех sql конструкций на этапе компиляции (как в linq, только намного эффективнее). Кстати, это как раз одно из мест где МП выглядит максимально полезным (причём даже такое слабое МП как в C++ позволяет создать полноценный эффективный инструмент) — решения на эту тему я видел и в Scala и в Rust. А вот Nemerle похоже проигнорировал данное направление, т.к. в .net имеется linq, который хоть и с рантаймовыми тормозами, но уже работает из коробки. )))

Ну что-то я увлёкся воспоминаниями. Так вот, не смотря на относительно страшный вид макроса DECLARE_TABLE, с точки зрения анализатора кода IDE он является полным примитивом.

WH>Да и С++ в целом плохо знаешь.


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

_>>P.S. Кстати, если вы хотите реального большого успеха вашему продукту, то как можно этого добиться с помощью реализации простеньких вещей (которые пишутся элементарно на множестве других известных инструментов)? Как раз наоборот, надо продемонстрировать возможность решения самой сложной задачи в своей области и тогда слава сама найдёт вас.

WH>А что ловля на слабо где-то кроме детского сада работает?

Т.е. ты даже не хочешь попробовать поразмышлять? Вот предложим случится чудо и вы полностью закончите свой основной продукт. Вот он у вас на руках и вы приступаете к его предъявлению публике. Как вы это собираетесь делать? Просто информация про какие-то парсеры и т.п. — это будет разговор ни о чём. Всегда нужен реальный работающий пример применения вашего инструмента. И что вы предъявите? Что-то вроде Ammi? Так подобное сейчас каждый второй не напряжно делает без всяких специализированных инструментов, просто в лоб, причём задача элементарно решается вообще на каком-нибудь Питоне. Вот если показать, что ваш инструмент может решать задачи, считающиеся реально сложными в индустрии — только тогда и можно получить известность...
Re[11]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.17 22:34
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Умножь размер команды на время работы.


Ну, вот и умножь. Ты больше знаешь о том сколько их там и сколько лет они пилят.

WH>Получишь число человеко-лет, которые они на это потратили.


Получишь сколько они пилят все. А пилят они все вручную и (если не ошибаюсь) на плюсах. Вот какой у них там объем работ заняла конкретно интерпретация шаблонов? Потому как в остальном язык даже проще какого-нибудь шарпа.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Портирование нитры.
От: alex_public  
Дата: 13.02.17 22:44
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Ну для начала язык должен поддерживать работу с указателями вне GC, ...

WH>Я с тебя фигею. Ты показываешь проблему и тут же показываешь, как её решать.

Так а много ты знаешь таких языков? Чтобы был обязательный GC и при этом нормальная работа с указателями? )

Ну и потом это было всего лишь одно из трёх условий, соблюдение которых позволит (если при этом быстродействие совсем не убьётся) использовать GC в драйверах. И я лично не слышал ни про один язык, который бы им удовлетворял. Да и ты вроде ни одного не назвал.

_>>Т.е. грубо говоря в отличие от C/C++ мира, где используется один и тот же инструмент для создания кода в любых режимах работы,

WH>Что у нас с исключениями и RTTI в ядре?

Кстати говоря ничего такого. Никаких фунтаментальных запретов нет. Просто классические реализации исключений отжирают много места на стеке, а он же в драйверах обычно сильно ограниченный (да, да, представь себе, что на мощном десктопе с гигабайтами памяти может стоять ограничение не сильно отличающиеся от обсуждаемого выше микроконтроллера), так что чаще всего (но бывают и реализации с ними) предпочитают без них (и кстати в программирование под МК аналогичная ситуация). Что для C++ естественно является просто стандартной опцией компилятора.

_>>Т.е. получается что создание полноценных мощных языков тоже сюда укладывается... Хотя вариант создания копии C++ тебя пугает. )

WH>Ты меня вообще не слушаешь.
WH>С++ меня пугает по тому что его стандарт выглядит так какбудто его делает толпа обдолбанных укурков цель которых сделать всё так чтобы и пользователям языка и разработчикам инструментов было максимально больно.
WH>Писать компилятор С++ это всё равно что писать код на брейнфаке.

А что ты там видишь нестандартного кроме техники инстанцирования шаблонов? Или это именно они наводят на тебя такой ужас? )

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

WH>Вот статически типизированные языки с выводом типов и в этом сценарии строго лучше динамической типизации.

Так где взять такие удобные встраиваемые языки?)

_>>Вообще то пока что как раз не видно ни одного статически типизированного языка, сравнимого по удобству написания с динамическими.

WH>Ты на немерле сколько кода написал?

Ну вот смотри, простейший пример на Питоне:
apply=lambda f, *args: f(*args)
add=lambda x, y: x+y
inc=lambda x: x+1
f=lambda x: apply(add, x, apply(inc, x));
print f(1), f(1.15) #выводит 3 3.3

можешь показать код на Nemerle с аналогичной функциональностью и чтобы он не был более громоздким?

Кстати, на том же C++ этот код элементарно переписывается прямо в лоб:
auto apply=[](auto f, auto... args) {return f(args...);};
auto add=[](auto x, auto y) {return x+y;};
auto inc=[](auto x) {return x+1;};
auto f=[](auto x) {return apply(add, x, apply(inc, x));};
cout<<f(1)<<' '<<f(1.15)<<endl; //выводит 3 3.3

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

_>>Ну, судя по тому что Joe Duffy пишет: "Now, I am helping to bring many of those lessons learned back to the shipping products including, perhaps surprisingly, C++." То причины понятны.

WH>И что же тебе понятно?

Что руководству надоело тратить время ценных специалистов на детских игрушки и они перевели их на улучшение реальных продуктов. )

P.S. Подсветка синтаксиса для Питона на форуме кривая — даже тупо ключевые слова не видит.
Re[2]: Портирование нитры.
От: novitk США  
Дата: 13.02.17 23:03
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Сможешь ли ты сделать на базе этого точную копию скажем C++14 (это естественно не итоговая цель, а важнейший промежуточный шаг, хотя и он при определённом подходе может принести вам коммерческий успех)? Ну чтобы итоговый продукт мог компилировать произвольный C++ исходник и результат не отличался от clang'а. И при этом естественно работала бы поддержка в IDE.


А чего ты просто libCLang не возьмешь? Это же и есть отлаженный плюсовый фронтенд с блэкджеком и ... байндингами для Питона/Явы.
Re[26]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.17 23:10
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Ты серьёзно не учитываешь, что выбирать могут вполне осмысленно, но с учётом количества готовых специалистов, инструментов и прочего?


Не вижу я этого.

DE>В плане библиотек у связок джава-скала или C#-Nemerle может всё и хорошо, но не у C++/D/Rust.


Предположим, но как-то у Скалы, Немерла и даже Котлина это ситуацию не меняеет.

Ну, а если брать С++ vs. D/Rust, то опять же С++ не имеет какого-то невероятного превосходства в этой области.

DE>В последнем случае надо писать биндинги и не всегда их можно генерировать.


Незнаю как для Раста, но для Ди вроде как наклепано не мало библиотек.

DE>Ну и поддержка IDE важна (с этим, как я понимаю, у вас проблем нет, но не у скалы/D/раста), как и "стабильность".


С Ди не работаю, но беглый поиск привел сюда:
https://wiki.dlang.org/IDEs

Что-то мне кажется, что у С++ с IDE не сильно лучше.

VD>>Ага, ага. То то в ДжетБрэйс пилят Котлин, который бай дизайн упрощенная версия Скалы.

DE>Дык, разве в Kotlin есть метапрограммирование?

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

В Скале тоже макры появились относительно не давно. И до недавнего времени автор Скалы их тоже неосмысленно боялся. Более он до сих пор боится синтаксических макросов. Я им предложил компромисное решение — типизированные макросы которые не меняют синтаксис, но позволяют его реинтерпретировать. Они его развили. Собственно макросы в Скалу привнес один белорусский парень (Евгений Бурмако). Если бы не он, то Скале тоже не было бы макросов.

DE>В том и дело, что в мейнстриме "нет понимания" полезности метапрограммирования, а вот как раз упрощение ценится. Вот только это упрощение в духе Go когда возможности выкидываются, а не делаются удобнее.


ОК, тогда объясни мне почему С++ по прежнему популярен, а не тот Ди. Ди же вроде проще?

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

Я 10 лет назад был наивным и думал, что вот если есть у нас хороший язык, то разные там ИДЕ, библотеки и прочее нарастет само собой. Возьмется комьюнити и запилит все нобходимое, а то и коммерческие компании вроде тех же Майкрософта, Гугля и прочих Ороклов продключатся.

Но все совсем не так.

Есть вот вот такие субъекты
Автор: novitk
Дата: 13.02.17
. С аргументацией они не парятся. Изучением обсуждаемого тоже не заморачиваются. Просто гонят от вольного и считают себя правыми. Спорить с ними и что-то доказывать просто не охота. Это просто пустая трата времени.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Портирование нитры.
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 13.02.17 23:23
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Вот теория брэнда объясняет буквально все. Приемлемое качество и брэнд == успех. Ну, естественно брэн не сам по себе дает успех, но это бабло нужное для продктизации продукта, это пиар нужный для внедрения в мозг идеи о необходимости перхода на язык и это какие-то психологические аспекты восприятия.


Интересная теория, но она вроде как не позволяет объяснить популярность как минимум Haskell, Python, Ruby. Меня действительно интересует этот вопрос, так как ситуация с D выглядит реально загадочной.

VD>ОК, тогда объясни мне почему С++ по прежнему популярен, а не тот Ди. Ди же вроде проще?


Я никак не могу понять почему он не стал популярным, ведь за ним стоит Александреску (фактически человек из первой 5-ки самых известных в мире C++) и где только можно и нельзя о нем громко заявляет
Re[27]: Портирование нитры.
От: novitk США  
Дата: 13.02.17 23:36
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Есть вот вот такие субъекты
Автор: novitk
Дата: 13.02.17
. С аргументацией они не парятся. Изучением обсуждаемого тоже не заморачиваются. Просто гонят от вольного и считают себя правыми. Спорить с ними и что-то доказывать просто не охота. Это просто пустая трата времени.


Ты зря обижаешься. Это не продуктивно, я твоя целевая группа. Спорить начал ты
Автор: novitk
Дата: 13.02.17
, а я лишь поддержал
Re[31]: Портирование нитры.
От: WolfHound  
Дата: 13.02.17 23:38
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Так а много ты знаешь таких языков? Чтобы был обязательный GC и при этом нормальная работа с указателями? )

Мы тут вроде принципиальные вопросы обсуждаем.

_>Что для C++ естественно является просто стандартной опцией компилятора.

Ты вспомни на что я отвечал то.

Собственно в теории скомпилировать не проблема. Только вот рантайм языка должен быть заточен под реализацию для ядра (речь даже не про решение проблем из предыдущего абзаца, а банально про другое системное API, используемое рантаймом). Т.е. грубо говоря в отличие от C/C++ мира, где используется один и тот же инструмент для создания кода в любых режимах работы, то тут понадобится два отдельных инструмента.


_>А что ты там видишь нестандартного кроме техники инстанцирования шаблонов? Или это именно они наводят на тебя такой ужас? )

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

_>Ну вот смотри, простейший пример на Питоне:

Простейший говнокод который ничего не делает.
Все аргументы защитников динамически типизированных языков всегда сводятся к подобной фигне.
Вот поэтому я и прошу ЗАДАЧУ ибо статическая типизация всегда отсекает некие извращения.
В данном случае сделать статически типизированный язык, который такое поймёт можно. Но нахрен не нужно.

_>Что руководству надоело тратить время ценных специалистов на детских игрушки и они перевели их на улучшение реальных продуктов. )

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

_>P.S. Подсветка синтаксиса для Питона на форуме кривая — даже тупо ключевые слова не видит.

Исправь.
https://github.com/rsdn/RsdnFormatter/blob/master/Format/CodeFormat/Patterns/Python.xml
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: Портирование нитры.
От: WolfHound  
Дата: 13.02.17 23:38
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ну, вот и умножь. Ты больше знаешь о том сколько их там и сколько лет они пилят.

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

VD>Получишь сколько они пилят все. А пилят они все вручную и (если не ошибаюсь) на плюсах.

На C++/CLI.

VD>Вот какой у них там объем работ заняла конкретно интерпретация шаблонов? Потому как в остальном язык даже проще какого-нибудь шарпа.

Это он только так выглядит.
А когда начнёшь вчитываться в стандарт у тебя волосы дыбом встанут.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[28]: Портирование нитры.
От: novitk США  
Дата: 13.02.17 23:44
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Я никак не могу понять почему он не стал популярным, ведь за ним стоит Александреску (фактически человек из первой 5-ки самых известных в мире C++) и где только можно и нельзя о нем громко заявляет


Плюсовики испугались и начали толкать стандарт уменьшая разрыв. Потом мобилы подоспели, где плюсы фактически единственный путь к единому коду между Android и iOS. Впрочем если бы гугл за него взялся вместо Го возможно оно бы и взлетело, но увы...
Re[29]: Портирование нитры.
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 13.02.17 23:53
Оценка:
Здравствуйте, novitk, Вы писали:

N>Плюсовики испугались и начали толкать стандарт уменьшая разрыв. Потом мобилы подоспели, где плюсы фактически единственный путь к единому коду между Android и iOS. Впрочем если бы гугл за него взялся вместо Го возможно оно бы и взлетело, но увы...


я правильно понимаю мысль: "современный C++ настолько хорош, что D больше не актуален"?
Re[30]: Портирование нитры.
От: novitk США  
Дата: 14.02.17 00:16
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>я правильно понимаю мысль: "современный C++ настолько хорош, что D больше не актуален"?


В принципе да. D в голом емаксе вряд ли будeт сильно удобней чем студия с VA, бустом и прочим добром. Код правда будет более читаем, но видимо этого не достаточно.
Re[11]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.02.17 00:36
Оценка:
Здравствуйте, alex_public, Вы писали:

VD>>В С++ 14 еще есть статические функции, которые можно вызвать из макросов. Для них тоже нужен интерпретатор или JIT-компилятор.


_>В смысле не из макросов, а из шаблонов?


Да, из шаблонов. Короче, во время компиляции. Просто уже профессионально путаю их.

_>Тогда да, есть такое, хотя и намного более слабое чем в D — там можно любую функцию так использовать (компилятор сам будет разбираться все ли данные ему доступны на момент компиляции), а в C++ только отдельно помеченную как constexpr.


Я в курсе. В Немерле все еще круче. Там просто любую функцию можно использовать, но из макросов.

Вопрос в том, что шаблоны по неволе стали полными по Тьюрингу и для них требуется писать интерпретатор или JIT-компилятор.

_>Не, скорее всего модулей не будет в C++17.


Гы. Паша Кузнецов мне лет 15 назад говорил, что их "вот вот включат". Видимо этот процесс будет вечным. А нормальную поддержку IDE без них не сделать.

_>Во всяком случае в текущей версии ничего такого нет, а она уже почти итоговая.


Мои соболезнования. Что тут еще можно сказать?

_>Ну и кстати лично я не особо по этому поводу переживаю, т.к. в реальности модули для C++ являются всего лишь неким средством автоматической синхронизации h и lib файлов. Т.е. грубо говоря решают проблему, от которой и раньше никто не страдал.


Все страдают. Пока их нет сделать человеческую поддержку IDE затруднительно (мягко говоря). Фактически все прекомпайлед-хэадеры — это попытки создать собственную модульную модель (эмуллируемую).

_>(в которой добавили полиморфные лямбды, которые реально крайне удобные и которые мало в каких статических языках имеются).


Во-первых, имеются кое где. А во-вторых, в реальности нужны крайне редко. Ну, или я не понимаю, что ты под полиморфными понимаешь.

_>автоматическое определение параметров шаблонов при объявление переменных (типа "pair p(10, 10.0);").


Вот это не понял.

_>А все главные вкусности, получается по факту откладываются на C++20, который теоретически по плану должен был быть "доработкой C++17"...


Ну, ты не особо надейся, что все описанное тобой в C++20 войдет. Я про все это еще в 2000-ном году слышал. Причем, когда вышел C++11 мне такие же как ожидающие говорили, что все это перенесли на следующий стандарт.

Тогда еще шутка ходила, что C++0x подразумевает, что x шестнадцатеричная. Так вот с этого кода она уже устарела.

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

Что касается шаблонов, то мой взгляд на этот таков. Шаблоны вещь полезная и нужная, но только как средство обобщенного программирования. А вот как средство метапрограммирования их использовать ненадо. Для этого лучше сделать специализированное решение. Оно будет проще в понимании, и одновременно мощнее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.02.17 00:53
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Понятно что тебе хочется заниматься доработкой самого инструмента, а не его применением в каких-то частных случаях.


Не, мне интересно было бы заняться универсальным языком. Но С++ — это тот язык на которое хотелось бы тратить время. Отдельные концепции из С++ — да. Но полная реализация стандарта со всеми его косяками — нет.

При этом я буду только "за", если кто-то возьмется за это. И с удовольствием ему помогу консультациями.

_>Но отмечу, что описанный мной частный случай мог бы сам по себе дать вам коммерческий успех, как отдельный востребованный инструмент.


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

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

_>Что касается кэширования при работе анализатора в IDE, то да, для C++ это обязательная вещь. Помнится ещё VisualAssist в древние времена 6-ой студии делал это, скидывая результаты анализа всех используемых библиотек на диск.


Ага. И безнадежно глючил (врал). А для разных АТЛ имел вообще заранее прибилднутые кэши (видимо ручную обработанные).

_>Эклипс помнится тоже таким старадал (сейчас не знаю). А вот Netbeans и QtCreator уже полностью обходятся анализом при загрузке проекта и кэшированием в памяти.


Ой не верю. Там на каждый файл нужно кэш формировать. Если их не реюзать и не сбрасывать на диск, можно люую память потратить. Да и формирование их по огромным инклюдам — это не быстрое занятие.

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

_>Кстати, ещё отдельная мысль по этому поводу: для ускорения компиляции больших проектов на C++ традиционно используют предкомпилированные заголовки, а вот из анализаторов IDE данный факт кажется не использует никто...


Потому что у них закрытие форматы. VS старых версий использовало их. Но похоже отказались.

_>Ладно, там посмотрим, ближе к делу)


А зачем тебе 100%-ный С++? Какова цель?

Мне кажется в современный язык можно взять ряд его концепций, но тащить все наследство — неразумно. Сделать поддержку сишных библиотек — разумно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.02.17 03:41
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Интересная теория, но она вроде как не позволяет объяснить популярность как минимум Haskell, Python, Ruby.


Питон взяла под крыло известная корпорация. Хаскель и Руби никогда особо популярными не было. Хаскель в принципе, а Руби имел всплеск вызванный "Руби на рельсах". В появлением развитых веб-фреймворков для взлетевших языков и с переходом веба броузеры этот всплеск сошел на нет.

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

Меня действительно интересует этот вопрос, так как ситуация с D выглядит реально загадочной.

KP>Я никак не могу понять почему он не стал популярным, ведь за ним стоит Александреску (фактически человек из первой 5-ки самых известных в мире C++) и где только можно и нельзя о нем громко заявляет


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

Ну, и в какой-то мере Ди все же взлетел. Все же для него сейчас можно найти целый ряд IDE. Есть библиотеки. Есть комьюнити, хотя и не большой.

Может я максималист, то для меня взлетел это хотя бы как Питон. Вот Ява, Шарп, ЖабаСкрипт, С++, С — взлетели. А Руби, Хаскель, Ди, Окамл, Скала, Немерл, Раст и даже Го — это языки ограниченных комьюнити. Они живут пока ими интересно заниматься их авторам или людям из комьюнити. Конечно можно мериться размерами комьюнити, но по сути это ничего не меняет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Портирование нитры.
От: alex_public  
Дата: 14.02.17 06:04
Оценка:
Здравствуйте, novitk, Вы писали:

_>>Сможешь ли ты сделать на базе этого точную копию скажем C++14 (это естественно не итоговая цель, а важнейший промежуточный шаг, хотя и он при определённом подходе может принести вам коммерческий успех)? Ну чтобы итоговый продукт мог компилировать произвольный C++ исходник и результат не отличался от clang'а. И при этом естественно работала бы поддержка в IDE.

N>А чего ты просто libCLang не возьмешь? Это же и есть отлаженный плюсовый фронтенд с блэкджеком и ... байндингами для Питона/Явы.

Тут есть две причины:

1. Так сказать психологическая. Вообще я до данной дискуссии даже не мог подумать о том, чтобы замахнуться на ТАКОЕ. Я имею в виду на доработку великого и ужасного C++. ))) А вот в процессе общения я как-то впечатлился рассказами о лёгкости подобного на Nitra (подразумевая что кто-то уже создал описание самого языка) и подумал "почему бы и нет, если это действительно легко с такими инструментом". Сразу мысленно представил себе, как я добавлением пары строк (в стиле грамматик bison) добавляю новую возможностью в язык (к примеру не хочу ждать до 2020-го года чтобы иметь интроспекцию).

2. Практическая. Если мы вводим новую возможность в язык, то хотелось бы чтобы она при этом не сломала работу IDE. И вроде как Nitra именно это и обеспечивает в автоматическом режиме.

Да, а вообще если серьёзно развивать твою мысль, то можно попробовать сделать следующее: реализовать аналог макросов Немерле с помощью плагина в clang (http://clang.llvm.org/docs/ClangPlugins.html). А их собственно исполнение можно попробовать реализовать на встроенном в плагин Питоне (чтобы не извращаться с загрузками бинарников в компилятор, как в Nemerle). В принципе такое должно не долго писаться (ммм, прямо захотелось попробовать, но к сожалению сейчас полностью другими делами занят). А получив макросы в стиле Nemerle уже можно делать определённые расширения языка прямо на ходу. Единственно что IDE будет на это всё плохо реагировать...
Re[27]: Портирование нитры.
От: alex_public  
Дата: 14.02.17 06:23
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Ну, а если брать С++ vs. D/Rust, то опять же С++ не имеет какого-то невероятного превосходства в этой области.


Вообще то как раз имеет, но в случае D опять же не всё так просто.

Значит смотри, как раз мир C++ библиотек не менее важен, чем мир C библиотек. К той же Qt есть биндинги наверное со всех языков в мире (включая и .net). Причём все эти обёртки пишутся руками и это прорва кода (Qt жирная). Но делают, потому что это того стоит — по сути лучший по функциональности инструмент в своей области. И это не единственный пример. Так что задел C++ библиотек — это очень важно.

Так вот в случае D особая ситуация, потому как он поддерживает по сути прямой вызов не только C библиотек, но и C++. Причём в автоматическом режиме (с помощью специального компилятора).

VD>С Ди не работаю, но беглый поиск привел сюда:

VD>https://wiki.dlang.org/IDEs
VD>Что-то мне кажется, что у С++ с IDE не сильно лучше.

Вообще то сильно лучше. ))) Но и с D уже можно нормально работать.
Re[32]: Портирование нитры.
От: alex_public  
Дата: 14.02.17 06:50
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Так а много ты знаешь таких языков? Чтобы был обязательный GC и при этом нормальная работа с указателями? )

WH>Мы тут вроде принципиальные вопросы обсуждаем.

И? То, что готовых инструментов нет — это мы уже выяснили. Ты хочешь сказать, что можешь сейчас сесть и написать подобное (знаешь как реализовать подходящий GC)?

_>>Что для C++ естественно является просто стандартной опцией компилятора.

WH>Ты вспомни на что я отвечал то.
WH>

WH>Собственно в теории скомпилировать не проблема. Только вот рантайм языка должен быть заточен под реализацию для ядра (речь даже не про решение проблем из предыдущего абзаца, а банально про другое системное API, используемое рантаймом). Т.е. грубо говоря в отличие от C/C++ мира, где используется один и тот же инструмент для создания кода в любых режимах работы, то тут понадобится два отдельных инструмента.


И? Ты видишь что-то общее между опцией компилятора (отключающей языковую возможность) и необходимостью переписывать часть рантайма (GC) под совсем другой (тот же kmalloc выделяет физическую память, постранично) системный API?

_>>А что ты там видишь нестандартного кроме техники инстанцирования шаблонов? Или это именно они наводят на тебя такой ужас? )

WH>Наслоение кучи маразмов.
WH>Их так много что нет ни одного компилятора который бы соответствовал стандарту.

Ну вот зачем ты постоянно подобную ерунду пишешь. Это же просто враньё:
https://clang.llvm.org/cxx_status.html
https://gcc.gnu.org/projects/cxx-status.html#cxx14
Текущий стандарт (это C++14) уже наверное года два как имеет 100% поддержку в главных компиляторах. Собственно если посмотришь на эти ссылки, то увидишь, что даже ещё не вышедший C++17 уже частично реализован. Т.е. после официальной публикации стандарта он станет на 100% поддерживаемым опять же за несколько месяцев. Более того, в том же gcc уже реализована поддержка концептов (которые даже в C++17 не попали и откладываются до C++20) — ну это они явно поспешили, так что ею точно нельзя пользоваться (изменится ещё всё), разве что поиграться для пробы.

_>>Ну вот смотри, простейший пример на Питоне:

WH>Простейший говнокод который ничего не делает.

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

WH>Все аргументы защитников динамически типизированных языков всегда сводятся к подобной фигне.

WH>Вот поэтому я и прошу ЗАДАЧУ ибо статическая типизация всегда отсекает некие извращения.

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

WH>В данном случае сделать статически типизированный язык, который такое поймёт можно. Но нахрен не нужно.


"Но нахрен не нужно" — это классическая отмазка для тех ситуаций, когда не хочется признаваться что "не могу". )))

_>>Что руководству надоело тратить время ценных специалистов на детских игрушки и они перевели их на улучшение реальных продуктов. )

WH>А я вижу, что некомпетентные менагеры закрыли перспективный продукт и перевели людей на поддержку легаси.

_>>P.S. Подсветка синтаксиса для Питона на форуме кривая — даже тупо ключевые слова не видит.

WH>Исправь.
WH>https://github.com/rsdn/RsdnFormatter/blob/master/Format/CodeFormat/Patterns/Python.xml

Ну точно, нет "lambda" в списке ключевых слов. )))
Re[30]: Портирование нитры.
От: alex_public  
Дата: 14.02.17 07:09
Оценка:
Здравствуйте, kaa.python, Вы писали:

N>>Плюсовики испугались и начали толкать стандарт уменьшая разрыв. Потом мобилы подоспели, где плюсы фактически единственный путь к единому коду между Android и iOS. Впрочем если бы гугл за него взялся вместо Го возможно оно бы и взлетело, но увы...

KP>я правильно понимаю мысль: "современный C++ настолько хорош, что D больше не актуален"?

Если смотреть только на ключевые глобальные возможности, то в D есть три отсутствующих в C++: модули, статическая интроспекция, более развитое МП на шаблонах (как минимум работа со строками в параметрах шаблонов и функция mixin). Помимо этого в D есть ещё десяток мелких вкусностей (которые тоже со временем не плохо бы перетащить в C++), но такие вещи уже обычно не определяют выбор языка. Так вот, из тех трёх глобальных возможностей две (модули и интроспекция) были заявлены на появление в C++17, но к сожалению по ним не успели договориться. Понятно что в следующем стандарте появится уж точно, так что глобально твоя фраза становится похожа на реальность. Ну а по мелочам там ещё тырить и тырить. )))

Но это ещё не всё. Если когда-то D был очевидным надмножеством C++, то уже после выхода C++11 это перестало быть таковым. Потому что в C++ добавили не только часть возможностей из D, но и свои, полностью оригинальные и очень полезные (например семантику перемещения). А в D что-то не наблюдается развития в эту сторону. Собственно там в основном заняты развитием инфраструктуры языка (что в принципе верно), а сам язык уже не особо трогают, пользуясь огромным изначальным заделом. В итоге получается, что старичок C++ начинает выглядеть более развивающимся и инновационным...
Re[12]: Портирование нитры.
От: alex_public  
Дата: 14.02.17 07:35
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Не, скорее всего модулей не будет в C++17.

VD>Гы. Паша Кузнецов мне лет 15 назад говорил, что их "вот вот включат". Видимо этот процесс будет вечным. А нормальную поддержку IDE без них не сделать.

Ну скажем в компиляторе C++ от MS они уже есть (https://blogs.msdn.microsoft.com/vcblog/2015/12/03/c-modules-in-vs-2015-update-1/). Но смысла от этого всё равно мало, потому что существуют шаблоны. И библиотеки типа Boost'а.

_>>(в которой добавили полиморфные лямбды, которые реально крайне удобные и которые мало в каких статических языках имеются).

VD>Во-первых, имеются кое где. А во-вторых, в реальности нужны крайне редко. Ну, или я не понимаю, что ты под полиморфными понимаешь.

Полиморфные — это без указания типа (т.е. "[](auto x) {}" вместо "[](int x) {}"). Собственно с точки зрения C++ это был абсолютно очевидный шаг, т.к. лямбды в нём являются просто краткой записью функциональных объектов (а они от рождения могли быть параметризованы шаблоном). По сути просто довели до ума реализацию. Но в итоге это получилось очень удобно для множества разных техник. Да и вообще это способствует "непрерывному" выводу типов в коде приложения.

_>>автоматическое определение параметров шаблонов при объявление переменных (типа "pair p(10, 10.0);").

VD>Вот это не понял.

Ну в текущем стандарте вместо указанной строчки требовалось бы написать "pair<int, double> p(10, 10.0);",

_>>А все главные вкусности, получается по факту откладываются на C++20, который теоретически по плану должен был быть "доработкой C++17"...

VD>Ну, ты не особо надейся, что все описанное тобой в C++20 войдет. Я про все это еще в 2000-ном году слышал. Причем, когда вышел C++11 мне такие же как ожидающие говорили, что все это перенесли на следующий стандарт.

Да оно собственно уже всё есть (в том же gcc уже концепты работают (подключаются отдельной опцией)) или уже прямо в компиляторах или в виде готовых проверенных предложений. Там чисто бюрократические проблемы — не успели договориться сторонники различных реализаций.

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

VD>Что касается шаблонов, то мой взгляд на этот таков. Шаблоны вещь полезная и нужная, но только как средство обобщенного программирования. А вот как средство метапрограммирования их использовать ненадо. Для этого лучше сделать специализированное решение. Оно будет проще в понимании, и одновременно мощнее.

Ты знаешь, я вот практически со всем этим твоим текстом согласен, кроме самого первого утверждение. Причём по совсем другим причинам: для меня тут главная причина не в какой-то крутизне синтаксиса, а в мощнейшей инфраструктуре. Т.е конечно же можно попробовать её захватить и по другому (как в D сделали), но не уверен, что это проще.
Re[5]: Портирование нитры.
От: alex_public  
Дата: 14.02.17 08:42
Оценка: +1
Здравствуйте, VladD2, Вы писали:

_>>Но отмечу, что описанный мной частный случай мог бы сам по себе дать вам коммерческий успех, как отдельный востребованный инструмент.

VD>Ну, если ты веришь в коммерческий успех этого дела, то можешь взять меня в долю. В смысле реализовать сам, с моей помощью.

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

VD>Я вообще не понимаю как можно получить коммерческий успех от языка имещего массу бесплатных реализаций компилятор и движков IDE.


Ну для начала, если говорить о продукте без Nitra (в смысле может реализованном внутри на ней, но без вынесения этого наружу), то естественно про компиляторы говорить смешно. А вот поддержка в IDE — это другой вопрос... До сих пор нет ни одной, которая бы правильно работала со 100% кода. Точнее это я конечно неверно сказал. Безусловно есть — анализатор кода на базе clang'a. На базе него существуют плагины под множество редакторов и ide. Только вот есть один "небольшой" нюанс: на проектах с тяжёлыми библиотеками (а у нас других и не бывает) автодополнение (идеально корректное в любых случаях) может открываться по десятку секунд (на моей машине с топовым xeon'ом и самым быстрым из существующих ssd). Так что на практике на всех серьёзных проектах работают с обычными анализаторами кода из топовых IDE, которые изредка ошибаются, но зато работают мгновенно. Соответственно если бы вам удалось сделать одновременно не тормозящий и не ошибающийся анализатор кода C++, то у вас реально были бы тысячи потенциальных пользователей.

Ну и отдельно можно рассмотреть ситуацию с предоставлением внутренностей (т.е. код на Nitra) — тут уже мог бы быть интересен и компилятор. Потому что он получался бы мгновенно дорабатываемым под любые специфические нужды. Конечно тут аудитория во много порядков меньше, но тоже нашлись бы заинтересованные люди. В первую очередь создатели разных DSL (типа ODB). Ну и вот тому же комитету по C++ явно пригодился бы такой инструмент...

_>>Эклипс помнится тоже таким старадал (сейчас не знаю). А вот Netbeans и QtCreator уже полностью обходятся анализом при загрузке проекта и кэшированием в памяти.

VD>Ой не верю. Там на каждый файл нужно кэш формировать. Если их не реюзать и не сбрасывать на диск, можно люую память потратить. Да и формирование их по огромным инклюдам — это не быстрое занятие.
VD>Там же ведь надо на каждое изменение символа все перестраивать. Так что хотя бы в памяти кэш просто обязателен. Ну, а если он есть в памяти, то имеет смысл его на диск писать.

Netbeans и QtCreator точно не пишут никакую ерунду на диск в процессе своей работы. )

_>>Кстати, ещё отдельная мысль по этому поводу: для ускорения компиляции больших проектов на C++ традиционно используют предкомпилированные заголовки, а вот из анализаторов IDE данный факт кажется не использует никто...

VD>Потому что у них закрытие форматы. VS старых версий использовало их. Но похоже отказались.

Ммм, я не про файлы генерируемые компилятором. Я про сам факт наличия в проекте предкомпилированных заголовков. Это автоматически означает специфическую структуру дерева инклудов в проекте (все тяжёлые библиотечные ужасы собраны в один отдельный заголовочный файл, который везде включается). Соответственно если как-то (например в настройках проекта) указывать данный факт анализатору кода, то он может эффективнее работать с этим всем.

_>>Ладно, там посмотрим, ближе к делу)

VD>А зачем тебе 100%-ный С++? Какова цель?
VD>Мне кажется в современный язык можно взять ряд его концепций, но тащить все наследство — неразумно. Сделать поддержку сишных библиотек — разумно.

100%-ный С++ мне сам по себе не нужен. Мне требуются достаточно простые вещи:

1. быстродействующий машинный код под все нужные платформы и архитектуры. LLVM это гарантирует при правильном устройстве языка (размещение объектов на стеке, отсутствие рефлексии и т.п.).
2. доступ на низкий уровень: прямой вызов системного api, доступ к указателям, возможность работы без GC, встроенный ассемблер (полезно, но не критично).
3. наличие библиотек: автоматическое (без написания руками обёрток) подключение всех C библиотек и желательно части (хотя бы таких как Qt, которые не на базе МП) C++ библиотек.
4. наличие поддержки языка в топовых IDE (ну как минимум одной и желательно кроссплатформенной).
5. современный удобный синтаксис (какой конкретно мне после стольких языков уже не принципиально), допускающий расширение языка с помощью эффективного МП.

Вот такие простые пожелания и в идеале хотелось бы получить просто готовый подобный инструмент. Но даже если заниматься созданием нужного языка самому, то всё равно логичнее отталкиваться от некого уже близкого, готового и продуманного. И потом просто развивать его дальше по своему сценарию. Так вот в роли этой базы под данные требование по идее как раз C++ и укладывается лучше всех.
Re[27]: Портирование нитры.
От: DarkEld3r  
Дата: 14.02.17 11:04
Оценка:
Здравствуйте, novitk, Вы писали:

N>У Скалы с IDE-поддержкой проблем давно нет. В смысле там все лучше в Еclipse и IDEA чем у Немерле в студии.

Ну значит скалу вычёркиваем.

Hа джаве/скале не пишу, так что могу и наврать, но жалобы встречал. Опять же, скала язык всё-таки навороченный и, учитывая, что котлин затачивался под поддержку в ИДЕ, можно предложить, что с какими-то сложными случаями проблемы всё-таки будут. То, что в других ИДЕ/языках ситуация хуже, не аргумент.
Re[27]: Портирование нитры.
От: DarkEld3r  
Дата: 14.02.17 13:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Не вижу я этого.


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

Но опять же, и на немерле и на скале можно писать как на "улучшенных" C#/джаве и использовать имеющиеся библиотеки. С D и, уж тем более, растом, так не получится.

VD>Предположим, но как-то у Скалы, Немерла и даже Котлина это ситуацию не меняеет.


Как сказать: на скале и котлине работу найти более чем реально. На D/расте — предложений, по сути, нет. Плюс, при желании, ты можешь написать отдельные модули в C#-проекте на немерле, а Д/раст и тут пролетают.

VD>Незнаю как для Раста, но для Ди вроде как наклепано не мало библиотек.


"Наклепано" и для раста изрядно, возможно, даже больше, учитывая, что у D "менеджер пакетов" появился не сразу. Вот только качество всего этого очень разное, чаще никакое.

VD>Что-то мне кажется, что у С++ с IDE не сильно лучше.


Лучше, намного лучше. Достаточно сказать, что есть нормальные коммерческие IDE. Насчёт D тоже могу быть не объективен, но когда щупал Visual-D, то этот плагин был в очень базовом состоянии, есть подозрение, что остальное тоже не сильно лучше. Если же смотреть на раст, то всё ещё печальнее: дополнение везде так-себе работает, а самый перспективный (на мой взгляд) плагин не умеет дебаг. Надеюсь ситуация будет постепенно улучшаться, но сомневаюсь, что быстро.
Для сравнения: для Go уже делают специальные IDE, а не ограничиваются сырыми плагинами. Вполне себе показатель успеха.

VD>Нет. Они его боятся. Есть кое-что для DSL-ей, но они интерпретируются в рантайме, так как ничего для генерации кода нет.


В расте макросы тоже ограничены и по тем же причинам — боятся мощности. Печально, в общем.

VD>ОК, тогда объясни мне почему С++ по прежнему популярен, а не тот Ди. Ди же вроде проще?


Да не проще он. Ну да, GC убирает часть головной боли, но тут же добавляется ворох новых (по крайней мере, на момент появления) фич. С++ критикуют за перегруженность и именно в этом момент D ничуть не отстаёт. Раст, как по мне, тоже не такой простой, как некоторые рассказывать любят, но хотя бы видно, что дизайн продумывали, а не просто "исправляли С++" и это при наличии новых (вносящих дополнительную сложность) коцепций.

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

Ещё можно вспомнить D1/D2 и "две стандартные библиотеки" — часто этот аргумент всплывает. Сам я, на тот момент, D не интересовался, так что сложно судить насколько это реальная проблема. Лично меня язык, скажем так, недостаточно впечатлил. Какие-то проблемы решаются, кое-что поудобнее стало, но принципиальной разницы не ощущается.

Опять же, среди плюсовиков немало таких, кто услышав про "GC", плюётся. Неважно насколько это обосновано, но такие люди могут и решения принимать.

VD>Вот теория брэнда объясняет буквально все. Приемлемое качество и брэнд == успех. Ну, естественно брэн не сам по себе дает успех, но это бабло нужное для продктизации продукта, это пиар нужный для внедрения в мозг идеи о необходимости перхода на язык и это какие-то психологические аспекты восприятия.


Спорить с тем, что деньги влияют на успех глупо. С другой стороны, есть примеры взлёта языков без мощного финансирования и наоборот. Скажем, гугловый Go взлетел, а их же Dart оказался не востребован.
Тем более, что "бренд" может прийти потом — тот же раст изначально был проектом одного человека, поддержка и деньги пришли потом. Хотя, конечно, засчитывать ему успех ещё очень рано.

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

Возможности и желания у людей сильно разные. Скажем, я был бы рад появлению подходящего (мне) языка с мощной макросистемой, но идеалом видится нечто вроде подрихтованного раста, а ты про "кучу указателей" слышать не хочешь. При этом прекрасно понимаю, что выделить достаточно времени для этого не могу (пусть даже будет "не хочу"). Опять же, даже если нафантазировать, что я беру и делаю LLVM-бекенд, затем пилю на нитре сам язык, то результат надо ещё как-то продвигать. И дело даже не в бренде, а в том, что с менеджед языков на такое не пойдут, не всем плюсовикам по вкусу растовые фичи, а в расте многие как раз ценят "наглядность" и макросов будут бояться. В общем, выбрать целевую аудиторию сложно, а делать игрушку для себя одного нет смысла.
Re[29]: Портирование нитры.
От: DarkEld3r  
Дата: 14.02.17 13:14
Оценка:
Здравствуйте, novitk, Вы писали:

N>Впрочем если бы гугл за него взялся вместо Го возможно оно бы и взлетело, но увы...

Судя по тому, каким получился Go, D они ни за что не выбрали бы.
Re[28]: Портирование нитры.
От: novitk США  
Дата: 14.02.17 14:29
Оценка: 6 (1)
Здравствуйте, DarkEld3r, Вы писали:

DE>Hа джаве/скале не пишу, так что могу и наврать, но жалобы встречал. Опять же, скала язык всё-таки навороченный и, учитывая, что котлин затачивался под поддержку в ИДЕ, можно предложить, что с какими-то сложными случаями проблемы всё-таки будут. То, что в других ИДЕ/языках ситуация хуже, не аргумент.


Жалобы есть, но оно работает и намного ближе к Джаве чем к плюсам (VA, про CLion не знаю). 3-4 года назад было плохо, а сейчас нормально. Eclipse на больших проектах тормозит, но точность довольно высокая. У IDEA наоборот.
Re[4]: Портирование нитры.
От: novitk США  
Дата: 14.02.17 14:42
Оценка:
Здравствуйте, alex_public, Вы писали:


_>Да, а вообще если серьёзно развивать твою мысль, то можно попробовать сделать следующее: реализовать аналог макросов Немерле с помощью плагина в clang (http://clang.llvm.org/docs/ClangPlugins.html). А их собственно исполнение можно попробовать реализовать на встроенном в плагин Питоне (чтобы не извращаться с загрузками бинарников в компилятор, как в Nemerle). В принципе такое должно не долго писаться (ммм, прямо захотелось попробовать, но к сожалению сейчас полностью другими делами занят). А получив макросы в стиле Nemerle уже можно делать определённые расширения языка прямо на ходу. Единственно что IDE будет на это всё плохо реагировать...


IDE тоже должны использовать libCLang, это собственно одна из причин его появления и финансирования Apple.

Я вот только не понял зачем в JB для СLion пишут свой front-end. http://rsdn.org/forum/philosophy/6697828
Автор: alex_public
Дата: 14.02.17

И если уж пишут, то почему на C++? И уж если на C++, то почему на CLI? И уж если на CLI и Wolfhound под боком, то почему не на Нитре?
Отредактировано 14.02.2017 14:45 novitk . Предыдущая версия .
Re[13]: Портирование нитры.
От: novitk США  
Дата: 14.02.17 14:47
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>Получишь сколько они пилят все. А пилят они все вручную и (если не ошибаюсь) на плюсах.

WH>На C++/CLI.
Тут вроде Нитру использовать сам бог велел. Почему не стали?
Re[14]: Портирование нитры.
От: WolfHound  
Дата: 14.02.17 15:31
Оценка: 10 (1)
Здравствуйте, novitk, Вы писали:

WH>>На C++/CLI.

N>Тут вроде Нитру использовать сам бог велел. Почему не стали?
По тому что начали задолго до того, как мы вообще в JB пришли. И в тот момент нитра совсем не работала.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[33]: Портирование нитры.
От: WolfHound  
Дата: 14.02.17 15:31
Оценка:
Здравствуйте, alex_public, Вы писали:

_>И? То, что готовых инструментов нет — это мы уже выяснили. Ты хочешь сказать, что можешь сейчас сесть и написать подобное (знаешь как реализовать подходящий GC)?

Как реализовать подходящий ГЦ я тебе уже показал.
И это, не считая того что есть несколько ОС в которых драйвер с ГЦ обычное дело.

_>И? Ты видишь что-то общее между опцией компилятора (отключающей языковую возможность) и необходимостью переписывать часть рантайма (GC) под совсем другой (тот же kmalloc выделяет физическую память, постранично) системный API?

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

_>Ну вот зачем ты постоянно подобную ерунду пишешь. Это же просто враньё:

_>https://clang.llvm.org/cxx_status.html
_>https://gcc.gnu.org/projects/cxx-status.html#cxx14
Маркетинговые заявления про соответствие и соответствие не одно и тоже.

_>Это конечно синтетический пример, но он демонстрирует как раз классические приёмы ФП. Так что подобный код очень даже часто встречается.

Так приведи не синтетический раз оно часто встречается.

_>"Но нахрен не нужно" — это классическая отмазка для тех ситуаций, когда не хочется признаваться что "не могу". )))

Это ты не можешь привести практическую задачу.
Поэтому придумываешь синтетическую хрень и радуешься.

И вот так каждый раз. Адепт динамической типизации придумывает бесполезный код, который ничего не делает, требует повторить его буква в букву и объявляет себя победителем.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[15]: Портирование нитры.
От: novitk США  
Дата: 14.02.17 16:13
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>По тому что начали задолго до того, как мы вообще в JB пришли. И в тот момент нитра совсем не работала.

А почему libClang не используют?
Re[16]: Портирование нитры.
От: WolfHound  
Дата: 14.02.17 18:08
Оценка:
Здравствуйте, novitk, Вы писали:

N>А почему libClang не используют?

Не знаю. Не изучал вопрос.
Скорее всего по тому что libClang работает как компилятор и для режима IDE не пригодна.
Это нитра делает фронтенды которые могут работать в обоих режимах. Но обычно это не так. Ибо фронтенд для ИДЕ намного сложнее чем для компилятора.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: Портирование нитры.
От: novitk США  
Дата: 14.02.17 18:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Скорее всего по тому что libClang работает как компилятор и для режима IDE не пригодна.

WH>Это нитра делает фронтенды которые могут работать в обоих режимах. Но обычно это не так. Ибо фронтенд для ИДЕ намного сложнее чем для компилятора.

Удобная подержка IDE была заявлена как одна из причин начала нового проекта, так как прикрутить что-то к gcc слишком трудно.
Собственно все на главной странице:
*Support diverse clients (refactoring, static analysis, code generation, etc.)
*Allow tight integration with IDEs

Вроде KDevelop уже на нем. Есть и другие: https://github.com/cppit/jucipp, http://codelite.org/LiteEditor/ClangIntegration41
Re[6]: Портирование нитры.
От: WolfHound  
Дата: 14.02.17 18:25
Оценка:
Здравствуйте, alex_public, Вы писали:

_>100%-ный С++ мне сам по себе не нужен. Мне требуются достаточно простые вещи:

Те тебе нужен кроссплатформенный ассемблер.

_>Вот такие простые пожелания и в идеале хотелось бы получить просто готовый подобный инструмент. Но даже если заниматься созданием нужного языка самому, то всё равно логичнее отталкиваться от некого уже близкого, готового и продуманного. И потом просто развивать его дальше по своему сценарию. Так вот в роли этой базы под данные требование по идее как раз C++ и укладывается лучше всех.

Страуструп тоже так думал... получился С++.
Легаси фичи нужно безжалостно давить.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[18]: Портирование нитры.
От: WolfHound  
Дата: 14.02.17 18:31
Оценка:
Здравствуйте, novitk, Вы писали:

N>Удобная подержка IDE была заявлена как одна из причин начала нового проекта, так как прикрутить что-то к gcc слишком трудно.

Вот тут
Автор: alex_public
Дата: 14.02.17
alex_public говорит что он на автодополнении по 10 секунд тупит. Это ни в какие ворота не лезет.
Ибо лимит времени 100 миллисекунд. Всё что больше уже тормозит.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: Портирование нитры.
От: novitk США  
Дата: 14.02.17 19:03
Оценка:
Здравствуйте, WolfHound, Вы писали:

N>>Удобная подержка IDE была заявлена как одна из причин начала нового проекта, так как прикрутить что-то к gcc слишком трудно.

WH>Вот тут
Автор: alex_public
Дата: 14.02.17
alex_public говорит что он на автодополнении по 10 секунд тупит. Это ни в какие ворота не лезет.

WH>Ибо лимит времени 100 миллисекунд. Всё что больше уже тормозит.

Там надо смотреть детали. Как ты понимаешь особо креативный шаблон C++ или макро в Немерле способно вообще повесить машинку. ИМХО это просто вопрос контроля и оптимизации.
Re[5]: Портирование нитры.
От: alex_public  
Дата: 14.02.17 20:31
Оценка:
Здравствуйте, novitk, Вы писали:

_>>Да, а вообще если серьёзно развивать твою мысль, то можно попробовать сделать следующее: реализовать аналог макросов Немерле с помощью плагина в clang (http://clang.llvm.org/docs/ClangPlugins.html). А их собственно исполнение можно попробовать реализовать на встроенном в плагин Питоне (чтобы не извращаться с загрузками бинарников в компилятор, как в Nemerle). В принципе такое должно не долго писаться (ммм, прямо захотелось попробовать, но к сожалению сейчас полностью другими делами занят). А получив макросы в стиле Nemerle уже можно делать определённые расширения языка прямо на ходу. Единственно что IDE будет на это всё плохо реагировать...

N>IDE тоже должны использовать libCLang, это собственно одна из причин его появления и финансирования Apple.

Ну во-первых в контексте нашей дискуссии это означает, что надо будет ещё разбираться и с устройством плагина в твою IDE на базе clang'a. Конечно после доработки компилятора это уже мелочи наверное, но всё равно отдельная задача.

А во-вторых на больших проектах (точнее даже на маленьких, но использующих тяжёлые библиотеки) текущие версии таких плагинов сильно подтормаживают. Конечно можно сказать что это вина реализации самих плагинов (зная что бывают тяжёлые места, можно предусмотреть специальную обработку, а не работать в лоб), а не clang'а. Но пока я что-то не видел эффективных реализаций. Хотя на демках (в которых код ограничен использованием STL) оно конечно же всегда выглядит беспроблемно, причём даже не в IDE:
  Скрытый текст
https://www.youtube.com/watch?v=XxgGbup2Sno


N>Я вот только не понял зачем в JB для СLion пишут свой front-end. http://rsdn.org/forum/philosophy/6697828
Автор: alex_public
Дата: 14.02.17

N>И если уж пишут, то почему на C++? И уж если на C++, то почему на CLI? И уж если на CLI и Wolfhound под боком, то почему не на Нитре?

Ну я про это не в курсе. Могу только сказать, что я пробовал CLion — он работает как и большинство топовых IDE (шустро на любых проектах, но при этом не всегда верно).
Re[34]: Портирование нитры.
От: alex_public  
Дата: 14.02.17 20:50
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>И? То, что готовых инструментов нет — это мы уже выяснили. Ты хочешь сказать, что можешь сейчас сесть и написать подобное (знаешь как реализовать подходящий GC)?

WH>Как реализовать подходящий ГЦ я тебе уже показал.

Если ты реально знаешь как реализовать нечто подобное, то тебе уже давно стоило бы реализовать .net аналог zing'а и грести деньги лопатой, как это делают в azul.

WH>И это, не считая того что есть несколько ОС в которых драйвер с ГЦ обычное дело.


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

_>>Ну вот зачем ты постоянно подобную ерунду пишешь. Это же просто враньё:

_>>https://clang.llvm.org/cxx_status.html
_>>https://gcc.gnu.org/projects/cxx-status.html#cxx14
WH>Маркетинговые заявления про соответствие и соответствие не одно и тоже.

Ну раз так, то тебя конечно же не затруднит привести любой пример кода, удовлетворяющего C++14 и при этом некомпилируемого текущими версиями gcc или clang? )

_>>Это конечно синтетический пример, но он демонстрирует как раз классические приёмы ФП. Так что подобный код очень даже часто встречается.

WH>Так приведи не синтетический раз оно часто встречается.

Да пожалуйста. Пускай будет например так:
v=[1.0, 2.0, 3.0] #список
s={1, 2, 3, 3} #множество
f=lambda s, x: (s+x)/2 #MMA
print reduce(f, v, 0.0), reduce(f, s, 0) #выводит 2.125 2


Ну и чтобы ты не говорил, что это очередной случай не подходящий под статическую типизацию, то вот сразу точный аналог на C++:
list<double> v={1.0, 2.0, 3.0}; //список
set<int> s={1, 2, 3, 3}; //множество
auto f=[](auto s, auto x) {return (s+x)/2;}; //MMA
cout<<accumulate(v.cbegin(), v.cend(), 0.0, f)<<' '<<accumulate(s.cbegin(), s.cend(), 0, f)<<endl; //выводит 2.125 2

в принципе переписывается в лоб, но добавляется определённая громоздкость от указания типа (явного или полиморфного).

_>>"Но нахрен не нужно" — это классическая отмазка для тех ситуаций, когда не хочется признаваться что "не могу". )))

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

А почему динамической типизации то, если был пример и на C++? )
Re[7]: Портирование нитры.
От: alex_public  
Дата: 14.02.17 21:02
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>100%-ный С++ мне сам по себе не нужен. Мне требуются достаточно простые вещи:

WH>Те тебе нужен кроссплатформенный ассемблер.

Только со всеми удобствами) Типа ООП, параметрического полиморфизма, замыканий, вывода типов, перегрузки операторов и т.п. И отдельным пунктом хочется эффективное метапрограммирование.

_>>Вот такие простые пожелания и в идеале хотелось бы получить просто готовый подобный инструмент. Но даже если заниматься созданием нужного языка самому, то всё равно логичнее отталкиваться от некого уже близкого, готового и продуманного. И потом просто развивать его дальше по своему сценарию. Так вот в роли этой базы под данные требование по идее как раз C++ и укладывается лучше всех.

WH>Страуструп тоже так думал... получился С++.
WH>Легаси фичи нужно безжалостно давить.

Но зато язык взлетел. В отличие от множества конкурентов. )
Re[6]: Портирование нитры.
От: novitk США  
Дата: 14.02.17 21:04
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну во-первых в контексте нашей дискуссии это означает, что надо будет ещё разбираться и с устройством плагина в твою IDE на базе clang'a. Конечно после доработки компилятора это уже мелочи наверное, но всё равно отдельная задача.

Mне кажется, что это все же на несколько порядков проще чем разработка свежего фронтенда на Нитре.

_>А во-вторых на больших проектах (точнее даже на маленьких, но использующих тяжёлые библиотеки) текущие версии таких плагинов сильно подтормаживают. Конечно можно сказать что это вина реализации самих плагинов (зная что бывают тяжёлые места, можно предусмотреть специальную обработку, а не работать в лоб), а не clang'а. Но пока я что-то не видел эффективных реализаций.

Надо смотреть детали профайлера. Возможно плагины или сам clang не дооптимизированы, возможно раскрытие шаблонов тяжелое. Только это все будет и в нитре, если ты хочешь получить точный выхлоп.
Re[35]: Портирование нитры.
От: WolfHound  
Дата: 14.02.17 23:41
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Если ты реально знаешь как реализовать нечто подобное, то тебе уже давно стоило бы реализовать .net аналог zing'а и грести деньги лопатой, как это делают в azul.

Реалтаймовые ГЦ бывают разные. Заниматься глобальной сборкой мусора как это делают в азул не обязательно.

_>Хыхы) Ты наверное знаешь, что когда-то вообще существовали в железе процессоры, способные исполнять напрямую байткод жабки. Однако все эти очаровательные инновационные решения благополучно отдыхают на свалке истории... )))

Это вообще к делу не относится.

_>Ну раз так, то тебя конечно же не затруднит привести любой пример кода, удовлетворяющего C++14 и при этом некомпилируемого текущими версиями gcc или clang? )

А вот тут что красненьким покрашено?
https://clang.llvm.org/cxx_dr_status.html

И при этом даже когда оно работает оно в 100 раз медленнее чем минимально приемлемый уровень. О чём ты сам же говоришь.

_>Ну и чтобы ты не говорил, что это очередной случай не подходящий под статическую типизацию, то вот сразу точный аналог на C++:

Да ты вообще не читаешь что тебе пишут. От слова совсем.
Я вообще ничего не говорил про неподходящесть для статики.
Я говорил про то что ничего кроме куска говнокода который ничего не делает и не во всех статически типизированных языках можно повторить слово в слово защитники динамики придумать не в состоянии.
Немерле поддерживает полиморфные локальные функции. Но я их не использовал ни разу. По тому что не надо.
Вот ни разу такого кода не возникало где они в принципе могли бы понадобится.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: Портирование нитры.
От: alex_public  
Дата: 15.02.17 04:05
Оценка:
Здравствуйте, novitk, Вы писали:

_>>Ну во-первых в контексте нашей дискуссии это означает, что надо будет ещё разбираться и с устройством плагина в твою IDE на базе clang'a. Конечно после доработки компилятора это уже мелочи наверное, но всё равно отдельная задача.

N>Mне кажется, что это все же на несколько порядков проще чем разработка свежего фронтенда на Нитре.

Безусловно. Но моя коварная идея была в том, что подобную разработку делал бы не я, а крутые авторы Nitra. ))) Им кстати от этого тоже был бы безусловный плюс — возросшая на порядки известность (естественно в случае успешного решения задачи).

_>>А во-вторых на больших проектах (точнее даже на маленьких, но использующих тяжёлые библиотеки) текущие версии таких плагинов сильно подтормаживают. Конечно можно сказать что это вина реализации самих плагинов (зная что бывают тяжёлые места, можно предусмотреть специальную обработку, а не работать в лоб), а не clang'а. Но пока я что-то не видел эффективных реализаций.

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

Сам clang по скорости очень хорош (для компилятора), но понятно что в случае тяжёлых библиотек там в любом случае могут возникнуть тормоза. С которыми по идее можно бороться в плагине различными кэширующими техниками, таймаутами, фоновыми процессами и т.п. Подозреваю что в большинстве таких плагинов ничего подобного нет, а используется тупо метод "в лоб", в надежде на эффективность clang'а. Я думаю что в принципе задача решаема, если серьёзно подойти к ней (большинство плагинов делается энтузиастами в стиле лишь бы работало). Но лично мне заниматься ею нет особого желания.
Re[36]: Портирование нитры.
От: alex_public  
Дата: 15.02.17 04:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Если ты реально знаешь как реализовать нечто подобное, то тебе уже давно стоило бы реализовать .net аналог zing'а и грести деньги лопатой, как это делают в azul.

WH>Реалтаймовые ГЦ бывают разные. Заниматься глобальной сборкой мусора как это делают в азул не обязательно.

А, т.е. это ты имел ввиду то своё решение, в котором всё отслеживает компилятор? Ну это на мой взгляд имеет ещё меньшую вероятность реализации. ))) Однако если ты думаешь иначе, то тогда опять же предлагаю тебе как можно скорее реализовать это в коде. Обязуюсь быть среди первых тестировщиков и в случае реального успеха распространить везде информацию о нетормозящем GC.

_>>Хыхы) Ты наверное знаешь, что когда-то вообще существовали в железе процессоры, способные исполнять напрямую байткод жабки. Однако все эти очаровательные инновационные решения благополучно отдыхают на свалке истории... )))

WH>Это вообще к делу не относится.

Напрямую конечно не относится. Просто они там все рядом на свалке... И Java процессоры и JavaOS и их идейные последователи из мира .net. )))

_>>Ну раз так, то тебя конечно же не затруднит привести любой пример кода, удовлетворяющего C++14 и при этом некомпилируемого текущими версиями gcc или clang? )

WH>А вот тут что красненьким покрашено?
WH>https://clang.llvm.org/cxx_dr_status.html

Ты видимо не правильно понял. Это issue tracker (точнее выжимка из него, сам он тут http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html) не к clang'у, а к самому стандарту C++ (грубо говоря к pdf документу). Т.е. малого того, что большая часть этих поправок является просто бредом, проигнорированным комитетом, но даже те, из них, что приняты, не обязательно как-то влияют на компилятор.

WH>И при этом даже когда оно работает оно в 100 раз медленнее чем минимально приемлемый уровень. О чём ты сам же говоришь.


Ну для начала ты говорил про компиляторы (к которым никаких существенных претензий сейчас нет), а не про поддержку IDE. Далее, если говорить про плагины к IDE на базе clang'a, то это тоже не совсем верная формулировка — без очень тяжёлых библиотек всё работает идеально.

_>>Ну и чтобы ты не говорил, что это очередной случай не подходящий под статическую типизацию, то вот сразу точный аналог на C++:

WH>Да ты вообще не читаешь что тебе пишут. От слова совсем.
WH>Я вообще ничего не говорил про неподходящесть для статики.

Все аргументы защитников динамически типизированных языков всегда сводятся к подобной фигне.
Вот поэтому я и прошу ЗАДАЧУ ибо статическая типизация всегда отсекает некие извращения.


WH>Я говорил про то что ничего кроме куска говнокода который ничего не делает и не во всех статически типизированных языках можно повторить слово в слово защитники динамики придумать не в состоянии.


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

WH>Немерле поддерживает полиморфные локальные функции. Но я их не использовал ни разу. По тому что не надо.

WH>Вот ни разу такого кода не возникало где они в принципе могли бы понадобится.

Ну так раз поддерживает, то в чём тогда проблема продемонстрировать, что Nemerle способен на такую же удобную запись как и Python? ) Считай что вот встретилась задачка, пускай и на форуме. )))
Re[37]: Портирование нитры.
От: WolfHound  
Дата: 15.02.17 17:16
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Напрямую конечно не относится. Просто они там все рядом на свалке... И Java процессоры и JavaOS и их идейные последователи из мира .net. )))

Ох. Жаба-процессор идея бредовая. Просто по тому что хороший компилятор и хороший процессор всё равно будут намного быстрее и универсальнее.
А вот управляемая ОС идея правильная. Ибо при грамотной реализации она будет быстрее чем ОС классическая. При этом несравнимо безопаснее.
И в мидори от .НЕТ мало что осталось. И по-хорошему нужно оставить ещё меньше.

_>Ну для начала ты говорил про компиляторы (к которым никаких существенных претензий сейчас нет),

Существенных или нет?
И даже для доведения до такого состояния в них вбухали много десятков человеко-лет.

_>а не про поддержку IDE. Далее, если говорить про плагины к IDE на базе clang'a, то это тоже не совсем верная формулировка — без очень тяжёлых библиотек всё работает идеально.

На микропроектах всегда всё быстро работает.

_>Вообще то синтетическим был только первый пример. А второй (который ты благополучно проигнорировал в последнем сообщение) является вполне себе полезным вычислением одной из разновидностей скользящего среднего по коллекции чисел.

Скользящее средние по множеству?

_>Ну так раз поддерживает, то в чём тогда проблема продемонстрировать, что Nemerle способен на такую же удобную запись как и Python? ) Считай что вот встретилась задачка, пускай и на форуме. )))

Да не было никакой задачи.
Как был кусок кода так кусок кода и остался.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[35]: Портирование нитры.
От: novitk США  
Дата: 15.02.17 17:26
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну и чтобы ты не говорил, что это очередной случай не подходящий под статическую типизацию, то вот сразу точный аналог на C++:

...
_>auto f=[](auto s, auto x) {return (s+x)/2;}; //MMA
...
_>в принципе переписывается в лоб, но добавляется определённая громоздкость от указания типа (явного или полиморфного).

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

ИМХО классы типов — musthave для современного языка. Это кстати одна из фич, которой нет в Nemerle1 и как я понимаю Влад не собирается ее делать в Nemerle2.
В Хаскеле например все просто и красиво (заменил на умножение, так деление неоднозначно над целыми. Это можно исправить, но не суть):

Prelude> let myFunc a b = (a + b) * 2
Prelude> foldl myFunc 0 [1.0, 2.0, 3.0]
22.0
Prelude> foldl myFunc 0 [1, 2, 3]
22


В Скалы есть грязь, так как там скрестили ежа и ужа (классический ООП и FP):

scala> import scala.math.Numeric.Implicits._
import scala.math.Numeric.Implicits._

scala> def myFunc[T: Numeric](x: T, y: T) = {
val two = implicitly[Numeric[T]].fromInt(2)
(x + y) * two
}
myFunc: [T](x: T, y: T)(implicit evidence$1: Numeric[T])T

scala> (1 to 3).fold(0)(myFunc)
res0: Int = 22

scala> (1.0 to 3.0 by 1.0).fold(0.0)(myFunc)
res1: Double = 22.0

Re[36]: Портирование нитры.
От: WolfHound  
Дата: 15.02.17 19:22
Оценка: +2
Здравствуйте, novitk, Вы писали:

N>С основным твоим тезисом, что динамика в выразительности рулит, согласен,

Ещё один... тот же вопрос что и всем остальным: Покажи задачу, а не микрокусок говнокода на которой динамика рулит.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[37]: Портирование нитры.
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 15.02.17 19:31
Оценка: +4
Здравствуйте, WolfHound, Вы писали:

WH>Ещё один... тот же вопрос что и всем остальным: Покажи задачу, а не микрокусок говнокода на которой динамика рулит.


Мне кажется, зависит от личного видения прекрасного. С одной стороны, динамический код можно рассматривать как один большой шаблон, что в общем случае довольно удобно так как весь код обобщенный. С другой стороны, так как это динамика, на выходе имеем дикое количество тестов или неожиданные сюрпризы в рантайме гарантированы. Мне больше по душе вывод типов, как в том же OCaml или Haskell.
Отредактировано 15.02.2017 19:33 kaa.python . Предыдущая версия .
Re[37]: Портирование нитры.
От: novitk США  
Дата: 15.02.17 19:45
Оценка:
Здравствуйте, WolfHound, Вы писали:

N>>С основным твоим тезисом, что динамика в выразительности рулит, согласен,

WH>Ещё один... тот же вопрос что и всем остальным: Покажи задачу, а не микрокусок говнокода на которой динамика рулит.

При чем тут какой-то код? Это моя реальность данная мне в ощущениях. Я сравниваю свою производительность на Питоне и Скале, которыми пользуюсь на больших и одинаковых проектах. На Питоне она тупо выше. Возможно дело в инструментарии, но лучше Скалы сейчас в статике просто ничего нет.
Отредактировано 15.02.2017 19:59 novitk . Предыдущая версия .
Re[38]: Портирование нитры.
От: WolfHound  
Дата: 15.02.17 19:47
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Мне кажется, зависит от личного видения прекрасного. С одной стороны, динамический код можно рассматривать как один большой шаблон, что в общем случае довольно удобно так как весь код обобщенный. С другой стороны, так как это динамика, на выходе имеем дикое количество тестов или неожиданные сюрпризы в рантайме гарантированы. Мне больше по душе вывод типов, как в том же OCaml или Haskell.

Вот мне тоже.
Но постоянно появляются деятели, которые говорят, что динамическая типизация рулит. Но я никак не могу добиться от них примера задачи, на которой она рулит.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[38]: Портирование нитры.
От: alex_public  
Дата: 15.02.17 21:25
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Напрямую конечно не относится. Просто они там все рядом на свалке... И Java процессоры и JavaOS и их идейные последователи из мира .net. )))

WH>Ох. Жаба-процессор идея бредовая. Просто по тому что хороший компилятор и хороший процессор всё равно будут намного быстрее и универсальнее.
WH>А вот управляемая ОС идея правильная. Ибо при грамотной реализации она будет быстрее чем ОС классическая. При этом несравнимо безопаснее.
WH>И в мидори от .НЕТ мало что осталось. И по-хорошему нужно оставить ещё меньше.

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

_>>Ну для начала ты говорил про компиляторы (к которым никаких существенных претензий сейчас нет),

WH>Существенных или нет?

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

WH>И даже для доведения до такого состояния в них вбухали много десятков человеко-лет.


Кстати, интересно на что там больше израсходовано ресурсов. На C/C++ фронтенд или же на их знаменитые бэкенды, которые сейчас стараются использовать все другие языки (хотя без правильной организации данных внутри языка это не даст того эффекта, что даёт в C++)?

_>>Вообще то синтетическим был только первый пример. А второй (который ты благополучно проигнорировал в последнем сообщение) является вполне себе полезным вычислением одной из разновидностей скользящего среднего по коллекции чисел.

WH>Скользящее средние по множеству?

Множество там было так, для демонстрации универсальности. И я думаю ты прекрасно понял смысл данного примера, просто цепляешь к мелочам, чтобы не признавать очевидного. )))

_>>Ну так раз поддерживает, то в чём тогда проблема продемонстрировать, что Nemerle способен на такую же удобную запись как и Python? ) Считай что вот встретилась задачка, пускай и на форуме. )))

WH>Да не было никакой задачи.
WH>Как был кусок кода так кусок кода и остался.

Ну ок, давай запишем это как задачу (хотя я думал что ты сам способен сделать подобное, глядя на код):

входные данные: несколько коллекций (вид коллекции не имеет значения) чисел разных типов (для примера это могут быть int и double, а вообще это может быть что угодно, например числа произвольной точности) и некий итеративный ("r_i=f(r_(i-1), x_i)") алгоритм (для примера можно взять r_i=(r_(i-1) + x_i)/2 ).
задача: продемонстрировать максимально лаконичный код применения данного алгоритма к этим коллекциям.
Re[36]: Портирование нитры.
От: alex_public  
Дата: 15.02.17 21:53
Оценка:
Здравствуйте, novitk, Вы писали:

N>С основным твоим тезисом, что динамика в выразительности рулит, согласен, но для этой конкретной проблемы в статике давно есть правильное решение — type classes. В плюсовых шаблонах фактически динамика, которая ужасна в плане локализации ошибок и масштабируемости.


1. Динамика — это не верный термин (разве что если подразумевать отдельный динамический язык, отрабатывающий на этапе компиляции), т.к. если взять в этом примере коллекции неподходящих типов, то ошибка будет в процессе компиляции, а не исполнения. Т.е. это полноценная статическая типизация.
2. Классы типов в C++ планируется (http://en.cppreference.com/w/cpp/language/constraints) ввести в стандарт. Более того, их уже можно даже опробовать в работе в последних версиях gcc (с опцией -fconcepts). Однако надо понимать назначение данного инструмента в таком языке как C++ — выдача более осмысленных ошибок компилятора и возможно небольшое ускорение его работы на шаблонном коде. Т.е. речь не о каких-то новых возможностях, а скорее о небольшом повышение удобства работы со старыми.
3. Если язык требует (как это к сожалению в C++) обязательного указания чего-то на место типа (не важно будет это произвольный auto или класс типа numeric или конкретный тип int), то он в любом случае будет более громоздким чем тот же Питон. Посоревноваться с динамическими языками тут может только статика позволяющая полный вывод типов и без всякого лишнего синтаксического мусора.

N>ИМХО классы типов — musthave для современного языка. Это кстати одна из фич, которой нет в Nemerle1 и как я понимаю Влад не собирается ее делать в Nemerle2.

N>В Хаскеле например все просто и красиво (заменил на умножение, так деление неоднозначно над целыми. Это можно исправить, но не суть):
N>

N>Prelude> let myFunc a b = (a + b) * 2
N>Prelude> foldl myFunc 0 [1.0, 2.0, 3.0]
N>22.0
N>Prelude> foldl myFunc 0 [1, 2, 3]
N>22


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

N>В Скалы есть грязь, так как там скрестили ежа и ужа (классический ООП и FP):

N>

scala>> import scala.math.Numeric.Implicits._
N>import scala.math.Numeric.Implicits._
scala>> def myFunc[T: Numeric](x: T, y: T) = {
N> val two = implicitly[Numeric[T]].fromInt(2)
N> (x + y) * two
N> }
N>myFunc: [T](x: T, y: T)(implicit evidence$1: Numeric[T])T
scala>> (1 to 3).fold(0)(myFunc)
N>res0: Int = 22
scala>> (1.0 to 3.0 by 1.0).fold(0.0)(myFunc)
N>res1: Double = 22.0


Ну как бы на уровне статического языка никаких особых ужасов не видно, но с Питоном естественно не сравнить. )))
Re[31]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.17 22:50
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Так а много ты знаешь таких языков? Чтобы был обязательный GC и при этом нормальная работа с указателями? )


C# же. И не надо про unsafe говорить. Это всего лишь защита от ошибок.

_>Кстати говоря ничего такого. Никаких фунтаментальных запретов нет.


Ну, вот и с GC в нулевом кольце фундаментальных запретов нет. Просто при текущей архите ОС и драйверов смысла в этом нет. Задачи там простые, постоянно нужна работа с указателями, так что тратить память на GC смысла нет. Драва пишут 2.5 человека на планете. Они спокойно обойдутся С (даже без плюсов).

_>Ну вот смотри, простейший пример на Питоне:

_>
_>apply=lambda f, *args: f(*args)
_>add=lambda x, y: x+y
_>inc=lambda x: x+1
_>f=lambda x: apply(add, x, apply(inc, x));
_>print f(1), f(1.15) #выводит 3 3.3
_>

_>можешь показать код на Nemerle с аналогичной функциональностью и чтобы он не был более громоздким?

Это жульничество натуральное. Взял фичу (переменное число аргументов) которой нет в большинстве языков и выдаешь ее за преимущество скриптов. А потом еще и сам же опровергаешь свой пример примером на статически типизированном С++.

Ты нас за детей держишь?

Потом я чуть ли не тебе на аналогичное жульничество отвечал уже приведением решения на макросах. Пишем макрос:
macro apply(f, params args : list[PExpr]) { <[ $f(..$args) ]> }

и потом его используем:
def f1(x) { apply(_ + _, x, apply(_ + 1, x)) }
def f2(x) { apply(_ + _, x, apply(_ + 1.0, x)) }
WriteLine(f1(1) + " " + f2(1.15));


Единственное, что в Немерле нельзя сделать арифметику для обобщенных типов, так что придется две лямбды объявить. Но на практике это не проблема, так как обобщение арифметики делается другими средствами. Да и редко нужно.

Я вижу, что объективность тебя не колышит.

Меж тем по существу Вольфхаунд прав. Хороший язык с выводом типов в плане автоматизации ни чем не уступит сриптам. Разве что в скорость компиляции, которая у скриптов почти отсутствует. Но зато сделает их как катят в плане производительности и интеллисенса.

На практике Немерл скорее всего превзойдет Питон по краткости. Как минимум будет сопоставим. А вот такие вещи как паттерн матчинг в питоне недоступны. Ну, и скорость работы получившейся программы не сопоставимы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[34]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.17 22:53
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Ну вот зачем ты постоянно подобную ерунду пишешь. Это же просто враньё:

_>>https://clang.llvm.org/cxx_status.html
_>>https://gcc.gnu.org/projects/cxx-status.html#cxx14
WH>Маркетинговые заявления про соответствие и соответствие не одно и тоже.

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

МС, вроде как тоже купил правильный фротнтэнд. Но похоже все равно отстает в поддержке стандарта.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[34]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.17 22:56
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>И вот так каждый раз. Адепт динамической типизации придумывает бесполезный код, который ничего не делает, требует повторить его буква в букву и объявляет себя победителем.


Он не адепт динамики. Он С++-ник. И подсовывает он тебе стандартную пенесометрическую фичу — переменное число параметров. В Питоне эта фича поддерживается в обычных функциях. В С++ в вариадик-шаблонах.

Собственно в немерле она тоже поддерживается — в макросах. Я ему тут рядом привел приме.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.17 22:58
Оценка:
Здравствуйте, alex_public, Вы писали:

...

Не надоело вам попусту время убивать? Лучше бы за это время что-то полезное сделали. Пошла какая-то смешная пенесометрия. От темы ушли на проч.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.17 22:59
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну раз так, то тебя конечно же не затруднит привести любой пример кода, удовлетворяющего C++14 и при этом некомпилируемого текущими версиями gcc или clang? )


А зачем? Ты же крутизну скриптов доказывал изначально? Как раз то, что пример реализуется на плюсах доказывает твою неправоту.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.17 23:19
Оценка:
Здравствуйте, alex_public, Вы писали:

_>в принципе переписывается в лоб, но добавляется определённая громоздкость от указания типа (явного или полиморфного).


А зачем лямбду переиспользовать? Ты в реальном коде хоть где-то одну лямбду для двух списков испоьзовал хоть раз? Да еще так чтобы в ней какая-то арифметика была и один и тот же алгритм был для разных числовых типов?

Ты высосал из пальца пример который вообще нельзя встретить в природе и пытаться этим обосновать преимущество скриптов. Причем чтобы было уж совсем смешно сразу же опровергаешь себя примерами на С++.

Ну, да. Ты нашел замечательную недоработку всех дотнетных языков. В дженериках дотнета нельзя обобщить арифметические ситуации. Вот только на практике от этого ни горячо, ни холодно. Не нужно оно и все. Если что эту лямбду просто скопипастить можно. Они на то и сделаны, чтобы их по месту задавать, а не переиспользовать.
Что, вот это сильно длиннее?
def v = [1.0, 2.0, 3.0];
def s = HashSet([1, 2, 3, 3]);
WriteLine(v.Fold(0.0, (s, x)=>(s+x)/2.0) + " " + s.Fold(0, (s, x)=>(s+x)/2));
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: Портирование нитры.
От: novitk США  
Дата: 15.02.17 23:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ну, да. Ты нашел замечательную недоработку всех дотнетных языков. В дженериках дотнета нельзя обобщить арифметические ситуации. Вот только на практике от этого ни горячо, ни холодно. Не нужно оно и все. Если что эту лямбду просто скопипастить можно. Они на то и сделаны, чтобы их по месту задавать, а не переиспользовать.


Это детский пример, но эта лямбда может быть на пару страниц кода. Нужны тайпклассы, нужны.
Re[37]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.17 23:37
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Вообще то синтетическим был только первый пример. А второй (который ты благополучно проигнорировал в последнем сообщение) является вполне себе полезным вычислением одной из разновидностей скользящего среднего по коллекции чисел.


Пример то полезный. Бесполезно в нем создание обобщенной лямбды. Ну, не будешь ты лямбду переиспользовать на практике. Это ты для пенисометрии сделал. Выброси переиспользование и немерловый вариант окажется короче. В прочем, разница будет в микроскоп не заметна.
Питон:
print reduce(lambda s, x: (s+x)/2, v, 0.0)

Немерл:
WriteLine(v.Fold(0.0, (s, x)=>(s+x)/2.0));

Где разница?

_>Ну так раз поддерживает, то в чём тогда проблема продемонстрировать, что Nemerle способен на такую же удобную запись как и Python?


Немерл обобщение для арифметики не поддерживает, так как дженирики дотнета это не позволяют. Это же не шаблоны, подставляемые во время компиляции?

Но вот именно это на фиг не нужно на практике. Лябды для того и сделаны, чтобы их по месту писать.

Пример твой из пальца высосан.

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

Силах тех же скриптов, по сравнению с С++ в более простом метапрограммировании. И тут Немерл опять же не отстает предоставляя МП времени компиляции, но по простате ближе к скриптовому.

Ну, и собственно если сделать для Немерле 2 поддержку шаблонов, то будет тебе и арифметика в шаблонах, и переменный список их параметров и все это в языке не уступающем Питону по простоте кодирования, но статически типизированном.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.17 23:49
Оценка:
Здравствуйте, novitk, Вы писали:

N>ИМХО классы типов — musthave для современного языка. Это кстати одна из фич, которой нет в Nemerle1 и как я понимаю Влад не собирается ее делать в Nemerle2.


А чем здесь классы типов будут отличаться от дженерик-функций? Тут проблема том может ли язык из арифметики вывести оббобщенную версию функции или нет. В Хаскеле, видимо, может. Вот только что-то и у тебя проблемы с делением возникли.

scala>> def myFunc[T: Numeric](x: T, y: T) = {

N> val two = implicitly[Numeric[T]].fromInt(2)
N> (x + y) * two
N> }
N>myFunc: [T](x: T, y: T)(implicit evidence$1: Numeric[T])T

Блин, капец! И ты будешь страдать такой фигне вместо того чтобы два раза лямбду написать? Да где в реальной жизни вообще лямбды переиспользовать?

Я на практике вообще арифметикой не занимаюсь. Если она вдруг встречается, то где-то в конкретных местах с конкретными типами.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.17 23:55
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Мне кажется, зависит от личного видения прекрасного. С одной стороны, динамический код можно рассматривать как один большой шаблон, что в общем случае довольно удобно так как весь код обобщенный. С другой стороны, так как это динамика, на выходе имеем дикое количество тестов или неожиданные сюрпризы в рантайме гарантированы. Мне больше по душе вывод типов, как в том же OCaml или Haskell.


Ну, вот и мне с Вольфхундом. И тут получается, что тот же Немерл это и есть вывод типов как в OCaml или Haskell, только в чем-то немного мощнее, но менее обобщеннее.

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

И смог он это сделать так как в плюсах есть две фичи:
1. Вариадик-теплэйты (а первый пример был на переменное число параметров).
2. Шаблоны кокретизируемые при компиляции. Это позволяет писать "нетипизированные" арифметические выражения (как в динамике), которые типизируются при подстановке.

Собственно обе фичи можно сэмулировать шаблонами. Вот только на практике не нужно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 00:00
Оценка:
Здравствуйте, novitk, Вы писали:

N>Плюсовики испугались и начали толкать стандарт уменьшая разрыв. Потом мобилы подоспели, где плюсы фактически единственный путь к единому коду между Android и iOS.


Ну, вот на сегодня под Android и iOS можно писать на Шарпе и на Котлине. Так что С++ не нужен .

Если серьезно, у С++ одна и та же ниша — высокопроизводительный код переносимый между платформами. Уверен, что на плюсах для Android и iOS пишут в основном требовательные к вычислениям игры.

N>Впрочем если бы гугл за него взялся вместо Го возможно оно бы и взлетело, но увы...


Не "возможно", а 100%. Как и с Растом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 00:09
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>я правильно понимаю мысль: "современный C++ настолько хорош, что D больше не актуален"?


У Ди есть преимущества, но разрыв сократился.

Примерно та же фигня просходит с Немерлом и Шарпом. Если раньше после Немерла переход обратно на Шарп вызывал невыносимую попаболь, то теперь уже просто сильную, а с выходом C# 7 отставание еще сократится. Конечно макросов в C# не появится, но все же разница уже не столь драматична как 10 лет назад.

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

Думаю та же фигня с Ди и С++14.

Однако С++ все равно только могила исправит. И в принципе замена ему нужна.

Вот я и предлагаю сделать ее на базе Найтры. Наше преимущество будет в том, что мы не будем скованы вопросами обратной совместимости и спорами о том какой путь лучше выбрать. Нитра позволяет делать язык (языки) в виде библиотечных расширений. Это тот идеал который декларировался когда-то Страуступом (мол все что можно надо положить в библиотеки). Так вот теперь в библиотеки можно будет положить синтаксис. И каждый сможет выбрать что ему нужно для конкретной задачи.

Ну, и дешевейшее экспериментирование. Попробовать новую фичу можно будет играючи.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: Портирование нитры.
От: alex_public  
Дата: 16.02.17 00:10
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Ну вот смотри, простейший пример на Питоне:

_>>
_>>apply=lambda f, *args: f(*args)
_>>add=lambda x, y: x+y
_>>inc=lambda x: x+1
_>>f=lambda x: apply(add, x, apply(inc, x));
_>>print f(1), f(1.15) #выводит 3 3.3
_>>

_>>можешь показать код на Nemerle с аналогичной функциональностью и чтобы он не был более громоздким?
VD>Это жульничество натуральное. Взял фичу (переменное число аргументов) которой нет в большинстве языков и выдаешь ее за преимущество скриптов. А потом еще и сам же опровергаешь свой пример примером на статически типизированном С++.

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

Что касается C++ варианта, то, благодаря нормально развитому в языке параметрическому полиморфизму, данный код на Питоне получается переписать практически дословно. Но из-за одной печальной особенности изначального C синтаксиса нам приходится даже в случае отсутствия указания явного типа заменять его специальным заменителем (auto), так что код всё равно получается более громоздким.

Т.е. чтобы написать нормальную статически типизированную замену данному примеру динамического кода нам нужен язык с развитым параметрическим полиморфизмом (не слабее чем в C++) и при этом отсутствием лишнего синтаксического шума (auto и т.п.). Этим параметрам удовлетворяет например Хаскель, но мы все знаем что у него есть другие проблемы, которые всё равно делают его не подходящим в роли замены скриптовых языков.

VD>Потом я чуть ли не тебе на аналогичное жульничество отвечал уже приведением решения на макросах. Пишем макрос:

VD>
VD>macro apply(f, params args : list[PExpr]) { <[ $f(..$args) ]> }
VD>

VD>и потом его используем:
VD>
VD>def f1(x) { apply(_ + _, x, apply(_ + 1, x)) }
VD>def f2(x) { apply(_ + _, x, apply(_ + 1.0, x)) }
VD>WriteLine(f1(1) + " " + f2(1.15));
VD>


Кстати, замечу, что обе приведённые мною реализации не использовали МП — странно использовать такой инструмент для подобных простейших целей.

VD>Единственное, что в Немерле нельзя сделать арифметику для обобщенных типов, так что придется две лямбды объявить. Но на практике это не проблема, так как обобщение арифметики делается другими средствами. Да и редко нужно.


И ты после этого ещё говоришь о лаконичности кода? ) И дело не в арифметике, а в принципиальном подходе. Ну а насчёт редкости и нужности на практике... Во-первых понятно что на практике функция будет намного сложнее (так что копипаста точно будет злом). А во-вторых разные типы для одного подобного алгоритма — это абсолютно нормально, потому что это я в данном простейшем случае для наглядности предложил int и double, а в реальности там может быть например что-нибудь отсюда http://www.boost.org/doc/libs/1_63_0/libs/multiprecision/doc/html/index.html.

VD>Меж тем по существу Вольфхаунд прав. Хороший язык с выводом типов в плане автоматизации ни чем не уступит сриптам. Разве что в скорость компиляции, которая у скриптов почти отсутствует. Но зато сделает их как катят в плане производительности и интеллисенса.


Опять же я согласен с этим в теории. Но на практике, текущие существующие языки демонстрируют совсем другое.

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


С удовольствием ознакомлюсь с новым Немерле. Правда есть сомнения что это возможно в принципе на базе .net (во всяком случае если ты будешь придерживаться их системы типов), разве что что-то с помощью МП придумаешь. В общем готов протестировать и честно сравнить в любой момент.
Re[31]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 00:18
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Если смотреть только на ключевые глобальные возможности, то в D есть три отсутствующих в C++: модули, статическая интроспекция, более развитое МП на шаблонах (как минимум работа со строками в параметрах шаблонов и функция mixin).


Блин, вот любой кто освоил молоток во всем видит гвозди. Пойми же! Самое важное, что в Ди есть возможность испльзовать GC! Причем возможность опциональная. Ты в любой момент можешь перейти к ручному управлению памяти (причем, как в стиле С, так и в стиле С++).

А вот микситы там не очень. Немерловым проигрывают на проч. Ну, а уж тому что мы позволим (уже позволяем) делать в Нитре и в подметки не годится.

Ammy видел? Вот подобные вещи ты сможешь встраивать в язык. Причем не монолитно (на всегда), а в виде библиотечного расширения. Написал:
use syntax MyLang;

и получи нужные синтаксические расширения в конкретном файле.

_>Но это ещё не всё. Если когда-то D был очевидным надмножеством C++, то уже после выхода C++11 это перестало быть таковым. Потому что в C++ добавили не только часть возможностей из D, но и свои, полностью оригинальные и очень полезные (например семантику перемещения). А в D что-то не наблюдается развития в эту сторону. Собственно там в основном заняты развитием инфраструктуры языка (что в принципе верно), а сам язык уже не особо трогают, пользуясь огромным изначальным заделом. В итоге получается, что старичок C++ начинает выглядеть более развивающимся и инновационным...


Ага. Я даже слоган придумАл.

27 лет инноваций... Догоним Ди в следующейВерсии() { следующейВерсии() + 1 }



Надо понять, что точного GC в С++ не будет. От проблем связанных с хэадарами и препроцессором тоже вряд ли когда нибудь избавятся. Так что эволюция по любому зашла в тупик.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 00:20
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Судя по тому, каким получился Go, D они ни за что не выбрали бы.


Гугль это огромная корпорация. Го это результат творчества одного-двух работников. Совет директоров вид Го точно не определял. И Гугл без проблем потянул бы и 10 новых языков.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 00:32
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну скажем в компиляторе C++ от MS они уже есть (https://blogs.msdn.microsoft.com/vcblog/2015/12/03/c-modules-in-vs-2015-update-1/). Но смысла от этого всё равно мало, потому что существуют шаблоны. И библиотеки типа Boost'а.


Ну, вот с шаблонами там явные проблемы. Похоже просто аст сериализуют, а потом компилируют его в контексте текущего файла.

А над сделать так, чтобы совсем без инклюдов жить можно было.

_>Полиморфные — это без указания типа (т.е. "[](auto x) {}" вместо "[](int x) {}").


Ну, как бы это не проблема:
fun[T](x : T) { }


Вот только на фиг не нужно и арифметику в них использовать нельзя.

_>Собственно с точки зрения C++ это был абсолютно очевидный шаг, т.к. лямбды в нём являются просто краткой записью функциональных объектов (а они от рождения могли быть параметризованы шаблоном). По сути просто довели до ума реализацию. Но в итоге это получилось очень удобно для множества разных техник. Да и вообще это способствует "непрерывному" выводу типов в коде приложения.


Ты смешал две разные вещи. Вывод типов и обобщенность. auto — это и вывод типов, и обобщенность. А по жизни для того, чтобы лямбды были удобными им нужен только вывод типов. Не обязательно обобщенный.

А вот эти вот auto — это синтаксический мусор. Они просто не нужны. Большинство ФЯ (включая Немерл) поддерживают вывод типов и без указания разных заглушек вроде auto.

Лямбда же по своей природе используется в конкретных местах. Ей обобщенность ненужна. Я видел твои примеры рядом. Они высосаны из пальца. Уверен, что в реальности ты лямбды не переиспользуешь.

_>Ну в текущем стандарте вместо указанной строчки требовалось бы написать "pair<int, double> p(10, 10.0);",


Ясно. Это тоже вывод типов. В данном случае вывод параметров типов. Опять же в ФЯ норма. Немерл позволяет выводить их почти всегда.

_>Да оно собственно уже всё есть


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

_>Ты знаешь, я вот практически со всем этим твоим текстом согласен, кроме самого первого утверждение. Причём по совсем другим причинам: для меня тут главная причина не в какой-то крутизне синтаксиса, а в мощнейшей инфраструктуре. Т.е конечно же можно попробовать её захватить и по другому (как в D сделали), но не уверен, что это проще.


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

Вот какие библотеки нужны лично тебе?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 00:34
Оценка:
Здравствуйте, novitk, Вы писали:

N>Тут вроде Нитру использовать сам бог велел. Почему не стали?


Когда мы туда пришли они уже во всю работали, а Нитра до рабочего состояния дошла только в начале 2016 года.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 00:41
Оценка:
Здравствуйте, novitk, Вы писали:

N>Там надо смотреть детали. Как ты понимаешь особо креативный шаблон C++ или макро в Немерле способно вообще повесить машинку. ИМХО это просто вопрос контроля и оптимизации.


Вот по этому в Немерле 2 мы разделим работу макросов на две части. В режиме ИДЕ будет работать часть отвечающая за типизацию (нужная для: интелисенса, подсветки и прочих ИДЕ-фич), а та часть, что может занять процессор на долго будет работать только при компиляции.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 00:44
Оценка:
Здравствуйте, alex_public, Вы писали:

_>P.S. Кстати, если вы хотите реального большого успеха вашему продукту, то как можно этого добиться с помощью реализации простеньких вещей (которые пишутся элементарно на множестве других известных инструментов)? Как раз наоборот, надо продемонстрировать возможность решения самой сложной задачи в своей области и тогда слава сама найдёт вас.


Я в свое время задолжался демонстрировать возможности макросов. Все равно одним это не надо (потому что не понимаю), а другим не надо, потому, что они уже к более сложным путям привыкли.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 00:45
Оценка:
Здравствуйте, VladD2, Вы писали:

N>>ИМХО классы типов — musthave для современного языка. Это кстати одна из фич, которой нет в Nemerle1 и как я понимаю Влад не собирается ее делать в Nemerle2.

VD>А чем здесь классы типов будут отличаться от дженерик-функций? Тут проблема том может ли язык из арифметики вывести оббобщенную версию функции или нет. В Хаскеле, видимо, может.
У меня нет уверенности что ты понимаешь, что такое классы типов или я не понимаю вопроса. Обобщенная версия функции, как раз и требует typeclass (Num в Хаскелле, Numeric в Скале). Ни в одном из языков никакая арифметика не встроена. В случае Хаскеля работает обычный ХМ, в Скале логика на implicit.

VD>Вот только что-то и у тебя проблемы с делением возникли.

В Хаскеле проблем как раз нет (в Num деление есть). В Скале деление убрано из Numeric и разведено дальше в иерархии на целочисленное с двумя операциями и вещественное с одной. Это вопрос реализации стандартной библиотеки, а не системы типов.

VD>Блин, капец! И ты будешь страдать такой фигне вместо того чтобы два раза лямбду написать? Да где в реальной жизни вообще лямбды переиспользовать?

Ответил в другом месте, но повторю здесь. В недетском примере лямбда может быть на две страницы. Например в линейной алгебре где матрицв может быть над полем R или C. Или в растровой графике где идет параметризация алгоритма по colorspace.

VD>Я на практике вообще арифметикой не занимаюсь. Если она вдруг встречается, то где-то в конкретных местах с конкретными типами.

Это заметно. Ты и Питоном наверняка не пользуешься, но мнение имеешь.
Re[9]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 00:46
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>

WH>Ты вообще знаешь что такое Boost::Preprocessor? Судя по твоему ответу даже не догадываешься.
WH>Да и С++ в целом плохо знаешь.

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

Это и нарушение правил форума, и отпугивание людей. Нам сторонники нужны, а не враги.

Так что давай как аргументы, а не вот такое.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 00:57
Оценка:
Здравствуйте, alex_public, Вы пи

_>Ну что-то я увлёкся воспоминаниями. Так вот, не смотря на относительно страшный вид макроса DECLARE_TABLE, с точки зрения анализатора кода IDE он является полным примитивом.


А этот твой макрос Boost::Preprocessor то использовал? Что-то мне кажется, что Boost::Preprocessor не имеет отношения к сишному препроцессору. Хотя я тут профан. С С++ ушел еще до бурного расцвета Буста.

_>Т.е. ты даже не хочешь попробовать поразмышлять? Вот предложим случится чудо и вы полностью закончите свой основной продукт. Вот он у вас на руках и вы приступаете к его предъявлению публике. Как вы это собираетесь делать? Просто информация про какие-то парсеры и т.п. — это будет разговор ни о чём. Всегда нужен реальный работающий пример применения вашего инструмента. И что вы предъявите? Что-то вроде Ammi? Так подобное сейчас каждый второй не напряжно делает без всяких специализированных инструментов, просто в лоб,


Если только языком. А так только одну поддержку ИДЕ сделать — это уже нужно быть спецом в ИДЕ-плагино-строении.

_>причём задача элементарно решается вообще на каком-нибудь Питоне.


И редактируется в нотпэде...

_> Вот если показать, что ваш инструмент может решать задачи, считающиеся реально сложными в индустрии — только тогда и можно получить известность...


Тут понимаешь есть проблема отлично показанная здесь:
https://www.youtube.com/watch?v=r9x3kKdjmB8

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

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

Мы конечно тоже будем что-то делать. Но одни мы все что нужно не сделаем. Мы будем показывать пример, возможности.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 01:00
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Но зато язык взлетел. В отличие от множества конкурентов. )


Тут есть три "но":
1. С++ был полным суперсетом С (самого популярного языка на тот момент).
2. У С++ (в те времена) вообще не было конкурентов (если не считать Лисп).
3. За С++ стаяла мегакорпорация Бэл Лабс (она же Ат энд Ти).

В таких условиях и дурак сделает успешный язык. А С++ оказался еще и не таким уж плохим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: Портирование нитры.
От: alex_public  
Дата: 16.02.17 01:06
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Не надоело вам попусту время убивать? Лучше бы за это время что-то полезное сделали. Пошла какая-то смешная пенесометрия. От темы ушли на проч.


Ну как бы вполне интересная дискуссия без всякого негатива (что иногда бывает на форуме от ярых фанатов каких-то языков/технологий) — почему бы не продолжить?. Да, не совсем по теме (не про портирование нитры), но всё равно в близкой области — сравнение возможностей разных языков.

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

1. Портирую Mini-C в нативный код с помощью LLVM, ради собственного фана и саморазвития. С учётом наличия готовых примеров подобного в исходниках, думаю что это займёт даже меньше недели. Но вряд ли за этим последует какое-то продолжение — для "поиграться с нативной Nitra и LLVM" мне хватит и такого.

2. Если кто-то (лучше из создателей Nitra, но может и ещё кто-то) будет готов сделать на Nitra фронтенд (ну и плюс плагин для IDE) для C++, то я берусь сделать для него полноценный и эффективный бэкенд (это уже совсем не простая задача даже при помощи LLVM, но мне по силам, тем более что я тогда возможно ещё и привлеку дополнительных людей для ускорения). Мне это интересно уже для дела, т.к. C++ — это один из моих основных инструментов в данный момент и он меня не до конца устраивает.

3. Совместное создание нативного Немерле2. Теоретически возможно и интересно. Но на практике (как показала данная дискуссия) мало вероятно из-за ряда проблем. Например чтобы подобный язык мог претендовать у меня на роль основного инструмента (а иначе нет смысле этим всем заниматься), он должен обладать рядом возможностей, которые вы в свой язык не вводили и похоже не планируете.

P.S. Естественно всё вышеописанное возможно не раньше лета этого года — до тех пор я могу только болтать на форуме. )
Re[7]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 01:16
Оценка:
Здравствуйте, novitk, Вы писали:

N>Mне кажется, что это все же на несколько порядков проще чем разработка свежего фронтенда на Нитре.


Ну, мы и не заикались о таком. Это уже нам alex_public предложил С++ забабахать (явно не представляя объема работ).

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

Другими словами, мы предлагали взять на себя часть связанную с переносом Немерла под нэйтив (путем создания LLVM-бэкэнда) и добавления нужных плюсовикам конструкций, вроде конструкторов/деструкторов, работы с указателями и т.п.

А мы бы обеспечили все остальное включая мощные макросы.

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


А зачем повторять С++? Из С++ нужно взять:
1. Шаблоны без МП (но с концептами и конкретизацией во время компиляции).
2. Указатели/ссылки и прочую адресную арифметику.
3. Конструкторы/Деструкторы (с размещением в стеке и других объектах).

Ну, еще из Раста надо взять уникальные ссылки.

МП будет обеспечено макросами. А простоту программирования в условиях отсутствия нужны экономии памяти и жесткой предсказуемости — GC.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 01:17
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Подозреваю что в большинстве таких плагинов ничего подобного нет, а используется тупо метод "в лоб", в надежде на эффективность clang'а.


Я бы не стал на это надеяться.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 02:10
Оценка:
Здравствуйте, novitk, Вы писали:

N>У меня нет уверенности что ты понимаешь, что такое классы типов или я не понимаю вопроса. Обобщенная версия функции, как раз и требует typeclass (Num в Хаскелле, Numeric в Скале). Ни в одном из языков никакая арифметика не встроена. В случае Хаскеля работает обычный ХМ, в Скале логика на implicit.


Ну, вот implicit и решает проблемы. Причем тебе еще присесть пришлось при этом.

У хаскле, кроме классов типов еще есть возможность вывести не конкретные типы, а тот самый Num. И вообще есть этот самый Num. Если бы это было не так, тебе пришлось бы завести две разные функции.

Если в дотнете числа имели бы общего предка, то и в дотнете можно было бы так. Но в дотнете числовые типы вообще никак не связаны.

В общем, проблема начинается когда ты пишешь:
let myFunc a b = (a + b) * 2

Заметь, это одна функция, а никакой ни тайпкласс. Тайпкласс понадобится позже. Но что здесь означает "+" и "*"?

Если бы такой тип был, то я бы просто написал бы:
def myFunc(a : Num, b : Num) : Num { (a + b) * 2 }

или дженерик-версию с констрэйном (если вдруг первый вариант будет бокситься):
def myFunc[T](a : T, b : T) : T where T: Num { (a + b) * 2 }

Ну, и далее мне уже никакие классы типов не понадобились бы, так как я имел бы обобщенную функцию, которую мог бы передать в оба варианта фолда.

N>В Хаскеле проблем как раз нет (в Num деление есть).


Ну, а зачем ты деление на умножение заменил?

N>Ответил в другом месте, но повторю здесь. В недетском примере лямбда может быть на две страницы.


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

N>Например в линейной алгебре где матрицв может быть над полем R или C. Или в растровой графике где идет параметризация алгоритма по colorspace.


Ну, вот дай мне ссылку на реальный проект. Хоть посмотрю на это чуду. Только что-то подсказывает мне, что ссылки не будет.

Если кода будет действительно дофига, то проблему можно решить введения мааалюсенькой лямдочки, которая передаст вот это вот целочисленное вычисление. А просто дженерик-функции ведь никто не отменял. Да даже дженерик лямбды не запрещены. Проблемы только с арифметикой. Ну, так сделай:
def огромнаяДженерикФункция[T](x, лямбдаДляОбощениАрифметики) { ... }

и передай ее, а ей задай то что надо по месту:
Foo(огромнаяДженерикФункция(_, (x, y) => (x + y) / 2))


N>Это заметно. Ты и Питоном наверняка не пользуешься, но мнение имеешь.


Я предпочитаю типизированные языки. Скриптами пользовался, но это точно не мое.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 02:21
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну как бы вполне интересная дискуссия без всякого негатива (что иногда бывает на форуме от ярых фанатов каких-то языков/технологий) — почему бы не продолжить?. Да, не совсем по теме (не про портирование нитры), но всё равно в близкой области — сравнение возможностей разных языков.


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

_>А по теме собственно основное уже обсудили. Со своей стороны я пока вижу три теоретически возможные стратегии участия во всём этом:


_>1. Портирую Mini-C в нативный код с помощью LLVM, ради собственного фана и саморазвития. С учётом наличия готовых примеров подобного в исходниках, думаю что это займёт даже меньше недели.


Тоже верно.

_>Но вряд ли за этим последует какое-то продолжение — для "поиграться с нативной Nitra и LLVM" мне хватит и такого.


Ой, не говори гоп. Я тоже когда-то решил побаловаться и затянуло на много лет.

_>2. Если кто-то (лучше из создателей Nitra, но может и ещё кто-то) будет готов сделать на Nitra фронтенд (ну и плюс плагин для IDE) для C++, то я берусь сделать для него полноценный и эффективный бэкенд (это уже совсем не простая задача даже при помощи LLVM, но мне по силам, тем более что я тогда возможно ещё и привлеку дополнительных людей для ускорения). Мне это интересно уже для дела, т.к. C++ — это один из моих основных инструментов в данный момент и он меня не до конца устраивает.


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

Если кто-то возьмется за это, то помогу советами и в трудных вопросах. Ну, если кто на это денег выделит, то займусь с удовольствием и по полной программе. Но это вряд ли случится.

_>3. Совместное создание нативного Немерле2. Теоретически возможно и интересно. Но на практике (как показала данная дискуссия) мало вероятно из-за ряда проблем. Например чтобы подобный язык мог претендовать у меня на роль основного инструмента (а иначе нет смысле этим всем заниматься), он должен обладать рядом возможностей, которые вы в свой язык не вводили и похоже не планируете.


Еще раз попытаюсь озвучить самое важное. Мы делаем конструктор. Принципиально — конструктор! По этому мы берем в язык все, что кто-то сделает. Но в виде библиотеки. Пользователь сам выберет фичи языка просто написав в файле:
using syntax BlaBlaBla;

Ну, разве что еще можно создать пресеты открытые по умолчанию и завязать их на конкретные расширения. Мои любимые будут к .n2 привязаны, а твои к .cpp2.

По сему вопрос так как его поставил ты даже не стоит. Мы вводим все что есть! А вот заниматься лично будем только тем, что нужно нам в первую очередь. Естественно при этом мы всячески будем помогать тем, то будет делать то, что нужно ему.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 02:23
Оценка:
Здравствуйте, novitk, Вы писали:

N>Это детский пример, но эта лямбда может быть на пару страниц кода. Нужны тайпклассы, нужны.


Я лямбду на пару строк и то оформляю локальной функцией. А уж на пару страниц — это претендент на метод. И такую "лямбду" не грех обобщить за счет других функций высшего порядка передаваемых ей через параметры. А этот подход решает любые проблемы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: Портирование нитры.
От: alex_public  
Дата: 16.02.17 02:38
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>в принципе переписывается в лоб, но добавляется определённая громоздкость от указания типа (явного или полиморфного).

VD>А зачем лямбду переиспользовать? Ты в реальном коде хоть где-то одну лямбду для двух списков испоьзовал хоть раз? Да еще так чтобы в ней какая-то арифметика была и один и тот же алгритм был для разных числовых типов?

Это был тестовый пример. А в реальности это выглядело бы скорее всего как-то так:
template<typename T> auto mycalc(const vector<T>& v){
    return accumulate(v.cbegin(), v.cend(), T{0}, [](auto& s, auto& x) {
        return (s+x)/2;//и тут явно не такая формула
    });
};

и было бы весьма распространённым случаем (причём в роли T тут могли бы быть как double, так и какой-нибудь boost::multiprecision::number< boost::multiprecision::mpfr_float_backend<100>>).

VD>Ты высосал из пальца пример который вообще нельзя встретить в природе и пытаться этим обосновать преимущество скриптов. Причем чтобы было уж совсем смешно сразу же опровергаешь себя примерами на С++.


Нет, расклад немного не такой. По каждому примеру (потому что для разных случаев будут разные расклады по языкам) реализации задачи на динамическом языке можно выделить три группы статических языков:

1. Где пример реализуется с такой же лаконичностью. Для обсуждаемого примера к этой группе будет относиться Хаскель и т.п.
2. Где пример реализуется, но чуть более громоздко. Для обсуждаемого примера к этой группе будет относиться C++, Scala, D и т.п.
3. Где пример вообще не реализуется. Для обсуждаемого примера в данную группу попадает и C# и Nemerle.
Re[33]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 02:52
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ключевое в данном коде естественно не переменное число аргументов (это конечно удобная возможность, но не принципиальная, особенно если в языке имеются нормальные средства работы с кортежами), а отсутствие указания каких-либо типов.


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

_>Что касается C++ варианта, то, благодаря нормально развитому в языке параметрическому полиморфизму, данный код на Питоне получается переписать практически дословно.


Это не из-за "развитого в языке параметрического полиморфизма", а благодаря утиной типизации шаблонов, которые по сути макросы раскрываемые по месту и компилируемые в контексте этого места.

Вот в Питоне это не так. Там все да динамическом приведении типов работает.

_>Но из-за одной печальной особенности изначального C синтаксиса нам приходится даже в случае отсутствия указания явного типа заменять его специальным заменителем (auto), так что код всё равно получается более громоздким.


А вот это не более чем синтаксическая особенность. Выбросить эти auto не составило бы труда в нормальном языке. Вот в Немерле и Хаскле их выбросили еще при дизайне языка.

_>Т.е. чтобы написать нормальную статически типизированную замену данному примеру динамического кода нам нужен язык с развитым параметрическим полиморфизмом (не слабее чем в C++) и при этом отсутствием лишнего синтаксического шума (auto и т.п.). Этим параметрам удовлетворяет например Хаскель, но мы все знаем что у него есть другие проблемы, которые всё равно делают его не подходящим в роли замены скриптовых языков.


При С++-ных подхода — это ни разу не проблема. У Хасклея все сильно сложнее. Его классы типов более динамическая сшущность. Даже более динамическая нежели интерфейсы в дотнете.

_>Кстати, замечу, что обе приведённые мною реализации не использовали МП — странно использовать такой инструмент для подобных простейших целей.


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

В данном случае макры использованы потому, что в них тоже поддерживаются переменное число аргументов. И между прочим, результат получается похожий на С++-ый, а не на Питоновский, так как манипуляции (эплаи) производятся над АСТ, а не в рантайме.

_>И ты после этого ещё говоришь о лаконичности кода? )


Ну, так я тебе тут рядом привел для сравнения вариант с лямбдой по месту. Он иденичен. Вот скопипастил:
Питон:
print reduce(lambda s, x: (s+x)/2, v, 0.0)

Немерл:
WriteLine(v.Fold(0.0, (s, x)=>(s+x)/2.0));

Где разница?

_>И дело не в арифметике, а в принципиальном подходе.


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

_>Ну а насчёт редкости и нужности на практике... Во-первых понятно что на практике функция будет намного сложнее (так что копипаста точно будет злом).


Функции? Конечно. А вот лямбды — нет. На то они лямбды.

_>А во-вторых разные типы для одного подобного алгоритма — это абсолютно нормально, потому что это я в данном простейшем случае для наглядности предложил int и double, а в реальности там может быть


Еще раз. Лямбды — не нормально. Для лямбд нормально быть конкретными и короткими. А если у тебя большой алгоритм создай функцию.

_>Анапример что-нибудь отсюда http://www.boost.org/doc/libs/1_63_0/libs/multiprecision/doc/html/index.html.


Вообще не понял что должна сказать эта ссылка.

Вот типичные лямбды из той же Нитры:
serializationEmitter.Formatter.WriteRecordMembers(serializeCode, members, () => <[ this ]>, (expr, _) => expr);
def relations = syntaxModule.PrecedenceRelations.Grouping(r => (r.Symbol, (r.Low, r.Hi))).KeyValuePairs.Map(convert);
_ = MakeEmitters(syntaxModuleEmitters, (syntaxModule, _, _) => SyntaxModuleEmitter(environment, syntaxModule));
symbol.StringLiterals.FoldLeft(map, (lit, map) => map.Replace(lit, symbol))

нигде и на мамека на типы, и вообще нет нужды в обобщенных типах.

_>Опять же я согласен с этим в теории. Но на практике, текущие существующие языки демонстрируют совсем другое.


А ты уверен, что пробовал все варианты?

Вот смотри, я ведь без проблем могу скачать Питон или еще что-то, но для автоматизации я беру Немрел. И не тянет к скриптам. Вообще!

_>С удовольствием ознакомлюсь с новым Немерле. Правда есть сомнения что это возможно в принципе на базе .net (во всяком случае если ты будешь придерживаться их системы типов), разве что что-то с помощью МП придумаешь. В общем готов протестировать и честно сравнить в любой момент.


Да ты можешь и Немерл глянуть. Если возьмешься хотя бы за Мини-С, то тебе уже придется Немерл немного освоить. За одно и заценишь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 03:14
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Это был тестовый пример. А в реальности это выглядело бы скорее всего как-то так:

_>
_>template<typename T> auto mycalc(const vector<T>& v){
_>    return accumulate(v.cbegin(), v.cend(), T{0}, [](auto& s, auto& x) {
_>        return (s+x)/2;//и тут явно не такая формула
_>    });
_>};
_>

_>и было бы весьма распространённым случаем (причём в роли T тут могли бы быть как double, так и какой-нибудь boost::multiprecision::number< boost::multiprecision::mpfr_float_backend<100>>).

А я бы в таком случае сделал бы пару перегрузок и вообще без лямбд обошелся бы (все таки в Немерле они не бесплатные):
mycalc(seq : Seq[int]) : int
{
  mutable sum = 0;
  foreach (x in v)
    sum = (sum + x) / 2;
  sum
}

mycalc(seq : Seq[double]) : double
{
  mutable sum = 0.0;
  foreach (x in v)
    sum = (sum + x) / 2;
  sum
}


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

_>1. Где пример реализуется с такой же лаконичностью. Для обсуждаемого примера к этой группе будет относиться Хаскель и т.п.

_>2. Где пример реализуется, но чуть более громоздко. Для обсуждаемого примера к этой группе будет относиться C++, Scala, D и т.п.
_>3. Где пример вообще не реализуется. Для обсуждаемого примера в данную группу попадает и C# и Nemerle.

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

А надуманные синтетические примеры — это ни о чем. Я тебе могу тоже привести пример со сложным паттернматчингом, который ты на С++ и Питоне задобаешся выписывать, а на Хаскеле, Немерле и Скале он будет тривиален.

А есть еще такие дадачки как запустить Word и прочесть данные из файла. Тут на плюсах придется встать раком (на создавать ком-серверов), а в Питоне и вообще не ясно что делать. Хаскель со Скалой видимо тоже будут в пролете. А на Немерле без проблем.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 16.02.2017 3:16 VladD2 . Предыдущая версия . Еще …
Отредактировано 16.02.2017 3:15 VladD2 . Предыдущая версия .
Re[38]: Портирование нитры.
От: alex_public  
Дата: 16.02.17 03:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Силах тех же скриптов, по сравнению с С++ в более простом метапрограммировании.


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

VD>Ну, и собственно если сделать для Немерле 2 поддержку шаблонов, то будет тебе и арифметика в шаблонах, и переменный список их параметров и все это в языке не уступающем Питону по простоте кодирования, но статически типизированном.


Да, да, в Немерле2 совершенно точно надо предоставить полноценный параметрический полиморфизм, а не это убожество (дженерики) из .net.

Кстати, с точки зрения производительности реализация из C++ естественно самая лучшая, т.к. гарантирует инлайнинг (Хаскель тут далеко отстаёт), но при этом такой подход мешает нормальной модульности. Хотя в D (где тоже шаблоны) проблему с модулями вроде как-то решили (не копался во внутренностях, так что не знаю как именно).
Re[14]: Портирование нитры.
От: alex_public  
Дата: 16.02.17 04:45
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Ты знаешь, я вот практически со всем этим твоим текстом согласен, кроме самого первого утверждение. Причём по совсем другим причинам: для меня тут главная причина не в какой-то крутизне синтаксиса, а в мощнейшей инфраструктуре. Т.е конечно же можно попробовать её захватить и по другому (как в D сделали), но не уверен, что это проще.

VD>Т.е. речь о библиотеках? Ну, для этого надо не весь язык воспроизводить, а только интерфейс к библиотекам. Просто интерфейс к С++ не просто с делать из-за:
VD>1. Отсутствия бинарного стандарта на экспорт классов.
VD>2. Перенавороченности шаблонов.

Угу. В том же D от рождения имеется такое https://dlang.org/spec/cpp_interface.html решение. В принципе для простеньких случаев (когда не лень руками добавить объявление пары нужных C++ функций) оно подходит, но для реальной работы не очень.

Поэтому начали появляться такие https://github.com/lhamot/CPP2D решения (по сути полноценный автоматический конвертер, опять же на базе clang'а). Но тут есть очевидные проблемы, т.к. D уже перестал быть надмножеством C++ и код с семантикой перемещения может не всегда заработать.

И наконец такие https://github.com/Syniurge/Calypso/ решения (уже просто спокойный автоматический импорт заголовочного файла C++).

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

VD>Вот какие библотеки нужны лично тебе?


Ну вот открыл один из недавних проектов и там: use=['OpenCV', 'Qt', 'Boost', 'FFmpeg', 'OpenSSL'].
Re[11]: Портирование нитры.
От: alex_public  
Дата: 16.02.17 05:14
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Ну что-то я увлёкся воспоминаниями. Так вот, не смотря на относительно страшный вид макроса DECLARE_TABLE, с точки зрения анализатора кода IDE он является полным примитивом.

VD>А этот твой макрос Boost::Preprocessor то использовал? Что-то мне кажется, что Boost::Preprocessor не имеет отношения к сишному препроцессору. Хотя я тут профан. С С++ ушел еще до бурного расцвета Буста.

Да, именно развитие обычного C препроцессора. Они там из него почти полноценный язык сделали с четырьмя типа данных (массивы, списки, последовательности, кортежи), полным набором соответствующих функций работы с ними (модификации, итерации и т.п.), ну и классические ветвления, циклы и т.п. Всё это позволяет писать довольно сильные макросы. Правда выглядят они довольно страшненько (http://www.boost.org/doc/libs/1_63_0/libs/preprocessor/doc/examples/linear_fib.c), так что применяется подобное только когда уж точно больше ничем не решить проблему. )))
Re[38]: Портирование нитры.
От: alex_public  
Дата: 16.02.17 05:36
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>3. Совместное создание нативного Немерле2. Теоретически возможно и интересно. Но на практике (как показала данная дискуссия) мало вероятно из-за ряда проблем. Например чтобы подобный язык мог претендовать у меня на роль основного инструмента (а иначе нет смысле этим всем заниматься), он должен обладать рядом возможностей, которые вы в свой язык не вводили и похоже не планируете.

VD>Еще раз попытаюсь озвучить самое важное. Мы делаем конструктор. Принципиально — конструктор! По этому мы берем в язык все, что кто-то сделает. Но в виде библиотеки. Пользователь сам выберет фичи языка просто написав в файле:
VD>
VD>using syntax BlaBlaBla;
VD>

VD>Ну, разве что еще можно создать пресеты открытые по умолчанию и завязать их на конкретные расширения. Мои любимые будут к .n2 привязаны, а твои к .cpp2.
VD>По сему вопрос так как его поставил ты даже не стоит. Мы вводим все что есть! А вот заниматься лично будем только тем, что нужно нам в первую очередь. Естественно при этом мы всячески будем помогать тем, то будет делать то, что нужно ему.

Что-то как-то сомнительно, что подобные вещи можно ввести опциями. Вот тот же GC или указатели — это понятно (unsafe в C# по сути это делает). А скажем размещение на стеке (причём по умолчанию), RAII, семантику перемещения, обсуждаемый тут рядом нормальный параметрический полиморфизм и т.п. разве реально включать опциями? )
Re[38]: Портирование нитры.
От: alex_public  
Дата: 16.02.17 06:04
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Так что это не аргумент. А лямбду ты тоже вряд ли стал бы переиспользовать.


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

VD>А надуманные синтетические примеры — это ни о чем. Я тебе могу тоже привести пример со сложным паттернматчингом, который ты на С++ и Питоне задобаешся выписывать, а на Хаскеле, Немерле и Скале он будет тривиален.


Для сильных языков отсутствие какой-то возможности в непосредственном синтаксисе ещё не означает автоматической проблемы при реализации подобных задач: https://github.com/solodon4/Mach7 и https://github.com/grantjenks/python-pattern-matching.

VD>А есть еще такие дадачки как запустить Word и прочесть данные из файла. Тут на плюсах придется встать раком (на создавать ком-серверов), а в Питоне и вообще не ясно что делать. Хаскель со Скалой видимо тоже будут в пролете. А на Немерле без проблем.


Ну естественно что на динамическом Питоне (для которого IDispath прямо как родной, т.к. создавался для такого же динамического VB) это всё решается очень быстро и красиво: https://www.blog.pythonlibrary.org/2010/07/16/python-and-microsoft-office-using-pywin32/.
Re[30]: Портирование нитры.
От: DarkEld3r  
Дата: 16.02.17 11:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Не "возможно", а 100%. Как и с Растом.


А как же Dart? Или игнорируем всё, что не вписывается в схему "бренд решает"?
Причём, если мне не изменяет память, Dart продвигался "именно гуглом", в отличии от Go, который позиционируется как детище Пайка.
Re[31]: Портирование нитры.
От: DarkEld3r  
Дата: 16.02.17 11:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Гугль это огромная корпорация. Го это результат творчества одного-двух работников. Совет директоров вид Го точно не определял. И Гугл без проблем потянул бы и 10 новых языков.

Потянуть может и потянул, но злые языки говорят, что Go им нужен чтобы легче "масштабироваться" используя не очень сильных программистов. D (а так же скала, немерле и прочие) эту нишу не закрывает никак.
Re[32]: Портирование нитры.
От: DarkEld3r  
Дата: 16.02.17 11:59
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Блин, вот любой кто освоил молоток во всем видит гвозди. Пойми же! Самое важное, что в Ди есть возможность испльзовать GC! Причем возможность опциональная. Ты в любой момент можешь перейти к ручному управлению памяти (причем, как в стиле С, так и в стиле С++).


Это работает в обе стороны: С++ сейчас нужен или из-за легаси, которое выкинуть жалко или там, где не подходит GC. Можно, конечно, рассказывать как люди ошибаются, но это, вряд ли, на что-то повлияет. А там, где устраивает GC возьмут другой язык и всё.

Кстати, в D, на данный момент, это самое отключение ведёт к невозможности использовать многое из стандартной библиотеки. Сейчас идут какие-то подвижки в этом направлении, но долгоe время не заморачивались, что ещё раз говорит о не слишком удачном позиционировании языка (как замену С++).

VD>Надо понять, что точного GC в С++ не будет. От проблем связанных с хэадарами и препроцессором тоже вряд ли когда нибудь избавятся. Так что эволюция по любому зашла в тупик.
Re[8]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 13:46
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А зачем повторять С++? Из С++ нужно взять:

VD>1. Шаблоны без МП (но с концептами и конкретизацией во время компиляции).
VD>2. Указатели/ссылки и прочую адресную арифметику.
VD>3. Конструкторы/Деструкторы (с размещением в стеке и других объектах).
VD>Ну, еще из Раста надо взять уникальные ссылки.
VD>МП будет обеспечено макросами. А простоту программирования в условиях отсутствия нужны экономии памяти и жесткой предсказуемости — GC.

План захвата вселенной "упрощенного" Немерле начинает проступать!
Re[21]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 13:54
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Вот по этому в Немерле 2 мы разделим работу макросов на две части. В режиме ИДЕ будет работать часть отвечающая за типизацию (нужная для: интелисенса, подсветки и прочих ИДЕ-фич), а та часть, что может занять процессор на долго будет работать только при компиляции.


И как ты получишь тип для твоей любимой подсказки если он вычисляется внутри макроса? Хинтом разделишь макросы выполняемые IDE и компиляторами?
Re[39]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 14:47
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ну, вот implicit и решает проблемы. Причем тебе еще присесть пришлось при этом.

Решает, только по сравнению с Хаскелем это очень нетривиальные костыли с грязью. Пока не появились нормальные подсказки в IDE вообще был мрак.

VD>Заметь, это одна функция, а никакой ни тайпкласс. Тайпкласс понадобится позже. Но что здесь означает "+" и "*"?

Никакого "позже" там нет, тайпкласс появляется сразу. "+" и "*" его тривиально выводят.
Prelude> :t myFunc
myFunc :: Num a => a -> a -> a

VD>Если в дотнете числа имели бы общего предка, то и в дотнете можно было бы так. Но в дотнете числовые типы вообще никак не связаны.

Правильно, потому что система типов в .NET говно, как и в Джаве, с иерархией прибитой гвоздями. Поэтому в Скале сделали свою и implicit.
В Хаскеле все просто, видишь fmap -> Functor, видишь fold -> Foldable, видишь "+" -> Num.
Все это комбинируется как угодно по желанию левой пятки, пример: https://wiki.haskell.org/Num_instance_for_functions

N>>В Хаскеле проблем как раз нет.

VD>Ну, а зачем ты деление на умножение заменил?
Для единообразия кода со скалой.
Prelude> let myFunc a b = (a + b) / 2
Prelude> foldl myFunc 0.0 [1.0, 2.0, 3.0]
2.125
Prelude> foldl myFunc 0 [1, 2, 3]
2.125

VD>Лябды на две страницы? И повторно используются? Да кончай гнать то! Дай ссылку на такую лямбду. Ну, хоть на одну.

OMG! myFunc ^ может быть на две страницы, то есть твое "я просто напишу две лямбды" не катит. В настоящий момент в мейнстриме мы имеем или полную динамику в плюсах или костыли из дополнительных параметров как ты предложил ниже.

N>>Например в линейной алгебре где матрицв может быть над полем R или C. Или в растровой графике где идет параметризация алгоритма по colorspace.

VD>Ну, вот дай мне ссылку на реальный проект. Хоть посмотрю на это чуду. Только что-то подсказывает мне, что ссылки не будет.
https://github.com/boostorg/ublas/blob/develop/include/boost/numeric/ublas/lu.hpp

VD>Если кода будет действительно дофига, то проблему можно решить введения мааалюсенькой лямдочки, которая передаст вот это вот целочисленное вычисление. А просто дженерик-функции ведь никто не отменял. Да даже дженерик лямбды не запрещены. Проблемы только с арифметикой.

Это костыли и компромисс. Напомню про цель — "статика так же удобна как динамика".
Re[22]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 15:17
Оценка: 6 (1)
Здравствуйте, novitk, Вы писали:

N>И как ты получишь тип для твоей любимой подсказки если он вычисляется внутри макроса? Хинтом разделишь макросы выполняемые IDE и компиляторами?


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

В общем, все как в обычном компиляторе, с обычными фичами языка.

Мы меняем суть макросистемы. Раньше она сразу переписывала АСТ (т.е. код) программы в имеющиеся конструкции, а теперь макросы могут оперировать высокоуровневыми сущностными предметной области.

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

Бэкэнд, стати, тоже должен расширяться. Чтобы языковые расширения могли его дополнять.

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

Понимаю, что звучит как фантастика, но это уже работает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 15:21
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Ну, вот и мне с Вольфхундом.

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

VD>И тут получается, что тот же Немерл это и есть вывод типов как в OCaml или Haskell, только в чем-то немного мощнее, но менее обобщеннее.

LOL на "чем-то немного мощнее". Вы же простейший пример из Питона, C++, Скалы, Хаскеля повторить не можете.

VD>В общем-то примеры alex_public как раз показали, что статика не очень то уступает динамике, так как во всех случаях он привел пример на плюсах.

В плюсовых авто-лямбдах и шаблонах нет никакой статики. Для статики в плюсах нужно ждать концепты и оно имхо не масштабируется как типклассы, но тут я не уверен. Пусть alex_public примерчик на них перепишет, будем смотреть.

VD>Собственно обе фичи можно сэмулировать шаблонами. Вот только на практике не нужно.

"сэмулировать" можно все на свете, только здесь ничего "эмулировать" не нужно. Красивое решение уже есть.
Re[23]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 15:54
Оценка:
Здравствуйте, VladD2, Вы писали:

N>>И как ты получишь тип для твоей любимой подсказки если он вычисляется внутри макроса? Хинтом разделишь макросы выполняемые IDE и компиляторами?

VD>Две стадии. На первой макрос предоставляет новый синтаксис и его типизацию, на второй — кодогенерация необходимых для его реализации классов, функций и т.п. На первой стадии макросы вводят только новые символы и новый синтаксис.
У тебя эта первая часть продолжает быт turing-complete? Если да, то что мешает иметь в ней тормоза? Например макро, которое будет выводить поля в типе из метаданных таблицы DB, разве не будет иметь IO в первой части?
Re[24]: Портирование нитры.
От: WolfHound  
Дата: 16.02.17 16:13
Оценка:
Здравствуйте, novitk, Вы писали:

N>У тебя эта первая часть продолжает быт turing-complete? Если да, то что мешает иметь в ней тормоза? Например макро, которое будет выводить поля в типе из метаданных таблицы DB, разве не будет иметь IO в первой части?

1)Для того чтобы поиметь тормоза полным по Тьюрингу быть не нужно.
Ackermann(1000, 1000) и привет. Функция гарантированно вычисляется за конечное время, но легче от этого не становится.

2)От тормозов будут защищать мозги разработчиков макросов. Тормозящие макросы просто не будут использовать, и они тихо умрут.

3)База данных это просто ещё один вид исходных файлов. Так что ИО оно по любому есть.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[34]: Портирование нитры.
От: WolfHound  
Дата: 16.02.17 16:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>При С++-ных подхода — это ни разу не проблема. У Хасклея все сильно сложнее. Его классы типов более динамическая сшущность. Даже более динамическая нежели интерфейсы в дотнете.

Это деталь реализации. Никто не мешает компилятору хаскеля генерировать специализации на каждый чих.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[32]: Портирование нитры.
От: WolfHound  
Дата: 16.02.17 16:28
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Потянуть может и потянул, но злые языки говорят, что Go им нужен чтобы легче "масштабироваться" используя не очень сильных программистов. D (а так же скала, немерле и прочие) эту нишу не закрывает никак.

Ускорять разработку за счёт большого количества низкоквалифицированных программистов идиотизм.
Гораздо лучше взять сильных программистов и дать им в руки мощный инструмент.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[25]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 16:44
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>1)Для того чтобы поиметь тормоза полным по Тьюрингу быть не нужно.

Я как бы в курсе. Имелось ввиду что в неполной системе можно иметь контроль.

WH>2)От тормозов будут защищать мозги разработчиков макросов. Тормозящие макросы просто не будут использовать, и они тихо умрут.

Возможно, но ты меня пока не убедил. Подход не отличается от плюсов, где согласно alex_public мы наблюдаем тормоза на точных реализациях, а буст не умирает. Я конечно понимаю, что макры в N на порядок быстрее плюсовых шаблонов, но это легко убить за счет их более широкого применение.
Re[26]: Портирование нитры.
От: WolfHound  
Дата: 16.02.17 17:17
Оценка:
Здравствуйте, novitk, Вы писали:

N>Я как бы в курсе. Имелось ввиду что в неполной системе можно иметь контроль.

Нельзя. И я только что показал почему. Ackermann(1000, 1000) не завершится до конца жизни вселенной.
При этом в любом языке где можно доказать завершимость можно доказать зевершимость функции Аккерманна.

N>Возможно, но ты меня пока не убедил. Подход не отличается от плюсов, где согласно alex_public мы наблюдаем тормоза на точных реализациях, а буст не умирает.

В С++ выбора нет. Ты либо используешь буст и терпишь тормоза, либо работаешь на очень примитивном уровне.

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

С++ тормозит по тому что типизация и кодогенерация выполняются одновременно.
Я точно не замерял, но по ощущениям в случае с типизацией кода на нитре и генерацией исполняемого кода разница несколько порядков.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[27]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 17:44
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>При этом в любом языке где можно доказать завершимость можно доказать зевершимость функции Аккерманна.

При чем здесь Ackermann? Я говорю лишь о наличие контроля, тотальность всего лишь один из его видов. Вывод типов в Джаве/Шарпе не тормозит потому что там в системе типов ничего нельзя. В Скале позволено больше и получаем тормоза.
Re[40]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 17:51
Оценка:
Здравствуйте, novitk, Вы писали:

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


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

N>Поэтому меня надо слушать, а вас нет.


Каждый сам будет решать кому ему слушать. Твое бахвальство вряд ли повлияет на это решение.

VD>>И тут получается, что тот же Немерл это и есть вывод типов как в OCaml или Haskell, только в чем-то немного мощнее, но менее обобщеннее.

N>LOL на "чем-то немного мощнее". Вы же простейший пример из Питона, C++, Скалы, Хаскеля повторить не можете.

Ты просто не понимаешь о чем говоришь, или намеренно обманываешь. Этот пример намеренно высосан из пальца для пенисометрии. К выводу типов, который у Немерла мощнее чем в других языка он отношения не имеет. Невозможность его в точности повторить связана с особенностями системы типов дотнета. Аглоритм вывода типов тут ничего поделать не может. Раз между числовыми типами никакой связи нет, то записать работу с ними обобщенно невозможно. А эмуляция нужно поведение в языке в обход системы типов привело бы к просадке производительности.

Алгоритм вывода типов немерла имеет только два недостатка:
1. Он выводит только конкретные типы (хотя и наиболее близкий общий).
2. Он довольно медленный.

Зато он умеет выводить типы из использования. Это дает возможность писать код практически не прибегая к указанию типов, даже если типы могут быть выведены только сильно после использования. Классический пример — работа с хэш-таблицей:
def print(ht /* выводит : Dictionary[string, int] */, key /* выводит : string */) /* выводит : void */
{
  System.Console.WriteLine(ht[key]) // выводит перегрузку WriteLine(value : int) : void
}
def ht = Dictionary(); /* выводит : Dictionary[string, int] */
ht.Add("sss", 42);
print(ht, "sss");


Причем это на системе типов с сабтайпингом, множественным наследованием интерфейсов и неявными приведениями типов (в отличии от разных Окамлов и Скал). Собственно немерловый алгоритм изначально был развитием скаловского и ввел в него возможность вывода типов из использования.

VD>>В общем-то примеры alex_public как раз показали, что статика не очень то уступает динамике, так как во всех случаях он привел пример на плюсах.

N>В плюсовых авто-лямбдах и шаблонах нет никакой статики.

Ну, это уже какой-то махровое дилетантство. Иди разберись в терминологии. Динамика — это когда типы известны только в рантайме. В С++ — это, очевидно, не так. Все типы становятся известны во время компиляции (статически).

Другое дело, что в С++ используется утиная типизация. По сути типизация идет уже в контексте конкретной подстановки. Шаблоны раскрываются как мкросы и уже полученный АСТ компилируется.

N>Для статики в плюсах нужно ждать концепты и оно имхо не масштабируется как типклассы, но тут я не уверен. Пусть alex_public примерчик на них перепишет, будем смотреть.


Концепты тут не добавят гибкости и вообще ничего не изменят. Они просто позволят проверить типы еще до подстановки. Все будет по старому. Зато сообщения об ошибках компилятора можно будет получить еще до подстановки шаблона. И IDE будет работать качественнее.

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

VD>>Собственно обе фичи можно сэмулировать шаблонами. Вот только на практике не нужно.

N>"сэмулировать" можно все на свете, только здесь ничего "эмулировать" не нужно. Красивое решение уже есть.

Далеко не все. Не говори глупости. Например, С++-ное решение нельзя поместить в обобщенный указатель на функцию и вызвать для разных типов используя приведение типов. А Питоне же с этим проблем не возникнет.

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

В плюсах же генерируется по две специализации для лямбды с арифметкиой и для фолда (агрегейта). Так что ты в корне не прав. В плюсах статика, а в Питоне динамика, но результат один и тот же.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[40]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 18:12
Оценка:
Здравствуйте, novitk, Вы писали:

N>Решает, только по сравнению с Хаскелем это очень нетривиальные костыли с грязью. Пока не появились нормальные подсказки в IDE вообще был мрак.


Потому все и говорят, что Скала перегружена.

N>Никакого "позже" там нет, тайпкласс появляется сразу. "+" и "*" его тривиально выводят.

N>Prelude> :t myFunc
N>myFunc :: Num a => a -> a -> a

А, т.е. ты о Num говорил? Но чем это от просто типа отличается?

Вот будь в дотнете такой Num и никакие тайпклассы не понадобились бы.

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

N>Правильно, потому что система типов в .NET говно, как и в Джаве, с иерархией прибитой гвоздями.


Не то чтобы уж совсем говно, но вот этот момент упущен.

N>Поэтому в Скале сделали свою и implicit.


Кривой кастыль. Учитывая, что Скала генерирует специализации — еще и не нужный костыль.

N>В Хаскеле все просто, видишь fmap -> Functor, видишь fold -> Foldable, видишь "+" -> Num.

N>Все это комбинируется как угодно по желанию левой пятки, пример: https://wiki.haskell.org/Num_instance_for_functions

Я в курсе. Но в данном случае все это не надо. Это надо для подключения fold-а к чему-то отличному от списка, для чего функция fold не написана. И к сожалению, это не бесплатно. Они там в рантайме какую-то информацию таскают.

N>OMG! myFunc ^ может быть на две страницы, то есть твое "я просто напишу две лямбды" не катит.


Если это большая функция, то какая проблема обобщить в ней арифметику передав для этого функцию в параметре?

N>В настоящий момент в мейнстриме мы имеем или полную динамику в плюсах


Что?

N>или костыли из дополнительных параметров как ты предложил ниже.


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

А если это лямбда, то она будет конкретной, так как их всегда подставляют по месту.

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

Именно по этому данный пример является высосанной из пальца пенесометрией и никак не демонстрирует реальные преимещества языка.

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

N>>>Например в линейной алгебре где матрицв может быть над полем R или C. Или в растровой графике где идет параметризация алгоритма по colorspace.

VD>>Ну, вот дай мне ссылку на реальный проект. Хоть посмотрю на это чуду. Только что-то подсказывает мне, что ссылки не будет.
N>https://github.com/boostorg/ublas/blob/develop/include/boost/numeric/ublas/lu.hpp

Ну, и где там арифметика с цветами? Или что ты там хотел показать?

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

N>Это костыли и компромисс. Напомню про цель — "статика так же удобна как динамика".


В вашем любоимо С++ 90% сделано через костыли и компромисы. И тут вдруг пошла борьба с компромиссами для совершенно высосанного из пальца случая.

В конкретных случаях всегда можно придумать более интересные решения. Вот для тех же матриц можно придумать вот такое:
http://omega.sp.susu.ru/books/conference/PaVT2011/full/117.pdf

Можно такое сделать на С++ или Питоне?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 18:37
Оценка:
Здравствуйте, novitk, Вы писали:

N>У тебя эта первая часть продолжает быт turing-complete?


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

N>Если да, то что мешает иметь в ней тормоза?


То что 99% года дует на на языке общего назначения, а на ЯЗС. А он не позволяет зациклиться и обеспечивает расчет за линейное время.

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

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

Так что основной проблемой макроса становится не ошибки, а просто большой объем действий, которые ему нужно сделать. Во время компиляции — это не критично, так как 1-2 секунды не особо напрягают. А вот в режиме IDE это может стать проблемой.

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

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

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

N>Например макро, которое будет выводить поля в типе из метаданных таблицы DB, разве не будет иметь IO в первой части?


Такой макрос просто будет отрабатывать в время загрузки типов из внешних сборок. Так что во время редактирования кода эти типы уже будут загружены. Фактически его можно оформить как расширение бэкэнда. Причем грузить он может как типы (в понятии языка общего назначения), так и специализированные сущности описывающие именно сущности БД.

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

В результате же работы такого макроса будут загружены символы не отличимые от тех, что будут загружены из внешних библоитек или получены из исходников. Так что дальнейшая работа с ними будет единообразной и не будет влиять на скорость работы IDE.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 18:39
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Это деталь реализации. Никто не мешает компилятору хаскеля генерировать специализации на каждый чих.


Там есть некоторые фичи, которые невозможны в статическом исполении. Например у них есть какой-то гипер-обобщенный мап по произвольной структуре. В общем, все концептуально красиво, но в рантайме оверхэд.

Так то понятно, что можно сделать как в С++. Но при этом получается не совсем гибкое решение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[41]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 19:13
Оценка:
Здравствуйте, VladD2, Вы писали:

Ты зря пытаешься меня унизить и косить дурака. Довольно очевидно (особенно для фаната макропрограммирования, который вообще должен не замечать разницы), что я подразумеваю под динамикой именно "утинную типизацию" и в обсуждаемом контексте плюсов она конечно применима к compile-time. Так вот тайпклассы это красивое решение для статики в compile-time.

Про улучшенный вывод типа в Н я тоже наслышан, но ты зачем то сравнился с Хаскелем, где вывод типов работает тупо всегда и везде кроме экспериментальных расширений системы типов в отличие от Немерле. Сравнил бы с той же скалой, вопросов бы не было.
import qualified Data.HashTable.IO as H
main = do
     ht <- H.new
     H.insert ht "sss" 42
     print ht

Типов нет вообще, ht создается до вставки, все как у тебя. Предваряя, не надо мне объяснять про невозможность в ХМ использовать подтипы из ООП, я тут тоже в курсе.
Re[33]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 19:32
Оценка: 6 (1)
Здравствуйте, DarkEld3r, Вы писали:

DE>Это работает в обе стороны: С++ сейчас нужен или из-за легаси, которое выкинуть жалко или там, где не подходит GC. Можно, конечно, рассказывать как люди ошибаются, но это, вряд ли, на что-то повлияет. А там, где устраивает GC возьмут другой язык и всё.


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

Плюс такие люди тормоза того же дотнета всегда списывают на GC, что по сути — миф. Более того они видят недостатки GC там где их нет. А о реальных недостатках или не догадываются, или не берут их в расчет. Так основная проблема GC вовсе не мифические паузы при сборке мусора, а разные мемори-барьеры, требуемые для инкрементального сбора мусора.

Ну, а 90% тормозов дотнета связаны даже не с этим, просто с посредственной кодогенерацией и в отсутствие возможностей управлять процессом кодонерерации для всех этих мемори-барьеров.

Далее проблемы пауз при работе GC (которые во многом надуманы) опять же связаны с тем, что GC глобальный. Если ввести в язык возможность использования множества маленьких GC и дать программисту явно указывать какие объекты в них должны попадать и когда лучше собирать мусор в каком из них, то эффективность GC может оказаться сильно выше, чем ручного управления памятью. А вот затраты сил и времени на такие аннотации могут быть куда меньше чем на ручное управление (я говорю о дестркуторах и прочих смартпоинтерах). И главное, в такой модели будет контроль и безопасность такой же как в языках с глобальным GC.

Возьмем к примеру работу компилятора. Вот парсим мы файл. Мы можем создавать временные объекты в приватной куче потока, а АСТ в специальной куче создаваемой явно корневой функцией парсера. Выразить это можно так:
heap AstHeap { accessibility: thread; }

class Parser
{
  [GC(Temp(CollectAfterReturn), AstHeap(CollectAfterReturn))]
  public Parse(text : string) : AstHeap#Ast
  {
    ...
    def root = new AstHeap#Root();
    ...
    def stringBuilder = ...; // stringBuilder ссылается на приватную кучу потока
    // указываем ToString, что нужно создать строку в куче "AstHeap":
    root.RootNamespace = new AstHeap#Namespace(stringBuilder.ToString[AstHeap#]()); // ОК
    root.RootNamespace = new AstHeap#Namespace(stringBuilder.ToString()); // Ошибка! Строка в другой куче!
    root.RootNamespace = new Namespace(stringBuilder.ToString()); // Ошибка! Namespace не в той куче!
  }
}

Фактически куча AstHeap в данном примере (на псевдокоде) это пул в котором вообще не надо производить сборку мусора, а все объекты из временной кучи умрут после завершения метода Parse, так что их сборка не будет ничего стоить. Все что нам нужно сделать, чтобы рантайм не валял дурака и не собирал мусор во время работы метода Parse — это пометить метод Parse неким атрибутом. В данном примере это атрибут:
  [GC(Temp(CollectAfterReturn), AstHeap(Never))]

Он говорит ратнайму, что в методе Parse:
1. Допустимо использовать только две кучи:
* Temp — стандартная приватная куча потока.
* AstHeap — специализированная куча в которую попадают только узлы AST.
2. CollectAfterReturn — говорит, что мусор из кучи (для которой он указан) нужно собрать только после выхода из метода Parse или при нехватке памяти в систем (что в нормальных условиях не случится). Другими словами, данный атрибут запрещает сборку мусора внутри метода и заставляет рантайм собрать его после выхода. Рантайм может произвести сборку мусора нулевого поколения до входа в функцию и позволить потоку гадить только в нулевое поколение. Таким образом после выхода из функции сборка мусора будет практически бесплатна.
3. Never — говорит, что мусор из кучи (для которой он указан) не нужно собирать вовсе. Мы заранее знаем, что мусорных объектов в AstHeap помещаться не будет. Стало быть и собирать его не следует.

В AstHeap могут быть ссылки только на объекты внутри этой же куче, на объекты из глобальной кучи, на уникальные объекты (размещаемые в куче уникальных объектов) и на объекты из кластера куч, если куча добавлена в кластер.

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

Так мы можем создать кластер для символов (и прочих объектов создаваемых во время типизации) и размещать ссылки на них в объектах размещенных в кучах входящих в кластер. Это позволяет нам императивно менять менять АСТ гарантируя, что в него попадут ссылки только на объекты из кластера.

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

DE>Кстати, в D, на данный момент, это самое отключение ведёт к невозможности использовать многое из стандартной библиотеки. Сейчас идут какие-то подвижки в этом направлении, но долгоe время не заморачивались, что ещё раз говорит о не слишком удачном позиционировании языка (как замену С++).


Скорее это говорит о том, что нет особого смысла отключать GC. Надо тебе жить без него — используй объекты размещаемые на стеке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 19:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>То что 99% года дует на на языке общего назначения, а на ЯЗС. А он не позволяет зациклиться и обеспечивает расчет за линейное время.

Интересно. На ЯЗС посмотрю еще раз.

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

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

VD>Типизация же по верхам (как мы это называем) позволят производить только те расчеты, что нужны для работы IDE, а всю действительно тяжолую работу откладывать на потом (на стадию компиляции).

Готов поверить.

N>>Например макро, которое будет выводить поля в типе из метаданных таблицы DB, разве не будет иметь IO в первой части?

VD>Такой макрос просто будет отрабатывать в время загрузки типов из внешних сборок. Так что во время редактирования кода эти типы уже будут загружены.
Почему опять внешние сборки? Нитра, 2017 год, WTF? Я хочу вот так писать, включая в REPL:

val people = dbTable(mydb, "people")
val maxAge = people.map(_.аge).max

Ессно готов подождать на первой строчке, но не на второй.
Re[42]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 20:30
Оценка:
Здравствуйте, novitk, Вы писали:

N>Ты зря пытаешься меня унизить и косить дурака. Довольно очевидно (особенно для фаната макропрограммирования, который вообще должен не замечать разницы), что я подразумеваю под динамикой именно "утинную типизацию" и в обсуждаемом контексте плюсов она конечно применима к compile-time. Так вот тайпклассы это красивое решение для статики в compile-time.


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

От отсутствия классов типов или концептов С++ не становится динамикой или не статикой (что одно и тоже).

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

Классы типов гибче тем, что их можно реализовать для внешнего типа, а интерфейсы только для вновь создаваемых. Если бы в дотнете ввели интерфейс INat, как в Хаскеле. То проблема бы решилась сама собой и классы типов для этого не понадобились.

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

N>Про улучшенный вывод типа в Н я тоже наслышан, но ты зачем то сравнился с Хаскелем, где вывод типов работает тупо всегда и везде кроме экспериментальных расширений системы типов в отличие от Немерле. Сравнил бы с той же скалой, вопросов бы не было.


Я особо не сравнивал с Хаскелем. В прочем, там применяется расширенный на классы типов алгоритм Хидли-Милнера. Алгоритм этот довольно ограниченны из-за чего в Хаскеле (как и в других языка где он испольуется) нет ряда функций имеющихся в императивных языках вроде С++. Так, например, не поддерживаются неявные приведения типов, перегрузки и т.п. В результате (в купе с ленивостью и ориентацией на каррирование) язык получается получается ... э... своеборазным. Мягко говоря — не для всех, не традиционный.

N>
N>import qualified Data.HashTable.IO as H
N>main = do
N>     ht <- H.new
N>     H.insert ht "sss" 42
N>     print ht
N>

N>Типов нет вообще, ht создается до вставки, все как у тебя. Предваряя, не надо мне объяснять про невозможность в ХМ использовать подтипы из ООП, я тут тоже в курсе.

А что нужно сделать, чтобы этот Data.HashTable.IO загрузить?

Мне орут:
<no location info>: error:
    Could not find module ‘Data.HashTable.IO’
    Perhaps you meant
      Data.Hashable (from hashable-1.2.5.0@hashable-1.2.5.0-D2qhjboTBST6rFOSUg03ZP)

А я в Хаскеле не силен.

Ну, можно полностью пример воспроизвести (с объявлением функции до использования)?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 21:36
Оценка:
Здравствуйте, novitk, Вы писали:

N>Интересно. На ЯЗС посмотрю еще раз.


Посмотри. Штука интересная и красивая получилась. Чем-то похоже на Хаскель (в смысле того, что все вычисления зависят друг от друга), но при этом могут считаться как лениво, так и энергично. Плюс для АСТ и символов (а это считай система типов для ЯЗС) поддерживается множественное наследование. Это позволяет производить очень качественную декомпозицию не дублируя код вовсе. Так же интересно, что мы умудрились обойтись без циклов и fold-ов/map-ов. Списки АСТ в Нитре наследуют ЗС от своих элементов, что позволяет производить вычисления над списками без циклов и функций. Просто если у элемента свойства есть ЗС, то оно появляется и у списка. Присваивание значения свойству списка передает их каждому элементу. Если надо "протащить" значение через элементы, на то есть inout-свойства. Суешь значение в in-свойство списка и оно протаскивается между каждым элементом (на вход элементу оно присваивается в in-свойство, а на выход берется из out-свойства). В итоге результат можно взять в out-свойстве списка.

При этом все ЗС, как и в функциональных языках, можно присваивать только один раз. Но выглядит это как императивное присвоение.
Вот пример типичного кода на ЗС:
// определение ветки AST производящей декларацию символа
abstract declaration Rule : RuleType, Container, SyntaxElementContainer // множественное наследование
{
  symbol // вот эта секция определяет символ
  {
    SpanClass = NitraLang.RuleSpanClass;
    Kind      = "syntax";
    Scope     = MemberTable;
  }

  // Вычисления на ЗС

  // Присвоение значения ЗС списка. Оно "протаскивает" значения между элементами.
  // Элементы могут возвращать в своем LiteralsOut-свойстве измененное значение.
  Members.LiteralsIn           = LiteralsIn;
  Members.ContainingTable      = Symbol.MemberTable;
  Members.Scope                = Scope.HideWith(Symbol.MemberTable);
  Members.Parent               = Symbol;
  Attributes.Scope             = Scope;

  // Структурные поля AST. Данные сюда попадают из дерева разбора
  Members    : RuleBodyMember*;
  Attributes : RuleAttribute*;
}


N>Практика пока показывает, что макросы пока масштабно используют только в плюсах, где они тормозят нещадно.


От части тормоза там связаны с тем, что шаблоны выполняют не свойственную им функцию — языка программирования. Модель вычисления получается довольно затратная (фактически вычисления осуществляются на основе редукции термов). Плюс это интерпретатор. Компиляции (в машинный код) мета-шаблонов не предусмотрено. Загрузки в бинарном виде — тоже.

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

Конечно, это не гарантирует от тормозов вызванных большим объемов самих вычислений. Но по крайней мере проблем С++ связанных с тем, что нужно разобрать все инклюды и закэшировать результат — нет. Макра просто является скомпилированной функций. Если она не применяется в данном файле, то и не жрет время.

VD>>Такой макрос просто будет отрабатывать в время загрузки типов из внешних сборок. Так что во время редактирования кода эти типы уже будут загружены.

N>Почему опять внешние сборки? Нитра, 2017 год, WTF? Я хочу вот так писать, включая в REPL:

А Репл тут чем отличается? Ты когда в Хаскеле репл запускаешь, Хаскель тоже грузит некий набор модулей. Просто у хаскеля то что я называю сборкой называется модулем. И все. В репле хаскеля даже есть менюшка "Clear Modules". По сути это перезагрузка дефолтных модулей со сбросом состояния репла.

N>val people = dbTable(mydb, "people")

N>val maxAge = people.map(_.аge).max

N>Ессно готов подождать на первой строчке, но не на второй.


Вообще ждать не надо. И писать можно не так как у тебя, а так:
def people = MyDB.People;
def maxAge = People.Max(_.аge);

или просто:
def maxAge = MyDB.People.Max(_.аge);

так как и MyDB, и People уже будут представлять собой типизированные сущности.

Более того без проблем можно будет сделать и поддержку всего SQL, чтобы писать как-то так:
def maxAge = select Max(аge) from MyDB.People where name like 'A%';

В общем, это уже больше от фантазии зависит.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[41]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 22:02
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А, т.е. ты о Num говорил? Но чем это от просто типа отличается?

Ессно, а ты о чем думал?

VD>Вот будь в дотнете такой Num и никакие тайпклассы не понадобились бы.

По-моему ты до сих пор не догоняешь. Ты все думаешь что если MS пропишет Num в базе Double или Complex, то проблема решится. Эти классы тогда будут обобщенны, но что сделать с классом SupеrMatrix, которую ты взял у Васи?

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

VD>И в дотнете тоже дженерики сгенерировали бы специализации для фолдов сгенерили бы.
При чем тут fold? Какие нафиг специализации? Fold в этом примере всегда над листом и поэтому имеет ровно одну специализацию. Или ты про какие-то детали реализации?

VD>Это надо для подключения fold-а к чему-то отличному от списка, для чего функция fold не написана.

Это надо для всего.

VD>И к сожалению, это не бесплатно. Они там в рантайме какую-то информацию таскают.

Это вопрос реализации, тебе уже Волфхаунд сказал.

N>>OMG! myFunc ^ может быть на две страницы, то есть твое "я просто напишу две лямбды" не катит.

VD>Если это большая функция, то какая проблема обобщить в ней арифметику передав для этого функцию в параметре?
Не уверен, что мы до конца понимаем друг друга. Передавать надо не функцию, a в терминах Немерле интерфейс/трейт, скажем INumeric<Т> в котором будут определены обобщенные plus, minus и т.д.

Проблем две:
Во-первых, одна большая функция вызывает другую большую функцию в которую этот интерфейс тоже надо передавать. Комок говна растет.
Во-вторых, вместо нормальной нотации "(a+b)/2" надо писать "num.divide(num.plus(a, b), num.fromInt(2))".

N>>В настоящий момент в мейнстриме мы имеем или полную динамику в плюсах

VD>Что?
Здесь и дальше: динамика == "утиная типизация"

VD>Ну, вот и давай разберемся часто ли нужны такие костыли? Я вот что-то в своем коде не вижу такого.

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

VD>И они постоянно используются. Проблемы возникают только с арифметкой. Но ее крайне мало. И вот в тех не реально редких случаях когда это нужно, можно спокойно обойтись костылем в виде ФВП в качестве параметра такой функции.

Сделай библиотеку для линейной алгебры на Nemerle и посмотри на результат.

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

Я согласен, но это довольно низкая планка.

N>>>>Например в линейной алгебре где матрицв может быть над полем R или C. Или в растровой графике где идет параметризация алгоритма по colorspace.

VD>>>Ну, вот дай мне ссылку на реальный проект. Хоть посмотрю на это чуду. Только что-то подсказывает мне, что ссылки не будет.
N>>https://github.com/boostorg/ublas/blob/develop/include/boost/numeric/ublas/lu.hpp
VD>Ну, и где там арифметика с цветами? Или что ты там хотел показать?
Это пример по "Например в линейной алгебре где матрицв может быть над полем R или C."

N>>Это костыли и компромисс. Напомню про цель — "статика так же удобна как динамика".

VD>В вашем любоимо С++ 90% сделано через костыли и компромисы.
Я не люблю C++. Очень неудобный язык, но когда нужна скорость вариантов нет.

VD>В конкретных случаях всегда можно придумать более интересные решения. Вот для тех же матриц можно придумать вот такое:

VD>http://omega.sp.susu.ru/books/conference/PaVT2011/full/117.pdf
VD>Можно такое сделать на С++ или Питоне?
В гугле забанили?
http://thrust.github.io/
https://devblogs.nvidia.com/parallelforall/copperhead-data-parallel-python/
https://docs.continuum.io/numbapro/CUDAJit
Re[39]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 22:05
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Сила скриптовых языков в простоте и краткости.


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

_>Что касается МП, то если в некоторых сложных проектах на Питоне оно действительно применяет, то в коротеньких скриптах (а у меня Питон работает в основном для этих целей) оно точно не требуется.


Дык МП используется не только когда ты пишешь метакод, но и когда ты используешь библиотеки. Я когда пишу "скрипты", использую кучу макросов из стандартной библиотеки. Я уже не говорю о том, что в Немерле if и foreach — это макросы, но уж такие мелкие полезняшки, как макрос Record, используются постоянно.
[Record] // добавляет конструктор включающий все поля не помеченные атрибутом RecordIgnore
class Author
{
  publuc FirstName;
  publuc SurName;
  [RecordIgnore] publuc Articles : List[Article] = List();
}


Уверен, что и Питоне тоже самое. Ты можешь даже не знать, что некоторая фича сделана через МП, но ты можешь ее использовать.

_>Да, да, в Немерле2 совершенно точно надо предоставить полноценный параметрический полиморфизм, а не это убожество (дженерики) из .net.


Если честно, дженериков для 90% задач хватает. Но хуже то от шаблонов точно не будет. Так что я за оба варианта. Только синтаксис надо упростить по сравнению с плюсовым. И выкинуть возможность рекурсивной конкретизации (на котором можно вычисления строить). Для вычислений пусть используются макросы.

_>Кстати, с точки зрения производительности реализация из C++ естественно самая лучшая, т.к. гарантирует инлайнинг (Хаскель тут далеко отстаёт), но при этом такой подход мешает нормальной модульности. Хотя в D (где тоже шаблоны) проблему с модулями вроде как-то решили (не копался во внутренностях, так что не знаю как именно).


На самом деле модульности он не мешает. Просто надо:
1. Шаблоны компилировать в АСТ (помещать их в модули в виде аннотированного АСТ-а). Сериализовывать АСТ и символы мы уже умеем средствами Нитры.
2. Шаблоны не должны быть вычислимыми (Тьюринг-полными). Это очень важно и для скорости и для модульности.
3. Для шаблонов нужно реализовать аналог кострэйнов из дженериков или планируемых (вот уже 17 лет) концептов С++. Возможно надо подумать о том нельзя ли для этого воспользоваться идеями классов типов из Хаскеля. Но тут надо быть осторожным, чтобы фича не требовал поддержки в рантайме, раз уж шаблоны подставляются во время компиляции.

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

Если получится хорошо бы вообще сделать шаблоны как расширение дженериков. Типа дописываем к описанию дженерик-типа ключевое слово template и получаем недостающее поведение:
template class A<T>
  where T: _+_ // T поддерживает бинарный оператор сложения
{
  public Sum(a : T, b : T) : T
  {
    a + b
  }
}
...
def x = A().Sum(40, 2);              // OK x == 42
def x = A().Sum(36, 0.6);            // OK x == 36.6
def x = A().Sum("Hello ", "World!"); // OK x == "Hello World!"
def x = A().Sum("Hello ", 42);       // Error: нет неявного приведения между числом и строкой
def x = A().Sum(A<int>(), A<int>()); // Error: A<T> не поддерживает оператор "+"
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[34]: Портирование нитры.
От: WolfHound  
Дата: 16.02.17 22:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Возьмем к примеру работу компилятора. Вот парсим мы файл. Мы можем создавать временные объекты в приватной куче потока, а АСТ в специальной куче создаваемой явно корневой функцией парсера. Выразить это можно так:

Может прежде чем что-то изобретать, таки изучишь то что тут написано?
Re: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 29.10.14

Re[2]: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 29.10.14

Re[2]: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 30.10.14

Re[2]: Мысли о эффективном автоматическом управлении памятью
Автор: WolfHound
Дата: 30.10.14

Там всё гораздо лучше продумано чем у тебя.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[43]: Портирование нитры.
От: novitk США  
Дата: 16.02.17 22:51
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я тебя не пытаюсь унизить. Сказал чушь. Я тебе на это указываю. Я не телепат и не могу знать из-за чего ты это делаешь.

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

VD>В дотнете есть сущность сходная концептам — это констрэйны на дженериках. Аналогом классов типов (в дотнете) являются интерфейсы. В купе с консрэйнами они дают нужную функциональность.

Нет не дают, для полных typeclass еще нужен implicit.

VD>Классы типов гибче тем, что их можно реализовать для внешнего типа, а интерфейсы только для вновь создаваемых. Если бы в дотнете ввели интерфейс INat, как в Хаскеле. То проблема бы решилась сама собой и классы типов для этого не понадобились.

Ну допустим он есть, как мне сделать теперь:
val a = List(1, 2, 3)
val b = List(3, 4, 5)
a * b

VD>Я особо не сравнивал с Хаскелем.

но мнение имеешь...

VD>Так, например, не поддерживаются неявные приведения типов, перегрузки и т.п.

Не нужно. В скале все это впихнули, вышло плохо.

VD>А что нужно сделать, чтобы этот Data.HashTable.IO загрузить?

сейчас нет под рукой нужного компа(*), но что-то типа:
cabal update
cabal install hashtable

VD>Ну, можно полностью пример воспроизвести (с объявлением функции до использования)?

import qualified Data.HashTable.IO as H

printKey d k = do
     v <- H.lookup d k
     print v

main = do
     ht <- H.new
     H.insert ht "sss" 42
     printKey ht "sss"

не проверял из за (*) ^!
Отредактировано 16.02.2017 22:53 novitk . Предыдущая версия .
Re[42]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 22:54
Оценка:
Здравствуйте, novitk, Вы писали:

N>Ессно, а ты о чем думал?


Я думал ты о Foldable говоришь.

N>По-моему ты до сих пор не догоняешь. Ты все думаешь что если MS пропишет Num в базе Double или Complex, то проблема решится. Эти классы тогда будут обобщенны, но что сделать с классом SupеrMatrix, которую ты взял у Васи?


Num должен быть просто интерфейсом. В нем должны быть методы Add(), Sub(), Mul, Div() и т.п. Тогда создатель SupеrMatrix просто его реализует и я смогу использовать его там где ожидается Num. А если даже не реализует, я смогу создать наследника SupеrMatrix и реализовать интерфейс для него.

Я как бы согласен, что классы типов хороши тем, что их можно описать независимо от типа. Но и внесение интерфейса Num решило бы проблему с арифметикой.

N>При чем тут fold? Какие нафиг специализации? Fold в этом примере всегда над листом и поэтому имеет ровно одну специализацию. Или ты про какие-то детали реализации?


При том, они будут работать со списками разных типов, и если типы — это вэлью-типы (не ссылочные), то надо генерировать разные специализации.

Дотнет так и поступает, если функция принимает интерфейс (или класс) один из параметров типов которого является вэлью-типом.

VD>>И к сожалению, это не бесплатно. Они там в рантайме какую-то информацию таскают.

N>Это вопрос реализации, тебе уже Волфхаунд сказал.

Раз они так сделали, значит в реализации были какие-то проблемы.

N>Не уверен, что мы до конца понимаем друг друга. Передавать надо не функцию, a в терминах Немерле интерфейс/трейт, скажем INumeric<Т> в котором будут определены обобщенные plus, minus и т.д.


Можно просто вынести зависящий от типа аргументов кусок кода в функцию:
SomeBigMethod(xs : Seq[T], alghoritm : T * T -> T) : T
{
  // много кода
  foreach (x in xs)
  foreach (y in ys)
    DoSome(alghoritm(x, y));
  // много кода
}

SomeBigMethod([1, 2, 3],       (x, y) => (x + y) / 2);
SomeBigMethod([1.1, 2.1, 3.3], (x, y) => (x + y) / 2.0);


N>Во-первых, одна большая функция вызывает другую большую функцию в которую этот интерфейс тоже надо передавать. Комок говна растет.

в случае применения паттерна описанного выше этой проблемы нет.

N>Во-вторых, вместо нормальной нотации "(a+b)/2" надо писать "num.divide(num.plus(a, b), num.fromInt(2))".

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

N>Здесь и дальше: динамика == "утиная типизация"


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

N>Потому что ты не пишешь библиотеки параметризуемые дженериками, а только используешь. Ну и не до конца вкурил FP


Ну, почему же? Приходится иногда.

N>Сделай библиотеку для линейной алгебры на Nemerle и посмотри на результат.


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

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

N>Я согласен, но это довольно низкая планка.

Ну, так может тогда пора признать, что для скриптовых целей эти пенисометрические примеры не годятся? Я согласен, что когда ты говоришь о библиотеках работающий с вычислениями — это актуально. Но ёлы-палы, мы же о применении в качестве скрипта говорили. Кому нужны расчеты на матрицах написанные на Питоне?

Выходит, что у нас в сравнении Немерла (т.е. высокоуровневого статически-типизированного ЯП) со скриптом приводится аргументация уместная для статически-типизированных битовыжимальных языков вроде С++, а при сравнении с С++, я так понимаю, будут приводиться аргументы больше пригодные к скриптам.

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

По факту это демонстрация пары фич действительно удачно реализованных в С++ и Питоне. При этом другие языки из этих классов данных фичей могут и не иметь.

Но у других языков есть другие преимущества. Тот же паттерн-матчинг. Или простой синтаксис и мощный вывод типов. Но тут ты начинаешь указывать на Хаскель. Несомненно в Хаскеле есть что показать. И несомненно у него есть приемущества перед любыми другими языками. Но так же есть и недостатки. И основной недостаток заключается в том, что это язык не для реального мира. Импиратив в нем куда как менее удобен нежели в любом императивном языке. А в реальном мире функциональный код живет в суровой действительности императивного мира. И если там еще попарсить функционально можно, то GUI на Хаскеле это спорное решение.

Ну, и главное, что мы не можем взять фичи всех перечисленных языков для реализации своих задач. В Питоне будет недоставать скорости кода и статических проверок. В С++ придется тратить много усилий чтобы следить за правильным использованием памяти, да и код получается более громоздкий. В Хаскеле жопа с императивом. Вот и воходит, что языки типа Немерла (Ну, может еще Котлина и Скалы) — это некий компромисс. Эдакий Гиви Абрамович Чингачгук (из одного анекдота, в котором еврей хотел понравиться группе девушек с разными вкусами). И у него это неплохо получается. Меня реально не тянет взять Питон.

Но, конечно, минусы есть. Вот один из них тут показали. Я могу и сам привести ряд других по мере значимости (для меня):
1. Медленная компиляция (компилятора). Почти уверен, что Н2 ее решит. Там в основном виноват вывод типов. На базе ЗС он должен получиться лучше.
2. Более медленное исполнение кода. Оно в основном вызвано худшей оптимизацией кода и джит-компиляцией. Последнее решается ngen-ом. А вот первое требует смены кодогенератора. МС 10 лет не может этой проблемой заняться всерьез. Ну, естественно, вносят свою лепту рантайм-проверки и разные мемори-барьеры, нужные для устранения пауз GC. По каждому из вопросов есть идеи как их решить. Но все это требует наличия собственного рантайма с собственной кодогенерацией и тюнинга работы с GC. Что касается конкретно GC, то большие надежды на локальный GC. Кроме ускорения и возможности отказаться от мемори-барьеров (в некоторых случаях) это так же позволяет привнести в язык дополнительный контроль за временем жизни объектов и лучше контролировать повисшие ссылки (когда объект по логике автора должен был умереть, но по ошибке жив).
3. Клюки и тормоза в IDE.
4. Побочные эффекты от работы макросов (об этом я тут рядом уже писал).
5. Не бесплатность лямбд и замыканий. В Немерле для них зачастую создаются объекты, что дороже, чем императивный подход.
6. Не гибкость дженириков. Причем этот не просто самая последняя по списку проблема. На практике она вообще мало значима. Хотя, я и не отказался бы иметь быстрые дженерики с улучшенными констрэйнами или шаблоны.

N>Я не люблю C++. Очень неудобный язык, но когда нужна скорость вариантов нет.


Вообще-то есть С и Ди.

VD>>В конкретных случаях всегда можно придумать более интересные решения. Вот для тех же матриц можно придумать вот такое:

VD>>http://omega.sp.susu.ru/books/conference/PaVT2011/full/117.pdf
VD>>Можно такое сделать на С++ или Питоне?
N>В гугле забанили?
N>http://thrust.github.io/
N>https://devblogs.nvidia.com/parallelforall/copperhead-data-parallel-python/
N>https://docs.continuum.io/numbapro/CUDAJit

Дык, это все уже написанные библиотеки. А то способ написать оные без низкоуровневого мрака. Не хочешь же ты мне сказать, что библиотека для Питано написана на питоне?

Это примерно тоже самое, что на твои претензии с арифметикой в дженериках со сылкой на шаблонную их реализацию на С++, дать ссылку на готовую библиотеку умножения матриц для дотнета, да еще и написанную на С.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.17 23:02
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>Возьмем к примеру работу компилятора. Вот парсим мы файл. Мы можем создавать временные объекты в приватной куче потока, а АСТ в специальной куче создаваемой явно корневой функцией парсера. Выразить это можно так:

WH>Может прежде чем что-то изобретать, таки изучишь то что тут написано?

Это и есть "что-то изобретать".

WH>Там всё гораздо лучше продумано чем у тебя.


Любишь ты себя любимого похвалить.

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

Ссылки я твои видел. Спасибо. Можно их по пятому разу не приводить.

Синтаксические решения там не самое важное. В реальности они все изменятся, так как изменились решения в том же парсере и АСТ-е. Важно продумать способы использования на практике. Задачи то разные бывают, и решение должно быть универсальным, накрывающим разные случаи использования.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: Портирование нитры.
От: WolfHound  
Дата: 16.02.17 23:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Любишь ты себя любимого похвалить.

Ну что поделать если я два года назад придумал решение, которое лучше твоих фантазий.
Как ты будешь передавать кучу в метод?
А возвращать из метода?
А передавать в другой поток?
А объединять две кучи?
А выводить что в какой куче лежит? Ибо захламлять код всяким мусором типа указания кучи явно не наш метод.
У меня всё это прописано. А у тебя даже намёков нет.

VD>Синтаксические решения там не самое важное. В реальности они все изменятся, так как изменились решения в том же парсере и АСТ-е. Важно продумать способы использования на практике.

А я и не про синтаксис говорю. Там ещё и механика всего этого дела расписана.

VD>Задачи то разные бывают, и решение должно быть универсальным, накрывающим разные случаи использования.

Любая система типов отсекает некоторое множество решений.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[33]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 05:08
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Это работает в обе стороны: С++ сейчас нужен или из-за легаси, которое выкинуть жалко или там, где не подходит GC. Можно, конечно, рассказывать как люди ошибаются, но это, вряд ли, на что-то повлияет. А там, где устраивает GC возьмут другой язык и всё.


Не только там, где не подходит GC. На самом деле всё достаточно просто: любые вменяемые команды предпочитают работать только с мейнстрим языками — это обеспечивает вменяемую инфраструктуру (библиотеки, инструменты, сообщество). Так вот из нативных (т.е. не требующих отдельной установки специального рантайма и позволяющих эффективно работать с системным API на любой платформе) языков у нас к мейнстриму сейчас относятся наверное всего четыре: C, C++, Go, Swift. Но Swift вычёркиваем сразу, если мы не хотим ограничиться мирком Apple. Из оставшихся: Go — имеет слабую кроссплатформенность и быстродействие, C — неудобный и небезопасный язык. И оба они отстают от C++ по набору библиотек и возможностям языка. Так что выбор как бы очевиден.

DE>Кстати, в D, на данный момент, это самое отключение ведёт к невозможности использовать многое из стандартной библиотеки. Сейчас идут какие-то подвижки в этом направлении, но долгоe время не заморачивались, что ещё раз говорит о не слишком удачном позиционировании языка (как замену С++).


Не надо там ничего отключать. Достаточно его просто не использовать и всё.
Re[40]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 05:38
Оценка:
Здравствуйте, novitk, Вы писали:

N>В плюсовых авто-лямбдах и шаблонах нет никакой статики. Для статики в плюсах нужно ждать концепты и оно имхо не масштабируется как типклассы, но тут я не уверен. Пусть alex_public примерчик на них перепишет, будем смотреть.


Да не будет там ничего интересного. Если взять скажем этот http://rsdn.org/forum/philosophy/6698765.1
Автор: alex_public
Дата: 14.02.17
примерчик, то с концептами он станет выглядеть как-нибудь так:
template<typename T> concept bool MyNum=requires(T a, T b) { {a+b}->T; {a/b}->T; };
//..
list<double> v={1.0, 2.0, 3.0}; //список
set<int> s={1, 2, 3, 3}; //множество
auto f=[](const MyNum& s, const MyNum& x) {return (s+x)/2;}; //MMA
cout<<accumulate(v.cbegin(), v.cend(), 0.0, f)<<' '<<accumulate(s.cbegin(), s.cend(), 0, f)<<endl; //выводит 2.125 2

что на мой взгляд не добавляет ни красоты, ни безопасности. Единственная разница будет в сообщениях об ошибках. Если мы попробуем вместо коллекции чисел использовать в таком коде коллекцию строк, то в первом варианте получим такое сообщение об ошибке:
error: no match for 'operator/' (operand types are 'std::__cxx11::basic_string<char>' and 'int')
  auto f=[](const auto& s, const auto& x) {return (s+x)/2;}; //MMA
                                                  ~~~~~^~

а во втором варианте такое:
error: no matching function for call to 'main()::<lambda(const auto:9&, const auto:9&)>::operator()(const std::__cxx11::basic_string<char>&, const std::__cxx11::basic_string<char>&) const'
note: candidate: main()::<lambda(const auto:9&, const auto:9&)> [with auto:9 = std::__cxx11::basic_string<char>]
note:   constraints not satisfied
note: within 'template<class T> concept const bool MyNum<T> [with T = std::__cxx11::basic_string<char>]'
 template<typename T> concept bool MyNum=requires(T a, T b) { {a+b}->T; {a/b}->T; };
                                   ^~~~~
note:     with 'std::__cxx11::basic_string<char> a'
note:     with 'std::__cxx11::basic_string<char> b'
note: the required expression '(a / b)' would be ill-formed

И я бы не сказал, что второй вариант мне нравится сильно больше первого. )))
Отредактировано 17.02.2017 5:40 alex_public . Предыдущая версия . Еще …
Отредактировано 17.02.2017 5:39 alex_public . Предыдущая версия .
Re[41]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 06:34
Оценка:
Здравствуйте, VladD2, Вы писали:

N>>"сэмулировать" можно все на свете, только здесь ничего "эмулировать" не нужно. Красивое решение уже есть.

VD>Далеко не все. Не говори глупости. Например, С++-ное решение нельзя поместить в обобщенный указатель на функцию и вызвать для разных типов используя приведение типов. А Питоне же с этим проблем не возникнет.

Ну вообще то в C++ это тоже элементарно делается, только уже чуть по другому:
typedef any<ostreamable<>, const _self&> printable;
function<void(printable)> current_printer;
void Test() {current_printer(1); current_printer(1.0); current_printer("1"s);}
//...
current_printer=[](printable x) {cout<<x<<endl;};
Test();
current_printer=[](printable x) {cout<<"\t"<<x<<endl;};
Test();

Это кстати весьма близко к внутреннему устройству Хаскеля.

Кстати, на C# и Java подобное тоже конечно же элементарно записывается, но будет работать в динамике (а тут всё статично) через тормозную рефлексию.
Re[41]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 06:45
Оценка:
Здравствуйте, VladD2, Вы писали:

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


Хыхы, я тут с тобой согласен. Но хочу заметить, что такие маньяки всё же имеются. Причём это не какие-то извращенцы из мира IT, а вполне себе солидные люди — CERN. Просто у них там достаточно специфические задачи (точнее требуемая для них вычислительная мощность), так что их совершенно не смущает идея скриптов (у них там полноценный REPL создан) на C++. Вот https://root.cern.ch можешь полюбоваться.

VD>В конкретных случаях всегда можно придумать более интересные решения. Вот для тех же матриц можно придумать вот такое:

VD>http://omega.sp.susu.ru/books/conference/PaVT2011/full/117.pdf
VD>Можно такое сделать на С++ или Питоне?

Хм, ну вообще то в gcc уже давно добавили поддержку намного более высокоуровневой абстракции для реализации подобных вычислений. Смотри OpenACC (идеологический наследник OpenMP, но уже для GPU, а не CPU). Это если говорить именно на уровне языка, а не каких-то специализированных библиотек.
Re[34]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 07:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Плюс такие люди тормоза того же дотнета всегда списывают на GC, что по сути — миф. Более того они видят недостатки GC там где их нет. А о реальных недостатках или не догадываются, или не берут их в расчет. Так основная проблема GC вовсе не мифические паузы при сборке мусора, а разные мемори-барьеры, требуемые для инкрементального сбора мусора.


Интересно а кто тут писал что тормоза .net'а от GC? ) Я что-то не помню таких. Проблемы классических реализаций GC следующие: stop-the-world и недетерминированное время сборки. И указанные вещи являются проблемой не для быстродействия (грубо говоря числодробилке это не принципиально), а для реалтаймовых и Low Latency задач.

VD>Ну, а 90% тормозов дотнета связаны даже не с этим, просто с посредственной кодогенерацией и в отсутствие возможностей управлять процессом кодонерерации для всех этих мемори-барьеров.


Нет, не верно. Если ты перенесёшь .net как он есть на кодогенерацию с помощью LLVM, то вряд ли увидишь какое-то существенное увеличение быстродействия. Основные тормоза .net связаны с излишней косвенностью (размещение данных не на стеке, ссылочные типы и т.п.) и рантаймовой рефлексией. Именно эти два ключевых факта убивают возможностью применения огромного числа эффективных оптимизаций.

Кстати, в .net native рефлексия считай убита. И есть разговоры об инструментах размещения любых данных на стеке. Вот если к такому решению приделать нормальный кодогенератор (что кстати в MS и собираются сделать, взяв свой бэкенд от C++), то уже можно получить более менее приемлемое быстродействие. Только это уже будет решение имеющее мало общего с современным большим .net'ом. )))

VD>Далее проблемы пауз при работе GC (которые во многом надуманы) опять же связаны с тем, что GC глобальный. Если ввести в язык возможность использования множества маленьких GC и дать программисту явно указывать какие объекты в них должны попадать и когда лучше собирать мусор в каком из них, то эффективность GC может оказаться сильно выше, чем ручного управления памятью. А вот затраты сил и времени на такие аннотации могут быть куда меньше чем на ручное управление (я говорю о дестркуторах и прочих смартпоинтерах). И главное, в такой модели будет контроль и безопасность такой же как в языках с глобальным GC.


Вообще то как раз то, что ты описал — это и есть ручное управление. В гораздо большей степени, чем в C++.
Re[40]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 07:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Уверен, что и Питоне тоже самое. Ты можешь даже не знать, что некоторая фича сделана через МП, но ты можешь ее использовать.


Нет, в Питоне вообще не особо развиты средства для работы с МП. Метаклассы, декораторы, больше даже и не припомню с ходу что ещё может быть использовано для МП (традиционную для всех скриптовых языков функцию eval мы естественно не упоминаем — это "плохое" МП). Так что в большинстве обычных библиотек можно вообще не встретить ни одного применения МП.

VD>Если получится хорошо бы вообще сделать шаблоны как расширение дженериков. Типа дописываем к описанию дженерик-типа ключевое слово template и получаем недостающее поведение:

VD>
VD>template class A<T>
VD>  where T: _+_ // T поддерживает бинарный оператор сложения
VD>{
VD>  public Sum(a : T, b : T) : T
VD>  {
VD>    a + b
VD>  }
VD>}
VD>...
VD>def x = A().Sum(40, 2);              // OK x == 42
VD>def x = A().Sum(36, 0.6);            // OK x == 36.6
VD>def x = A().Sum("Hello ", "World!"); // OK x == "Hello World!"
VD>def x = A().Sum("Hello ", 42);       // Error: нет неявного приведения между числом и строкой
VD>def x = A().Sum(A<int>(), A<int>()); // Error: A<T> не поддерживает оператор "+"
VD>


Выглядит не плохо. Правда в таком виде оно всё равно будет уступать по лаконичности и Питону (где Т вообще не надо) и Хаскелю (где T не указывается программистом (но существует) потому что ограничения на него выводятся компилятором самостоятельно по коду функции). Но лично мне подходит.
Re[43]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 08:09
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кому нужны расчеты на матрицах написанные на Питоне?


Безотносительно к основной дискуссии не могу не заметить, что именно это является крайне популярным явлением в научном мире. Значительная часть вычислений проходит на Питоне, потому что он весьма удобен как язык (особенно для не айтишников) и имеет крайне эффективные библиотеки (написанные естественно на C/C++) в этих областях. Т.е. набор Python+NumPy+SciPy+SymPy+Matplotlib — это сейчас во многих местах практически стандарт де-факто научного рабочего места. )))
Re[33]: Портирование нитры.
От: DarkEld3r  
Дата: 17.02.17 11:22
Оценка: :)
Здравствуйте, WolfHound, Вы писали:

WH>Ускорять разработку за счёт большого количества низкоквалифицированных программистов идиотизм.

Ага, точно так же как писать на динамических языках. Погоди ка...

Ну а если серьёзно, то (практически?) в любом масштабном проекте найдутся участки как более сложные, так и более простые и рутинные. Не думаю, что даже самый чудесный ДСЛ сможет ситуацию принципиально поменять: кто-то будет писать и поддерживать ДСЛ, кто-то использовать. Собственно, Go можно считать таким специфическим языком (пусть и "общего назначения") для определённых целей.
Re[34]: Портирование нитры.
От: WolfHound  
Дата: 17.02.17 13:44
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

WH>>Ускорять разработку за счёт большого количества низкоквалифицированных программистов идиотизм.

DE>Ага, точно так же как писать на динамических языках. Погоди ка...
Именно. Никто так и не показал задачу на которых они дают преимущество.

DE>Ну а если серьёзно, то (практически?) в любом масштабном проекте найдутся участки как более сложные, так и более простые и рутинные. Не думаю, что даже самый чудесный ДСЛ сможет ситуацию принципиально поменять: кто-то будет писать и поддерживать ДСЛ, кто-то использовать. Собственно, Go можно считать таким специфическим языком (пусть и "общего назначения") для определённых целей.

И для какой же задачи это образцовое убожество является ДСЛем?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[34]: Портирование нитры.
От: DarkEld3r  
Дата: 17.02.17 14:27
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я с тобой полностью согласен, но на практике это не так. На практике люди освоившие молоток С++ используют его для решения всех проблем. В том числе и тех, что лучше решать на языке с GC.


Не спорю, но опять же, это не только с С++ работает. JavaScript во всякие ардуины по той же причине тащат.

VD> А вот затраты сил и времени на такие аннотации могут быть куда меньше чем на ручное управление (я говорю о дестркуторах и прочих смартпоинтерах).


И тут спорить не буду, но справедливости ради, затраты на смартпоинтеры не такие большие, как кажется. Если бы в С++ ещё и везде именно они вместо обычных указателей использовались, то было бы ещё проще. Плюс в ряде моментов когда придётся к таким аннотациям прибегать, то в C++ объекты создадутся тупо на стеке.
Проблемы возникают как раз в сложных случаях когда начинают городить shared_ptr и да, тут легко можно наделать такого, что оно будет тормозить хуже любого GC.

Но вообще пример с аннотациями выглядит интересно.

VD>Скорее это говорит о том, что нет особого смысла отключать GC. Надо тебе жить без него — используй объекты размещаемые на стеке.


Не согласен, особенно если учитывать то, что сейчас они сами говорят о важности поддержки нормальной работы без GC. Иначе это отключение чисто для галочки существует, если сразу приходится делать кучу вещей вручную.
Re[34]: Портирование нитры.
От: DarkEld3r  
Дата: 17.02.17 15:03
Оценка:
Здравствуйте, alex_public, Вы писали:

_> Так вот из нативных (т.е. не требующих отдельной установки специального рантайма и позволяющих эффективно работать с системным API на любой платформе) языков у нас к мейнстриму сейчас относятся наверное всего четыре: C, C++, Go, Swift. Но Swift вычёркиваем сразу, если мы не хотим ограничиться мирком Apple. Из оставшихся: Go — имеет слабую кроссплатформенность и быстродействие, C — неудобный и небезопасный язык. И оба они отстают от C++ по набору библиотек и возможностям языка. Так что выбор как бы очевиден.


Ты же понимаешь, что вводишь ряд дополнительных ограничений? "Необходимость установки специального рантайма" далеко не всем мешает. Если что, пишу я именно на С++ и совсем от этого не страдаю, но прекрасно понимаю почему могут выбирать C#, джаву и т.д.
"Вменяемые команды" — это, опять же, упор на эмоции.

Опять же, не имеет смысла сравнивать в глобальном плане Go и С++ — вполне себе найдутся задачи, где первый подойдёт и нужные библиотеки будут в наличии.

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

_>Не надо там ничего отключать. Достаточно его просто не использовать и всё.


Это никак не отменяет сказанного мной. "Не использование GC ведёт к невозможности использовать многое из стандартной библиотеки". Стало лучше?

И "просто не использовать" не получится — это не какой-нибудь shared_ptr, который надо использовать явно. Приходится именно идти на дополнительные ухищрения, скажем, выделять память не через new и т.д.
Re[35]: Портирование нитры.
От: DarkEld3r  
Дата: 17.02.17 15:15
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Именно. Никто так и не показал задачу на которых они дают преимущество.


И тем не менее, их продолжают широко использовать.
Если что, я не агитирую за динамику.

WH>И для какой же задачи это образцовое убожество является ДСЛем?


Написание сравнительно эффективного параллельного кода без утечек и расстрелов памяти после прочтения коротенького мануала.
Re[35]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.02.17 15:18
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>И тут спорить не буду, но справедливости ради, затраты на смартпоинтеры не такие большие, как кажется.


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

DE>Если бы в С++ ещё и везде именно они вместо обычных указателей использовались, то было бы ещё проще.


Ну, да. Если лихие джигиты начинают орудовать голыми указателями (void** наше все), то пиши пропало.

DE>Проблемы возникают как раз в сложных случаях когда начинают городить shared_ptr и да, тут легко можно наделать такого, что оно будет тормозить хуже любого GC.


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

DE>Но вообще пример с аннотациями выглядит интересно.


Ага. Там конечно еще все продумывать надо. Плюс есть ряд других кейсов, которые тоже надо поддерживать. Например, паттерн с формированием кучи и последующим переводом ее объектов неизменяемое состояние.

Но если это продумать и реализовать, можно не только производительность поднять, но и добавить в программу контроля. ЖЦ ведь, позволяет не заморачиваться с управлением памятью, но понять при этом жив объект или нет не так просто. Приходится полагаться на предположения. А если есть четкое разделение на пулы, то можно ввести и четкие инварианты, которые явно проверять в нужное время.

VD>>Скорее это говорит о том, что нет особого смысла отключать GC. Надо тебе жить без него — используй объекты размещаемые на стеке.


DE>Не согласен, особенно если учитывать то, что сейчас они сами говорят о важности поддержки нормальной работы без GC.


Есть огромная разница в возможности жить без ЖЦ и в необходимости его отключать. Ведь, чтобы жить без ЖЦ достаточно не занимать в нем памяти.

DE>Иначе это отключение чисто для галочки существует, если сразу приходится делать кучу вещей вручную.


А оно и не нужно в общем-то. Нужно в критичных местах иметь возможность перйти на ручное управление. Плюс в местах хорошо ложащихся на стек, тоже можно обоийтись без ЖЦ-объектов. А когда объем управляемых ЖЦ объектов не велик, то и ЖЦ летает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: Портирование нитры.
От: DarkEld3r  
Дата: 17.02.17 15:30
Оценка:
Здравствуйте, VladD2, Вы писали:

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


Так я тоже об интеллектуальных затратах говорю. В простых/средних случаях всё легко: написать make_unique не сложнее чем new. В сложных случаях, конечно, всё непросто, но и с GC можно напортачить и оставить висеть в памяти ненужные объекты, хоть и сложнее. То есть, думать всё равно приходится.
Re[37]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.02.17 15:38
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Так я тоже об интеллектуальных затратах говорю. В простых/средних случаях всё легко: написать make_unique не сложнее чем new. В сложных случаях, конечно, всё непросто, но и с GC можно напортачить и оставить висеть в памяти ненужные объекты, хоть и сложнее. То есть, думать всё равно приходится.


С ЖЦ напортачить это еще надо умудриться. Если только какие-нибудь события (не явно создающие обратные ссылки) использовать. Или сложить все в статическую переменную.

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

А отдельные кучи, как раз и позволили бы контролировать такие вещи как подвисшие ссылки и прочие логические ошибки.

Но все же когда я пишу код на языке с ЖЦ, я вообще не заморачиваюсь на тему управления памятью. Я целиком занят задачей. А вот когда писал на плюсах, то помню как продумывал идеологию владения для сложных графов объектов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[42]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.02.17 15:42
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Хм, ну вообще то в gcc уже давно добавили поддержку намного более высокоуровневой абстракции для реализации подобных вычислений.


Дык это же в компилятор добавили. Ты прочти внимательно эту статью и поймешь, что там речь идет о том, что ты сам можешь расширить компилятор нужным образом. Не ждать милости от природы, а взять ... Короче, ты понял.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.02.17 16:24
Оценка: 26 (2)
Здравствуйте, alex_public, Вы писали:

_>Проблемы классических реализаций GC следующие: stop-the-world и недетерминированное время сборки. И указанные вещи являются проблемой не для быстродействия (грубо говоря числодробилке это не принципиально), а для реалтаймовых и Low Latency задач.


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

Основное время собираются эфемерные поколения. Живых объектов там мало. Сборка проходит за микросекунды. Задержку в миллисекунды ты все равно не заметишь.

В итоге все упирается в алгоритмы. Довольно по фигу ЖЦ у тебя или дестркуторы, если ты пытаешься обсчитать объем данных, который нельзя обсчитать за приемлемое время.

VD>>Ну, а 90% тормозов дотнета связаны даже не с этим, просто с посредственной кодогенерацией и в отсутствие возможностей управлять процессом кодонерерации для всех этих мемори-барьеров.


_>Нет, не верно.


Ты производил исследования? С чего такая уверенность? Ты хотя бы в дизассемблере код смотрел?

_>Если ты перенесёшь .net как он есть на кодогенерацию с помощью LLVM, то вряд ли увидишь какое-то существенное увеличение быстродействия.


Именно, что увидишь. Только надо еще от мебори-барьеров избавиться и прочих по натыканных по коду проверок.

_>Основные тормоза .net связаны с излишней косвенностью (размещение данных не на стеке, ссылочные типы и т.п.)


Ну, вот откуда ты эту ерись берешь? Какой еще косвенности? Чем указатель в плюсах отличается от указателя в ЖЦ-куче?

_>и рантаймовой рефлексией.


Слушай, ну ты такую чушь несешь, что это даже обсуждать несерьезно. Рефлексия не поднимается пока ты ее явно не позавешь. ЖЦ живет за счет знания универсального устройства объектов. Ему рефлексия вообще не нужна.

Сказал бы хотя бы о джите. Но рефлексия? Она тупо отирает память в борке. Но не более того.

_>Именно эти два ключевых факта убивают возможностью применения огромного числа эффективных оптимизаций.


Ты живешь в мире фантазий. Просто задай себе вопрос. Откуда в твоей голове взялись эти представления? Ты досконально изучал вопрос? Ты сидел в дизасемблере? Ты читал блоги разработчиков ЖЦ?

Вот я все это делал. И у меня нет сомнений, что ты заблуждаешься. Природа тормозов (которые ты тоже скорее всего преувеличиваешь) кроется в следующих факторах:
1. Для поддержки низкой латентности ЖЦ JIT и ngen забивают код кучей перехватчиков (мемори-барьеров) и прочего непроизводительного года.
2. Генератор кода в дотнете далек от идеала. Многие предположения, что делаются в плюсах не делаются в дотнете из соображений безопасности.
3. Для работы ЖЦ стэк должен иметь определенный формат. Опять же оптимизации его могут сломать.
4. Дотнет делает кучу рантайм-проверок. Даже при вызове метода он всегда делает проверку на ноль, чтобы сгенерировать осмысленное, легко отлаживаемое исключение, а не AV. Далее идут проверки выхода за пределы массива. Оптимизации для их делаются только для очень простеньких паттернов перебора.
5. В дотнете сделан овердизайн при обработке массивов. Они допускают ко/контр-вариантность. Это требует новых проверок в рантайме. Есть сопособы обойти это, но мало кто этим заморачивается.
6. Объект в дотнете имеет некоторый оверхэд. В С++ он тоже есть, но дотнетный объект все же по пушистее. В общем-то это копейки, но свою толику вносит.
7. Вот интерфейсы в дотнете действительно добавляют излишнюю косвенность. Но можно их не использовать, да и "тормоза" из-за этого не видно и в микроскоп. Новые процессоры (а где теперь взять старые?) сильно сглаживают этот недостаток за счет умного предсказания переходов
8. Была проблема с делегатами, но ее устранили. Сейчас лямбды делегаты быстрее интерфейсов.
9. ФП в Шарпе (и Немерле) приводит к созданию объектов в куче. Это можно было бы оптимизировать для множества случаев, но это не сделано.
10. Компилятор (JIT) халтурно относится к выравниванию. Иногда перестановка операторов местами дает двукратное изменение времени выполнения.
11. Дженерики в дотнете объектны. Это иногда (хотя далеко и не всегда) приводит к оверхэду. Есть мутные косяки с дженериками в статических типах. Особенно серьезные косяки с дженерик-интерфейсами. Тут есть ряд случаев, которые просто таки втыкают. В Немерле их, кстати, меньше, так как он использует сбоственные функциональные объекты и умудрился не повторить кое какие косяки Шарпа.
12. Дотнет часто манипулирует данными в хипе, хотя их можно было бы разместить в стеке. Тут бы помог эскейп-анализ и прочие оптимизации, но МС умудрился их не сделать за 15 лет.

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

_>Кстати, в .net native рефлексия считай убита.


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

_>И есть разговоры об инструментах размещения любых данных на стеке.


Рассуждения есть, а размещения скорее всего нет.

Для этого нужен анализ. Он осложняется тем, что данные запаковываются в объекты и т.п.

По жизни у Нэйтива менее навороченный ЖЦ. Это создает проблемы с теми самыми паузами (хотя опять же не критично), но уменьшает объем поддерживающего кода.

И если ты думаешь, что нэйтив уж так сильно быстрее, то ты ошибаться. Там дашь на дашь.

Вот чего реально нет в Нэйтиве — это ковариантности для массивов. И вот это позволяет, в ряде случаев, работать с массивами существенно быстрее.

_>Вот если к такому решению приделать нормальный кодогенератор (что кстати в MS и собираются сделать, взяв свой бэкенд от C++), то уже можно получить более менее приемлемое быстродействие. Только это уже будет решение имеющее мало общего с современным большим .net'ом. )))


Команда С++ уже писала кодогенератор для дотнета. Получилось не очень. Там нужны оптимизации другого рода. А на них МС боится замахнуться. Это большой объем работ. При этом чем занимается команда ЦЛР-а — не ясно. 15 жуют сопли.

_>Вообще то как раз то, что ты описал — это и есть ручное управление.


Нет. Ручно, это когда ты решаешь когда объект должен умереть. А когда ты решаешь, где объект живет — это не немного другое. Это, конечно, тоже требует напряжения, но совсем не того, что при продумывании времени жизни каждой ссылки.

_>В гораздо большей степени, чем в C++.


Как ты умудряешься делать такие выводы?

Вот писал я на плюсах. Для ускорения кода вместо обычного хипа использовал пул. Потом грохал пул залпом. Единственная проблема, которая при этом возникала — это то, что грохнув пул я не был на 100% уверен, что где-то не остался указатель в этот пул, который потом может грохнуть всю программу. А тут у меня тоже самое, но с полным котролем. Ни один указатель не подвиснет. Я могу или выявить такие указатели и сгенерировать исключение, или просто пометить их нулом.

В чем тут сложность?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: Портирование нитры.
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.02.17 16:57
Оценка:
Здравствуйте, VladD2, Вы писали:

можно получить более менее приемлемое быстродействие. Только это уже будет решение имеющее мало общего с современным большим .net'ом. )))

VD>Команда С++ уже писала кодогенератор для дотнета. Получилось не очень. Там нужны оптимизации другого рода. А на них МС боится замахнуться. Это большой объем работ. При этом чем занимается команда ЦЛР-а — не ясно. 15 жуют сопли.


Сейчас 2 Силара второй Core c .Net Native
и солнце б утром не вставало, когда бы не было меня
Re[36]: Портирование нитры.
От: WolfHound  
Дата: 17.02.17 17:44
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>И тем не менее, их продолжают широко использовать.

DE>Если что, я не агитирую за динамику.
Миллионы мух не могут заблуждаться.

DE>Написание сравнительно эффективного параллельного кода без утечек и расстрелов памяти после прочтения коротенького мануала.

Ну это просто не правда. Ничто не мешает там накосячить с многопоточностью.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[35]: Портирование нитры.
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.02.17 18:06
Оценка:
Здравствуйте, alex_public, Вы писали:


_>Кстати, в .net native рефлексия считай убита. И есть разговоры об инструментах размещения любых данных на стеке. Вот если к такому решению приделать нормальный кодогенератор (что кстати в MS и собираются сделать, взяв свой бэкенд от C++), то уже можно получить более менее приемлемое быстродействие. Только это уже будет решение имеющее мало общего с современным большим .net'ом. )))

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

Большому .Net в большинстве задач и не нужно быстродействие. Нужны удобство и гибкость.
На самом деле .Net это компромисс между скоростью выполнения и удобством и скоростью написания кода.
Заметь C++ тоже совмещают скорость и динамику в виде Питона.

Там где нужна скорость уже наплевать на удобство и гибкость, где начинают оптимизировать везде где это возможно.
Но при этом C# как язык и IDE очень мощный. И в большинстве случаев рефлексия не нужна, а создание объектов на стеке тоже не слишком утомительно (в предварительных примерах).

Но в Net Native там даже не скорость нужна, а энергосбережение для мобильных устройств и обфускация для десктопного кода
и солнце б утром не вставало, когда бы не было меня
Отредактировано 17.02.2017 18:08 Serginio1 . Предыдущая версия .
Re[35]: Портирование нитры.
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.02.17 19:21
Оценка:
Здравствуйте, WolfHound, Вы писали:

DE>>Ну а если серьёзно, то (практически?) в любом масштабном проекте найдутся участки как более сложные, так и более простые и рутинные. Не думаю, что даже самый чудесный ДСЛ сможет ситуацию принципиально поменять: кто-то будет писать и поддерживать ДСЛ, кто-то использовать. Собственно, Go можно считать таким специфическим языком (пусть и "общего назначения") для определённых целей.

WH>И для какой же задачи это образцовое убожество является ДСЛем?

Для любых околосетевых задач, особенно если в команде относительно неопытный народ. Я вот сейчас прям не нарадуюсь просто, что у нас проект на смеси Go (где это возможно) и C++ (где Go использовать невозможно), так как это мне позволит переключиться при необходимости (которая ощутимо намечается) с Go части на C++ часть с достаточно легкой заменой куда как менее опытным программистом. Будь весь проект на C++, такого фокуса провернуть было бы нельзя.
Re[31]: Портирование нитры.
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.02.17 19:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Однако С++ все равно только могила исправит. И в принципе замена ему нужна.


Ну не знаю даже... 14 – прекрасен, 17 – вообще конфетка, а 20... надеюсь они сделают то, что обещают, хотя, на данный момент, у меня есть в языке почти всё, что я хочу. Не совсем всё есть в библиотеках – хотелось бы хоть один стандартный, кроссплатформенный пул потоков и какую-то систему CSP, не менее кроссплатформенную и не менее стандартную (ну хотя бы в BOOST).
Re[35]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 21:00
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

_>> Так вот из нативных (т.е. не требующих отдельной установки специального рантайма и позволяющих эффективно работать с системным API на любой платформе) языков у нас к мейнстриму сейчас относятся наверное всего четыре: C, C++, Go, Swift. Но Swift вычёркиваем сразу, если мы не хотим ограничиться мирком Apple. Из оставшихся: Go — имеет слабую кроссплатформенность и быстродействие, C — неудобный и небезопасный язык. И оба они отстают от C++ по набору библиотек и возможностям языка. Так что выбор как бы очевиден.

DE>Ты же понимаешь, что вводишь ряд дополнительных ограничений? "Необходимость установки специального рантайма" далеко не всем мешает. Если что, пишу я именно на С++ и совсем от этого не страдаю, но прекрасно понимаю почему могут выбирать C#, джаву и т.д.

Ну ключевое тут как раз про системное API. ) На всяческие JNI и P/Invoke без слёз не взглянешь. Не говоря уже о том, что даже запустив это, непонятно что делать с частью данных (т.к. системное API обычно основано на указателях).

DE>"Вменяемые команды" — это, опять же, упор на эмоции.


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

DE>Опять же, не имеет смысла сравнивать в глобальном плане Go и С++ — вполне себе найдутся задачи, где первый подойдёт и нужные библиотеки будут в наличии.

DE>Ну и Swift работает даже на виндовс. Не то чтобы призываю использовать и понятное дело, что есть нюансы, но это совсем не категоричное "ограничиться мирком Apple".

Ну так все четыре языка в мэйнстриме, так что понятно что находятся орды работающих на них. ))) Тут я уже высказал свою оценку, почему из этих четырёх я выбираю C++.

_>>Не надо там ничего отключать. Достаточно его просто не использовать и всё.

DE>Это никак не отменяет сказанного мной. "Не использование GC ведёт к невозможности использовать многое из стандартной библиотеки". Стало лучше?
DE>И "просто не использовать" не получится — это не какой-нибудь shared_ptr, который надо использовать явно. Приходится именно идти на дополнительные ухищрения, скажем, выделять память не через new и т.д.

Я говорю скорее о возможности написать "scope c=new C();", а так же указать "@nogc" у любого своего потока. )

Ну а по поводу выделения памяти... Кроме стека и кучи имеются ещё статические объекты и память выделенная ОС. Последнее это не в смысле использования VirtualAlloc, а именно что-то возникающее косвенно, сопутствующее основной задаче (например те же отображаемые в память файлы). Кстати, когда я смотрю на реализацию отображаемых файлов в библиотеке .Net, то прямо плакать хочется.
Re[37]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 21:15
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

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

DE>Так я тоже об интеллектуальных затратах говорю. В простых/средних случаях всё легко: написать make_unique не сложнее чем new. В сложных случаях, конечно, всё непросто, но и с GC можно напортачить и оставить висеть в памяти ненужные объекты, хоть и сложнее. То есть, думать всё равно приходится.

Тут ключевой нюанс в том, что при правильном портирование такого кода на C#
var x=new X();

в код на C++ будут возможны три разных варианта с разной вероятностью:
X x; // ~99% случаев

auto x=make_unique<X>(); // ~1% случаев

auto x=make_shared<X>(); // ~0,1% случаев (например в моём текущем проекте не понадобилось ни разу)


Т.е. вроде бы действительно кажется, что задача сложнее (всё же 3 варианта вместо одного), но с учётом вероятностей картина резко меняется. А если учесть ещё и тот факт, что первый вариант из C++ не только самый короткий в написание, но ещё и приводит к увеличению быстродействия в разы, то...
Re[43]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 21:18
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Хм, ну вообще то в gcc уже давно добавили поддержку намного более высокоуровневой абстракции для реализации подобных вычислений.

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

Так я как бы только за такие возможности. Собственно поэтому я и хотел заполучить себе C++ с нормальными макросами и т.п. ))) Просто вот конкретно именно этот пример уже реализован, причём крупными консорциумами и на высоком уровне абстракции. )
Re[36]: Портирование нитры.
От: alex_public  
Дата: 17.02.17 23:49
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Проблемы классических реализаций GC следующие: stop-the-world и недетерминированное время сборки. И указанные вещи являются проблемой не для быстродействия (грубо говоря числодробилке это не принципиально), а для реалтаймовых и Low Latency задач.

VD>Надуманные это проблемы для 99% случаев применения. Ты сам то хард-реалтайм системы пишешь? Вот поверь, что у меня ни разу не было проблем с латентностью. Вот скорость вычисления хотелось иногда по выше иметь, а с латентностью проблем нет.

Ну вообще то пишу — для МК. ) Причём сейчас это всё крайне популярное направление, которым уже и многие школьники балуются (Ардуина захватывает мир). Я конечно такой попсой (ардуинками) не страдаю, у меня серьёзные игрушки и кстати у меня там полноценный C++14. )))

Но проблем у java и .net в этой области действительно нет, просто потому что их самих тут. ))) Вот в области LL какие-то попытки выживания встречаются (в основном на базе Azul Zing).

VD>Основное время собираются эфемерные поколения. Живых объектов там мало. Сборка проходит за микросекунды. Задержку в миллисекунды ты все равно не заметишь.

VD>В итоге все упирается в алгоритмы. Довольно по фигу ЖЦ у тебя или дестркуторы, если ты пытаешься обсчитать объем данных, который нельзя обсчитать за приемлемое время.

Хыхы, я конечно сам не тестировал, но по слухам от знакомых при серверном применение java/.net встречаются аж секундные задержки, когда GC надо очищать по несколько гигов.

VD>>>Ну, а 90% тормозов дотнета связаны даже не с этим, просто с посредственной кодогенерацией и в отсутствие возможностей управлять процессом кодонерерации для всех этих мемори-барьеров.

_>>Нет, не верно.
VD>Ты производил исследования? С чего такая уверенность? Ты хотя бы в дизассемблере код смотрел?

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

Так вот по поводу общих принципов можешь глянуть например на эти ссылки:
https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html — борьба с врождёнными недостатками JVM (у .Net они такие же)
https://databricks.com/blog/2016/05/23/apache-spark-as-a-compiler-joining-a-billion-rows-per-second-on-a-laptop.html — борьба с неверными архитектурными подходами (процветающими в мире java/jvm, т.к. почти никто не в курсе происходящего на низком уровне).

Ну а в качестве теста можешь глянуть например сюда: http://xoofx.com/blog/2015/10/08/stackalloc-for-class-with-roslyn-and-coreclr/ — ускорение .Net кода на порядок (никакой LLVM и т.п. такого не даст) с помощью банального использования стековых объектов.

_>>Если ты перенесёшь .net как он есть на кодогенерацию с помощью LLVM, то вряд ли увидишь какое-то существенное увеличение быстродействия.

VD>Именно, что увидишь. Только надо еще от мебори-барьеров избавиться и прочих по натыканных по коду проверок.

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

_>>Основные тормоза .net связаны с излишней косвенностью (размещение данных не на стеке, ссылочные типы и т.п.)

VD>Ну, вот откуда ты эту ерись берешь? Какой еще косвенности? Чем указатель в плюсах отличается от указателя в ЖЦ-куче?

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

Далее, косвенность — это когда нам требуется для доступа к непосредственно данным сделать не одну выгрузку из памяти в регистр (процессор то работает только с ними), а несколько последовательных. Чем больше таких операций, тем хуже. Причём главное не в лишнем коде (хотя и это тоже влияет), а в нарушение работы кэша и невозможность использования SIMD. Хотя в кэше тоже есть свой предсказатель, но он мало что реально может и плохо справляется даже с первым уровнем косвенности, а уж следующие точно убивают всю эффективность. Это кстати легко измерить даже в том же C++, если сравнить проход по vector<X> и по vector<X*> (массив объектов .net выглядит именно так) — разница в разы.

_>>и рантаймовой рефлексией.

VD>Слушай, ну ты такую чушь несешь, что это даже обсуждать несерьезно. Рефлексия не поднимается пока ты ее явно не позавешь. ЖЦ живет за счет знания универсального устройства объектов. Ему рефлексия вообще не нужна.
VD>Сказал бы хотя бы о джите. Но рефлексия? Она тупо отирает память в борке. Но не более того.

Как мило, прямо .net — мир для эльфов. ))) Только реальность совсем другая... Сейчас кстати узнаем насколько ты с ней знаком. Если ты действительно в курсе внутреннее работы .Net, то с ходу ответишь на такой простейший вопрос: сколько памяти выделится в процессе исполнения такого кода?
class X{
    public int x;
};
var x=new X();

И потом аналогичный вопрос для такого кода:
class X{
    public string x="hello world";
};
var x=new X();


Ну и после демонстрации указанных чисел я надеюсь на комментарии от тебя по теме:
1. как на это всё смотрит кэш процессора (я уж даже не заикаюсь про какие-то шансы на SIMD и т.п.)
2. обеспечение работы какой никчемной технологии виновато в озвученных тобой цифрах.

_>>Именно эти два ключевых факта убивают возможностью применения огромного числа эффективных оптимизаций.

VD>Ты живешь в мире фантазий. Просто задай себе вопрос. Откуда в твоей голове взялись эти представления? Ты досконально изучал вопрос? Ты сидел в дизасемблере? Ты читал блоги разработчиков ЖЦ?

Эм, а причём тут GC то? Про него не было ни слова. Ещё раз поясняю, все основные тормоза .Net можно элементарно повторить и на C++ (без всяких GC), если программировать не правильно.

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

VD>1. Для поддержки низкой латентности ЖЦ JIT и ngen забивают код кучей перехватчиков (мемори-барьеров) и прочего непроизводительного года.
VD>2. Генератор кода в дотнете далек от идеала. Многие предположения, что делаются в плюсах не делаются в дотнете из соображений безопасности.
VD>3. Для работы ЖЦ стэк должен иметь определенный формат. Опять же оптимизации его могут сломать.
VD>4. Дотнет делает кучу рантайм-проверок. Даже при вызове метода он всегда делает проверку на ноль, чтобы сгенерировать осмысленное, легко отлаживаемое исключение, а не AV. Далее идут проверки выхода за пределы массива. Оптимизации для их делаются только для очень простеньких паттернов перебора.
VD>5. В дотнете сделан овердизайн при обработке массивов. Они допускают ко/контр-вариантность. Это требует новых проверок в рантайме. Есть сопособы обойти это, но мало кто этим заморачивается.
VD>6. Объект в дотнете имеет некоторый оверхэд. В С++ он тоже есть, но дотнетный объект все же по пушистее. В общем-то это копейки, но свою толику вносит.
VD>7. Вот интерфейсы в дотнете действительно добавляют излишнюю косвенность. Но можно их не использовать, да и "тормоза" из-за этого не видно и в микроскоп. Новые процессоры (а где теперь взять старые?) сильно сглаживают этот недостаток за счет умного предсказания переходов
VD>8. Была проблема с делегатами, но ее устранили. Сейчас лямбды делегаты быстрее интерфейсов.
VD>9. ФП в Шарпе (и Немерле) приводит к созданию объектов в куче. Это можно было бы оптимизировать для множества случаев, но это не сделано.
VD>10. Компилятор (JIT) халтурно относится к выравниванию. Иногда перестановка операторов местами дает двукратное изменение времени выполнения.
VD>11. Дженерики в дотнете объектны. Это иногда (хотя далеко и не всегда) приводит к оверхэду. Есть мутные косяки с дженериками в статических типах. Особенно серьезные косяки с дженерик-интерфейсами. Тут есть ряд случаев, которые просто таки втыкают. В Немерле их, кстати, меньше, так как он использует сбоственные функциональные объекты и умудрился не повторить кое какие косяки Шарпа.
VD>12. Дотнет часто манипулирует данными в хипе, хотя их можно было бы разместить в стеке. Тут бы помог эскейп-анализ и прочие оптимизации, но МС умудрился их не сделать за 15 лет.
VD>Как видишь это совсем не то, что ты себе представлял.

Твои пункты 6 и 12 — это как раз и есть то, что я указывал, только ты постарался не использовать правильную терминологию. И эти пункты (12-ый пожалуй самый главный) и дают главные тормоза. Кроме этого в .net конечно же есть ещё много кривизны (убогие дженерики и делегаты, лишнее проверки в массивах и т.п.), но она уже даёт меньший вклад.

_>>И есть разговоры об инструментах размещения любых данных на стеке.

VD>Рассуждения есть, а размещения скорее всего нет.
VD>Для этого нужен анализ. Он осложняется тем, что данные запаковываются в объекты и т.п.

Имеется в виду ручное размещение, отдельной командой языка. )

_>>Вот если к такому решению приделать нормальный кодогенератор (что кстати в MS и собираются сделать, взяв свой бэкенд от C++), то уже можно получить более менее приемлемое быстродействие. Только это уже будет решение имеющее мало общего с современным большим .net'ом. )))

VD>Команда С++ уже писала кодогенератор для дотнета. Получилось не очень. Там нужны оптимизации другого рода. А на них МС боится замахнуться. Это большой объем работ. При этом чем занимается команда ЦЛР-а — не ясно. 15 жуют сопли.

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

_>>Вообще то как раз то, что ты описал — это и есть ручное управление.

VD>Нет. Ручно, это когда ты решаешь когда объект должен умереть. А когда ты решаешь, где объект живет — это не немного другое. Это, конечно, тоже требует напряжения, но совсем не того, что при продумывании времени жизни каждой ссылки.

Ну так уже сложнее, чем текущая реализация работы с памятью в C++. Вот WolfHound кидал в этой темке ссылки на свою идею — там да, действительно автоматическое управление (по его словам это всё отслеживает сам компилятор). Правда я сомневаюсь в возможности реализации подобного на практике. Но если бы вдруг у него получилось, то там бы была реально автоматика и возможно весьма эффективная.

_>>В гораздо большей степени, чем в C++.

VD>Как ты умудряешься делать такие выводы?
VD>Вот писал я на плюсах. Для ускорения кода вместо обычного хипа использовал пул. Потом грохал пул залпом. Единственная проблема, которая при этом возникала — это то, что грохнув пул я не был на 100% уверен, что где-то не остался указатель в этот пул, который потом может грохнуть всю программу. А тут у меня тоже самое, но с полным котролем. Ни один указатель не подвиснет. Я могу или выявить такие указатели и сгенерировать исключение, или просто пометить их нулом.
VD>В чем тут сложность?

Подобный подход очевидно чуть сложнее в использование, чем стандартные методики C++. Однако на определённом редком классе задач они действительно позволяют достичь большего быстродействия. И соответственно в этих случаях их применение обосновано (берём Boost.Pool и вперёд).
Re[37]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.02.17 04:37
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>можно получить более менее приемлемое быстродействие. Только это уже будет решение имеющее мало общего с современным большим .net'ом. )))


Дык мы в этой теме обсуждаем портирование Немерла (точнее того расширяемого языка который мы планируем делать в этом году) под нйтив. Речь идет о создании LLVM-бэкэнда к нитре и реализации собственного рантайма.

Нас как-то не сильно волнует, что это будет совсем не .net.

S> Сейчас 2 Силара второй Core c .Net Native


И что? Там скорее доптимизации из-за переносимости.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.02.17 04:45
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>...в .net native ...


По поводу Нйтив... Вот здесь некие синтетические бенчмарки:
http://code4k.blogspot.ru/2014/06/micro-benchmarking-net-native-and-ryujit.html
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[44]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.02.17 04:49
Оценка:
Здравствуйте, novitk, Вы писали:

N>Влад, я просто перестану отвечать, если ты не изменишь тон. Я не понимаю как из контекста дискуссии можно не понять о чем я писал.


Вообще-то, из контекста как раз ни разу не ясно, что в терминологии ошибся.

ОК, буду по поаккуратнее, что и с твоей стороны видеть хотелось бы.

N>Нет не дают, для полных typeclass еще нужен implicit.


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

N>Ну допустим он есть, как мне сделать теперь:

N>val a = List(1, 2, 3)
N>val b = List(3, 4, 5)
N>a * b

А что ты под этим понимаешь?

Мы вроде говорили об арифметике в дженериках.

VD>>Я особо не сравнивал с Хаскелем.

N>но мнение имеешь...

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

VD>>Так, например, не поддерживаются неявные приведения типов, перегрузки и т.п.

N>Не нужно. В скале все это впихнули, вышло плохо.

Ну, вот на практике такой язык людям не нужен. Его удел — образцово показательный "чистый" ФП. А на практике одним ФП сыт не будешь.

VD>>А что нужно сделать, чтобы этот Data.HashTable.IO загрузить?

N>сейчас нет под рукой нужного компа(*), но что-то типа:
N>cabal update
N>cabal install hashtable

cabal: There is no package named 'hashtable'.
You may need to run 'cabal update' to get the latest list of available
packages.


ЧЯДНТ?

VD>>Ну, можно полностью пример воспроизвести (с объявлением функции до использования)?

N>import qualified Data.HashTable.IO as H
N>printKey d k = do
N> v <- H.lookup d k
N> print v
N>main = do
N> ht <- H.new
N> H.insert ht "sss" 42
N> printKey ht "sss"
N>[/haskell]
N>не проверял из за (*) ^!

Это даже не парсится:

<interactive>:12:42: error: parse error on input ‘printKey’

Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: Портирование нитры.
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 18.02.17 07:34
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Дык мы в этой теме обсуждаем портирование Немерла (точнее того расширяемого языка который мы планируем делать в этом году) под нйтив. Речь идет о создании LLVM-бэкэнда к нитре и реализации собственного рантайма.


VD>Нас как-то не сильно волнует, что это будет совсем не .net.


S>> Сейчас 2 Силара второй Core c .Net Native


VD>И что? Там скорее доптимизации из-за переносимости.


.NET Native и NGEN

Генератор образов в машинном коде (NGEN) компилирует сборки в машинный код и устанавливает их в кэш образов в машинном коде на локальном компьютере. Однако хотя NGEN, как и .NET Native, создает машинный код, NGEN имеет существенные отличия от .NET Native:
Если для конкретного метода нет образа в машинном коде, NGEN переключается на JIT-компиляцию кода. Это означает, что образы в машинном коде должны продолжать включать метаданные и IL-код для того случая, если генератору NGEN необходимо переключиться на JIT-компиляцию. В противоположность этому .NET Native только создает образы в машинном коде и не переключается на JIT-компиляцию. В результате должны сохраняться метаданные, необходимые только для некоторых сценариев отражения, сериализации и взаимодействия.
NGEN по-прежнему полагается на полную среду CLR для таких сервисов, как загрузка сборок, удаленное и локальное взаимодействие, управление памятью, сбор мусора и, при необходимости, JIT-компиляция. В .NET Native многие из этих сервисов являются либо ненужными (JIT-компиляции), либо разрешаются во время построения и включаются в сборку приложения. Остальные сервисы, наиболее важным из которых является сбор мусора, включены в гораздо более компактную, оптимизированную среду выполнения mrt100_app.dll.
Образы NGEN, как правило, хрупкие. Например, обновление или изменение зависимости обычно требует, чтобы сборки, которые его используют, также были пересозданы NGEN. Это особенно верно для системных сборок в библиотеке классов .NET Framework. В противоположность этому .NET Native позволяет обслуживать приложения независимо друг от друга.


Ссылка на файл конфигурации директив среды выполнения (rd.xml)

Сериализация и метаданные

вы будете делать тоже самое

Посмотри

Введение в IL2CPP
и солнце б утром не вставало, когда бы не было меня
Отредактировано 18.02.2017 7:44 Serginio1 . Предыдущая версия .
Re[37]: Портирование нитры.
От: DarkEld3r  
Дата: 23.02.17 15:51
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Миллионы мух не могут заблуждаться.


Напомню контекст: "Ускорять разработку за счёт большого количества низкоквалифицированных программистов идиотизм". Не смотря на твоё отношение, так всё равно могут (и будут) делать.

DE>>Написание сравнительно эффективного параллельного кода без утечек и расстрелов памяти после прочтения коротенького мануала.

WH>Ну это просто не правда. Ничто не мешает там накосячить с многопоточностью.

И где я утверждал обратное?

В любом случае, с одной стороны имеется С++, где выстрелить в ногу, особенно если не потратить на "обучение" несколько лет, намного проще. С другой: джава/C#, которые хоть и безопаснее плюсов, но явно сложнее Go.
А последний предоставляет вполне удобные примитивы для многопоточности на уровне языка, а не тупо мьютексы, так что накосячить несколько сложнее.
Re[36]: Портирование нитры.
От: DarkEld3r  
Дата: 23.02.17 15:55
Оценка: +1
Здравствуйте, alex_public, Вы писали:

_>Ну ключевое тут как раз про системное API. ) На всяческие JNI и P/Invoke без слёз не взглянешь. Не говоря уже о том, что даже запустив это, непонятно что делать с частью данных (т.к. системное API обычно основано на указателях).


Пусть так, но у шарпа и джавы весьма жирные стандартные библиотеки. Многим не приходится опускаться на уровень системного API и уж точно такие вызовы не должны быть размазаны по всему коду.
Re[37]: Портирование нитры.
От: alex_public  
Дата: 24.02.17 13:57
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

_>>Ну ключевое тут как раз про системное API. ) На всяческие JNI и P/Invoke без слёз не взглянешь. Не говоря уже о том, что даже запустив это, непонятно что делать с частью данных (т.к. системное API обычно основано на указателях).

DE>Пусть так, но у шарпа и джавы весьма жирные стандартные библиотеки. Многим не приходится опускаться на уровень системного API и уж точно такие вызовы не должны быть размазаны по всему коду.

Не, жирные библиотеки тут ни при чём. Они же не могут заменить функции ОС. Единственно, что они могут, это как-то обернуть вызовы к ним на свой лад. Но это во-первых работает с дикими тормозами (например если говорить о DirectX), а во-вторых обычно выглядит крайне убого (посмотри например на то, как представлены в .Net такие общеупотребительные и важные вещи, как отображаемые в память файлы).
Re[38]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.03.17 03:31
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Не, жирные библиотеки тут ни при чём. Они же не могут заменить функции ОС. Единственно, что они могут, это как-то обернуть вызовы к ним на свой лад. Но это во-первых работает с дикими тормозами (например если говорить о DirectX), а во-вторых обычно выглядит крайне убого (посмотри например на то, как представлены в .Net такие общеупотребительные и важные вещи, как отображаемые в память файлы).


Очередной раз убеждаюсь, что ты живешь в плену мифов.

Посмотрел я и АПИ отображаемых файлов. АПИ как АПИ. Можно прямо структуры писать и читать.

И библиотеки отлично заменяют функции ОС. Мне плевать что там внутри делается, если мне не надо обращаться к функциям ОС. Мне важно задачу решить. И она решается.

Ну, и не всегда библиотеки являются обертками над АПИ ОС. Тот же ВПФ ни разу не обертка, а соамостоятельный АПИ. Там есть ядро написанное на С, но оно очень мелкое и низкоуровневое и оно опять же не опирается на Вынь АПИ, а лезет сразу в видеоподсистему на низком уровне. Но главное, что меня это не трогает. Я использую управляемые классы и все работает быстро и качественно.

DirectX опять же никаких пробем. Есть туча игр написанных на управляемых языках использующих его и Опен ЖЛ напрямую. Да тот же WPF опять же с ним общается.

Так что в высокоуровневом коде не должно быть прямых системных вызовов, ну, или их должно быть как можно меньше. Это сильно упрощает жизнь.

Ну, а все что ты здесь заявил не более чем домыслы. И ты повторяешь их из раза в раз. Несколько поднадоел, честное слово.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: Портирование нитры.
От: alex_public  
Дата: 06.03.17 13:00
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Не, жирные библиотеки тут ни при чём. Они же не могут заменить функции ОС. Единственно, что они могут, это как-то обернуть вызовы к ним на свой лад. Но это во-первых работает с дикими тормозами (например если говорить о DirectX), а во-вторых обычно выглядит крайне убого (посмотри например на то, как представлены в .Net такие общеупотребительные и важные вещи, как отображаемые в память файлы).


VD>Очередной раз убеждаюсь, что ты живешь в плену мифов.


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

VD>Посмотрел я и АПИ отображаемых файлов. АПИ как АПИ. Можно прямо структуры писать и читать.


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

VD>И библиотеки отлично заменяют функции ОС. Мне плевать что там внутри делается, если мне не надо обращаться к функциям ОС. Мне важно задачу решить. И она решается.


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

VD>DirectX опять же никаких пробем. Есть туча игр написанных на управляемых языках использующих его и Опен ЖЛ напрямую. Да тот же WPF опять же с ним общается.


Ну да, ну да. ))) Только вот почему-то во многих статьях о работе библиотеки поддержки DirectX в таких языках можно найти утверждение такого типа: "возможно кто-то считает, что накладные расходы от маршалинга и т.п. механизмов языка не позволяют писать на этом языке под DirectX, но это не правда — для наших целей (мы же не собираемся писать крутую 3D игру) быстродействия хватает"...

Да, и кстати, а тебе не приходило в голову, что MS не предоставляет в .net инструментов работы с DirectX (все соответствующие библиотеки сторонние) не просто так? )))

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


Ну если это домыслы, то тогда ты легко опровергнул бы их фактами. Но пока что в данной теме наблюдается обратная ситуация — ты бегаешь от обсуждения конкретных фактов. )))
Re[40]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.03.17 15:29
Оценка: +1
Здравствуйте, alex_public, Вы писали:

_>Ну пока что от тебя слышны исключительно громкие утверждения. А когда переходим к конкретике и разбору реальных технических нюансов, ты почему-то резко пропадаешь из дискуссии. )


Ты чего-то там себе теоретизируешь не попробовав ни разу. Мне это не интересно. Если бы ты хоть какие-то доказательства предъявлял, а ты рассуждаешь черт знает о чем. Зачем мне дублировать ответы Вольфхунда? Он на теоретические рассуждения уже ответил.

Я тебе тоже отвечал не раз, что ты не там проблему ищешь. Но ты это игнорируешь.

_>Вот именно что читать и писать — это же дикий бред.


Почему бред? Как раз это очень логично. Безопасно читать и писать разделяемые данные можно только залпом, атомарно.

_>Самая идея отображаемых в память файлов заключается в том, что после создания соответствую сущности у тебя в памяти уже образуются (причём максимально эффективно — с помощью механизма подкачки страниц виртуальной памяти) все нужные данные, с которыми ты можешь делать что угодно (можно например каст сделать к той же самой структурке). Если же тебе для работы с этими данными понадобится ещё отдельно выделять дополнительную память и копировать в неё данные из системной памяти (выделенной ОС для отображения), то это на корню убивает всю мощь данного инструмента.


Да какие проблемы то? Переходи в unsafe и используй указатели полученные через SafeMemoryMappedViewHandle.AcquirePointer.

_>Полностью согласен. И я сам стараюсь использовать исключительно кроссплатформенные библиотеки, а не вызовы API ОС. Проблема в другом: кому-то же ведь надо писать эти самые библиотеки. И если язык не предоставляет возможности для эффективного прямого вызова системных функций, то как бы ты не старался, у тебя не получится эффективной библиотеки.


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

И накладные расходы там совершенно очевидны. Если думать головой, то их будет не больше чем если бы ты тоже самое делал руками. По сути это DSL с широким кругом возможностей. А хэадеры просто не предоставляют всей необходимой информации. Если тебе нужно управлять маршалингом вручную, ну, так используй в сигнатуре неуправляемые указатели или InrPtr-ы и будет тебе прямой вызов без всякого марашалинга.

Как-то для дотнета на этом механизме умудрились написать все необходимые библиотеки. Почему-то их количество и качество не уступает (с скорее сильно превосходит) плюсовые.

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

VD>>DirectX опять же никаких пробем. Есть туча игр написанных на управляемых языках использующих его и Опен ЖЛ напрямую. Да тот же WPF опять же с ним общается.


_>Ну да, ну да. ))) Только вот почему-то во многих статьях о работе библиотеки поддержки DirectX в таких языках можно найти утверждение такого типа: "возможно кто-то считает, что накладные расходы от маршалинга и т.п. механизмов языка не позволяют писать на этом языке под DirectX, но это не правда — для наших целей (мы же не собираемся писать крутую 3D игру) быстродействия хватает"...


Я не видел этих "многих статей". Зато я точно знаю как работает маршалинг. Для простых типов используемых в DirectX никакого маршалинга не делается. Если бы это было так, то тот же WPF тормозил бы безбожно, а он летает. И игры бы тормозили, а по факту отличить игру написанную на дотнете от игры написанной на С++ нельзя.

Ты уж раз утверждаешь что-то, потрудись привести ссылки на эти твои "многие" статьи. И за одно объясни как же все же работает WPF и те самые игры.

В реальности то что говоришь о маршалинге не соответствует действительности. На фоне тех операций, что делает DirectX в видеокарте общение с ним это сущие копейки. И маршалинга там особого нет. Просто сам DirectX мало пригоден для программирования в safe-режиме. Придется переходить на unsafe и тут уже встает вопрос, а "на хрена козе баян?". Потом люди вспоминают, что DirectX прибивает гвоздям твой софт к Винде, и что DirectX это далеко не полный игровой движок. И люди делают здравый вывод, что проще не трахаться с убогим DirectX, а взять готовый движок вроде Юнити. Ну, а раз он уже есть и это много человеколет, то на хрена писать еще один на дотнете? Вот только маршалинг ведь, при взаимодействии с движком, никуда не девается. Но это никого не трогает, так как опять же он ничтожен на общем фоне.

_>Да, и кстати, а тебе не приходило в голову, что MS не предоставляет в .net инструментов работы с DirectX (все соответствующие библиотеки сторонние) не просто так? )))


С DirectX можно работать напрямую. МС вообще нихрена не предоставляет, по большому счету. Но примеры проектов на дотнете для Direct3D есть прямо в DirectX SDK ([SDKroot]\Samples\Managed\Direct3D\Tutorials). Я их сам запускал много лет назад. Работает, естественно, все быстро. Никаких сказочных тормозов маршалинга не обнаруживается. Скачай &mdash; убедись.

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


_>Ну если это домыслы, то тогда ты легко опровергнул бы их фактами. Но пока что в данной теме наблюдается обратная ситуация — ты бегаешь от обсуждения конкретных фактов. )))


Домыслы очень трудно опровергнуть. Их можно генерировать тоннами, а чтобы их провернуть нужно тратить массу времени и усилий. По этому в научном сообществе используется общий принцип. Утверждающий обязан сам обосновать свои утверждения. Причем не словами "я читал", а тестами, ссылками, логическими заключениями выводимыми из фактов.

Это ты ходишь по форумам и озвучиваешь миф. Вот тебе и доказывать, что это не миф.

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

С тем же маршалингом ведь все просто. Маршалинг — это трансформация данных. Если у тебя в функции ОС нужны данные не подпадающие под форматы используемые в дотнете, то их надо преобразовать (туда и обратно). Но если функции передаются данные в ожидаемом формате и ты готов трахаться в с возвращаемым форматом, то и преобразовывать нечего. Ожидает АПИ некую структуру — так опиши ее как она есть и отдай. А память выдели сам (в стеке или АПИ-функциями) или припинь объект на время вызова (получив его указать в операторе fixed). Будет тебе скорость как в случае С. А разные там int/long и прочие примитивы не маршалятся за ненадобностью. Вот со строками другое дело. Но опять же тебе никто не мешает передавать туда указатель в исходном формате, а весь трах по преобразованию, если оно нужно, возложить на себя. В unsafe-режиме у Шарпа все для этого есть. Можно сделать и намного больше, если оно надо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 06.03.2017 19:00 VladD2 . Предыдущая версия .
Re[41]: Портирование нитры.
От: alex_public  
Дата: 06.03.17 18:54
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Вот именно что читать и писать — это же дикий бред.

VD>Почему бред? Как раз это очень логично. Безопасно читать и писать разделяемые данные можно только залпом, атомарно.

Какие ещё разделяемые данные, какая атомарность, ты вообще о чём? )

_>>Самая идея отображаемых в память файлов заключается в том, что после создания соответствую сущности у тебя в памяти уже образуются (причём максимально эффективно — с помощью механизма подкачки страниц виртуальной памяти) все нужные данные, с которыми ты можешь делать что угодно (можно например каст сделать к той же самой структурке). Если же тебе для работы с этими данными понадобится ещё отдельно выделять дополнительную память и копировать в неё данные из системной памяти (выделенной ОС для отображения), то это на корню убивает всю мощь данного инструмента.

VD>Да какие проблемы то? Перходи в unsafe и используй указатели полученные через SafeMemoryMappedViewHandle.AcquirePointer.

Ну даже если забыть про очередной совет перейти к unsafe (хотя мы ничего такого хитрого не хотим, всего лишь воспользоваться одно из базовых возможностей ОС), то как нам это поможет получить класс или структуру, отображённые на данные файла? )

_>>Полностью согласен. И я сам стараюсь использовать исключительно кроссплатформенные библиотеки, а не вызовы API ОС. Проблема в другом: кому-то же ведь надо писать эти самые библиотеки. И если язык не предоставляет возможности для эффективного прямого вызова системных функций, то как бы ты не старался, у тебя не получится эффективной библиотеки.

VD>Ну, так для вызова совершенно не обязательно именно хадеры читать и делать небезопасный вызов. Вот дотнетный PInvoke и делает все что нужно. Ты описываешь нужные методы в определенном формате, а дотнет сам генерит код, чтобы безопасно передать и получить данные. Для тебя такое описание автоматом становится управляемой функций.

Из минусов: надо самому писать эту обёртку и возможны существенные накладные расходы.

VD>Как-то для дотнета на этом механизме умудрились написать все необходимые библиотеки. Почему-то их количество и качество не уступает (с скорее сильно превосходит) плюсовые.


Вообще то как раз наоборот. Уступает и по количеству и по качеству. Вот например прямо сегодня случайно (там изначальная тема была по "моему профилю", так что мне кинули на неё ссылку и я по подписке на тему всё остальное тоже прочитал) увидел: https://rsdn.org/forum/dotnet/6717008.1
Автор: Gattaka
Дата: 06.03.17
. И таких примеров множество.

_>>Ну да, ну да. ))) Только вот почему-то во многих статьях о работе библиотеки поддержки DirectX в таких языках можно найти утверждение такого типа: "возможно кто-то считает, что накладные расходы от маршалинга и т.п. механизмов языка не позволяют писать на этом языке под DirectX, но это не правда — для наших целей (мы же не собираемся писать крутую 3D игру) быстродействия хватает"...

VD>Я не видел этих "многих статей". Зато я точно знаю как работает маршалинг. Лля простых типов используемых в DirectX никакого маршалинга не делается. Если бы это было так, то тот же WPF тормозил бы безбожно, а он летает. И игры бы тормозили, а по факту отличить игру написанную на дотнете от игры написанной на С++ нельзя.

Хы, отличить нельзя просто потому, что ни одной AAA игры на .net не существует в принципе. )))

VD>Ты уж раз утверждаешь что-то, потрудись привести ссылки на эти твои "многие" статьи. И за объясни как же все же работает WPF и те самые игры.


Очень просто. Они работают потому, что существующее железо на порядки превосходит все их потребности. Так что любые их тормоза просто не заметны пользователю. А вот если бы речь шла о задачах близких к пределу производительности современного железа (как это часто бывает в AAA играх), то тут тормоза проявили бы себя во всей красе.

VD>В реальности то что говоришь о маршалинге не соответствует действительности на фоне тех операций, что делает DirectX в видеокарте общение с ним это сущие копейки. И маршалирга там особого нет. Просто сам DirectX мало пригоден для программирования в safe-режиме. Придется переходить на unsafe и тут уже встает вопрос, а "на хрена козе баян?". Потом люди вспомниают, что DirectX прибивает гвоздям твой софт к Винде, и что DirectX это далеко не полный игровой движок. И люди делают здравый вывод, что проще не трахаться с убогим DirectX, а взять готовый движок вроде Юнити. Ну, а раз он уже есть и это много человеколет, то на хрена писать еще один на дотнете? Вот только маршалинг ведь, при взаимодействии с движком, никуда не девается. Но это никого не трогает, так как опять же он ничтожен на общем фоне.


http://code4k.blogspot.ru/2011/03/benchmarking-cnet-direct3d-11-apis-vs.html — на вот, просвещайся. ) И обрати внимание, что самый лучших из .net результатов (всего в 2,3 раза медленнее C++ аналога ) SharpDX использует не P/Invoke, а какой-то там свой полухакерский способ.

_>>Да, и кстати, а тебе не приходило в голову, что MS не предоставляет в .net инструментов работы с DirectX (все соответствующие библиотеки сторонние) не просто так? )))

VD>С DirectX можно работать напрямую. МС вообще нихрена не предоставляет, по большому счету.

Не верно. В далёкие времена существовал отдельно Managed DirectX, но сейчас он deprecated. Т.е. изначально разработка библиотеки была, но потом её в MS прикрыли по причине "The modern version of the DirectX SDK is designed for C/C++ native developers".

VD>Но примеры проектов на дотнете для Direct3D есть прямо в DirectX SDK ([SDKroot]\Samples\Managed\Direct3D\Tutorials). Я их сам запускал много лет назад. Работает, естественно, все быстро. Никаких сказочных тормозов маршалинга не обнаруживается. Скачай &mdash; убедись.


Вот, твои примеры относятся как раз этой древности. Кстати, тебе надо было дать скорее такую https://msdn.microsoft.com/en-us/library/windows/desktop/bb318658(v=vs.85).aspx ссылку. Но это всё давным давно сдохло. Сейчас для программирования под DirectX на .net используют или SlimDX или SharpDX — обе сторонние библиотеки-обёртки. И обе тормозят.

_>>Ну если это домыслы, то тогда ты легко опровергнул бы их фактами. Но пока что в данной теме наблюдается обратная ситуация — ты бегаешь от обсуждения конкретных фактов. )))

VD>Домыслы очень трудно опровергнуть. Их можно генерировать тоннами, а чтобы чтобы их провернуть нужно тратить массу времени и усилий. По этому в научном сообществе используется обобранный принцип. Утверждающий обязан сам обосновать свои утверждения. Причем не словами "я читал", а тестами, ссылками, логическими заключениями выводимыми из фактов.
VD>Это ты ходишь по форумам и излагаешь озвучиваешь миф. Вот тебе и доказывать, что это не миф.

Вообще то все нужные факты, тесты и т.п. легко находятся в сети. Потому что излагаемые мною вещи для большинства специалистов являются общеизвестными фактами, а не мифами. )))
Re[39]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.03.17 03:32
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Что-то как-то сомнительно, что подобные вещи можно ввести опциями. Вот тот же GC или указатели — это понятно (unsafe в C# по сути это делает). А скажем размещение на стеке (причём по умолчанию), RAII, семантику перемещения, обсуждаемый тут рядом нормальный параметрический полиморфизм и т.п. разве реально включать опциями? )


Вот ввести поддержку GC — это большой труд. А а все описанное тобой без проблем. По сути С++ и был расширением для С. Все его конструкции — "сахар", который препроцессором транслировался в С. Нужно только чтобы конструкции выделяющие данные на стеке отличались от конструкций выделяющих данные в GC-куче. Вводим нечто вроде:
class A { }
manual class В { }
struct C { }

unsafe // нужно для b2
{ 
  def a  = A(); // Создался в GC-куче. В a - ссылка.
  def b1 = B(); // Создался в на стеке. В b - значение.
  def b2 = new B(); // Создался в куче OS. В b - ссылка. Управлять надо вручную.
  def b3 = unic B(); // Создался в куче OS. В b - ссылка. Управление автоматическое. Можно иметь только одну ссылку.
  def b4 = shared B(); // Создался в куче OS. В b - смарт-ссылка. Управление полу-автоматическое (на кострукторах-деструктороах).
  def c  = C(); // Создался в на стеке. В c - значение. Всегда копируется.
} // тут b1, b3 и b4 разрушаются.


Или можно сделать так чтобы чтобы отличались типы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[40]: Портирование нитры.
От: alex_public  
Дата: 09.03.17 07:15
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Что-то как-то сомнительно, что подобные вещи можно ввести опциями. Вот тот же GC или указатели — это понятно (unsafe в C# по сути это делает). А скажем размещение на стеке (причём по умолчанию), RAII, семантику перемещения, обсуждаемый тут рядом нормальный параметрический полиморфизм и т.п. разве реально включать опциями? )

VD>Вот ввести поддержку GC — это большой труд. А а все описанное тобой без проблем. По сути С++ и был расширением для С. Все его конструкции — "сахар", который препроцессором транслировался в С. Нужно только чтобы конструкции выделяющие данные на стеке отличались от конструкций выделяющих данные в GC-куче. Вводим нечто вроде:
  код
VD>
VD>class A { }
VD>manual class В { }
VD>struct C { }
VD>unsafe // нужно для b2
VD>{ 
VD>  def a  = A(); // Создался в GC-куче. В a - ссылка.
VD>  def b1 = B(); // Создался в на стеке. В b - значение.
VD>  def b2 = new B(); // Создался в куче OS. В b - ссылка. Управлять надо вручную.
VD>  def b3 = unic B(); // Создался в куче OS. В b - ссылка. Управление автоматическое. Можно иметь только одну ссылку.
VD>  def b4 = shared B(); // Создался в куче OS. В b - смарт-ссылка. Управление полу-автоматическое (на кострукторах-деструктороах).
VD>  def c  = C(); // Создался в на стеке. В c - значение. Всегда копируется.
VD>} // тут b1, b3 и b4 разрушаются.
VD>

VD>Или можно сделать так чтобы чтобы отличались типы.

Насчёт выделения на стеке согласен, хотя я бы сделал что-то вроде такого (меньше путаницы):
class A { };
//пишу без автовыведения типов, чтобы были видны используемые типы
{
    А a1(); // Создаётся на стеке. В a1 - значение.
    unic<А> a2 = unic A(); // Создаётся в куче OS. В a2 - ссылка. Управление автоматическое. Можно иметь только одну ссылку.
    shared<A> a3 = shared A(); // Создаётся в куче OS. В a3 - смарт-ссылка. Управление автоматическое (многопоточный счётчик ссылок).
}//тут точно разрушаются a1 и a2. И возможно a3 (если в других местах ссылка уже не нужна)
{
    non_del<A> a1= GC.new<T>();// Создаётся в GC-куче. В a1 - ссылка.
    non_del<A> a2= my_pool.new<T>();// Создаётся в неком моём пуле. В a2 - ссылка.
    req_del<A> a3= new A();// Создаётся в в куче OS. В a2 - ссылка. Управлять надо вручную.
}//здесь никто не уничтожается. Для a3 где-то в программе надо будет вызвать delete
unsafe
{
    row_ptr p=0xf0f0f0f0;//и только для такого типа доступна арифметика указателей
    non_del<A> a1=row_cast<A>(p);
    А a();
    p=&а;//а так же возможность взять адрес у большинства типов выше
    non_del<A> a2=row_cast<A>(p);
}


А что насчёт введения RAII или семантики перемещения с помощь опций? )
Re[41]: Портирование нитры.
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.03.17 09:28
Оценка:
Здравствуйте, alex_public, Вы писали:

A new stackalloc operator for reference types with CoreCLR and Roslyn
и солнце б утром не вставало, когда бы не было меня
Re[32]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.17 22:03
Оценка: +1
Здравствуйте, DarkEld3r, Вы писали:

DE>Потянуть может и потянул, но злые языки говорят, что Go им нужен чтобы легче "масштабироваться" используя не очень сильных программистов. D (а так же скала, немерле и прочие) эту нишу не закрывает никак.


А зачем было переизобретать велосипед Яву 1.0?

По мне так, любой язык можно использовать ограниченно. Не используй PM, дженерики, и т.п. и получишь Го из любого языка.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Портирование нитры.
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.17 22:09
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>А как же Dart? Или игнорируем всё, что не вписывается в схему "бренд решает"?


Брэнд условие необходимое, но не достаточное. Иначе IBM засрал бы Коболом все мозги.

DE>Причём, если мне не изменяет память, Dart продвигался "именно гуглом", в отличии от Go, который позиционируется как детище Пайка.


Ну, вот отличный пример F#. Включили его в коробку с VS, по пиарили и аудитория начала расти хотя как язык он от идела очень был долек.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Портирование нитры.
От: fddima  
Дата: 10.03.17 22:36
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

Продвигался?
Они, имхо, с первых версий Dart не знали что делают: то ли это язык, то ли VM, то ли вообще браузер со своим нестандартным скриптом. То ли дженерики... а что это? Опыт состоявшихся платформ и языков — игнорировали.
А веб головного мозга и вовсе эту концепцию довёл до совершенства:
— язык так себе — от JS с типами ничем не отличается;
— VM — так себе — последний раз когда я смотрел (т.е. давно) — там какие-то прототайп чейны с динамическими лукапами на мембер аксессе а информация о типах заботливо стёрта;
— генерация JS — совсем странная и долго не развивалась;
— на общем фоне — выяснилось, что поддержки в хроме как не было так и не будет — ну и какой смысл тогда? при том, что того же V8 давно хватало с головой.

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

Когда посмотрел спустя несколько лет — стало сильно лучше, но зачем оно без поддержки в браузере — так ясно и не стало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.