2009-04-21 13 views
5

Ho guardato allo L.in.oleum e sono intrigato dal suo mix di costrutti di livello superiore (loop, variabili dinamiche) con potenza di assemblatore di basso livello (registri).Quali sono le lingue simili ad Assembler buone o interessanti, ma ad un livello superiore?

Ci sono altri linguaggi come Lino, che fondono la velocità dell'assemblatore con le caratteristiche di miglioramento della produttività?

EDIT: Ho realizzato questo tipo di suoni come un annuncio. Sono sinceramente interessato ad altre lingue simili agli assemblatori, Lino è l'unico che conosco.

risposta

1

Molti compilatori C che accettano l'assemblaggio in linea. Naturalmente, le parti ottimizzate per l'assemblaggio non sono cross-architecure, ma non posso davvero immaginare un linguaggio assembly cross-architecture che sia comunque efficace. Guarderò il linoleum, ma con i compilatori ottimizzanti e piattaforme molto diverse, con un numero di registri compreso tra 4 e centinaia, non riesco davvero a vederlo funzionare molto bene.

Un'altra opzione è C#/Java e il loro bytecode. Ma mi interrogherei ancora sull'utilità dell'ottimizzazione manuale in questi.

+0

Suppongo che con un buon assemblaggio in linea sia possibile ottenere risultati migliori rispetto all'assemblaggio puro, poiché il compilatore eseguirà alcune ottimizzazioni. –

+0

Solitamente l'ottimizzatore rimane fuori dai segmenti di assemblaggio in linea partendo dal presupposto che, se ci si è impegnati a scriverlo, lo si intendeva davvero. Questo può essere critico nel firmware di sistema incorporato in cui si potrebbe voler utilizzare un'istruzione specifica per ottenere un effetto, o sprecare deliberatamente uno slot di ritardo della pipeline per ottenere un tempo di ciclo corretto. Il chilometraggio varierà, controllerà il tuo manuale e sicuramente è una caratteristica definita dall'implementazione e non molto portabile. – RBerteig

+0

Bytecode C# è MSIL, se non sbaglio, la lingua di CLR. Puoi fare qualche ritocco, ma penso che l'interprete C# ne faccia già un lavoro abbastanza decente. Lino è interessante in modo sperimentale. Se non altro, ottiene un buon uso pratico da parte del suo creatore. Una volta bella cosa è che è teoricamente portabile a qualsiasi sistema. – CodexArcanum

2

Si potrebbe provare direttamente utilizzando LLVM.

Dato che ci sono molti strumenti già disponibili che creano/trasformano si ha una buona possibilità di essere in grado di fare qualcosa con esso (anche se senza supporto ide).

Se si è bloccati, basta scrivere ciò che si desidera in C++, quindi compilarlo con Clang mantenendo la forma intermedia.

Per una rapida indicazione se ti avrebbe fatto piacere che tentare la online compiler

+0

+1 per i giocattoli online – SingleNegationElimination

2

Win32 in assembler: fondamentalmente le intestazioni delle finestre per assemblatore con alcune belle macro di alto livello:

http://www.masm32.com/

9

C-- è un linguaggio intermedio progettato per essere generata principalmente dai compilatori, è da qualche parte tra C e assembler

+0

Si potrebbe dire che la stessa C è di livello piuttosto basso, ma non di così basso livello. – pilsetnieks

0

Il sistema z ha HLASM che usiamo per un bel po 'di sviluppo. Aggiunge tutti i tipi di costrutti del linguaggio di livello superiore. Così come HLASM che porta un po 'il linguaggio verso un linguaggio di alto livello, credo che IBM abbia un prodotto interno basato su PL/I che porta un po' giù verso il montaggio :-)

0

Una volta ho usato PL/M e sembrava per me essere solo un livello sopra l'assemblea. Era più simile a un linguaggio macro, ma con alcuni costrutti di livello superiore come loop e simili. E 'stata un'esperienza interessante.

4

FORTH - non abbastanza assemblatore ma usato pesantemente ed è di livello molto basso.

+0

+1: non l'ho usato molto in pratica, ma sembra un buon "involucro" per il montaggio! –

0

LLVM è una buona risposta.

Alcuni altri linguaggi interessanti sono il bytecode JVM e MSIL (il bytecode della piattaforma .Net). Entrambi forniscono sistemi stackbased, che è una grande differenza dall'assemblaggio x86.

-1

C stesso è quasi un assemblaggio, solo 100 volte più leggibile, e ti aiuta quando hai un sacco di variabili attive. È comunque vicino al linguaggio assembly. Non c'è alcuna operazione in C che non corrisponda quasi direttamente (o anche direttamente) al linguaggio assembly.

ASM: "fare proprio quello che dico, precisamente come lo dico"

C: "fai quello che voglio dire, e si può fare un po 'di riordinamento limitato se è più veloce e non rovinare i risultati "

C è sicuramente la strada da percorrere per qualcosa di diverso da stub molto piccoli che trattano direttamente con la CPU o l'hardware in un modo che è difficile da C (istruzioni speciali per esempio). Anche allora, i buoni compilatori C forniscono queste istruzioni speciali attraverso le intrinseche.

Le moderne CPU sono così complesse, è difficile per un umano prevedere quale effetto avrà una sequenza di istruzioni. Un compilatore può effettivamente gestire micro tutte le latenze e throughput e utilizzare coerentemente sequenze di istruzioni (quasi) ottimali. Un compilatore C oggi quasi certamente supererà un programmatore di assemblaggi umani su un codice tipico. Per i loop stretti, l'assemblaggio ottimizzato per l'uomo può avere un rendimento pari a, ma in genere non di molto.

+0

Davvero? Solo un downvote? Grazie. Questo aiuta. – doug65536

Problemi correlati