Question

Je sais ce qui est très abstraite, mais je crois qu'il est très concentré.

Il y a beaucoup de langages de haut niveau aujourd'hui: C # , Java , VB , Python , etc. ., tous créés à la complexité de bas niveau abstraire et de fournir une expérience de programmation plus conviviale. langues de haut niveau peuvent réduire, et la plupart du temps supprimer complètement, la nécessité d'effectuer de bas niveau, les opérations spécifiques de processus (telles que la manipulation et la gestion de la mémoire pointeur). Beaucoup ont également supprimer les détails de la plate-forme (comme la manipulation de fichiers, génération d'interface utilisateur, etc.)

Mes deux questions sont:

  1. Que peut / doit abstraire? Y at-il plus de sémantique faible niveau actuel d'aujourd'hui dans les langues de niveau élevé qui seront / devraient être plus loin abstraire?
  2. À quel moment un usage général, langage de haut niveau deviennent très élevé -level , alias axé sur les buts ?
Était-ce utile?

La solution

L'un des problèmes avec notamment des abstractions de très haut niveau dans une langue est que, parfois, ils ne sont pas suffisantes pour tout ce que vous voulez accomplir, vous finissez par avoir besoin les abstractions de niveau inférieur, aussi. Le problème d'avoir des abstractions haut et bas niveau dans la même langue que les abstractions de haut niveau peuvent devenir très facilement qui fuit si vous pouvez les sonder par des abstractions de bas niveau.

Java, par exemple, est même pas une langue de haut niveau, mais il est conçu pour être sûr (dans le sens où les abstractions ne fuient pas) d'abord et avant tout. Par conséquent, certaines choses sont tout simplement impossible de le faire en Java. Par exemple, vous ne pouvez pas écrire le garbage collector de Java au sein de Java, ou lancer votre propre système d'objets en utilisant le polymorphisme cast pointeur, ou écrire un système d'exploitation (au moins pas un traditionnel).

En revanche, D offre à la fois de haut niveau et des équipements de bas niveau. Le garbage collector de D, par exemple, est écrit en D. Cela sonne bien et pour la plupart il est. Toutefois, lorsque vous commencez à mélanger les niveaux d'abstraction dans une seule base de code les abstractions peuvent fuir, en particulier si vous utilisez des moulages ou des syndicats pour vaincre le système de type. Par conséquent, le programme avec succès dans D, vous devrez peut-être de temps en temps d'être au courant de certains détails de bas niveau pour faire face à des abstractions qui fuient, même si vous ne les avez pas besoin pour la tâche à accomplir.

Autres conseils

  1. Que peut / doit être abstraire?  Cela dépend toujours de votre objectif. Il n'y a pas de ligne claire ici, mais je pense qu'il se résume à quel point le contrôle avez-vous besoin? Il y a habituellement un compromis assez lourd entre abstraction et possibilités.
  2. Quand est-ce un usage général, langage de haut niveau s'orientée vers un but?  Dès que vous pouvez dire la langue / environnement de programmation ce que vous voulez au lieu de ce qu'il doit faire.

En réalité, si ... la ligne est tout à fait arbitraire bien sûr.

Tcl a une proposition officielle ( Proposition Tcl amélioration (TIP) 131 à peu près résout le problème pour de bon. Tout ce qu'il a besoin est volontaire pour faire le travail. il y a même une mise en œuvre du squelette avec quelques-uns des détails omis.

Certaines langues spécifiques de domaine peuvent être extrêmement « haut niveau ». Un bon exemple de ceci est Informer (utilisé pour les aventures de texte d'écriture) où le langage de programmation est pas très différent de l'anglais ordinaire. Voici un extrait d'un exemple de projet :

The fireplace is scenery in the Entrance Hall. The description is "Unlit, vacant
[if Search is happening]. It is almost as though you are not expected[end if]."
The sound of the fireplace is "whistling wind". Understand "fire" or "whistling" 
or "wind" as the fireplace. Instead of burning the fireplace: say "There is no 
fuel prepared for a fire."

Ceci est le code source réelle. :)

Je pense un langage futur hypothétique vous permettra d'écrire un vérificateur au lieu d'une mise en œuvre. Le compilateur analyse alors que vérificateur et (tentatives de) écrire une implémentation correspondant à vos spécifications. (Il est évident que le compilateur doit échouer ou revenir à la force brute parfois, parce que ce n'est pas un solveur arrêt.)

Pour l'essentiel, un langage logique avec des optimisations ridicules par rapport à forcer la réponse brutale.

Même si le code de vérification peut être plus long que le code de mise en œuvre, il agit comme documentation beaucoup mieux et est plus proche de ce que une apparence spec comme. Vous négociez plus de temps à taper de code pour moins de documentation / spécification / code desyncing.

Par exemple:

int32 Remainder(int32 numerator, int32 denominator) {
    requires denominator != 0
    ensures Math.Abs(result) < Math.Abs(denominator)
    ensures exists n suchthat n*denominator + result == numerator
}
int32 EuclideanRemainder(int32 numerator, int32 denominator) {
    requires denominator != 0
    ensures result >= 0
    ensures result < Math.Abs(denominator)
    ensures exists n suchthat n*denominator + result == numerator
}

résultats dans:

//warning: suggested precondition: denominator != int32.MinValue due to Math.Abs
int32 Remainder(int32 numerator, int32 denominator) {
    return numerator % denominator;
}
int32 EuclideanRemainder(int32 numerator, int32 denominator) {
    return ((numerator % denominator) + denominator) % denominator;
}

Hmm, je pense que quelques langues tentent de mener des abstractions supplémentaires. Clojure avec sa STM et Erlang avec le modèle de l'acteur

  1. A propos de la seule chose que je peux voir que je ne vois pas comment cela serait fait est une langue avec des contrôles d'accès concurrentiel semblable à la vérification statiquement typé. Je dis cela parce que le problème existe Enrayer.
  2. Quand il tond ma pelouse, me fait du café le matin, vérifie mon email et me dit ce qui est arrivé dans les nouvelles.

Je pense que les cadres sont l'étape suivante.

  • Actuellement, certains « langues » sont UAT (qui est proche de ce que l'on pourrait appeler un but et avec un objectif nécessite des tests , car il est la seule façon qu'il pourrait expliquer, par exemple Fit pour la partie test); celles-ci pourraient être fusionnés avec des langages de programmation.
  • Quasiment toutes les langues devient l'accès à de plus en plus interfaces de haut niveau (c.-à- abstraction ) nécessitant de moins en moins de code de vous et abstraire du système d'exploitation (voir la facilité avec laquelle il est de faire l'application GUI maintenant en C #, C ++ par rapport à MFC, par rapport à C ++ API Win32).
  • En ce qui concerne les langages de programmation qu'ils pourraient obtenir plus des meilleures caractéristiques d'autres méthodes de développement: Je pense à programmation orientée aspect qui pourrait aider à résoudre de nombreux problème de OO et est déjà mis en œuvre dans une forme en C # et Java (comme les questions relatives à l'exploitation forestière, les transactions ...).
  • UML but ultime ( était ?) Pour permettre à la viesw UML ainsi que les détails des schémas d'être suffisant pour coder le système; UML est un langage (au sens large).
  • IDE devrait également être inclus: Vous pouvez maintenant définir comment une boîte de dialogue devrait redimensionner à partir de l'IDE alors que vous aviez souvent le code avant. Plus tard, vous pourrez peut-être de style votre application tout ou site web à partir d'une liste déroulante des thèmes comme toute application capable peau. Et beaucoup plus pourrait venir.

Imaginez l'union de ceux dans un environnement unifié, car l'environnement de développement est une grande partie du développement tout comme les bibliothèques on a accès à et son niveau d'accès.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top