DOMANDA Creazione linguaggio di programmazione

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Salve a tutti,
mi sto cimentando nella creazione di un linguaggio di programmazione (e qui qualcuno potrebbe storcere il naso, perché i miei topic passati parlavano di argomenti differenti. Quindi preciso, giusto per non inimicarmi nessuno, che sto continuando a studiare anche quelli) e avrei bisogno di un parere è un consiglio.
Il consiglio è: quali sono dei buoni libri sull’argomento? Vanno bene sia in italiano che in inglese.
Il parere: sono ancora in fase di design, quindi volevo chiedere ai più esperti se, dato un piccolo programmino da guardare, se potevano dirmi gli errori concettuali in esso. Il programma è molto semplice: prende un numero n di numeri in input, li somma e fa la media.
Codice:
int n  //qualunque variabile di tipo int dichiarata ma non assegnata viene automaticamente inizializzata a 0
int average
int length = sin("How many numbers do I have to add?")  //funzione di input

for(int i = length) {
    n += sin("Insert a number: ")
}

average = n / length

sout("The average is " + average)  //funzione di output
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Il ciclo dura quanto length, che è un int richiesto in output dall’utente. Per creare le sue dinamiche mi sono ispirato un po’ a Python, dove con la funzione range() immetti il numero di iterazioni. Qui invece a i si assegna il valore di iterazioni da eseguire. Devo ancora decidere se i deve decrementare a ogni ciclo o no, visto che qualsiasi altro linguaggio lo fa incrementare…
 

personalele

Nuovo Utente
51
10
Onestamente non mi sembra chiaro: dichiari una variabile int contatore a cui assegni il valore del numero di cicli da compiere (per arrivare a 0 decrementando evidentemente) ma allora se proprio vuoi semplificare così tanto e ammesso che sia funzionale, converrebbe prendere come parametro della for solo il numero di clici senza dichiarare alcun contatore gestito automaticamente.
Buon lavoro comunque...
 
  • Mi piace
Reazioni: Andretti60

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
È quello che avevo pensato all’inizio, ma poi mi è venuto in mente che in molti programmi è richiesto l’uso del contatore per altri scopi, e non sapendo cos’è il contatore l’utente non saprebbe cosa usare. L’idea era di assegnare nel for il valore massimo che i deve raggiungere, ma forse non è stata una buona idea utilizzare la stessa sintassi per l’assegnazione di una variabile. Rivedrò la sintassi allora

EDIT: ho rivisto la sintassi, e ora il for si fa così for(int i, 5), con come primo valore la variabile da iterare, e secondo valore il numeri di iterazioni. Questo si applicherebbe anche al for-each, tipo così for(word, words)
 
Ultima modifica:

Andretti60

Utente Èlite
6,440
5,091
Sinceramente, visto il codice che hai postato in questo forum, ti consiglierei qualche esercizio più facile.
Scrivere un linguaggio di programmazione è un grosso progetto e si studia agli ultimi anni di informatica, in quanto richiede un sacco di nozioni che si imparano con il tempo. Prima di tutto “linguaggio di programmazione” è un termine ormai molto generico, in quanto ne esistono di diversi tipi e quindi prima di iniziare occorre capire bene cosa si voglia fare.
Non ricordo più i libri di testo che usai (e poiché parlo della preistoria ormai sono inutili), ma ti assicuro è un argomento molto complesso, un linguaggio di programmazione è composto da molte parti. Per esempio la prima parte è il “parser” che controlla la sintassi e “rompe” il testo in moduli separati. Ormai nessuno si sogna di scrivere un parser, ne esistono ormai di ottimi come per esempio Lex and Bison che sarebbe la prima cosa che dovresti studiare.

Il mio consiglio, inizia con qualcosa di più semplice.
Per esempio, un programmino che mi aiutò un sacco agli inizi fu un calcolatore che prende come input una formula matematica.
Si inizia con le quattro operazioni tipo
Poi si aggiunge
  • l’ordine delle operazioni
  • l’uso delle parentesi.
  • le operazioni matematiche (tipo seno e coseno)
  • le variabili (assegnare il risultato a una variabile per poi usarla in seguito)
Come vedi ha il vantaggio che si sviluppa a passi, si inizia semplice e mano a mano diventa più complicato.
E vedi bene perché lo ritengo un esercizio utile: è in pratica la base di un linguaggio di programmazione :) ci aggiungi test e cicli e diventa un BASIC su cui poi si basa il Fortran, il Pascal, il C e via dicendo

Fammi sapere.
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Grazie per la risposta. Innanzitutto lo so, scrivere un interprete (o compilatore) non è una cosa affatto semplice, infatti mi sono documentato molto prima di iniziare,

Conosco già concetti come il parser, il lexer e l’effettivo interprete, e ne ho anche scritto uno piccolino io stesso, ma in Python. Infatti, visto che è il linguaggio che conosco meglio, l’interprete lo scriverò con quello.

Come accennato sopra ho scritto un piccolo interprete, per espressioni matematiche, leggermente meno complesso del tuo. Infatti era in grado di fare addizioni e sottrazioni con più di due termini, e moltiplicazioni e divisioni a soli due termini.
Non mentirò, ho seguito una guida per farlo, ma la guida come esercizio finale di ogni parte metteva degli esercizi, che sarebbero stati trattati nella parte successiva. Per esempio: la prima parte della guida spiegava come costruire un interprete a riga di comando per fare solo addizioni con due addendi, senza spazi tra numeri e segni. Dopo aver analizzato il codice minuziosamente e averlo eseguito riga per riga con il debugger almeno una decina di volte ho eseguito gli esercizi, che dicevano di aggiungere la possibilità di spazi a piacimento e fare sottrazioni e moltiplicazioni (sempre con solo due termini), e sono riuscito a svolgerli.
Ovviamente il mio codice era più lungo e leggermente più prolisso di quello della guida, ma funzionava.


Tutti questi per dire che non è un’idea che mi è balzata in testa ora. Ho pensato attentamente, e ho studiato la teoria
 

bigendian

Utente Attivo
749
432
OS
Linux
Per quel che mi riguarda, ho passato anni in bei progetti personali che sono rimasti solo sul mio hard disk. Esperienza, si, ma poca soddisfazione.
Un idea come un'altra: visto che investirai molto tempo, perche' invece non misurarti con programmatori bravi, a livello internazionale, e collaborare a qualche linguaggio gia in via di sviluppo ? Questo ti darebbe modo di imparare molto, contribuire a una community, metterti alla prova, capire da migliori maestri il modo giusto di fare determinate cose, arricchire il cv, e il piacere di sapere che altri useranno il tuo lavoro.,
 
Ultima modifica:

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
È una bellissima idea, ma inattuabile per due motivi: programmo principalmente in python. Al massimo qualcosa in Java riesco a fare, ma non lo conosco bene quanto python, e questo mi limita molto. A chi mai verrebbe in mente di scrivere un linguaggio di programmazione con python?
2: per quanto io mi ci possa mettere non sarò mai bravo abbastanza da poter contribuire davvero a questi progetti
 

bigendian

Utente Attivo
749
432
OS
Linux
1. con python potresti giocare a un semplice interprete, interpretare dei bytecode semplici, step 1, conversione tuo linguaggio in bytecode, step2, interpretare da python (magari convertito in binario) e eseguire
2. questo e' un punto di partenza sbagliato.
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
L'interprete è quello che ho fatto. L'ultima volta stavo facendo python in python, ma poi ho smesso. Ora volevo osare un po' di più e creare il mio linguaggio
Lo so, ma ho letteralmente pochissimo tempo per cimentarmi. Per quanto io lo uso tutto mi restano 3 ore al giorno di tempo libero tra scuola e resto, e quelle ore le divido tra programmazione e altro
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Il libro maggiormente conosciuto è sicuramente quello del draghetto, "Compilers: Principles, Techniques, and Tools".

Come diceva anche Andretti, è un argomento davvero complesso.

Invece di un compilatore, però, ti direi di partire da un interprete, che è più "semplice" , specie se interpreti davvero (Java, la JVM, non interpreta, ad esempio).

A proposito di interpreti, c'è questa bella risorsa online, per altro free, se segui la versione web: https://craftinginterpreters.com/contents.html
 
  • Mi piace
Reazioni: Hero467

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Si, l'idea infatti era di fare un interprete. Non mi sognerei neanche di fare un compilatore ora, non saprei nemmeno da dove partire.
Grazie per le risorse
 

pabloski

Utente Èlite
2,868
916
Si, l'idea infatti era di fare un interprete. Non mi sognerei neanche di fare un compilatore ora, non saprei nemmeno da dove partire.
Grazie per le risorse

un compilatore aggiunge un'infinità di ulteriori complicazioni a quelle che già esistono nello sviluppo teorico di un linguaggio

il compilatore deve conoscere le architetture hardware e le ISA target per le quali compila, deve implementare un sacco di euristiche ( che normalmente si aggiungono man mano, in decenni di sviluppo e man mano che problemi e necessità pratiche ne inducono l'implementazione )

decisamente è obbligatorio partire con un interprete, per lo meno limiti i problemi alla sola sfera teorica/del modello di programmazione del linguaggio

tieni anche conto che ormai quasi nessuno lavora più allo sviluppo del backend, dato che quasi tutti ( e parlo di pezzi grossi tipo Rust, Swift, ecc... ) usano LLVM

per l'apprendimento prova a cercare qualcosa sullo sviluppo DIY di un interprete LISP...questo perchè LISP è il linguaggio più usato ed abusato per insegnare le tecniche di sviluppo dei linguaggi di programmazione e si trovano parecchi tutorial e articoli ( ci si può risparmiare di leggere un librone da 1000+ pagine...quello lo si può leggere dopo )

molto attiva ed utile è la comunità che sta dietro allo sviluppo di Zig, anche se il codice è scritto in Zig e C++ e questo mi pare di capire che sia un problema per te

e c'è la comunità di Nim che è molto aperta e pronta ad aiutare

tutto questo ambaradan perchè, alla fin fine, il librone di può dare le basi teoriche ed astratte, ma esistono millemila dettagli più o meno pratici che si possono apprendere solo da progetti reali
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
un compilatore aggiunge un'infinità di ulteriori complicazioni a quelle che già esistono nello sviluppo teorico di un linguaggio

il compilatore deve conoscere le architetture hardware e le ISA target per le quali compila, deve implementare un sacco di euristiche ( che normalmente si aggiungono man mano, in decenni di sviluppo e man mano che problemi e necessità pratiche ne inducono l'implementazione )
Infatti so che le uniche cose che hanno in comune un interprete e un compilatore sono il lexer e il parser. Poi come faccia il compilatore a trasformare tutto in codice macchina per me è un mistero. Ha un set di istruzioni in assembly per ogni istruzione pronto all’uso? Boh

tieni anche conto che ormai quasi nessuno lavora più allo sviluppo del backend, dato che quasi tutti ( e parlo di pezzi grossi tipo Rust, Swift, ecc... ) usano LLVM
Allora, mi sono documentato un po’ (ma ho compreso molto poco). Da quello che ho capito la parte scritta a mano si occupa di creare i token e fare il parsing, poi llvm si occupa della traduzione in asm e poi in binario

per l'apprendimento prova a cercare qualcosa sullo sviluppo DIY di un interprete LISP...questo perchè LISP è il linguaggio più usato ed abusato per insegnare le tecniche di sviluppo dei linguaggi di programmazione e si trovano parecchi tutorial e articoli ( ci si può risparmiare di leggere un librone da 1000+ pagine...quello lo si può leggere dopo )
Buona idea. Cercherò sicuramente

molto attiva ed utile è la comunità che sta dietro allo sviluppo di Zig, anche se il codice è scritto in Zig e C++ e questo mi pare di capire che sia un problema per te

e c'è la comunità di Nim che è molto aperta e pronta ad aiutare

tutto questo ambaradan perchè, alla fin fine, il librone di può dare le basi teoriche ed astratte, ma esistono millemila dettagli più o meno pratici che si possono apprendere solo da progetti reali
Ho dato anche un’occhiata a questi due progetti. Se zig ho visto il c++ per nim il compilatore (perche mi sembra sia compilato) è scritto in nim. Cosa che ci sta, perché da quanto so anche gcc è scritto in c, però mi servirebbe imparare un altro linguaggio, che non avrebbe altro scopo di fare il compilatore, infatti non ho mai sentito parlare di questo nim
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!