- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
#include "HelloWorld.h"
namespace HelloWorld {
CoreLib::System::RuntimeType pituh::__type = CoreLib::System::RuntimeType(&HelloWorld::pituh::__rt_info);
// Method : pituh.pituh()
void pituh::_ctor()
{
base::_ctor();
return;
}
// Method :
CoreLib::System::Type* pituh::__get_type()
{
return &HelloWorld::pituh::__type;
}
// Method :
bool pituh::__is_type(CoreLib::System::Type* value)
{
return ((&HelloWorld::pituh::__type == value) || base::__is_type(value));
}
// Method :
void* pituh::__get_interface(CoreLib::System::Type* value)
{
return base::__get_interface(value);
}
// Method : pituh.Main(string[])
int32_t pituh::Main(__array<string*>* args)
{
CoreLib::System::Console::WriteLine(u"Kokoko!"_s);
return 0;
}
pituh::__type_methods_table pituh::_methods_table;
__runtimetype_info pituh::__rt_info = { u"pituh", u"", 18, false, &object::__type, nullptr };
}
auto __main(int32_t argc, char* argv[]) -> int32_t
{
__startup();
auto exit_code = HelloWorld::pituh::Main(__get_arguments(argc, argv));
__shutdown();
return exit_code;
}
auto main(int32_t argc, char* argv[]) -> int32_t
{
return __main(argc, argv);
}
Вот такой красивый говнокод получается после прогонки С# HelloWorld в С++
ASD_77 07.03.2017 13:08 # +11
и хедор на закуску
guest 07.03.2017 13:19 # +10
PS: было уже
ASD_77 07.03.2017 13:27 # +10
guest 07.03.2017 14:01 # +10
Зачем все эти отрицания, коль есть Except?
ASD_77 07.03.2017 14:51 # +10
guest 07.03.2017 15:10 # +10
guest 07.03.2017 18:44 # +12
Psionic 07.03.2017 14:13 # +11
Antervis 07.03.2017 14:21 # +10
Psionic 08.03.2017 02:39 # +10
barop 08.03.2017 03:38 # +4
а так всё таки
Dummy00001 07.03.2017 15:40 # +10
> object
> __array
> string
мне сильно кажется что здесь С++ и не пахнет.
ASD_77 07.03.2017 15:47 # +11
вот. из CoreLib.h
а вот вижимка для __array
Dummy00001 07.03.2017 16:18 # +10
на кой фиг это надо? кто делает ГЦ? догадываюсь что все равно привязано к дотнету и виндам?
ASD_77 07.03.2017 16:36 # +11
guest 07.03.2017 16:39 # +10
Dummy00001 07.03.2017 17:14 # +10
bayan 07.03.2017 16:45 # +10
Вообще я всё меньше понимаю зачем нужен ГЦ.
кроме поддержки циклических ссылок он ничем не лучше референс каунтинга, а референс каунтинг быстрее, легче, понятнее, и вообще
roman-kashitsyn 07.03.2017 16:51 # +11
Сомнительное утверждение. Для объектов без деструкторов с коротким временем жизни ГЦ с поколениями может быть в среднем ощутимо быстрее, особенно когда счётчики ссылок должны быть атомарными. Без конкретных замеров затрат на различных юзкейсах это всё голословно.
> ничем не лучше референс каунтинга
Дефрагментация кучи.
bayan 07.03.2017 17:05 # +10
но ГЦ все же требует отдельного потока и (иногда) стоп зе ворлд
Яблоко говорит что дескать они меньше едят батарею чем андроид потому что у них не гц а рефкаунтинг
>>Дефрагментация кучи.
да, тут я погорячился
j123123 07.03.2017 17:08 # +10
bayan 07.03.2017 17:10 # +10
гц вроде ищет пути к объектам из стеков потоков и стат памяти, и если нет -- выпиливает
j123123 07.03.2017 17:15 # +11
bayan 07.03.2017 17:19 # +10
но там есть жесткие правила кто ссыль увеличивает, а кто нет
грубо говоря функция useFoo(*bar) увеличивает ссылку на bar, а abuseFoo -- нет
Dummy00001 07.03.2017 17:28 # +11
cykablyad 07.03.2017 17:16 # +10
bayan 07.03.2017 17:19 # +10
cykablyad 07.03.2017 17:30 # +10
bayan 07.03.2017 17:32 # +9
на каждый выход ссылки из зоны видимости уменьшает счетчик?
cykablyad 07.03.2017 17:50 # +9
ASD_77 07.03.2017 17:53 # +10
cykablyad 07.03.2017 17:55 # −4
Загружая при этом процессор под сотку
ASD_77 07.03.2017 18:15 # +8
guest 07.03.2017 18:28 # +10
bayan 07.03.2017 18:30 # +9
ASD_77 07.03.2017 17:44 # +10
вот пример
единственная ссылка на память(обьект) Boo находиться только в стеке и если в этот момент вызвать GCCollect и не проверить стэк то обьект Boo будет удален а значить вызов Bla::Foo приведет к Memory Access ошибке
ASD_77 07.03.2017 17:14 # +10
Dummy00001 07.03.2017 17:25 # +11
потому что шарп использует гц. что значит что шарпов код явно объекты выделяет, но явно ее *не* освобождает.
> Вообще я всё меньше понимаю зачем нужен ГЦ.
> кроме поддержки циклических ссылок
именно. результат: проще семантика.
> он ничем не лучше референс каунтинга,
референс каунтинг - отстой. я его делал пару раз в ручную, и толку от него было мало. если дата модель позволяет использовать референс каунтинг без граблей, то там и до детерменистического life cycle объектов не далеко. а если у объектов детерменистический life cycle, то гц и не надо: если знаешь точно когда можно/нужно удалять объекты, то не велика работа их удалить.
на самом деле, полноценный гц - это просто облегчение жизни. ну как коробка-автомат: профи ругаются что типа не эффективно, а всем кому просто из А в Б доехать надо это приятная (не)мелочь.
bayan 07.03.2017 17:29 # +9
Не знаю является-ли работа с памятью частью требования к ЯП. Хотя ключ слова delete в нем нет, и метода release у System.Object (а это стдлиба япа) тоже нет.
>>референс каунтинг без граблей,
каких граблей?
Я создал объект и ссылка пошла гулять по куче. Как мне узнать когда его можно того?
Dummy00001 07.03.2017 17:59 # +9
> каких граблей?
типичные грабли это (классика) циклические зависимости, (то с чем я еще мучался) когда объекты друг на друга многократно ссылаются и (то с чем еще больше мучался) когда владение объектом передаётся от одного объекта другому.
реф-каунтинг часто приходится дебажить - а дебажить его сложно. хез почему реф-каунт резко -Н стал, или почему он вечно Н и не уменьшается. я когда последний раз делал, в лоб делал мап с реляциями между указателями объектов (что тоже через ж работало потому что пара классов лежало в векторе, который сам себя перевыделял, и все поинтеры резко менялись).
bayan 07.03.2017 18:00 # +10
да, это не решается без гц
я про это сразу сказал
bayan 07.03.2017 17:52 # +10
я понял про грабли
типа такого
https://developer.apple.com/reference/foundation/nsautoreleasepool
1024-- 07.03.2017 19:04 # +10
Мне кажется, это отвлекает, рассеивает внимание программиста, уводит от цели, понижает понятность. Вместо того, чтобы работать над алгоритмом, программист работает над тем, чтобы разложить байты вручную.
А потом само мышление начинает исключать случаи, где отсутствие гц - боль. Например, по условию из функции возвращаем либо переданный объект, либо объект по умолчанию; из функции возвращает либо элемент переданной коллекции, либо новый созданный элемент. Без гц и подсчёта ссылок повезёт, если такие "либо-либо" возвращают объекты с разными классами владельцев (как в первом случае), а то вообще могут возвратить какую-то странную питушню (как во втором случае). Программисту приходится городить подсчёт ссылок/копирование или претворяться, что вообще таких способов передачи ссылок не существует.
Dummy00001 07.03.2017 20:48 # +9
> Мне кажется, это отвлекает, рассеивает внимание программиста, уводит от цели, понижает понятность
ты выдрал из контекста. речь шла о реф-каунтинге. редкий язык его нативно поддерживает - что значит что в общем случае надо самому ручками прикручивать. явное удаление - против явного реф-каунтинга, я не уверен что хуже.
bayan 07.03.2017 20:55 # +10
Получается относительно не плохо: не надо руками писать retain (+) и release (-) но нужно учитывать что:
1) циклические ссылки это мемори лик. Так что ВЕЗДЕ есть четкие правила в какую сторону нужно иметь weak reference. Это нужно помнить и соблюдать.
2) если функция создает объект и возвращает его, она вынуждена увеличить ссылку (потому что без ссылки он сразу коллектница), но кто должен уменьшить эту ссылку потом? Вызывающая сторона не знает отдали-ли ей новый объект или старый (это то, о чем говорит 1024). Для этого есть тот самый pool в который кладутся такие объекты и потом он коллектится (обычно в конце евентлупа)
3) наконец рефкаунтинг не работает для плейнси. Там надо самому делать retain/release, причем надо помнить что функции с названием create делают reatin а get -- нет (говорю по памяти но правила именно такие -- по НЕЙМНИГУ)
Так что это конечно проще чем вручную делать free, но внимательность всё равно нужна
Antervis 08.03.2017 12:06 # +10
CHayT 08.03.2017 12:19 # +10
Antervis 08.03.2017 12:46 # +11
guestinho 08.03.2017 14:58 # +10
Antervis 08.03.2017 15:29 # +10
guestinho 08.03.2017 15:34 # +10
Antervis 08.03.2017 18:55 # +9
huesto 08.03.2017 19:48 # 0
Antervis 08.03.2017 19:51 # +10
j123123 08.03.2017 20:02 # +11
А как ви себе это представляете, переносимый способ убирать ворнинги? Насколько я знаю, стандарт си/плюсов вообще никак не затрагивае тему того, что есть какие-то там ворнинги. Нужно добавить это в стандарт? Под плюсы даже name mangling никто не стандартизировал(что кстати является проблемой куда серьезнее), какие к дьяволу стандартизации варнингов?
Lopata 08.03.2017 20:41 # +10
Lopata 08.03.2017 21:04 # +10
Antervis 08.03.2017 21:46 # +10
Плохо знаешь:
"— If a program contains a violation of any diagnosable rule or an occurrence of a construct described in this Standard as “conditionally-supported” when the implementation does not support that construct, a conforming implementation shall issue at least one diagnostic message."
diagnostic message и есть warning. Еще, из с++17:
http://en.cppreference.com/w/cpp/language/attributes
Вообще не вижу проблемы ввести аттрибут аля [[nowarn]] или [[nowarn=sign-compare]]
> Под плюсы даже name mangling никто не стандартизировал(что кстати является проблемой куда серьезнее)
Потому что для этого надо стандартизировать calling conventions и сделать один из них стандартным по умолчанию. Можешь представить, сколько программ это сломает? Какого члена они не стандартизировали эти вещи с самого начала? Наверно, производители компиляторов сыграли в "лебедь, рак и щука"
barop 09.03.2017 03:40 # +4
И конечно же копеляторы должны были генерить код под свою платформу чтобы интероптица с уже существующим кодом
j123123 09.03.2017 15:39 # +9
Да, действительно. Не думал, что они ПРО ЭТО напишут в стандарте.
>Вообще не вижу проблемы ввести аттрибут аля [[nowarn]] или [[nowarn=sign-compare]]
И написать еще в стандарте подробнейший список того, на что должен и на что не должен выдавать варнинг компилятор (с примерами кода), и что вот этому варнингу соответствует "sign-compare", вот этому "NULL-dereference-possible", а этому "undefined-behaviour-div0"? Не, я не говорю что это невозможно сделать, просто есть задачи поприоритетней.
В идеале я считаю из компилятора вообще надо выкинуть все варнинги(кроме тех, из-за которых код тупо не компилируется, но это уже не варнинги, это ошибки компиляции). Потому что анализаторы, встроенные в разные компиляторы могут с разным успехом диагностировать разные ошибки, и например может иметь смысл прогонять некий код и через анализатор gcc и анализатор clang, потому что множество варнингов, которые может выдать gcc но не clang и выдать clang но не gcc, т.е. симметрическая разность двух множеств варнингов для разных компиляторов будет не пустой, так не лучше ли отцепить анализатор от компилятора, чтобы применять его отдельно? Ну как PVS-studio какую-то. На кой черт это надо обязательно заставлять делать при компиляции?
huesto 09.03.2017 15:59 # 0
Antervis 09.03.2017 16:49 # +10
Да приоритеты на самом деле даже не очень-то и при чем. Простые вещи вряд ли вызовут сопротивление общественности. Это ж не какие-нибудь модули, где производители компиляторов срутся друг с другом у кого реализация лучше, пока пользователи ждут.
> На кой черт это надо обязательно заставлять делать при компиляции?
Статический анализ многократно дольше компиляции, а диагностики компилятора не налагают существенных затрат. Вот и выходит, что проще ловить простые ошибки (типа опечаток) на лету, а на сложные пусть сервер проверяет анализатором перед коммитом.
j123123 09.03.2017 17:15 # +10
Статический анализ (как и компиляция) может быть разным. Например, компиляция каких-нибудь constexpr-функций, которые в компилтайме что-то сложное делают, может занять на порядок больше времени, чем их будет проверять статический анализатор.
> а диагностики компилятора не налагают существенных затрат. Вот и выходит, что проще ловить простые ошибки (типа опечаток) на лету, а на сложные пусть сервер проверяет анализатором перед коммитом
Ну так можно запускать статический анализатор в облегченном режиме, чтобы он анализировал это так же, как это делает компилятор, не вижу в этом никаких проблем. Например, перед коммитами мне вот действительно приходится компилировать, но конечным результатом (скомпилированным бинарем) я не пользуюсь, и компилирую я именно чтобы отловить всякие тупые ошибки. Т.е. фактически компилировать мне не надо, мне нужны только варнинги, и всякие там юнит-тесты запускаются не у меня на компе.
Antervis 09.03.2017 18:36 # +10
guestinho 08.03.2017 22:55 # +10
barop 09.03.2017 03:42 # +9
guestinho 09.03.2017 11:38 # +10
ASD_77 09.03.2017 11:43 # +10
guestinho 09.03.2017 11:51 # +11
barop 09.03.2017 13:07 # +9
ASD_77 09.03.2017 13:29 # +10
CHayT 09.03.2017 14:25 # +11
Спасибо, ты мне напомнил про С++/CLI, и где теперь мой обед.
ASD_77 09.03.2017 16:36 # +9
j123123 09.03.2017 15:20 # +10
dxd 09.03.2017 15:36 # +13
huesto 09.03.2017 16:43 # 0
bayan 09.03.2017 17:27 # +10
если ты хранишь int и ксоришь его чтобы получать адрес то никто (кроме тебя) не знает что это ссыль или указатель
тут не раьботает ни гц ни рефкаунт
1024-- 07.03.2017 20:56 # +10
> явное удаление - против явного реф-каунтинга
Я писал про пользу неявного с гц. Действительно, написал комментарий не по теме.
ASD_77 07.03.2017 17:15 # +9
вот что использованно для ГЦ
https://www.hboehm.info/gc/
Кросплатформенная либа работает везде
Amayak_Akopyan 07.03.2017 16:35 # +11
ASD_77 07.03.2017 17:18 # +9
ASD_77 07.03.2017 18:38 # +10
C# async
Развернуло в 1 метод + 1 класс
и дохрена кода ...
cykablyad 07.03.2017 18:39 # +10
j123123 08.03.2017 04:38 # +11
Swift tool to transform DOS/PMODEW 386 TASM Assembly code to C code
Только там надо какой-то свифт ставить, чтобы это собрать
j123123 08.03.2017 04:44 # +10
https://github.com/libretro/mrboom-libretro
Конвертированный код выглядит довольно мерзко:
https://raw.githubusercontent.com/libretro/mrboom-libretro/master/mrboom.c
CHayT 08.03.2017 10:09 # +12
Amayak_Akopyan 08.03.2017 11:24 # +11
ASD_77 08.03.2017 11:50 # +10
Amayak_Akopyan 08.03.2017 11:10 # +11
> .xcodeproj
Там ещё какой-то мак нужно ставить, чтобы это собрать.
j123123 08.03.2017 14:53 # +10
Amayak_Akopyan 08.03.2017 11:32 # +9
j123123 08.03.2017 17:57 # +10
ASD_77 21.03.2017 19:30 # +9
ivanvirabyan 21.03.2017 19:32 # −5
Непорядок. Засор.
-___- 21.03.2017 20:23 # +10
barop 23.03.2017 03:24 # +10
сказал проктолог так нельзя
и стал вытаскивать из глеба
ферзя
guestinio 23.03.2017 20:19 # +12
Сказал проктолог. Так нельзя!..
И стал вытаскивать из Глеба
Большого черного ферзя.
inkanus-gray 24.08.2017 01:11 # +3
Пример (копировать сюда не буду из-за размера):
http://web.archive.org/web/20100615232803/paste.lisp.org/display/73134
А теперь представим, что получится, если сначала прогнать C# → C++, а потом C++ → С.
d_fomenok 25.10.2017 19:10 # +3
Красота-то какая! Комитет решил добавить синтаксис для того, что бы пользователь помогал компилятору выводить типы?
bormand 25.10.2017 20:39 # 0
А что зелёным? Именно для этого и прикрутили эту хрень...
d_fomenok 25.10.2017 20:56 # 0
decltype(a + b) foo(T1 a, T2 b) {
PS. Да, я знаю, что a и b ещё не объявлены. Но неужели нельзя было как во всяких там Сишарпиках делать? Не нужны были бы эти "предварительные объявления" (или как они там, в крестах?)
inkanus-gray 25.10.2017 21:12 # +3
d_fomenok 25.10.2017 21:16 # +2
И даже без AST, сразу строчат машинный код?
bormand 25.10.2017 21:19 # +5
И при этом оптимайзер всё равно делает 100500 заходов, чтобы упростить всю высранную однопроходным фронтендом метушню...
inkanus-gray 25.10.2017 21:44 # +1
1. Директива forward у функции, чтобы можно было создавать косвенную рекурсию. Аналог в няшной — голый прототип.
2. Можно объявить указатель на ещё не полностью определённый тип. Используется, например, для создания связных списков.
Сишный аналог кода:
Извращенцы могут определить в Object Pascal указатель на функцию, принимающую указатель на такую же функцию и/или возвращающую указатель на такую же функцию:
А как с этим в няшной и в крестах?
bormand 25.10.2017 21:51 # +1
SemaReal 26.10.2017 04:00 # +5
А если бы там был не указатель то фиг.
Вероятно потому что для подсчета размера указателя не нужно знать весь тип, а для размера типа нужно.
d_fomenok 25.10.2017 21:22 # +3
Об заднепроходном компиляторе
roman-kashitsyn 27.10.2017 15:33 # +3
Сомневаюсь. Скорее всего, проблема в потенциальном сокрытии имён.
1024-- 27.10.2017 19:37 # +1
Но ведь имена - это не проблема для компилятора. Можно сразу после парсинга поменять местами список аргументов и возвращаемый тип, после чего на это AST отдать на вход алгоритмам (а таковые реализованы, т.к. компиляторы C++11 существуют).
Остаются только людские сомнения, которым в C++ уже противостоят работающие исключения из простых правил:
Преждевременное использование неинициализированной питушни (аргументов) - тоже не проблема как для компилятора, так и для человека, т.к. вещи вида struct X { X():x(0){} int x; }; работают.
И область видимости, не покрытая фигурными скобками - тоже не проблема как для компилятора, так и для человека, т.к. аргументы функции объявляются где-то вне фигурных скобок, опоясывающих тело, а видны только внутри них.
roman-kashitsyn 27.10.2017 22:51 # 0
g0cTb 27.10.2017 22:59 # 0
1024-- 27.10.2017 23:35 # 0
Как по мне, если и вносить инородную питушню, то хотя бы что-то реальное полезное и более удобное. Например, сделать наконец работающие typedefы для функций и обновить описания типов.
roman-kashitsyn 27.10.2017 23:52 # +1
Я говорю, что decltype(a+b) f — это говно, потому-то возникает проблема с именами. Тебе кажется логичным, что имена должны привязываться к параметрам, а мне — наоборот.
Что то говно, что это говно.
SemaReal 27.10.2017 23:58 # 0
swift, kotlin.
А откуда вообще в сишке такой говносинтаксис?
roman-kashitsyn 28.10.2017 00:10 # +2
Ritchie's idea was to declare identifiers in contexts resembling their use: "declaration reflects use".
Видимо, хотели, чтобы было "интуитивненько", по заветам 1024--, типа Получилось как всегда.
SemaReal 28.10.2017 00:23 # +1
ага, отсюда же и char *foo, c
потому что c = *foo
фу таким быть!
1024-- 28.10.2017 00:26 # 0
> "declaration reflects use"
Нельзя с первого раза поработать с памятью без утечек и UB.
Нельзя с первого раза объявить несколько указателей.
SemaReal 28.10.2017 00:38 # +1
j123123 28.10.2017 00:54 # +1
inkanus-gray 28.10.2017 01:17 # +1
Например, #pragma link, #pragma library, #pragma comment (lib), призванные хоть как-то компенсировать отсутствие модульности, так и не стали стандартом. Да даже диапазоны в switch-case есть только у gcc.
SemaReal 28.10.2017 01:20 # +1
Вы не подумайте: я люблю няшную, код люблю писать, а вот читать -- нет.
g0cTb 28.10.2017 01:43 # +2
g0cTb 28.10.2017 01:40 # +2
Вот она, метушиная сила - любую хуйню можно сделать.
g0cTb 27.10.2017 23:20 # 0
1024-- 27.10.2017 23:50 # +1
Мне кажется, было бы не так надёжно. Если случайно разогнётся один палец, то результат изменится на какое-то число от 2^0 до 2^9 вместо единицы.
Ну и число "3" (или "20") показывать сложно (невозможно?).
Если взять только все доступные среднему человеку кобенации с пальцами и фалангами, уже сложно будет запомнить, не пытаться корячиться и восстановить число по положению пальцев.
Кстати да, какая бы система счисления была бы у нас, если бы был выбран вариант счёта с использованием всех физически доступных кобенаций пальцев и фаланг? Наверно какая-нибудь странная питушня вроде дюймов, футов, миль или дней в месяцах. Во всяком случае, во французском языке, если не ошибаюсь, 80..89 уже сейчас именуют как семьдесят десять, семьдесят одиннадцать, ..., семьдесят девятнадцать, а где-то ещё в цивилизованной Европе не гнушаются названий вида "пару раз сорок плюс треть пятнадцати". И это только с загибанием пальцев согласно количеству!
inkanus-gray 28.10.2017 01:20 # 0
SemaReal 28.10.2017 01:22 # 0
g0cTb 28.10.2017 01:36 # 0
g0cTb 28.10.2017 01:45 # 0
G@