LINUX.ORG.RU
ФорумTalks

Вместо Python. Huawei создала собственный простой в освоении язык Cangjie

 ,


0

4

Huawei открыла доступ к своему фирменному языку программирования Cangjie, на разработку которого потратила, по меньшей мере, три года. Он ориентирован в первую очередь на ее собственную экосистему на базе платформы Harmony OS, которую Huawei развивает с 2019 г. в ответ на санкции Запада. Cangjie позиционируется как простой в освоении язык – этим же качеством на протяжении многих лет щеголяет Python. По словам разработчиков, этот язык ориентирован на создание «интеллектуальных приложений».

Название языка произносится не как «Кэнгжи», как можно было бы подумать, а «Цанцзе».

По словам разработчиков, Cangjie – это так называемый «мультипарадигмальный» (multi-paradigm) язык программирования, поддерживающий функциональное, императивное и объектно-ориентированное программирование.

Дополнительно в Cangjie есть встроенные механизмы безопасности. За счет них уязвимость и устранить в коде можно будет обнаружить сразу, то есть непосредственно в процессе его написания.

Особенностью Cangjie является наличие полноценной интеграции со средой разработки (фреймворком) AgileDSL, в которой объединены естественный язык и традиционное программирование. Тем самым существенно снижен порог входа для изучения и использования Cangjie для написания программ.

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

Пример кода

struct Rectanglel {
  let width1: Int32
  let length1: Int32
  let perimeter1: 0 →> Int32
  
  init (width1: Int32, lengthl: Int32) {
    this.width1 = width1
    this.length1 = length1
    this.perimeter1 = { = 2 * (width1 + length1) }
  }
  
  init (side: Int32) {
    this(side, side)
  }
  func areal (): Int32 { width1 * length1 }
}

https://www.cnews.ru/news/top/2024-06-24_vmesto_pythonhuawei_sozdala_sobstvennyj

Ссылка на документацию:

https://developer.huawei.com/consumer/cn/doc/openharmony-cangjie/cj-lan-spec

Пользуясь случаем, спрошу: а когда там уже Mojo будет готов, никто не в курсе?


Ответ на: комментарий от monk

Значит в примере в замыкание захватываются не поля, а значения аргументов метода, иначе в общем случае без this невозможно определить, что конкретно надо захватить - поля или локальные переменные.

shimshimshim
()
Ответ на: комментарий от shimshimshim

Да. Причём можно было бы написать с this и ничего бы не изменилось, так как поля константны. То есть, в любом случае получаем функцию, возвращающую константу.

monk ★★★★★
()
Ответ на: комментарий от sparkie

Что может быть проще Пайтона?

try:
	quota_chunks = quota_cache.apply(quota_chunks)
except InconsistentQuotaCache:
	print('Something went wrong')
	raise

print('All ok')

first_quota_chunks, quota_chunks = process(quota_chunks, 1)

Печатает

All ok
Something went wrong

Просто и очевидно?

monk ★★★★★
()
Ответ на: комментарий от monk

Интересный кейс, но так как воспроизвести его на основании только этого огрызка кода нет никакой возможности, то и принимать его всерьез не стоит. А вдруг вы всё врёте?

FishHook
()
Ответ на: комментарий от Shadow

Такое впечатление, что все, кто страдают от отступов, пишут код в notepad.

Ну вот мне приходилось страдать, когда надо было открывать и править скрипты в ненастроенном(с дефолтными настройками) виме. Да, я страдал.

Loki13 ★★★★★
()

Причем тут только питон, если это явно язык под ООП в стиле Java/Kotlin/Dart (под мобильную разработку, отож) с C синтаксисом.

ac130kz ★★
()
Ответ на: комментарий от monk

и компилируется в бинарник

А что под капотом, LLVM?

dataman ★★★★★
()

«Почему ты такой выродок? Ты же наш, Китайский!» (с)

Лучше б китайцы запилили что-нибудь с национальным колоритом. Например чтобы можно было композицию функций делать как в китайском делают новые слова через композицию иероглифов. Типа, если есть две функции foo и bar, то fooBarX означает foo(bar(x)). Было б хоть прикольно потыкать.

no-such-file ★★★★★
()
Ответ на: комментарий от Shadow

Если гипотетически появился язык с такой же богатой библиотекой, но без отступов — то на него перешло бы очень много народа.
Есть конечно руби, но он видимо уже навсегда останется языком одного фреймворка про который как обычно кто-нибудь скажет «а вот ваабщета его вон тама используют», но вообще его никто не использует (хороший показатель это насколько его установка с либами удобна на винде — руби в этом отношении труп).

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

Однострочные лямбды (да да снова они родимые) и тупорылые трай-блоки тоже шляпа.

Exmor_RS ★★★
()
Последнее исправление: Exmor_RS (всего исправлений: 1)
Ответ на: комментарий от Exmor_RS

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

А что не так с ruby было? Я какую-то master-master репликацуию на postgres на нём юзал, понравилось.

Думаю, дело не в отступах и не лямбдах. Вон, даже я с perl на python свалил. Ибо python тебя жёстко заставляет НЕ писать write-only. Потому и отступы. Потому и такой бешеный движ в разработке - легко разобраться в чужом коде.

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 2)
Ответ на: комментарий от Exmor_RS

то на него перешло бы очень много народа

Люди, которые профессионально пишут на питоне очень довольны отступами и хотели бы операторных скобок чуть меньше чем эпидемии холеры. Туда же и лямбды с траями.

FishHook
()
Ответ на: комментарий от flant

Поправил:

как { 
же { 
бесят { 
эти { скобки { ! } 
} } 
} }
- что бы ни писали любители скобок про форматирование, пишут в основном так.

Shadow ★★★★★
()
Ответ на: комментарий от monk

Там для декораторов nonlocal используется, а у тебя функция-конструктор создает две функции, которые хранят состояние между вызовами - чисто функциональный стиль

rtxtxtrx ★★
()
Ответ на: комментарий от Shadow

А что не так с ruby было?

У него одно время не было документации особо и был он написан непонятно кем, непонятно где, в отличии от питона который был написан понятно кем и понятно где (ну и поддержан кем надо).

Exmor_RS ★★★
()
Ответ на: комментарий от Exmor_RS

Мнения есть разные

Разумеется. И разница во мнениях заключается в том, что у разных мнений - разный вес. Есть мнение тех, кто пишет на питоне много, давно и серьезно. Есть мнение админа детского сада, который раз в год пишет скрипт на десять строк, хотя мог бы и не писать - пофиг. Последнее, конечно, интересно, как антропологический феномен, но в расчет его принимать не стоит, когда речь идет о таких серьезных вещах, как основополагающие принципы дизайна языка.

FishHook
()
Ответ на: комментарий от FishHook

Окай, если питон так хорош, то почему другие языки не перенимают отступы?
Где 50 диалектов яваскрипта с отступами, где I++ (он же си с отсутпами)?

На вновь яркие эпитеты могу противопоставить классику в виде стокгольмского синдрома — приходишь в большую компанию, там тебя заставляют писать на питоне и постепенно врастаешь в него боготворя отступы. (Попутно стараешься не вспоминать про переход с 2 на 3)

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

Exmor_RS ★★★
()
Ответ на: комментарий от monk

Да это понятно, плюс я в браузер без TS не хожу, оно мне сразу все ошибки подсвечивает.

Shadow ★★★★★
()
Ответ на: комментарий от Exmor_RS

то почему другие языки не перенимают отступы

перенимают, Скала 3 к примеру, yaml, haml, Haskel, CoffeScript, Nim, Elixir, Nemerle. Только вы, дорогой товарищ, почему-то не понимаете, что отступы хороши для языков с определенным дизайном, и например в JS с его вложенными замыканиями это будет плохое решение, или для Котлина, с его фичей в виде скоупов. Для питона отступы - это очень хорошо. Я не предлагал вам немедленно впиливать их в Си. Но вы кажется своей однобитной головой думаете именно так: «если отступы в питоне это гуд, почему их не внедряют везде»

FishHook
()
Ответ на: комментарий от FishHook

Скала 3 к примеру, yaml, haml, Haskel, CoffeScript, Nim, Elixir, Nemerle

Мертвы по прибытии к несчастью. Опять же без поддува гуглом.

Честно говоря не ясно чего же такого волшебного делают отступы в питоне, чего не достигается в других похожих скриптовых языках и главное как сложилась судьба питона если бы он был разработан в узбекистане, а руби в чикаго.

Exmor_RS ★★★
()
Ответ на: комментарий от Exmor_RS

Мертвы по прибытии к несчастью.

Началось…

- Никто не перенимает
- Вот А и Б переняли
- Ну... это не считается

Все с тобой ясно, можешь не продолжать, вес твоего мнения околонулевой

FishHook
()
Последнее исправление: FishHook (всего исправлений: 1)
Ответ на: комментарий от FishHook

Так ты приводишь такие примеры, а я говорю о чём-то уровня питона (по хайпу, шумихе, уровню использования) — и ямл это всё таки не ЯП.

Ну раст там, гошечка, ДИ (важно: не по хайпу и юзабельности, но по гугловости).

И опять же не вижу каких-то внятных аргументов по обозначенной тобою особой применимости отступов в рамках питона (и тому что в нём какая-то особая архитектура), которая ну вот прямо ну ваще дезигн и почему вдруг нельзя Си на отступах сделать (ПЕРЕЛЬМАН БЫ СМОГ).

Exmor_RS ★★★
()
Последнее исправление: Exmor_RS (всего исправлений: 2)
Ответ на: комментарий от Exmor_RS

Да потому что Си построен вокруг макросов, то есть кодогенерации. Для целей кологенерации язык с отступами противопоказан. Мисье может попробовать поупражняться сам в метапрограммтровании, когда важна структура текста программы. Уверяю вас, это увлекательно.

FishHook
()
Ответ на: комментарий от FishHook

Мисье может попробовать поупражняться сам в метапрограммтровании, когда важна структура текста программы.

Вот макрос на отступах:

определение-синтаксиса (определение-синтаксиса-цикла форма)
  выбор-синтаксиса форма ()
    (_ русский английский)
      #' определение-синтаксиса (русский форма)
           выбор-синтаксиса форма (для)
             (_ (для (А Б) . В) . Г)
               #` английский ((А Б) . #,(преобразовать-слова-цикла #'В)) . Г
             (_ (А Б) . Г) 
               #' английский ((А Б)) . Г
             (_ . А) 
               #' английский . А

Не вижу проблемы в многострочных макросах с отступами на Си.

Единственное, что потребуется - это дополнительное ключевое слово для блока:

x = x + 1;
{
  int x;
  x = 5;
  f(x);
}

=>

x = x + 1
block
  int x
  x = 5
  f(x)
#define MACRO(num, str) {\ 
            printf("%d", num);\ 
            printf(" is");\ 
            printf(" %s number", str);\ 
            printf("\n");\ 
           } 

=>

#define MACRO(num, str)
  block
    printf("%d", num) 
    printf(" is")
    printf(" %s number", str)
    printf("\n")
monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

Кстати, можно и без block. Просто трактовать увеличение отступа как блок

x = x + 1
  int x
  x = 5
  f(x)
#define MACRO(num, str)
  printf("%d", num) 
  printf(" is")
  printf(" %s number", str)
  printf("\n")
monk ★★★★★
()

Создавать язык и давать ему китайское название можно, но рассчитывать, что им будет кто-то пользоваться, кроме китайцев, сумеет не только лишь каждый.
По виду как Питон со скобками вместо оступов и с каким-то подобием вывода типов.

Virtuos86 ★★★★★
()
Ответ на: комментарий от monk

Не вижу проблемы в многострочных макросах с отступами на Си.

define FUNCTION(name) {
def name
}

FUNCTION(foo):
   print("Hello word")

Допустим, препроцессор всегда подставляет исходные отступы при подстановке кода в макрос. Пример выше должен работать, препроцессор увидит четыре пробела перед print и в итоге получим такой код:

def foo:
    print("Hello word")

и даже такое сработает:

FUNCTION(bar):
    FUNCTION(baz):
        for i in 1..10:
           print("Hello word")
def bar:
   def baz:
       for i in 1..10:
           print("Hello word")

А дальше придумаем такое:

define FUNCTION(name) {
    try:
}

define END {
   except Exception:
      log.error()
   finally:
      close()
}

и вот тут уже проблемы, потому что, ну допустим

FUNCTION(foo):
    print(1 / 0)
END

превратится в тыкву

def foo:
   try:
   print(1 / 0)  // УПС!!!
   except Exception:
      log.error()
   finally:
      close()
FishHook
()
Последнее исправление: FishHook (всего исправлений: 2)
Ответ на: комментарий от FishHook

Если у нас Си++, то

#define FUNCTION(name) void name() { try {
#define END } catch(...) log.error() }

С отступами получается

#define FUNCTION(name)
  void name() 
    try {
      
#define END 
  } catch(...)
    log.error()

FUNCTION(foo):
  print(1 / 0)
  END
monk ★★★★★
()
Ответ на: комментарий от monk

Если же делать макросы для питона, то придётся как в лиспе, чтобы макрос возвращал корректный AST, а не строку.

define FUNCTION(name &body body):
  def name():
    try:
      ,@body
    except Exception:
      log.error()
    finally:
      close()

FUNCTION(foo):
  print(1 / 0)
monk ★★★★★
()
Ответ на: комментарий от monk

С отступами получается

не получается, отступы у тебя все съедут.

  void name() 
    try {
  print(1 / 0)
  } catch(...)
    log.error()

а должно быть

  void name() 
    try {
       print(1 / 0)
    } catch(...)
       log.error()

Если же делать макросы для питона, то придётся как в лиспе, чтобы макрос возвращал корректный AST, а не строку.

Вот ты и ответил на вопрос «И опять же не вижу каких-то внятных аргументов по обозначенной тобою особой применимости отступов в рамках питона (и тому что в нём какая-то особая архитектура), которая ну вот прямо ну ваще дезигн и почему вдруг нельзя Си на отступах сделать (ПЕРЕЛЬМАН БЫ СМОГ).»

В Си по дизайну встроен текстовый препроцессор, который ничего не знает про AST. А в питоне кодогенерация нахрен не нужна, потому что он динамический и вся магия делается в рантайме. Вот поэтому нельзя взять сделать Си как питон, а питон как Си.

FishHook
()
Ответ на: комментарий от FishHook

не получается, отступы у тебя все съедут.

Нет. Фигурная скобка в макросе указывает, что следующую строку читать на один отступ вправо. А в следующем, соответственно, что текущая на один отступ влево от предыдущей.

monk ★★★★★
()
Ответ на: комментарий от FishHook

В Си по дизайну встроен текстовый препроцессор, который ничего не знает про AST.

Так в Си и не надо.

А в питоне кодогенерация нахрен не нужна, потому что он динамический и вся магия делается в рантайме.

Кодогенерация не ради вычислений при компиляции, а ради синтаксиса.

Например, чтобы можно было сделать так:

with trace:
    sum([x + 5 for x in range(3)])

@case
class Point(x, y): pass

p = Point(1, 2)

print str(p)    #Point(1, 2)
print p.x       #1
print p.y       #2
print Point(1, 2) == Point(1, 2) # True

И это можно сделать (правда с тележкой костылей): https://macropy3.readthedocs.io/en/latest/

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 2)
Ответ на: комментарий от monk

Например, чтобы можно было сделать так:

чтобы сделать так в питоне никакая кодогенерация не нужна, что ваш же пример собственно и демонстрирует

Фигурная скобка в макросе указывает, что следующую строку читать на один отступ вправо. А в следующем, соответственно, что текущая на один отступ влево от предыдущей.

опять мимо, потому что следующий синтаксис абсолютно валиден

try: print("Hello word")
except: print("No problem")
FishHook
()
Последнее исправление: FishHook (всего исправлений: 1)
Ответ на: комментарий от FishHook

чтобы сделать так в питоне никакая кодогенерация не нужна, что ваш же пример собственно и демонстрирует

В смысле? Это модуль, позволяющий кодогенерацию.

Примерно так:

def case_transform(tree, gen_sym, parents):
    outer = shared_transform(tree, gen_sym)
    tree.bases = parents
    assign = ast.FunctionDef(
        gen_sym("prepare_"+tree.name),
        ast.arguments([], None, [], [], None, []),
        outer,
        [hq[apply]],
        None
    )
    return [tree] + ([assign] if len(outer) > 0 else [])


@macros.decorator
def case(tree, gen_sym, **kw):
    """Macro providing an extremely concise way of declaring classes"""
    x = case_transform(tree, gen_sym, [hq[CaseClass]])

    return x

опять мимо, потому что следующий синтаксис абсолютно валиден

При чём тут это?

Я про Си и его макросы:

#define FUNCTION(name)
  void name() 
    try {
      
#define END 
  } catch(...)
    log.error()
monk ★★★★★
()
Ответ на: комментарий от ya-betmen

Пипец, видимо для него нужна китайская клавиатура!

Нет. Это сканер изображения не смог распознать ->.

monk ★★★★★
()
Ответ на: комментарий от monk

Я про Си и его макросы:

которые мы собрались применять к языку с отступами, и я вам на примере такого языка - питона - демонстрирую несостоятельность затеи

В смысле? Это модуль, позволяющий кодогенерацию.

да бога ради, но зачем?

@dataclass
class Point:
   x: int
   y: int

p = Point(1, 2)

print(str(p))    #Point(1, 2)
print(p.x).      #1
print(p.y)       #2
print(Point(1, 2) == Point(1, 2)) # True

во чудеса то!

FishHook
()
Ответ на: комментарий от FishHook

которые мы собрались применять к языку с отступами, и я вам на примере такого языка - питона - демонстрирую несостоятельность затеи

Нет. Который мы собрались применять к Си с синтаксисом с отступами.

Аналог END в питоне в принципе сделать нельзя, так как на этой строке функция уже закончилась.

да бога ради, но зачем?

Чтобы не писать x: int, y: int.

monk ★★★★★
()
Ответ на: комментарий от FishHook

А вот это сможешь?

with trace:
    sum([x + 5 for x in range(3)])

# sum([x + 5 for x in range(3)])
# range(3) -> [0, 1, 2]
# x + 5 -> 5
# x + 5 -> 6
# x + 5 -> 7
# [x + 5 for x in range(3)] -> [5, 6, 7]
# sum([x + 5 for x in range(3)]) -> 18

?

monk ★★★★★
()
Ответ на: комментарий от monk

Тогда ещё ладно. Конечно опять эти стремные вал, функт и паскалевская запись типов, но хоть блоки не отступами считаются и то ладно.

ya-betmen ★★★★★
()
Ответ на: комментарий от monk

Который мы собрались применять к Си с синтаксисом с отступами

ну так его для начала надо придумать этот синтаксис! Например, как должен выглядеть оператор do-while?

А вот это сможешь?

откуда ты это взял?

FishHook
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)