HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Флуд > Заметки на полях
Разработка С++ совместимой виртуальной машины
Страницы (11): « 1 2 3 4 [5] 6 7 8 9 » ... Последняя »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34514
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
Дядя Миша писал:
А чтож оно по твоему делает?

Всё что угодно, только не создаёт новый тип.
Ради смеху можешь попробовать создать перегрузку функции с типом, созданным через typedef (например, typedef int BOOL), и с оригинальным int. Ты увидишь, что для компилятора и то и другое - самый обычный int.
Для создания strong types в плюсах нужно использовать классы с операторами, больше никак.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 209864

Старое сообщение 20-06-2022 07:34
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
XaeroX писал:
Всё что угодно, только не создаёт новый тип.

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

Цитата:
XaeroX писал:
Ради смеху можешь попробовать создать перегрузку функции с типом, созданным через typedef (например, typedef int BOOL), и с оригинальным int. Ты увидишь, что для компилятора и то и другое - самый обычный int.

Неправда, так себя только шестёрка ведёт, а новые студии уже нет.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 209866

Старое сообщение 20-06-2022 07:41
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34514
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
Дядя Миша писал:
а новые студии уже нет.

Ну-ну.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 209869

Старое сообщение 20-06-2022 08:12
-
PRoSToTeM@
Частый гость

Дата регистрации: Nov 2011
Проживает: Иваново
Сообщений: 57
Возраст: 27

Рейтинг



Цитата:
Дядя Миша писал:

Неправда, так себя только шестёрка ведёт, а новые студии уже нет.

Нет, это везде провоцирует redefinition.

Сообщить модератору | | IP: Записан
Сообщение: 209873

Старое сообщение 20-06-2022 13:11
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Ну хорошо, вот такой вам тест:

C++ Source Code:
1
class Foo
2
{
3
  int	test;
4
 
5
  union
6
  {
7
    float	bar;
8
    void moo( void ) {}
9
  };
10
};

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

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 210173

Старое сообщение 08-07-2022 15:50
-
TheEVolk
NodeMod разработчик

Группа: Неопытный
Дата регистрации: Dec 2019
Проживает: Россия
Сообщений: 95
Возраст: 22

Рейтинг



Цитата:
Дядя Миша писал:
Жэсть. Такое ощущение, что это не VM, а плюсы измученные шаблонами.

В typescript есть декораторы, можно сделать так:

@Predictable()
@Shared()
@Network()
const myValue = 123;

Или:
@Flags(FLAG_PREDICTABLE + FLAG_SHARED)
const myValue = 123;

Добавлено 09-07-2022 в 00:13:

Жесть, я забыл страницу перелистнуть и ответил на сообщение многомесячной давности 0_0

__________________
exit();

Сообщить модератору | | IP: Записан
Сообщение: 210174

Старое сообщение 08-07-2022 16:13
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
TheEVolk писал:
Жесть, я забыл страницу перелистнуть и ответил на сообщение многомесячной давности 0_0

Мне пришлось всю тему перечитать, чтобы вспомнить о чём собственно шла речь

Цитата:
TheEVolk писал:
В typescript есть декораторы, можно сделать так:

Угу или создать новый язык Kotlin. Тоже неплохой вариант.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 210175

Старое сообщение 08-07-2022 16:17
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Вот какую любопытную вещь обнаружил:

C++ Source Code:
1
class Base
2
{
3
  virtual void Foo( void ) = 0;
4
};
5
 
6
void Base :: Foo( void )
7
{
8
}

То есть pure virtual function получает тело и шестёрка на это никак не ругается.

Добавлено 14-07-2022 в 13:42:

С удивлением обнаружил, что параметры вызова функции нельзя перечислять, как объявленные типы. Ну т.е. вот так писать нельзя:
C++ Source Code:
void Arc( int X1, Y1, X2, Y2, X3, Y3, X4, Y4 )
{
}

Никогда раньше над этим не задумывался.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 210238

Старое сообщение 14-07-2022 10:42
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Вот еще какую штуку планирую ввести - предупреждение при копировании объекта сквозь аргумент функции. За все годы практики я совершенно не припомню случаев, когда такое бывало нужно. К тому же подобное копирование вообще может быть опасно, если в объекте наличествуют умные указатели и RC. Или манипуляции с глобальными переменными в конструкторе. Запрещать такое поведение конечно не стоит - мало ли.
Но выдавать предупреждение четвертого уровня, что может быть имелась в виду передача по ссылке\указателю, думаю нужно.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 210609

Старое сообщение 05-08-2022 10:09
-
KiQ
Житель форума

Дата регистрации: Aug 2010
Проживает: Смоленск, Москва
Сообщений: 2088

Рейтинг



Цитата:
Дядя Миша писал:
С удивлением обнаружил, что параметры вызова функции нельзя перечислять, как объявленные типы

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

Добавлено 14-09-2022 в 22:33:

Ну или как вариант все аргументы одного типа заключать в дополнительные скобки, навроде:
void Arc( int (X1, Y1, X2, Y2, X3, Y3, X4, Y4), float scale, int (r,g,b) ) {}

Хотя слишком совпадает с сигнатурой функции, принимающей аргументы в виде функции. Можно, например использовать многоточие после типа:
void Arc( int... X1, Y1, X2, Y2, X3, Y3, X4, Y4, float scale, int... r,g,b ) {}

__________________
-Brain is dead-

Сообщить модератору | | IP: Записан
Сообщение: 211155

Старое сообщение 14-09-2022 19:33
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
KiQ писал:
Строгая типизация же, ну

Нет, она тут непричём. В Delphi разные типы отделяются точкой с запятой, а в Си - только запятая. Т.е. невозможно было бы различить где идёт перечисление имён переменных одного типа, а где начался новый тип.
К тому же Си допускает объявление только типа переменной, без его имени, а в Delphi так писать нельзя.

Добавлено 15-09-2022 в 12:45:

Дошли руки до тернарной операции. Ну это просто if с обязательным else.
Но встал вопрос, чем она оперирует? Выражениями или статементами?
Всю жизнь полагал, что только выражениями, ну сейчас вот проверил.

C++ Source Code:
void *a = NULL
bool result = a ? { true } : { false };

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

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211159

Старое сообщение 15-09-2022 09:45
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Как вы знаете, конструкторы\деструкторы есть даже у тривиальных типов.
Я правда хз, как это реализовано на уровне компилятора, потому что POD не считается классом, как это могло бы быть например сделано в том же Шарпе.
То есть это такой фейк, который не всегда срабатывает. Скажем в шестёрке вызов конструктора\деструктора надо непременно делать, взяв указатель на объект. Пример

C++ Source Code:
1
int	a;
2
int	*b = &a;
3
 
4
b->int();
5
b->~int();

Причём мякотка в том, что вызов конструктора - компилится, а на вызов деструктора шестёрка долго ругается, но прикол в том, что проблемы с вызовом шестёркой деструкторов были признаны официально и скорее всего в новых студиях это даже корректно скомпилируется.
Аналогичным образом осуществляется и доступ через точку
C++ Source Code:
1
int	a;
2
 
3
a.int();
4
a.~int();

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

C++ Source Code:
class Foo : public int
{
};

Шестёрка сразу ругается про неожиданный тип, но может свежие студии не будут?

Добавлено 17-09-2022 в 14:23:

Становится всё интереснее. Пример кода:

C++ Source Code:
1
int		a;
2
 
3
a.int( 0 );
4
 
5
Msg( "a: %d\n", a );

получаю предупреждение
Цитата:

warning C4700: local variable 'a' used without having been initialized

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

Добавлено 17-09-2022 в 14:46:

Ну чтож, последний тест, который даёт полное право утверждать, что вызов конструктора у тривиальных типов - это хак и фейк
C++ Source Code:
int		a;
 
a->int();

Даже вот такая конструкция прекрасно компилируется.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211176

Старое сообщение 17-09-2022 11:46
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12893
Возраст: 32

Рейтинг



Ух сложно. Дядя Миша скажи, а насколько твой синтаксис будет совместим с шарповым?

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Сообщить модератору | | IP: Записан
Сообщение: 211179

Старое сообщение 17-09-2022 13:12
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



С шарповым ровно настолько, насколько сам шарп совместим с С++.
Мой язык максимально близок именно к синтаксису С++, хотя есть и отличия.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211180

Старое сообщение 17-09-2022 13:27
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Дошли руки до ссылок. Насколько я знаю, очень многие путают ссылки с указателями и думают, что это практически одно и тоже, но не всё так просто. Поясню чем они отличаются. Я сам не заглядываю ни в какие исходники компиляторов С++, ну просто потому что там чёрт ногу сломит, дольше разбираться, поэтому не могу 100% утверждать, что оно там устроено точно также, но общий смысл всё равно сохраняется - просто исходя из логики и семантики самого языка. Так вот смысл в том, что указатель - это пользовательская конструкция. Мы туда вручную записываем какой-то адрес, например тот, который вернул malloc и взятие адреса на какую-то переменную. В то же время, компилятор сам активно берёт адреса на те или иные объекты, которые не становятс от этого типом указателя.
Например доступ в структуру так или иначе осуществляется по указателю.
Берём адрес на начало объекта, прибавляем смещение до желаемой переменной. Адресс есть, а указателя нет. В чистом Си подобные конструкции надёжно скрыты внутри компилятора и пользовать не имеет к ним доступа. Ну а в С++ дали возможность работать с подобными адресами.
Вот такой адрес и есть ссылка. В чём разница? Когда мы передаём аргумент на указатель в функцию, то на стек помещается копия адреса этого указателя. То есть мы можем изменять содержимое по указателю, но вот сам указатель изменять уже не можем. Точнее можем, но эти изменения не повлияют на сам аргумент, переданный в функцию. Для выхода из положения можно воспользоваться указателем на указатель, но вы без меня знаете, что это самая стрёмная и неудобная конструкция в Си С++, потому что понять где и что именно мы меняем уже почти невозможно. Две звёдочки ещё туда-сюда, а вот на четырёх-пяти, у меня уже полностью выключается мозг. Вы спросите, куда нужно столько звёзд? Ну например массив двухмерных матриц.
Но есть и еще важный момент. У класса, переданного по ссылке могут быть пользовательские операторы, например []. А теперь угадайте с трёх раз
к чему будет применён оператор [], если взять указатель на класс? Ну правильно, к самому указателю
Со ссылкой такого не происходит, понятно.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211184

Старое сообщение 18-09-2022 08:39
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 00:09. Новая тема    Ответить
Страницы (11): « 1 2 3 4 [5] 6 7 8 9 » ... Последняя »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Флуд > Заметки на полях
Разработка С++ совместимой виртуальной машины
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024