Por que eu tenho CERTEZA que Zig é o futuro do C

Ontem depois de algumas semanas aprendendo a linguagem Zig, eu fui fazer um teste, e nele eu entendi o porque tantas pessoas dizem que ela vai ser o substituto de C

Bem, eu não vou gastar seu tempo, eu prefiro mostrar do que falar

#include <SDL.h>
#include <stdio.h>

//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main( int argc, char* args[] )
{
        //The window we'll be rendering to
        SDL_Window* window = NULL;
        
        //The surface contained by the window
        SDL_Surface* screenSurface = NULL;
        
        //Initialize SDL
        if( SDL_Init( SDL_INIT_VIDEO ) < 0 ){
                printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
                return 0;
        } 
        
        //Create window
        window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if( window == NULL ){
            printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
            return 0;
        }
        
        //Get window surface
        screenSurface = SDL_GetWindowSurface( window );
        
        //Fill the surface white
        SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );
        
        //Update the surface
        SDL_UpdateWindowSurface( window );
        
        //Hack to get window to stay up
        SDL_Event e; 
        bool quit = false; 
        
        while( quit == false ){ 
                while( SDL_PollEvent( &e ) ){ 
                        if( e.type == SDL_QUIT ) quit = true; 
                } 
        }
        
    //Destroy window
    SDL_DestroyWindow( window );

    //Quit SDL subsystems
    SDL_Quit();

    return 0;
}

O codigo acima, é um exemplo que você encontra nos tutoriais do SDL

Mas o ponto aqui, é que Zig é uma linguagem que se propõe a ser compativel com C, então ontem eu fui fazer um test, eu queria rodar o SDL em Zig

E eu me convenci que a ideia de Zig substituir C era real, quando eu comecei a converter esse exemplo de codigo acima pra Zig, e foi algo bannal como um todo

Codigo em Zig

const std = @import("std");


const sdl = @cImport({
    @cInclude("SDL2/SDL.h");
});

const SCREEN_WIDTH = 640;
const SCREEN_HEIGHT = 480;

pub fn main() void {
    var window: ?*sdl.SDL_Window = null;
   
    var screenSurface: ?*sdl.SDL_Surface = null;
   
    if( sdl.SDL_Init( sdl.SDL_INIT_VIDEO ) < 0 ){
        std.debug.print("SDL could not initialize! SDL_Error: {s}\n", .{sdl.SDL_GetError()});
        return;
    }
    
    
    window = sdl.SDL_CreateWindow( "SDL Tutorial", sdl.SDL_WINDOWPOS_UNDEFINED, sdl.SDL_WINDOWPOS_UNDEFINED, 640, 480, sdl.SDL_WINDOW_SHOWN );

    if( window == null ){
        std.debug.print( "Window could not be created! SDL_Error: {s}\n", .{sdl.SDL_GetError()} );
        return;
    }
      
    screenSurface = sdl.SDL_GetWindowSurface( window );

    _=sdl.SDL_FillRect( screenSurface, null, sdl.SDL_MapRGB( screenSurface.?.format, 0xFF, 0xFF, 0xFF ) );
    
    
    _=sdl.SDL_UpdateWindowSurface( window );

    var e: ?sdl.SDL_Event=null; 

    var quit: bool = false; 

    while( quit == false ){ 
        while( sdl.SDL_PollEvent( &e.? )!=0 ){ 
            if( e.?.type == sdl.SDL_QUIT ) quit = true; 
        }
    }
  
    sdl.SDL_DestroyWindow( window );

    sdl.SDL_Quit();

    return;
}

Observerm, meu maior trabalho nessa conversão, foi trocar os NULL por null, ajustar as sintax de declaração de variavel, ao invez de

SDL_Window* window = NULL;var window: ?*sdl.SDL_Window = null;

O mais estranho aqui que você pode achar é o ? mas não se preocupe, ele só serve pra dizer que a variavel se trata de uma option e pode ser null

Acho que qualquer um concorda que é incrivel você ter uma linguagem moderna, com features modernas, um gerenciador de progeto build bem definidos e funcionais, com pleno acesso aos recursos de C ao custo de escrever @cInclude()

const sdl = @cImport({
    @cInclude("SDL2/SDL.h");
});

Se a necessidades de Wrappers como no caso do Rust, sem nenhuma outra complicação adicional, é só ser feliz daqui pra frente. Eu amo Rust, mas Rust não vai ser um subistituto de C, porque existem situações onde Rust é um escolhar horrivel dado suas caracteristicas que são suas qualidades, sem contar que Rust pode se integrar com C, mas esse não é o Ideal, visto que Rust trabalha melhor sozinho, visto que as maiores falhas de segurança que é o proposito de Rust, está nas vezes que ele tem que usar C

Por outro lado, Zig entrega toda a flexibilidade e simplicidade de C, e ainda mantendo compatibilidade e dando ferramentas pra você não ter tantos erros como em C

A questão principal de tudo no final das contas é : Pq substituir C ?No final se não houver um valor agregado muito grande nem vale pena trocar. É algo que reparo muito na comunidade de Rust, essa necessidade por refatorar coisas que ja funcionam muito bem em c++ ou c, simplesmente pra poder falar que agora esta em rust e rust é mais moderna. Do meu ponto de vista parece mais daquelas picuinhas de qual linguagem é melhor só que com outra roupagem. Posso estar completamente enganado, mas é a impressão que passa as vezes.

Sim, estás completamente certo. Quando se quer passar uma coisa para outra linguagem para poder continuar evoluindo algo até me acostumo com a ideia, mas sempre é a mesma coisa, passar pra rust pra dizer que ta em Rust e a desculpa é que em Rust tem segurança de memória. Porém as vezes eles dizerm que agora ta em Rust, mas é um wrapper pra rust então funciona em rust porém matando a filosofia da própria linguagem. Enfim rust é ótima linguagem, mas novamente por conta dessa grande quantidade de baba ovo deixa a linguagem saturada para alguns.
Nesse sentido sim. A comunidade rust tem uma tara em escrever em Rust até coisas que não foram feitas pra serem esc queritas em Rust como eu citei Mas o real motivo é que como você sabe provavelmente, hoje em dia é impossivel subistituir C, porque C, se tornou a api padrão do mundo do Software E o motivo pelo qual eu eu vi que Zig vai ter muito futuro, tomando o lugar de C, é pelos motivos que citei, ele não é muito diferente em sintax de C, é plenamente compatível em suas estruturas e tipo de C, e alem de algumas features e uma boa meta programação. Zig tem um processo de compilação de C, melhor do que C. No garal como você disse, conforme eu ia aprendendo Zig, eu também era da opinião de "só mais uma querendo desbancar C", mas quando nos meus estudos eu cheguei nessa parte de interoperabilidade que eu realmente vi que existia um futuro pra Zig

Bom que você falou sobre Zig, pois ontem eu assisti um conteúdo do Wainne dev do desempenho (ele fala mais em baixo nível).

Ele explica porque nem tudo pode funcionar em Rust. Um dos motivos é que se for fazer em Rust precisa matar a filosofia de Rust primeiro.

Mas no fim Rust é uma ótima linguagem, eu gosto do zig somente por conta do zcc, mas não sou muito fã da sintaxe.

Tem umas paradas que eu gosto na syntax de zig, apesar de achar que eles poderiavam fazer algo melhor na questão das Options e deferencias, ainda acho estranho escrever `variavel.*`