Executando verificação de segurança...
1

Mais antigamente ainda não tinha o GOSUB tinha que se virar com o GOTO.

Nós usavamos um artifício, uma variável que armazenava o número da linha para a qual o programa deveria continuar.

1

Bem, é possível que a versão que vocês utilizavam não havia implementado gosub. Assim como algumas não implementavam READ/DATA (o que eu acho que seria bem interessante para a fase de testes nas linguagens atuais)

Busquei o manual do primeiro BASIC (1964) para confirmar. Tinha GOTO/GOSUB e me deparei com algo que não conhecia. Já era possível definir funções simples iniciando com FN e mais uma letra (até 26 funções) do tipo:

10 REM FND = DOBRO
15 DEF FND(X)=2*X
20 PRINT FND(4)

Como eram usados cartões, em vez de = era para entrar EQU, LSS para <, etc..

Moral: Aprendi algumas coisas que não sabia sobre BASIC (não vou usar mas não tem problema :D )

1

Provavelmente você aprendeu BASIC no CP500 não foi?
O CP500 tinha muita memória RAM.
Eu sempre fico feliz quando encontro algum programador da mesma época.

Eu usava BASIC em PCs mais simples; sem o GOSUB.

Haviam também os Sinclair com uma versão extendida; o Sinclair BASIC, com vários (ironia aqui) comandos a mais que os outros PCs, talvez uns 5 comandos a mais.

O DEF FN funciona de maneira semelhante ao #define do C, utilizando o exemplo que você deu, sempre que o interpretador BASIC encontrar FND(X) faz uma substituição por 2*X (mantendo o que encontrar no lugar do X); dessa maneira o programa não perdia desempenho em termos de velocidade, e ainda era possível utilizar o DEF FN com qualquer tipo de variável inclusive alfanuméricas.
Se ingnorarmos que o C é compilado e o BASIC interpretado, então DEF FN e #define são exatamente iguais.

Porém; não éra possível ter "Comandos" BASIC dentro do DEF FN, nem recursividade, nem multiplas linhas.
Não era possível por exemplo criar uma função que aguardasse o usuário digitar algo e então retornar um valor; nem uma função que pudesse ler de um arquivo e retornar um valor.
Apesar de ser uma função do ponto de vista matemático; não era uma função como as outras da própria linguagem e que morriamos de vontade de criar nossas próprias funções personalizadas; nada perto do que sabemos que é uma função numa linguagem de programação.
Isso foi introduzido mais tarde com o uso de SUB e FUNCTION.

Quanto ao GOSUB não foi implementado nos primeiros interpretadores BASIC por que esse comando necessitava de uma STACK para empilhar as linhas para as quais deveria retornar.

Observe que o manual de 1964 que você leu é do "Dartmouth Time Sharing System"; e anterior ao lançamento do primeiro processador comercial; o Intel 4004 de 1971. Acredito que raríssimos programadores tiveram acesso a esse sistema da Dartmouth.
Nessa época nem os bancos tinham computadores!

Os computadores só se tornaram acessíveis aos programadores após o Z80 de 1976; mas bem depois...
No Brasil os primeiros PCs foram fabricados em meados dos anos 80 e custavam o equivalente a dois carros zero quilômetros; e as leis de importação tornavam proibitivo importar um PC.

Alguns PCs dessa época tinham o interpretador BASIC na própria ROM que costumava ter 4 kB para caber o interpretador BASIC e era invocado logo após a BIOS, isso tornava possível baratear o PC pois não precisaria uma unidade de disquetes para rodar o BASIC.
Porém a RAM como era muito cara tinha no máximo 1 kB então o GOSUB foi suprimido evitando a necessidade de criar uma stack adicional só para esse comando.