Was ist eine Programmiersprache?

7

Auf die Gefahr hin, naiv zu klingen, stelle ich diese Frage auf der Suche nach einem tieferen Verständnis des Konzepts von Programmiersprachen im Allgemeinen. Ich schreibe diese Frage für meine eigene Erbauung und die Erbauung anderer.

Was ist eine nützliche Definition einer Computerprogrammiersprache und was sind ihre grundlegenden und notwendigen Komponenten? Was sind die Hauptmerkmale, die Sprachen unterscheiden (funktional, imperativ, deklarativ, objektorientiert, Skripting usw.)?

Eine Möglichkeit, über diese Frage nachzudenken. Stellen Sie sich vor, Sie betrachten die Hardware eines modernen Desktop- oder Laptop-Computers. Angenommen, die C-Sprache oder eine ihrer Varianten existiert nicht. Wie würdest du anderen alles beschreiben, was nötig ist, um den Computer ausdrucksvoll und funktional zu machen, was wir heute von Personal Computern erwarten?

Tangential verwandt, was ist mit Computersprachen, die andere Sprachen erlauben? Nehmen Sie zum Beispiel eine Skriptsprache wie Javascript, Perl oder PHP. Ich vermute, dass ein Teil der Definition von diesen ist, dass es einen Interpreter gibt, der höchstwahrscheinlich in C oder C ++ auf irgendeiner Ebene implementiert ist. Ist es möglich einen Interpreter für Javascript in Javascript zu schreiben? Ist das eine Voraussetzung für eine vollständige Sprache? Dasselbe gilt für Perl, PHP usw.?

Ich wäre mit einer Liste von Konzepten zufrieden, die man nachschlagen oder weiter erforschen kann.

    
Gordon Potter 25.08.2009, 01:59
quelle

10 Antworten

26

Wie jede Sprache sind Programmiersprachen einfach ein Kommunikationswerkzeug, um Ideen auszudrücken und zu vermitteln. In diesem Fall übersetzen wir unsere Ideen, wie Software in einer strukturierten und methodischen Form funktionieren sollte, die Computer (wie auch andere Menschen, die die Sprache in den meisten Fällen beherrschen) lesen und verstehen können.

  

Was ist eine nützliche Definition einer Computerprogrammiersprache und was sind ihre grundlegenden und notwendigen Komponenten?

Ich würde sagen, dass das definierende Merkmal einer Programmiersprache wie folgt ist: Dinge, die in dieser Sprache geschrieben sind, sollen letztendlich in etwas umgesetzt werden, das ausgeführt wird . Somit ist Pseudocode, obwohl er vielleicht die Struktur und Strenge einer Programmiersprache aufweist, keine Programmiersprache. Ebenso kann UML viele mächtige Ideen auf abstrakte Art und Weise ausdrücken, so wie es eine Programmiersprache kann, aber es fällt nicht gut aus, weil Benutzer UML normalerweise nicht zur Ausführung schreiben.

  

Wie würdest du anderen alles beschreiben, was nötig ist, um den Computer ausdrucksvoll und funktional zu machen, was wir heute von Personal Computern erwarten?

Selbst wenn das Wort "Programmiersprache" nicht Teil des gemeinsamen Vokabulars der Gruppe war, mit der ich gesprochen habe, denke ich, dass es für die anderen offensichtlich wäre, dass wir einen Weg brauchen, um mit dem Computer zu kommunizieren. So wie niemand erwartet, dass ein Auto (noch!) Ohne externe Anweisungen in Form einer Interaktion mit dem Lenkrad und den Pedalen fährt, könnte niemand erwarten, dass die Hardware funktioniert, ohne dass man ihnen sagt, was zu tun ist. Wie bereits erwähnt, ist eine Programmiersprache der Kanal, über den wir diese Kommunikation ermöglichen können.

  

Tangential verwandt, was ist mit Computersprachen, die andere Sprachen existieren lassen?

Alle nützlichen Programmiersprachen haben eine Eigenschaft namens Turing-Vollständigkeit . Wenn eine Sprache im Turing-vollständigen Satz etwas tun kann, dann kann jeder von ihnen; Sie werden als rechnungsmäßig äquivalent bezeichnet.

Aber gerade weil sie gleichermaßen "mächtig" sind, heißt das nicht, dass sie genauso gut für Menschen sind. Das ist der Grund, warum viele Leute bereit sind, das beispiellose Mikromanagement zu opfern, das man beim Schreiben von Assembler-Code für die Ausdruckskraft und Kraft von höheren Programmiersprachen wie Ruby, Python oder C # bekommt.

  

Ist es möglich einen Interpreter für Javascript in Javascript zu schreiben? Ist das eine Voraussetzung für eine vollständige Sprache? Dasselbe gilt für Perl, PHP usw.?

Da ein Javascript-Interpreter in C geschrieben ist, muss es möglich sein, einen Javascript-Interpreter in Javascript zu schreiben, da beide Turing-vollständig sind. Beachten Sie jedoch, dass Turing-Vollständigkeit nichts darüber aussagt, wie schwer es ist, etwas in einer Sprache gegenüber einer anderen zu tun - nur, ob es überhaupt möglich ist, damit zu beginnen. Dein Javascript-Interpreter-Inside-Javascript ist vielleicht horrend ineffizient, verbraucht absurde Speichermengen, benötigt enorme Rechenleistung und ist ein hässlicher Hack. Aber Turing-Vollständigkeit garantiert, dass es möglich ist!

    
John Feminella 25.08.2009, 02:09
quelle
4

Während dies Ihre Frage nicht direkt beantwortet, werde ich an den Rache der Nerds Aufsatz von Paul Graham erinnert über die Entwicklung von Programmiersprachen. Es ist sicherlich ein interessanter Ort, um mit der Untersuchung zu beginnen.

    
Greg Hewgill 25.08.2009 02:08
quelle
3

Keine Definition, aber ich denke, es gibt im Wesentlichen zwei Entwicklungslinien in Programmiersprachen:

  • Diejenigen, die sich von dem, was die Maschine kann, zu etwas ausdrucksvollerem und weniger mit der Maschine verbundenem Gerät (Assembly, Fortran, C, C ++, Java, ...) hinarbeiten.

  • Diejenigen, die von einem mathematischen oder theoretischen computerwissenschaftlichen Berechnungskonzept zu etwas gehen, das auf einer realen Maschine implementierbar ist (Lisp, Prolog, ML, Haskell, ...)

Natürlich ist das Bild in Wirklichkeit nicht so ordentlich, und beide Stränge beeinflussen sich gegenseitig, indem sie die besten Ideen aufnehmen.

    
starblue 25.08.2009 07:01
quelle
3

Etwas lange rat voraus.

Eine Computersprache unterscheidet sich eigentlich nicht von einer menschlichen Sprache. Beide werden verwendet, um Ideen und Konzepte in allgemein verständlichen Begriffen auszudrücken. Unter den verschiedenen menschlichen Sprachen gibt es syntaktische Unterschiede, aber Sie können dasselbe in jeder Sprache ausdrücken (macht das menschliche Sprachen Turing vollständig? :)). Manche Sprachen eignen sich besser zum Ausdruck bestimmter Dinge als andere.

Zum Beispiel, obwohl technisch nicht ganz korrekt , die Inuit Sprache ganz geeignet scheint verschiedene Arten von Schnee zu beschreiben. Japanisch ist meiner Erfahrung nach sehr geeignet, um seine Gefühle und Geisteszustände auszudrücken, dank eines großen, präzisen Vokabulars in diesem Bereich. Deutsch ist ziemlich gut, um dank einer weitgehend eindeutigen Grammatik sehr präzise zu sein.

Unterschiedliche Programmiersprachen haben auch unterschiedliche Besonderheiten, unterscheiden sich aber meistens in der Detailtiefe, die zum Ausdruck kommt. Der große Unterschied zwischen Menschen- und Programmiersprachen besteht hauptsächlich darin, dass Programmiersprachen nicht viel Vokabular haben und sehr wenig "grammatische" Regeln haben. Mit Bibliotheken können Sie jedoch das Vokabular einer Sprache erweitern.

Zum Beispiel:

  

Mach mir Kaffee.

Sehr einfach für einen Menschen zu verstehen, aber nur weil wir wissen, was jedes Wort bedeutet.

  

Kaffee : ein Getränk aus dem gerösteten und gemahlenen Samen beanlike eines tropischen Strauch
trinken : eine Flüssigkeit, die
geschluckt werden kann schlucken : verursachen oder erlauben, die Kehle hinunterzugehen   ... und so weiter und so weiter

Wir kennen all diese Definitionen auswendig, aber wir mussten sie irgendwann lernen.

Auf die gleiche Weise kann ein Computer "gelehrt" werden, Wörter auch "zu verstehen".

%Vor%

Dies könnte ein perfekt gültiger Ausdruck in einer Computersprache sein. Wenn der Computer "weiß", was Coffee , make() und giveTo() bedeutet und ob $me definiert ist. Es drückt dieselbe Idee wie der englische Satz aus, nur mit einer anderen, strengeren Syntax.

In einer anderen Umgebung müssten Sie etwas andere Dinge sagen, um dasselbe Ergebnis zu erzielen. Auf Japanisch zum Beispiel würden Sie wahrscheinlich so etwas wie sagen:

  

コ ー ヒ ー を 作 っ て も ら っ て も 良 い で す か?
Kohi o tsukuttemoratte mo ii desu ka?

Was würde grob zu übersetzen:

%Vor%

Gleiche Idee, gleiches Ergebnis, aber die $me ist impliziert, und wenn Sie nicht erst nach isAgreeable suchen, erhalten Sie möglicherweise einen Laufzeitfehler. In Computer-Begriffen, die in gewisser Weise analog zu Rubys implizierten Verhalten der Rückkehr des Ergebnisses des letzten Ausdrucks ( „grammatische Funktion“) und die Überprüfung nach verfügbaren Speichern ersten (Umwelt Notwendigkeit) sein würden.

Wenn Sie mit einer sehr langsamen Person mit wenig Vokabular sprechen, müssen Sie die Dinge wahrscheinlich viel detaillierter erklären:

  

Geh in die Küche.
  Nimm einen Topf.
  Fülle den Topf mit Wasser   ...

Genau wie Assembler. : o)

Jedenfalls ist eine Programmiersprache tatsächlich eine Sprache, genau wie eine menschliche Sprache. Ihre Syntax ist anders und spezialisiert für die Problemdomäne (Logik / Mathematik) und den "Listener" (Computer), aber sie sind nur eine Möglichkeit, Ideen und Konzepte zu transportieren.

BEARBEITEN:
Ein anderer Punkt über "Optimierung für den Hörer" ist, dass Programmiersprachen versuchen, Mehrdeutigkeiten zu beseitigen. Das Beispiel "Make me coffee" könnte technisch als "Verwandle mich in Kaffee" verstanden werden. Ein Mensch kann sagen, was intuitiv gemeint ist, ein Computer kann nicht. Daher hat in Programmiersprachen alles nur eine und eine Bedeutung. Wo es nicht möglich ist, können Sie auf Probleme stoßen, der " + " Operator in Javascript ist ein übliches Beispiel.

%Vor%     
deceze 25.08.2009 05:05
quelle
2

Siehe "Programmierung als menschliche Aktivität". EWD 117.   Ссылка

Siehe auch Ссылка

    
S.Lott 25.08.2009 02:16
quelle
1

Menschlicher Ausdruck welcher:

  • beschreibt mathematische Funktionen
  • schaltet den Computer ein und aus
Mark Stock 25.08.2009 02:22
quelle
1

Diese Frage ist sehr weit gefasst. Meine Lieblingsdefinition ist, dass eine Programmiersprache ein Mittel ist, um Berechnungen auszudrücken

  • Genau
  • Auf hohem Niveau
  • So können wir über sie nachdenken

By computation Ich meine, was Turing und Church bedeuteten: Die Turing-Maschine und der Lambda-Kalkül haben eine gleichwertige Ausdruckskraft (was ein Theorem ist), und die Church-Turing-Hypothese (was eine Vermutung ist) sagt ungefähr, dass es keine mächtigere Vorstellung von Berechnung gibt. Mit anderen Worten, die Arten von Berechnungen, die in beliebigen Programmiersprachen ausgedrückt werden können, sind bestenfalls die Arten, die mit Turing-Maschinen oder Lambda-Kalkül-Programmen ausgedrückt werden können - und einige Sprachen können nur ausdrücken eine Teilmenge dieser Berechnungen.

Diese Definition von Berechnung umfasst auch Ihre freundliche Nachbarschafts-Hardware, die mit einer Turing-Maschine ziemlich einfach zu simulieren und mit dem Lambda-Kalkül noch einfacher zu simulieren ist.

Das Ausdrücken von Berechnungen genau bedeutet, dass der Computer sich nicht aus seinen Verpflichtungen herauswinden kann: Wenn wir eine bestimmte Berechnung im Hinterkopf haben, können wir eine Programmiersprache verwenden, um zu erzwingen Computer, um diese Berechnung durchzuführen. (Sprachen mit "implementation defined" oder "undefined" Konstrukten erschweren diese Aufgabe. Programmierer, die diese Sprachen verwenden, sind oft bereit, sich mit etwas zu beschäftigen, das nur nahe verwandt ist zu der Berechnung, die sie im Sinn hatten.)

Das Ausdrucken von auf einer hohen Ebene ist das, worum es bei Programmiersprachen geht. Ein wichtiger Grund dafür, dass es so viele verschiedene Programmiersprachen gibt, ist, dass es so viele verschiedene Arten gibt, über Probleme nachzudenken. Wenn Sie eine wichtige neue Klasse von Problemen zu lösen haben, ist es vielleicht am besten, wenn Sie eine neue Programmiersprache erstellen. Zum Beispiel schlägt Larry Wall's Schreiben vor, dass das Lösen einer Klasse von Problemen, die "Systemadministration" genannt wurde, eine Motivation für ihn war, Perl zu erstellen.

(Ein anderer Grund, warum es so viele verschiedene Programmiersprachen gibt, ist, dass das Erstellen einer neuen Sprache eine Menge Spaß macht und jeder lernen kann, es zu tun.)

Schließlich wollen viele Programmierer Sprachen, die es leicht machen, über Programme nachzudenken. Zum Beispiel hat heute ein Schüler von mir einen neuen Algorithmus implementiert, der sein Programm um mehr als das Sechsfache beschleunigt hat. Er musste sehr sorgfältig über den Inhalt von C-Arrays nachdenken, um sicherzustellen, dass der neue Algorithmus den gleichen Job wie der alte hatte. Zum Glück hat C vernünftige Werkzeuge zum Nachdenken über Programme, zum Beispiel:

  • Eine Änderung in a[i] kann den Wert von a[i-1] nicht beeinflussen.

Mein Schüler hat auch ein Argumentationsgrundsatz angewendet, der in C nicht gilt:

  • Die Summe einer ganzen Zahl vorzeichenloser Zahlen ist mindestens so groß wie eine ganze Zahl in der Sequenz.

Dies ist in C nicht wahr, da die Summe möglicherweise überläuft. Ein Grund, warum einige Programmierer Sprachen wie Standard ML bevorzugen, ist, dass in SML dieses Argument immer gültig ist. Von den Sprachen, die weit verbreitet sind, hat Haskell wahrscheinlich die stärkste Argumentationsprinzipien. Richard Bird hat equational Argumentation über Programme zu einer hohen Kunst entwickelt.

Ich werde nicht versuchen, alle tangentialen Details zu behandeln, die Ihrer Eröffnungsfrage folgen. Aber ich hoffe, Sie werden etwas aus einer Antwort bekommen, die, wie Sie es wünschen, ein tieferes Verständnis für eine grundlegende Frage über Programmiersprachen vermitteln soll.

    
Norman Ramsey 25.08.2009 02:35
quelle
1

Eine Sache, die viele "IT" -Typen vergessen, ist, dass es zwei Arten von Computerprogrammiersprachen gibt:

  1. Software-Programmiersprachen: C, Java, Perl, COBAL usw.

  2. Hardware-Programmiersprachen: VHDL, Verilog, System Verilog, usw.

Anon E. Mous 25.08.2009 02:54
quelle
1

Interessant.

Ich würde sagen, dass das definierende Merkmal einer Programmierung Sprache die Fähigkeit ist, Entscheidungen basierend auf Eingaben zu treffen. Effektiv if und goto . Alles andere ist viel und viel syntaktischer Zucker. Das ist die Idee, die Brainfuck hervorgebracht hat, was wirklich bemerkenswert Spaß macht (zu versuchen).

Es gibt Stellen, an denen die Linie verschwimmt; zum Beispiel bezweifle ich, dass Leute XSLT als eine Programmiersprache betrachten würden, aber es ist Turing-vollständig. Ich habe sogar ein Project Euler Problem damit gelöst. (Sehr, sehr langsam.)

Drei Haupteigenschaften von Sprachen kommen mir in den Sinn:

  1. Wie läuft es? Ist es kompiliert zu Bare Metal (C), kompiliert zu meist blankem Metall mit etwas Laufzeit-Nachschlagen (C ++), läuft auf einer JIT virtuellen Maschine (Java, .NET), Bytecode interpretiert (Perl) oder rein interpretiert (uhh .. ) Dies sagt nichts über die Sprache selbst aus, sondern spricht dafür, wie portabel der Code sein kann, welche Art von Geschwindigkeit ich erwarten würde (und damit welche breiten Klassen von Aufgaben gut funktionieren würden) und manchmal wie flexibel die Sprache ist / li>
  2. Welche Paradigmen unterstützt es? Prozedural? Funktional? Ist die Standardbibliothek mit Klassen oder Funktionen aufgebaut? Gibt es Reflexion? Gibt es im Idealfall Unterstützung für so ziemlich alles, was ich tun möchte?
  3. Wie kann ich meine Daten darstellen? Gibt es Arrays, und sind sie fest oder nicht? Wie einfach ist es, Strings zu verwenden? Sind Strukturen oder Hashes eingebaut? Wie ist das Typsystem? Gibt es Objekte? Sind sie klassenbasiert oder prototypbasiert? Ist alles ein Objekt, oder gibt es Primitive? Kann ich von integrierten Objekten erben?

Ich erkenne, dass das letzte eine sehr große Sammlung potenzieller Fragen ist, aber es ist alles in meinem Kopf verwandt.

Ich stelle mir vor, die Programmiersprachenlandschaft von Grund auf neu aufzubauen, würde ziemlich genau so funktionieren wie beim ersten Mal: ​​iterativ. Beginnen Sie mit der Assemblierung, der Liste der direkten Befehle, die der Prozessor versteht, und verpacken Sie sie mit etwas einfacher zu benutzendem. Wiederholen Sie, bis Sie glücklich sind.

Ja, Sie können einen Javascript-Interpreter in Javascript oder einen Python-Interpreter in Python (siehe: PyPy) oder einen Python-Interpreter in Javascript schreiben. Solche Sprachen werden als Self-Hosting bezeichnet. Werfen Sie einen Blick auf Perl 6; Dies war von Anfang an ein Ziel für die Hauptimplementierung.

Letztendlich muss alles nur in Maschinencode übersetzt werden, nicht unbedingt C. Sie können D oder Fortran oder Haskell oder Lisp schreiben, wenn Sie möchten. C ist zufällig ein alter Standard. Und wenn Sie einen Compiler für die Sprache Foo schreiben, der schließlich Maschinencode ausspucken kann, egal wie, dann können Sie diesen Compiler in Foo umschreiben und den Zwischenhändler überspringen. Wenn Ihre Sprache rein interpretiert wird, führt dies natürlich zu einem Stapelüberlauf ...

    
Eevee 25.08.2009 02:20
quelle
1

Wie ein Freund mir Computersprachen beigebracht hat, ist eine Sprache eine Welt. Eine Welt der Kommunikation mit dieser Maschine. Es ist Welt für die Umsetzung von Ideen, Algorithmen, Funktionalität, wie Alonzo und Alan beschrieben. Es ist das technische Äquivalent der mathematischen Strukturen, die die oben genannten Wissenschaftler gebaut haben. Es ist eine Sprache mit Widersprüchen und auch Grenzen. Ludwig Wittgenstein sagte jedoch: "Die Grenzen meiner Sprache bedeuten die Grenzen meiner Welt", es gibt immer Grenzen und so wählt man seine Sprache, die besser zu seinen Bedürfnissen passt.

Es ist eine generische Antwort ... einige Gedanken tatsächlich und weniger eine Antwort.

    
Aggelos Biboudis 17.01.2010 14:04
quelle

Tags und Links