> Быдло производители не пределали удобную рукоятку для забивания гвоздей к моему микроскопу. Меня как творческую личность лишили свободы выбора.
Указатели - не рукоятка. Это ФУНДАМЕНТАЛЬНАЯ функциональность, которую из-за её потенциальной опасности для быдла постарались заменить прикрученными с разных боков рукоятками и прочими костылями. И даже добились успеха в этом деле - быдло, по крайней мере, довольно.
Да хоть на ассемблере. Если это будет не в ущерб качеству.
Вот только сколько процентов сейчас программирует на нём? И, ведь, те кто на нём массово программировал 15 лет назад никуда не делись. Но - бросают. Задумайся над этим.
> У тебя электропитание через розетки подаётся или с голых проводов? Провода удобнее - переходников под буржуйские вилки не нужно.
> А на балконе перила есть? Ведь для внимательного человека они не нужны. А вид портят...
Некорректные аналогии. Розетками пользуются все и каждый день. Указатели ты можешь не юзать и не знать о них вообще. Специально для тебя придумали специальные средства "для дурака". Но не мешай другим, более сообразительным и внимательным, использовать указатели. А то получается позиция "если я не умею - нечего и другим уметь; ишь чего удумали - умнее меня быть!".
> Вот только сколько процентов сейчас программирует на нём? И, ведь, те кто на нём массово программировал 15 лет назад никуда не делись. Но - бросают. Задумайся над этим.
Это связано не с его опасностью, а с переносимостью. Прогу на C ты скомпилишь на любой платформе, для которой есть C-компилер. А ассемблер-код прибит гвоздями к процессору.
> Что значит "ФУНДАМЕНТАЛЬНАЯ функциональность" ? Мне не понятно. Приведи примеры задач которые нельзя решить без использования указателей ?
Можно решить практически любые. Но некоторое - проще указателями. Например, ковыряться в участке памяти, структура которого не представляет собой что-то стандартизированное типа xml. Его, конечно, можно загрузить в какой-нибудь string и ковырять его методами, но это - костыль.
Бродив по сети, я однажды наткнулся на такое утверждение (к сожалению не помню кто автор):
"Очевидно, что успех каждого конкретного проекта зависит не от языка программирования, а от понимания задачи, умения давать методам понятные названия, способности избегать дублирования кода и других общечеловеческих ценностей."
А лично мне C# понравился. Чем? 1) Простотой и лаконичностью (тут один человек утверждал, что исходник кривенько выглядит, так это по моему вообще не аргумент, как можно к такому придираться если языка не знаншь совершенно.) 2) Наличием удобного и быстрого ide 3) Возможностью использовать небезопасный код (в яве конечно тоже есть, не отрицаю, но подход в C# мне больше понравился) 3) Огромным кол-вом готовых компонент (это конечно не редкость для языка но всё же) 4) Простотой разработки gui
> Можно решить практически любые. Но некоторое - проще указателями. Например, ковыряться в участке памяти, структура которого не представляет собой что-то стандартизированное типа xml. Его, конечно, можно загрузить в какой-нибудь string и ковырять его методами, но это - костыль.
В этом примере не разкрывается принципиальная разница между указателем в Си и индексом массива в том же Си#. "Ковырятся" можно и так и так. Разве только в Си границы массива не чекаются. В чем заключается такая уж "фундаментальность" указателей ?
> В этом примере не разкрывается принципиальная разница между указателем в Си и индексом массива в том же Си#. "Ковырятся" можно и так и так. Разве только в Си границы массива не чекаются. В чем заключается такая уж "фундаментальность" указателей ?
В том, что это - базовый способ для прямой работы с памятью, непосредственно соответствующий таковому в ассемблере с его адресацией памяти через регистры. Если бы ты хоть немного знал ассемблер, то таких вопросов не задавал.
А по мойму вести споры С/C++ vs Java(не говорю о C#) просто глупо. Вас видно в школе не учили, что язык(ex: Java) рождается не просто так, а когда появляется задача и ищется более удобное средство для ее решения. Например писать бизнес приложения на Java очень легко и удобно. Зачем выдумывать велосипеды на С/С++, если парни из Sun уже все написали за вас?
По поводу C#... а здорово ли, что он весь такой для Windows? =)
> В том, что это - базовый способ для прямой работы с памятью, непосредственно соответствующий таковому в ассемблере с его адресацией памяти через регистры
Базовый для ЭВМ, но не для человека. Язык должен способствовать повышению уровня абстракции, а не просто предоставлять универсальные низкоуровневые средства. В функциональных языках прямая работа с указателями нужна только для взаимодействия с кодом на С.
> Бред. Программа обрабатывает данные вполне определенного типа и понятие "участке памяти" - полный бред.
Участок памяти - это то место, которое ты, дурень, выделил при помощи malloc (потом освободил при помощи free), сгрузил туда данные из файла или получил с карты в PCI-разъёме и теперь анализируешь на низком уровне. Это не php-быдлокодинг, повторяю ещё раз для особо одарённых. Это низкоуровневая работа.
> т.е. обрабатывается последовательность байт?
Да. Или 16-битных данных, или ещё чего, всяко бывает. И указатели, соответственно, бывают разных типов.
> Данные нужно из внешнего формата перевести в граф или массив и с ним работать.
Кому нужно? Тебе? А я тебя спрашивал? Зачем мне какие-то идиотские костыли, если то, что надо мне, я прекрасно сделаю указателями? Чтоб тебе понравилось, что ли?
>> Его, конечно, можно загрузить в какой-нибудь string и ковырять его методами, но это - костыль.
> Данные нужно из внешнего формата перевести в граф или массив и с ним работать.
И в процессе этого перевода придется использовать указатели (aka индексы байтовых массивов).
Вообще какой-то странный спор. Вроде все знают, что процессоры работают с байтами, а не объектами, и с указателями, а не индексами. В чем фундаментальность указателя? Да в том, что на любой современной архитектуре индексы массивов и ссылки на объекты реализуются указателями.
> В том, что это - базовый способ для прямой работы с памятью, непосредственно соответствующий таковому в ассемблере с его адресацией памяти через регистры. Если бы ты хоть немного знал ассемблер, то таких вопросов не задавал.
Значит указатели нужны в том случая когда необходим прямой доступ к некоторому участку памяти ? А где это надо кроме как в низкоуровневом программинге для железок ?
> Значит указатели нужны в том случая когда необходим прямой доступ к некоторому участку памяти ? А где это надо кроме как в низкоуровневом программинге для железок ?
Навскидку - в упаковке/распаковке данных в протоколах типа CORBA.
> Значит указатели нужны в том случая когда необходим прямой доступ к некоторому участку памяти ? А где это надо кроме как в низкоуровневом программинге для железок ?
А вот в "низкоуровневом программинге для железок" обычно указатели типизированные, ибо структура регистров известна заранее ;) То есть там досту не к "участку памяти", а к "объекту типа 'регистры устройства'", и этот тип известен на этапе компиляции.
>> Навскидку - в упаковке/распаковке данных в протоколах типа CORBA
>Чтоже там такого принципиального, что нельзя обойтись без указателей ?
Ты спросил, где используются - я ответил. Можно _принципиально_ ли там обойтись без указателей - не знаю. Но, исходя из того, что там пакуются/распаковываются данные заранее неизвестного типа, я не вижу, как там обойтись без манипуляции байтовыми массивами и использования указателей.
> Участок памяти - это то место, которое ты, дурень, выделил при помощи malloc (потом освободил при помощи free), сгрузил туда данные из файла или получил с карты в PCI-разъёме и теперь анализируешь на низком уровне. Это не php-быдлокодинг, повторяю ещё раз для особо одарённых. Это низкоуровневая работа.
О Великий Гуру! Не соблаговолишь ли ты снизойти с высот низкоуровненго оперирования данными до понимания, что данные из файла или PCI-платы ты получаешь определенного типа, скажем, массив double вполне определенного размера, и этот "участок памяти" содержит _последовательность измерений_ и именно эту последовательность измерений программа и обрабатывает, на не "участок памяти".
> Да. Или 16-битных данных, или ещё чего, всяко бывает. И указатели, соответственно, бывают разных типов.
Да ты что!?
> Кому нужно? Тебе? А я тебя спрашивал? Зачем мне какие-то идиотские костыли, если то, что надо мне, я прекрасно сделаю указателями?
Да ты просто гений! Правильно нафиг нужны алгебраические типы данных! Нафиг абстракцию!
> Ты спросил, где используются - я ответил. Можно _принципиально_ ли там обойтись без указателей - не знаю. Но, исходя из того, что там пакуются/распаковываются данные заранее неизвестного типа, я не вижу, как там обойтись без манипуляции байтовыми массивами и использования указателей.
Та-ак. Имеется ввиду необходимость прямой работы с указателями при наличии в языке алгебраических типов данных?
> Та-ак. Имеется ввиду необходимость прямой работы с указателями при наличии в языке алгебраических типов данных?
Извини, но в моем ПТУ "алгебраических типов данных" не проходили. Не является ли "байтовый массив" "алгебраическим типом данных"? Не являются ли наличие native в Java и unmanaged-кода в C# признанием того, что без указателей обойтись всё-таки нельзя?
Для человека базовым является русский, английский, немецкий и пр. Так, к слову.
> Язык должен способствовать повышению уровня абстракции, а не просто предоставлять универсальные низкоуровневые средства
Язык никому ничего не должен. Цель разработки языка - обеспечить решение определённого круга задач наиболее рациональным образом. Так вот, у каждого языка - свой типичный круг задач, но C (так уж повелось) - один из наиболее универсальных. На нём можно решить практическую любую задачу. А вот java - более узкий. На нём, конечно, пытаются решить и неподходящие для неё задачи, но выглядит это убого. C, как универсальному, указатели нужны. А в жабе можете творить что хотите - язык сей меня лично интересует очень мало, он заточен для обезьян и снабжён многочисленными защитами от тупой вероломной обезьяны.
>В том, что это - базовый способ для прямой работы с памятью, непосредственно соответствующий таковому в ассемблере с его адресацией памяти через регистры. Если бы ты хоть немного знал ассемблер, то таких вопросов не задавал.
Нескромный вопрос - тебе доводилось работать с архитектурами, отличными от x86?
> Значит указатели нужны в том случая когда необходим прямой доступ к некоторому участку памяти ? А где это надо кроме как в низкоуровневом программинге для железок ?
Не знаю. Полагаю, что в бизнес-приложениях от этого уровня попытались избавиться. Типичная обезьяна-кодер с указателями наделает кучу ошибок и потом не сможет их сама исправить, поэтому в языках типа java их убрали совсем. Но не потому, что это идеологически правильно, а потому, что дядьки из Sun поняли: пусть лучше индус родит громоздкий и тормозной код, который будет работать как надо, чем компактный и быстрый, который будет сегфолтиться. Просто бизнес, ничего личного.
Я и не говорил, что она есть. Наоборот, я считаю, что любой язык, претендующий на универсальность, имеет такую конструкцию (явно или неявно). Ибо указатели - фундаментальны :)
Хотя разница есть: "массив байтов" (точнее, индекс в нем) - это указатель в ограниченную область памяти. Это устраняет ошбку с сегфолтом (самую безобидную из всех ошибок работы с памятью).
Вообще разница большая. Указатели вообще говоря могут быть не только типа void*. Операции с массивами в любом маломальски развитом языке включают проверку на диапазон индексов. Да и сами массивы могут быть многомерными.
Удивительно, что господа защитники указателей не вспомнили указатели на функции, которые являются основой для реализации мощных механизмов абстракции.
>Вроде все знают, что процессоры работают с байтами, а не объектами, и с указателями, а не индексами.
Процессор не знает понятия "указатель". Только косвенную адресацию. И то не у всех. Более того, не все процессоры работаю с байтами. А вот с индексами - как раз многие работают. В том числе и пресловутые x86.
Забавно смотреть, как кто-то защищает низкоуровневый подход, даже не зная тонкостей низкоуровневого программирования.
Песец. Из-за таких личностей как ты я люблю этот форум. Только здесь, в обществе сторонников сферических коней в вакууме и абсолютной универсальности на своей шкуре понимаешь, что все в мире относительно.
Ааа, вот ты к чему... Я работаю с "традиционными" архитектурами - то есть, ничего похожего на "Эльбрус", iAPX432, Java-процессоры. Но так уж получилось, я знаю, как работает система ввода/вывода "Эльбруса" :)
>Вообще, "постоянно приходится" - с чем?
С одним отечественным DSP. Но начинал я на ЕС, потом СМ, x86, C51, PowerPC. На всех хоть немного поработал с ассемблерами.
> Вообще разница большая. Указатели вообще говоря могут быть не только типа void*. Операции с массивами в любом маломальски развитом языке включают проверку на диапазон индексов. Да и сами массивы могут быть многомерными.
Ну это отличия не в пользу указателей. О них я услышать не расчитывал.
Сам добавлю в пользу указателей (может и прозвучало, но не в явном виде): при помощи указателя можно представлять один и тот же участок памяти в виде данных различных типов. Это видимо используется, но редко. Обобщенного "зла" адресной арифметики в стиле Си нельзя искупить таким маленьким плюсом.
> Удивительно, что господа защитники указателей не вспомнили указатели на функции, которые являются основой для реализации мощных механизмов абстракции.
> О Великий Гуру! Не соблаговолишь ли ты снизойти с высот низкоуровненго оперирования данными до понимания, что данные из файла или PCI-платы ты получаешь определенного типа, скажем, массив double вполне определенного размера, и этот "участок памяти" содержит _последовательность измерений_ и именно эту последовательность измерений программа и обрабатывает, на не "участок памяти".
Это вопрос, как именно назвать сущность? Моя программа работает с данными типа X, на которые указывает указатель типа *X. То, что это какие-то там "измерения", программа не знает. Для неё есть последовательность данных какого-то типа. Ещё вопросы?
> Да ты просто гений! Правильно нафиг нужны алгебраические типы данных! Нафиг абстракцию!
На фиг _лишнюю_ абстракцию, которую придумывают от нечего делать. Нужна только та, от которой есть реальная польза.
> Та-ак. Имеется ввиду необходимость прямой работы с указателями при наличии в языке алгебраических типов данных?
Имеется в виду необходимость обработать данные наиболее быстрым и простым способом, не городя при этом избыточных сущностей. Указатели предоставляют прекрасную возможность сделать это.
> Вообще разница большая. Указатели вообще говоря могут быть не только типа void*.
Мы знаем :)
> Операции с массивами в любом маломальски развитом языке включают проверку на диапазон индексов.
Полезная фишка, спору нет.
> Да и сами массивы могут быть многомерными.
Правда? 8)
Вообще, о чем мы спорим? Я пытаюсь доказать, что указатели (понимаемые как "указатели на наименьшую адресуемую ячейку памяти") - вещь настолько фундаментальная, что даже в самом защищенном языке они присуствуют, ибо в некоторых случаях необходимы. Неужели с этим кто-то будет спорить?
Изначально, как я понял, речь шла о практической ценности указателей и их фундаментальной необходимости на уровне языка программирования. Именно в этом контексте "опускался" Си#
> Я опять не понимаю фундаметальной разницы между "указателем" и "массивом байтов" который есть в любом маломальски развитом языке программирования.
Указатель никак не связан с размером области памяти. Он просто указывает на ячеку памяти. Решение о том, какого размера будет область памяти, принимается уже в процессе выполнения программы (malloc). Далее я могу изменять его значение, путешествуя по этой области памяти, как мне угодно. А потом могу и освободить эту память при помощи free.
>Изначально, как я понял, речь шла о практической ценности указателей и их фундаментальной необходимости на уровне языка программирования. Именно в этом контексте "опускался" Си#
Ну, незаслуженно :) Вроде в unmanaged-коде указатели есть.
> Удивительно, что господа защитники указателей не вспомнили указатели на функции, которые являются основой для реализации мощных механизмов абстракции.
> Сам добавлю в пользу указателей (может и прозвучало, но не в явном виде): при помощи указателя можно представлять один и тот же участок памяти в виде данных различных типов. Это видимо используется, но редко. Обобщенного "зла" адресной арифметики в стиле Си нельзя искупить таким маленьким плюсом.
Струя газа в лужу. Это делается и с элементами массива. По крайней мере, я знаю языки, которые это позволяют. Это - не отличительная особенность указателей. Увы.
> Абстракция у них не в чести
Абстракция - не самоцель. Абстракция - это средство достижения чего-то (например, простоты для обезьян). Когда всё делается ради абстракции - туши свет, это болезнь.
Если я спрошу у тебя: а используя такую свободу указателей ты можешь ошибится и пропутешествовать немного не туда ?
Ты ответишь что-то в духе: Такие ошибки делают в основном только тупые обезъянки, а номральный программист никогда не ошибается. Даже если и ошибется случайно, то очень быстро ошибку найдет и исправит.