Чи безпечна для Google мова?


14

ця сторінка http://golang.org/doc/go_faq.html пише:

Хоча Go має статичні типи, мова намагається змусити типи відчувати себе меншою вагою, ніж у типових мовах OO

Тож моє запитання саме в тому, чи безпечно він набраний із дженериками (як-от C #) або друкується (наприклад, JavaScript) або необов’язково (наприклад, параметр, суворий у Vb.Net)


@JamesMcNellis означає, що якщо тип виходить з ладу, це може бути лише тому, що я роблю тип-актор (будь-яка інша дія не повинна викликати виключення типу)
Pacerier

1
@ davidk01 Java буде компілювати (1 + "boo"), а Java досить безпечний. Цей вираз має певне статичне значення для нього, оскільки + перевантажений для String-об'єктів мовою, і всі примітивні літерали можуть бути підняті на типи обернутих об'єктів, які потім можуть бути перетворені в Strings.
Trixie Wolf

Відповіді:


26

Безпека типу не є безпекою чорно-білого типу чи ні. Це більше спектра і деякі мови можуть бути більш типу безпечні , ніж інші (і навпаки). Однак я думаю, що ти думаєш із C # vs. Javascript - це, мабуть, статичне введення тексту (коли перевірка типу відбувається в час компіляції) та динамічне введення тексту (коли перевірка типу відбувається під час виконання) - безумовно, це про що говорить FAQ.

Google Go статично набраний, але ряд функцій робить його "схожим" на динамічне введення. Наприклад, вам не потрібно чітко позначати свій клас як реалізацію будь-яких інтерфейсів. Якщо підписи методу вашого класу збігаються з тими в інтерфейсі, то ваш клас автоматично реалізує цей інтерфейс (різновид введення качок). Це корисно для розширення вбудованих класів та класів у сторонніх бібліотеках, оскільки ви можете просто створити свій інтерфейс для відповідності методам стороннього класу, і він автоматично його реалізує.

Безпека типу - це фактично інша "вісь" типової системи. Наприклад, C - це статично набрана мова, яка не є безпечною для типу - покажчики дозволяють вам робити все, що завгодно, навіть те, що призведе до краху вашої програми. Javascript вводиться динамічно, але також є безпечним для типу: ви не можете виконувати операції, що призведуть до збою вашої програми. C # здебільшого безпечний для типу, але ви можете чітко позначити ділянки коду, які є, unsafeі робити речі, які вже не є безпечними.

Google Go також є безпечним для типу, в тому сенсі, що ви не можете зіпсуватись із типами та збоями програми (немає прямого доступу до покажчиків).


Якщо ви не використовуєте пакет "небезпечний", в такому випадку ви можете
зламати

Ви можете возитися з типами і мати доступ до покажчиків. І так, ви можете легко зламати свою програму, зробивши це.
вийшов

4

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


я цього не розумію, чи означає це, що безпечний код нетипового типу може бути скомпільований? (що неможливо в c #, якщо ми не використовуємо динаміку)
Pacerier

Виконання тверджень типу,
типово

Ок, коротше кажучи, у нього немає такого типу безпеки c # дозволяє?
Pacerier

Це робиться, якщо ви не вводите твердження.
dan_waterworth

5
@Pacerier: Цілком можна запускати помилкові вирази в C # без динаміки: просто вставляйте літери скрізь (що в основному є типом тверджень).
sepp2k

-1

Тип карти Go не є безпечним для потоків, він набраний статично. Він не має успадковування типів, загального програмування, тверджень, перевантаження методу або арифметики вказівників, і з поважних причин.

Безпека типу та безпека пам’яті є довгостроковими цілями, тут брехня є проблемою.

Безпека типу надає накладні витрати, в кілобайтах і мегабайтах, що є прийнятним. Go розроблений за допомогою MapReduce та "Big data", містить петабайт даних, де представлені проблеми продуктивності з безпекою типу, перевірка типу (бокс / розпакування) створює накладні витрати та забирає цикли від обробки.

Безпека типу може бути обмежувальною при підтипі та поліморфізмі та в типі качок (кинутий предмет на об'єкт), це створює небезпеку, а також простір, де такі мови, як Go, приносять велику користь. C ++ та Java не замінюються Go, це нова мова, яка допомагає розподіленому програмуванню та масово паралельній системі.

Велика заява Брюса Еккеля - "Go має набагато більше сенсу для класу проблем, які C ++ спочатку мала на меті вирішити", є дискусійним. C ++ - це дуже ефективна мова, і Boost реалізація MapReduce є дуже ефективною.

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


3
На жаль, мені потрібно більше репутації, щоб -1 ця відповідь. Безпека типу не є накладними, накладні витрати на виконання, безумовно, не вимірюються в одиницях байтів, і в програмі go є бокс / розблокування в сенсі Java. Статичне введення дозволяє компілятору робити більше оптимізацій, ніж може динамічно набрана мова. Зменшення карт не є ні тут, ні там, у тому числі з безпекою ниток.
Eloff

Ідіома Голанга про те, що ти стверджуєш типи, використовуючи порожній інтерфейс як загальну схему, щоб уникнути впровадження генерики як мовних особливостей, безумовно, не є чимось, що я вважаю б "безпечним", і, хоча це може зберегти специфікацію мови простою, коли проблема виникає (і це буде), він залишає складність на тарілці того, хто зараз залишився, щоб вирішити проблему за допомогою рулону каналу, який голанг називає особливістю. Це, звичайно, не схоже на мову, розроблену в останні 2 десятиліття, тому що існують мови, які набагато краще звертаються до безпеки типу.
tsturzl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.