Switches from Java to JavaScript
Убрать из законодательства понятия "вредносная программа" и "взлом сайта" и предоставить программистам самим отвечать за качество своих продуктов перед пользователями, а не перекладывать вину на третьих лиц. Пора уже вырастать из детсада, не вечно же воспитателю будут приглядывать за детьми. Это будет хорошим стимулом к повышению качества как конечной продукции, так и методологий, используемых при её создании.
это дает преимущества обоих подходов: гибкость первого, и предсказуемость второго
Убрать из законодательства понятия "вредносная программа" и "взлом сайта" и предоставить программистам самим отвечать за качество своих продуктов перед пользователями, а не перекладывать вину на третьих лиц.Чем это отличается от убрать понятие "грабитель" и "насильник" и предоставить гражданам самим отвечать за качество своей защиты?
ps
можно предложить много кол-во атак от которых никакими программными методами не защитишься.
В частности, ты разрешаешь всем провайдерам между пользователем и сайтом официально использовать атаку человек по середине для всех соединений.
elimination of a divide between front and back-end development by having one teamЦелых два языка в одной голове (или хотя бы команде) никак поместиться не могут, это просто невозможно!
будущее всё равно динамическими языками статически проверяемыми
это дает преимущества обоих подходов: гибкость первого, и предсказуемость второго
Это вполне может оказаться правдой.
Но мне вот интересно: что это за статически проверяемая гибкость такая, которую нельзя иметь в статически типизированном языке? Т.е. нафига вообще нужна динамика при хорошей системе типов и их выводе?
Структурная типизация и row polymorphism вроде неплохо так справляются, даже если оставаться без зависимых типов.
Т.е. нафига вообще нужна динамика при хорошей системе типов и их выводе?и как системы типов помогают при решении задач вида:
у элемента взять все поля и вывести их на экран?
того же рода задачи:
взять все элементы и их поля и смаппить на бд
взять все элементы и их поля и сериализовать их в виде xml-я
взять все элементы и их поля из библиотеки Y и смаппить их на похожие из библиотеки Z
на такого рода задачах статически типизированные языки часто лишь мешают. Соответственно, динамика нужна чтобы обойти ограничения статически типизированных языков.
Либо через сериализацию, тот же haskell умеет через data type сериализировать, либо через рефлексию, статически типизированная java вполне умеет в это.
тот же haskell умеет через data type сериализировать, либо через рефлексию, статически типизированная java вполне умеет в это.это более-менее удобно для направления: внутренние типы данных преобразовать в данные для внешнего мира.
а вот с обратным направлением: на основе внешнего мира (например, по готовому xml-нику) сконструировать внутренние типы данных - всё обычно печально. Как минимум из-за того, что требуется время для того, чтобы все эти типы аккуратно описать.
и как системы типов помогают при решении задач вида:
у элемента взять все поля и вывести их на экран?
Внезапно, они позволяют узнать, какие у элемента есть поля, чтобы вывести их на экран.
D:
struct S {
int a;
string b;
}
void show(TT x)
{
foreach(m; __traits(allMembers, T
static if (!isSomeFunction!(__traits(getMember, T, m
writeln(m, " = ", __traits(getMember, x, m;
}
void main(string[] argv)
{
auto s = S(3, "lines");
show(s);
}
a = 3
b = lines
Внезапно, они позволяют узнать, какие у элемента есть поля, чтобы вывести их на экран.какие при этом преимущества по сравнению с динамикой?
foreach(m; __traits(allMembers, Tв итоге кода больше, чем на динамике, и никакой пользы от статической проверяемости типов
static if (!isSomeFunction!(__traits(getMember, T, m
writeln(m, " = ", __traits(getMember, x, m;
на основе внешнего мира (например, по готовому xml-нику) сконструировать внутренние типы данныхВот это похоже на ответ, спасибо. Хоть сам такой подход мне очень не нравится, представить, что кто-то захочет его применить, можно.
в итоге кода больше, чем на динамике, и никакой пользы от статической проверяемости типов
Правда больше? А как выглядит более короткий аналог на динамике, не пытающийся выводить не-данные?
Польза от статической проверяемости даже в таком простом куске есть:
1) гарантия того, что не попытаемся вывести поле, которое не умеем превращать в строку,
2) скорость: такой цикл будет развернут в серию вызовов для конкретных типов и полей, максимально специализирован, и имена полей тут просто константы, а не хранящиеся не пойми где в куче переменные.
Хоть сам такой подход мне очень не нравится, представить, что кто-то захочет его применить, можно.таких задач очень много.
БОльшая часть данных персистентная и лежит во внешнем мире: БД, xml, веб и т.д. В коде же требуется маленькую частичку этих данных взять, преобразовать и кинуть обратно.
И при этом, конечно, не хочется городить полноценную систему структурных типов параллельную таким же типам из БД, xml-я и т.д.
var s = {x:1, y:"zz"};
for (var key in s)
print(key + ": " + s[key])
for (var key in s)Синтаксис чуть покороче, но в целом то же самое. Особенно если добавить проверку, чтобы функции не выводились.
print(key + ": " + s[key])
Целых два языка в одной голове (или хотя бы команде) никак поместиться не могут, это просто невозможно!во-первых, поместиться могут, но ресурсы головы сильно ограничены (см. Дейкстру) и крайне ценные, тратим их попусту, получаем значительно худший результат, чем могли бы получить. Собственно, это в отчете и говориться Java+JS работало, но херово.
во-вторых, нельзя шарить код между клиентом и сервером
например, следующая функция:
взять на вход произвольную структуру и вернуть новый экземпляр с преобразованием всех полей в ненулевое состояние. С соответствующим изменением типов полей: тип поля T?/Option<T>/Nullable<T> преобразуется в T.
или "обратная" функция:
во входной структуре на основе определенного условия выборочно забраковать значения полей и заменить их null-ем. Тип поля при этом меняется с T на Option<T>
F# Type Providers не решают проблему?
F# Type Providers не решают проблему?они скорее решают первую проблему: получить объекты на основе внешних источников, но не решают напрямую вторую проблему: преобразовать структурный тип в почти такой же.
также на текущих статик-типизированных языках тяжело реализуются обобщенные функции над структурными типами.
Когда есть развитая компайл-тайм рефлексия (как в том же D или макросах Скалы это совершенно не проблема.
Другой вопрос, что многие из текущих языков не имеют таких возможностей, ну так я их и не имел в виду, а говорил о потенциальном будущем
Когда есть развитая компайл-тайм рефлексия (как в том же D или макросах Скалы это совершенно не проблема.пример можно?
ps
можно даже пример проще: смешать два структурных типа. Поля одной структуры подмешать к другой.
компайл-тайм рефлексияа навигация и рефакторинг будет работать?
смешать два структурных типа
Например, так:
string getFields(T
{
string txt = "";
T x;
foreach(m; __traits(allMembers, T
txt ~= typeof(__traits(getMember, x, m.stringof ~ " " ~ m ~ ";\n";
return txt;
}
struct Combine(A,B) {
mixin(getFields!A);
mixin(getFields!B);
}
struct S {
int a;
string b;
}
struct U {
bool c;
char d;
}
void main(string[] argv)
{
alias X = Combine!(S, U);
auto x = X(1, "hi", false, 'x');
x.a = 10;
x.c = true;
show(x); // определен в посте выше
}
выводит
a = 10
b = hi
c = true
d = x
Я в этом деле неопытный сварщик, возможно, можно проще и лучше, без манипуляции строками.
а навигация и рефакторинг будет работать?При должном взаимодействии компилятора и IDE, навигация и интеллисенс будут. С рефакторингом, наверное, сложнее. Но в целом я не вижу причин им быть хуже, чем в динамических языках, с которыми тут сравниваем.
И навигация? И интеллисенс? И, не побоюсь этого слова, рефакторинг?
Да, и эта, а при чём тут джава вообще?
И навигация? И интеллисенс? И, не побоюсь этого слова, рефакторинг?Это всё есть. Но в этом форуме упорно не понимают какого качества это всё для js.
Это всё есть.Каким образом оно может быть? Это же алгоритмически неразрешимая задача для динамических языков
Каким образом оно может быть?Оно есть вот в таком виде http://www.jetbrains.com/webstorm/features/
Это же алгоритмически неразрешимая задача для динамических языков
А ты, по видимому, имеешь ввиду нечто иное.
Каким образом оно может быть?Методом "beta than nothing". Никто ж там не обещает 100% точного решения. Сделал чуть умнее чем grep - уже хорошо.
а я уж испугалсо
продолжу и дальше писать код в саблайме
ну то есть ничего лучше нечёткого поиска всё равно не придуманона самом деле придумали, TypeScript это JS с возможностью добавлять навигацию и рефакторинг там, где тебе нужно.
TypeScriptвот я в принципе не понимаю этих костылей
зачем лепить статическую типизацию? Нахрена классическое ооп карячить?
JS хорош именно своей слабой типизацией и прототипно-ориентированностью.
зачем лепить статическую типизацию?тебе же хотел навигации и рефакторинга, вот пожалуйста.
Нахрена классическое ооп карячить?
Ты про классы? Это всего лишь одна из фич TS. Хочешь используешь, хочешь нет. Это не является какой-то принципиальной фичей.
JS хорош именно своей слабой типизацией и прототипно-ориентированностью.
JS является подмножеством TS, весь код на JS является кодом на TS. Всё, что есть в JS, доступно в TS. Просто сделали возможность добавлять по требованию навигацию и рефакторинг. Именно так и надо воспринимать TS. А не как новый язык со своими правилами: классический ооп и т.д. Просто добавили синтаксических фич в JS и всё. Иначе запили ли бы компилятор C# в JS, но этим путём уже многие ходили, и Хельсберг понимает, что это тупиковый путь.
тебе же хотел навигации и рефакторинга, вот пожалуйста.за такую цену оно мне нахрен не нужно
лучше погрепаю
за такую ценуза какую? что ты платишь?
JS хорош именно своей слабой типизацией и прототипно-ориентированностью.Не видел нигде чтобы прототипы как-то использовались. Везде они используются для эмуляции классов. Пример - coffeescript.
Корян манагер, сам не прогает. Прочитал новости и думает, что разбирается. Его сообщения это просто цитаты из новостной ленты. Более глубокий вопрос, и он уже молчит.
Чем это отличается от убрать понятие "грабитель" и "насильник" и предоставить гражданам самим отвечать за качество своей защиты?Тем что гражданин сам взялся участвовать в этом процессе, сам разместил сервер, либо же заплатил другому гражданину за представительство в интернете, и тот уже разместил сервер по поручению первого.
Можно рассмотреть другую ситуацию, где нет ассиметрии в возможностях осуществлять право, т.е. армия юристов и пиарщиков доступна одинаково пострадавшим и бенефицарам от компьютерных багов. Известно несколько разорений компаний, торгующих на бирже, вызванных сбоями в алгоритмах автоматической торговле на этой самой бирже. При этом пользу из найденного бага мгновенно и в автоматическом режиме извлекали умные алгоритмы других компаний, торгующих на бирже. И что-то я не слышал ни разу, чтобы результаты торгов отменяли.
Можно говорить, конечно, что компании эти гораздо профессиональнее пользователей, и потому в отличие от пользователей могут нести полную ответственность самостоятельно. Но это отвратительный аргумент, потому что без ответственности нет и свободы, и я не желал бы ограничивать свободу физических лиц в сравнении с юридическими.
Пора уже вырастать из детсада, не вечно же воспитателю будут приглядывать за детьми. Это будет хорошим стимулом к повышению качества как конечной продукции, так и методологий, используемых при её создании.Если в детсаду всем раздать по автомату Калашникова и оставить наедине друг с другом без воспитателя, то получишь некое подобие Сомали. Там каждый должен уделять значительное время думам о собственной безопасности, плюс стремиться использовать слабости остальных, чтобы нажиться, ведь власть не накладывает ни на кого никаких ограничений. Насколько сомалийцы развились с уходом оттуда зашоренных европейцев, можешь увидеть собственными глазами, съездив туда туристом
При этом пользу из найденного бага мгновенно и в автоматическом режиме извлекали умные алгоритмы других компаний, торгующих на бирже.это цивилизованная конкуренция, а ты предлагаешь разрешить нецивилизованную конкуренцию.
ps
существенное отличие. при цивилизованном взаимодействии - присутствует ограничение рисков.
Полное разорение за 40 минут - это ограничение рисков? Какой бы вирус не словил простой пользователь, вряд ли он смог бы нанести больший относительный урон.
Если в детсаду всем раздать по автомату КалашниковаГлупо думать о софте в терминах "щит - меч". Мол на каждое усиление защиты найдётся ещё более мощное оружие. Софт - это скорее "дождь против крыши". Когда в крыше нет дырок, то нигде не течёт, какой бы сильный дождь не шёл.
Полное разорение за 40 минут - это ограничение рисков?да, есть ограничение. Нельзя потерять больше, чем есть на счете.
ps
Через дыру же в ПО можно потерять сколько угодно много, вплоть до имущества; денег, которых еще нет (влезание в долги) и т.д.
Полное разорение за 40 минут - это ограничение рисков?во-вторых, можно предусмотреть многоуровневые защиты, которые фиксируют убытки, для произвольных дыр в ПО такое невозможно сделать теоретически.
Какой бы вирус не словил простой пользователь, вряд ли он смог бы нанести больший относительный урон.если вирус получил доступ к официальной цифровой подписи, то он даже квартиру и автомобиль простого пользователя может слить.
Как правило пользователи не используют цифровую подпись, вместо этого юзается двойная аутентификация. Это, видишь ли, пользовательский способ ограничить возможные потери.
Когда в крыше нет дырок, то нигде не течёт, какой бы сильный дождь не шёл.У любого софта есть ограничения, это следует из ограниченности инвестируемых в него ресурсов.
Кроме этого, дождь может быть кислотный, и вызывать наводнения.
А вообще я был не прав. Я тут вспомнил, что производители сердечных стимуляторов предпочитают security from obscurity, поэтому их больные, обычные пользователи, вполне могут потерять жизнь. Ну а что касается богатств - есть личное банкротство, аналогичное корпоративному.
У любого софта есть ограничения, это следует из ограниченности инвестируемых в него ресурсов.Ну можно сделать так, чтобы дырявый софт стал просто не выгоден. Перестать покрывать эти дырки за счёт государственной поддержки. Проблема, конечно, что тогда и для спецслужб не останется чёрных ходов.
вместо этого юзается двойная аутентификация. Это, видишь ли, пользовательский способ ограничить возможные потери.от дырки в ПО это не поможет.
Ну можно сделать так, чтобы дырявый софт стал просто не выгоден.100% софта имеют дыры, с точки зрения пересечения всех множеств, в том числе и только теоретически возможных, технологий атаки
если 100% софта будет не выгодно, никто не будет инвестировать в его разработку
ну и как следствие - откат к бумаге, карандашику, распишитесь тут, там, требуется личное присутствие, и не ебет, что нужно ехать в Магадан
Для торговли на бирже есть некий протокол. Всё, что подключается по этому протоколу, полностью отвечает за свои действия. Что мешает вести себя по отношению к протоколу TCP/IP?
ну и как следствие - откат к бумаге, карандашику, распишитесь тут, там, требуется личное присутствие, и не ебет, что нужно ехать в МагаданХа-ха. Уже сейчас есть безглючные решения для обычных пользователей. Просто больше будет зарабатывать аппл на iOS и гугл на chromebook, потому что они готовы брать риски клиентов на себя и квалифицировано решать вопросы компьютерной безопасности.
не корми эльфа
Ты же даже разницы между глюками и дырами не понимаешь, каким образом тебе удалось дойти до глубоких суждений о применимости закона, остается только гадать
Для торговли на бирже есть некий протокол. Всё, что подключается по этому протоколу, полностью отвечает за свои действия. Что мешает вести себя по отношению к протоколу TCP/IP?первый протокол очень узкий (небольшое кол-во команд описывает очень малую часть жизни и нулевая стратегия (ничего не делать) обычно позволяет остаться при своих.
для tcp всё наоборот.
Для tcp опасна нулевая стратегия?
Ну просвети меня насчёт дыр в экосистеме iOS. Я вообще-то верю, что сейчас возможно и есть парочка (помимо встроенных для пользования правительственными агентами но большая компания с очень высоким коэфициентом масштабирования вполне способна от них избавиться за разумную плату. Тебя же никто не заставляет писать идеальный код. Ты просто можешь построить многоуровневую систему защиты и дублирования функциональности, чтобы сделать систему в целом надёжнее отдельных её компонент.
Для tcp опасна нулевая стратегия?при наличии дыры - да
а что ты называешь нулевой стратегией в tcp? Я вот как-то думал, это ничего не посылать, ничего не принимать. И допустить дыру в реализации такой стратегии ещё сложнее чем в стратегии "ничего не торговать".
что ты называешь нулевой стратегией в tcp? Я вот как-то думал, это ничего не посылать, ничего не принимать.для роутера нулевая стратегия, очевидно, все пакеты пересылать.
Для http-сервера нулевая стратегия принимать запросы и передавать их приложениям
и т.д.
Тогда мы говорим о стратегии более высокого уровня, построенной поверх tcp, где уже работают конкретные приложения.
Вы в курсе, что "баги" есть и у человека в мозге?
Решение одного человека, у которого есть большой "управленческий рычаг" может разорить или даже убить много людей. Но на сколько часто это происходит?
Есть такие понятия как форс-мажор и управление рисками. Другий вопрос, что упомянутая компания (которая разорилась на бирже) либо не правильно управляла рисками, либо просто умудрилась выкинуть Zero на рулетке из миллиона делений.
Что же до спора "статическая типизация vs динамическая":
Основная задача программирования (как и вообще рационализации) — это увеличить экономическое плечо. А если по-простому — зарабатывать бабло.
Если грубо говоря одинаковый (в плане квалификации) человеко-час на языке X приносит больше прибыли, чем человеко-час на языке Y, то какой смысл использовать язык Y? (в прибыли я тут подразумеваю заложенные риски в плане багов)
Оставить комментарий
6yrop
типа JS захавает всё?IT отрасль неуклонно погружается во тьму средневековья?