I compilatori dovrebbero seguire lo standard linguistico definito?

0

Perché alcuni compilatori violano lo standard linguistico definito?

Non capisco, in ISO / IEC 10206: 1990 Standard Pascal esteso alla sezione 6.8.3.2 Operatori aritmetici, Pagina 86.

Dice questo,

A term of the form i mod j shall be an error if j is zero or negative ; otherwise, the value of i mod j shall be that value of (i-(k*j)) for integral k such that 0 < = i mod j < j.

Ma, quando provo nel compilatore gratuito pascal 3.0,

writeln(-5 mod 3);

Produce un numero negativo "-2" anziché "1" e

writeln(5 mod -3);

Dovrebbe essere un errore secondo lo standard,
ma quello che ho trovato non lo è.


Ad esempio, se c'è una domanda

"In C++, why does the -5 % 3 produce -2 instead of 1, isn't it modulo operator?"

Dovrei rispondere

That's because in C++14 standard on Page 124, 5.6 Multiplicative operators, no. 4
It says that "(a/b)*b + a%b is equal to a"
Therefore, it is not a modulo operator, it is a remainder operator

Ma se c'è una domanda,

"In Pascal, why does the -5 mod 3 produce -2 instead of 1, isn't it modulo operator?"

La risposta dovrebbe essere così?

In general, it depends on the compilers that you are using, because according to the ISO/IEC 10206:1990 Extended Pascal standard, it should be 1, while on a modern compilers like fpc or gpc,
it produces -2

Quale sarebbe la risposta più appropriata alla domanda dell'operatore modulo sopra?

    
posta Unknown123 26.07.2016 - 11:14
fonte

2 risposte

5

Il punto è: cosa significa "errore" in quel particolare standard. Potrebbe essere spiegato in qualche introduzione o glossario. Forse è vicino a comportamento indefinito (e l'implementazione può fare tutto ciò che è più semplice per questo). Lo standard che stai citando dice:

3.2 Error

A violation by a program of the requirements of this International Standard that a processor is permitted to leave undetected.

(l'enfasi in corsivo è mia, quindi il comportamento che stai osservando è conforme alle specifiche)

Alcune specifiche dei linguaggi di programmazione menzionano comportamento non definito o comportamento non specificato . L'implementazione (conforme) è quindi autorizzata a fare tutto ciò che è adatto (per un comportamento indefinito può essere veramente non valido cose, leggi il blog di Lattner Che ogni Il programmatore C dovrebbe conoscere il comportamento non definito )

Should the compilers follow the the defined language standard?

Alcuni compilatori hanno esplicitamente (e documentano) estensioni alle lingue che stanno implementando. GCC ha utili estensioni a C , in particolare etichette come valori (con goto s calcolato) e dichiarazioni exprs , ed entrambi sono supportati anche da Clang / LLVM .

(Immagino che i motivi per cui tali estensioni comunemente fornite non siano state inserite negli standard è per ragioni sociali o economiche, non tecniche, il contributo a uno standard è piuttosto costoso)

    
risposta data 26.07.2016 - 11:21
fonte
1

Pascal ha una lunga storia di implementazioni non conformi. Ciò è probabilmente dovuto al fatto che il picco della popolarità della lingua si è verificato tra la prima versione standardizzata (ANSI Pascal, 1983) e la più recente "estesa" pascal you site (1990) - durante questo periodo Borland Turbo Pascal è stato creato ed è diventato il standard di fatto per la maggior parte delle implementazioni Pascal. Borland non si è mai preso la briga di rispettare lo standard precedente; se sentivano che c'era un modo migliore di fare qualcosa, andavano avanti e lo facevano. Pertanto, vi è un lungo elenco di deviazioni tra Turbo Pascal e lo standard ANSI .

Lo standard Pascal esteso si basava sullo standard ANSI, ma gran parte delle moderne implementazioni Pascal (incluso Free Pascal) sono esplicitamente progettate per essere compatibili con Turbo Pascal, quindi deviano dallo standard in modi simili.

Se stai cercando un compilatore più standard, credo che GNU Pascal Compiler sia più vicino al comportamento standard (o almeno lo è stato quando l'ho usato a metà degli anni '90).

    
risposta data 26.07.2016 - 14:42
fonte

Leggi altre domande sui tag