Comments 81
А по поводу изменения кода в памяти и перемещения указателя: можно просто поставить брейкпоинт и в нём уже запустить Evaluation окно с отдельным кодом внутри, который подцепит все переменные и так далее.
А тут нужны cython + numpy и сверху еще numba было бы неплохо. А чистый python сильно проигрывает :(
Ну или pypy, как предлагают ниже, но numba должна быть круче.
Вы даже не представляете, как ошибаетесь.
Python везде выдаёт самый худший результат по производительности.
Попробуйте использовать PyPy вместо CPython, он с JIT компиляцией. На данный момент поддерживает Python до 3.5 включительно. (Легко) можно получить прирост в скорости до x10. Код переписывать не надо.
Но оказался неправ — C# всего на 15-20% быстрее Java (запускал из Eclipse под Windows), а не в несколько раз, как ожидалось
вы всерьез сравниваете производительность оригинального C# кода и автогенерированного, использующего оболочки и эмулирующего C#-концепции Java-кода?
На RHEL есть поддержка .net core: пруф.
Ну судя по бенчмаркам неплохо рвет. Единственно что в регулярках в аутсайдерах.
винде работают субд
Причем тут винда и субд. Например, сейчас есть в продакшене система на .netFramework, которая ходит на Oracle, который в свою очередь установлен на линуксе.
Плюс майкрософт сделала порт своего SQL Server на линукс. поэтому ограничений в .net, почти нет (ну кроме нормальных кроcплатформенных ГУИ, но я бы тут взял или QT или Electron)
вы всерьез сравниваете производительность оригинального C# кода и автогенерированного, использующего оболочки и эмулирующего C#-концепции Java-кода
Ну да, тем более, что обёрток там не так уж много, и для несущественных для производительности объектов. А так всё идентично — классы, методы, циклы, ветвления, массивы и пр. стандартные конструкции. Хотя, может, каких-либо «блох» и можно отловить. В принципе, генерируемый код Java выложен на pullenti.ru/DownloadPage.aspx, если Вы там обнаружите навскидку какие неэффективности — буду признателен!
Наверное имеется в виду J#
https://ru.m.wikipedia.org/wiki/Visual_J_Sharp
"Заявленной целью разработки Visual J# было облегчение перехода разработчиков с платформы Java на платформу .NET Framework. Однако эта цель достигнута не была" =)
Так как есть JPython, то может быть даже достаточно перегонять только в питон, для джавы написать отдельно интерфейс.
dcevm.github.io бесплатная
zeroturnaround.com/software/jrebel платная, очень платная
Я пользовался обеими и для большинства случаев первого хватит. Насколько я помню, основное отличие в поддерживаемых framework'ах — т.к. при изменении кода иногда нужно учитывать работающие в приложении framework'и и дёрнуть их методы (например, добавили поле которое испольуется в DI и его нужно инициализировать, вот dcevm и jrebel посмотрять, что у вас за DI framework используется и применят его)
Но по опыту — если такая фигня начинает быть важна, значит что то не то в архитектуре приложения — поидее всю логику работы нужно уметь востанавливать по логам и быстро воспроизводить в тестах. По крайне мере мне эти штуки пригодились только на таких проектах — тестов нет, запускается очень долго, и поэтому приходиться в run time код писать :-)
P.S. давно статью по dcevm писал, может пригодиться, habr.com/post/236075
В Python отсутствуют простые типы как ValueType (насколько я понял), и даже обычные числа — это полноценные объекты (фактически как boxing в .NET).Это ерунда. В дотнете значимые и примитивные типы — это не одно и то же. Например,
string
— примитивный, но ссылочный, а Decimal
— значимый, но не примитивный.Каким образом вы определяли, что обычные числа используются как объекты? Вы смотрели ассемблерный код, генерируемый JIT? Я не знаток питона, но практически уверен, что проблема производительности не в нем, а в том, что ваш генератор выдает неэффективный код.
Например, string — примитивный
Да, ладно!
var isPrimitive = "Hello World!".GetType().IsPrimitive;
Console.WriteLine(isPrimitive);
>>out -> false
string
вполне себе примитивный: для него есть отдельный опкод, его можно использовать в аргументах атрибутов и в константах. А свойство просто проверяет текущий тип на вхождение в некий список. Если пытаться сформулировать правило, по которому здесь определяется примитивность типа, то оно получается длинным и неуклюжим. Поэтому я подозреваю, что на самом деле причина историческая: так реализовали в первой версии, а потом не стали менять для сохранения обратной совместимости.Если пытаться сформулировать правило, по которому здесь определяется примитивность типа, то оно получается длинным и неуклюжим
Зачем формулировать правило, которого нет в спецификации языка C#?
Даже Джон Скит, не называет string примитивным типом и полностью доверяет type.Isprimitive
I wouldn't personally call dynamic, decimal, object or string primitive types. I'd use Type.IsPrimitive for the canonical source there.
Источник
stackoverflow.com/a/47589777
Во-вторых, именно отсутствие нормального определения побуждает к попытке сформулировать свое. В ECMA-335 я такого не нашел, всё так или иначе упирается в это самое свойство
IsPrimitive
, а рекурсивное определение, даже подтвержденное личным мнением Джона Скита, на мой взгляд бесполезно.Для себя я определяю «примитивный» тип как нечто базовое, что CLR особым образом использует и на что полагается. Под такое определение строка подходит — в формате метаданных CLI есть даже отдельная секция для хранения строк.
Какое определение больше нравится — решать вам. Но если вы знаете ситуацию, в котором текущая реализация
IsPrimitive
имела бы осмысленную практическую пользу — пожалуйста, поделитесь.в спецификации языка C# определения примитивности и не может быть
Ага, а вот в спецификации VB.NET есть секция 7.3
The primitive types are identified through keywords, which are aliases for predefined types in the System namespace.
Там же, кстати, к примитивным типам относят и Decimal, Date
Для себя я определяю «примитивный» тип как нечто базовое,
Так и писали бы в первоначальном сообщении ИМХО — вопросов бы не было.
Вот бы, разрабатывая программу на одном языке, сразу получать исходники на других языках программирования
Haxe (https://haxe.org/), не?
Был же вроде проект наоборот, конвертировали Андроид с Явы на Сишарп.
C# нет, но есть Truffle и возможность имплементить свой язык.
Месье знает толк в извращениях...
Если верно понял, Пайтон был по фану
А не хотите во что-нибудь поэкзотичнее конвертнуть?
Например Go или Rust))
в Java — new Class() {{ присваивания }}
Не стоит править — просядет производительность.
// Я буду обновлять комментарии перед отправкой своего.
Всё верно, блок инициализации в неком классе-наследнике Class
,
(new Class().getClass() != new Class() {{}}.getClass()) == true
Это корректная конструкция, но делать так не рекомендуется.(пока не понимаешь, что творишь и почему этот код может сломать буквально всё)
Лучше конечно конвертировать на уровне байт кода, а не исходного кода. Я встречал на хабре несколько таких проектов, например CIL2Java, был еще dot42 и множество других.
попробовал Roslyn, но сразу не взлетело, да и лень было разбираться
Извините, но написать свой парсер с нуля намного сложнее чем разобраться в Roslyn. Тем более он предоставляет не только парсер, а еще и семантический анализатор. Как проверяли корректность парсера? Ведь в C# есть препроцессорные директивы.
C# -> сборка — Java -> пакет
internal — package private
Кросс-языковая разработка ПО