Пример c global vs. instance отлично иллюстрирует что разработка ЯП – крайне непростое занятие. Всего лишь две простые фичи (перегрузка и области видимости) – а на их пересечении уже вопросы, баги и непонятки. Ошибиться легко. Сделать идеально - почти невозможно.
Часто слышу "каждый язык хорош под свою задачу". Это не правда: некоторые из них очень даже говно.
Некоторые отдельные даже более говно чем остальные. То есть существуют сорта. Давайте разбираться.
Во-первых, стоит отделить дизайн от имплементации. Если, например, нам кажется что в свифте ошибки компилятора могли бы быть и получше – это проблема именно качества компилятора, а не самого свифта.
Отделить этот вид проблем просто: стоит просто подумать, можно ли исправить ситуацию не вмешиваясь в сам язык.
Во-вторых, следует отделить внутренние условия от внешних. Например, некоторые языки (даже отлично спроектированные!) могут казаться плохими просто потому, что принятые в них подходы вышли из моды.
В эту категорию я бы смело отнёс и ObjC и Java. Оба - хорошие, ладные языки. Оба (в разной степени) впали в немилость из-за низких темпов развития на фоне общей архаичности.
Глеб Лукьянец