Full stack - use a linguagem que quiser, mas que tal Pascal?
Introdução
Pascal está aí há um bom tempo (1970). É fato que o próprio Niklaus Wirth aperfeiçoou a linguagem (Modula, Oberon, etc.). Mas o Pascal original também sofreu melhorias e mantendo grande parte da compatibilidade com a versão inicial. Se o programa não inclui detalhes como acesso ao hardware ou alguma biblioteca inexistente, é bem provável que você compile um programa da década de 90 sem maiores dificuldades.
A linguagem já se demonstrou capaz em diversas oportunidades. Provavelmente a mais conhecida seja o sistema operacional do Lisa, primeiro computador da Apple com interface gráfica. O Photoshop, pelo menos até a versão 1.0.1, era em Pascal também. Troquei o C pelo Pascal quando descobri que era possível compilar um programa mais complexo em menos tempo do que compilar um Hello World em C.
Servidor
Para a parte do servidor, é possível utilizar toda a estrutura das versões atuais (Delphi/Lazarus) como acessar os maiores SGBDs com grande facilidade. Se é possível fazer um SO como o do Lisa, não existe muita coisa que você não possa fazer.
Cliente
Utilizando o Pas2JS o código em Pascal (limitando as restrições impostas pelo JS como acesso direto à memória e outras coisas) é possível emir código JS que pode ser utilizado por uma página web, nodeJS (servidor), Electron, Atom, VSCode e onde mais for aceito.
Exemplo
Página HTML
Tendo a seguinte página:
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>Animation</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<script src="animation.js"></script>
</head>
<body>
<div class="w3-container w3-margin w3-center ">
<div class="w3-bar">
<button id="id_animate1" class="w3-button w3-black">Top</button>
<button id="id_animate2" class="w3-button w3-teal">Bottom</button>
<button id="id_animate3" class="w3-button w3-red">Left</button>
<button id="id_animate4" class="w3-button w3-yellow">Right</button>
<button id="id_animate5" class="w3-button w3-orange">Fade</button>
<button id="id_animate6" class="w3-button w3-brown">Zoom</button>
<button id="id_animate7" class="w3-button w3-blue">Spin</button>
<button id="id_animate8" class="w3-button w3-blue-gray">Normal</button>
</div>
<p>W3.CSS Animation Classes.</p>
<div id="id_anim">
<h1 id="id_text" >Animation is Fun!</h1>
</div>
</div>
<script>
window.addEventListener("load", rtl.run);
</script>
</body>
</html>
Tirando o CSS, as únicas inclusões foram:
-
inclusão
animation.js
que será escrito em Pascal -
inicialização do script com
rtl.run
Programa em Pascal
Bah, que vergonha. Ou eu não sei salientar a sintaxe de Pascal ou o TabNew ignora linguagens que não possuem chaves. :P
program animation;
{$mode objfpc}
uses
BrowserApp, JS, Classes, SysUtils, Web;
type
TMyApplication = class(TBrowserApplication)
btAnimation:array[1..8] of TJSHTMLButtonElement;
clAnim,
lbText:TJSHTMLElement;
procedure BindElements;
function DoAnimation(aEvent: TJSMouseEvent):boolean;
protected
procedure DoRun; override;
public
end;
procedure TMyApplication.BindElements;
var
i:integer;
s:string;
begin
clAnim:=TJSHTMLElement(document.getElementById('id_anim'));
lbText:=TJSHTMLElement(document.getElementById('id_text'));
for i:=1 to 8 do begin
s:='id_animate'+i.ToString;
btAnimation[i]:=TJSHTMLButtonElement(getHTMLElement(s));
btAnimation[i].OnClick := @DoAnimation;
end;
end;
function TMyApplication.DoAnimation(aEvent: TJSMouseEvent):boolean;;
var
s:string;
i:integer;
cAnim : Array [1..8] of string = ('w3-animate-top','w3-animate-bottom',
'w3-animate-left','w3-animate-right','w3-animate-opacity',
'w3-animate-zoom','w3-spin','');
begin
s:=aEvent.currentTargetElement.Attrs['id'];
i:=RightStr(s,1).ToInteger;
if cAnim[i]='' then
lbText.innerHTML:='Pas2JS'
else
lbText.innerHTML:= cAnim[i];
clAnim.className:=cAnim[i];
end;
procedure TMyApplication.DoRun;
begin
BindElements;
Terminate;
end;
var
Application : TMyApplication;
begin
Application := TMyApplication.Create(nil);
Application.Initialize;
Application.Run;
end.
-
O método
DoRun
será chamado na inicialização -
O método
BindElements
será usado para mapear os elementos necessários e definicos com o respctivoid
na página HTML. Mapeou o texto que será alterado, a DIv que contém a animação e os diversos botões -
O método
DoAnimation
é o responsável pelo processamento após o respectivo botão ser pressionado. O nome dos métodos comoineerHTML
possuem uma correlação para facilitar a vida de quem já conhece.
No mais, achei o código legível. Quem adora chaves vai detestar.