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.
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.