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