Pull to refresh

Comments 29

В Си хотя-бы статическая типизация (хотя и менее строгая чем хотелось бы). В С++ с типизацией еще лучше. А в динамических языках никогда не знаешь что в переменной: строка, число или еще что-то.
В Си хотя-бы статическая типизация (хотя и менее строгая чем хотелось бы).

Но при этом она там слабая aka неявная. Что при незнании чревато более трудноотлавливаемыми ошибками.


А в динамических языках никогда не знаешь что в переменной: строка, число или еще что-то.

А в C никогда не знаешь, что живёт в переменных типа void *.


Ну и во многих динамических языках появляются type hints, а в статических — auto/dynamic, так что границы размываются.

Ну все же void * обычно не идет как основа работы, лишь ввод/вывод и подобное.


Да и auto это не динамический тип, а автовывод типа. Но итоговый тип все ещё типизирован.

Не в переменных типа void *, а по адресу, на который указывает void *. Что находится в самой переменной — достаточно чётко определено, это адрес ячейки памяти в формате, специфичном для данной платформы.
Переменные типа void* это явное использование «низкоуровневой динамики». В более высокоуровневых языках есть всякие variant, any (C++/Boost), dynamic (C#) которые делают нечто похожее на динамическую типизацию. Но — только там где это действительно нужно, и это делается явно. Видя тип variant/any/dynamic, программист понимает, что вот конкретно здесь применена динамическая типизация. Как правило, понятно и для какой конкретной цели она применена. Против такой явной динамики я ничего не имею, наоборот это очень полезная штука. А вот если бы некий программист стал использовать такой динамический тип АБСОЛЮТНО ВЕЗДЕ вместо всех других типов данных, то это был бы кошмар:) Но ведь именно это и происходит в php/питоне/javascript…
Но ведь именно это и происходит в php/питоне/javascript…

Да, происходит. И нет, это не кошмар, это просто немного другой взгляд на вещи.


На языке со статической типизацией вполне можно выстрелить себе в ногу, причём в старом добром C это сделать куда легче, чем в ужасном динамическом питоне. В современных плюсах труднее, но тоже вполне можно.
И наоборот, на динамических языках вполне можно писать предсказуемые и понятные программы, даже с учётом того, что у переменных явно тип не определён. Крайне редко динамика вставляет палки в колёса, главное аккуратно ей пользоваться.


И я не топлю только за динамику, везде есть и плюсы и минусы. Плюсы типизации, какой бы она ни была, нужно использовать, а о минусах знать и стараться их избегать.
Ставить в плюс только лишь наличие статической типизации в языке (даже такой не очень хорошей, как в C), при этом ужасаясь любой динамической (даже такой хорошей, как в питоне) — извините, но это как-то однобоко.

Обычно там работают с интерфейсом объекта, а не с его типом) А интерфейс может быть реализован множеством типов.

UFO just landed and posted this here
Нужна гистограмма, нормализованная на количество проанализированных строк. Ясное дело, что кода на С\С++ больше, и ошибок там тоже больше.
Безопасность языка != Безопасность кода с гитхаба использующего этот язык
Количество уязвимостей в проектах, часть которых была заброшена до открытия этих самых уязвимостей с безопасностью языка кореллирует примерно никак?
Напомнило историю про «возможность выстрелить себе в ногу». Как по мне, так язык-«песочница» порождает недопрограммистов, которые просто не состоянии осознать все опасности, которые несет их код. Проверено на программистах java/php/python. Да здравствуют RCE при десериализации.

Ну уж конечно, лучше все писать на си, хотя о чем это я, сразу уж на ассемблере, чего мелочиться. Вот там реальный контроль, и реальное понимание, что делает с кодом процессор. Вот на них только тру программисты пишут) Я вам так скажу, каждой задаче — свой инструмент. Посмотрю я на вас, как вы в веб страницы на си писать будете)) или рабочий прототип веб сервиса 1 день, вместо 1 часа на питоне) Ну или кроссплатформенное приложение без перекомпиляции) Задачу можно решить разными способами, вопрос во времени и целесообразности использования конкретных инструментов)

М-м. А апач и nginx конечно на php написаны? Или ПО для Esp и прочих контроллеров, там конечно тоже процветают высокоуровневые скриптовые языки. Равно как и их интерпретаторы, виртуальные машины. биндинги с api ОС.
Web-сервис на С написать за час реально, просто для начала нужно изучить ентот самый html/css дабы подсунуть браузеру строки в нужном порядке.
Но если вы html/css не знаете, то и а питоне у вас за час только hello world получится.
А уж кроссплатформенность ява-приложений лучше не упоминайте. Всегда выясняется что у реального приложения внезапно весьма платформозависимые корни. Будь то работа с hardware или банальные файловые операции. Да я лучше перекомпилирую приложение под платформу, зато получу значительный выигрыш в ресурсах.
> М-м. А апач и nginx конечно на php написаны? Или ПО для Esp и прочих контроллеров, там конечно тоже процветают высокоуровневые скриптовые языки.

Как я и писал, каждому инструменту своя ниша. И не обязательно знать си или ассемблер, чтобы писать качественные программы с хорошей архитектурой (ну и обратное тоже верно).

> Web-сервис на С написать за час реально, просто для начала нужно изучить ентот самый html/css дабы подсунуть браузеру строки в нужном порядке.

Никто не спорит) Но на питоне все равно будет быстрее, просто потому, что там нет заморочек с явным выделением памяти, ее освобождением, проверок на границы массива и целочисленного переполнения и т. д. и т. п. Разработчик языка уже позаботился об этом, предоставив разработчикам на питоне думать над задачей и не отвлекаться на решение низкоуровневых тривиальных нюансов.

> А уж кроссплатформенность ява-приложений лучше не упоминайте. Всегда выясняется что у реального приложения внезапно весьма платформозависимые корни.

Вы это JetBrains расскажите, а то они видимо не знают, что есть куча проблем и продолжают с ними отчаянно бороться, вместо того, чтобы переписать все на си) Так же намного быстрее и проще.
За JetBrains не скажу, но вот у меня Atollic TrueSTUDIO на базе eclipse которая съела гигабайт памяти на редактируемом коде для микроконтроллера.
Кроме того у JetBrains платформозависимые разве что пути.

Когда я работал в Visual Studio, у меня эта софтина мало того, что тормозила жутко время от времени, так ещё иногда фризила компьютер на пару-тройку секунд. Чё он там делал, я не знаю, но работать в этой среде мне было очень некомфортно. Это же не говорит о том, что на чем он там написан (си++?) плохой язык) это говорит лишь о криворукости людей, его написавших.

В таком случае, нельзя говорить что язык A безопаснее языка B, потому что на языке B можно сделать ошибку. Особенно когда выясняется что наиболее сложные и ответственные функции у языка A реализованы как раз на языке B.
После нахождения дыры в Openssl только ленивый не форкнул ее или не бросился реализовывать tls на своем языке, но через некоторое время посыпались новости вида «Продукт N вернулся на openssl после нахождения детских ошибок в собственной реализации tls»

Обычно веб-сервисы не предполагают html/css, а работают с json/xml.

При этом libjson и libxml написаны на c либо c++. А когда производительность скриптовых языков начинает проседать, они берут c-шную библиотеку, используют unsafe и продолжают считать свое приложение полностью безопасным.

Это вы прям за всех разработчиков скриптовых языков утверждаете? Смело однако) Да, когда не хватает скорости, берут и пишут части на си. И это замечательно, потому что там, где нужна простота и решение бизнес задач, может вполне подойти скриптовый простой язык, который дополняется более низкоуровневым при необходимости. Ну и пишется везде по-разному, не стоит вот так легко всех записывать в горе программисты только по личным наблюдениям пары-тройки своих коллег.

Мой исходный комментарий был о том, что выстрелить себе в ногу можно используя любой язык. И когда на безопасном языке попытаются реализовать то, что небезопасно в опасном, то получат ровно тоже самое. Например, вы можете поднять производительность безопасного языка, но для этого вам придется использовать либо С либо ассемблерные вставки и тогда вся безопасность вашего приложения сведется на нет.
Насчет языков(не только скриптовых) использующих unsafe.
Python, java, go, perl, php и даже оплот безопасности rust используют.
Надо срочно придумать язык Joe++. Неуязвимый Joe++, лидер по безопасности, хотя ни одной программы на нём нет…

А потом кто-то его выберет как самый безопасный :)

Си — язык мягко говоря не молодой и в его случае за «безопасность» отвечает не язык, а программист. Но и для поиска уязвимостей в нём требуется большая квалификация, чем в скриптовых языках (привет Drupal, WordPress и т.д.). И тем более любой язык позволяет выполнить фокус с запросом в БД: «Did you really name your son Robert'); DROP TABLE Students;--?»
ИХМО самый безопасный язык это Haskell.

Но там нет range types. А в Аде есть.

Тем не менее для систем с повышенными требованиями к надежности программное обеспечение пишут преимущественно на таких языках как си, ассемблер и Ада, главное придерживаться определенным правилам при проектировании и тестировании.
Фигня, простите мой язык, какая-то — и исходная статья WhiteSource, и перевод.

Примерно так же можно утверждать «самым неграмотным языком является марсианский» — собрав статистику о том, что именно в доступных текстах на марсианском больше всего грамматических ошибок.

Язык — только инструмент. Ошибки совершает человек. Все эти перечисленные уязвимости — или в алгоритме (когда не имеет значения язык реализации), или в конкретном коде (который может быть равно опасным на множестве других языков).
Sign up to leave a comment.