From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=BDTa72yN; dkim=fail reason="signature verification failed" (2048-bit key; secure) header.d=etorok.net header.i=@etorok.net header.a=rsa-sha256 header.s=gm1 header.b=XCRUVuuN; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id D9C8E400A5 for ; Mon, 7 Apr 2025 21:55:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=message-id:from:to:date:in-reply-to:references: content-transfer-encoding:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=d0i6GGsuDh991RQkdWAyDdLWqmJ+aEmkvbIUt2EwD7k=; b=BDTa72yNYzdg7gugwt6FWoQXf3dOjkJiWK7lqzmxqxap0b7DzBgQCSZD 9XSotu/3yhKKpgpJ9JJNllAYoOGUc5CkqLZwwSBEIjkE5YE7Q9jxxx8Nm 1S8R6Gsk3BBWin+qwQ+Y2ZSjqluYnU/pAPv1+8D8DDtwdaUB+nHgbqLRJ M=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@etorok.net X-IronPort-AV: E=Sophos;i="6.15,196,1739833200"; d="scan'208";a="216788957" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 07 Apr 2025 23:55:38 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id C0295E0264; Mon, 7 Apr 2025 23:55:38 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 1C1C4E007A for ; Mon, 7 Apr 2025 23:55:35 +0200 (CEST) IronPort-SDR: 67f449d6_RBBhgYFTi5oMmho9sbGgIqbCqF+Rv7vsySLakcK7p6xdXtU 6HI34Ip31/sOhX7oMaMcKBUeJ9vOJVAvd29lS+A== X-IPAS-Result: =?us-ascii?q?A0FWDAAOSfRngcS3RtlaHAEBATwBAQQEAQECAQEHAQEVg?= =?us-ascii?q?VWBWgJmfVk0BwhIYYN0g0+OIwOgEQ8BAwENFAIBAg4UCQQBAQMBA4UAAospA?= =?us-ascii?q?h8GAQQ0EwECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQE7Bw47h?= =?us-ascii?q?XsNgls7cYElAQEBAQEBAQEBAQEBAQEBAQEBARcCDSNaAQEBAQIBIx0BATgPC?= =?us-ascii?q?QIYAgImAgJWNIJogkEjBw0GkgCbS3qBMoEBggwBAQaBCIFh2xwJgRosAgEBi?= =?us-ascii?q?E4BgW2HfHonW4FNgRWCKIECPoFQgREBAQEBgV4Vg0aCaYEUgR1FVYJLfxgtg?= =?us-ascii?q?iCKPYgAcocXCUl7HANZLAFVExcLBwWBKUMDgQ8jUwUzHYF8g3KFOIIRgVwDA?= =?us-ascii?q?yIBgxV1HIRuhFotT4MzPB1AAwttPTcUGwaYEoQTBzdtDgEBIDAHLgw0OAYLO?= =?us-ascii?q?gItkkMUs0WEJYwYlUozhAONCZlLmH6OBZsugX4jgVx7RYJnCUYDGQ+SG4Jkg?= =?us-ascii?q?Ts5O8M5AkUyAjoCBwEKAQEDCYZIiVSBSwEB?= IronPort-PHdr: A9a23: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 pUHTLNaElo4CqFDYqyKNNEeJ41wXXUinKLJ1aY1 IronPort-Data: A9a23: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 E4bn1ew3l0= IronPort-HdrOrdr: A9a23:dp1QhaiGBFoo4XgG+tjXJBtvj3BQXhoji2hC6mlwRA09TyX+rb HKoB17726XtN91YhsdcL+7WZVoLUmyyXcx2+ks1NSZLW7bUQmTQb2KhLGKq1bd8m/Fh41gPM xbH5SWZuefMbE3t7ef3CCIV/gG7Z2s+LyziY7lvg9QZDAvRYZMqz1wEAPzKDwMeCB2QbQfOd 6n7Mxdq1ObCA0qR/X+KF4pG9Lfr8DG/aiWByI7Ow== X-Talos-CUID: =?us-ascii?q?9a23=3AktWR7WsWvE03YrYKIjEChk/R6IsFNS3m5S+XfnW?= =?us-ascii?q?7MkRmV4yIagS7xa9dxp8=3D?= X-Talos-MUID: 9a23:0CO6swUNuf9MhUjq/DLx2D5iO/wr35y3BVwcqqggi8+mEhUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.15,196,1739833200"; d="scan'208";a="113685966" X-MGA-submission: =?us-ascii?q?MDGhHq7btla7nz0oVGowIj5mo7s+Mxr6x0681i?= =?us-ascii?q?wHsJ6HwSg7xglL3rCl8d7m3/Ci5pwfdaIWwoZfH4JGFQx9FbW8T4oX6H?= =?us-ascii?q?5qXMhE+h6qt+A6Ji1STIQ49759/A84iguHM3SMjUL8y+xFeIxdHafPfA?= =?us-ascii?q?a9C7bRusmlOLqaw0i3oEY5lA=3D=3D?= Received: from relay4-d.mail.gandi.net ([217.70.183.196]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2025 23:55:34 +0200 Received: by mail.gandi.net (Postfix) with ESMTPSA id F295643424 for ; Mon, 7 Apr 2025 21:55:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=etorok.net; s=gm1; t=1744062934; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=d0i6GGsuDh991RQkdWAyDdLWqmJ+aEmkvbIUt2EwD7k=; b=XCRUVuuN/Op0DR/0X9jjyu3GZ09a2xeCruH20i3jBcpB86GQqgcZLOXOVRT0D9O1S7mQrn RQ0E180ZncpQNz9MonlO1z4dtcoAZvdCWYTsSAkFYFjWuqXOfhLa5tAQ0/Mz6Tkm+7yr5y 2pN5CiRkwWujnj//mVWLkPmwFPqgSn57dREx1GNUxk/05lEF4k0pBGwOdLOyTui6RY/hXG Jrpr/xcDhCjeabHhu39vUhWvJPunu9yREqF/z1lUvs1+MUsmcMGVKx7RIrSdGDYwGUdv0S GQIwfZDvgLHMAVMs6PQ0mb+qxyp8XQLWm4X/BYLQosqyUk+zLMqF8wckH3sndA== Message-ID: From: Edwin =?ISO-8859-1?Q?T=F6r=F6k?= To: caml-list@inria.fr Date: Mon, 07 Apr 2025 22:55:33 +0100 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.54.3 (3.54.3-1.fc41) MIME-Version: 1.0 X-GND-State: clean X-GND-Score: 0 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgddvtddufedvucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecunecujfgurhepkffuhffvffgjfhgtgfgfggesthhqredttderjeenucfhrhhomhepgfgufihinhcuvfpnrhpnkhcuoegvugifihhnodhmlhesvghtohhrohhkrdhnvghtqeenucggtffrrghtthgvrhhnpeeifefhfeeltdevvdetleekkeehheevhfefffduudduieffteejgeegteekuefhudenucffohhmrghinhepghhithhhuhgsrdgtohhmpdhunhhikhgvrhhnvghlrdhmlhdptghonhhfihhgrdhmlhdprhgvrgguthhhvgguohgtshdrihhopdhokhhmihhjrdhorhhgnecukfhppedvudejrdduheehrddujeehrdduiedunecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepvddujedrudehhedrudejhedrudeiuddphhgvlhhopegludelvddrudeikedrvddrudeikegnpdhmrghilhhfrhhomhepvggufihinhdomhhlsegvthhorhhokhdrnhgvthdpnhgspghrtghpthhtohepuddprhgtphhtthhopegtrghmlhdqlhhishhtsehinhhrihgrrdhfrh X-GND-Sasl: edwin@etorok.net Subject: Re: [Caml-list] Separate compilation Reply-To: Edwin =?ISO-8859-1?Q?T=F6r=F6k?= X-Loop: caml-list@inria.fr X-Sequence: 19290 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: On Sat, 2025-04-05 at 13:26 +0900, Oleg wrote: >=20 > In designing separate compilation, OCaml has decided to restrict the > correspondence between separately compiled modules and their > interfaces to one-to-one. The restriction is indeed limiting: making > the linking with alternative/improved implementations, and the > implementation extension/evolution ungainly (in fact, seemingly > impossible). >=20 > To be concrete: suppose we have an interface A.mli and two > implementations=20 > of it: A1.ml and A2.ml. We also have the user code B.ml: > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 open A > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ... using the operations of A > We want to compile B.ml and link that B.cmo with either > implementation. As posed, the problem seem unsolvable: we need either > modify the source B.ml to refer to a particular implementation, or > turn > B.ml into a functor (which could be inconvenient, and also > suboptimal: > calls to A operations become indirect).=20 Thanks for exploring solutions to this issue. FWIW this is what Mirage does,=C2=A0but the functors spread across the codebase and can become quite big, e.g. a tutorial HTTP application has a functor that needs 5 modules: https://github.com/mirage/mirage-skeleton/blob/main/applications/http/unike= rnel.ml#L32 This is the code to compose it all (IIUC it runs at build time): https://github.com/mirage/mirage-skeleton/blob/main/applications/http/confi= g.ml An alternative is Dune with virtual libraries: https://dune.readthedocs.io/en/stable/virtual-libraries.html This doesn't require functors, but it prevents cross-module inlining from working at all (indeed the actual implementation may only be known at the time the final application is linked).=C2=A0 However the module chosen *is* still known at application build time, so it is a bit unfortunate to have to chose between functors (where perhaps Flambda2 can help remove the overhead), or the loss of inlining (not sure if Flambda2 can help with this one due -opaque). Nowadays even GCC does LTO by default at application link time on some systems (which in certain cases also increases OCaml link times considerably as the entire OCaml C runtime is processed by LTO). We already have separate development and release build profiles (in Dune) that make different tradeoffs between compilation speed and application runtime speed. So doing more work at link time (even recompiling modules) may not necessarily be a bad idea (as long as that work is parallelizable, with itself or the C LTO). >=20 > For the next problem, assume the interface U.mli and its > implementation U.ml. We want to extend them -- say, add a new > operation to the interface and the implementation -- without > modifying > U.mli/U.ml and without cut-and-paste. That is, we want merely > `include' > U and add the new operation -- making a `diff' so to speak. If U.mli > abstracts away the implementation details, and if they are needed to > implement the new operation, the problem seem unsolvable. >=20 > It turns out there are work-arounds for both problems, which solve > them, albeit not elegantly. The full explanation is a bit too long > for > this message; please see > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 https://okmij.org/ftp/ML/modul= e-extensibility.html Would be interesting to also explore how this affects 'ocamlopt', where the various choices also result in working inlining or not (and potentially runtime performance impact). The use of -opaque might be needed in some cases to avoid tying users of a module to a particular implementation too early (through cross- module inlining, which then effectively makes it incompatible with other implementations, should it be switched out later). *If* we want both separate compilation, and good runtime performance (cross-module inlining) I think we'd have to give up part of separate compilation, and move code generation to link time, at least for functions that (transitively) cross such a multi-implementation interface boundary. (we can't really recompile all users for each implementation as that might lead to a combinatorial explosion) For some situations there is another alternative: build contexts. If you want to consistently choose implementation X for the interface A, then all libraries/applications built in that build context could be configured to do the necessary symlinking/renaming to treat X as the implementation of A with cross-module inlining intact. (This is effectively what Mirage has to do for cross-compilation anyway, so then why does it still need functors...) Configurations that don't want to use a complicated build setup (or for quick edit-compile cycles) could fall back to using -opaque and defering the choice to link time, and losing inlining. This only works if X itself doesn't depend on more such multi- implementation interfaces (or if it does the overall number of configurations is small, i.e. not the full cartesian product).=20 At the time of building/installing library Y you could then precompile it for all the N build contexts (perhaps dependency caching/hashing should be able to tell you where you can reuse build artifacts from other contexts). I think the use of build contexts would actually be compatible with your proposal. All that would change is build order and whether -opaque is used or not: * without build contexts you'd build the opaque interface first, then its users, then its implementation, then link final application * with build contexts you'd build the interface (without -opaque!), one of its implementations, then all users of that implementation, then link the final application (and changing the implementation would require recompiling all its users transitively, but that'd be an acceptable situation for better performance) >=20 > The work-arounds are simple. Should OCaml developers be so inclined, > they > may be incorporated in OCaml. >=20 I'd be interested to hear the opinion of Mirage unikernel users, as they're most likely affected by the current situation, and benefit from this improvement (I'm not a heavy Mirage unikernel user myself -- yet). Best regards, --Edwin