Які мовні особливості вважаються шкідливими? [зачинено]


20

Поясніть, будь ласка, чому і перерахуйте, на яких мовах реалізована (неправильна) функція. Наскільки ви знаєте.

Опублікуйте те, що вважаєте шкідливим, а не тим, що вам не подобається.



2
@sbi Ви також можете прочитати на цій же сторінці "XMLHttpRequest вважається шкідливим" ...
HoLyVieR

1
Всі вони кимось чи іншим вважаються шкідливими, за винятком базових виразів.
Девід Торнлі


3
@David Thornley: a = 1/0- основний вираз, шкідливий. ;-)
Включення

Відповіді:


37

Зареєструйте глобальних користувачів на PHP

Інформація: http://php.net/manual/en/security.globals.php

Це, безумовно, найгірша особливість, яку коли-небудь можна було застосувати з міркувань читабельності та безпеки. В основному всі отримані параметри GET перетворюються на змінні.

Наприклад, з цією URL-адресою: /index.php?value=foobar

Ви можете зробити наступне:

<?php
echo $value; // return foobar
?>

Коли ви читаєте код, дуже незрозуміло знати, звідки походить змінна.

Крім того, якщо функцією неправильно користуватися, це може призвести до зазору в безпеці. Ось приклад коду з php.net, який показує, як ним можна зловживати:

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

Це жахливо. Хоча я можу зрозуміти, що хочеться, утримувати його за замовчуванням абсолютно не має сенсу
TheLQ

14
Слід зазначити і підкреслити, що глобальні регістри не були включені за замовчуванням, оскільки PHP 4.2 (все ще в 2000 році) застаріло в PHP 5.3 (2009) і буде повністю видалено в PHP 6, але люди все одно продовжують повертатися назад до «глобальних реєстрів OMG» навіть через 10 років.

1
Досить безнадійний PHP
Ming-Tang

@SHiNKiROU Це не безнадійно, що ця функція застаріла і буде видалена в PHP 6.
HoLyVieR

1
Це не безнадійно, це лише настільки відстає від багатьох інших мов, що єдиною причиною, якою хтось користується, є те, що донедавна набагато простіше було придбати дешевий веб-хостинг для нього, ніж інші мови.
інтуїтивно,

22

Дозвольте Null за замовчуванням помилку "трильйон" * долар. Вибачте Тоні Хоаре. Майже кожна мова доступна на планеті.

Тоні Хоар пояснює

* Я скоригував вираз, придуманий Тоні Хоаром, щоб відобразити фактичну втрату за ці дні :-)


Це не особливість чи помилка, а, скоріше, відсутність функції. Наявність ненульових посилальних типів - це не те, що ви можете злегка перенести на мову; Це вимагає багато роздумів і гарного дизайну, і це дуже важко зробити так, що не хочеться битися з компілятором. Spec # і сингулярність показують, наскільки це важко.
imgx64

@ imgx86, ні, це, безумовно, помилка. Нерегульовані типи посилань - це функція, що додається у відповідь на помилку нуля, щоб дозволити сумісність із типовою системою, яка зазвичай дозволяє нуль.
Метт Оленік

@Kyralessa: Можливо, він хоче бути впевненим, що HoLyVieR отримує знак народника? :-) Я згоден, немає сенсу сприймати власну відповідь так.
Macneil

18

C і C ++ MACROS. Якщо мені колись доведеться побачити чергову помилку компілятора через те, що хтось обирає стандартне ім'я функції для свого макросу, який накручує мій код, я буду кричати. Давайте подивимось останнього порушника:

#define vector(int) new VARIANT[int];

Ааарг! Що ви зробили з моїм вектором STL !?


Розміщення імен - одна з речей, яка робить типів настрою та шаблонів відразу більш дружніми.
Shog9

4
Погоджено, але лише тому, що сучасні мови знайшли заміну для функціональності текстових макросів. Коли вони були винайдені, макроси були гарною річчю, оскільки технологія компіляції була настільки примітивною.
dimimcha

де ти знайшов цей макрос?
rwong

@dsimcha - я не знаю про це. Lisp макроси існують вже давно.
Джейсон Бейкер

2
@Jason: Я не стукаю "справжніми" мастерами AST у стилі Lisp, які все ще корисні та круті. Я ненавиджу лише макроси стилю C / C ++, які працюють виключно на текстовому рівні, не мають поняття сфери застосування, дозволяють створювати смішно протікаючі абстракції та заплутаний код і можуть бути повністю застарілими за допомогою більш сучасних функцій, один з яких, як не дивно. , є "справжніми" макросами.
dimimcha

14

Прорив за замовчуванням в операторах переключення C і C ++.


18
Це завжди корисна функція у всьому написаному кодом. Як це невдача?
greyfade

6
@greyfade: Це корисно, поки ви не забудете breakзаяву, або хтось додасть справу між двома справами (або повторно їх замовить), не помічаючи, що між ними стався провал . Я не бачу жодного способу, щоб прорив був кращим, ніж спосіб C # вимагати перерви або переходу до справи тощо.
Тім Гудман,

9
Прилад Даффа насміхається за вашу безкарність!
Джессі К. Слікер

3
я згоден. За замовчуванням це не є хорошою функцією.

11
Ніхто не читає? Він сказав, що
впав ПОВЕРНЕНО

13

Неявні перетворення типів, коли типи, що перетворюються між ними, не мають явного зв'язку. Наприклад, перетворення випадкового, нечислового stringв int, як у PHP.


7
Слід зазначити, що як тільки ти обіймаєш голову, ця річ стає проблемою. Це справді проблема лише в тому випадку, якщо ви не здійснюєте жодних перевірок у критичних областях для введених користувачем значень, але нескінченно корисні, якщо, скажімо, ви знаєте, що щось буде числом, але приходить як рядок. Наприклад, поле з БД, ймовірно, буде повернуто як рядок, і ви не хочете турбуватися про його введення.
Тарка

2
@Slokun: Чи можете ви придумати кращий приклад? Навіщо зберігати цілісні значення у db, використовуючи тип рядка?
Стівен Еверс

@SnOrfus Отримання номера, переданого в URL-адресі, введенні користувача, функціях та інших речах, спільних для нестатично введених мов.
TheLQ

Це також проблема C, оскільки значення кодованого рядка - це вказівник, який можна перетворити на ціле число, і це може створити конструкції, схожі на те, що вони можуть мати сенс правильно складати, але створювати дурниці. У C ++ ви можете визначити функції перетворення за допомогою ключового слова explicit, яке зупиняє конверсії неявного типу, але проблеми все ще є.
Девід Торнлі

@TheLQ: Якщо це введення користувача, вам доведеться перевірити його, щоб зрозуміти, чи є це число. Як сказав @Slokun Якщо ви читаєте дані з файлу, ви можете розраховувати, що числові дані будуть там, де це належить, але мати виняток у випадку збіднення диска часто краще, ніж просто випадкове 0отримання деякого значення.
інтуїтивно

12

goto : хоча нормально у рідкісних випадках, його частіше застосовують та призводять до важкого читання програм.


Добрий бог так. xkcd.com/292
TheLQ

3
Я бачив навпаки, коли дозволить розумне використання goto врятувало б програму від 3 мільйонів рядків коду.
Дейв

2
Ах, гіпербола ... Дійсна літературна техніка.
Роберт Харві

11

НІКОЛИ

Тільки тому, що функція часто зловживається, не робить її шкідливою.

ІМХО весь «вважається шкідливим» - це Reductio ad Hitlerum дискусійних мов програмування.

Більшість «шкідливих» особливостей більшості, якщо не всі, мають дуже правильний випадок використання або є просто зручними методами. Розробники розуміють плюси і мінуси і кодують відповідно.

Якби ваші запитання мали на меті відповідати "які мовні особливості мають загальні підводні камені чи нещасні побічні ефекти", моя відповідь була б іншою.

[редагувати] Щоб було зрозуміло: я не маю на увазі продовження використання застарілих методів. Якщо розробники знецінюють / видаляють функцію, вам слід скористатись заміною. Я маю на увазі концепцію про те, що нинішня частина мови вважається шкідливою, оскільки деяким не подобається те, що це заохочує, або компроміс, пов'язаний з його використанням, про що багато людей обговорюють.


13
Я не згоден, хороший зустрічний приклад - моя відповідь. Регістр PHP глобальний був просто поганим, не важливо, як ви ними користуєтеся. Ось чому це застаріло і настійно радимо ніколи не використовувати старішу версію PHP.
HoLyVieR

5
+1 Покладіть в чужі руки, будь-яка мовна конструкція шкідлива.
mouviciel

5
Хороше запитання ... навіть якщо 95% від GOTOS погано, сама функція все ще стоїть мати для інших 5%
EdS

1
Я думаю, це скоріше як поставити кнопку сидіння ежектора поруч із кнопкою включення / вимкнення радіо. Сама функція може бути не поганою, але не запобігає шкоді випадковим її використанням.
LennyProgrammers

1
Я думаю, що це програмний еквівалент "гармати не вбивають людей, а люди".
Увімкнення

7

Автовівіфікація (або інша функція прив'язки змінної на (призначити | використання)) - це функція, яку я виявив, що дає мені найбільше помилок.


+1 - Ми можемо не погодитись із цукром ітератора, але це те, з чим я можу погодитися на 100%.
ChaosPandion

7

PLEASEв INTERCAL. Не використовуйте його достатньо, він скаржиться. Використовуйте його занадто багато, він скаржиться.


2
Цю мову не слід використовувати серйозно. Він був створений як дуже "унікальна" мова програмування, тому він переповнений речами (наприклад, звідси - просто на мою думку), які не мають сенсу.
ShdNx

4
Я думав, що це буде очевидно, але так, я знаю, що це не серйозна мова.
Алан Пірс

2
Вибачте, деякі люди тут занадто серйозні.
Марк C

1
Щойно виявив мову минулого тижня у Вікіпедії та був здутий тим, наскільки вона була популярною (і досі ist O_O).
Олівер Вайлер

Існує ряд "викликових" мов, і вони завжди популярні, оскільки кодери, як правило, роблять цю роботу через любов до погоні. Також дуже популярні для запитань інтерв'ю, оскільки вони навмисно тупі, думки провокують і важко.
Увімкнення

7

Хоча деякі люди не згодні з людиною або різними речами, про які він каже, багато JavaScript Дугласа Крокфорда : хороші частини в основному це питання стосується JS. Серед скарг Крокфорда:

  • Глобальний діапазон за замовчуванням для всього (DC показує, як використовувати функцію / об'єкти як простори імен та роздільники діапазону, щоб це змінити.)

  • Висловлювання на кшталт with, чия поведінка відмов полягає у визначенні речей у глобальному просторі імен. (Gah! Це як девіз JS, якщо ви невдачі, то невдача як можна сильніше !)

  • Несподівана поведінка з ==оператором, яка в основному вимагає від вас завжди використовувати ===оператора.

  • Вставка крапки з комою.

Дійсно, цілу партію JS слід вважати шкідливою, можливо, навіть цілою мовою, але хороші частини просто настільки прокляті, що це щось на зразок (принаймні, для мене).


6

"Невдало мовчить" у Flash Player як поведінка за замовчуванням

Ок, насправді не особливість самої мови, але все ще досить тісно пов'язана.

Раптом програма Flash / Flex перестає працювати, і ніхто не може дати вам найменшого натяку на те, що сталося f *. Ні повідомлення про помилку, ні стек-трек, ні нічого. Просто так несподівано перехід екрану не відбувається (або відбувається зовсім неправильно), або кнопки більше не реагують на кліки, або комбоботи порожні, замість того, щоб заповнитись якимись записами.

Сама ця функція відповідає за кілька звітів про плечі та цілу купу сивого волосся, яке я отримую. -.- Хоча також не бажано вискакувати якесь криптичне повідомлення на обличчі користувача, воно може принаймні допомогти розробнику усунути проблему.

Але Flash Player залишає вас колоти в темряві, покладаючись на опис користувача (в той час як проблема може насправді виникати з зовсім іншого місця в коді, яке не має нічого спільного з тим, що робив користувач). Тільки якщо ви використовуєте програвач налагодження, ви фактично отримуєте спливаюче вікно із повідомленням про помилку та стек-треком.

Однак може бути досить цікавим перегляд фільмів із вбудованими фільмами на певних сайтах новин та отримання повторних повідомлень про нульові посилання від використовуваного вбудованого програвача SWF. : D


Додатки iPhone також виходять з ладу, не попереджуючи їх, у певні дивні терміни
Ming-Tang,

3
Мовчати без мовчання в чому-небудь досить паршиво.

6

В C / C ++: Ці призначення також є виразами, поєднаними з дуже подібними операторами присвоєння = і порівняння ==. Сама по собі не є шкідливою особливістю, але ввести помилки (іноді тонкі) помилки легко, випадково зануривши оператора.

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

... у поєднанні з тим, що ціле число або вказівник є дійсною умовою.
barjak

5

Отримайте доступ до модифікаторів на Java з типовою умовою приватної мови пакету та за умовчанням у режимі приватного програмування


5

Заміна невизначених змінних порожнього рядка в оболонці без будь - яких попереджень: rm -rf $nosuchvar/*.


+1 Арг! LOL - жахливий дефолт (і кумедний / страшний приклад)
забороняється

@ Проблема на зразок чогось ${varname:-/dev/null}може бути
вирішеною

Добре це свідчить про необхідність завжди захистно перевіряти існування та вміст змінних перед використанням.
Орлінг

4

Можливість повертати проти годинникової стрілки в LOGO. Wtf, дозволяє просто повертати 360 - xградуси за годинниковою стрілкою .


Що ж, минув час, коли я використовував LOGO. Чому це шкідливо?
Мейсон Уілер

5
Логотип можна використовувати для управління справжнім фізичним роботом черепахи. Іноді хочеться, щоб черепаха повернула певний напрямок, або поверталася не один раз. Наприклад, можливо, ви це програмуєте, щоб зробити якийсь танець.
Даніель Кассіді

@ Мейсон, Це мав бути жарт.
jjnguy

3
Так, особливо в LOGO For Clock.
інтуїтивно,

1
Я люблю логотип (див. Програмісти.stackexchange.com/ questions/ 21028/… ), і це відмінна мова викладання, особливо для молоді. Коли мені сказали 11 і вперше застосували Логотип, більшість мого класу не знала такої геометрії, але їм сказали, що це 90 чверть, і знають зліва направо. Таким чином, це не є негативною ознакою - те саме, що ми не множимо на взаємні звернення замість оператора поділу. Так, я знаю, що це жарт.
Увімкнення

4

Зупинення теми від іншої теми

На Java та іншою мовою ви можете зупинити потік з іншої довільно, не даючи часу для того, щоб потік, який ви зупинили, закінчив належним чином. Ця здатність була присуджена з огляду на величезну кількість проблем, які вона може поставити майже у всій ситуації.


Хоча я вважаю, що це може бути шкідливим, буває, що це надзвичайно корисно (наприклад, налагоджувач, що підтримує одиничні кроки та точки перелому).
Джеррі Труну

1
@Jerry Налагодження - це зовсім інша річ, вона не зупиняє процес, вона призупиняє.
HoLyVieR

скоріше навпаки, вона зупиняє нитку. Мабуть, ви говорите про вбивство нитки, а не просто її зупинку. Це трохи важче виправдати ...
Джеррі Ковф

Я не вважаю, що це обов'язково є мовною особливістю. Більш стандартна річ з бібліотеки.
Джейсон Бейкер

4

Змінні змінні в PHP

Просто тому, що ти $canне означає тебе$$should


1
Як завжди, Perl ... має (потенційно небезпечну) функцію, має простий спосіб найкращої практики її вимкнути ( use strict) та простий спосіб знову ввімкнути його саме в тих випадках, коли ви цього хочете ( no strict 'refs').

1
Я ніколи не знайшов використання для назви динамічної змінної. І єдиний раз, коли я це робив, він робив код нечитабельним і через кілька місяців WTF момент, коли я переглядав код.
TheLQ

Ммм, додатки включають метапрограмування з неприємними змінними пакунків інших людей або таблицею символів (яка, мабуть, є меншою).

1
@Joe Я б закликав вас показати мені один приклад, коли змінні змінні роблять рішення яснішим.
Кендалл Хопкінс

1
Цей коментар мав на увазі жарт, вибачте, що я цього не зрозумів, але, оскільки ви запитуєте тут, найкращий приклад, коли змінні змінні роблять рішення яснішим . Я визнаю, що це досить поганий приклад.
Джо D

3

WithЗаява в Delphi приходить на розум, хоча бувають випадки , коли це корисно.


Хороший випадок, коли я переніс щось із Delphi до Lazarus, і мій нащадок TControl містив "з Canvas do ... Width, Height", посилаючись на контрольні розміри, але Lazarus TCanvas мав власну ширину і Delphi, тому це призвело до неправильно складеного коду
Maksee


2

У Perl скалярний контекст проти списку може бути складним. У цьому є кілька хороших моментів, які роблять певні операції зручними, але час від часу ви стикаєтесь з чимось жахливим, як-от повністю змінити значення оператора (можливо, зі значної відстані в коді).

sub foo { (1..5) }
my @list = foo();           # (1,2,3,4,5)
my $length = scalar @list;  # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)

Це просто не правильно.

(Це виникає при спробі зробити щось, що діє на зразок звичайного оператора діапазону, тому ви можете сказати щось у циклі, як next if /start_regex/ .. /end_regex/).


Людина, яка так заплутана. Найгірше в тому, щоб навчитися Перла, намагався обійти мене.
Гленатрон

Я завжди вважав, що все, що дозволяє функцію повертатися кількома способами, було зручною зручністю.
Увімкнення

2

Синтаксис відносного імпорту Python 2.x. Припустимо, у мене є пакет, x.pluginsякий додає підтримку різних інших бібліотек для x. І припустимо, у мене є sqlalchemyмодуль, x.pluginsщоб я міг додати підтримку sqlalchemy x. Як ви думаєте, що станеться, якщо я додам наступний рядок до sqlalchemy.py?

import sqlalchemy

Відповідь полягає в тому, що модуль спробує імпортувати себе. Те, що робить цей синтаксис, по суті робить неможливим імпорт фактичного глобального пакету sqlalchemy. Python 2.5 додав спосіб вказати, що це відносний імпорт:

from . import sqlalchemy

... але лише після Python 3 перший синтаксис був фактично позбутий (хоча його можна відключити в Python 2.6+ з from __future__ import absolute_import).


1

sun.misc.unsafe - мій улюблений час; колекція "нам це було потрібно для втілення речей, але насправді, насправді, не думаю, що слід використовувати це".


7
Кожна добра мова повинна мати небезпечний пакет у стандартній бібліотеці. Імпорт цього пакета чітко показує ваш намір робити неповноцінні речі низького рівня. Альтернативи: 1) наявність небезпечних особливостей у самій мові (наприклад, C ++) та 2- необхідність використання іншої мови, наприклад C для виконання речей на низькому рівні (наприклад, Python та Ruby). Небезпечний пакетний підхід мені здається набагато кращим.
imgx64

1

Загальні блоки FORTRAN. Якщо ви зробили просту помилку, одна частина програми могла б обмежити глобальну частину іншої частини.

FORTRAN присвоїв goto оператор / COBOL alter оператор. Код, що змінюється самостійно. Небезпека, попередження, літаючі монстри спагетті !!


У FORTRAN не було заяви ALTER. FORTRAN мав заяву ASSIGN, з присвоєним GOTO. COBOL мав твердження ALTER, яке слугувало подібній меті.
Джон Р. Стром

@John - спасибі Моя пам'ять присвоїти / змінити тьмяна ... не в останню чергу тому, що мене вчили ніколи не використовувати.
Стівен C

1

Об'єктна орієнтація (з усіх мов, які набираються статично). Я ставлю ставку на те, що ця функція буде і продовжувати коштувати набагато більше, ніж нульові покажчики. Об'єктна орієнтація хороша лише в динамічній мові передачі повідомлень . Тому його слід відмовитись від динамічних мов, таких як Python (оскільки він не використовує передачу повідомлень, а звичайний виклик підпрограми).


Python підтримує (за всіма намірами та цілями) повідомлення про малі розмови, що передають ідіому. Це просто не названо так. По-друге, я думаю, що хоча б трохи дискусійно називати таку поширену мову, яка є всебічною, шкідливою.
Джейсон Бейкер

Об'єктна орієнтація все ще покращує повторне використання коду та інкапсуляцію коду / даних. Незалежно від статичного / динамічного використання функції.
Увімкнення

@Orbling: У порівнянні з чим? На мою думку, функціональні мови програмування мають більш високе повторне використання коду, і я думаю, що модульна система Haskell є досить хорошою для інкапсуляції коду / даних.
LennyProgrammers

@ Lenny222 Порівняно зі стандартним імперативним програмуванням. Я теж віддаю перевагу функціональному підходу, Haskell - моя краща мова.
Увімкнення

@ Джейсон Бейкер: звичайно, це дискусійно, але бути настільки всепоглинаючим - саме це робить його таким шкідливим! ОП попросив моєї думки, і я дав її. Тільки тому, що купа лемінгівського стрибка зі скелі не робить поведінку здоровою. У цьому випадку математично доведено, що ООП не працює, і правильна парадигма добре прийнята: теорія категорій - це спосіб представлення абстракцій (це насправді теорія абстракцій)
Іттріл

1

magic_quotesв PHP .

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

Якщо припустити, що він увімкнено, а потім запустить код у системі, де він не відкривається, відкриваючи широкі отвори для введення SQL.

Якщо припустити, що він вимкнений, а це не так, це призведе до того, що зворотні косої риси фактично зберігаються в БД, викликаючи некрасиві / неправильні рядки.

Також немає надзвичайно простого способу обробки обох випадків - вам потрібно перевірити, чи він увімкнено за допомогою, get_magic_quotes_gpc()а потім застосувати stripslashes()до всіх значень $_*масивів - оскільки array_mapце не рекурсивно, для цього вам потрібна спеціальна функція.


Або ви можете просто використовувати параметризовані запити.
Пітер Б

Навіть тоді ви отримаєте зворотний нахил, якщо магічні котирування включені, і ви цього не очікували.
ThiefMaster

-3

Мовна функція, яка дозволяє програмістам писати коментований або безглуздо коментований код.


1
І як це виправити?
Маньєро

1
@bigown: застосувавши функцію "коментувати чи відмирати": D.
тіа

3
Це називається грамотне програмування. en.wikipedia.org/wiki/Literate_programming
Баррі Браун

2
Це не особливість, але це надзвичайно відома помилка на передньому кінці користувача, більшість людей знають її за латинською назвою: Homo Sapiens.
Джо D

-3

виходити трохи на кінцівку тут - порожнечі функції. функція завжди щось робить, отже, вона повинна або повернути результат, або якусь іншу частину інформації щодо її успіху чи невдачі.


3
Паскаль мав процедури (без зворотного значення), а також функції (повернене значення).
Джон Онстотт

Функції завжди щось роблять (як правило, заповнювач функціонує комусь?) , Але часто не потрібно нікому про це розповідати.
Увімкнення

-4

POKE в ОСНОВНІЙ ...


7
POKE була приголомшливою.
Shog9

2
У перші дні трюк був єдиним розумним способом, коли ти можеш досягти певних речей в основному. Музика в Apple] [приходить в голову ...
Білл

2
Ви не могли б багато зробити без POKE на Commodore 64, якщо я правильно пам'ятаю.
MetalMikester

1
Не забувайте PEEK, обидва необхідні.
Увімкнення

-5

Я б сказав, що збирання сміття. Це не позбавляє від необхідності думати про управління пам'яттю, але виключає сприйняття необхідності думати про управління пам’яттю, яке занадто часто виключає фактичну думку, і тоді ви отримуєте величезні качани ресурсів і не знаєте чому. Особливо, коли поведінку сучасних поколінь ГК можна було б описати без надто великої гіперболи як "один великий витік пам'яті за рахунок дизайну".


2
Якщо у вас десь є посилання на якісь колекції, у вас є інші проблеми.
Chinmay Kanchi

2
Ось чому мови gc'ed мають слабкі посилання :)
Chinmay Kanchi

4
Хоча GC, безумовно, має як сильні, так і слабкі сторони, я мушу сказати, що у Мейсона набагато більше прав, ніж неправильних у цьому. Насправді я бачив, як люди, що використовують GC, витрачають багато зайвого часу на управління пам’яттю, тому що вони в кінцевому підсумку намагаються зламати речі після факту, а не планувати його наперед. GC також, як правило, запобігає детермінованому знищенню, що призводить до додаткової роботи з управління всіма іншими ресурсами, крім пам’яті.
Джеррі Труну

3
@ChaosPandion: Я справді дурень, якщо вважаю, що на сучасному багатозадачному апараті для того, щоб не вимагати збитків від роботи системи, пам'ять повинна бути звільнена якнайшвидше? Жоден GC ніколи не вдавався навіть наблизитися до досягнення цього результату, а насправді генераторний сміттєзбірник, який повинен бути найкращим, найсучаснішим сортом, робить саме навпаки: для найкращих показників його потрібно випустити пам'ять якомога пізніше . Я не бачу, що це як завжди правильний інструмент для будь-якої роботи, а не тоді, коли він уповільнює інші мої програми. Я дурень за це?
Мейсон Уілер

2
@Barry: це детерміновано в рамках програми. Якщо я закінчую з блоком пам'яті 5 Кб, то незабаром попросіть ще 5 КБ, що станеться? У системі, що збирається зі сміттям, їй потрібно запитувати новий блок 5 КБ, навіть якщо там ідеально хороший блок, який не використовується, якщо GC не працює в проміжку, і в цьому випадку ви можете переробити старий блок. З malloc та безкоштовно ви завжди зможете переробити старий блок. Помножте це на кілька сотень тисяч, і це стає справжнім питанням.
Мейсон Уілер

-5

C і, безумовно, C ++: Арифметика вказівника. Дозвіл людей перетворювати цілі числа в адреси пам’яті викликає проблеми.

А може взагалі навіть необроблений доступ до покажчиків?

У C ++ у вас є посилання, що робить покажчики майже зовсім непотрібними. Для решти випадків розумні покажчики слід вважати обов'язковими.

Java також доводить, що ви можете створити мову програмування, яка використовує покажчики, не дозволяючи людям отримувати доступ до самого значення вказівника.

Крім null... але це вже інша історія.


5
Покажчики, хоча часом важко використовувати правильно, дуже необхідні для великої кількості ефективних операцій з пам'яттю.
Білл

1
Правда. Але дозволяти людям регулярно перетворювати цілі числа в посилання на пам'ять або додавати числа до адрес пам'яті, на мою думку, в основному шкідливі. У C ++ у вас є посилання на ідеально гарну альтернативу та розумні вказівники / автоматичні вказівники на те, коли вам це справді потрібно, щоб бути вказівником.
Асгейр С. Нільсен

4
Ця відповідь справедлива лише в тому випадку, якщо ви працюєте над програмним стеком, створеним для приховування покажчиків. У всіх інших випадках ця відповідь неправильна.
Пол Натан

3
Деякі мови програмування повинні мати вказівники, щоб ви могли записати всі операційні системи та віртуальні машини для інших мов програмування.

2
-1. Існує причина, що вам потрібна арифметика ptr: Ітерація точки швидша, ніж індексація. for(int i=0;i<SIZE;++i) ++arr[i]повільніше, ніж for(int*i=arr;i<arr+SIZE;++i)*i++. Все, що вдалося довести Java, - це те, що вам потрібен вказівник, або ви ніколи не дивилися sun.misc.Unsafe? Якщо вам не потрібні вказівники, поясніть, як написати загальну функцію свопу за допомогою Java. (наприклад, int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). Не кажучи вже про всі проблеми в c / c ++, які виникли б у вас, якщо ви мали використовувати посилання. Як би ви назвали віртуальну функцію на непрозорій структурі без вказівників?
KitsuneYMG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.