web-dev-qa-db-fra.com

Réécriture de l'assembleur IBM + COBOL en C ++

Je travaille comme agent de location/responsable d'une société de location de voitures qui fonctionne sur un système de location écrit en 1972. J'ai décidé que c'était peut-être l'heure d'une mise à jour. Pour un peu de fond, voici un court exemple de la folie que nous devons traiter de ce programme quotidiennement:

Un agent de location doit se rappeler que l'impression sur un écran utilise "MXC" dans le champ Act (tout est basé sur des codes courts), qui représente perplexe "l'affichage maximum sur un contrat", tandis que sur une autre, elle nécessite des relations publiques. Le champ d'action, mais plusieurs écrans utilisent un Y dans le champ PT (pour imprimé), mais un autre écran utilise Y dans le champ PRT (pour imprimer), mais un autre écran nécessite que l'utilisateur appuie l'entrée (mais pas l'entrée en regard de Les lettres, comme c'est un nouveau caractère de ligne, il doit s'agir de l'entrée sur le tampon de numéro), puis de F8, un écran différent mais associé nécessite simplement F8, certains écrans ont un champ marqué PRT, qui devrait être destiné à imprimer, mais le champ réellement Ne fait rien et l'impression est faite automatiquement après avoir traversé plusieurs invites et encore plus d'écrans ont un champ étiqueté imprimé Y/N, qui est incomparable à Y pour les opérations dans lesquelles un autre emplacement fournit déjà de la paperasse et à N pour les opérations dans lesquelles une autre Le concessionnaire aura besoin de la paperasse.

J'ai décidé de pouvoir faire un meilleur travail que cela, alors j'ai décidé de contacter la personne de la société qui prendrait la décision de la mettre à jour. Je termine finalement au VP de celui-ci, qui est responsable de ce programme. Je reçois un peu d'informations de lui et apprenez que ma société de location de voitures a son programme de location écrit dans IBM Mainframe Assembler avec un peu de Cobol mélangé. Il dit qu'il n'y a pas de position ouverte en ce moment, mais que je devrais E-mail lui mon CV quand même (au cas où quelque chose ouvre quelque chose).

Cela me conduit à mes questions.

Le premier est technique. Avec l'idée d'améliorer la maintenabilité à l'avenir, ma pensée consiste à le réécrire dans une langue de niveau supérieur à celle de l'assemblage. Mon domaine d'expérience est en C++, c'est donc le choix évident pour moi. La société a besoin d'un moyen plus facile de mettre à jour le programme, car je lisais récemment un article dans lequel l'homme que j'ai parlé est cité comme indiquant que l'équipe a travaillé dur, et ils sont fiers d'annoncer que le programme a maintenant un soutien à 5 -diguez des codes d'emplacement (au lieu de 4) et des numéros de voiture à 8 chiffres (au lieu de 7). Ma philosophie sur des mises à jour, même dans des situations de ce désir, est en ligne avec Joel: http://www.joelonsoftware.com/articles/fog000000000069.html En bref, les écritures sont incrémentielles, plutôt que de jeter tout ce qu'il y avait avant et de commencer fraîche.

Existe-t-il un moyen facile d'intégrer l'assemblée IBM avec C++, et si oui, comment dois-je le faire? Je suis vaguement conscient du mot clé ASM, mais je ne sais pas s'il est préférable d'utiliser cela ou de faire autre chose. Un tel plan est-il mal conseillé? Je fais la majeure partie de mon travail sur Linux à l'aide de g ++ et GNU FAIT, donc les réponses spécifiques à ceux qui sont bien accueillies, mais ne sont certainement pas nécessaires (car je n'ai aucune idée du type de système de construction qu'elles n'ont pas, Mais je soupçonne presque aucun).

La deuxième question est plus politique. Comment devrais-je continuer à persuader cette entreprise dont ils ont besoin pour faire le commutateur? Les économies de coûts théoriques sont énormes (sur la base de mes estimations, la Société gaspille un million de dollars ou un supplément de dollars par an, juste sur des coûts de formation accrus pour apprendre à interagir avec le programme), mais mes modifications proposées seraient probablement toutes les modifications. Les programmeurs actuels hors du travail, devraient-ils être promulgués, il y a donc une grande résistance structurelle au changement.

eDIT: Je devrais expliquer pourquoi je modifiant ce que la société a déjà ressemblé à la meilleure solution. Je suis toujours ouvert à d'autres suggestions, car il s'agit d'un monstre d'un programme. Je n'ai jamais eu de travail de programmation avant, alors veuillez me corriger toute analyse incorrecte que je pourrais donner.

Tout d'abord, il y a la solution hors tension.

De mes discussions avec quelques gestionnaires de mi-niveau à propos de ce type de chose, l'une des principales préoccupations avec le passage à un nouveau système est le grand nombre d'employés fidèles qui ont été avec la société depuis des décennies et sont à l'aise avec le système maintenant. . Si j'ai la possibilité de modifier ce que nous avons, je pourrais maintenir l'interface actuelle dans une sorte de "mode de compatibilité". Les utilisateurs doivent déjà se connecter pour utiliser le système actuel, afin que je puisse ajouter la possibilité d'activer un paramètre lorsque les utilisateurs se connectent pour la "première" heure (après que je produise ce changement), où ils ont la possibilité d'utiliser l'option interface 'classique' ou la "nouvelle" interface. Il n'ya aucun moyen de trouver une solution hors tension qui permet à cela, et je pense que les craintes des personnes âgées qui deviennent confuses en changeant la technologie constitueraient une raison majeure de la gestion supérieure de dire non.

Ma société possède également le logiciel que nous utilisons; Nous ne l'autorisons pas. Cela signifie que la gestion dont je parle actuellement est la même personne qui pourrait réellement m'autoriser à changer de changement. Avec une solution tierce, je devrais obtenir l'approbation de ma société en plus de sécuriser les droits nécessaires de la Société qui a développé le produit que nous utilisons, qui ajoute un obstacle supplémentaire. Cela nécessiterait également de convaincre la Société d'abandonner le produit "leur" et de prendre un autre produit, ce qui semble être un obstacle plus grand que de tenter de mettre à jour ce que nous avons, mais je pourrais très bien être mal à ce sujet.

Enfin, examinez dans l'avenir, je ne veux pas simplement améliorer l'interface utilisateur et fixer quelques bugs. Après avoir mis à jour ces problèmes "urgents", j'espérais mettre à jour la voie fondamentale de la société qui concerne la technologie. Après avoir passé 1 à 2 ans sur ces sortes de problèmes, mon plan était de retourner à la direction et de proposer des changements plus dramatiques. Il existe de nombreuses façons que la société fonctionne qui pourrait être fondamentalement améliorée par la technologie qu'elles n'utilisent tout simplement pas pour le moment. Par exemple, chaque région fonctionne à peu près de la même manière. L'aéroport majeur local est le hub central pour distribuer des voitures. Ils sont principalement envoyés sur une base indispensable. Cependant, l'aéroport est utilisé comme base à domicile pour toutes les opérations. Ils enverront deux personnes dans une voiture à mon emplacement pour ramasser une voiture de notre part que nous n'avons pas besoin, puis retourner à l'aéroport avec la voiture qu'ils entraient, ainsi que ce qu'ils reprennent (nous sommes à 32 milles de l'aéroport). Ensuite, ils viendront à l'emplacement à 5 miles de nous dans deux voitures pour en laisser tomber l'un d'eux, puis revenez dans leur autre voiture à l'aéroport. Ils le font même si la voiture que nous avons renvoyée est le même type de voiture dont ils ont besoin près de nous. Je suis avec la société pendant environ deux ans maintenant et je ne les semble que dévier dans les urgences les plus extrêmes des pénuries de voiture (à peu près trois fois). Je remplacerais les 4 personnes travaillant dans toutes les régions avec un système de planification automatisé qui détermine quelles voitures vont où aller et essayer de trouver le chemin qui nécessite le moins de temps + miles + pilotes pour livrer toutes les voitures où elles doivent être, en tant que Exemple de corrections de niveau supérieur J'espère qu'on ajoute un jour.

Cependant, avant de me sentir à l'aise de proposer tout cela, je pense qu'il serait utile d'obtenir un toehold dans l'entreprise et la base de code en effectuant les tâches plus petites, comme la mise à jour de l'interface. Des solutions telles que la sous-traitance ou autrement supprimeraient cette possibilité.

13
David Stone

Vous sautez le pistolet. À partir de votre description, il semble que vous n'ayez pas entièrement compris l'environnement technique actuel (quel système d'exploitation exactement, où et comment les données stockées sont stockées, des interfaces d'autres systèmes existent etc.). Mais encore plus important: un plan sérieux devrait envisager des alternatives à une réécriture interne partielle ou complète du siffamware, à savoir un logiciel hors tension, de l'entraide de la réécriture, du logiciel en tant que service, etc.

Quelle que soit la manière dont l'entreprise va enfin, elle a d'abord besoin d'une analyse solide de ce que le logiciel fait aujourd'hui et quelles sont les exigences de la nouvelle solution.

Alors, pourquoi n'offrez-vous pas de faire cette analyse?

13
Codo

J'ai eu un problème similaire il y a quelques années à Bellsouth. J'ai simplement écrit le code COBOL pour analyser les octets de programmes de langage Assembleur par octet, séparez les opcodes et les opérandes, convertir les instructions de la branche pour passer à TOS et convertir les instructions de comparer les IFS. Ce programme converti DC instructions sur le code de division de données COBOL équivalent et les mouvements convertis, les zappées, etc., selon le cas.

Une fois que cela a été fait, j'ai écrit un deuxième programme pour convertir les ifs et les gobings à if-thens, avec des mouvements et tels dans les lignes entre ces grappes (ce n'était pas vraiment si difficile à faire - le secret est d'insérer les IF et Elesse Lorsque vous relisez le cobol "Pidgin" de la 1ère phase du dos à l'avant).

Si-ALSE-ELSER cherchait des situations dans lesquelles il a trouvé une référence goto à proximité d'une étiquette, qui pourrait être supprimée en toute sécurité (en décrétant son nombre de références de 1). Vous exécutez ce programme If-Elser Itherativement (c'est-à-dire que vous l'exécutez à nouveau et encore, arrêtez-vous uniquement lorsque votre dernier passage ne trouve pas un moyen de faire plus de changements). La plupart des travaux critiques sont effectués par cette période si-alors-elser, dont le produit COBOL doit être soigneusement examiné et vérifié par un programmeur expérimenté et compétent en assembleur (nommément moi). Dans mon expérience, mon "SI-TUNS-ELSER" a pu éliminer plus de 90% de la GO TOS résultant des instructions de la branche d'origine.

Je suppose qu'il est possible d'aller de l'avant à partir de ce point avec une conversion simple en C (ou C++) - langues que je suis également au courant. Cependant, à Bellsouth, notre langue de choix cible était COBOL/II. Il y a toujours un peu de complexité qui provient de situations où une étiquette restante a plusieurs références (à plusieurs reprises, ces situations sont gérées par COBOL effectue, mais peut parfois être simplement représentée par OR et Et construit).

Je pense que c'est bien de produire du code dans un COBOL/II structuré élégamment, avec des évaluations (constructions de cas) et 88 noms de niveau de niveau. L'ajout de ces touches de finition a conduit à une autre paire de programmes, qui s'est révélée utile sur les programmes COBOL qui ne sont pas provenant de programmes convertis de l'assembleur.

Je ne sais pas si cela aide.

Comme d'autres personnes ci-dessus ont commenté, vous devez mener ce processus avec soin. Il est utile d'avoir 10 à 12 ans d'expérience de codage d'assembleur informant vos processus de prise de décision. Nous qui avons cette expérience sont difficiles à trouver.

En fin de compte: nous avons seulement écrit dans l'assembleur à l'époque, car les compilateurs des langues de haut niveau ont produit un code d'objet encombrant et inefficace. Les compilateurs de cobol "optimiser" d'aujourd'hui n'ont pas ces mêmes habitudes. ------------

4
Mark Mondt

Le conseil de Joel est généralement sain, mais dans ce cas, une réécriture complète est en retard. Idéalement, une réécriture avec un battleaxe, comme ce que vous traitez ici est un monstre.

Je ne suis pas sûr de quoi ajouter exactement, car vous avez déjà fait un très bon argument pour cette réécriture vous-même. Ma seule recommandation serait de sauter entièrement C++ et d'aller directement à une interface Web pour le système de location, car cela sera probablement encore plus facile de former les travailleurs et vous fera économiser beaucoup de travail sur l'interface utilisateur (ainsi que faire Il est beaucoup plus facile d'obtenir un nouveau sang dans le projet, voire seulement de sous-traiter le tout).

En ce qui concerne les programmeurs de COBOL existants - ils peuvent peut-être aider à documenter le système existant et avec le processus de migration.

2
duskwuff

Quant à l'aspect technique, beaucoup dépendront de la qualité - la modularité - du code de l'assembleur. Certains programmeurs ont compris l'importance de créer des modules avec une fonction spécifique, limitée et une interface paramétrée simple et claire, à l'aide de conventions de liaison Standard IBM Subroutin. La grande majorité a toutefois eu tendance à créer des monstruosités monolithiques.

Avec l'ancienne, la réutilisation est possible et il ne devrait pas être si difficile de résoudre la "colle" entre C++ et assembleur, en supposant que vos modules d'assembleur utilisent des séquences d'appel standard (ou au moins cohérentes). Dans toutes les vraisemblances, cependant, le code de l'assembleur sera un gâchis. Bien que c'était possible d'écrire un assembleur structuré, très peu de gens le faisaient, et il sera presque impossible de discerner toute "conception" à laquelle commencer la réécriture.

D'autre part, l'assembleur 360/370 est assez haut niveau que les microprocesseurs d'aujourd'hui, et beaucoup plus simple, et C est parfois considéré comme "assembleur de haut niveau". J'ai travaillé pour une société DBMS dont le produit était entièrement de 370 assembleurs, et notre principale architecte croyait qu'il serait peut-être possible de transmettre le code de l'assembleur dans C (pour la portabilité future). Je suis sceptique, mais le but est que la distance n'est pas aussi grande que vous pourriez penser.

Je ne sais pas si quelqu'un est utile. Comme je le disais, je pense que c'est fortement dépendant de la qualité et de la taille du code d'origine.

2
Chap

Je ne peux pas dire si c'est une blague ou non - votre entreprise est sérieusement en train d'exécuter un code initialement écrit il y a 39 ans? Si elle fonctionne sur un système/360, vous allez devoir compiler g ++ à partir de la source ...

Honnêtement, je ne penserais même pas à utiliser aucun de l'ancien code; Vous devez prendre une nouvelle approche, vous asseoir et penser à ce qui doit aller dans la conception et le faire de la terre vers le haut. Oui, cela impliquera un peu de planification, mais je ne pense pas même que Joel dirait que ceci est un cas pour des changements incrémentiels.

En ce qui concerne la persuadement de la société que vous devez basculer, vous devez indiquer spécifique raisons qui amélioreront l'efficacité, conduisent à des coûts plus faibles et/ou montrent que ce que vous utilisez maintenant fait des dommages. à la ligne de fond en ce moment.

Un autre commentaire - J'imagine que d'autres sociétés de location de voitures se sont jointes au reste d'entre nous au 21ème siècle; Je ferais un peu de recon pour voir comment ils le font (basé sur le Web, j'imagine) et éventuellement le modeler après l'un de ces systèmes (c'est-à-dire, ne réinventez pas la roue).

Bonne chance!

1
Chris Gregg

En théorie, il ne devrait pas être difficile de convaincre la gestion supérieure de remplacer l'ancien système si vous pouvez leur montrer qu'il les sauvera des mégabucks. Et ça va. Il va devenir de plus en plus difficile de trouver des programmeurs pour maintenir ce système et ces programmeurs vont devenir de plus en plus coûteux. Ce n'est pas une question de "si", c'est une question de "quand". Il doit vraiment être mis à jour.

Cependant, la question est de savoir si vous pouvez les convaincre non seulement de la mise à jour (et saillons probablement que de toute façon), mais que cela devrait être un projet interne. Surtout si l'équipe est juste vous. Très souvent, un tel remplaçant majeur est sous-traité. Il peut y avoir même des logiciels d'étagère disponibles pour examen. Ces options doivent être étudiées et vos gestionnaires insistent pour que cela se produise s'ils sont sensibles.

En ce qui concerne la tâche, si vous deviez le faire, je pense en fait qu'un bulldoze-réécrire peut être approprié dans ce cas. L'argument de Joel ne s'applique pas dans tous les cas. Cependant, je ne pouvais pas vraiment savoir sans le voir.

0
Igby Largeman