it-swarm-eu.dev

Warum kann es keine "universelle" Programmiersprache geben, die allen Zwecken dient?

warum nicht die besten Funktionen aller vorhandenen Programmiersprachen kombinieren und in eine universelle Programmiersprache integrieren?

60
killown

Aus dem gleichen Grund verwenden Sie kein Schweizer Taschenmesser , um ein Huhn zu schnitzen ...

http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/My_swiss_army_knife.JPG/800px-My_swiss_army_knife.JPG

Das Schweizer Taschenmesser hat in der Regel eine Klinge sowie verschiedene Werkzeuge wie Schraubendreher und Dosenöffner und viele andere. Diese Aufsätze werden über einen Drehpunktmechanismus im Griff des Messers verstaut ...

Das Design des Messers und seine Flexibilität haben zu weltweiter Anerkennung geführt ...

116
David_001

Weil

  1. niemand möchte den gesamten Legacy-Code neu schreiben.
  2. Es ist schwierig, sich auf alle Zwecke zu einigen
  3. Sobald Sie eine umfassende Liste von Zwecken zusammengestellt haben, werden diese geändert, bevor Sie sie erstellen können.
  4. Jemand würde aufgrund eines neuen Zwecks eine völlig andere Sprache beginnen.
  5. Microsoft
  6. Apple
  7. Open Source
  8. Was würden wir mit all den Babelfischen machen?
  9. Konnte SQL nicht einmal universell machen.
80
JeffO

Was Sie in der Programmierung haben, ist eine sehr große Problemdomäne. Diese Domain reicht extrem und in viele Richtungen.

Aus diesem Grund sind eingebettete Flugsteuerungen in C und Websites in PHP, Java, Rails, .NET und einer Vielzahl anderer geschrieben.

Für den eingebetteten Flugcontroller habe ich ungefähr 128 KB Speicher, mit dem ich arbeiten kann. Wenn mein Code eine unbehandelte Ausnahme erhält, stürzt das Flugzeug ab, 200 Menschen sterben und ich werde wegen 1 Mrd. USD verklagt und muss Ingenieure an jeden schicken Flughafen in der Welt, um Flugzeuge zu reparieren, die geerdet sind und meine Kunden 10 Millionen Dollar/Tag verlieren. Ich muss mit einer Sprache arbeiten, die sehr eng ist und eine kleine Anzahl beweglicher Teile hat, die schief gehen können.

Für meine Webanwendung habe ich mehrere GB Arbeitsspeicher, aber die Netzwerkgeschwindigkeit ist begrenzt (in geringerem Maße jeden Tag, aber dies ist wahrscheinlich die größte Webbeschränkung). Ich werde mir eine Sprache ansehen, die mir eine Menge Funktionen bietet und eine Ausgabe erzeugt, die so schnell wie möglich übertragen werden kann. Es ist mir egal, ob meine Website ausfällt, ich werde vielleicht ein paar Verkäufe verlieren (100 US-Dollar) und muss den Anwendungsfall, der bombardiert wurde, patchen, keine große Sache.

Websites wurden seit über 15 Jahren nicht mehr in C geschrieben (irgendjemand macht CGI-Skripte?) Und soweit ich weiß, beginnen Fluglotsen gerade erst, sich mit C++ zu befassen, aber selbst dann auf sehr eingeschränkte Weise.

38
Bill Leeper
  1. Geh in deine Garage (oder in die Garage deiner Eltern).
  2. Öffnen Sie den Werkzeugkasten.
  3. Wenn Sie mehr als ein Tool sehen, überlegen Sie, wie dies auf Ihre Frage zutrifft.

Wenn Sie keinen Werkzeugkasten haben oder nur einen dieser kleinen Hämmer mit den Schraubendreherbits im Hohlgriff haben, dann habe ich großes Mitgefühl für Sie.

Ernsthaft. Wenn Sie in ein Autohaus gehen, hat Ihr Mechaniker nur ein einziges Alleskönner-Werkzeug in seiner Werkzeugkiste? Er (oder sie) ist ein Fachmann mit professionellen Werkzeugen, die speziell für verschiedene Autoreparaturaufgaben entwickelt wurden.

Ebenso sollten professionelle Softwareentwickler über ausreichende Tools verfügen, um ihren Handel ausführen zu können. Wenn Sie Ihre Toolbox öffnen und nur einen Philips-Schraubendreher sehen, können Sie sich nicht als Profi betrachten.

Sie können einen Bolzen mit einem Gabelschlüssel, einem Ringschlüssel, einem Ratschenschlüssel oder einem verstellbaren Schraubenschlüssel drehen. Sie können sogar zur Not einen Bolzen mit einer Gleitzange drehen, ungeschickt, mit geringfügigen bis schweren Schäden. Es ist jedoch ziemlich schwierig, einen Bolzen mit einem Vorschlaghammer zu drehen.

24
brettmjohnson

Eine andere Art der Antwort auf die anderen - ich denke tatsächlich, dass das Potenzial besteht, dass eine Sprache zu einer "universellen" Sprache wird, die die Merkmale und Paradigmen von zulässt viele andere Sprachen, obwohl vielleicht keine streng gestaltete Sprache, an die Sie vielleicht denken.

Um brettmjohnsons Analogie oben zu verwenden, ist die Idee, dass jede Programmiersprache das Werkzeug in einer Box (oder auf einem Schweizer Taschenmesser) ist, die Annahme, die jeder macht, aber wirklich eine fehlerhafte Annahme.

Was wäre, wenn die Programmiersprache die Toolbox wäre?

Ich meine, was ist, wenn Sie Funktionen nach Belieben zur Sprache hinzufügen und daraus entfernen können und eine eigene Toolbox mit den darin enthaltenen Tools haben - auch wenn die Tools für unterschiedliche Zwecke bestimmt sind.

Das Konzept existiert teilweise schon. Zum Beispiel können Sie mit Sprachen wie NemerleSyntax zur Sprache hinzufügen , und als solche können Sie möglicherweise "die beste Funktion aus Sprache X" übernehmen und hinzufügen es zu Nemerle (oder Ihrem eigenen). Dies bedeutet nicht unbedingt, dass Sie ständig Ihre eigenen Makros schreiben müssen - jede Sprache (oder jedes Paradigma) kann in einem Makro in einer Standardbibliothek definiert werden -, sodass Sie import Haskell; import Prolog; und fang an, die beiden Sprachen so zu schreiben, als ob sie Teil deiner Sprache wären?

Die Frage ist dann: Wie bringen Sie die Merkmale verschiedener Sprachen/Paradigmen dazu, miteinander zu arbeiten? Obwohl ich das nicht beantworten kann, bieten Frameworks wie .Net und JVM einen Teil der Lösung - die Sprachen sind aufgrund ihrer Kompilierung zumindest teilweise kompatibel. Sie können beispielsweise jeden in C # geschriebenen Code ohne Beschwerden aus F # verwenden.

Das 'Problem' bei der heutigen Lösung besteht darin, dass Sie diese Sprachen zusammen verwenden müssen, um sie als separate Projekte zu erstellen, die nicht aufeinander verweisen können. Sie können nur eine Einwegreferenz haben. Die Sprachbarriere besteht darin, dass jedes Projekt alle seine Dateien separat in Common Intermediate Language kompiliert, bevor ein anderes Projekt darauf zugreifen kann.

Ein Sprungbrett zur Beseitigung dieser Barriere wäre, dass Code verschiedener Sprachen (z. B. C # und F #) innerhalb desselben Projekts kompiliert werden kann. Theoretisch könnten Sie jede Datei einzeln (oder in Gruppen - wenn sie Teiltypen oder Zirkelverweise haben) kompilieren und dann Dateien einer anderen Sprache kompilieren, die auf die bereits kompilierten (CIL) Objekte zugreifen können. Sie müssten die Reihenfolge der Kompilierung genau definieren, damit dies funktioniert - aber die Reihenfolge der Kompilierung ist im Fall von F # bereits erforderlich.

Jedenfalls sage ich nicht "es kann definitiv eine universelle Sprache geben". Ich schlage vor, dass es das Potenzial für eine viel bessere Interoperabilität zwischen Sprachen gibt als derzeit. In der Realität wird es sich wahrscheinlich nicht sehr bald verbessern, nur aufgrund des enormen Arbeitsaufwands für die Implementierung einer Sprache und der Bibliotheken, Tools usw., die für deren Verwendung erforderlich sind.

20
Mark H

Die besten Eigenschaften einiger Sprachen stehen im Widerspruch zu den besten Eigenschaften anderer Sprachen.

Zum Beispiel: Typbewusste Reflexionen sind eine wirklich nette Funktion, aber in einer lose getippten Sprache wäre sie nicht sehr viel wert, aber lockeres Tippen kann manchmal auch ein echter Vorteil sein.

Selbst innerhalb einer Sprache können Sie nicht immer alle besten Funktionen gleichzeitig verwenden, da sie miteinander in Konflikt stehen.

10
Bill

"Vieles können, aber nichts gut." fällt mir ein.

Einige Programme erfordern Geschwindigkeit, andere viel Speicher oder schnellen Zugriff auf die Festplatte. Einige Sprachen sind gut in einer, aber schlecht in einer anderen - ich glaube nicht, dass Sie eine Sprache bekommen würden, die überhaupt gut war.

Während Sie praktisch jedes Programm in jeder Sprache schreiben können, ist das, was Sie erhalten, nicht garantiert das "beste" Programm, das Sie schreiben können, um dieses Problem zu lösen.

7
ChrisF

Sprachen prägen das Denken der Menschen. Dies gilt für natürliche Sprachen. Wenn ein Kind nur eine Sprache mit den Zahlen "eins, zwei, viele" kennt, ist es ... schwierig, diesem Kind Mathematik beizubringen. (Entschuldigung, ich habe den Link nicht) Auf Englisch sprechen wir über verschiedene Zeiten, als wären sie Orte - daher kann man sich das Konzept der Zeitreise vorstellen. In einigen anderen Sprachen würde die Idee der Zeitreise nie ihren Sprechern einfallen.

Dies gilt auch für Programmiersprachen.

Wenn wir also eine einzige Programmiersprache haben, wird jeder über alle Rechenaufgaben genau gleich nachdenken. Daher werden wir keine Alternativen untersuchen, und der beste Weg, etwas zu tun, wird unentdeckt bleiben.

Das, was wir einer universellen Sprache am nächsten kommen, ist C. C ist sehr genau auf die zugrunde liegenden Hardwarekonzepte abgestimmt (wie die Dinge tatsächlich in der Hardware erledigt werden) und Programme in jeder * Sprache können in C konvertiert werden (siehe, wie CFront C-Compiler für Assembler verwendete Aufgaben) Das Problem mit C ist im Grunde, dass die oben genannten Konvertierungen aus Sicht der C-Programmierer keinen Sinn ergeben.

"Lambdas" waren in C immer möglich. Die Syntax ist deaktiviert, einschließlich des über das gesamte Projekt/die gesamte Datei verteilten Codes. Daher war dies keine bevorzugte Lösung. Definieren Sie mit einer No-Capture/Upvalue/etc-Version eine Funktion an einer anderen Stelle und übergeben Sie einen Zeiger auf die Funktion. (siehe qsort ()) Um Lambdas mit erfassten Werten zu verwenden, steigt die Menge und Komplexität des Codes, den Sie schreiben müssen, stark an - soweit mir bekannt ist, hat noch niemand den zu verwendenden Code geschrieben Diese Programmiermethode in C. Im Gegensatz zu Sprachen, in denen Lambdas Teil der Sprache sind und im Grunde überall verwendet werden.

Der Hauptunterschied zwischen C und C++ besteht darin, wie Sie C++ bitten können, sich um stuff für Sie zu kümmern; Aber dann können Sie nicht mehr anhand einer einzigen Codezeile sehen, wie viel Sie wirklich von ihm verlangen. Die Antwort lautet: Es kommt darauf an (von all dem anderen Code).

Einige Programmiersprachen eignen sich hervorragend für bestimmte Aufgaben, aber wo die meisten derzeit weltweit verwendeten Programme einfach keinen Sinn ergeben, wenn sie in dieser Sprache programmiert werden. Das heißt, wenn die Sprache verwendet werden könnte, um dieses Programm zu implementieren, ist dies keine Selbstverständlichkeit.

5
MaHuJa

Es gibt. Kein Tool ist für alles das Beste, aber einige Tools wie viele Programmiersprachen dienen für alle Zwecke, nicht am besten für alle.

Sie können das beste Werkzeug für den Job auswählen, aber es gibt Programmiersprachen, die für alle Zwecke verwendet werden können, und Sie können sie auswählen. Ich empfehle es nicht, aber es ist möglich.

4
Maniero

Es ist ein Fehler zu glauben, dass "alle Funktionen kombinieren" eine bessere Sprache ergibt.

Es ist wahrscheinlicher, dass Sie ein aufgeblähtes, komplexes und unlesbares Durcheinander haben.

Für ein gutes Sprachdesign müssen Auswahlmöglichkeiten und Kompromisse getroffen werden. Die wohl besten/revolutionärsten/erfolgreichsten Sprachen sind diejenigen, die etwas herausnehmen und eine bessere Alternative bieten, anstatt neue Dinge hinzuzufügen, z.

  • Strukturierte Programmiersprachen (C, Pascal) - nimmt "goto" heraus, ersetzt durch Prozeduren und strukturierte Schleifen usw.
  • Java - nimmt "manuelle Speicherverwaltung" heraus, ersetzt durch GC/verwalteten Speicher
  • Haskell/Clojure - nimmt "unkontrollierten veränderlichen Zustand" heraus
  • LISP - nimmt die meiste "Sprachsyntax" heraus und ersetzt sie durch einen flexiblen homoikonischen Baum von S-Ausdrücken

Es gibt ein großartiges Gespräch von Onkel Bob Martin - Die letzte Programmiersprache

4
mikera

Die technische Unmöglichkeit einer universellen Sprache? Das ist totaler Unsinn. Sie könnten haben eine universelle Sprache, die alle Grundlagen abdeckt. Das Problem ist größtenteils historisch: Verschiedene Sprachen wurden erfunden, um verschiedene Dinge zu tun und in verschiedenen Gemeinschaften verwendet zu werden. Viele von ihnen steckten fest. Fügen Sie diese Einstellungen hinzu (vi! Emacs! Warten Sie, ich meinte Java! C #, warten Sie, ich meinte Microsoft, Open Source usw. usw. usw.) und die allgemeine Einbettung historischer Unfälle ... Sehen Sie sich die natürlichen Sprachen in einem winzigen Land an Masse wie einige europäische Länder, um zu sehen, wie verrückt dieses Thema werden kann. Einige Städte haben ihren eigenen Stolz und ihre eigene Freude, einen kleinen Dialekt, den nur sie sprechen. Nationen und Programmiergemeinschaften sind weder so unterschiedlich noch sind Programmiergemeinschaften rationaler. Wenn sie es wären, würden wir alle Esperanto sprechen und in Universal etwas programmieren ...

4
Dan Rosenstark

Aufgrund von etwas, das ich das "Generalisierungs-/Spezialisierungsparadoxon" nenne, das wahrscheinlich einen anderen Namen hat und wirklich kein Paradoxon ist

Je allgemeiner eine Programmiersprache ist, desto mehr Code wird benötigt, um etwas zu erreichen. Je spezialisierter die Sprache, desto weniger können Sie damit erreichen.

4
Homde

Bei all dem, was bisher geschrieben wurde, ist es schwierig, viele neue Gründe hinzuzufügen, aber ich werde einige einbringen.

  • Evolution: Es sind nicht nur biologische Systeme, die eingeführt werden, mutieren und einem überlebenswichtigen Wettbewerb um Ressourcen und einer Nische unterliegen, die sie sich nennen können. Die Konkurrenz ist gut und treibt die Dinge voran.

  • Reife: Wir machen Computersprachen seit wahrscheinlich weniger als einem Jahrhundert. Wir können die Antwort noch nicht haben, weil wir noch nicht einmal alle Fragen kennen.

  • Separate Genese: Ich bin mir nicht sicher, ob das richtige Wort dafür ist, aber in der Welt gibt es viele Schriftsysteme, die in vielen geografischen Regionen gestartet wurden. Denken Sie an Keilschrift, die teilweise durch die Anforderungen des Schnitzens in Tontafeln diktiert wurde. Denken Sie an Sanskrit, die griechischen, hebräischen, römischen und arabischen Alphabete. Hieroglyphen, die chinesische Methode des schönen Schreibens mit mehr als 6000 Symbolen, die in vielen ostasiatischen Ländern verbreitet ist. Denken Sie an modernere gemischte Alphabete mit phonetischer Basis wie Kyrillisch, Katakana und Hirigana. Ich bin kein Linguist, also entflammen Sie die Ungenauigkeiten nicht zu stark, aber wenn Kulturen weltweit etwas brauchen, werden sie es schaffen und es aus der Notwendigkeit heraus zu ihrem eigenen machen. Computersprachen kamen auf, als es weltweit viel Kommunikation gab, und kamen wie die imperialen und metrischen Systeme von Orten mit starker Ideenführung. Programmiersprachen dienen jedoch vielen verschiedenen Kulturen (einige davon Unternehmenskulturen), sodass sie die Menschen widerspiegeln, die sie erstellt haben. Computersprachen sind mit kulturellen Hinterlassenschaften verbunden, die ihr Design und ihre Verwendung geprägt haben. In der Kernelkultur des Betriebssystems ist es unwahrscheinlich, dass C und C++ für Java (oder umgekehrt) bald veraltet sind, da sie die native Codegenerierung und eine enge/effiziente Kopplung mit Hardware zur Erstellung der Hardwareabstraktion ermöglichen Ebenen, und haben eine beträchtliche installiert basierend.

  • Design of Design: Programmiersprachen entstehen unter Verwendung verschiedener Organisationsparadigmen. COBOL und Ada stammten aus Komitees, die Teil von DOD waren und viele Hierarchien hatten. Wenn ich mich richtig erinnere, kamen C, C++, Java und wahrscheinlich viele andere von einem oder einer kleinen Anzahl von Designern. Fred Brooks vergleicht die Ergebnisse des Komitees mit den visionären Ansätzen in seinem Artikel Design of Design (http://www.youtube.com/watch?v=pC-DlX-PaF4). Wenn wir uns heute zusammensetzen würden, um entweder einen Da Vinci oder ein Komitee zur Definition der universellen Programmiersprache auszuwählen, würden wir dann wissen, wer oder was mit welcher Methode aufgebaut werden sollte?

0
DeveloperDon

Vielleicht eine etwas andere Neigung zu all dem:

Was ist eine Sprache? Um lächerlich einfach zu sein, es ist Vokabular, Syntax und Semantik.

Was machst du als erstes mit einer Programmiersprache?
Sie definieren Dinge - Klassen, Variablen, Methoden - Sie erweitern das Vokabular und die Semantik.

Warum? Jetzt können Sie also Dinge darin sagen, die Sie vorher nicht sagen konnten.
Ob es Ihnen gefällt oder nicht, Sie haben eine neue Spezialsprache erstellt.

IMHO ist die Sache, nach der in einer Allzwecksprache gesucht werden muss, wenn es einfach ist, Spezialsprachen zu erstellen.

0
Mike Dunlavey

Es gibt kein Tool mit den besten Funktionen. Eine nette Funktion von Javascript und Scheme ist beispielsweise, dass sie klein sind. Wenn Sie also mit dem Packen von Funktionen beginnen, haben Sie diese bereits verloren.

Trotzdem Cobra sieht vielversprechend aus, wenn es darum geht, alle Nice-Funktionen aus anderen Sprachen zu haben. :-)

0
Andrea

Abgesehen von dem Argument des Schweizer Taschenmessers (das einen Punkt hat - ist es schwieriger , eine gute Breitbandsprache zu entwerfen als eine Domain- spezifisch - aber das bedeutet nicht, dass eine solche Sprache nicht sowohl möglich als auch eine gute Idee wäre), es gibt Probleme beim "Kombinieren der besten Funktionen":

  • Für Sprachmerkmale ist "am besten" subjektiv oder zumindest (endlos) fraglich.
  • Einige Funktionen sind nicht kompatibel. Ein gutes Feature aus einer Sprache kann in Kombination mit einem guten Feature aus einer anderen Sprache explodieren.
  • Wir sind noch nicht mit neuen Funktionen fertig.

Kurz gesagt, Sprachdesign ist schwieriger und komplizierter. Vielleicht möchten Sie sich aber Scala ansehen.

0
comingstorm

Denn wenn Sie eine solche Sprache erstellen, wird es eine weitere neue Sprache sein. Möglicherweise haben Sie eine große Fangemeinde, aber alle anderen Sprachen bleiben bestehen.

C existiert immer noch, obwohl seitdem viele neue Sprachen erfunden wurden.

Man könnte sagen, dass python eine so universelle Sprache ist, aber dann gibt es auch Ruby.

Der Grund, warum es viele Sprachen gibt, ist einfach, dass es viele Programmierer gibt und einige von ihnen gerne neue Sprachen erstellen.

Der Grund, warum es keine einzige universelle Sprache gibt, in der sich alle einig sind, ist, dass das Programmieren als Handwerk nicht von einer Institution diktiert wird, die alle Entscheidungen trifft. Jeder kann tun, was er will.

Das ist gut.

0
hasen