Створено нову мову програмування Ć: розповідаємо, які її особливості
Розробник із Польщі Петро Фусік заявив на GitHub про створення нової мови програмування Ć. Вона покликана вирішувати одну специфічну проблему: написання коду, який потім буде зручно використовувати в C, C++, C#, Java, JavaScript, Python, Swift та OpenCL одночасно.
Тобто програма на Ć після обробки транслятором cito буде однаково зручна для читання на будь-якій із вищезазначених мов, згідно з принципом найменшого здивування.
Особливості нової мови
Відомо, що синтаксис нової мови програмування схожий на синтаксис мови C#. Автор стверджує, що насправді навіть підсвічування синтаксису C# працює досить добре для Ć. Але при цьому Ć не є клоном C# або його підмножиною.
«Відмінності обумовлені необхідністю повністю автоматизованої трансляції в ефективний код на C і JavaScript зокрема», — пояснив Фусік.
За його словами, Ć є об’єктно-орієнтованою мовою програмування, оскільки більшість цільових мов є такими.
«Це можна розглядати як поліпшення в порівнянні з C, проте об’єктно-орієнтований вивід C досить простий у використанні для програмістів на C», — підкреслив розробник.
Який ще функціонал Ć
Він також розповів, що залежності від бібліотек рантайму мінімальні. Вивід на C часто є самодостатньою парою .c/ .h, яка містить код C99. Аналогічно, вивід на інших мовах не залежить ні від чого, крім стандартної мови.
Управління пам’яттю нативне для цільової мови. Якщо в цільовій мові доступний збирач сміття, то він використовується. В іншому випадку (в C і C++) об’єкти і масиви виділяються в стеку для максимальної продуктивності або в купі для додаткової гнучкості. При виділенні в купі використовуються інтелектуальні вказівники C++.
Відомо, що робота над мовою Ć велася багато років, і ось вона нарешті доросла до «офіційного» оголошення.
Приклад коду на Ć:
public static class HelloCi
{
public const int VersionMajor = 0;
public const int VersionMinor = 3;
public const string Version = VersionMajor + "." + VersionMinor;
/// Returns `true` if and only if `x` is a power of 2 (1, 2, 4, 8, 16, ...).
public static bool IsPowerOfTwo(int x)
{
return (x & x - 1) == 0 && x > 0;
}
/// Calculates greatest common divisor of `a` and `b`.
public static int GreatestCommonDivisor(int a, int b)
{
// Euclidean algorithm
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
/// Checks whether the given string is a palindrome.
/// Note: empty string is considered palindrome.
public static bool IsPalindrome(string s)
{
int j = s.Length;
for (int i = 0; i < --j; i++)
if (s[i] != s[j])
return false;
return true;
}
/// Gets a boolean value out of strings `"true"` and `"false"`.
/// In other cases returns `defaultValue`.
public static bool ParseBool(string s, bool defaultValue)
{
if (s == "true")
return true;
if (s == "false")
return false;
return defaultValue;
}
/// Converts an unsigned integer from its decimal representation.
public static int ParseUnsignedInt(string s)
{
if (s == null || s.Length == 0)
throw "null or empty argument";
int n = s.Length;
int r = 0;
for (int i = 0; i < n; i++) {
int c = s[i];
if (c < '0' || c > '9')
throw "Not a digit";
// TODO: detect overflow
r = r * 10 + c - '0';
}
return r;
}
}
Найкращі коментарі пропустити