Langage rust

Руст, язык программирования для луддитов

Разработанный Mozilla для написания Servo, возможного преемника Firefox, он использует LLVM в бэкенде... и жесткий фронтэнд-кодер.

Код Руста доступен на Githube, язык интересует программистов, которые видят в нем возможного преемника C++ в своей области.

Слово «rust» в древнем английском означает рыжий и может быть намеком на лису, символ Mozilla. Это также название гриба (мы думаем о галлюциногене).

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

Вот мнение автора «Собора и базара» Эрика Рэймонда о Русте:

Даже самые упрощенные вещи вроде конкатенации двух строк персонажей неоправданно сложны. Язык требует большого количества нечеткого и темного ритуала, прежде чем ты сможешь что-нибудь получить.

Понятно, что создатели языка очень далеки от лудификации работы, а склонны скорее к луддитской склонности. Было бы лучше, если бы безопасность достигалась за счет более развитого бэкенда (см. Erlang), чем за счет увеличения работы по кодированию.

Как работает компилятор

Этапы создания исполняемой программы описаны на следующей схеме:

Сканер, а затем парсер производят AST-код (Abstract Syntax Tree). Для этого кода выполняется оптимизация.
Затем проводится семантический анализ, который выполняет множественные проверки. Версия компилятора 2016 года делает это в два этапа: создает промежуточный код высокого, а затем среднего уровня.
Следующий шаг - формирование кода LLVM, который делается из MIR и в сочетании с API LLVM. Есть выбор: Создать биткод или ассемблер или код объекта. В последнем случае редактор ссылок LLVM производит исполняемый код, специфичный для платформы.

Синтаксис языка

Сравним основные элементы Руста с элементами C или C++ или языка, модернизирующего эти новые элементы, которые встречаются во всех последних языках.

Показать в консоли.

Руст

fn main() {      
  println!("Hello World!");  
}

C

void main() {      
  puts("Hello World!");  
}
 
Отображение строковой переменной.

Руст

let str = "pourquoi ne pas faire compliqué";
println!("str: {}", str);

C

char *str = "quand on pourrait faire simple";
puts(str);
Когда указан тип String, для назначения строки необходимо указать, что это строка!

Руст

let alpha: String = "Beta".to_string();

C

char *alpha = "Beta"
 
В Rust все локальные переменные объявляются по let и являются постоянными! Нужно добавить mut-декларатор, чтобы снова их назначить...

Переменная по умолчанию в Rust

let a = 1;
a += 1;   // Erreur! 

Константа C

const int a = 1;
a += 1;   // Erreur! 
 
«Изменяемая переменная» в Rust - переменная (как и имя) в C!!!

Изменяемая переменная Rust

let mut b = 2;
b += 1;  // Ok

Переменная C

int b = 2;
b += 1;  // Ok
 
Тип определяется по выводам, но так как это может быть двусмысленно (а значит, не наверняка, надо это отметить), то была добавлена возможность опционального явного заявления. Принудительный характер языка хотел бы, чтобы это был синтаксис по умолчанию.

Явные типы Rust

let b : int = 2;

let ch : char = 'x';

Явные типы C

int b = 2;

char ch = 'x';
 
Кортежи - смешанные списки. Та же картина.

Кортеж в Русте

let t = (4, 5.0, false, "hello");

Смешанная таблица на современном языке

array t = [ 4, 5.0, false, "hello"]
 
Структура коммутатора переименована в матч, чтобы сделать больше. Главное, что она более проработана, как в Скале.

Матч в Русте

let x : int = 1;
match x {
  0 => { println!("Non trouvé"); } 
  1 => { println!("Trouvé"); } 
  _ => { println!("Défaut"); } // par défaut
}

Переключатель в C

int x = 1;
switch(x) {
  case 0: puts("Non trouvé"); break;
  case 1: puts("Trouvé"); break;
  default:
          println!("Par défaut"); 
}
 
Петля для вдохновленного Python - единственный случай, когда Rust проще C. Первые версии языка писали: for i in range (0, 10). Потом выяснилось, что синтаксис языка Script был лучшим.

Руст

for i in 0..10 {
  ...
}

C

for(i = 0; i <= 10; i++) {
  ...
}
 
Rust utilise une structure spéciale pour les boucles sans limite définie. Pas indispensable.

Rust

let ctr = 0;
loop {
  ctr += 1;
  if(ctr == 1) {
    break;  
  }
}

C

#define forever 1
int ctr = 0;
while(forever) {
  ctr += 1;
  if(ctr == 1) {
    break;  
  }
}
 
La déclaration d'une fonction montre bien l'aspect verlan de Rust par rapport à C! En-tête plus compliquée sans raison, retour plus simple mais inutilement moins sûr, ou est la cohérence?

Rust

fn mult(x: int, y: int) -> int {
  x * y
}

C

int mult(int x, int y) {
  return (x * y);
}

Lecture des lignes d'un fichier une à une...

Rust

let filename = "myfile.txt";
let f = try!(File::open(filename));
let mut file = BufReader::new(&f);
for x in file.lines() {
    let line = x.unwrap();
    println!("{}", line); 
}

C++

char *filename = "myfile.txt";
string line;
ifstream file(filename);
while(getline(file, line)){
   cout << line << endl;
}
 
Les struct servent de classes mais les méthodes sont déclarées séparément, ce qui est une option en C++.

Struct en Rust

struct Point {
    x: int,
    y: int,
}

impl Point {
    fn Start() -> Point {
        Point { x: 0, y: 0 }
    }
}

Class en C++

class Point {
    int x;
    int y;
    Point Start() {
       x = 0; 
       y = 0;
       return this;
    }
}

 

En conclusion, Rust a été conçu comme langage système pour remplacer C++ avec une gestion mémoire plus sûre, un point qu'on ne lui disputera pas. Etait-il nécessaire pour parvenir à ce résultat de changer la syntaxe et la rendre inutilement obscure? Les motivations des auteurs ne sont pas claires, car les défauts de C, à savoir les points-virgules (une erreur selon les auteurs de C eux-mêmes) sont conservés, mais la simplicité des déclarations ne l'est pas.
Les possibilités des éléments du langage ont aussi été restreintes pour réduire le risque d'erreurs. C'est quelque chose qui n'a pas réussi dans le passé à Pascal ou Modula.

Faut-il utiliser Rust?

Faut-il utiliser Rust, donc le choisir plutôt que Go ou C++? On mettra go de coté car il est plutôt en compétition avec les langages de serveurs comme Java, Python, PHP, un garbage collector peut être un inconvénienr, et son système de modules en ligne l'est encore plus, ainsi que l'absence de généricité.
Reste donc à choisir entre l'insécurité de C++ quand il est mal programmé, mais avec une liberté totale et la possibilité de réaliser ce que l'on veut, ou faire avec la syntaxe obscure de Rust pour une gestion mémoire plus sûre. Il y a de nombreuses raisons de rester en C++: des tonnes de bibliothèques, tous les outils de développements utiles, la vitesse d'exécution.

Référence : Manual de référence Rust (Anglais).

Projets similaires: Cyclone (ATT), Checked C (Microsoft).

Programming and data languages Asm.js - Бейсик - C - C++ - C # - Дарт - Эйфель - Го - Ява - JavaScript - Джулия - Паскаль - PHP - Питон - Пролог - Руби - Ла Скала - Скриптол - Свифт - TypeScript - HTML - Васм - XML - XAML - SQL