Ошибка №1. Типизация в языке C
Запись от steelcraft размещена 18.06.2024 в 16:37
Показов 1738
Комментарии 17
|
Языки программирования множатся и развиваются. Мало кому удается изучить в студенчестве один язык и дотянуть с ним до пенсии (хотя, возможно, программисты на COBOL поспорят со мной). Большинству приходится время от времени изучать новый язык. Конечно, это требует времени. С опытом, конечно, дело идет быстрее; однако для достижения профессионального уровня все равно потребуется какое-то время. При этом хотелось бы максимально быстро получить хотя бы общее впечатление о языке: что он может, для каких областей подходит идеально, а для каких не очень, насколько выразителен будет код на нем и так далее. Для меня одной из важнейших характеристик языка является его типизация. Она накладывает отпечаток на многие, если не все, его свойства. По этой причине на собеседовании по C один из первых моих вопросов: какая типизация используется в языке? Ответ определяет дальнейший ход беседы. Если в ответ вижу недоуменный взгляд, передо мной начинающий (я не имею в виду календарный стаж, он может быть хоть 50 лет). Часто слышу ответ: "сильная типизация". Чуть лучше, кандидат начинает думать, хоть и ошибается. Спрашиваю: "почему?". Типичный ответ: "потому что при объявлении каждого объекта явно указывается его тип". Увы, спутал статическую типизацию с сильной. Что хочу услышать от кандидата. Языки бывают как со статической, так и с динамической типизацией. При динамической типизации тип объекта определяется в момент, когда ему присваивается значение, и может в дальнейшем измениться в ходе выполнения программы. Язык со статической типизацией обязывает при объявлении объекта явно задать его тип; этот тип останется неизменным в течение всей жизни объекта. Типизация может быть сильной или слабой. Языки с сильной типизацией при присваивании значения объекту требуют строгого соответствия типов. Языки со слабой типизацией допускают неявные преобразования типов (и не факт, что мнение компилятора на этот счет совпадет с вашими ожиданиями). Например, язык Ruby имеет динамическую сильную типизацию. Язык C (как и его кузен C++) имеет статическую слабую типизацию. Это не просто информация ради информации. Незнание этого факта неизбежно ведет к другим ошибкам. |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 17
Комментарии
-
Запись от alecss131 размещена 18.06.2024 в 23:05
-
Спасибо, упустил этот момент. Хотя, конечно, автору идеи добавить в язык auto (точнее, изменить смысл бесполезного и потому забытого ключевого слова) не мешало бы оторвать яйца.
Нет, я, конечно, понимаю, что сделано это было сначала с благими намерениями, для использования в темплейтах, где автоматический вывод типа бывает весьма полезен. Беда в том, что ленивые задницы начали тыкать auto куда ни попадя, делая код нечитаемым. Подумаешь, при чтении нужно делать за компилятор его работу, зато печатать меньше. Если бы я хотел писать на питоне, я бы писал не питоне, незачем ради этого калечить годный язык.
Слава богу, эта чума пока что миновала C.Запись от steelcraft размещена 19.06.2024 в 01:09
-
Неявная = динамическая?Запись от testuser2 размещена 19.06.2024 в 05:56
-
Нет, можно такие трюки и со статической делать (и делают, к сожалению). Просто тип объявляемого объекта определяется компилятором исходя из типа значения инициализации. И то же самое предстоит сделать читателю, поскольку слово auto никак ему в этом не помогает. Иногда это элементарно, иногда нет.Запись от steelcraft размещена 19.06.2024 в 10:54
-
Везде где есть "CopyMemory" наверное можно делать какие-нибудь трюки )Запись от testuser2 размещена 19.06.2024 в 11:36
-
Строго говоря, в динамически-типизированных языках, тип имеет само значение, а не ячейка памяти (размер ячейки), как в статически-типизированных языках. Вот почему, если язык типобезопасен (по Корделли), не имеет смысла вести речь о сильной или слабой типизации, так как эти обозначения слишком условны и расплывчаты. Как С, так и С++ обеспечивают типобезопасность во время исполнения, благодаря четкой спецификации возможных неявных преобразований типов, которые гарантируют, что значение не коррумпирует соседнюю ячейку памяти.Запись от CoderHuligan размещена 19.06.2024 в 14:54
-
Даже в случае C имеет смысл вести речь о слабой типизации. Эта тема всплывает, в частности, когда речь заходит об арифметике указателей. Очень многие тонут в ней.
Сообщение от CoderHuligan
Запись от steelcraft размещена 19.06.2024 в 21:51
-
Запись от AlexProgramm размещена 23.06.2024 в 10:01
-
На самом деле таких языков очень много. Например, столь популярный сейчас Python, JavaScript, Ruby, легендарный Smalltalk... После длительного использования языков со статической типизацией писать на них довольно непривычно.
Сообщение от AlexProgramm
Например, я поначалу упорно писал на Ruby в стиле C++, пока не попались на глаза несколько замечательных книг по идиомам этого языка. Оказалось, что писать на нем нужно совершенно по-другому. И дело сразу пошло на лад.Запись от steelcraft размещена 23.06.2024 в 13:52
-
Запись от AlexProgramm размещена 23.06.2024 в 17:12
-
Нет, в Java типизация статическая: все объекты должны быть объявлены явно, и в объявлении должен быть указан тип объекта, который останется неизменным в течение всего времени жизни объекта.
Сообщение от AlexProgramm
Фактически в первом приближении можно считать "продолжением" C++, из которого удалили большинство опасных элементов: указатели, множественное наследование и т.п. Поэтому типизация так и осталась статической. Правда, усилилась по сравнению с C++.Запись от steelcraft размещена 23.06.2024 в 19:03
-
Вот это неверно, начиная с языка версии 10 (а я почему-то думал что уже с 9, но не суть) ввели ключевое слово var , тем самым добавив неявную типизацию.
Сообщение от steelcraft
Это тоже спорно. Число плюс строка в С++ не вызовет ошибок, но на выходе будет мусор (надо использовать std::to_string для поведения как в джаве), зато джава просто добавит это число к строке в виде строки.
Сообщение от steelcraft
Я изза этого дропнул питон, он совсем мне не зашел. Но тут уже 2 фактора сказываются, динамическая типизация и полностью неявная типизация. Зато вот язык с неявной типизацией вполне пришелся по душе.
Сообщение от steelcraft
Такое особенно чувствуется когда идиомы языка идут с привычками и некоторыми принципами. Например те же с++/джава и думаю многие другие языки где "хороший тон" скрывать все поля классов, а для доступных извне делать геттеры/сеттеры, но внезапно попадается язык где так делать не принято (и есть специальные наблюдатели свойств в которых можно ограничить допустимые значения).
Сообщение от steelcraft
Еще бы я неявную/явную типизации разделил на полную/чистую и смешанную. Смешанная это когда можно делать и так и так или в одних случаях одно, в других другое. А полная где везде возможен один только тип.
Для пояснения приведу примеры. Смешанная будет в тех же java/c++/swift, там переменные можно объявлять без указания типа, но в функциях (параметрах) надо указывать тип (ну и или дженерик/шаблон, не суть важно). А чистая неявная будет в python, там везде (хотя могу ошибаться, язык знаю очень поверхностно) можно не указывать тип, даже в параметрах функций.Запись от alecss131 размещена 23.06.2024 в 22:43
-
Точно, спасибо. Всегда забываю про лазейки auto/var/...
Сообщение от alecss131
Не ошибаетесь, так и есть. Поэтому после долгой привычки к языкам со статической типизацией при написании функций/методов наступает ступор: мне же через параметры могут передать вообще что угодно, и что мне с этим делать? Нужно привыкать к новым идиомам.
Сообщение от alecss131
Запись от steelcraft размещена 23.06.2024 в 23:30
-
Запись от AlexProgramm размещена 24.06.2024 в 09:25
-
Да, именно так. В С++ нет интерфейсов, их заменяет идиома в виде класса со всеми чисто виртуальными методами. Насчет Java, как, наверное, уже заметили, я не очень в теме (имею представление лишь потому, что в книгах по ООП она часто используется в примерах), а вот в том же C#, который довольно похож на нее, можно наследовать только от одного предка и любого количества интерфейсов. Поэтому ромбы исключаются (а вместе с ними и некоторые случаи, когда множественное наследование действительно полезно).
Сообщение от AlexProgramm
Запись от steelcraft размещена 24.06.2024 в 10:20
-
В С++ есть виртуальное наследование котрое делает оный ромб очегь даже удобным инструментом. Хотя это опять же из серии С с классами. При помощи С++ (использвования шаблонов) есть более удобные и более производительные способы решения проблемы слабого базового класса чем множественное наследование, а тем более виртуальное множественное наследование.
Сообщение от AlexProgramm
Запись от Fulcrum_013 размещена 30.06.2024 в 14:55
-
Запись от Fulcrum_013 размещена 30.06.2024 в 14:59





