Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 175 176 [177] 178 179 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2641
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Брр... Я им придаю ровно то значение, которое они имеют. Так ответишь по существу или нет? Тут всего два пункта. я тебе уже отвечал. третий вариант: (типизированные) термы. Добавлено Цитата D_KEY @ Как это связано с обсуждаемым и вообще со ссылочными типами? Может еще о достаточно часто применяемом в С++ pimpl(вариант opaque pointer) поговорим ?это связанно с реализацией типов вообще, что мы тут и обсуждаем. Уфф. Поясни, не очень понимаю, в чем заключается твой ответ, как ты это видишь на практике и что будет пониматься под типом(опять же ближе к практике - для объектов и значений "простых" типов)? |
|
Сообщ.
#2642
,
|
|
|
|
Цитата D_KEY @ Или может ты мне хотя бы скажешь, где именно о ссылочных типах можно почитать что-то из теории? хз, в гугле наверное. вот некто Павел Наумов что-то пишет (не читал): * Добавлено Цитата D_KEY @ Уфф. Поясни, не очень понимаю, в чем заключается твой ответ, как ты это видишь на практике и что будет пониматься под типом(опять же ближе к практике - для объектов и значений "простых" типов)? ээ... что вижу на практике? в Racket это работает. тип -- это [символ (метка), обозначающий некое множество значений] или [безымянный тип, созданый по правилам комбинации типов] и для объектов, и для "простых" типов это будет символ. однако реализации у них будут разными. |
|
Сообщ.
#2643
,
|
|
|
|
Цитата korvin @ в дельфи еще и внезапно поведение. и для объектов, и для "простых" типов это будет символ. однако реализации у них будут разными. |
|
Сообщ.
#2644
,
|
|
|
|
Этой малой ценой избавления от необходимости указывать единственную литеру & вас незаметно от вас лишили прекрасной прелести под названием "обощённость". Вы можете сколько угодно играть в неё дженериками, но получите только "универсальность". Мне, как автору шаблона, важно, чтобы операции над параметром-типом были теми, которые мне нужны, и делали то, что мне нужно. Если я хочу присваивание, то использую =. Если пользователь моего шаблона подсунет мне тип, в котором operator= отнюдь не делает копию правого операнда в левом, полностью уничтожая предыдущий контекст левого и сохраняя контекст правого неизменным, идиотом будет он, а не я. Если аналогично поступит сам язык, идиотом будет язык. Логично?
Конечно, нет, другого ответа я не ждал. Естественно это я идиот, что не подумал о том, что семантика operator= разная для разных типов. Поэтому я не пишу дженериков, а пишу шаблоны. В них, между прочим, я мог бы различить семантику, если бы вдруг понадобилось. Ирония в том, что это не нужно, а в дженериках вот нужно, но возможно ли?.. Ну естественно нет, потому что это я думаю, что нужно, а на самом деле не нужно. Потому что есть другие способы, которые "правильные". А конкретно тут вместо := для получения копии я должен использовать встроенную в язык фабрику. Ой, у Integer нет фабрики. Чьёрт (тьфу-тьфу-тьфу). Внимание - вопрос: занафиг мне такая универсальность, если в обобщённых шаблонах я просто либо ставлю &, либо нет? Так у кого из нас P.S. Про операцию присваивания - это я условно. На её месте может быть любая операция, контекстно-чувствительная к ссылкам vs значениям. Цитата DesweR @ Уверен? Посмотри на свой тип ещё раз. Он соответствует ТЗ? Уверен?? Дело видимо привычное, у меня, по крайней мере, никогда не возникало твоих вопросов и тем более каких-либо путаниц. |
|
Сообщ.
#2645
,
|
|
|
|
'yes' -это мультибайтовый символ в C/C++, а не строка.
|
|
Сообщ.
#2646
,
|
|
|
|
Цитата Adil @ в дельфи еще и внезапно поведение. я тебя шокирую наверно, но это везде так |
|
Сообщ.
#2647
,
|
|
|
|
Цитата korvin @ Цитата Adil @ в дельфи еще и внезапно поведение. я тебя шокирую наверно, но это везде так В Delphi - да, в C# - тоже. В той же Java переменные являются ссылками, просто для примитивных типов сделано исключение. Т.е. эта модель ближе к той, что я описывал. Если бы вместо особого поведения примитивных типов их сделали бы неизменяемыми - было бы идеально. Где еще? И я все жду от тебя более развернутого ответа, поскольку твой ответ для меня прозвучал через чур обще, я не понимаю, как это будет выглядеть на практике. Формально "значение" не может меняться, меняется только переменная(указывает на другое значение в случае ссылочной семантики или содержит другое значение в случае семантики значений). Добавлено Цитата korvin @ Цитата D_KEY @ Или может ты мне хотя бы скажешь, где именно о ссылочных типах можно почитать что-то из теории? хз, в гугле наверное. вот некто Павел Наумов что-то пишет (не читал) Спасибо, посмотрю. Цитата Цитата D_KEY @ Уфф. Поясни, не очень понимаю, в чем заключается твой ответ, как ты это видишь на практике и что будет пониматься под типом(опять же ближе к практике - для объектов и значений "простых" типов)? ээ... что вижу на практике? в Racket это работает. тип -- это [символ (метка), обозначающий некое множество значений] или [безымянный тип, созданый по правилам комбинации типов] и для объектов, и для "простых" типов это будет символ. однако реализации у них будут разными. Так замечательно. Как это связано с переменными ? |
|
Сообщ.
#2648
,
|
|
|
|
korvin вот смотри.
Присваиваем переменной x некоторое новое значение(псевдоязык): ![]() ![]() var x = new somevalue Теперь мы используем еще одну переменную: ![]() ![]() var y = x Меняем что-то через x. Должно ли меняться то, что нам доступно через y? ИМХО, но ответ должен зависеть не от типа, а от того, какая семантика принята в языке для переменных - ссылочная или значений. Зачем тут вводить зависимость от типа? Ради мифического удобства использования и/или из-за лени поставить лишний символ, обозначающий ссылку(для языков с семантикой значений) или копию(для языков с семантикой ссылок)? Т.е. например: Создание ссылки в языке с семантикой значений: ![]() ![]() var &y = x Или создание копии в языке с семантикой ссылок: ![]() ![]() var y = new x |
|
Сообщ.
#2649
,
|
|
|
|
Цитата D_KEY @ Так замечательно. Как это связано с переменными ?я не понимаю, что ты хочешь. ты пытаешься доказать, что все типы должны быть одного метатипа, я же говорю, что нет. а с переменными, в том-то и дело, это никак не связано (кроме приписывания переменной типа в стат.типизированных ЯП), поэтому я не понимаю при чем тут вообще переменные. Цитата D_KEY @ ИМХО, но ответ должен зависеть не от типа, а от того, какая семантика принята в языке для переменных - ссылочная или значений. это семантика не переменных, а типов. у переменных вообще не должно быть семантики, кроме типизированная/нетипизированная. |
|
Сообщ.
#2650
,
|
|
|
|
Заметил, кроме Дельфи и С++, все остальные упоминаемые языки - интерпретируемые. Для которые естественнее использование единого дерева классов и ссылок даже для простых значений. Передача в качестве параметров в функцию значений в их случаях не дает никакого выигрыша.
В случае С++ мы имеем, среди прочего, необходимость совместимости с С, в частности идеологической. В С все аргументы передаются только по значению. Исключение составляют массивы и функции, для которых используется псевдоссылочный метод (на самом деле передаются указатели, но специфика работы с указателями в С такова, что в данном случае они почти не отличаются от ссылок). Идеология передачи аргументов в С++ такова, что все они по умолчанию тоже передаются строго по значению. Исключение опять же сделано только для массивов и функций. Однако постоянно применять *var и var->... не очень удобно, поэтому были введены явно описанные ссылки. Однако иногда использование ссылок оказывается неэффективным, поэтому в новом стандарте ввели еще один тип ссылок. Дело в том, что С++ - промышленный язык программирования, используемый кроме всего прочего и во встроенных системах, и потому ориентированный кроме всего прочего на получение максимальной эффективности программы. Такой подход не позволяет реализовывать в языке некоторые чистые концепции, зато он оказался неожиданно хорош в плане обобщенного программирования. А концепции в результате оказываются вполне реализуемы существующими средствами. Дельфи, родившийся от учебного языка, не испытывает таких трудностей, и может позволить себе реализовывать "концепции" даже в ущерб эффективности как процесса программирования, так и в плане эффективности программы. |
|
Сообщ.
#2651
,
|
|
|
|
Цитата amk @ Заметил, кроме Дельфи и С++, все остальные упоминаемые языки - интерпретируемые. не все. Haskell, Ocaml, CL и Racket компилируются в машкод |
|
Сообщ.
#2652
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Так замечательно. Как это связано с переменными ?я не понимаю, что ты хочешь. ты пытаешься доказать, что все типы должны быть одного метатипа Ни в коем случае. Метатип описывает тип типа, а тут речь идет об экземплярах(точнее даже доступа к ним - т.е. переменных) типов, которых метатип не касается вообще. Цитата Цитата D_KEY @ ИМХО, но ответ должен зависеть не от типа, а от того, какая семантика принята в языке для переменных - ссылочная или значений. это семантика не переменных, а типов. Почему типов, если данное поведение касается только премененных и никак не связано ни с типами ни со значениями(если связано, то объясни как, почему и зачем)? Добавлено amk, речь не столько о явных-неявных ссылках и значениях, сколько о том, допустимо ли и нужно ли разделение на неявные ссылочные и не ссылочные типы. Т.е. вот этот вид типов всегда пораждает экземпляры, всегда являющиеся ссылками на данные некоторого скрытого типа, а другой вид типов порождает экземпляры, представленные значениями. |
|
Сообщ.
#2653
,
|
|
|
|
korvin, у меня большие подозрения, что ты плохо понимаешь, чем отличается компиляция и интерпретация.
По крайней мере половина перечисленных тобой языков (включая любимый тобой CL) принципиально не могут быть откомпилированы в машкод, максимум, что от них можно добиться - это последовательность вызовов подпрограмм - подпрограммный шитый код, который тем не менее считается интерпретируемым. |
|
Сообщ.
#2654
,
|
|
|
|
Цитата D_KEY @ допустимо ли и нужно ли разделение на неявные ссылочные и не ссылочные типы. Допустимо и нужно, вот к примеру строковый тип в Delphi - string, он имеет счетчик ссылок и автоматически увеличивает размер памяти под себя, переменная этого типа представляет собой указатель на значение, хранящиеся в динамической памяти. Преимущества "неявной ссылочности" этого типа: • эффективная работа со строками, при копировании строки - копируется только указатель, при изменении строки - создаётся отдельная копия; • нет необходимости вручную управлять памятью, она автоматически изменяется под размер строки; • не подвержен эксплойтам на переполнении стека, т.к. значение хранится в динамической памяти. Ещё примеры: динамические массивы, интерфейсы, анонимные методы, классы (тут уже холиварили, а пока С++ не научится корректно копировать их экземпляры (копирующие конструкторы для классов с иерархией наследования не подходят) или хотя бы отличать те экземпляры, которые можно копировать, от тех, которые нельзя копировать (концептов пока нет), то разговаривать не о чем). |
|
Сообщ.
#2655
,
|
|
|
|
Цитата amk @ korvin, у меня большие подозрения, что ты плохо понимаешь, чем отличается компиляция и интерпретация. По крайней мере половина перечисленных тобой языков (включая любимый тобой CL) принципиально не могут быть откомпилированы в машкод, максимум, что от них можно добиться - это последовательность вызовов подпрограмм - подпрограммный шитый код, который тем не менее считается интерпретируемым. ты уже второй раз несешь подобную чушь http://stackoverflow.com/questions/913671/are-there-lisp-native-code-compilers http://en.wikipedia.org/wiki/Common_Lisp#Implementations Цитата Most Common Lisp implementations compile source code to native machine code. а что с остальной "половиной"? Racket компилируется через промежуточную трансляцию в C (или C у нас тепереь тоже не компилируемый?), Haskell и Ocaml тоже + Ocaml имеет свой прямой компилятор. |