기타

카루가 프로그래밍 언어를 만든다면? Ola 언어 소개

카루-R 2021. 5. 13. 16:24
반응형

프로그래밍을 하면서, "아, 내가 한 번 프로그래밍 언어를 만들면 어떨까?" 라는 생각을 한 번이라도 하셨나요?

그렇다면 반갑습니다. 저도 그래요.

C/C++/Go언어를 맛보면서, 이들만의 장점을 합치면 정말 어마어마한 언어가 탄생할 것 같았습니다. 물론 그게 말처럼 쉽진 않지만, 일단 제가 작성한 컨셉 사진들을 봐 주세요.

말 그대로 "컨셉"입니다. 실제로 존재하는 프로그래밍 언어가 아닙니다!

 

 

Ola 언어의(Over LAnguage) 기능을 간단하게 소개합니다. 더 간단해진 main() 함수, var/ptr/ref/arr/func/type 키워드, 향상된 for문, 쉬운 주석, 헤더 없는 print/scan 연산자, 그리고 C/C++/C#/Go의 편리한 기능 탑재 등등이 있는데요,

일단 하나하나씩 살펴봅시다.

 

 

더 단순해진 main() 함수

C언어에서 Hello, world!를 출력하려면 왼쪽에서 보다싶이 헤더를 포함하고, printf() 함수를 사용해야 합니다. Ola 언어에서는 그럴 필요 없이 entry 블록을 정의하면 다른 언어들의 main() 함수로 취급됩니다. 실행할 문장이 한 문장이면 중괄호를 생략할 수 있고, print는 연산자로써 별다른 헤더나 using, import 등을 필요로 하지 않습니다.

 

 

키워드

예시를 보시죠.

// C/C++ 
int age; // 정수형 변수 나이 선언 
char *str; // char* 선언 
std::string sstr; // 문자열 (인스턴스) 선언 
double arr[5]; // 길이가 5인 실수 배열 선언 
auto n = 10; // 10을 갖는 int형 변수로 자동 추론
 // Go 언어 
 var age int // 정수형 변수 나이 선언 
 var sstr string // 문자열 선언 
 var arr [5]double // 길이가 5인 실수 배열 선언 
 var n = 10 // 10을 갖는 int형 변수로 자동 추론 
// Ola 언어 
var int age // 정수형 변수 나이 선언 
ptr char *str // char* 선언 
var string sstr // 문자열 선언 
arr double array[5] // arr이 예약어, 변수 이름은 array 
var n = 10 // 10을 갖는 int형 변수로 자동 추론


var 키워드는 C# 및 Go언어에서 따왔습니다. 변수를 어디서 선언했는지 검색할 때 편하더라고요.

 

 

향상된 for문

C스타일 for문에서 세미콜론 ; 을 구분자로 쓰지 않습니다. | 을 대신 사용합니다.

그리고, Go언어의 for문처럼 괄호가 필요 없고, 모두 생략하면 무한반복, 조건식만 남기면 while문처럼 동작합니다.

또한, C++11의 범위기반 for문이나 C#의 foreach처럼 사용하려면 a <= arr 이렇게 하면 됩니다. arr 배열에서 a 변수를 사용하겠다는 겁니다. 용법은 아시리라 믿습니다.

 

 

쉬운 주석

그 쓰지도 않는 ` 을 주석으로 사용합니다.

` = //

`` ~ `` = /* ~ */

한 개 쓰면 한줄 주석, 두 개 쓰면 범위 주석입니다.

 

 

헤더 없이 작동하는 print, scan연산자

결국엔 연산자도 함수죠(...)

C++에서 C언어의 malloc() 함수를 new 연산자가 대체하는 걸 보고 기겁을 했습니다. 차라리 간단한 입출력정도는 언어 차원에서 연산자로 만들어줬으면 하는 마음에서 이렇게 만들어봤네요.

참고로, C#과 유사하게 using 키워드를 사용해 기능을 가져올 수 있으며, C++의 #include "" 를 대체하는 $using이 있습니다. 작업 디렉터리 내에서 using을 합니다.

물론 print 연산자는 using basic io 구문을 사용하지 않아도 작동합니다. 연산자니까요.

물론 헤더파일을 포함해야 작동하는 C++의 typeid나 <=>도 있습니다만....

 

 

C/C++/C#, Go의 편리한 기능 탑재

auto a = 10; // C++ auto 
var a = 10 ` Ola auto declare 

[]{ std::cout << "HI"; }(); // C++ lambda 
func() { fmt.Print("HI") }() // Go closer 
func{ print "HI" }() ` Ola closer 

using C
C.printf("%s", "Ola with C func") ` using C functions in Ola 

std::list<int> lt; // C++ STL 
var list lt<int> ` Ola SGC (약자를 까먹었습니다...Standard 뭐시기) 

int *p = nullptr; 
ptr int* p = null

 

끝으로 다양한 언어로 배열에 값을 입력받아 합계를 출력하겠습니다.

 

// C언어
#include <stdio.h> 

int main() { 
    int arr[5] = {0,}, sum = 0; 
    for (int i = 0; i < 10; i++) { 
        printf("값 입력: "); 
        scanf("%d", &arr[i]); 
        sum += arr[i]; 
    } 
    printf("입력된 정수의 합계는 %d입니다.", sum); 
    return 0; 
}
// C++20
#include <array>
#include <iostream>
#include <format>

using namespace std;

int main() { 
    int sum{}; 
    array<int, 5> arr; 
    for (auto &n : arr) { 
        cout << "값 입력: "; 
        cin >> n; sum += n; 
    } 
    cout << format("입력된 정수의 합계는 {}입니다.", sum); 
}
// C# 
using System; 

class Program 
{ 
    static void Main() 
    { 
        int sum = 0; 
        int[] arr = new int[5]; 
        for (int i = 0; i < 5; i++) 
        { 
            Console.Write("값 입력: "); 
            arr[i] = Console.Read(); 
            sum += arr[i]; 
        } 
        Console.Write($"입력된 정수의 합계는 {sum}입니다."); 
    } 
}
// Go 언어 
package main 

import "fmt" 

func main() {
    var sum = 0 
    var arr [5]int 
    for _, n := range arr { 
        fmt.Print("값 입력: ") 
        fmt.Scan(&n) 
        sum += n 
    } 
    fmt.Printf("입력된 정수의 합계는 %d입니다.", sum) 
}
// Ola 
entry { 
    var sum = 0 
    arr int array[5] 
    for n <= array { 
        print "값 입력:" 
        scan n 
        sum += n 
    } 
    print $"입력된 정수의 합계는 {sum}입니다." 
}
반응형